From 037886019dd86809580df2d11a6ada44ec9cd2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E9=9B=AA?= <47615501+YukiWorks432@users.noreply.github.com> Date: Wed, 8 Jul 2026 03:24:43 +0900 Subject: [PATCH 1/7] =?UTF-8?q?chore:=20build:false=20=E9=9D=9E=E6=8E=A8?= =?UTF-8?q?=E5=A5=A8=E5=8C=96=E3=81=A8=20es.config=20=E5=9E=8B=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9=E3=82=92=E5=88=86=E9=9B=A2=20(#40)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: es.config の型定義分離と build:false 非推奨警告を更新 * chore: es.config の型定義コメントと参照形式をローカルに合わせる --- es.config.mjs | 9 ++++----- rollup.config.mjs | 32 ++++++++++++++++++++++++++++---- src/types/es.config.d.ts | 15 +++++++++++++++ 3 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 src/types/es.config.d.ts diff --git a/es.config.mjs b/es.config.mjs index d57ce48..d9dea0d 100644 --- a/es.config.mjs +++ b/es.config.mjs @@ -1,4 +1,5 @@ -export default { +/** @type {import("./src/types/es.config").EsConfig} */ +const config = { // アプリごとにスクリプトを管理します. // src/{appId}/{scriptName}/index.ts がビルドされます. // 出力先は dist/{appId}/{scriptName}/{scriptName}.jsx です. @@ -7,7 +8,6 @@ export default { { name: "example", version: "0.0.1", - build: true, license: false, }, ], @@ -15,7 +15,6 @@ export default { { name: "example", version: "0.0.1", - build: true, license: false, }, ], @@ -23,7 +22,6 @@ export default { { name: "example", version: "0.0.1", - build: true, license: false, }, ], @@ -35,8 +33,9 @@ export default { { name: "tests", version: "0.0.1", - build: true, license: true, }, ], }; + +export default config; diff --git a/rollup.config.mjs b/rollup.config.mjs index aa58932..51f0c12 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -300,7 +300,9 @@ const onwarn = (warning, defaultHandler) => { return; } defaultHandler(warning); -}; +}; +const TEXT_COLOR_YELLOW = "\x1b[33m"; +const TEXT_COLOR_RESET = "\x1b[0m"; const terserConfig = (preamble) => terser({ @@ -384,13 +386,22 @@ export default (commandLineArgs) => { const appFilter = getAppFilter(commandLineArgs); // アプリ別スクリプトを展開: { appId, script, srcDir, outDir } - const allScripts = []; + const allScripts = []; + let hasDeprecatedBuildFalse = false; if (config.scripts) { for (const [appId, scripts] of Object.entries(config.scripts)) { if (appFilter && appId !== appFilter) continue; for (const script of scripts) { - if (script.build === false) continue; + const isBuildEnabled = script.build !== false; + + if (!forceBuildAll && !isBuildEnabled) { + continue; + } + + if (forceBuildAll && !isBuildEnabled) { + hasDeprecatedBuildFalse = true; + } allScripts.push({ appId, @@ -407,7 +418,15 @@ export default (commandLineArgs) => { // common スクリプト(アプリ非依存) if (config.common && !appFilter) { for (const script of config.common) { - if (script.build === false) continue; + const isBuildEnabled = script.build !== false; + + if (!forceBuildAll && !isBuildEnabled) { + continue; + } + + if (forceBuildAll && !isBuildEnabled) { + hasDeprecatedBuildFalse = true; + } allScripts.push({ appId: null, @@ -423,6 +442,10 @@ export default (commandLineArgs) => { if (allScripts.length === 0) { console.error("ビルドするスクリプトがありません。"); process.exit(1); + } + + if (forceBuildAll && hasDeprecatedBuildFalse) { + console.warn(`${TEXT_COLOR_YELLOW}注意: es.config.mjs の build:false は非推奨です。build -a 実行時はビルド対象の判定を無視して全件をビルドします。${TEXT_COLOR_RESET}`); } const previousBuildHashes = loadBuildHashes(); @@ -488,3 +511,4 @@ export default (commandLineArgs) => { return entries; }; + diff --git a/src/types/es.config.d.ts b/src/types/es.config.d.ts new file mode 100644 index 0000000..7550702 --- /dev/null +++ b/src/types/es.config.d.ts @@ -0,0 +1,15 @@ +export interface ScriptConfig { + /** @description スクリプトの名前 */ + name: string; + /** @description スクリプトのバージョン */ + version: string; + /** @deprecated 非推奨です。pn build では自動的に変更があったスクリプトのみビルドします。 */ + build?: boolean; + /** @description ライセンスファイルを含めるかどうか */ + license?: boolean; +} + +export interface EsConfig { + scripts: Record; + common?: ScriptConfig[]; +} From bbd76a9286475ef4d3281b74437e15abf6d5fbd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E9=9B=AA?= <47615501+YukiWorks432@users.noreply.github.com> Date: Sun, 26 Jul 2026 15:48:03 +0900 Subject: [PATCH 2/7] =?UTF-8?q?Issue=20#41:=20=E5=B7=AE=E5=88=86=E3=83=93?= =?UTF-8?q?=E3=83=AB=E3=83=89=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=83=8F=E3=83=83?= =?UTF-8?q?=E3=82=B7=E3=83=A5=E3=82=92=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97?= =?UTF-8?q?=E3=83=88=E5=8D=98=E4=BD=8D=E3=81=AB=E5=88=86=E9=9B=A2=20(#43)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 + docs/project-overview.md | 13 +++- package.json | 1 + rollup.config.mjs | 52 +++++-------- scripts/buildHash.mjs | 150 +++++++++++++++++++++++++++++++++++++ scripts/buildHash.test.mjs | 98 ++++++++++++++++++++++++ 6 files changed, 282 insertions(+), 35 deletions(-) create mode 100644 scripts/buildHash.mjs create mode 100644 scripts/buildHash.test.mjs diff --git a/README.md b/README.md index 0e3f205..71dc835 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ pnpm watch | `pnpm new` | 新規スクリプト追加 | | `pnpm add-app` | 新規アプリ追加 | | `pnpm clean` | ビルドハッシュをクリーンアップ | +| `pnpm test` | ビルド差分判定の回帰テスト | `pnpm add-app -- --app=` で正式対応アプリを追加すると、`pnpm build:` も自動で追加されます。 @@ -154,6 +155,8 @@ pnpm watch `src/tests/index.ts`にテストを記述しています。 ビルドして実行すればダイアログが表示され、shimが想定通り動いているかが表示されます。 +ビルド差分判定の回帰テストは `pnpm test` で実行できます。 + ## ドキュメント - [プロジェクト概要](docs/project-overview.md) diff --git a/docs/project-overview.md b/docs/project-overview.md index 78098fb..c2069d5 100644 --- a/docs/project-overview.md +++ b/docs/project-overview.md @@ -233,16 +233,23 @@ pnpm add-app -- --app=idsn | `pnpm new` | 新規スクリプト追加(対話式 / CLI) | | `pnpm add-app` | 新規アプリスキャフォールディング | | `pnpm clean` | ビルドハッシュをクリーンアップ | +| `pnpm test` | ビルド差分判定の回帰テスト | ## 差分ビルドの判定 `pnpm build` は、各スクリプトの `index.ts` から相対 `import` / `export ... from` -で到達するファイルと、ビルド設定ファイルのハッシュを使って再ビルド対象を判定する。 +で到達するファイルと、スクリプトごとの有効な設定のハッシュを使って再ビルド対象を判定する。 同じ `src/{appId}` 配下にある別スクリプトを変更しても、そのスクリプトを import していない 他のスクリプトは再ビルド対象にならない。 -`rollup.config.mjs`、`es.config.mjs`、`package.json`、`pnpm-lock.yaml`、`tsconfig.json`、 -対象アプリの `tsconfig.json` を変更した場合は、該当するビルド対象のハッシュが変わる。 +`rollup.config.mjs`、`package.json`、`pnpm-lock.yaml`、ルート `tsconfig.json` を変更した場合は +全スクリプトのハッシュが変わる。対象アプリの `tsconfig.json` を変更した場合は、該当アプリの +ビルド対象だけのハッシュが変わる。`es.config.mjs` の `version`、`license`、その他の成果物へ +影響する設定を変更した場合は、対象スクリプトだけのハッシュが変わる。`build` は選択専用のため +ハッシュに含めない。`license` の省略と `false` は同じ設定として扱う。 +設定値はJSON互換値に限り、関数や循環参照などは明示的なエラーになる。設定の正規化はプロパティ順、 +空白、整形、コメントに依存しない。ハッシュ方式番号を変更した直後は、移行のため一度だけ全件を +再ビルドする。 `src/init.ts`、`src/lib/`、`src/{appId}/lib/` は、スクリプトから import で到達している場合だけ、 そのスクリプトのハッシュに含まれる。 `src/types/` は全スクリプト、`src/{appId}/types/` は該当アプリのスクリプトで使える ambient 型定義 diff --git a/package.json b/package.json index db1c464..2122a14 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "build:ilst": "rollup -c --app=ilst", "build:phxs": "rollup -c --app=phxs", "clean": "node ./scripts/cleanBuildHashes.mjs", + "test": "node --test", "watch": "rollup -c -w", "lint": "eslint .", "format": "prettier --write .", diff --git a/rollup.config.mjs b/rollup.config.mjs index 51f0c12..fb7d37d 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -11,19 +11,11 @@ import process from "process"; import path from "path"; import config from "./es.config.mjs"; - -// ファイルのハッシュを計算する関数 -const calculateFileHash = (filePath) => { - try { - const fileBuffer = fs.readFileSync(filePath); - const hashSum = crypto.createHash("sha256"); - hashSum.update(fileBuffer); - return hashSum.digest("hex"); - } catch (error) { - console.error(`ファイルのハッシュ計算に失敗: ${filePath}`, error); - return "unknown"; - } -}; +import { + calculateFileHash, + calculateScriptHash as calculateScriptHashValue, + selectChangedScripts, +} from "./scripts/buildHash.mjs"; const BUILD_HASH_DIR = "dist/temp"; const BUILD_HASH_FILE = `${BUILD_HASH_DIR}/build-hashes.json`; @@ -34,11 +26,8 @@ const ensureDirectory = (dirPath) => { } }; -const hashText = (text) => { - const hashSum = crypto.createHash("sha256"); - hashSum.update(text); - return hashSum.digest("hex"); -}; +const hashText = (text) => + crypto.createHash("sha256").update(text).digest("hex"); const normalizePath = (filePath) => filePath.replace(/\\/g, "/"); @@ -112,7 +101,6 @@ const calculateInputHash = (inputPaths) => { const SHARED_BUILD_INPUTS = [ "rollup.config.mjs", - "es.config.mjs", "package.json", "pnpm-lock.yaml", "tsconfig.json", @@ -237,7 +225,10 @@ const getScriptHashInputs = ({ appId, script, srcDir, tsconfig }) => { }; const calculateScriptHash = (scriptContext) => - calculateInputHash(getScriptHashInputs(scriptContext)); + calculateScriptHashValue({ + inputHash: calculateInputHash(getScriptHashInputs(scriptContext)), + script: scriptContext.script, + }); const loadBuildHashes = () => { try { @@ -449,19 +440,16 @@ export default (commandLineArgs) => { } const previousBuildHashes = loadBuildHashes(); - const currentBuildHashes = appFilter ? { ...previousBuildHashes } : {}; - - const targetScripts = allScripts.filter((scriptContext) => { - const { hashKey } = scriptContext; - const scriptHash = calculateScriptHash(scriptContext); - currentBuildHashes[hashKey] = scriptHash; - - if (forceBuildAll) { - return true; - } - - return previousBuildHashes[hashKey] !== scriptHash; + const selection = selectChangedScripts({ + scripts: allScripts, + previousBuildHashes, + forceBuildAll, + calculateHash: calculateScriptHash, }); + const currentBuildHashes = appFilter + ? { ...previousBuildHashes, ...selection.currentBuildHashes } + : selection.currentBuildHashes; + const targetScripts = selection.targetScripts; const entries = targetScripts.map( ({ script, srcDir, outDir, hashKey, tsconfig }) => { diff --git a/scripts/buildHash.mjs b/scripts/buildHash.mjs new file mode 100644 index 0000000..a3e4976 --- /dev/null +++ b/scripts/buildHash.mjs @@ -0,0 +1,150 @@ +import crypto from "crypto"; +import fs from "fs"; + +/** + * ハッシュ方式はビルドキャッシュの契約です。入力や正規化形式を変更する時は + * 方式番号を上げ、直後の一度だけ全スクリプトを再ビルドします。 + */ +export const SCRIPT_HASH_VERSION = 2; + +export const hashText = (text) => { + const hashSum = crypto.createHash("sha256"); + hashSum.update(text); + return hashSum.digest("hex"); +}; + +export const calculateFileHash = (filePath) => { + try { + const fileBuffer = fs.readFileSync(filePath); + return hashText(fileBuffer); + } catch (error) { + console.error(`ファイルのハッシュ計算に失敗: ${filePath}`, error); + return "unknown"; + } +}; + +const isPlainObject = (value) => { + if (value === null || typeof value !== "object") return false; + const prototype = Object.getPrototypeOf(value); + return prototype === Object.prototype || prototype === null; +}; + +const formatPath = (path) => (path ? `設定値 ${path}` : "設定値"); + +const normalizeJsonValue = (value, path, ancestors = new Set()) => { + if ( + value === null || + typeof value === "string" || + typeof value === "boolean" + ) { + return value; + } + + if (typeof value === "number") { + if (!Number.isFinite(value)) { + throw new TypeError( + `${formatPath(path)}には有限の数値だけを指定できます。` + ); + } + return value; + } + + if (Array.isArray(value)) { + if (ancestors.has(value)) { + throw new TypeError(`${formatPath(path)}には循環参照を指定できません。`); + } + const nextAncestors = new Set(ancestors); + nextAncestors.add(value); + return value.map((item, index) => + normalizeJsonValue(item, `${path}[${index}]`, nextAncestors) + ); + } + + if (!isPlainObject(value)) { + throw new TypeError( + `${formatPath(path)}にはJSON互換値だけを指定できます(関数、循環参照、Date等は使用できません)。` + ); + } + + if (ancestors.has(value)) { + throw new TypeError(`${formatPath(path)}には循環参照を指定できません。`); + } + const nextAncestors = new Set(ancestors); + nextAncestors.add(value); + + const normalized = {}; + Object.keys(value) + .sort() + .forEach((key) => { + normalized[key] = normalizeJsonValue( + value[key], + path ? `${path}.${key}` : key, + nextAncestors + ); + }); + return normalized; +}; + +export const normalizeScriptConfig = (script) => { + if (!isPlainObject(script)) { + throw new TypeError( + "スクリプト設定にはJSON互換のオブジェクトを指定してください。" + ); + } + + const normalized = {}; + Object.keys(script) + .sort() + .forEach((key) => { + // build は選択専用のため、成果物のハッシュを失効させません。 + normalized[key] = normalizeJsonValue(script[key], key); + }); + delete normalized.build; + + // license の省略と license:false は同じ成果物契約として扱います。 + if (normalized.license === undefined || normalized.license === false) { + normalized.license = false; + } + + return Object.keys(normalized) + .sort() + .reduce((result, key) => { + result[key] = normalized[key]; + return result; + }, {}); +}; + +export const serializeScriptConfig = (script) => + JSON.stringify(normalizeScriptConfig(script)); + +export const calculateScriptConfigHash = (script) => + hashText(`${SCRIPT_HASH_VERSION}:config:${serializeScriptConfig(script)}`); + +export const calculateScriptHash = ({ inputHash, script }) => + hashText( + `${SCRIPT_HASH_VERSION}:input:${inputHash}:config:${serializeScriptConfig(script)}` + ); + +export const selectChangedScripts = ({ + scripts, + previousBuildHashes, + forceBuildAll = false, + calculateHash, +}) => { + const currentBuildHashes = {}; + const targetScripts = []; + + scripts.forEach((scriptContext) => { + const scriptHash = calculateHash(scriptContext); + currentBuildHashes[scriptContext.hashKey] = scriptHash; + + if ( + forceBuildAll || + previousBuildHashes[scriptContext.hashKey] !== scriptHash + ) { + targetScripts.push(scriptContext); + } + }); + + return { targetScripts, currentBuildHashes }; +}; diff --git a/scripts/buildHash.test.mjs b/scripts/buildHash.test.mjs new file mode 100644 index 0000000..8caca3b --- /dev/null +++ b/scripts/buildHash.test.mjs @@ -0,0 +1,98 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { + SCRIPT_HASH_VERSION, + calculateScriptConfigHash, + normalizeScriptConfig, + selectChangedScripts, + serializeScriptConfig, +} from "./buildHash.mjs"; + +test("スクリプト設定は順序、整形、コメントに依存せず正規化される", () => { + const first = { + name: "example", + version: "1.0.0", + license: false, + future: { z: [2, { b: true, a: null }], a: "value" }, + build: true, + }; + const second = { + future: { a: "value", z: [2, { a: null, b: true }] }, + version: "1.0.0", + name: "example", + }; + + assert.equal(serializeScriptConfig(first), serializeScriptConfig(second)); + assert.equal( + calculateScriptConfigHash(first), + calculateScriptConfigHash(second) + ); + assert.deepEqual(normalizeScriptConfig(second), { + future: { a: "value", z: [2, { a: null, b: true }] }, + license: false, + name: "example", + version: "1.0.0", + }); +}); + +test("build はハッシュから除外し、license の省略と false を同値にする", () => { + const withoutLicense = { name: "example", version: "1.0.0" }; + const withFalseLicense = { + name: "example", + version: "1.0.0", + license: false, + }; + + assert.equal( + calculateScriptConfigHash({ ...withoutLicense, build: false }), + calculateScriptConfigHash(withFalseLicense) + ); + assert.equal(normalizeScriptConfig(withoutLicense).license, false); +}); + +test("非対応の設定値と循環参照は理由付きで拒否する", () => { + assert.throws( + () => calculateScriptConfigHash({ name: "example", transform: () => null }), + /JSON互換値/ + ); + + const cyclic = { name: "example" }; + cyclic.options = cyclic; + assert.throws(() => calculateScriptConfigHash(cyclic), /循環参照/); +}); + +test("差分選択は変更されたスクリプトだけを返し、強制指定を維持する", () => { + const scripts = [ + { hashKey: "aeft/first", value: "same" }, + { hashKey: "aeft/second", value: "changed" }, + ]; + const calculateHash = ({ value }) => value; + + const result = selectChangedScripts({ + scripts, + previousBuildHashes: { "aeft/first": "same", "aeft/second": "old" }, + calculateHash, + }); + assert.deepEqual( + result.targetScripts.map(({ hashKey }) => hashKey), + ["aeft/second"] + ); + assert.deepEqual(result.currentBuildHashes, { + "aeft/first": "same", + "aeft/second": "changed", + }); + + const forced = selectChangedScripts({ + scripts, + previousBuildHashes: result.currentBuildHashes, + forceBuildAll: true, + calculateHash, + }); + assert.equal(forced.targetScripts.length, scripts.length); +}); + +test("ハッシュ方式番号は明示されている", () => { + assert.equal(typeof SCRIPT_HASH_VERSION, "number"); + assert.ok(SCRIPT_HASH_VERSION >= 2); +}); From ba2aa497af2245213a0e2d6cff3fd0fb00181a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E9=9B=AA?= <47615501+YukiWorks432@users.noreply.github.com> Date: Sun, 26 Jul 2026 17:01:57 +0900 Subject: [PATCH 3/7] =?UTF-8?q?docs:=200.x=20=E7=B3=BB=E5=88=97=E3=81=AE?= =?UTF-8?q?=E4=BA=92=E6=8F=9B=E6=80=A7=E5=A4=89=E6=9B=B4=E3=82=92=E3=83=9E?= =?UTF-8?q?=E3=82=A4=E3=83=8A=E3=83=BC=E6=9B=B4=E6=96=B0=E3=81=A8=E3=81=97?= =?UTF-8?q?=E3=81=A6=E5=AE=9A=E7=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue #44 の受入条件に従い、0.x 系列と 1.0.0 以降の互換性変更に対するリリースラベル規則を文書化する。 Closes #44 --- docs/release-process.md | 26 +++++++++++++++++++------- docs/repository-operations.md | 20 ++++++++++++++------ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/docs/release-process.md b/docs/release-process.md index 90e5df9..1634b4d 100644 --- a/docs/release-process.md +++ b/docs/release-process.md @@ -24,17 +24,28 @@ Pull Request に付けたラベルで、上げるバージョンを決めます。 -| ラベル | 動作 | -| --------------- | ------------------ | -| `release:major` | `X.0.0` へ上げる | -| `release:minor` | `0.X.0` へ上げる | -| `release:patch` | `0.0.X` へ上げる | -| `release:none` | リリースを作らない | +| ラベル | 動作 | +| --------------- | ---------------------------------------------------------- | +| `release:major` | メジャー番号を 1 上げ、マイナー番号とパッチ番号を 0 にする | +| `release:minor` | マイナー番号を 1 上げ、パッチ番号を 0 にする | +| `release:patch` | パッチ番号を 1 上げる | +| `release:none` | リリースを作らない | `release:*` ラベルがない場合は `release:patch` として扱います。 複数のリリースラベルが付いた場合は、`major`、`minor`、`patch` の順で大きいものを採用します。 +ラベルの選択は、リリース前の現在のバージョン系列で決めます。 + +- `0.x` 系列では、互換性を壊す変更も `release:minor` とする。たとえば、公開している設定形式の変更や、対応する Node.js の最低バージョンを引き上げて利用可能な環境を狭める変更が該当する。 +- `1.0.0` 以降では、互換性を壊す変更を `release:major` とする。 +- 互換性を維持する修正や文書更新は `release:patch`、互換性を維持する機能追加は `release:minor` とする。 +- リリースを作らない管理変更は、系列に関係なく `release:none` とする。 + +この区分は、0.x 系列ではマイナー番号の更新を互換性を壊す変更に割り当てるという、セマンティック バージョニングの運用上の取り決めです。1.0.0 に到達した時点で、互換性を壊す変更のラベルを `release:major` に切り替えます。 + +自動リリース処理は、付与されたラベルに応じてメジャー、マイナー、パッチの番号を更新するだけです。この系列ごとのラベル選択は運用上の規則であり、`.github/workflows/release.yml` の変更は必要ありません。 + ## main 単独運用 `main` だけで運用する場合は、feature ブランチから `main` へ Pull Request を作ります。 @@ -61,7 +72,8 @@ feature/my-script -> develop -> main `main` 向け Pull Request には、変更の大きさに応じてラベルを付けます。 -- 互換性を壊す変更: `release:major` +- `0.x` 系列の互換性を壊す変更: `release:minor` +- `1.0.0` 以降の互換性を壊す変更: `release:major` - 機能追加: `release:minor` - 修正やドキュメント更新: `release:patch` - リリース不要の管理変更: `release:none` diff --git a/docs/repository-operations.md b/docs/repository-operations.md index 30ce734..3ed08c3 100644 --- a/docs/repository-operations.md +++ b/docs/repository-operations.md @@ -29,15 +29,23 @@ Repository Variable `RELEASE_AUTOMATION_ENABLED=true` が設定されている `main` 向け Pull Request には、変更内容に応じて以下のラベルを付けます。 -| ラベル | 用途 | -| --------------- | ------------------------ | -| `release:major` | 互換性を壊す変更 | -| `release:minor` | 機能追加 | -| `release:patch` | 修正、文書更新、運用改善 | -| `release:none` | リリース不要 | +| ラベル | 用途 | +| --------------- | -------------------------------------- | +| `release:major` | `1.0.0` 以降の互換性を壊す変更 | +| `release:minor` | 機能追加、`0.x` 系列の互換性を壊す変更 | +| `release:patch` | 修正、文書更新、運用改善 | +| `release:none` | リリース不要 | ラベルがない場合は `release:patch` として扱います。 +互換性を壊す変更のラベルは、現在のバージョン系列で決めます。`0.x` 系列では +`release:minor`、`1.0.0` 以降では `release:major` を付けてください。公開している +設定形式の変更や、対応する Node.js の最低バージョンを引き上げて利用可能な環境を +狭める変更も、互換性を壊す変更に含めます。互換性を維持する機能追加は +`release:minor`、修正や文書更新は `release:patch`、リリース不要の管理変更は +`release:none` とします。自動リリース処理はラベルに従って版番号を更新するため、 +この系列ごとの運用を実現するために workflow の変更は必要ありません。 + ## テンプレートとしての注意 このリポジトリの `main` はテンプレートとしてコピーされます。 From 5b56b65334461a177c9bffe0f41ff5d15365d634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E9=9B=AA?= <47615501+YukiWorks432@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:31:42 +0900 Subject: [PATCH 4/7] =?UTF-8?q?ES3=E4=BA=92=E6=8F=9B=E6=80=A7=E3=82=92?= =?UTF-8?q?=E7=B6=AD=E6=8C=81=E3=81=97=E3=81=9F=E9=96=8B=E7=99=BA=E4=BE=9D?= =?UTF-8?q?=E5=AD=98=E9=96=A2=E4=BF=82=E6=9B=B4=E6=96=B0=20(#49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: ES3互換の開発依存関係を更新 * fix: 監査上書きと開発環境の説明を修正 * fix: ESLint依存の監査互換パッチを追加 * fix: minimatchの不要な脆弱性回避策を削除 --- .github/dependabot.yml | 53 + .github/workflows/release.yml | 6 +- AGENTS.md | 2 + README.md | 10 +- docs/adr/0001-typescript-4-9-5-for-es3.md | 34 + docs/guides/for-beginners.md | 16 +- docs/guides/getting-started.md | 7 +- docs/project-overview.md | 13 + es.config.mjs | 2 +- package.json | 38 +- pnpm-lock.yaml | 1734 +++++++++++---------- rollup.config.mjs | 49 +- src/types/es.config.d.ts | 2 +- 13 files changed, 1130 insertions(+), 836 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 docs/adr/0001-typescript-4-9-5-for-es3.md diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..4c01efe --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,53 @@ +version: 2 + +updates: + - package-ecosystem: npm + directory: / + target-branch: develop + schedule: + interval: monthly + cooldown: + default-days: 7 + # 冷却期間は通常の版更新にだけ適用され、セキュリティ更新を遅延させない。 + groups: + babel: + patterns: + - "@babel/*" + update-types: + - minor + - patch + typescript-eslint: + patterns: + - "@typescript-eslint/*" + update-types: + - minor + - patch + rollup: + patterns: + - rollup + - "@rollup/*" + - rollup-plugin-license + update-types: + - minor + - patch + quality: + patterns: + - eslint + - "@eslint/*" + - globals + - prettier + update-types: + - minor + - patch + ignore: + - dependency-name: typescript + - dependency-name: "@babel/*" + versions: + - "8.x" + - package-ecosystem: github-actions + directory: / + target-branch: develop + schedule: + interval: monthly + cooldown: + default-days: 7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b9cba8e..b91b689 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Checkout main - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: ref: main fetch-depth: 0 @@ -114,9 +114,9 @@ jobs: - name: Set up Node.js if: steps.settings.outputs.should_release == 'true' - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: - node-version: 20 + node-version: 24 - name: Bump package version if: steps.settings.outputs.should_release == 'true' diff --git a/AGENTS.md b/AGENTS.md index 1bfc65d..1b1511d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,6 +10,8 @@ - GitHub Copilot 専用の `.github/copilot-instructions.md`、`.github/instructions/`、`.github/skills/` は正本にせず、この配布用リポジトリには置きません。 - 作業前にこの `AGENTS.md` を確認してください。対象ファイルに対応する追加指示がある場合は、その指示も確認してください。 - `src/**/*.ts` を編集する場合は、`.agents/instructions/extendscript.md` を確認してください。 +- Node.js と pnpm の対応版、TypeScript 4.9.5 固定の理由は、 + [`docs/adr/0001-typescript-4-9-5-for-es3.md`](docs/adr/0001-typescript-4-9-5-for-es3.md) を参照してください。 - 参照先 docs / skills とこのファイルが矛盾する場合は、このファイルを優先し、必要なら矛盾を報告してください。 ## 必ず守ること diff --git a/README.md b/README.md index 71dc835..1c1cb02 100644 --- a/README.md +++ b/README.md @@ -30,12 +30,16 @@ shimの限界として、正しく動作しないものはeslintによってエ ## 環境 / Environment -- Node.js >= 20 -- pnpm +- Node.js `^22.13.0 || >=24` +- pnpm `11.17.0` +- TypeScript `4.9.5`(ES3 出力のため固定) + +TypeScript 4.9.5 を固定する理由と、Babel 8・TypeScript 5 系を別移行とする判断は、 +[ADR 0001](docs/adr/0001-typescript-4-9-5-for-es3.md) に記録しています。 ## テスト環境 / Tested environment -- Node.js v22.15.0 +- Node.js v22.13.0 / v24.13.0 - Windows 11 - AfterEffects 2025 / Illustrator 2025 / Photoshop 2025 diff --git a/docs/adr/0001-typescript-4-9-5-for-es3.md b/docs/adr/0001-typescript-4-9-5-for-es3.md new file mode 100644 index 0000000..1a2ae3b --- /dev/null +++ b/docs/adr/0001-typescript-4-9-5-for-es3.md @@ -0,0 +1,34 @@ +# ADR 0001: ES3 出力のため TypeScript 4.9.5 を固定する + +- 状態: 採用 +- 日付: 2026-07-26 + +## 文脈 + +このテンプレートは、TypeScript から ExtendScript 向けの ES3 出力を生成する。 +TypeScript 5.0 では ES3 を対象にする設定が非推奨になり、TypeScript 5.5 では +TypeScript 5.0 で非推奨になった機能が無効化された。したがって、TypeScript の +上位系列へ単純に更新すると、テンプレートの出力契約またはビルド設定を変更する +移行が必要になる。 + +## 決定 + +開発依存関係の TypeScript は `4.9.5` を厳密指定する。ES3 出力を維持したまま +TypeScript 5 系へ移行する作業は、この更新とは分離した別の移行として扱う。 +Babel 8 への更新も、TypeScript の上位系列への移行と互換性確認が必要になるため、 +今回の対象外とする。Dependabot では TypeScript の自動更新を除外し、Babel の +メジャー更新を除外する。 + +## 結果 + +- `tsconfig.json` の `target: "ES3"` を維持し、ExtendScript の実行環境に対する + 出力契約を守れる。 +- TypeScript と Babel の上位系列へ更新する場合は、ES3 出力、型検査、Babel の + 変換結果を含む別の移行計画と実機検証が必要になる。 +- Babel 7 系と周辺依存のセキュリティ更新は、今回の固定方針と矛盾しない範囲で + 継続する。 + +## 参考 + +- [TypeScript 5.0: ES3 対象の非推奨化](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#deprecations-and-default-changes) +- [TypeScript 5.5: TypeScript 5.0 で非推奨になった機能の無効化](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html#disabling-features-deprecated-in-typescript-50) diff --git a/docs/guides/for-beginners.md b/docs/guides/for-beginners.md index 213a555..cc2bb68 100644 --- a/docs/guides/for-beginners.md +++ b/docs/guides/for-beginners.md @@ -81,7 +81,7 @@ gh --version ### 1-4. Node.js(JavaScript 実行環境) -ビルドツールを動かすために必要です。バージョン **20 以上**をインストールしてください。 +ビルドツールを動かすために必要です。`^22.13.0` または `24` 以降をインストールしてください。 1. https://nodejs.org/ja にアクセス 2. 「LTS(推奨版)」をクリックしてダウンロード(執筆時点: v22.x) @@ -91,7 +91,7 @@ gh --version ```bash node --version -# v22.x.x と表示されれば OK(20以上であればOK) +# v22.13.0 以上、または v24.x.x と表示されれば OK ``` --- @@ -100,7 +100,7 @@ node --version Node.js のパッケージを管理するツールです。`npm` より高速でディスク容量も節約できます。 -Node.js 16.9 以降には **Corepack** というツール管理機能が同梱されています。これを使うのが最も簡単な方法です。 +Node.js 22・24系には **Corepack** というツール管理機能が同梱されています。これを使うのが最も簡単な方法です。 Node.js をインストールした後、コマンドプロンプトまたは PowerShell で: @@ -108,11 +108,19 @@ Node.js をインストールした後、コマンドプロンプトまたは Po corepack enable pnpm ``` +Node.js 25 以降を使う場合は Corepack が同梱されないため、先に Corepack を +インストールしてから有効化します。 + +```bash +npm install --global corepack@latest +corepack enable pnpm +``` + インストール確認: ```bash pnpm --version -# 10.x.x と表示されれば OK +# 11.17.0 と表示されれば OK ``` > **Corepack とは**: Node.js に同梱されたパッケージマネージャ管理ツールです。`npm install -g` と異なり、グローバルインストールなしでパッケージマネージャを切り替えられます。 diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index 06dcbcf..d7d9a18 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -4,8 +4,11 @@ ## 前提条件 -- Node.js >= 20 -- pnpm +- Node.js `^22.13.0 || >=24` +- pnpm `11.17.0` + +TypeScript 4.9.5 を ES3 出力のため固定している理由は、 +[`docs/adr/0001-typescript-4-9-5-for-es3.md`](../adr/0001-typescript-4-9-5-for-es3.md) を参照してください。 ## セットアップ diff --git a/docs/project-overview.md b/docs/project-overview.md index c2069d5..0564bab 100644 --- a/docs/project-overview.md +++ b/docs/project-overview.md @@ -10,6 +10,19 @@ ExtendScript を TypeScript からトランスパイルして作成するため - **型定義**: [Types-for-Adobe](https://github.com/docsforadobe/Types-for-Adobe)(有志による非公式定義、不足あり) - **パッケージマネージャ**: pnpm +## 開発環境の対応版 + +- **Node.js**: `^22.13.0 || >=24` +- **pnpm**: `11.17.0`(`packageManager` で厳密指定) +- **TypeScript**: `4.9.5`(ES3 出力のため厳密指定) + +TypeScript 4.9.5 を固定する理由と、Babel 8・TypeScript 5 系を別移行とする判断は、 +[`docs/adr/0001-typescript-4-9-5-for-es3.md`](adr/0001-typescript-4-9-5-for-es3.md) に記録しています。 + +Dependabot の通常の版更新は、配布側の既定ブランチに設定が取り込まれた後、 +`develop` 向けに毎月実行されます。7日間の冷却期間は通常の版更新だけに適用され、 +セキュリティ更新を遅延させません。 + ## ディレクトリ構成 ``` diff --git a/es.config.mjs b/es.config.mjs index d9dea0d..9a57b41 100644 --- a/es.config.mjs +++ b/es.config.mjs @@ -38,4 +38,4 @@ const config = { ], }; -export default config; +export default config; diff --git a/package.json b/package.json index 2122a14..c5d70b7 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,10 @@ "name": "extendscript-ts-template", "version": "0.5.0", "description": "Multi-app ExtendScript TypeScript template for Adobe After Effects, Illustrator, Photoshop, and more", + "engines": { + "node": "^22.13.0 || >=24" + }, + "packageManager": "pnpm@11.17.0", "scripts": { "build": "rollup -c", "build:aeft": "rollup -c --app=aeft", @@ -27,30 +31,30 @@ "author": "YukiWorks432", "license": "MIT", "devDependencies": { - "@babel/core": "^7.29.0", + "@babel/core": "^7.29.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-property-mutators": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/preset-env": "^7.29.2", - "@eslint/eslintrc": "^3.3.5", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-property-mutators": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/preset-env": "^7.29.7", + "@eslint/eslintrc": "^3.3.6", "@eslint/js": "^10.0.1", - "@rollup/plugin-babel": "^7.0.0", - "@rollup/plugin-commonjs": "^29.0.2", + "@rollup/plugin-babel": "^7.1.0", + "@rollup/plugin-commonjs": "^29.0.3", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^1.0.0", "@rollup/plugin-typescript": "12.3.0", - "@typescript-eslint/eslint-plugin": "8.58.2", - "@typescript-eslint/parser": "8.58.2", + "@typescript-eslint/eslint-plugin": "8.65.0", + "@typescript-eslint/parser": "8.65.0", "es5-shim": "^4.6.7", "es6-shim": "^0.35.8", - "eslint": "^10.2.1", - "globals": "^17.5.0", - "prettier": "^3.8.3", - "rollup": "^4.60.2", + "eslint": "^10.8.0", + "globals": "^17.7.0", + "prettier": "^3.9.6", + "rollup": "^4.62.2", "rollup-plugin-license": "^3.7.1", "tslib": "2.8.1", "types-for-adobe": "^7.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77a7f4a..b0b8d1d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,59 +13,59 @@ importers: .: devDependencies: '@babel/core': - specifier: ^7.29.0 - version: 7.29.0 + specifier: ^7.29.7 + version: 7.29.7 '@babel/plugin-syntax-dynamic-import': specifier: ^7.8.3 - version: 7.8.3(@babel/core@7.29.0) + version: 7.8.3(@babel/core@7.29.7) '@babel/plugin-transform-class-properties': - specifier: ^7.28.6 - version: 7.28.6(@babel/core@7.29.0) + specifier: ^7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-member-expression-literals': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.29.0) + specifier: ^7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-property-literals': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.29.0) + specifier: ^7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-property-mutators': - specifier: ^7.28.6 - version: 7.28.6(@babel/core@7.29.0) + specifier: ^7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-reserved-words': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.29.0) + specifier: ^7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-shorthand-properties': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.29.0) + specifier: ^7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@babel/preset-env': - specifier: ^7.29.2 - version: 7.29.2(@babel/core@7.29.0) + specifier: ^7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@eslint/eslintrc': - specifier: ^3.3.5 - version: 3.3.5 + specifier: ^3.3.6 + version: 3.3.6 '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.2.1) + version: 10.0.1(eslint@10.8.0) '@rollup/plugin-babel': - specifier: ^7.0.0 - version: 7.0.0(@babel/core@7.29.0)(rollup@4.60.2) + specifier: ^7.1.0 + version: 7.1.0(@babel/core@7.29.7)(rollup@4.62.2) '@rollup/plugin-commonjs': - specifier: ^29.0.2 - version: 29.0.2(rollup@4.60.2) + specifier: ^29.0.3 + version: 29.0.3(rollup@4.62.2) '@rollup/plugin-node-resolve': specifier: ^16.0.3 - version: 16.0.3(rollup@4.60.2) + version: 16.0.3(rollup@4.62.2) '@rollup/plugin-terser': specifier: ^1.0.0 - version: 1.0.0(rollup@4.60.2) + version: 1.0.0(rollup@4.62.2) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.60.2)(tslib@2.8.1)(typescript@4.9.5) + version: 12.3.0(rollup@4.62.2)(tslib@2.8.1)(typescript@4.9.5) '@typescript-eslint/eslint-plugin': - specifier: 8.58.2 - version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@4.9.5))(eslint@10.2.1)(typescript@4.9.5) + specifier: 8.65.0 + version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@4.9.5))(eslint@10.8.0)(typescript@4.9.5) '@typescript-eslint/parser': - specifier: 8.58.2 - version: 8.58.2(eslint@10.2.1)(typescript@4.9.5) + specifier: 8.65.0 + version: 8.65.0(eslint@10.8.0)(typescript@4.9.5) es5-shim: specifier: ^4.6.7 version: 4.6.7 @@ -73,20 +73,20 @@ importers: specifier: ^0.35.8 version: 0.35.8 eslint: - specifier: ^10.2.1 - version: 10.2.1 + specifier: ^10.8.0 + version: 10.8.0 globals: - specifier: ^17.5.0 - version: 17.5.0 + specifier: ^17.7.0 + version: 17.7.0 prettier: - specifier: ^3.8.3 - version: 3.8.3 + specifier: ^3.9.6 + version: 3.9.6 rollup: - specifier: ^4.60.2 - version: 4.60.2 + specifier: ^4.62.2 + version: 4.62.2 rollup-plugin-license: specifier: ^3.7.1 - version: 3.7.1(picomatch@4.0.4)(rollup@4.60.2) + version: 3.7.1(picomatch@4.0.4)(rollup@4.62.2) tslib: specifier: 2.8.1 version: 2.8.1 @@ -106,28 +106,48 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.0': resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.28.6': - resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -138,6 +158,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.29.7': + resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-define-polyfill-provider@0.6.8': resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} peerDependencies: @@ -147,62 +173,86 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.29.7': + resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.28.6': - resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helper-wrap-function@7.29.7': + resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} '@babel/parser@7.29.2': @@ -210,32 +260,43 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': + resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': + resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': + resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7': + resolution: {integrity: sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': + resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': - resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': + resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -251,14 +312,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.28.6': - resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + '@babel/plugin-syntax-import-assertions@7.29.7': + resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.28.6': - resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -269,320 +330,320 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + '@babel/plugin-transform-arrow-functions@7.29.7': + resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.29.0': - resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} + '@babel/plugin-transform-async-generator-functions@7.29.7': + resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.28.6': - resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + '@babel/plugin-transform-async-to-generator@7.29.7': + resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + '@babel/plugin-transform-block-scoped-functions@7.29.7': + resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.6': - resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + '@babel/plugin-transform-block-scoping@7.29.7': + resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.28.6': - resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + '@babel/plugin-transform-class-properties@7.29.7': + resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.28.6': - resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + '@babel/plugin-transform-class-static-block@7.29.7': + resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.6': - resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + '@babel/plugin-transform-classes@7.29.7': + resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.28.6': - resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + '@babel/plugin-transform-computed-properties@7.29.7': + resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + '@babel/plugin-transform-destructuring@7.29.7': + resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.28.6': - resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + '@babel/plugin-transform-dotall-regex@7.29.7': + resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + '@babel/plugin-transform-duplicate-keys@7.29.7': + resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + '@babel/plugin-transform-dynamic-import@7.29.7': + resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-explicit-resource-management@7.28.6': - resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + '@babel/plugin-transform-explicit-resource-management@7.29.7': + resolution: {integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.28.6': - resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + '@babel/plugin-transform-exponentiation-operator@7.29.7': + resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + '@babel/plugin-transform-export-namespace-from@7.29.7': + resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + '@babel/plugin-transform-for-of@7.29.7': + resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + '@babel/plugin-transform-function-name@7.29.7': + resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.28.6': - resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + '@babel/plugin-transform-json-strings@7.29.7': + resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + '@babel/plugin-transform-literals@7.29.7': + resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.28.6': - resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + '@babel/plugin-transform-logical-assignment-operators@7.29.7': + resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + '@babel/plugin-transform-member-expression-literals@7.29.7': + resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + '@babel/plugin-transform-modules-amd@7.29.7': + resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.29.0': - resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} + '@babel/plugin-transform-modules-systemjs@7.29.7': + resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + '@babel/plugin-transform-modules-umd@7.29.7': + resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': - resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': + resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + '@babel/plugin-transform-new-target@7.29.7': + resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': - resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': + resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.28.6': - resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + '@babel/plugin-transform-numeric-separator@7.29.7': + resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.6': - resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + '@babel/plugin-transform-object-rest-spread@7.29.7': + resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + '@babel/plugin-transform-object-super@7.29.7': + resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.28.6': - resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + '@babel/plugin-transform-optional-catch-binding@7.29.7': + resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.28.6': - resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + '@babel/plugin-transform-optional-chaining@7.29.7': + resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + '@babel/plugin-transform-parameters@7.29.7': + resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.28.6': - resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + '@babel/plugin-transform-private-methods@7.29.7': + resolution: {integrity: sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.28.6': - resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + '@babel/plugin-transform-private-property-in-object@7.29.7': + resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + '@babel/plugin-transform-property-literals@7.29.7': + resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-mutators@7.28.6': - resolution: {integrity: sha512-UWiHSMeYosC3DnG5Yerf0RtSDh8483sjNar26U460zVWpP+VDgQwleLEP6GaMBvS93L8gNFFy6RGt4OGa1JJcw==} + '@babel/plugin-transform-property-mutators@7.29.7': + resolution: {integrity: sha512-v5b8u/s0Z99HcKQBtPGDkTpxnuLE1DThOqmCRs29SS+HL2X6tZitXA1QxNeydhrkw6vBiBzvDxH3uwQd830urw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.29.0': - resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} + '@babel/plugin-transform-regenerator@7.29.7': + resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.28.6': - resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + '@babel/plugin-transform-regexp-modifiers@7.29.7': + resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + '@babel/plugin-transform-reserved-words@7.29.7': + resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + '@babel/plugin-transform-shorthand-properties@7.29.7': + resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.28.6': - resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + '@babel/plugin-transform-spread@7.29.7': + resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + '@babel/plugin-transform-sticky-regex@7.29.7': + resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + '@babel/plugin-transform-template-literals@7.29.7': + resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + '@babel/plugin-transform-typeof-symbol@7.29.7': + resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + '@babel/plugin-transform-unicode-escapes@7.29.7': + resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.28.6': - resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + '@babel/plugin-transform-unicode-property-regex@7.29.7': + resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + '@babel/plugin-transform-unicode-regex@7.29.7': + resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.28.6': - resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + '@babel/plugin-transform-unicode-sets-regex@7.29.7': + resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.29.2': - resolution: {integrity: sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==} + '@babel/preset-env@7.29.7': + resolution: {integrity: sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -596,14 +657,26 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -618,16 +691,16 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.5.5': - resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + '@eslint/eslintrc@3.3.6': + resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@10.0.1': @@ -643,8 +716,8 @@ packages: resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.1': - resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@humanfs/core@0.19.2': @@ -686,8 +759,8 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@rollup/plugin-babel@7.0.0': - resolution: {integrity: sha512-NS2+P7v80N3MQqehZEjgpaFb9UyX3URNMW/zvoECKGo4PY4DvJfQusTI7BX/Ks+CPvtTfk3TqcR6S9VYBi/C+A==} + '@rollup/plugin-babel@7.1.0': + resolution: {integrity: sha512-h9Y+xYha6p4wKO+FwdiPIkE+eIYCm8MzZPpX1iARIoFBnmKP9CnpT1p9dDf/DTFm6fyN8PmuLyRI5qZgchnitw==} engines: {node: '>=14.0.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -699,8 +772,8 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@29.0.2': - resolution: {integrity: sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==} + '@rollup/plugin-commonjs@29.0.3': + resolution: {integrity: sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -748,141 +821,141 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.60.2': - resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.2': - resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.2': - resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.2': - resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.2': - resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.2': - resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': - resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.2': - resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.2': - resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.2': - resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.2': - resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.2': - resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.2': - resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.2': - resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.2': - resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.2': - resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.2': - resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.2': - resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.2': - resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.2': - resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.2': - resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.2': - resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.2': - resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.2': - resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.2': - resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} cpu: [x64] os: [win32] @@ -892,69 +965,72 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.2 + '@typescript-eslint/parser': ^8.65.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -1004,12 +1080,12 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.18: + resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} - engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} browserslist@4.28.2: resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} @@ -1102,8 +1178,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.1: - resolution: {integrity: sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==} + eslint@10.8.0: + resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1192,8 +1268,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@17.5.0: - resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} engines: {node: '>=18'} hasown@2.0.3: @@ -1240,8 +1316,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true jsesc@3.1.0: @@ -1347,8 +1423,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.3: - resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true @@ -1389,8 +1465,8 @@ packages: peerDependencies: rollup: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - rollup@4.60.2: - resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1522,6 +1598,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -1537,19 +1616,27 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.29.0': {} - '@babel/core@7.29.0': + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -1567,10 +1654,22 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.29.0 + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/helper-compilation-targets@7.28.6': dependencies: '@babel/compat-data': 7.29.0 @@ -1579,29 +1678,44 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3 @@ -1612,10 +1726,12 @@ snapshots: '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.28.5': + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -1626,546 +1742,574 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/types': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-wrap-function': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.28.6': + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helper-wrap-function@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helpers@7.29.2': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': + '@babel/parser@7.29.7': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/types': 7.29.7 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/template': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/template': 7.29.7 - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-property-mutators@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-property-mutators@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/preset-env@7.29.2(@babel/core@7.29.0)': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/preset-env@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/core': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7) + '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7) + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.29.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) core-js-compat: 3.49.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.28.6 '@babel/types': 7.29.0 esutils: 2.0.3 @@ -2176,6 +2320,12 @@ snapshots: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -2188,14 +2338,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.1)': + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@eslint-community/eslint-utils@4.9.1(eslint@10.8.0)': dependencies: - eslint: 10.2.1 + eslint: 10.8.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -2208,7 +2375,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.5': + '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 @@ -2216,7 +2383,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': + '@eslint/eslintrc@3.3.6': dependencies: ajv: 6.14.0 debug: 4.4.3 @@ -2224,19 +2391,19 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.0 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@10.0.1(eslint@10.2.1)': + '@eslint/js@10.0.1(eslint@10.8.0)': optionalDependencies: - eslint: 10.2.1 + eslint: 10.8.0 '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.1': + '@eslint/plugin-kit@0.7.2': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 @@ -2281,19 +2448,20 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@rollup/plugin-babel@7.0.0(@babel/core@7.29.0)(rollup@4.60.2)': + '@rollup/plugin-babel@7.1.0(@babel/core@7.29.7)(rollup@4.62.2)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.28.6 - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.3.0(rollup@4.62.2) + workerpool: 9.3.4 optionalDependencies: - rollup: 4.60.2 + rollup: 4.62.2 transitivePeerDependencies: - supports-color - '@rollup/plugin-commonjs@29.0.2(rollup@4.60.2)': + '@rollup/plugin-commonjs@29.0.3(rollup@4.62.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.3.0(rollup@4.62.2) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.4) @@ -2301,135 +2469,137 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.4 optionalDependencies: - rollup: 4.60.2 + rollup: 4.62.2 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.60.2)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.62.2)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.3.0(rollup@4.62.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.12 optionalDependencies: - rollup: 4.60.2 + rollup: 4.62.2 - '@rollup/plugin-terser@1.0.0(rollup@4.60.2)': + '@rollup/plugin-terser@1.0.0(rollup@4.62.2)': dependencies: serialize-javascript: 7.0.5 smob: 1.6.1 terser: 5.46.1 optionalDependencies: - rollup: 4.60.2 + rollup: 4.62.2 - '@rollup/plugin-typescript@12.3.0(rollup@4.60.2)(tslib@2.8.1)(typescript@4.9.5)': + '@rollup/plugin-typescript@12.3.0(rollup@4.62.2)(tslib@2.8.1)(typescript@4.9.5)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.3.0(rollup@4.62.2) resolve: 1.22.12 typescript: 4.9.5 optionalDependencies: - rollup: 4.60.2 + rollup: 4.62.2 tslib: 2.8.1 - '@rollup/pluginutils@5.3.0(rollup@4.60.2)': + '@rollup/pluginutils@5.3.0(rollup@4.62.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: - rollup: 4.60.2 + rollup: 4.62.2 - '@rollup/rollup-android-arm-eabi@4.60.2': + '@rollup/rollup-android-arm-eabi@4.62.2': optional: true - '@rollup/rollup-android-arm64@4.60.2': + '@rollup/rollup-android-arm64@4.62.2': optional: true - '@rollup/rollup-darwin-arm64@4.60.2': + '@rollup/rollup-darwin-arm64@4.62.2': optional: true - '@rollup/rollup-darwin-x64@4.60.2': + '@rollup/rollup-darwin-x64@4.62.2': optional: true - '@rollup/rollup-freebsd-arm64@4.60.2': + '@rollup/rollup-freebsd-arm64@4.62.2': optional: true - '@rollup/rollup-freebsd-x64@4.60.2': + '@rollup/rollup-freebsd-x64@4.62.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.2': + '@rollup/rollup-linux-arm-musleabihf@4.62.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.2': + '@rollup/rollup-linux-arm64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.2': + '@rollup/rollup-linux-arm64-musl@4.62.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.2': + '@rollup/rollup-linux-loong64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.2': + '@rollup/rollup-linux-loong64-musl@4.62.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.2': + '@rollup/rollup-linux-ppc64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.2': + '@rollup/rollup-linux-ppc64-musl@4.62.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.2': + '@rollup/rollup-linux-riscv64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.2': + '@rollup/rollup-linux-riscv64-musl@4.62.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.2': + '@rollup/rollup-linux-s390x-gnu@4.62.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.2': + '@rollup/rollup-linux-x64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-x64-musl@4.60.2': + '@rollup/rollup-linux-x64-musl@4.62.2': optional: true - '@rollup/rollup-openbsd-x64@4.60.2': + '@rollup/rollup-openbsd-x64@4.62.2': optional: true - '@rollup/rollup-openharmony-arm64@4.60.2': + '@rollup/rollup-openharmony-arm64@4.62.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.2': + '@rollup/rollup-win32-arm64-msvc@4.62.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.2': + '@rollup/rollup-win32-ia32-msvc@4.62.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.2': + '@rollup/rollup-win32-x64-gnu@4.62.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.2': + '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true '@types/esrecurse@4.3.1': {} '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/json-schema@7.0.15': {} '@types/resolve@1.20.2': {} - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@4.9.5))(eslint@10.2.1)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@4.9.5))(eslint@10.8.0)(typescript@4.9.5)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.1)(typescript@4.9.5) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.1 + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0)(typescript@4.9.5) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 10.8.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@4.9.5) @@ -2437,56 +2607,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.1)(typescript@4.9.5)': + '@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 - eslint: 10.2.1 + eslint: 10.8.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@4.9.5)': + '@typescript-eslint/project-service@8.65.0(typescript@4.9.5)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@4.9.5) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@4.9.5) + '@typescript-eslint/types': 8.65.0 debug: 4.4.3 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.65.0': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@4.9.5)': + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@4.9.5)': dependencies: typescript: 4.9.5 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1)(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@4.9.5) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.1)(typescript@4.9.5) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@4.9.5) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@4.9.5) debug: 4.4.3 - eslint: 10.2.1 + eslint: 10.8.0 ts-api-utils: 2.5.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/types@8.65.0': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@8.65.0(typescript@4.9.5)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@4.9.5) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@4.9.5) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/project-service': 8.65.0(typescript@4.9.5) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@4.9.5) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 @@ -2496,20 +2666,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.1)(typescript@4.9.5)': + '@typescript-eslint/utils@8.65.0(eslint@10.8.0)(typescript@4.9.5)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@4.9.5) - eslint: 10.2.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@4.9.5) + eslint: 10.8.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.2': + '@typescript-eslint/visitor-keys@8.65.0': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.65.0 eslint-visitor-keys: 5.0.1 acorn-jsx@5.3.2(acorn@8.16.0): @@ -2529,27 +2699,27 @@ snapshots: array-find-index@1.0.2: {} - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) transitivePeerDependencies: - supports-color @@ -2559,12 +2729,12 @@ snapshots: baseline-browser-mapping@2.10.20: {} - brace-expansion@1.1.14: + brace-expansion@1.1.18: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.5: + brace-expansion@5.0.8: dependencies: balanced-match: 4.0.4 @@ -2635,14 +2805,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.1: + eslint@10.8.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.5.5 + '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.1 + '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -2735,7 +2905,7 @@ snapshots: globals@14.0.0: {} - globals@17.5.0: {} + globals@17.7.0: {} hasown@2.0.3: dependencies: @@ -2772,7 +2942,7 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@4.1.1: + js-yaml@4.3.0: dependencies: argparse: 2.0.1 @@ -2813,11 +2983,11 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.8 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.18 moment@2.30.1: {} @@ -2862,7 +3032,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.8.3: {} + prettier@3.9.6: {} punycode@2.3.1: {} @@ -2896,7 +3066,7 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rollup-plugin-license@3.7.1(picomatch@4.0.4)(rollup@4.60.2): + rollup-plugin-license@3.7.1(picomatch@4.0.4)(rollup@4.62.2): dependencies: commenting: 1.1.0 fdir: 6.5.0(picomatch@4.0.4) @@ -2904,41 +3074,41 @@ snapshots: magic-string: 0.30.21 moment: 2.30.1 package-name-regex: 2.0.6 - rollup: 4.60.2 + rollup: 4.62.2 spdx-expression-validate: 2.0.0 spdx-satisfies: 5.0.1 transitivePeerDependencies: - picomatch - rollup@4.60.2: + rollup@4.62.2: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.2 - '@rollup/rollup-android-arm64': 4.60.2 - '@rollup/rollup-darwin-arm64': 4.60.2 - '@rollup/rollup-darwin-x64': 4.60.2 - '@rollup/rollup-freebsd-arm64': 4.60.2 - '@rollup/rollup-freebsd-x64': 4.60.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 - '@rollup/rollup-linux-arm-musleabihf': 4.60.2 - '@rollup/rollup-linux-arm64-gnu': 4.60.2 - '@rollup/rollup-linux-arm64-musl': 4.60.2 - '@rollup/rollup-linux-loong64-gnu': 4.60.2 - '@rollup/rollup-linux-loong64-musl': 4.60.2 - '@rollup/rollup-linux-ppc64-gnu': 4.60.2 - '@rollup/rollup-linux-ppc64-musl': 4.60.2 - '@rollup/rollup-linux-riscv64-gnu': 4.60.2 - '@rollup/rollup-linux-riscv64-musl': 4.60.2 - '@rollup/rollup-linux-s390x-gnu': 4.60.2 - '@rollup/rollup-linux-x64-gnu': 4.60.2 - '@rollup/rollup-linux-x64-musl': 4.60.2 - '@rollup/rollup-openbsd-x64': 4.60.2 - '@rollup/rollup-openharmony-arm64': 4.60.2 - '@rollup/rollup-win32-arm64-msvc': 4.60.2 - '@rollup/rollup-win32-ia32-msvc': 4.60.2 - '@rollup/rollup-win32-x64-gnu': 4.60.2 - '@rollup/rollup-win32-x64-msvc': 4.60.2 + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 semver@6.3.1: {} @@ -3048,6 +3218,8 @@ snapshots: word-wrap@1.2.5: {} + workerpool@9.3.4: {} + yallist@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/rollup.config.mjs b/rollup.config.mjs index fb7d37d..6953a49 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -291,8 +291,8 @@ const onwarn = (warning, defaultHandler) => { return; } defaultHandler(warning); -}; -const TEXT_COLOR_YELLOW = "\x1b[33m"; +}; +const TEXT_COLOR_YELLOW = "\x1b[33m"; const TEXT_COLOR_RESET = "\x1b[0m"; const terserConfig = (preamble) => @@ -377,21 +377,21 @@ export default (commandLineArgs) => { const appFilter = getAppFilter(commandLineArgs); // アプリ別スクリプトを展開: { appId, script, srcDir, outDir } - const allScripts = []; + const allScripts = []; let hasDeprecatedBuildFalse = false; if (config.scripts) { for (const [appId, scripts] of Object.entries(config.scripts)) { if (appFilter && appId !== appFilter) continue; for (const script of scripts) { - const isBuildEnabled = script.build !== false; - - if (!forceBuildAll && !isBuildEnabled) { - continue; - } - - if (forceBuildAll && !isBuildEnabled) { - hasDeprecatedBuildFalse = true; + const isBuildEnabled = script.build !== false; + + if (!forceBuildAll && !isBuildEnabled) { + continue; + } + + if (forceBuildAll && !isBuildEnabled) { + hasDeprecatedBuildFalse = true; } allScripts.push({ @@ -409,14 +409,14 @@ export default (commandLineArgs) => { // common スクリプト(アプリ非依存) if (config.common && !appFilter) { for (const script of config.common) { - const isBuildEnabled = script.build !== false; - - if (!forceBuildAll && !isBuildEnabled) { - continue; - } - - if (forceBuildAll && !isBuildEnabled) { - hasDeprecatedBuildFalse = true; + const isBuildEnabled = script.build !== false; + + if (!forceBuildAll && !isBuildEnabled) { + continue; + } + + if (forceBuildAll && !isBuildEnabled) { + hasDeprecatedBuildFalse = true; } allScripts.push({ @@ -433,10 +433,12 @@ export default (commandLineArgs) => { if (allScripts.length === 0) { console.error("ビルドするスクリプトがありません。"); process.exit(1); - } - - if (forceBuildAll && hasDeprecatedBuildFalse) { - console.warn(`${TEXT_COLOR_YELLOW}注意: es.config.mjs の build:false は非推奨です。build -a 実行時はビルド対象の判定を無視して全件をビルドします。${TEXT_COLOR_RESET}`); + } + + if (forceBuildAll && hasDeprecatedBuildFalse) { + console.warn( + `${TEXT_COLOR_YELLOW}注意: es.config.mjs の build:false は非推奨です。build -a 実行時はビルド対象の判定を無視して全件をビルドします。${TEXT_COLOR_RESET}` + ); } const previousBuildHashes = loadBuildHashes(); @@ -499,4 +501,3 @@ export default (commandLineArgs) => { return entries; }; - diff --git a/src/types/es.config.d.ts b/src/types/es.config.d.ts index 7550702..607ed4c 100644 --- a/src/types/es.config.d.ts +++ b/src/types/es.config.d.ts @@ -12,4 +12,4 @@ export interface ScriptConfig { export interface EsConfig { scripts: Record; common?: ScriptConfig[]; -} +} From 6cf756ef165946042a94b58309b5659213693248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E9=9B=AA?= <47615501+YukiWorks432@users.noreply.github.com> Date: Sat, 1 Aug 2026 20:10:16 +0900 Subject: [PATCH 5/7] =?UTF-8?q?ci:=20Node.js=2022/24=20=E3=81=AE=E8=87=AA?= =?UTF-8?q?=E5=8B=95=E6=A4=9C=E8=A8=BC=E3=82=92=E8=BF=BD=E5=8A=A0=20(#50)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #46 Node.js 22/24 の継続的インテグレーションと運用手順を追加しました。 --- .github/workflows/ci.yml | 65 +++++++++++++++++++++++++++++++++++ docs/repository-operations.md | 39 +++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..be66318 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,65 @@ +name: CI + +on: + pull_request: + branches: + - develop + push: + branches: + - develop + +permissions: + contents: read + +concurrency: + group: ci-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + verify: + name: Node.js ${{ matrix.node-version }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node-version: + - 22 + - 24 + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + with: + version: 11.17.0 + run_install: false + + - name: Set up Node.js + uses: actions/setup-node@v7 + with: + node-version: ${{ matrix.node-version }} + cache: pnpm + + - name: Verify tool versions + run: | + test "$(pnpm --version)" = "11.17.0" + node --version + + - name: Install dependencies + run: pnpm install --frozen-lockfile --strict-peer-dependencies + + - name: Lint + run: pnpm lint + + - name: Test + run: pnpm test + + - name: Build all applications + run: pnpm build --all + + - name: Check formatting + run: pnpm exec prettier --check . + + - name: Check diff + run: git diff --check diff --git a/docs/repository-operations.md b/docs/repository-operations.md index 3ed08c3..932a968 100644 --- a/docs/repository-operations.md +++ b/docs/repository-operations.md @@ -22,6 +22,45 @@ feature/ -> develop -> main `develop` から `main` への Pull Request を squash merge すると、リリース workflow が作成する version 更新コミットを `develop` に安全に早送りできない場合があります。 そのため、`develop` から `main` へは merge commit を使います。 +## 継続的インテグレーション + +`.github/workflows/ci.yml` は、`develop` を対象とする Pull Request と、`develop` への更新で起動します。 +Dependabot が作成した Pull Request も、通常の Pull Request と同じ検証対象です。 + +Node.js の行列ごとに次の検証を実行します。 + +- Node.js 22 と 24 +- pnpm `11.17.0` の確認 +- `pnpm install --frozen-lockfile --strict-peer-dependencies` +- `pnpm lint` +- `pnpm test` +- `pnpm build --all` +- `pnpm exec prettier --check .` +- `git diff --check` + +`package.json` の `packageManager` と同じ pnpm の版をワークフローに明記し、実行時にも版を確認します。 +ロックファイルを固定したインストールと厳格なピア依存関係検査を、キャッシュによって省略することはありません。 +同じ Pull Request または `develop` 更新に対する古い実行は、新しい実行を開始すると中止します。 +ワークフローの権限は、ソース取得に必要な `contents: read` だけを付与しています。 + +行列の検証名は次のとおりです。 + +- `CI / Node.js 22` +- `CI / Node.js 24` + +After Effects の実機試験と `pnpm audit` は自動化対象外です。これらは Issue #45 で確定した手動検証として、CI の合否に含めません。 + +### 必須チェックを設定する手順 + +配布用リポジトリで `develop` への取り込み前に CI を必須化する場合は、GitHub のリポジトリ設定で次のように設定します。 + +1. **Settings > Branches > Branch protection rules** から `develop` を対象にした規則を作成または編集する。 +2. Pull Request を必須にし、**Require status checks to pass before merging** を有効にする。 +3. 必須チェックとして `CI / Node.js 22` と `CI / Node.js 24` を追加する。`CI` だけではなく、両方の行列チェックを指定する。 +4. 保存後、`develop` を対象にした Pull Request で両方のチェックが成功することを確認する。 + +ブランチ保護をまだ設定しない場合も、上記のチェック名を変更せずに運用します。ワークフローのジョブ名を変更した場合は、ブランチ保護側の必須チェックも同時に更新してください。 + ## リリース リリース自動化は `.github/workflows/release.yml` で管理します。 From 69ad20f4602449b2689b9c0a2c13f2b4ec339f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E9=9B=AA?= <47615501+YukiWorks432@users.noreply.github.com> Date: Sat, 1 Aug 2026 22:44:01 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=E3=82=B9=E3=82=AF=E3=83=AA?= =?UTF-8?q?=E3=83=97=E3=83=88=E8=AA=AC=E6=98=8E=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=82=92=E8=A6=8F=E6=A0=BC=E5=8C=96=20(#51)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: スクリプト説明コメントを規格化 * fix: 完了報告に候補名を明記 * fix: 公式確認手順とScriptUI例を整合 --- .agents/instructions/extendscript.md | 7 +++ .agents/skills/add-script/SKILL.md | 30 +++++++++- README.md | 15 +++++ docs/guides/for-beginners.md | 18 +++++- docs/guides/getting-started.md | 17 ++++++ docs/project-overview.md | 33 ++++++++++- docs/script-comment-block.md | 83 ++++++++++++++++++++++++++++ scripts/addApp.mjs | 13 ++++- scripts/newScript.mjs | 23 ++++++-- src/aeft/example/index.ts | 13 +++++ src/ilst/example/index.ts | 13 +++++ src/phxs/example/index.ts | 13 +++++ 12 files changed, 264 insertions(+), 14 deletions(-) create mode 100644 docs/script-comment-block.md diff --git a/.agents/instructions/extendscript.md b/.agents/instructions/extendscript.md index 9974570..dbeb2b3 100644 --- a/.agents/instructions/extendscript.md +++ b/.agents/instructions/extendscript.md @@ -30,6 +30,13 @@ description: "ExtendScript (ES3) 向け TypeScript コーディングルール すべてのスクリプトの `index.ts` で、先頭に `import "../../init"` を記述すること。 これによりポリフィルが読み込まれる。 +## スクリプト説明コメント + +`src/**/index.ts` の先頭、`import` より前には、 +[スクリプト説明コメントブロック](../../docs/script-comment-block.md) を配置する。 +スクリプトの対象、得られる結果、利用者向け手順が変わる場合は、説明コメントも同時に更新する。 +内部実装だけの変更では更新を必須にしない。 + ## import パス スクリプトからの相対 import パスは以下の通り: diff --git a/.agents/skills/add-script/SKILL.md b/.agents/skills/add-script/SKILL.md index 9ed5dbb..7ad129f 100644 --- a/.agents/skills/add-script/SKILL.md +++ b/.agents/skills/add-script/SKILL.md @@ -9,6 +9,9 @@ argument-hint: "対象アプリ(After Effects / Illustrator / Photoshop)、 プロジェクトのスクリプト生成ツールを使って新規スクリプトを作成し、用途をコメントとして記録する。 ユーザーの選択に応じてスケルトンで止めるか、実装まで進める。 +説明コメントの形式は [docs/script-comment-block.md](../../../docs/script-comment-block.md) を正本とする。 +このスキルでは、生成後に用途から説明、処理手順、Material Symbols の候補を完成させる。 + ## When to Use - 「スクリプトを作りたい」「新しいスクリプトを追加して」と言ったとき @@ -121,12 +124,14 @@ pnpm new -- --app= --name= --license --ui=scriptui ### 5. 用途(purpose)をファイルに記録する -`src///index.ts` を開き、ファイル先頭に以下のコメントブロックを追加する: +`src///index.ts` を開き、ファイル先頭の雛形を用途に合わせて完成させる。 +コメントブロックは `import` より前へ配置し、次の5項目をこの順序で記載する: ```typescript /** * @script - * @app (After Effects / Illustrator / Photoshop) + * @app + * @material-symbols <候補1>, <候補2>, <候補3> * @description * <ユーザーが述べた用途を具体的に記述する> * @@ -136,7 +141,22 @@ pnpm new -- --app= --name= --license --ui=scriptui */ ``` -`@workflow` はユーザーの `purpose` から推測して記述する。不明な場合は `TODO` として残す。 +`@script` はディレクトリ名および `es.config.mjs` の設定名と一致させ、`@app` はアプリIDだけを記載する。 +`@description` は対象・操作・結果を含む1〜3文、`@workflow` は利用者から見た操作と結果を1〜5段階で記述する。 +内部関数やAPI呼び出しなどの実装詳細は記載しない。 + +`@material-symbols` には、[Google Fonts の公式アイコン一覧](https://fonts.google.com/icons) で実在を確認した +新しい Material Symbols を、意味の異なる3件だけ小文字スネークケースで記載する。 +候補は重複させず、アルファベット順に並べ、カンマと半角空白で区切る。 +Google Fonts を参照できない場合は、[Google の material-design-icons リポジトリ](https://github.com/google/material-design-icons) の +`symbols` または `update/current_versions.json` で確認する。両方の確認先を参照できない場合だけ、次の `TODO` を残して作成を続行する: + +```typescript + * @material-symbols TODO: 公式一覧を確認し、候補を3件カンマ区切りで記載 +``` + +候補について利用者へ確認せず、用途から自動で選ぶ。Google Fonts と公式リポジトリの両方を参照できない場合だけ `TODO` を残す。 +`@workflow` も用途が不明な場合は `TODO` を残す。 **ScriptUI の場合**: 生成済みテンプレートが `entryUI` と `__ES_THIS__` を使っていることを確認する: @@ -157,12 +177,15 @@ entryUI("", __ES_THIS__, (win) => { ### 6. 作成したファイルを確認する 作成した `src///index.ts` を読み、生成結果とコメントが意図通りか確認する。 +スケルトンのみを作成する場合でも、聞き取った用途から `@description` と `@workflow` を完成させる。 +実装まで進める場合は、実装後の対象・結果・利用者向け手順に合わせてコメントを再確認する。 ### 7a. スケルトンモード — ここで完了 ユーザーが「スケルトンのみ」を選んだ場合: - ファイルパス `src///index.ts` をリンク付きでユーザーに報告する +- `@material-symbols` に記載した候補名を完了報告へ示す。公式一覧を確認できず `TODO` を残した場合は、その `TODO` も示す - 実装する際のヒント(どの関数を使うか)を簡単に案内する - **実装には着手しない** @@ -176,6 +199,7 @@ entryUI("", __ES_THIS__, (win) => { 4. エラーがなければ `pnpm build -- /` を実行してビルドする 5. エラーがあればステップ 3 に戻って修正する 6. ビルド成功後、実装した内容を簡潔に日本語で報告する +7. 完了報告に `@material-symbols` へ記載した候補名を示す。公式一覧を確認できず `TODO` を残した場合は、その `TODO` も示す --- diff --git a/README.md b/README.md index 1c1cb02..ab659a3 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,9 @@ pnpm new -- --app=aeft --name=MyPanel --license --ui=scriptui pnpm new ``` +生成される説明コメントの規格と、生成後に `TODO` を完成させる手順は +[スクリプト説明コメントブロック](docs/script-comment-block.md) を参照してください。 + ### es.config.mjs ```mjs @@ -109,6 +112,17 @@ export default { ```ts // src/aeft/example/index.ts +/** + * @script example + * @app aeft + * @material-symbols TODO: 公式一覧を確認し、候補を3件カンマ区切りで記載 + * @description + * TODO: 対象・操作・得られる結果を1〜3文で記載 + * + * @workflow + * 1. TODO: 利用者から見た操作と結果を記載 + */ + import "../../init"; import { entry } from "../../lib/lib"; @@ -164,6 +178,7 @@ pnpm watch ## ドキュメント - [プロジェクト概要](docs/project-overview.md) +- [スクリプト説明コメントブロック](docs/script-comment-block.md) - [ポリフィル](docs/polyfills.md) - [はじめに](docs/guides/getting-started.md) - [リリース手順](docs/release-process.md) diff --git a/docs/guides/for-beginners.md b/docs/guides/for-beginners.md index cc2bb68..d84204d 100644 --- a/docs/guides/for-beginners.md +++ b/docs/guides/for-beginners.md @@ -306,7 +306,10 @@ Copilot が自律的に以下をすべてやってくれます: 1. 足りない情報(アプリ・スクリプト名など)を質問してくれる 2. `pnpm new` でファイルを生成する -3. スクリプトの実装まで書いてくれる +3. 用途から説明コメントと Material Symbols 候補を記載する +4. スクリプトの実装まで書いてくれる + +説明コメントの項目と候補名の選び方は、[スクリプト説明コメントブロック](../script-comment-block.md) に従います。 > **Agent モードとは**: Copilot がファイル操作やターミナルコマンドを自律的に実行するモードです。チャットモードのドロップダウンから「Agent」を選んでください。 @@ -353,6 +356,19 @@ n Copilot が以下のようなコードを `src/aeft/WiggleApplier/index.ts` に生成します: ```typescript +/** + * @script WiggleApplier + * @app aeft + * @material-symbols animation, layers, tune + * @description + * 選択中のレイヤーを対象に、Position へウィグルエクスプレッションを適用する。 + * + * @workflow + * 1. コンポジションでレイヤーを選択する + * 2. スクリプトを実行する + * 3. 選択レイヤーの Position にウィグルが適用されたことを確認する + */ + // shimを実行するために、initのimportが必須です。 import "../../init"; diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index d7d9a18..900550b 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -40,10 +40,26 @@ pnpm new -- --app=aeft --name=MyPanel --license --ui=scriptui - `src/aeft/MyFirstScript/index.ts`(テンプレートコード) - `es.config.mjs` にビルドエントリを追加 +生成されたコメントの `@description`、`@workflow`、`@material-symbols` は、 +[スクリプト説明コメントブロック](../script-comment-block.md) の規則に沿って用途へ置き換えます。 + ### 2. コードを書く ```ts // src/aeft/MyFirstScript/index.ts +/** + * @script MyFirstScript + * @app aeft + * @material-symbols layers, list, visibility + * @description + * 選択したレイヤーの名前を取得し、結果をログへ出力する。 + * + * @workflow + * 1. コンポジションでレイヤーを選択する + * 2. スクリプトを実行する + * 3. 選択レイヤーの名前を確認する + */ + import "../../init"; import { entry } from "../../lib/lib"; @@ -178,6 +194,7 @@ declare class SomeUndefinedClass { ## 次のステップ - `docs/project-overview.md` でプロジェクト構成の詳細を確認できます +- `docs/script-comment-block.md` でスクリプト説明コメントの規則を確認できます - `docs/polyfills.md` で使用可能な ES6+ 機能を確認できます - `es.config.mjs` でスクリプトのビルド設定を調整できます diff --git a/docs/project-overview.md b/docs/project-overview.md index 0564bab..7e61c77 100644 --- a/docs/project-overview.md +++ b/docs/project-overview.md @@ -126,11 +126,25 @@ pnpm new 2. `src/{app}/MyScript/index.ts` をテンプレートから生成 3. Prettier で `es.config.mjs` を整形 +生成直後の説明コメント雛形と、用途から `TODO` を完成させる規則は +[スクリプト説明コメントブロック](script-comment-block.md) に定める。 + ### テンプレート 生成される `index.ts` は以下の構造: ```ts +/** + * @script MyScript + * @app aeft + * @material-symbols TODO: 公式一覧を確認し、候補を3件カンマ区切りで記載 + * @description + * TODO: 対象・操作・得られる結果を1〜3文で記載 + * + * @workflow + * 1. TODO: 利用者から見た操作と結果を記載 + */ + import "../../init"; import { entry } from "../../lib/lib"; @@ -142,14 +156,25 @@ entry("MyScript", () => { `--ui=scriptui` を指定した場合は、以下のように `entryUI` と `__ES_THIS__` を使う: ```ts +/** + * @script MyPanel + * @app aeft + * @material-symbols TODO: 公式一覧を確認し、候補を3件カンマ区切りで記載 + * @description + * TODO: 対象・操作・得られる結果を1〜3文で記載 + * + * @workflow + * 1. TODO: 利用者から見た操作と結果を記載 + */ + import "../../init"; import { entry, entryUI } from "../../lib/lib"; -entryUI("MyScript", __ES_THIS__, (win) => { +entryUI("MyPanel", __ES_THIS__, (win) => { const runButton = win.add("button", undefined, "実行"); runButton.onClick = () => { - entry("MyScript", () => { - // TODO: Implement MyScript + entry("MyPanel", () => { + // TODO: Implement MyPanel }); }; }); @@ -228,6 +253,8 @@ pnpm add-app -- --app=idsn - `es.config.mjs` に `scripts.{app}` キーを追加し、`example` を `build: true`, `license: true` で登録 - `package.json` に `build:` コマンドを追加 +`example/index.ts` の先頭には、[スクリプト説明コメントブロック](script-comment-block.md) の `TODO` 雛形も生成される。 + 既存の `src/{appId}` または `es.config.mjs` の `scripts.{appId}` と衝突する場合は、ファイルを生成せずに停止する。 ## 開発コマンド diff --git a/docs/script-comment-block.md b/docs/script-comment-block.md new file mode 100644 index 0000000..f9384e5 --- /dev/null +++ b/docs/script-comment-block.md @@ -0,0 +1,83 @@ +# スクリプト説明コメントブロック + +スクリプトの目的、利用者から見た操作手順、ランチャーで使える +Material Symbols の候補を、スクリプト本体の先頭へ記録する設計メモです。 +機械処理の契約にはせず、特定のランチャーにも依存させません。 + +## 基本形 + +`src/**/index.ts` の先頭に、`import` より前へ次の5項目をこの順序で記載します。 + +```typescript +/** + * @script DuplicateSelection + * @app ilst + * @material-symbols content_copy, control_point_duplicate, select_all + * @description + * 選択中のオブジェクトを指定数だけ複製し、複製結果を同じ文書内へ追加する。 + * + * @workflow + * 1. 処理対象のオブジェクトを選択する + * 2. 複製数を入力する + * 3. 指定数の複製を作成する + */ +``` + +### 共通規則 + +- `@script`、`@app`、`@material-symbols`、`@description`、`@workflow` の5項目を、この順序ですべて記載する。 +- コメントブロックは `src/**/index.ts` の先頭、`import` より前へ配置する。 +- `@script` はスクリプトのディレクトリ名および `es.config.mjs` の設定上の名前と完全一致させる。 +- `@app` はアプリのディレクトリIDと完全一致させる。表示名は併記しない。 +- このリポジトリでは日本語を既定とするが、利用者の主要言語による記述も許容する。 +- スクリプトの対象、結果、利用者向け手順が変わる変更では、説明コメントも同時に更新する。内部実装だけの変更では更新を必須にしない。 + +## `@description` + +- 対象、操作、得られる結果を含む1〜3文で記述する。 +- 詳細な処理手順は `@workflow` に分離する。 +- 重要な制約や破壊的な変更がある場合は説明へ含める。 + +## `@workflow` + +- 利用者から見た操作と結果を1〜5段階で記述する。 +- 内部関数、API呼び出し、配列処理などの実装詳細は記載しない。 +- スケルトンのみを作成する場合も、聞き取った用途から完成させる。用途が不明な場合は `TODO` を残す。 + +## Material Symbols 候補 + +- 新しい Material Symbols のみを対象とし、従来の Material Icons は混在させない。 +- 公式一覧に実在する、意味の異なる3件を必ず記載する。 +- 同一候補の重複は禁止する。 +- 公式の小文字スネークケース名をそのまま使用する。 +- 理由と優先順位は記載しない。 +- 暗黙の優先順位を避けるため、候補名をアルファベット順に並べる。 +- 3件を1行にまとめ、カンマと半角空白で区切る。 +- スタイル、塗り、太さ、コードポイント、URLは記載しない。 +- [Google Fonts の公式アイコン一覧](https://fonts.google.com/icons) を第一確認先とする。 +- Google Fonts を参照できない場合は、[Google の material-design-icons リポジトリ](https://github.com/google/material-design-icons) の `symbols` と `update/current_versions.json` で確認する。 +- 両方へ接続できず実在確認ができない場合もスクリプト作成は続行し、次の `TODO` を残す。 + +```typescript + * @material-symbols TODO: 公式一覧を確認し、候補を3件カンマ区切りで記載 +``` + +アイコン画像やフォントはリポジトリへ同梱しません。KBar は用途例として文書に挙げられますが、KBar 固有の設定や画像生成は扱いません。 + +## 生成直後の雛形 + +`pnpm new` と `pnpm add-app` は、用途がまだ確定していないため、次の雛形を生成します。 +作成スキルを使う場合は、生成後に用途から `@description`、`@workflow`、`@material-symbols` の `TODO` を完成させます。 + +```typescript +/** + * @script MyScript + * @app aeft + * @material-symbols TODO: 公式一覧を確認し、候補を3件カンマ区切りで記載 + * @description + * TODO: 対象・操作・得られる結果を1〜3文で記載 + * + * @workflow + * 1. TODO: 利用者から見た操作と結果を記載 + */ +``` diff --git a/scripts/addApp.mjs b/scripts/addApp.mjs index 09463b9..782e063 100644 --- a/scripts/addApp.mjs +++ b/scripts/addApp.mjs @@ -27,6 +27,17 @@ const EXAMPLE_SCRIPT = { license: true, }; +const createScriptCommentBlock = (appId, name) => `/** + * @script ${name} + * @app ${appId} + * @material-symbols TODO: 公式一覧を確認し、候補を3件カンマ区切りで記載 + * @description + * TODO: 対象・操作・得られる結果を1〜3文で記載 + * + * @workflow + * 1. TODO: 利用者から見た操作と結果を記載 + */`; + // types-for-adobe のアプリID → ディレクトリ名マッピング const APP_TYPES_MAP = { aeft: { @@ -374,7 +385,7 @@ async function scaffold(appId) { await mkdir(exampleDir, { recursive: true }); await writeFile( path.resolve(exampleDir, "index.ts"), - `import "../../init";\nimport { entry } from "../../lib/lib";\n\nentry("example", () => {\n // TODO: Implement example\n});\n`, + `${createScriptCommentBlock(appId, EXAMPLE_SCRIPT.name)}\n\nimport "../../init";\nimport { entry } from "../../lib/lib";\n\nentry("example", () => {\n // TODO: Implement example\n});\n`, { encoding: "utf8", flag: "wx" } ); diff --git a/scripts/newScript.mjs b/scripts/newScript.mjs index 5b705e6..fdb42f0 100644 --- a/scripts/newScript.mjs +++ b/scripts/newScript.mjs @@ -218,8 +218,19 @@ async function updateScriptConfig(appId, newScript) { await writeFile(ES_CONFIG_PATH, newConfig, { encoding: "utf8" }); } -const createIndexTsTemplate = (name) => - `/** @description Explain script */ +const createScriptCommentBlock = (appId, name) => `/** + * @script ${name} + * @app ${appId} + * @material-symbols TODO: 公式一覧を確認し、候補を3件カンマ区切りで記載 + * @description + * TODO: 対象・操作・得られる結果を1〜3文で記載 + * + * @workflow + * 1. TODO: 利用者から見た操作と結果を記載 + */`; + +const createIndexTsTemplate = (appId, name) => + `${createScriptCommentBlock(appId, name)} import "../../init"; import { entry } from "../../lib/lib"; @@ -229,8 +240,8 @@ entry("${name}", () => { }); `; -const createScriptUiIndexTsTemplate = (name) => - `/** @description Build ScriptUI panel */ +const createScriptUiIndexTsTemplate = (appId, name) => + `${createScriptCommentBlock(appId, name)} import "../../init"; import { entry, entryUI } from "../../lib/lib"; @@ -260,8 +271,8 @@ async function createScriptTemplate(appId, name, uiType) { await mkdir(scriptDir, { recursive: true }); const indexContent = uiType === "scriptui" - ? createScriptUiIndexTsTemplate(name) - : createIndexTsTemplate(name); + ? createScriptUiIndexTsTemplate(appId, name) + : createIndexTsTemplate(appId, name); try { await writeFile(indexPath, indexContent, { encoding: "utf8", diff --git a/src/aeft/example/index.ts b/src/aeft/example/index.ts index a862ef2..c59a0ba 100644 --- a/src/aeft/example/index.ts +++ b/src/aeft/example/index.ts @@ -1,3 +1,16 @@ +/** + * @script example + * @app aeft + * @material-symbols analytics, layers, visibility + * @description + * 選択中のレイヤーを対象に名前と不透明度を集計し、結果をダイアログへ表示する。 + * + * @workflow + * 1. コンポジションでレイヤーを選択する + * 2. スクリプトを実行する + * 3. 選択レイヤーの名前、数、不透明度の合計と平均を確認する + */ + // shimを実行するために、initのimportが必須です。 import "../../init"; diff --git a/src/ilst/example/index.ts b/src/ilst/example/index.ts index 4af8004..23eb9af 100644 --- a/src/ilst/example/index.ts +++ b/src/ilst/example/index.ts @@ -1,3 +1,16 @@ +/** + * @script example + * @app ilst + * @material-symbols category, format_shapes, select_all + * @description + * 選択中のオブジェクトの名前または種類を一覧化し、結果をダイアログへ表示する。 + * + * @workflow + * 1. ドキュメント上のオブジェクトを選択する + * 2. スクリプトを実行する + * 3. 選択したオブジェクトの名前または種類を確認する + */ + import "../../init"; import { entry } from "../lib/lib"; diff --git a/src/phxs/example/index.ts b/src/phxs/example/index.ts index 3d9a433..08783fe 100644 --- a/src/phxs/example/index.ts +++ b/src/phxs/example/index.ts @@ -1,3 +1,16 @@ +/** + * @script example + * @app phxs + * @material-symbols info, layers, visibility + * @description + * アクティブなドキュメントのレイヤーを対象に、アクティブレイヤー名をダイアログへ表示する。 + * + * @workflow + * 1. ドキュメントを開き、レイヤーをアクティブにする + * 2. スクリプトを実行する + * 3. アクティブレイヤーの名前を確認する + */ + import "../../init"; import { entry } from "../lib/lib"; From 644d9115172f8109ae6acbb189714e046ceaa0a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E9=9B=AA?= <47615501+YukiWorks432@users.noreply.github.com> Date: Sat, 1 Aug 2026 23:59:51 +0900 Subject: [PATCH 7/7] =?UTF-8?q?build:=20=E8=A4=87=E6=95=B0=E3=82=B9?= =?UTF-8?q?=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88=E3=81=AE=E3=83=93=E3=83=AB?= =?UTF-8?q?=E3=83=89=E3=82=92=E7=AF=84=E5=9B=B2=E9=99=90=E5=AE=9A=E3=83=BB?= =?UTF-8?q?=E4=B8=8A=E9=99=90=E4=BB=98=E3=81=8D=E3=81=A7=E4=B8=A6=E5=88=97?= =?UTF-8?q?=E5=8C=96=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build: 複数スクリプトのビルドを並列化 * fix: ビルド経路と監視設定の整合性を修正 * fix: 依存解析とハッシュ保存を安全化 --- docs/guides/getting-started.md | 5 + docs/project-overview.md | 12 ++ package.json | 9 +- pnpm-lock.yaml | 51 ++----- rollup.config.mjs | 196 +++++++++++++++++------- scripts/addApp.mjs | 15 +- scripts/addApp.test.mjs | 11 ++ scripts/build.mjs | 207 ++++++++++++++++++++++++++ scripts/build.test.mjs | 126 ++++++++++++++++ scripts/buildDependencyScope.test.mjs | 136 +++++++++++++++++ scripts/buildOptions.mjs | 118 +++++++++++++++ scripts/buildOptions.test.mjs | 38 +++++ scripts/buildOutput.test.mjs | 134 +++++++++++++++++ scripts/buildScheduler.mjs | 56 +++++++ scripts/buildScheduler.test.mjs | 67 +++++++++ 15 files changed, 1080 insertions(+), 101 deletions(-) create mode 100644 scripts/addApp.test.mjs create mode 100644 scripts/build.mjs create mode 100644 scripts/build.test.mjs create mode 100644 scripts/buildDependencyScope.test.mjs create mode 100644 scripts/buildOptions.mjs create mode 100644 scripts/buildOptions.test.mjs create mode 100644 scripts/buildOutput.test.mjs create mode 100644 scripts/buildScheduler.mjs create mode 100644 scripts/buildScheduler.test.mjs diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index 900550b..53b8fcf 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -82,6 +82,11 @@ pnpm build 出力先: `dist/aeft/MyFirstScript/MyFirstScript.jsx` +複数スクリプトの単発ビルドは、既定で最大4件まで並列に実行されます。並列度を指定する +場合は `pnpm build --concurrency=2` のように指定してください。`--concurrency=1` では +スクリプト単位の依存範囲を保ったまま逐次実行できます。監視ビルド `pnpm watch` はこの +最適化の対象外です。 + ### 4. Adobe アプリで実行 - After Effects: `File > Scripts > Run Script File...` からビルド済み `.jsx` を選択します diff --git a/docs/project-overview.md b/docs/project-overview.md index 7e61c77..3ffa31f 100644 --- a/docs/project-overview.md +++ b/docs/project-overview.md @@ -275,6 +275,18 @@ pnpm add-app -- --app=idsn | `pnpm clean` | ビルドハッシュをクリーンアップ | | `pnpm test` | ビルド差分判定の回帰テスト | +`pnpm build`、`pnpm build --all`、`pnpm build --app=`、アプリ別のビルド別名は、 +対象スクリプトごとにTypeScriptの依存範囲を限定し、上限付きで並列実行します。既定の +並列度は `min(4, os.availableParallelism(), 対象件数)` です。利用できない実行環境では +`os.cpus().length` を使います。 + +並列度は `--concurrency=<正整数>` で上書きできます。`--concurrency=1` は並列実行だけを +無効にし、スクリプト単位のTypeScript範囲限定は維持します。0、負数、小数、数値以外、 +値なしはエラーとして終了します。 + +`pnpm watch` は今回の単発ビルド最適化の対象外です。従来どおりRollupの監視処理を使い、 +`--concurrency` の指定は監視ビルドには適用されません。 + ## 差分ビルドの判定 `pnpm build` は、各スクリプトの `index.ts` から相対 `import` / `export ... from` diff --git a/package.json b/package.json index c5d70b7..20678e2 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,10 @@ }, "packageManager": "pnpm@11.17.0", "scripts": { - "build": "rollup -c", - "build:aeft": "rollup -c --app=aeft", - "build:ilst": "rollup -c --app=ilst", - "build:phxs": "rollup -c --app=phxs", + "build": "node ./scripts/build.mjs", + "build:aeft": "node ./scripts/build.mjs --app=aeft", + "build:ilst": "node ./scripts/build.mjs --app=ilst", + "build:phxs": "node ./scripts/build.mjs --app=phxs", "clean": "node ./scripts/cleanBuildHashes.mjs", "test": "node --test", "watch": "rollup -c -w", @@ -34,6 +34,7 @@ "@babel/core": "^7.29.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", "@babel/plugin-transform-member-expression-literals": "^7.29.7", "@babel/plugin-transform-property-literals": "^7.29.7", "@babel/plugin-transform-property-mutators": "^7.29.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b0b8d1d..425346f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,9 @@ importers: '@babel/plugin-transform-class-properties': specifier: ^7.29.7 version: 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-classes': + specifier: ^7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-member-expression-literals': specifier: ^7.29.7 version: 7.29.7(@babel/core@7.29.7) @@ -130,18 +133,10 @@ packages: resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.29.7': resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.29.7': resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} @@ -169,10 +164,6 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.29.7': resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} @@ -239,10 +230,6 @@ packages: resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.29.7': resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} @@ -1649,7 +1636,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -1662,22 +1649,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.29.0 - '@babel/helper-annotate-as-pure@7.29.7': dependencies: '@babel/types': 7.29.7 - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.2 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 @@ -1702,7 +1677,7 @@ snapshots: '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-annotate-as-pure': 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 @@ -1716,16 +1691,14 @@ snapshots: '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.12 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} - '@babel/helper-globals@7.29.7': {} '@babel/helper-member-expression-to-functions@7.29.7': @@ -1799,8 +1772,6 @@ snapshots: '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-validator-option@7.29.7': {} '@babel/helper-wrap-function@7.29.7': @@ -1818,7 +1789,7 @@ snapshots: '@babel/parser@7.29.2': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@babel/parser@7.29.7': dependencies: @@ -2318,7 +2289,7 @@ snapshots: dependencies: '@babel/code-frame': 7.29.0 '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@babel/template@7.29.7': dependencies: @@ -2330,10 +2301,10 @@ snapshots: dependencies: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 + '@babel/helper-globals': 7.29.7 '@babel/parser': 7.29.2 '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 debug: 4.4.3 transitivePeerDependencies: - supports-color diff --git a/rollup.config.mjs b/rollup.config.mjs index 6953a49..483ce2d 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -9,6 +9,7 @@ import fs from "fs"; import crypto from "crypto"; import process from "process"; import path from "path"; +import ts from "typescript"; import config from "./es.config.mjs"; import { @@ -31,10 +32,6 @@ const hashText = (text) => const normalizePath = (filePath) => filePath.replace(/\\/g, "/"); -const IMPORT_RESOLVE_EXTENSIONS = [".ts", ".js", ".d.ts"]; -const IMPORT_SPECIFIER_PATTERN = - /\b(?:import|export)\s+(?:type\s+)?(?:[^'"]*?\s+from\s+)?["']([^"']+)["']|import\s*\(\s*["']([^"']+)["']\s*\)/g; - const collectFiles = (targetPath) => { if (!fs.existsSync(targetPath)) { return []; @@ -119,65 +116,92 @@ const getAmbientTypeInputs = (appId) => { return inputs; }; -const stripComments = (source) => - source.replace(/\/\*[\s\S]*?\*\//g, "").replace(/(^|[^:])\/\/.*$/gm, "$1"); - -const getRelativeImportSpecifiers = (filePath) => { - const source = stripComments(fs.readFileSync(filePath, "utf8")); - const specifiers = []; +const resolveTypeScriptConfigPath = (configPath, extendsValue) => { + const basePath = path.resolve(path.dirname(configPath), extendsValue); + const candidates = [basePath, `${basePath}.json`]; + return candidates.find((candidate) => fs.existsSync(candidate)) || null; +}; - IMPORT_SPECIFIER_PATTERN.lastIndex = 0; +const getTypeScriptConfigTypes = (configPath, visited = new Set()) => { + const resolvedConfigPath = path.resolve(configPath); + if (visited.has(resolvedConfigPath) || !fs.existsSync(resolvedConfigPath)) { + return []; + } - let match = IMPORT_SPECIFIER_PATTERN.exec(source); - while (match) { - const specifier = match[1] || match[2]; + visited.add(resolvedConfigPath); + const parsedConfig = JSON.parse(fs.readFileSync(resolvedConfigPath, "utf8")); + const compilerOptions = parsedConfig.compilerOptions || {}; + if (Object.prototype.hasOwnProperty.call(compilerOptions, "types")) { + return compilerOptions.types || []; + } - if (specifier && specifier.startsWith(".")) { - specifiers.push(specifier); + if (parsedConfig.extends) { + const parentConfigPath = resolveTypeScriptConfigPath( + resolvedConfigPath, + parsedConfig.extends + ); + if (parentConfigPath) { + return getTypeScriptConfigTypes(parentConfigPath, visited); } - - match = IMPORT_SPECIFIER_PATTERN.exec(source); } - return specifiers; + return []; }; -const getImportCandidates = (importBasePath) => { - const candidates = []; +const getTypeScriptConfigTypeInputs = (tsconfig) => { + const configPath = path.resolve(tsconfig); + return getTypeScriptConfigTypes(configPath).flatMap((typePath) => { + const basePath = path.resolve(path.dirname(configPath), typePath); + const candidates = [ + basePath, + `${basePath}.d.ts`, + path.join(basePath, "index.d.ts"), + ]; + return candidates.find((candidate) => fs.existsSync(candidate)) || []; + }); +}; - if (path.extname(importBasePath)) { - candidates.push(importBasePath); - } else { - IMPORT_RESOLVE_EXTENSIONS.forEach((extension) => { - candidates.push(`${importBasePath}${extension}`); - }); - } +const isTypeScriptInputFile = (filePath) => + /\.(?:d\.)?(?:c|m)?tsx?$/i.test(filePath); - IMPORT_RESOLVE_EXTENSIONS.forEach((extension) => { - candidates.push(path.join(importBasePath, `index${extension}`)); - }); +const getRelativeImportSpecifiers = (filePath) => { + const source = fs.readFileSync(filePath, "utf8"); + return ts + .preProcessFile(source, true, true) + .importedFiles.map(({ fileName }) => fileName) + .filter((specifier) => specifier.startsWith(".")); +}; - return candidates; +const IMPORT_RESOLVE_OPTIONS = { + allowJs: true, + moduleResolution: ts.ModuleResolutionKind.NodeJs, }; const resolveRelativeImport = (fromFilePath, specifier) => { - const importBasePath = path.resolve(path.dirname(fromFilePath), specifier); + const resolvedModule = ts.resolveModuleName( + specifier, + fromFilePath, + IMPORT_RESOLVE_OPTIONS, + ts.sys + ).resolvedModule; + const resolvedFilePath = resolvedModule?.resolvedFileName; + + if (!resolvedFilePath) { + return null; + } - return ( - getImportCandidates(importBasePath).find((candidate) => { - if (!fs.existsSync(candidate)) { - return false; - } + const absoluteFilePath = path.resolve(resolvedFilePath); + if (!fs.existsSync(absoluteFilePath)) { + return null; + } - return fs.statSync(candidate).isFile(); - }) || null - ); + return fs.statSync(absoluteFilePath).isFile() ? absoluteFilePath : null; }; const canReadImports = (filePath) => - IMPORT_RESOLVE_EXTENSIONS.includes(path.extname(filePath)); + isTypeScriptInputFile(filePath) || path.extname(filePath) === ".js"; -const collectImportDependencyFiles = (entryFile) => { +export const collectImportDependencyFiles = (entryFile) => { const files = new Map(); const visit = (filePath) => { @@ -209,6 +233,37 @@ const collectImportDependencyFiles = (entryFile) => { ); }; +export const getTypeScriptInputFiles = ({ + appId, + srcDir, + tsconfig, + ambientTypeInputs = getAmbientTypeInputs(appId), +}) => + getUniqueSortedFiles([ + ...collectImportDependencyFiles(`${srcDir}/index.ts`), + ...ambientTypeInputs, + ...(tsconfig ? getTypeScriptConfigTypeInputs(tsconfig) : []), + ]) + .filter(isTypeScriptInputFile) + .map(normalizePath); + +export const getTypeScriptPluginOptions = ({ + appId, + srcDir, + tsconfig, + watch = false, +}) => { + if (watch) { + return { tsconfig }; + } + + return { + tsconfig, + include: getTypeScriptInputFiles({ appId, srcDir, tsconfig }), + filterRoot: false, + }; +}; + const getScriptHashInputs = ({ appId, script, srcDir, tsconfig }) => { const inputs = [ ...SHARED_BUILD_INPUTS, @@ -248,9 +303,23 @@ const loadBuildHashes = () => { } }; -const saveBuildHashes = (hashes) => { - ensureDirectory(BUILD_HASH_DIR); - fs.writeFileSync(BUILD_HASH_FILE, JSON.stringify(hashes, null, 2), "utf8"); +export const saveBuildHashes = (hashes, buildHashFile = BUILD_HASH_FILE) => { + const targetPath = path.resolve(buildHashFile); + const temporaryPath = `${targetPath}.${process.pid}.${Date.now()}.tmp`; + + ensureDirectory(path.dirname(targetPath)); + + try { + fs.writeFileSync(temporaryPath, JSON.stringify(hashes, null, 2), "utf8"); + fs.renameSync(temporaryPath, targetPath); + } catch (error) { + try { + fs.rmSync(temporaryPath, { force: true }); + } catch { + // 元の履歴を保持することを優先し、一時ファイルの削除失敗は元のエラーに委ねる。 + } + throw error; + } }; const isTruthyFlag = (value) => @@ -271,7 +340,8 @@ const hasForceBuildFlag = (commandLineArgs = {}) => { }; const getAppFilter = (commandLineArgs = {}) => { - const appFilter = commandLineArgs.app || null; + const appFilter = + commandLineArgs.app || process.env.EXTENDSCRIPT_BUILD_APP || null; delete commandLineArgs.app; return appFilter; }; @@ -359,11 +429,16 @@ const createBabelConfig = () => }); let hasSavedBuildHashes = false; +export const BUILD_HASH_PLUGIN_NAME = "persist-build-hashes"; -const persistBuildHashes = (hashes) => ({ - name: "persist-build-hashes", +const persistBuildHashes = (hashes, metadata) => ({ + name: BUILD_HASH_PLUGIN_NAME, + buildHashState: { hashes, metadata }, closeBundle() { - if (hasSavedBuildHashes) { + if ( + hasSavedBuildHashes || + process.env.EXTENDSCRIPT_DEFER_BUILD_HASHES === "1" + ) { return; } @@ -372,7 +447,7 @@ const persistBuildHashes = (hashes) => ({ }, }); -export default (commandLineArgs) => { +export default (commandLineArgs = {}) => { const forceBuildAll = hasForceBuildFlag(commandLineArgs); const appFilter = getAppFilter(commandLineArgs); @@ -454,10 +529,23 @@ export default (commandLineArgs) => { const targetScripts = selection.targetScripts; const entries = targetScripts.map( - ({ script, srcDir, outDir, hashKey, tsconfig }) => { + ({ appId, script, srcDir, outDir, hashKey, tsconfig }) => { const inputFile = `${srcDir}/index.ts`; const fileHash = currentBuildHashes[hashKey] || calculateFileHash(inputFile); + const typeScriptPluginOptions = getTypeScriptPluginOptions({ + appId, + srcDir, + tsconfig, + watch: Boolean(commandLineArgs.watch), + }); + const metadata = { + appId, + hashKey, + scriptName: script.name, + tsconfig, + targetName: appId ? `${appId}/${script.name}` : script.name, + }; const banner = `/** ${script.name} v${script.version} hash: ${fileHash} */\nvar __ES_THIS__=this;`; @@ -471,7 +559,7 @@ export default (commandLineArgs) => { context: "this", onwarn, plugins: [ - typescript({ tsconfig }), + typescript(typeScriptPluginOptions), resolve({ extensions, }), @@ -480,7 +568,7 @@ export default (commandLineArgs) => { extractCommentsToTop(), terserConfig(banner), script.license ? licenser(srcDir) : null, - persistBuildHashes(currentBuildHashes), + persistBuildHashes(currentBuildHashes, metadata), ], }; } diff --git a/scripts/addApp.mjs b/scripts/addApp.mjs index 782e063..0d4dd6b 100644 --- a/scripts/addApp.mjs +++ b/scripts/addApp.mjs @@ -299,6 +299,9 @@ function shouldInsertAfterBuildScript(currentKey, nextKey) { return isBuildKey && !nextIsBuildKey; } +export const getBuildScriptAlias = (appId) => + `node ./scripts/build.mjs --app=${appId}`; + function addBuildScriptAlias(scripts, appId) { const scriptName = `build:${appId}`; if (Object.prototype.hasOwnProperty.call(scripts, scriptName)) { @@ -315,13 +318,13 @@ function addBuildScriptAlias(scripts, appId) { const nextKey = entries[i + 1]?.[0] || null; if (!inserted && shouldInsertAfterBuildScript(key, nextKey)) { - nextScripts[scriptName] = `rollup -c --app=${appId}`; + nextScripts[scriptName] = getBuildScriptAlias(appId); inserted = true; } } if (!inserted) { - nextScripts[scriptName] = `rollup -c --app=${appId}`; + nextScripts[scriptName] = getBuildScriptAlias(appId); } return { scripts: nextScripts, added: true }; @@ -457,4 +460,10 @@ async function main() { } } -main(); +const isMainModule = + process.argv[1] && + pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url; + +if (isMainModule) { + await main(); +} diff --git a/scripts/addApp.test.mjs b/scripts/addApp.test.mjs new file mode 100644 index 0000000..dbe4633 --- /dev/null +++ b/scripts/addApp.test.mjs @@ -0,0 +1,11 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { getBuildScriptAlias } from "./addApp.mjs"; + +test("新規アプリのビルド別名は単発ビルド経路を使う", () => { + assert.equal( + getBuildScriptAlias("idsn"), + "node ./scripts/build.mjs --app=idsn" + ); +}); diff --git a/scripts/build.mjs b/scripts/build.mjs new file mode 100644 index 0000000..f228cdf --- /dev/null +++ b/scripts/build.mjs @@ -0,0 +1,207 @@ +import os from "os"; +import path from "path"; +import process from "process"; +import { pathToFileURL } from "url"; + +import { rollup } from "rollup"; +import { loadConfigFile } from "rollup/loadConfigFile"; + +import { BUILD_HASH_PLUGIN_NAME, saveBuildHashes } from "../rollup.config.mjs"; +import { + BuildArgumentError, + getDefaultConcurrency, + parseBuildArguments, +} from "./buildOptions.mjs"; +import { BuildSchedulerError, runBuildJobs } from "./buildScheduler.mjs"; + +const getBuildHashState = (option) => { + const plugin = (option.plugins || []).find( + (candidate) => candidate && candidate.name === BUILD_HASH_PLUGIN_NAME + ); + return plugin ? plugin.buildHashState : null; +}; + +export const findBuildHashState = (options) => { + const states = options.map(getBuildHashState).filter(Boolean); + if (states.length === 0) { + throw new Error("ビルドハッシュの調停情報を取得できませんでした。"); + } + + const firstState = states[0]; + if (states.some((state) => state.hashes !== firstState.hashes)) { + throw new Error("ビルドハッシュの調停情報が対象間で一致しません。"); + } + + return firstState; +}; + +const getTargetMetadata = (option, index) => { + const state = getBuildHashState(option); + const metadata = state && state.metadata; + if (!metadata || !metadata.targetName) { + throw new Error( + `ビルド対象 ${index + 1} の識別情報を取得できませんでした。` + ); + } + return metadata; +}; + +const getOutputOptions = (option) => { + const output = option.output; + if (output === undefined || output === null) { + throw new Error("Rollup設定に出力先がありません。"); + } + return Array.isArray(output) ? output : [output]; +}; + +export const buildOne = async ({ option, rollupFn = rollup }) => { + const { output, watch: _watch, ...inputOptions } = option; + const bundle = await rollupFn(inputOptions); + + try { + for (const outputOption of getOutputOptions({ output })) { + await bundle.write(outputOption); + } + } finally { + await bundle.close(); + } +}; + +const compareLabels = (left, right) => { + if (left < right) return -1; + if (left > right) return 1; + return 0; +}; + +export const executeBuild = async ({ + options, + hashState, + concurrency, + rollupFn = rollup, + saveHashes = saveBuildHashes, +}) => { + const jobs = options.map((option, index) => ({ + label: getTargetMetadata(option, index).targetName, + option, + })); + + const results = await runBuildJobs({ + jobs, + concurrency, + run: async (job) => { + await buildOne({ option: job.option, rollupFn }); + return { label: job.label, status: "成功" }; + }, + }); + + saveHashes(hashState.hashes); + return results + .slice() + .sort((left, right) => compareLabels(left.label, right.label)); +}; + +const getAvailableParallelism = () => { + if (typeof os.availableParallelism === "function") { + try { + return os.availableParallelism(); + } catch (_error) { + // 古い実行環境や実行時の取得失敗ではCPU数へフォールバックします。 + } + } + + return os.cpus().length; +}; + +const printUsage = () => { + console.log(`使い方: pn build [--all|-a] [--app=] [--concurrency=<正整数>] + +既定の並列度: min(4, 利用可能な並列数, 対象件数) +--concurrency=1 を指定すると、範囲限定を維持したまま逐次実行します。 +監視ビルドは pn watch で実行し、この指定の対象外です。`); +}; + +const restoreEnvironmentValue = (name, value) => { + if (value === undefined) { + delete process.env[name]; + return; + } + process.env[name] = value; +}; + +const main = async () => { + let argumentsConfig; + try { + argumentsConfig = parseBuildArguments(process.argv.slice(2), process.env); + } catch (error) { + if (error instanceof BuildArgumentError) { + console.error(`ビルド引数エラー: ${error.message}`); + process.exitCode = 1; + return; + } + throw error; + } + + if (argumentsConfig.help) { + printUsage(); + return; + } + + const previousApp = process.env.EXTENDSCRIPT_BUILD_APP; + const previousBuildAll = process.env.BUILD_ALL; + const previousDefer = process.env.EXTENDSCRIPT_DEFER_BUILD_HASHES; + + try { + if (argumentsConfig.app === null) { + delete process.env.EXTENDSCRIPT_BUILD_APP; + } else { + process.env.EXTENDSCRIPT_BUILD_APP = argumentsConfig.app; + } + if (argumentsConfig.all) { + process.env.BUILD_ALL = "1"; + } + process.env.EXTENDSCRIPT_DEFER_BUILD_HASHES = "1"; + + const configPath = path.resolve("rollup.config.mjs"); + const { options, warnings } = await loadConfigFile(configPath, {}); + warnings.flush(); + + const hashState = findBuildHashState(options); + const requestedConcurrency = + argumentsConfig.concurrency ?? + getDefaultConcurrency(options.length, getAvailableParallelism()); + const concurrency = Math.min(requestedConcurrency, options.length); + + console.log(`並列度 ${concurrency} で ${options.length} 件を実行します。`); + const results = await executeBuild({ + options, + hashState, + concurrency, + }); + + console.log("ビルド結果:"); + results.forEach(({ label, status }) => { + console.log(`- ${label}: ${status}`); + }); + } catch (error) { + if (error instanceof BuildSchedulerError) { + console.error(`ビルドに失敗しました: ${error.message}`); + console.error("失敗を検出したため、未開始の処理は停止しました。"); + } else { + const message = error instanceof Error ? error.message : String(error); + console.error(`ビルドに失敗しました: ${message}`); + } + process.exitCode = 1; + } finally { + restoreEnvironmentValue("EXTENDSCRIPT_BUILD_APP", previousApp); + restoreEnvironmentValue("BUILD_ALL", previousBuildAll); + restoreEnvironmentValue("EXTENDSCRIPT_DEFER_BUILD_HASHES", previousDefer); + } +}; + +const isMainModule = + process.argv[1] && + pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url; + +if (isMainModule) { + await main(); +} diff --git a/scripts/build.test.mjs b/scripts/build.test.mjs new file mode 100644 index 0000000..ca0cfb8 --- /dev/null +++ b/scripts/build.test.mjs @@ -0,0 +1,126 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "fs"; +import os from "os"; +import path from "path"; + +import { BUILD_HASH_PLUGIN_NAME, saveBuildHashes } from "../rollup.config.mjs"; +import { executeBuild } from "./build.mjs"; + +const createOption = (label, hashes) => ({ + input: label, + output: { file: `${label}.jsx`, format: "cjs" }, + plugins: [ + { + name: BUILD_HASH_PLUGIN_NAME, + buildHashState: { + hashes, + metadata: { targetName: label }, + }, + }, + ], +}); + +test("全件成功後だけハッシュ確定し、結果は対象名順に返す", async () => { + const hashes = { first: "hash-first", second: "hash-second" }; + const saved = []; + const options = [ + createOption("second", hashes), + createOption("first", hashes), + ]; + + const results = await executeBuild({ + options, + hashState: { hashes }, + concurrency: 2, + rollupFn: async () => ({ + async write() {}, + async close() {}, + }), + saveHashes: (value) => saved.push(value), + }); + + assert.deepEqual( + results.map(({ label }) => label), + ["first", "second"] + ); + assert.deepEqual(saved, [hashes]); +}); + +test("失敗時は開始済みbundleを閉じ、ハッシュを保存しない", async () => { + const hashes = { failing: "old", running: "old", later: "old" }; + const options = [ + createOption("failing", hashes), + createOption("running", hashes), + createOption("later", hashes), + ]; + const started = []; + const closed = []; + const saved = []; + let releaseRunning; + const running = new Promise((resolve) => { + releaseRunning = resolve; + }); + + const execution = executeBuild({ + options, + hashState: { hashes }, + concurrency: 2, + rollupFn: async (inputOptions) => { + started.push(inputOptions.input); + return { + async write() { + if (inputOptions.input === "failing") { + throw new Error("出力失敗"); + } + await running; + }, + async close() { + closed.push(inputOptions.input); + }, + }; + }, + saveHashes: (value) => saved.push(value), + }); + + await Promise.resolve(); + releaseRunning(); + + await assert.rejects(execution, /failing: 出力失敗/); + assert.deepEqual(started, ["failing", "running"]); + assert.deepEqual(closed.sort(), ["failing", "running"]); + assert.deepEqual(saved, []); +}); + +test("ハッシュ履歴の保存失敗時は既存内容を保持する", (t) => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), "es-build-hash-")); + const hashFile = path.join(root, "build-hashes.json"); + const existingContent = Buffer.from('{"existing":"hash"}'); + const originalWriteFileSync = fs.writeFileSync; + + try { + fs.writeFileSync(hashFile, existingContent); + t.mock.method(fs, "writeFileSync", (filePath, data, options) => { + if (String(filePath).endsWith(".tmp")) { + originalWriteFileSync.call( + fs, + filePath, + String(data).slice(0, 2), + options + ); + throw new Error("ハッシュ履歴の保存失敗"); + } + + return originalWriteFileSync.call(fs, filePath, data, options); + }); + + assert.throws( + () => saveBuildHashes({ next: "hash" }, hashFile), + /ハッシュ履歴の保存失敗/ + ); + assert.deepEqual(fs.readFileSync(hashFile), existingContent); + assert.deepEqual(fs.readdirSync(root), ["build-hashes.json"]); + } finally { + fs.rmSync(root, { recursive: true, force: true }); + } +}); diff --git a/scripts/buildDependencyScope.test.mjs b/scripts/buildDependencyScope.test.mjs new file mode 100644 index 0000000..9f76f20 --- /dev/null +++ b/scripts/buildDependencyScope.test.mjs @@ -0,0 +1,136 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "fs"; +import os from "os"; +import path from "path"; + +import { + collectImportDependencyFiles, + getTypeScriptInputFiles, + getTypeScriptPluginOptions, +} from "../rollup.config.mjs"; + +const normalize = (filePath) => filePath.replace(/\\/g, "/"); + +test("スクリプト単位のTypeScript範囲は相対依存と環境型だけを含む", () => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), "es-build-scope-")); + const sourceRoot = path.join(root, "src"); + const targetDir = path.join(sourceRoot, "common", "target"); + const siblingDir = path.join(sourceRoot, "common", "sibling"); + const typesDir = path.join(sourceRoot, "types"); + const runtimeDir = path.join(sourceRoot, "lib"); + const stringOnlyPath = path.join(siblingDir, "string-only.ts"); + const commentedPath = path.join(siblingDir, "commented.ts"); + const lazyPath = path.join(targetDir, "lazy.ts"); + + try { + fs.mkdirSync(targetDir, { recursive: true }); + fs.mkdirSync(siblingDir, { recursive: true }); + fs.mkdirSync(typesDir, { recursive: true }); + fs.mkdirSync(runtimeDir, { recursive: true }); + fs.writeFileSync( + path.join(targetDir, "index.ts"), + [ + "const text = 'import \"../sibling/string-only\";';", + '/* import "../sibling/commented"; */', + 'import "../../init";', + 'export * from "../shared";', + 'const load = import("./lazy");', + ].join("\n") + ); + fs.writeFileSync( + path.join(sourceRoot, "common", "shared.ts"), + "export {};\n" + ); + fs.writeFileSync( + path.join(siblingDir, "index.ts"), + "const unrelated: MissingType = 1;\n" + ); + fs.writeFileSync(stringOnlyPath, "export {};\n"); + fs.writeFileSync(commentedPath, "export {};\n"); + fs.writeFileSync(lazyPath, "export {};\n"); + fs.writeFileSync( + path.join(sourceRoot, "init.ts"), + 'const text = "// import \'./missing\';";\nimport "./lib/runtime";\n' + ); + fs.writeFileSync( + path.join(runtimeDir, "runtime.js"), + "module.exports = {};\n" + ); + fs.writeFileSync( + path.join(typesDir, "environment.d.ts"), + "declare const app: unknown;\n" + ); + + const dependencies = collectImportDependencyFiles( + path.join(targetDir, "index.ts") + ).map(normalize); + const typeScriptFiles = getTypeScriptInputFiles({ + appId: null, + srcDir: targetDir, + ambientTypeInputs: [typesDir], + }); + + assert.ok( + dependencies.includes(normalize(path.join(sourceRoot, "init.ts"))) + ); + assert.ok( + dependencies.includes(normalize(path.join(runtimeDir, "runtime.js"))) + ); + assert.ok(dependencies.includes(normalize(lazyPath))); + assert.equal(dependencies.includes(normalize(stringOnlyPath)), false); + assert.equal(dependencies.includes(normalize(commentedPath)), false); + assert.ok( + typeScriptFiles.includes(normalize(path.join(targetDir, "index.ts"))) + ); + assert.ok( + typeScriptFiles.includes( + normalize(path.join(sourceRoot, "common", "shared.ts")) + ) + ); + assert.ok( + typeScriptFiles.includes( + normalize(path.join(typesDir, "environment.d.ts")) + ) + ); + assert.equal( + typeScriptFiles.includes(normalize(path.join(siblingDir, "index.ts"))), + false + ); + } finally { + fs.rmSync(root, { recursive: true, force: true }); + } +}); + +test("アプリ別tsconfigの環境型定義を範囲へ含める", () => { + const files = getTypeScriptInputFiles({ + appId: "aeft", + srcDir: "src/aeft/example", + tsconfig: "src/aeft/tsconfig.json", + }); + + assert.ok( + files.some((filePath) => + filePath.endsWith("types-for-adobe/AfterEffects/22.0/index.d.ts") + ) + ); + assert.ok( + files.some((filePath) => + filePath.endsWith("types-for-adobe/shared/XMPScript.d.ts") + ) + ); +}); + +test("監視ビルドは従来のTypeScript設定を使い、単発ビルドだけ範囲を限定する", () => { + const common = { + appId: "aeft", + srcDir: "src/aeft/example", + tsconfig: "src/aeft/tsconfig.json", + }; + const watchOptions = getTypeScriptPluginOptions({ ...common, watch: true }); + const buildOptions = getTypeScriptPluginOptions(common); + + assert.deepEqual(watchOptions, { tsconfig: common.tsconfig }); + assert.equal(buildOptions.filterRoot, false); + assert.ok(Array.isArray(buildOptions.include)); +}); diff --git a/scripts/buildOptions.mjs b/scripts/buildOptions.mjs new file mode 100644 index 0000000..7d3c2c5 --- /dev/null +++ b/scripts/buildOptions.mjs @@ -0,0 +1,118 @@ +export class BuildArgumentError extends Error { + constructor(message) { + super(message); + this.name = "BuildArgumentError"; + } +} + +const isTruthyFlag = (value) => + value !== undefined && value !== "" && value !== "false" && value !== "0"; + +export const parseConcurrencyValue = (value) => { + if (typeof value !== "string" || !/^\d+$/.test(value)) { + throw new BuildArgumentError( + `--concurrency には1以上の整数を指定してください(受け取った値: ${String(value)})。` + ); + } + + const concurrency = Number(value); + if (!Number.isSafeInteger(concurrency) || concurrency < 1) { + throw new BuildArgumentError( + `--concurrency には安全な範囲の1以上の整数を指定してください(受け取った値: ${value})。` + ); + } + + return concurrency; +}; + +export const getDefaultConcurrency = (targetCount, availableParallelism) => { + if (!Number.isSafeInteger(targetCount) || targetCount < 1) { + return 0; + } + + const parallelism = + Number.isSafeInteger(availableParallelism) && availableParallelism > 0 + ? availableParallelism + : 1; + + return Math.min(4, parallelism, targetCount); +}; + +const takeValue = (argumentsList, index, optionName) => { + const value = argumentsList[index + 1]; + if (value === undefined || value.startsWith("--")) { + throw new BuildArgumentError( + `${optionName} の値がありません。例: ${optionName}=4` + ); + } + return value; +}; + +export const parseBuildArguments = (argumentsList = [], environment = {}) => { + const result = { + all: isTruthyFlag(environment.BUILD_ALL), + app: null, + concurrency: null, + help: false, + }; + + for (let index = 0; index < argumentsList.length; index += 1) { + const argument = argumentsList[index]; + + if (argument === "--all" || argument === "-a") { + result.all = true; + continue; + } + + if (argument === "--help" || argument === "-h") { + result.help = true; + continue; + } + + if (argument === "--app") { + if (result.app !== null) { + throw new BuildArgumentError("--app は複数回指定できません。"); + } + result.app = takeValue(argumentsList, index, "--app"); + index += 1; + continue; + } + + if (argument.startsWith("--app=")) { + if (result.app !== null) { + throw new BuildArgumentError("--app は複数回指定できません。"); + } + const value = argument.slice("--app=".length); + if (value === "") { + throw new BuildArgumentError("--app の値がありません。例: --app=aeft"); + } + result.app = value; + continue; + } + + if (argument === "--concurrency") { + if (result.concurrency !== null) { + throw new BuildArgumentError("--concurrency は複数回指定できません。"); + } + result.concurrency = parseConcurrencyValue( + takeValue(argumentsList, index, "--concurrency") + ); + index += 1; + continue; + } + + if (argument.startsWith("--concurrency=")) { + if (result.concurrency !== null) { + throw new BuildArgumentError("--concurrency は複数回指定できません。"); + } + result.concurrency = parseConcurrencyValue( + argument.slice("--concurrency=".length) + ); + continue; + } + + throw new BuildArgumentError(`未知のビルドオプションです: ${argument}`); + } + + return result; +}; diff --git a/scripts/buildOptions.test.mjs b/scripts/buildOptions.test.mjs new file mode 100644 index 0000000..fd82211 --- /dev/null +++ b/scripts/buildOptions.test.mjs @@ -0,0 +1,38 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { + BuildArgumentError, + getDefaultConcurrency, + parseBuildArguments, + parseConcurrencyValue, +} from "./buildOptions.mjs"; + +test("ビルド引数は全件指定、アプリ指定、並列度指定を解析する", () => { + assert.deepEqual( + parseBuildArguments(["--all", "--app", "aeft", "--concurrency=2"]), + { all: true, app: "aeft", concurrency: 2, help: false } + ); + assert.equal(parseBuildArguments([], { BUILD_ALL: "1" }).all, true); +}); + +test("既定並列度は対象件数と利用可能な並列数を上限にする", () => { + assert.equal(getDefaultConcurrency(70, 16), 4); + assert.equal(getDefaultConcurrency(3, 16), 3); + assert.equal(getDefaultConcurrency(70, 2), 2); + assert.equal(getDefaultConcurrency(0, 16), 0); +}); + +test("並列度は1以上の安全な整数だけを受け付ける", () => { + assert.equal(parseConcurrencyValue("1"), 1); + assert.equal(parseConcurrencyValue("004"), 4); + + for (const value of ["", "0", "-1", "1.5", "abc", "1e2"]) { + assert.throws(() => parseConcurrencyValue(value), BuildArgumentError); + } + assert.throws(() => parseBuildArguments(["--concurrency"]), /値がありません/); + assert.throws( + () => parseBuildArguments(["--unknown"]), + /未知のビルドオプション/ + ); +}); diff --git a/scripts/buildOutput.test.mjs b/scripts/buildOutput.test.mjs new file mode 100644 index 0000000..1bb26ad --- /dev/null +++ b/scripts/buildOutput.test.mjs @@ -0,0 +1,134 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { promisify } from "node:util"; +import fs from "fs"; +import path from "path"; +import { execFile } from "child_process"; +import typescript from "@rollup/plugin-typescript"; +import { loadConfigFile } from "rollup/loadConfigFile"; + +import { buildOne } from "./build.mjs"; +import { BUILD_HASH_PLUGIN_NAME } from "../rollup.config.mjs"; +const execFileAsync = promisify(execFile); +const projectRoot = process.cwd(); +const outputFiles = [ + "dist/aeft/example/example.jsx", + "dist/ilst/example/example.jsx", + "dist/phxs/example/example.jsx", + "dist/tests/tests.jsx", +].map((filePath) => path.resolve(projectRoot, filePath)); +const buildHashFile = path.resolve(projectRoot, "dist/temp/build-hashes.json"); + +const snapshotFile = (filePath) => + fs.existsSync(filePath) ? fs.readFileSync(filePath) : null; + +const restoreFile = (filePath, snapshot) => { + if (snapshot === null) { + if (fs.existsSync(filePath)) { + fs.rmSync(filePath, { force: true }); + } + return; + } + + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + fs.writeFileSync(filePath, snapshot); +}; + +const normalizeBuildMetadata = (content) => + content + .toString("utf8") + .replace( + /\/\*\* [^\n]* hash: [0-9a-f]{64} \*\/\n/g, + "/** normalized build metadata */\n" + ); + +const runBuild = async (concurrency) => { + const environment = { ...process.env }; + delete environment.BUILD_ALL; + delete environment.EXTENDSCRIPT_BUILD_APP; + delete environment.EXTENDSCRIPT_DEFER_BUILD_HASHES; + + await execFileAsync( + process.execPath, + ["scripts/build.mjs", "--all", `--concurrency=${concurrency}`], + { + cwd: projectRoot, + env: environment, + maxBuffer: 8 * 1024 * 1024, + } + ); +}; + +const restoreEnvironmentValue = (name, value) => { + if (value === undefined) { + delete process.env[name]; + return; + } + process.env[name] = value; +}; + +const runUnboundedBuild = async () => { + const previousBuildAll = process.env.BUILD_ALL; + const previousDefer = process.env.EXTENDSCRIPT_DEFER_BUILD_HASHES; + process.env.BUILD_ALL = "1"; + process.env.EXTENDSCRIPT_DEFER_BUILD_HASHES = "1"; + + try { + const { options, warnings } = await loadConfigFile( + path.resolve(projectRoot, "rollup.config.mjs"), + {} + ); + warnings.flush(); + + for (const option of options) { + const hashPlugin = option.plugins.find( + (plugin) => plugin && plugin.name === BUILD_HASH_PLUGIN_NAME + ); + const tsconfig = hashPlugin.buildHashState.metadata.tsconfig; + const unboundedOptions = { + ...option, + plugins: option.plugins.map((plugin) => + plugin && plugin.name === "typescript" + ? typescript({ tsconfig }) + : plugin + ), + }; + await buildOne({ option: unboundedOptions }); + } + } finally { + restoreEnvironmentValue("BUILD_ALL", previousBuildAll); + restoreEnvironmentValue("EXTENDSCRIPT_DEFER_BUILD_HASHES", previousDefer); + } +}; + +test("逐次実行と並列実行の生成物はバイト単位で一致する", async () => { + const snapshots = new Map( + [...outputFiles, buildHashFile].map((filePath) => [ + filePath, + snapshotFile(filePath), + ]) + ); + + try { + await runBuild(1); + const serialOutputs = outputFiles.map((filePath) => snapshotFile(filePath)); + assert.ok(serialOutputs.every((content) => content !== null)); + + await runBuild(4); + const parallelOutputs = outputFiles.map((filePath) => + snapshotFile(filePath) + ); + assert.deepEqual(parallelOutputs, serialOutputs); + + await runUnboundedBuild(); + const unboundedOutputs = outputFiles.map((filePath) => + snapshotFile(filePath) + ); + assert.deepEqual( + unboundedOutputs.map(normalizeBuildMetadata), + parallelOutputs.map(normalizeBuildMetadata) + ); + } finally { + snapshots.forEach((snapshot, filePath) => restoreFile(filePath, snapshot)); + } +}); diff --git a/scripts/buildScheduler.mjs b/scripts/buildScheduler.mjs new file mode 100644 index 0000000..60068f5 --- /dev/null +++ b/scripts/buildScheduler.mjs @@ -0,0 +1,56 @@ +export class BuildSchedulerError extends Error { + constructor(job, cause) { + const label = job.label || job.name || "対象不明"; + const message = cause instanceof Error ? cause.message : String(cause); + super(`${label}: ${message}`); + this.name = "BuildSchedulerError"; + this.job = job; + this.cause = cause; + } +} + +export const runBuildJobs = async ({ jobs, concurrency, run }) => { + if (!Array.isArray(jobs)) { + throw new TypeError("jobs には配列を指定してください。"); + } + if (!Number.isSafeInteger(concurrency) || concurrency < 1) { + throw new RangeError("concurrency には1以上の整数を指定してください。"); + } + if (typeof run !== "function") { + throw new TypeError("run には関数を指定してください。"); + } + + const results = new Array(jobs.length); + let nextIndex = 0; + let failure = null; + + const worker = async () => { + while (true) { + if (failure || nextIndex >= jobs.length) { + return; + } + + const index = nextIndex; + nextIndex += 1; + const job = jobs[index]; + + try { + results[index] = await run(job, index); + } catch (error) { + if (failure === null) { + failure = { job, cause: error }; + } + return; + } + } + }; + + const workerCount = Math.min(concurrency, jobs.length); + await Promise.all(Array.from({ length: workerCount }, () => worker())); + + if (failure !== null) { + throw new BuildSchedulerError(failure.job, failure.cause); + } + + return results; +}; diff --git a/scripts/buildScheduler.test.mjs b/scripts/buildScheduler.test.mjs new file mode 100644 index 0000000..e12a7ca --- /dev/null +++ b/scripts/buildScheduler.test.mjs @@ -0,0 +1,67 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { BuildSchedulerError, runBuildJobs } from "./buildScheduler.mjs"; + +test("実行中のビルド数は指定した上限を超えない", async () => { + let active = 0; + let maximumActive = 0; + + const results = await runBuildJobs({ + jobs: Array.from({ length: 9 }, (_, id) => ({ id })), + concurrency: 3, + run: async (job) => { + active += 1; + maximumActive = Math.max(maximumActive, active); + await Promise.resolve(); + active -= 1; + return job.id; + }, + }); + + assert.equal(maximumActive, 3); + assert.deepEqual( + results, + Array.from({ length: 9 }, (_, id) => id) + ); +}); + +test("失敗後に未開始の仕事を増やさず、開始済みの仕事を完了させる", async () => { + const started = []; + const closed = []; + let releaseRunning; + const running = new Promise((resolve) => { + releaseRunning = resolve; + }); + + const execution = runBuildJobs({ + jobs: [ + { id: "失敗", label: "失敗対象" }, + { id: "実行中", label: "実行中対象" }, + { id: "未開始", label: "未開始対象" }, + ], + concurrency: 2, + run: async (job) => { + started.push(job.id); + try { + if (job.id === "失敗") { + throw new Error("意図した失敗"); + } + await running; + } finally { + closed.push(job.id); + } + }, + }); + + await Promise.resolve(); + releaseRunning(); + + await assert.rejects(execution, (error) => { + assert.ok(error instanceof BuildSchedulerError); + assert.equal(error.job.id, "失敗"); + return true; + }); + assert.deepEqual(started, ["失敗", "実行中"]); + assert.deepEqual(closed.sort(), ["失敗", "実行中"]); +});