diff --git a/.changeset/gitignore-exclude.md b/.changeset/gitignore-exclude.md new file mode 100644 index 0000000..46842ea --- /dev/null +++ b/.changeset/gitignore-exclude.md @@ -0,0 +1,9 @@ +--- +"@tktco/create-devenv": minor +--- + +.gitignore に記載されたファイルを自動的に除外する機能を追加 + +- init, diff, push の全コマンドで .gitignore にマッチするファイルを除外 +- ローカルディレクトリとテンプレートリポジトリ両方の .gitignore をチェック +- クレデンシャル等の機密情報の誤流出を防止 diff --git a/package.json b/package.json index eb64c79..586768e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tktcorporation-github", "private": true, - "packageManager": "pnpm@10.0.0", + "packageManager": "pnpm@10.25.0", "scripts": { "version": "changeset version", "release": "changeset publish" @@ -9,6 +9,6 @@ "devDependencies": { "@changesets/changelog-github": "^0.5.2", "@changesets/cli": "^2.29.8", - "rollup": "^4.40.0" + "rollup": "^4.53.3" } } diff --git a/packages/create-devenv/package.json b/packages/create-devenv/package.json index a9d64dc..fa04663 100644 --- a/packages/create-devenv/package.json +++ b/packages/create-devenv/package.json @@ -23,19 +23,20 @@ }, "dependencies": { "@inquirer/prompts": "^8.0.2", - "@octokit/rest": "^21.0.0", + "@octokit/rest": "^22.0.1", "citty": "^0.1.6", "consola": "^3.4.2", "defu": "^6.1.4", "giget": "^2.0.0", + "ignore": "^7.0.5", "pathe": "^2.0.3", - "tinyglobby": "^0.2.0", + "tinyglobby": "^0.2.15", "ts-pattern": "^5.9.0", "zod": "^4.1.13" }, "devDependencies": { "@biomejs/biome": "^2.3.8", - "@types/node": "^22.19.1", + "@types/node": "^22.19.2", "@vitest/coverage-v8": "^4.0.15", "memfs": "^4.51.1", "typescript": "^5.9.3", @@ -52,6 +53,6 @@ "provenance": true }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } } diff --git a/packages/create-devenv/src/utils/__tests__/gitignore.test.ts b/packages/create-devenv/src/utils/__tests__/gitignore.test.ts new file mode 100644 index 0000000..7f7e892 --- /dev/null +++ b/packages/create-devenv/src/utils/__tests__/gitignore.test.ts @@ -0,0 +1,177 @@ +import { vol } from "memfs"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +// fs モジュールをモック +vi.mock("node:fs", async () => { + const memfs = await import("memfs"); + return memfs.fs; +}); + +vi.mock("node:fs/promises", async () => { + const memfs = await import("memfs"); + return memfs.fs.promises; +}); + +// モック後にインポート +const { loadMergedGitignore, filterByGitignore } = await import("../gitignore"); + +describe("gitignore", () => { + beforeEach(() => { + vol.reset(); + }); + + describe("loadMergedGitignore", () => { + it(".gitignore が存在しない場合は空の Ignore を返す", async () => { + vol.fromJSON({}); + + const ig = await loadMergedGitignore(["/project"]); + + // 何もフィルタリングされない + const files = ["file.txt", "secret.env"]; + expect(ig.filter(files)).toEqual(files); + }); + + it("単一ディレクトリの .gitignore を読み込む", async () => { + vol.fromJSON({ + "/project/.gitignore": "*.env\nnode_modules/", + }); + + const ig = await loadMergedGitignore(["/project"]); + + expect(ig.filter(["app.ts", "secret.env", "node_modules/pkg"])).toEqual([ + "app.ts", + ]); + }); + + it("複数ディレクトリの .gitignore をマージする", async () => { + vol.fromJSON({ + "/local/.gitignore": "*.env", + "/template/.gitignore": "*.secret", + }); + + const ig = await loadMergedGitignore(["/local", "/template"]); + + // 両方の .gitignore ルールが適用される + expect( + ig.filter(["app.ts", "config.env", "api.secret", "readme.md"]), + ).toEqual(["app.ts", "readme.md"]); + }); + + it("片方のディレクトリにのみ .gitignore がある場合", async () => { + vol.fromJSON({ + "/local/.gitignore": "*.env", + // /template には .gitignore がない + }); + + const ig = await loadMergedGitignore(["/local", "/template"]); + + expect(ig.filter(["app.ts", "config.env"])).toEqual(["app.ts"]); + }); + + it("空の .gitignore ファイルを正しく処理する", async () => { + vol.fromJSON({ + "/project/.gitignore": "", + }); + + const ig = await loadMergedGitignore(["/project"]); + + const files = ["file.txt", "secret.env"]; + expect(ig.filter(files)).toEqual(files); + }); + + it("コメント行のみの .gitignore を正しく処理する", async () => { + vol.fromJSON({ + "/project/.gitignore": "# This is a comment\n# Another comment", + }); + + const ig = await loadMergedGitignore(["/project"]); + + const files = ["file.txt", "secret.env"]; + expect(ig.filter(files)).toEqual(files); + }); + + it("複雑な gitignore パターンを処理する", async () => { + vol.fromJSON({ + "/project/.gitignore": ` +# 環境変数ファイル +*.env +.env.* + +# ビルド成果物 +dist/ +build/ + +# 依存関係 +node_modules/ + +# IDE +.vscode/ +.idea/ + +# ネゲーション(除外から除外) +!.env.example +`, + }); + + const ig = await loadMergedGitignore(["/project"]); + + const files = [ + "src/app.ts", + ".env", + ".env.local", + ".env.example", + "dist/bundle.js", + "node_modules/pkg/index.js", + ".vscode/settings.json", + "README.md", + ]; + + expect(ig.filter(files)).toEqual([ + "src/app.ts", + ".env.example", // ネゲーションで除外から復帰 + "README.md", + ]); + }); + }); + + describe("filterByGitignore", () => { + it("gitignore ルールに従ってファイルをフィルタリングする", async () => { + vol.fromJSON({ + "/project/.gitignore": "*.env\n*.secret", + }); + + const ig = await loadMergedGitignore(["/project"]); + const files = ["app.ts", "config.env", "api.secret", "readme.md"]; + + expect(filterByGitignore(files, ig)).toEqual(["app.ts", "readme.md"]); + }); + + it("空のファイルリストを正しく処理する", async () => { + vol.fromJSON({ + "/project/.gitignore": "*.env", + }); + + const ig = await loadMergedGitignore(["/project"]); + + expect(filterByGitignore([], ig)).toEqual([]); + }); + + it("ディレクトリパターンを正しく処理する", async () => { + vol.fromJSON({ + "/project/.gitignore": ".devcontainer/", + }); + + const ig = await loadMergedGitignore(["/project"]); + + const files = [ + ".devcontainer/devcontainer.json", + ".devcontainer/setup.sh", + ".github/workflows/ci.yml", + ]; + + expect(filterByGitignore(files, ig)).toEqual([ + ".github/workflows/ci.yml", + ]); + }); + }); +}); diff --git a/packages/create-devenv/src/utils/diff.ts b/packages/create-devenv/src/utils/diff.ts index 9e2c940..f5596f2 100644 --- a/packages/create-devenv/src/utils/diff.ts +++ b/packages/create-devenv/src/utils/diff.ts @@ -9,6 +9,7 @@ import type { DiffType, FileDiff, } from "../modules/schemas"; +import { filterByGitignore, loadMergedGitignore } from "./gitignore"; import { getEffectivePatterns, resolvePatterns } from "./patterns"; export interface DiffOptions { @@ -30,6 +31,10 @@ export async function detectDiff(options: DiffOptions): Promise { let deleted = 0; let unchanged = 0; + // ローカルとテンプレート両方の .gitignore をマージして読み込み + // クレデンシャル等の機密情報の誤流出を防止 + const gitignore = await loadMergedGitignore([targetDir, templateDir]); + for (const moduleId of moduleIds) { const mod = getModuleById(moduleId); if (!mod) { @@ -40,10 +45,16 @@ export async function detectDiff(options: DiffOptions): Promise { // 有効なパターンを取得(カスタムパターン考慮) const patterns = getEffectivePatterns(moduleId, mod.patterns, config); - // テンプレート側のファイル一覧を取得 - const templateFiles = resolvePatterns(templateDir, patterns); - // ローカル側のファイル一覧を取得 - const localFiles = resolvePatterns(targetDir, patterns); + // テンプレート側のファイル一覧を取得し、gitignore でフィルタリング + const templateFiles = filterByGitignore( + resolvePatterns(templateDir, patterns), + gitignore, + ); + // ローカル側のファイル一覧を取得し、gitignore でフィルタリング + const localFiles = filterByGitignore( + resolvePatterns(targetDir, patterns), + gitignore, + ); const allFiles = new Set([...templateFiles, ...localFiles]); diff --git a/packages/create-devenv/src/utils/gitignore.ts b/packages/create-devenv/src/utils/gitignore.ts new file mode 100644 index 0000000..52a2122 --- /dev/null +++ b/packages/create-devenv/src/utils/gitignore.ts @@ -0,0 +1,29 @@ +import { existsSync } from "node:fs"; +import { readFile } from "node:fs/promises"; +import ignore, { type Ignore } from "ignore"; +import { join } from "pathe"; + +/** + * 複数ディレクトリの .gitignore をマージして読み込み + * ローカルとテンプレートの両方の .gitignore を考慮することで、 + * クレデンシャル等の機密情報の誤流出を防止する + */ +export async function loadMergedGitignore(dirs: string[]): Promise { + const ig = ignore(); + for (const dir of dirs) { + const gitignorePath = join(dir, ".gitignore"); + if (existsSync(gitignorePath)) { + const content = await readFile(gitignorePath, "utf-8"); + ig.add(content); + } + } + return ig; +} + +/** + * gitignore ルールでファイルをフィルタリング + * gitignore に該当しないファイルのみを返す + */ +export function filterByGitignore(files: string[], ig: Ignore): string[] { + return ig.filter(files); +} diff --git a/packages/create-devenv/src/utils/template.ts b/packages/create-devenv/src/utils/template.ts index e640807..9049759 100644 --- a/packages/create-devenv/src/utils/template.ts +++ b/packages/create-devenv/src/utils/template.ts @@ -16,6 +16,7 @@ import type { FileOperationResult, OverwriteStrategy, } from "../modules/schemas"; +import { filterByGitignore, loadMergedGitignore } from "./gitignore"; import { getEffectivePatterns, resolvePatterns } from "./patterns"; const TEMPLATE_SOURCE = "gh:tktcorporation/.github"; @@ -101,6 +102,10 @@ export async function fetchTemplates( consola.success("テンプレートを取得しました"); + // ローカルとテンプレート両方の .gitignore をマージして読み込み + // クレデンシャル等の機密情報の誤流出を防止 + const gitignore = await loadMergedGitignore([targetDir, templateDir]); + // 選択されたモジュールのファイルをパターンベースでコピー for (const moduleId of modules) { const moduleDef = getModuleById(moduleId); @@ -113,8 +118,9 @@ export async function fetchTemplates( config, ); - // パターンにマッチするファイル一覧を取得 - const files = resolvePatterns(templateDir, patterns); + // パターンにマッチするファイル一覧を取得し、gitignore でフィルタリング + const resolvedFiles = resolvePatterns(templateDir, patterns); + const files = filterByGitignore(resolvedFiles, gitignore); if (files.length === 0) { consola.warn( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 028a14a..04c70fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,19 +13,19 @@ importers: version: 0.5.2 '@changesets/cli': specifier: ^2.29.8 - version: 2.29.8(@types/node@22.19.1) + version: 2.29.8(@types/node@22.19.2) rollup: - specifier: ^4.40.0 + specifier: ^4.53.3 version: 4.53.3 packages/create-devenv: dependencies: '@inquirer/prompts': specifier: ^8.0.2 - version: 8.0.2(@types/node@22.19.1) + version: 8.0.2(@types/node@22.19.2) '@octokit/rest': - specifier: ^21.0.0 - version: 21.1.1 + specifier: ^22.0.1 + version: 22.0.1 citty: specifier: ^0.1.6 version: 0.1.6 @@ -38,11 +38,14 @@ importers: giget: specifier: ^2.0.0 version: 2.0.0 + ignore: + specifier: ^7.0.5 + version: 7.0.5 pathe: specifier: ^2.0.3 version: 2.0.3 tinyglobby: - specifier: ^0.2.0 + specifier: ^0.2.15 version: 0.2.15 ts-pattern: specifier: ^5.9.0 @@ -55,11 +58,11 @@ importers: specifier: ^2.3.8 version: 2.3.8 '@types/node': - specifier: ^22.19.1 - version: 22.19.1 + specifier: ^22.19.2 + version: 22.19.2 '@vitest/coverage-v8': specifier: ^4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@22.19.1)(jiti@2.6.1)) + version: 4.0.15(vitest@4.0.15(@types/node@22.19.2)(jiti@2.6.1)) memfs: specifier: ^4.51.1 version: 4.51.1 @@ -71,7 +74,7 @@ importers: version: 3.6.1(typescript@5.9.3) vitest: specifier: ^4.0.15 - version: 4.0.15(@types/node@22.19.1)(jiti@2.6.1) + version: 4.0.15(@types/node@22.19.2)(jiti@2.6.1) packages: @@ -581,63 +584,57 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@octokit/auth-token@5.1.2': - resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} - engines: {node: '>= 18'} + '@octokit/auth-token@6.0.0': + resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} + engines: {node: '>= 20'} - '@octokit/core@6.1.6': - resolution: {integrity: sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==} - engines: {node: '>= 18'} + '@octokit/core@7.0.6': + resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} + engines: {node: '>= 20'} - '@octokit/endpoint@10.1.4': - resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} - engines: {node: '>= 18'} + '@octokit/endpoint@11.0.2': + resolution: {integrity: sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==} + engines: {node: '>= 20'} - '@octokit/graphql@8.2.2': - resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} - engines: {node: '>= 18'} + '@octokit/graphql@9.0.3': + resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} + engines: {node: '>= 20'} - '@octokit/openapi-types@24.2.0': - resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} - '@octokit/openapi-types@25.1.0': - resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} - - '@octokit/plugin-paginate-rest@11.6.0': - resolution: {integrity: sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==} - engines: {node: '>= 18'} + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-request-log@5.3.1': - resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} - engines: {node: '>= 18'} + '@octokit/plugin-request-log@6.0.0': + resolution: {integrity: sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@13.5.0': - resolution: {integrity: sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==} - engines: {node: '>= 18'} + '@octokit/plugin-rest-endpoint-methods@17.0.0': + resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} + engines: {node: '>= 20'} peerDependencies: '@octokit/core': '>=6' - '@octokit/request-error@6.1.8': - resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} - engines: {node: '>= 18'} - - '@octokit/request@9.2.4': - resolution: {integrity: sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==} - engines: {node: '>= 18'} + '@octokit/request-error@7.1.0': + resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} + engines: {node: '>= 20'} - '@octokit/rest@21.1.1': - resolution: {integrity: sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==} - engines: {node: '>= 18'} + '@octokit/request@10.0.7': + resolution: {integrity: sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==} + engines: {node: '>= 20'} - '@octokit/types@13.10.0': - resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + '@octokit/rest@22.0.1': + resolution: {integrity: sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==} + engines: {node: '>= 20'} - '@octokit/types@14.1.0': - resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -818,8 +815,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.19.1': - resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + '@types/node@22.19.2': + resolution: {integrity: sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -911,8 +908,8 @@ packages: resolution: {integrity: sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==} hasBin: true - before-after-hook@3.0.2: - resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + before-after-hook@4.0.0: + resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -1117,8 +1114,8 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - fast-content-type-parse@2.0.1: - resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} @@ -1221,6 +1218,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -2066,7 +2067,7 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/cli@2.29.8(@types/node@22.19.1)': + '@changesets/cli@2.29.8(@types/node@22.19.2)': dependencies: '@changesets/apply-release-plan': 7.0.14 '@changesets/assemble-release-plan': 6.0.9 @@ -2082,7 +2083,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@22.19.1) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.2) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -2268,129 +2269,129 @@ snapshots: '@inquirer/ansi@2.0.2': {} - '@inquirer/checkbox@5.0.2(@types/node@22.19.1)': + '@inquirer/checkbox@5.0.2(@types/node@22.19.2)': dependencies: '@inquirer/ansi': 2.0.2 - '@inquirer/core': 11.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/confirm@6.0.2(@types/node@22.19.1)': + '@inquirer/confirm@6.0.2(@types/node@22.19.2)': dependencies: - '@inquirer/core': 11.0.2(@types/node@22.19.1) - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/core@11.0.2(@types/node@22.19.1)': + '@inquirer/core@11.0.2(@types/node@22.19.2)': dependencies: '@inquirer/ansi': 2.0.2 '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/type': 4.0.2(@types/node@22.19.2) cli-width: 4.1.0 mute-stream: 3.0.0 signal-exit: 4.1.0 wrap-ansi: 9.0.2 optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/editor@5.0.2(@types/node@22.19.1)': + '@inquirer/editor@5.0.2(@types/node@22.19.2)': dependencies: - '@inquirer/core': 11.0.2(@types/node@22.19.1) - '@inquirer/external-editor': 2.0.2(@types/node@22.19.1) - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) + '@inquirer/external-editor': 2.0.2(@types/node@22.19.2) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/expand@5.0.2(@types/node@22.19.1)': + '@inquirer/expand@5.0.2(@types/node@22.19.2)': dependencies: - '@inquirer/core': 11.0.2(@types/node@22.19.1) - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/external-editor@1.0.3(@types/node@22.19.1)': + '@inquirer/external-editor@1.0.3(@types/node@22.19.2)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/external-editor@2.0.2(@types/node@22.19.1)': + '@inquirer/external-editor@2.0.2(@types/node@22.19.2)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 '@inquirer/figures@2.0.2': {} - '@inquirer/input@5.0.2(@types/node@22.19.1)': + '@inquirer/input@5.0.2(@types/node@22.19.2)': dependencies: - '@inquirer/core': 11.0.2(@types/node@22.19.1) - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/number@4.0.2(@types/node@22.19.1)': + '@inquirer/number@4.0.2(@types/node@22.19.2)': dependencies: - '@inquirer/core': 11.0.2(@types/node@22.19.1) - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/password@5.0.2(@types/node@22.19.1)': + '@inquirer/password@5.0.2(@types/node@22.19.2)': dependencies: '@inquirer/ansi': 2.0.2 - '@inquirer/core': 11.0.2(@types/node@22.19.1) - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 - - '@inquirer/prompts@8.0.2(@types/node@22.19.1)': - dependencies: - '@inquirer/checkbox': 5.0.2(@types/node@22.19.1) - '@inquirer/confirm': 6.0.2(@types/node@22.19.1) - '@inquirer/editor': 5.0.2(@types/node@22.19.1) - '@inquirer/expand': 5.0.2(@types/node@22.19.1) - '@inquirer/input': 5.0.2(@types/node@22.19.1) - '@inquirer/number': 4.0.2(@types/node@22.19.1) - '@inquirer/password': 5.0.2(@types/node@22.19.1) - '@inquirer/rawlist': 5.0.2(@types/node@22.19.1) - '@inquirer/search': 4.0.2(@types/node@22.19.1) - '@inquirer/select': 5.0.2(@types/node@22.19.1) + '@types/node': 22.19.2 + + '@inquirer/prompts@8.0.2(@types/node@22.19.2)': + dependencies: + '@inquirer/checkbox': 5.0.2(@types/node@22.19.2) + '@inquirer/confirm': 6.0.2(@types/node@22.19.2) + '@inquirer/editor': 5.0.2(@types/node@22.19.2) + '@inquirer/expand': 5.0.2(@types/node@22.19.2) + '@inquirer/input': 5.0.2(@types/node@22.19.2) + '@inquirer/number': 4.0.2(@types/node@22.19.2) + '@inquirer/password': 5.0.2(@types/node@22.19.2) + '@inquirer/rawlist': 5.0.2(@types/node@22.19.2) + '@inquirer/search': 4.0.2(@types/node@22.19.2) + '@inquirer/select': 5.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/rawlist@5.0.2(@types/node@22.19.1)': + '@inquirer/rawlist@5.0.2(@types/node@22.19.2)': dependencies: - '@inquirer/core': 11.0.2(@types/node@22.19.1) - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/search@4.0.2(@types/node@22.19.1)': + '@inquirer/search@4.0.2(@types/node@22.19.2)': dependencies: - '@inquirer/core': 11.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/select@5.0.2(@types/node@22.19.1)': + '@inquirer/select@5.0.2(@types/node@22.19.2)': dependencies: '@inquirer/ansi': 2.0.2 - '@inquirer/core': 11.0.2(@types/node@22.19.1) + '@inquirer/core': 11.0.2(@types/node@22.19.2) '@inquirer/figures': 2.0.2 - '@inquirer/type': 4.0.2(@types/node@22.19.1) + '@inquirer/type': 4.0.2(@types/node@22.19.2) optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 - '@inquirer/type@4.0.2(@types/node@22.19.1)': + '@inquirer/type@4.0.2(@types/node@22.19.2)': optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 '@jridgewell/resolve-uri@3.1.2': {} @@ -2465,73 +2466,67 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@octokit/auth-token@5.1.2': {} + '@octokit/auth-token@6.0.0': {} - '@octokit/core@6.1.6': + '@octokit/core@7.0.6': dependencies: - '@octokit/auth-token': 5.1.2 - '@octokit/graphql': 8.2.2 - '@octokit/request': 9.2.4 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.1.0 - before-after-hook: 3.0.2 + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.7 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + before-after-hook: 4.0.0 universal-user-agent: 7.0.3 - '@octokit/endpoint@10.1.4': + '@octokit/endpoint@11.0.2': dependencies: - '@octokit/types': 14.1.0 + '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 - '@octokit/graphql@8.2.2': + '@octokit/graphql@9.0.3': dependencies: - '@octokit/request': 9.2.4 - '@octokit/types': 14.1.0 + '@octokit/request': 10.0.7 + '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 - '@octokit/openapi-types@24.2.0': {} + '@octokit/openapi-types@27.0.0': {} - '@octokit/openapi-types@25.1.0': {} - - '@octokit/plugin-paginate-rest@11.6.0(@octokit/core@6.1.6)': + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 6.1.6 - '@octokit/types': 13.10.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.6)': + '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 6.1.6 + '@octokit/core': 7.0.6 - '@octokit/plugin-rest-endpoint-methods@13.5.0(@octokit/core@6.1.6)': + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 6.1.6 - '@octokit/types': 13.10.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/request-error@6.1.8': + '@octokit/request-error@7.1.0': dependencies: - '@octokit/types': 14.1.0 + '@octokit/types': 16.0.0 - '@octokit/request@9.2.4': + '@octokit/request@10.0.7': dependencies: - '@octokit/endpoint': 10.1.4 - '@octokit/request-error': 6.1.8 - '@octokit/types': 14.1.0 - fast-content-type-parse: 2.0.1 + '@octokit/endpoint': 11.0.2 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + fast-content-type-parse: 3.0.0 universal-user-agent: 7.0.3 - '@octokit/rest@21.1.1': - dependencies: - '@octokit/core': 6.1.6 - '@octokit/plugin-paginate-rest': 11.6.0(@octokit/core@6.1.6) - '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.6) - '@octokit/plugin-rest-endpoint-methods': 13.5.0(@octokit/core@6.1.6) - - '@octokit/types@13.10.0': + '@octokit/rest@22.0.1': dependencies: - '@octokit/openapi-types': 24.2.0 + '@octokit/core': 7.0.6 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) - '@octokit/types@14.1.0': + '@octokit/types@16.0.0': dependencies: - '@octokit/openapi-types': 25.1.0 + '@octokit/openapi-types': 27.0.0 '@rollup/plugin-alias@5.1.1(rollup@4.53.3)': optionalDependencies: @@ -2659,13 +2654,13 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.19.1': + '@types/node@22.19.2': dependencies: undici-types: 6.21.0 '@types/resolve@1.20.2': {} - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@22.19.1)(jiti@2.6.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@22.19.2)(jiti@2.6.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -2678,7 +2673,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@types/node@22.19.1)(jiti@2.6.1) + vitest: 4.0.15(@types/node@22.19.2)(jiti@2.6.1) transitivePeerDependencies: - supports-color @@ -2691,13 +2686,13 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@22.19.1)(jiti@2.6.1))': + '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@22.19.2)(jiti@2.6.1))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.7(@types/node@22.19.1)(jiti@2.6.1) + vite: 7.2.7(@types/node@22.19.2)(jiti@2.6.1) '@vitest/pretty-format@4.0.15': dependencies: @@ -2759,7 +2754,7 @@ snapshots: baseline-browser-mapping@2.9.4: {} - before-after-hook@3.0.2: {} + before-after-hook@4.0.0: {} better-path-resolve@1.0.0: dependencies: @@ -2986,7 +2981,7 @@ snapshots: extendable-error@0.1.7: {} - fast-content-type-parse@2.0.1: {} + fast-content-type-parse@3.0.0: {} fast-glob@3.3.3: dependencies: @@ -3088,6 +3083,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -3708,7 +3705,7 @@ snapshots: util-deprecate@1.0.2: {} - vite@7.2.7(@types/node@22.19.1)(jiti@2.6.1): + vite@7.2.7(@types/node@22.19.2)(jiti@2.6.1): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -3717,14 +3714,14 @@ snapshots: rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 fsevents: 2.3.3 jiti: 2.6.1 - vitest@4.0.15(@types/node@22.19.1)(jiti@2.6.1): + vitest@4.0.15(@types/node@22.19.2)(jiti@2.6.1): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@22.19.1)(jiti@2.6.1)) + '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@22.19.2)(jiti@2.6.1)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 @@ -3741,10 +3738,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.7(@types/node@22.19.1)(jiti@2.6.1) + vite: 7.2.7(@types/node@22.19.2)(jiti@2.6.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.2 transitivePeerDependencies: - jiti - less