From ae9fb5a556befa016f1d4ad55bf8e108fb895c82 Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Sun, 22 Dec 2024 02:43:03 +0300 Subject: [PATCH 1/5] boilerplate for using fs-watcher --- deno.lock | 1 + package-lock.json | 38 ++++++++++++++++++++--- package.json | 2 ++ rtsc/compile-all.ts | 72 ++++++++++++++++++++++++++++++++++++++++++++ tsconfig.tsbuildinfo | 2 +- 5 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 rtsc/compile-all.ts diff --git a/deno.lock b/deno.lock index b68a9f7..ccccbf1 100644 --- a/deno.lock +++ b/deno.lock @@ -935,6 +935,7 @@ "npm:eslint-plugin-react-refresh@~0.4.16", "npm:eslint@^9.17.0", "npm:globals@^15.13.0", + "npm:ignore@^6.0.2", "npm:index-to-position@1", "npm:json-stable-stringify@^1.1.1", "npm:json-stringify-pretty-compact@4", diff --git a/package-lock.json b/package-lock.json index 3f2caa5..ee83b89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@types/node": "^22.10.2", "@uiw/codemirror-theme-abcdef": "^4.23.7", "@uiw/react-codemirror": "^4.23.7", + "ignore": "^6.0.2", "index-to-position": "^1.0.0", "json-stable-stringify": "^1.1.1", "json-stringify-pretty-compact": "^4.0.0", @@ -975,6 +976,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@eslint/js": { "version": "9.17.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", @@ -1621,6 +1632,16 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/parser": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", @@ -2634,6 +2655,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", @@ -3066,10 +3097,9 @@ "license": "MIT" }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "license": "MIT", "engines": { "node": ">= 4" diff --git a/package.json b/package.json index c132099..7842bc2 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "test": "vitest", "watch": "tsc -b --watch --noEmit", "rts-watch-with-deno": "deno --watch --unstable-sloppy-imports --allow-all ./rtsc/watch.ts", + "compile-all": "deno --watch --unstable-sloppy-imports --allow-all ./rtsc/compile-all.ts", "rts-watch": "vite-node --watch ./rtsc/watch.ts", "coverage": "vitest run --coverage", "build": "tsc -b && vite build", @@ -22,6 +23,7 @@ "@types/node": "^22.10.2", "@uiw/codemirror-theme-abcdef": "^4.23.7", "@uiw/react-codemirror": "^4.23.7", + "ignore": "^6.0.2", "index-to-position": "^1.0.0", "json-stable-stringify": "^1.1.1", "json-stringify-pretty-compact": "^4.0.0", diff --git a/rtsc/compile-all.ts b/rtsc/compile-all.ts new file mode 100644 index 0000000..5ba6326 --- /dev/null +++ b/rtsc/compile-all.ts @@ -0,0 +1,72 @@ +import { FSWatcher, watch } from "node:fs"; +import fs from "node:fs/promises"; +import process from "node:process"; +import path from "node:path"; +import ignore from "ignore"; + +class DirWatcher { + private fswatcher: FSWatcher; + constructor(fswatcher: FSWatcher) { + this.fswatcher = fswatcher; + } +} + +class WatchFS { + dir_watchers: { [path: string]: DirWatcher } = {}; + onRTSFile: (path: string) => void; + constructor(onRTSFile: (path: string) => void) { + this.onRTSFile = onRTSFile; + this.init(); + } + + private async init() { + const gitignore_content = await fs.readFile(".gitignore", { encoding: "utf8" }); + const ig = ignore().add(gitignore_content).add("/.git"); + + async function getstat(absp: string) { + try { + return await fs.stat(absp); + } catch (err: any) { + if (err.code === "ENOENT") { + return null; + } else { + throw err; + } + } + } + + const check_file = async (file: string, relpath: string, abspath: string) => { + const relp = path.join(relpath, file); + const absp = path.join(abspath, file); + if (this.dir_watchers[absp]) return; + if (ig.ignores(relp)) return; + const stat = await getstat(absp); + if (stat) { + if (stat.isDirectory()) { + seed_dir(relp, absp); + } else if (file.endsWith(".rts")) { + this.onRTSFile(absp); + } + } + }; + + const seed_dir = async (relpath: string, abspath: string) => { + const fswatcher = watch(abspath, { encoding: "utf8", recursive: false }, (event, file) => { + console.log(`watch ${event} ${file} in ${abspath}`); + if (file !== null) check_file(file, relpath, abspath); + }); + this.dir_watchers[abspath] = new DirWatcher(fswatcher); + fs.readdir(relpath).then((files) => + files.forEach((file) => check_file(file, relpath, abspath)), + ); + }; + + seed_dir(".", process.cwd()); + } +} + +const FS = new WatchFS((path) => console.log({ path })); + +//console.log(path.relative("/x/a/b/c", "/x/a/b2/c2")); + +//const watcher = watch(".", {}, (event, filename) => console.log({ event, filename })); diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index c92621a..3375643 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./files.test.ts","./generate-stdlibs.test.ts","./vite.config.ts","./vitest.config.ts","./rtsc/watch.ts","./src/assert.ts","./src/ast.ts","./src/data.ts","./src/expander.ts","./src/fs-helpers.ts","./src/generate-stdlibs.ts","./src/generated-stdlibs.ts","./src/global-module.ts","./src/library-manager.ts","./src/llhelpers.ts","./src/parse.ts","./src/pprint.ts","./src/preexpand-handlers.ts","./src/preexpand-helpers.ts","./src/proxy-code.ts","./src/serialize.ts","./src/stx-error.ts","./src/stx.ts","./src/syntax-core-patterns.ts","./src/syntax-structures.ts","./src/tags.ts","./src/zipper.ts","./test-project/index.ts","./test-project/main.rts.ts","./test-project/mod.rts.ts","./ui/astvis.tsx","./ui/app.tsx","./ui/editor.tsx","./ui/main.tsx","./ui/vite-env.d.ts"],"version":"5.7.2"} \ No newline at end of file +{"root":["./files.test.ts","./generate-stdlibs.test.ts","./vite.config.ts","./vitest.config.ts","./rtsc/compile-all.ts","./rtsc/watch.ts","./src/assert.ts","./src/ast.ts","./src/data.ts","./src/expander.ts","./src/fs-helpers.ts","./src/generate-stdlibs.ts","./src/generated-stdlibs.ts","./src/global-module.ts","./src/library-manager.ts","./src/llhelpers.ts","./src/parse.ts","./src/pprint.ts","./src/preexpand-handlers.ts","./src/preexpand-helpers.ts","./src/proxy-code.ts","./src/serialize.ts","./src/stx-error.ts","./src/stx.ts","./src/syntax-core-patterns.ts","./src/syntax-structures.ts","./src/tags.ts","./src/zipper.ts","./test-project/index.ts","./test-project/main.rts.ts","./test-project/mod.rts.ts","./ui/astvis.tsx","./ui/app.tsx","./ui/editor.tsx","./ui/main.tsx","./ui/vite-env.d.ts"],"version":"5.7.2"} \ No newline at end of file From 52dba3391087dd2dec52aace8e03e10394b48fa2 Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Thu, 26 Dec 2024 03:36:39 +0300 Subject: [PATCH 2/5] hooked up compiler to compile-all --- deno.lock | 98 --------------------------------------------- rtsc/compile-all.ts | 28 ++++++++++++- 2 files changed, 26 insertions(+), 100 deletions(-) diff --git a/deno.lock b/deno.lock index ccccbf1..3c5b6e6 100644 --- a/deno.lock +++ b/deno.lock @@ -6,8 +6,6 @@ "npm:@types/json-stable-stringify@^1.1.0": "1.1.0", "npm:@types/node@^22.10.1": "22.10.1", "npm:@vitest/coverage-v8@^2.1.8": "2.1.8_vitest@2.1.8__@types+node@22.10.1__vite@5.4.11___@types+node@22.10.1_@types+node@22.10.1", - "npm:globals@^15.13.0": "15.13.0", - "npm:json-stable-stringify@^1.1.1": "1.1.1", "npm:typescript@^5.5.3": "5.7.2", "npm:vitest@^2.1.5": "2.1.8_@types+node@22.10.1_vite@5.4.11__@types+node@22.10.1" }, @@ -395,16 +393,6 @@ "cac@6.7.14": { "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" }, - "call-bind@1.0.7": { - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": [ - "es-define-property", - "es-errors", - "function-bind", - "get-intrinsic", - "set-function-length" - ] - }, "chai@5.1.2": { "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dependencies": [ @@ -447,14 +435,6 @@ "deep-eql@5.0.2": { "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==" }, - "define-data-property@1.1.4": { - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": [ - "es-define-property", - "es-errors", - "gopd" - ] - }, "eastasianwidth@0.2.0": { "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, @@ -464,15 +444,6 @@ "emoji-regex@9.2.2": { "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, - "es-define-property@1.0.0": { - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": [ - "get-intrinsic" - ] - }, - "es-errors@1.3.0": { - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, "es-module-lexer@1.5.4": { "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, @@ -523,19 +494,6 @@ "fsevents@2.3.3": { "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" }, - "function-bind@1.1.2": { - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "get-intrinsic@1.2.4": { - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": [ - "es-errors", - "function-bind", - "has-proto", - "has-symbols", - "hasown" - ] - }, "glob@10.4.5": { "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dependencies": [ @@ -547,45 +505,15 @@ "path-scurry" ] }, - "globals@15.13.0": { - "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==" - }, - "gopd@1.0.1": { - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": [ - "get-intrinsic" - ] - }, "has-flag@4.0.0": { "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "has-property-descriptors@1.0.2": { - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": [ - "es-define-property" - ] - }, - "has-proto@1.0.3": { - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols@1.0.3": { - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hasown@2.0.2": { - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": [ - "function-bind" - ] - }, "html-escaper@2.0.2": { "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, "is-fullwidth-code-point@3.0.0": { "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "isarray@2.0.5": { - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "isexe@2.0.0": { "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, @@ -622,18 +550,6 @@ "@pkgjs/parseargs" ] }, - "json-stable-stringify@1.1.1": { - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", - "dependencies": [ - "call-bind", - "isarray", - "jsonify", - "object-keys" - ] - }, - "jsonify@0.0.1": { - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==" - }, "loupe@3.1.2": { "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==" }, @@ -675,9 +591,6 @@ "nanoid@3.3.8": { "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" }, - "object-keys@1.1.1": { - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, "package-json-from-dist@1.0.1": { "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, @@ -736,17 +649,6 @@ "semver@7.6.3": { "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, - "set-function-length@1.2.2": { - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": [ - "define-data-property", - "es-errors", - "function-bind", - "get-intrinsic", - "gopd", - "has-property-descriptors" - ] - }, "shebang-command@2.0.0": { "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": [ diff --git a/rtsc/compile-all.ts b/rtsc/compile-all.ts index 5ba6326..9055631 100644 --- a/rtsc/compile-all.ts +++ b/rtsc/compile-all.ts @@ -1,9 +1,19 @@ import { FSWatcher, watch } from "node:fs"; import fs from "node:fs/promises"; import process from "node:process"; -import path from "node:path"; +import path, { basename, dirname, join } from "node:path"; import ignore from "ignore"; +import { LibraryManager } from "../src/library-manager.ts"; +import { get_globals } from "../src/global-module.ts"; +import { core_patterns } from "../src/syntax-core-patterns.ts"; +import { parse } from "../src/parse.ts"; +import { assert } from "../src/assert.ts"; + +const globals = get_globals("es2024.full"); +const patterns = core_patterns(parse); +const library_manager = new LibraryManager(patterns, globals, ["es2024.full"]); + class DirWatcher { private fswatcher: FSWatcher; constructor(fswatcher: FSWatcher) { @@ -65,7 +75,21 @@ class WatchFS { } } -const FS = new WatchFS((path) => console.log({ path })); +function check_path(path: string) { + assert(path.endsWith(".rts")); + library_manager.ensureUpToDate(path); + //const suffix = ".rts"; + //if (path.endsWith(suffix)) { + // const module_dir = dirname(path); + // const module_name = basename(path, suffix) + ".rts"; + // const rts_file = join(module_dir, module_name); + // fs.stat(rts_file).then((stats) => { + // library_manager.ensureUpToDate(rts_file); + // }); + //} +} + +const FS = new WatchFS(check_path); //console.log(path.relative("/x/a/b/c", "/x/a/b2/c2")); From 347b30ff4097297bd0aae8b487d8d9e274f8eed1 Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Thu, 26 Dec 2024 03:49:02 +0300 Subject: [PATCH 3/5] compile-all updated to match new apis --- .gitignore | 1 + deno.lock | 859 ------------------------------------------- rtsc/compile-all.ts | 23 +- tsconfig.tsbuildinfo | 2 +- 4 files changed, 18 insertions(+), 867 deletions(-) delete mode 100644 deno.lock diff --git a/.gitignore b/.gitignore index 2a2bb4f..46f7f26 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ coverage node_modules dist dump +deno.lock diff --git a/deno.lock b/deno.lock deleted file mode 100644 index c0d6a4d..0000000 --- a/deno.lock +++ /dev/null @@ -1,859 +0,0 @@ -{ - "version": "4", - "specifiers": { - "npm:@codemirror/lang-javascript@^6.2.2": "6.2.2_@codemirror+language@6.10.5_@codemirror+state@6.4.1_@codemirror+view@6.35.0_@lezer+common@1.2.3", - "npm:@eslint/js@^9.11.1": "9.15.0", - "npm:@types/json-stable-stringify@^1.1.0": "1.1.0", - "npm:@types/node@^22.10.1": "22.10.1", - "npm:@vitest/coverage-v8@^2.1.8": "2.1.8_vitest@2.1.8__@types+node@22.10.1__vite@5.4.11___@types+node@22.10.1_@types+node@22.10.1", - "npm:typescript@^5.5.3": "5.7.2", - "npm:vitest@^2.1.5": "2.1.8_@types+node@22.10.1_vite@5.4.11__@types+node@22.10.1" - }, - "npm": { - "@ampproject/remapping@2.3.0": { - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": [ - "@jridgewell/gen-mapping", - "@jridgewell/trace-mapping" - ] - }, - "@babel/helper-string-parser@7.25.9": { - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" - }, - "@babel/helper-validator-identifier@7.25.9": { - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" - }, - "@babel/parser@7.26.3": { - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", - "dependencies": [ - "@babel/types" - ] - }, - "@babel/types@7.26.3": { - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "dependencies": [ - "@babel/helper-string-parser", - "@babel/helper-validator-identifier" - ] - }, - "@bcoe/v8-coverage@0.2.3": { - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "@codemirror/autocomplete@6.18.3_@codemirror+language@6.10.5_@codemirror+state@6.4.1_@codemirror+view@6.35.0_@lezer+common@1.2.3": { - "integrity": "sha512-1dNIOmiM0z4BIBwxmxEfA1yoxh1MF/6KPBbh20a5vphGV0ictKlgQsbJs6D6SkR6iJpGbpwRsa6PFMNlg9T9pQ==", - "dependencies": [ - "@codemirror/language", - "@codemirror/state", - "@codemirror/view", - "@lezer/common" - ] - }, - "@codemirror/lang-javascript@6.2.2_@codemirror+language@6.10.5_@codemirror+state@6.4.1_@codemirror+view@6.35.0_@lezer+common@1.2.3": { - "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", - "dependencies": [ - "@codemirror/autocomplete", - "@codemirror/language", - "@codemirror/lint", - "@codemirror/state", - "@codemirror/view", - "@lezer/common", - "@lezer/javascript" - ] - }, - "@codemirror/language@6.10.5": { - "integrity": "sha512-sECWJyNmwqw6mSO6Qf0IVPHwhEnuYbqHBZaaIbdcXtZ6Y2r5vU/dxgC7K1ppWaJFy8XGtTBC0Pd60qI7NfJreQ==", - "dependencies": [ - "@codemirror/state", - "@codemirror/view", - "@lezer/common", - "@lezer/highlight", - "@lezer/lr", - "style-mod" - ] - }, - "@codemirror/lint@6.8.3": { - "integrity": "sha512-GSGfKxCo867P7EX1k2LoCrjuQFeqVgPGRRsSl4J4c0KMkD+k1y6WYvTQkzv0iZ8JhLJDujEvlnMchv4CZQLh3Q==", - "dependencies": [ - "@codemirror/state", - "@codemirror/view", - "crelt" - ] - }, - "@codemirror/state@6.4.1": { - "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==" - }, - "@codemirror/view@6.35.0": { - "integrity": "sha512-I0tYy63q5XkaWsJ8QRv5h6ves7kvtrBWjBcnf/bzohFJQc5c14a1AQRdE8QpPF9eMp5Mq2FMm59TCj1gDfE7kw==", - "dependencies": [ - "@codemirror/state", - "style-mod", - "w3c-keyname" - ] - }, - "@esbuild/aix-ppc64@0.21.5": { - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==" - }, - "@esbuild/android-arm64@0.21.5": { - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==" - }, - "@esbuild/android-arm@0.21.5": { - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==" - }, - "@esbuild/android-x64@0.21.5": { - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==" - }, - "@esbuild/darwin-arm64@0.21.5": { - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==" - }, - "@esbuild/darwin-x64@0.21.5": { - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==" - }, - "@esbuild/freebsd-arm64@0.21.5": { - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==" - }, - "@esbuild/freebsd-x64@0.21.5": { - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==" - }, - "@esbuild/linux-arm64@0.21.5": { - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==" - }, - "@esbuild/linux-arm@0.21.5": { - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==" - }, - "@esbuild/linux-ia32@0.21.5": { - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==" - }, - "@esbuild/linux-loong64@0.21.5": { - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==" - }, - "@esbuild/linux-mips64el@0.21.5": { - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==" - }, - "@esbuild/linux-ppc64@0.21.5": { - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==" - }, - "@esbuild/linux-riscv64@0.21.5": { - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==" - }, - "@esbuild/linux-s390x@0.21.5": { - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==" - }, - "@esbuild/linux-x64@0.21.5": { - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==" - }, - "@esbuild/netbsd-x64@0.21.5": { - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==" - }, - "@esbuild/openbsd-x64@0.21.5": { - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==" - }, - "@esbuild/sunos-x64@0.21.5": { - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==" - }, - "@esbuild/win32-arm64@0.21.5": { - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==" - }, - "@esbuild/win32-ia32@0.21.5": { - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==" - }, - "@esbuild/win32-x64@0.21.5": { - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==" - }, - "@eslint/js@9.15.0": { - "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==" - }, - "@isaacs/cliui@8.0.2": { - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": [ - "string-width@5.1.2", - "string-width-cjs@npm:string-width@4.2.3", - "strip-ansi@7.1.0", - "strip-ansi-cjs@npm:strip-ansi@6.0.1", - "wrap-ansi@8.1.0", - "wrap-ansi-cjs@npm:wrap-ansi@7.0.0" - ] - }, - "@istanbuljs/schema@0.1.3": { - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" - }, - "@jridgewell/gen-mapping@0.3.5": { - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": [ - "@jridgewell/set-array", - "@jridgewell/sourcemap-codec", - "@jridgewell/trace-mapping" - ] - }, - "@jridgewell/resolve-uri@3.1.2": { - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" - }, - "@jridgewell/set-array@1.2.1": { - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" - }, - "@jridgewell/sourcemap-codec@1.5.0": { - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "@jridgewell/trace-mapping@0.3.25": { - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": [ - "@jridgewell/resolve-uri", - "@jridgewell/sourcemap-codec" - ] - }, - "@lezer/common@1.2.3": { - "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==" - }, - "@lezer/highlight@1.2.1": { - "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", - "dependencies": [ - "@lezer/common" - ] - }, - "@lezer/javascript@1.4.19": { - "integrity": "sha512-j44kbR1QL26l6dMunZ1uhKBFteVGLVCBGNUD2sUaMnic+rbTviVuoK0CD1l9FTW31EueWvFFswCKMH7Z+M3JRA==", - "dependencies": [ - "@lezer/common", - "@lezer/highlight", - "@lezer/lr" - ] - }, - "@lezer/lr@1.4.2": { - "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", - "dependencies": [ - "@lezer/common" - ] - }, - "@pkgjs/parseargs@0.11.0": { - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" - }, - "@rollup/rollup-android-arm-eabi@4.28.0": { - "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==" - }, - "@rollup/rollup-android-arm64@4.28.0": { - "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==" - }, - "@rollup/rollup-darwin-arm64@4.28.0": { - "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==" - }, - "@rollup/rollup-darwin-x64@4.28.0": { - "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==" - }, - "@rollup/rollup-freebsd-arm64@4.28.0": { - "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==" - }, - "@rollup/rollup-freebsd-x64@4.28.0": { - "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==" - }, - "@rollup/rollup-linux-arm-gnueabihf@4.28.0": { - "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==" - }, - "@rollup/rollup-linux-arm-musleabihf@4.28.0": { - "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==" - }, - "@rollup/rollup-linux-arm64-gnu@4.28.0": { - "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==" - }, - "@rollup/rollup-linux-arm64-musl@4.28.0": { - "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==" - }, - "@rollup/rollup-linux-powerpc64le-gnu@4.28.0": { - "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==" - }, - "@rollup/rollup-linux-riscv64-gnu@4.28.0": { - "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==" - }, - "@rollup/rollup-linux-s390x-gnu@4.28.0": { - "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==" - }, - "@rollup/rollup-linux-x64-gnu@4.28.0": { - "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==" - }, - "@rollup/rollup-linux-x64-musl@4.28.0": { - "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==" - }, - "@rollup/rollup-win32-arm64-msvc@4.28.0": { - "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==" - }, - "@rollup/rollup-win32-ia32-msvc@4.28.0": { - "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==" - }, - "@rollup/rollup-win32-x64-msvc@4.28.0": { - "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==" - }, - "@types/estree@1.0.6": { - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "@types/json-stable-stringify@1.1.0": { - "integrity": "sha512-ESTsHWB72QQq+pjUFIbEz9uSCZppD31YrVkbt2rnUciTYEvcwN6uZIhX5JZeBHqRlFJ41x/7MewCs7E2Qux6Cg==" - }, - "@types/node@22.10.1": { - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", - "dependencies": [ - "undici-types" - ] - }, - "@vitest/coverage-v8@2.1.8_vitest@2.1.8__@types+node@22.10.1__vite@5.4.11___@types+node@22.10.1_@types+node@22.10.1": { - "integrity": "sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==", - "dependencies": [ - "@ampproject/remapping", - "@bcoe/v8-coverage", - "debug", - "istanbul-lib-coverage", - "istanbul-lib-report", - "istanbul-lib-source-maps", - "istanbul-reports", - "magic-string", - "magicast", - "std-env", - "test-exclude", - "tinyrainbow", - "vitest" - ] - }, - "@vitest/expect@2.1.8": { - "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", - "dependencies": [ - "@vitest/spy", - "@vitest/utils", - "chai", - "tinyrainbow" - ] - }, - "@vitest/mocker@2.1.8_vite@5.4.11__@types+node@22.10.1_@types+node@22.10.1": { - "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", - "dependencies": [ - "@vitest/spy", - "estree-walker", - "magic-string", - "vite" - ] - }, - "@vitest/pretty-format@2.1.8": { - "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", - "dependencies": [ - "tinyrainbow" - ] - }, - "@vitest/runner@2.1.8": { - "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", - "dependencies": [ - "@vitest/utils", - "pathe" - ] - }, - "@vitest/snapshot@2.1.8": { - "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", - "dependencies": [ - "@vitest/pretty-format", - "magic-string", - "pathe" - ] - }, - "@vitest/spy@2.1.8": { - "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", - "dependencies": [ - "tinyspy" - ] - }, - "@vitest/utils@2.1.8": { - "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", - "dependencies": [ - "@vitest/pretty-format", - "loupe", - "tinyrainbow" - ] - }, - "ansi-regex@5.0.1": { - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-regex@6.1.0": { - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" - }, - "ansi-styles@4.3.0": { - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": [ - "color-convert" - ] - }, - "ansi-styles@6.2.1": { - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "assertion-error@2.0.1": { - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" - }, - "balanced-match@1.0.2": { - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "brace-expansion@2.0.1": { - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": [ - "balanced-match" - ] - }, - "cac@6.7.14": { - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" - }, - "chai@5.1.2": { - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", - "dependencies": [ - "assertion-error", - "check-error", - "deep-eql", - "loupe", - "pathval" - ] - }, - "check-error@2.1.1": { - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==" - }, - "color-convert@2.0.1": { - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": [ - "color-name" - ] - }, - "color-name@1.1.4": { - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "crelt@1.0.6": { - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, - "cross-spawn@7.0.6": { - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": [ - "path-key", - "shebang-command", - "which" - ] - }, - "debug@4.3.7": { - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": [ - "ms" - ] - }, - "deep-eql@5.0.2": { - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==" - }, - "eastasianwidth@0.2.0": { - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "emoji-regex@8.0.0": { - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emoji-regex@9.2.2": { - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "es-module-lexer@1.5.4": { - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" - }, - "esbuild@0.21.5": { - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dependencies": [ - "@esbuild/aix-ppc64", - "@esbuild/android-arm", - "@esbuild/android-arm64", - "@esbuild/android-x64", - "@esbuild/darwin-arm64", - "@esbuild/darwin-x64", - "@esbuild/freebsd-arm64", - "@esbuild/freebsd-x64", - "@esbuild/linux-arm", - "@esbuild/linux-arm64", - "@esbuild/linux-ia32", - "@esbuild/linux-loong64", - "@esbuild/linux-mips64el", - "@esbuild/linux-ppc64", - "@esbuild/linux-riscv64", - "@esbuild/linux-s390x", - "@esbuild/linux-x64", - "@esbuild/netbsd-x64", - "@esbuild/openbsd-x64", - "@esbuild/sunos-x64", - "@esbuild/win32-arm64", - "@esbuild/win32-ia32", - "@esbuild/win32-x64" - ] - }, - "estree-walker@3.0.3": { - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": [ - "@types/estree" - ] - }, - "expect-type@1.1.0": { - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==" - }, - "foreground-child@3.3.0": { - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dependencies": [ - "cross-spawn", - "signal-exit" - ] - }, - "fsevents@2.3.3": { - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" - }, - "glob@10.4.5": { - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": [ - "foreground-child", - "jackspeak", - "minimatch", - "minipass", - "package-json-from-dist", - "path-scurry" - ] - }, - "has-flag@4.0.0": { - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "html-escaper@2.0.2": { - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "is-fullwidth-code-point@3.0.0": { - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "isexe@2.0.0": { - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "istanbul-lib-coverage@3.2.2": { - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==" - }, - "istanbul-lib-report@3.0.1": { - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dependencies": [ - "istanbul-lib-coverage", - "make-dir", - "supports-color" - ] - }, - "istanbul-lib-source-maps@5.0.6": { - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dependencies": [ - "@jridgewell/trace-mapping", - "debug", - "istanbul-lib-coverage" - ] - }, - "istanbul-reports@3.1.7": { - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dependencies": [ - "html-escaper", - "istanbul-lib-report" - ] - }, - "jackspeak@3.4.3": { - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": [ - "@isaacs/cliui", - "@pkgjs/parseargs" - ] - }, - "loupe@3.1.2": { - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==" - }, - "lru-cache@10.4.3": { - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "magic-string@0.30.14": { - "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", - "dependencies": [ - "@jridgewell/sourcemap-codec" - ] - }, - "magicast@0.3.5": { - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dependencies": [ - "@babel/parser", - "@babel/types", - "source-map-js" - ] - }, - "make-dir@4.0.0": { - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dependencies": [ - "semver" - ] - }, - "minimatch@9.0.5": { - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": [ - "brace-expansion" - ] - }, - "minipass@7.1.2": { - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" - }, - "ms@2.1.3": { - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "nanoid@3.3.8": { - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" - }, - "package-json-from-dist@1.0.1": { - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, - "path-key@3.1.1": { - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-scurry@1.11.1": { - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": [ - "lru-cache", - "minipass" - ] - }, - "pathe@1.1.2": { - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "pathval@2.0.0": { - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==" - }, - "picocolors@1.1.1": { - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "postcss@8.4.49": { - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dependencies": [ - "nanoid", - "picocolors", - "source-map-js" - ] - }, - "rollup@4.28.0": { - "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==", - "dependencies": [ - "@rollup/rollup-android-arm-eabi", - "@rollup/rollup-android-arm64", - "@rollup/rollup-darwin-arm64", - "@rollup/rollup-darwin-x64", - "@rollup/rollup-freebsd-arm64", - "@rollup/rollup-freebsd-x64", - "@rollup/rollup-linux-arm-gnueabihf", - "@rollup/rollup-linux-arm-musleabihf", - "@rollup/rollup-linux-arm64-gnu", - "@rollup/rollup-linux-arm64-musl", - "@rollup/rollup-linux-powerpc64le-gnu", - "@rollup/rollup-linux-riscv64-gnu", - "@rollup/rollup-linux-s390x-gnu", - "@rollup/rollup-linux-x64-gnu", - "@rollup/rollup-linux-x64-musl", - "@rollup/rollup-win32-arm64-msvc", - "@rollup/rollup-win32-ia32-msvc", - "@rollup/rollup-win32-x64-msvc", - "@types/estree", - "fsevents" - ] - }, - "semver@7.6.3": { - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" - }, - "shebang-command@2.0.0": { - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": [ - "shebang-regex" - ] - }, - "shebang-regex@3.0.0": { - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "siginfo@2.0.0": { - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - }, - "signal-exit@4.1.0": { - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" - }, - "source-map-js@1.2.1": { - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - }, - "stackback@0.0.2": { - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - }, - "std-env@3.8.0": { - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" - }, - "string-width@4.2.3": { - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": [ - "emoji-regex@8.0.0", - "is-fullwidth-code-point", - "strip-ansi@6.0.1" - ] - }, - "string-width@5.1.2": { - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": [ - "eastasianwidth", - "emoji-regex@9.2.2", - "strip-ansi@7.1.0" - ] - }, - "strip-ansi@6.0.1": { - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": [ - "ansi-regex@5.0.1" - ] - }, - "strip-ansi@7.1.0": { - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": [ - "ansi-regex@6.1.0" - ] - }, - "style-mod@4.1.2": { - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" - }, - "supports-color@7.2.0": { - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": [ - "has-flag" - ] - }, - "test-exclude@7.0.1": { - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dependencies": [ - "@istanbuljs/schema", - "glob", - "minimatch" - ] - }, - "tinybench@2.9.0": { - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" - }, - "tinyexec@0.3.1": { - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==" - }, - "tinypool@1.0.2": { - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==" - }, - "tinyrainbow@1.2.0": { - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==" - }, - "tinyspy@3.0.2": { - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==" - }, - "typescript@5.7.2": { - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" - }, - "undici-types@6.20.0": { - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "vite-node@2.1.8_@types+node@22.10.1": { - "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", - "dependencies": [ - "cac", - "debug", - "es-module-lexer", - "pathe", - "vite" - ] - }, - "vite@5.4.11_@types+node@22.10.1": { - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dependencies": [ - "@types/node", - "esbuild", - "fsevents", - "postcss", - "rollup" - ] - }, - "vitest@2.1.8_@types+node@22.10.1_vite@5.4.11__@types+node@22.10.1": { - "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", - "dependencies": [ - "@types/node", - "@vitest/expect", - "@vitest/mocker", - "@vitest/pretty-format", - "@vitest/runner", - "@vitest/snapshot", - "@vitest/spy", - "@vitest/utils", - "chai", - "debug", - "expect-type", - "magic-string", - "pathe", - "std-env", - "tinybench", - "tinyexec", - "tinypool", - "tinyrainbow", - "vite", - "vite-node", - "why-is-node-running" - ] - }, - "w3c-keyname@2.2.8": { - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, - "which@2.0.2": { - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": [ - "isexe" - ] - }, - "why-is-node-running@2.3.0": { - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dependencies": [ - "siginfo", - "stackback" - ] - }, - "wrap-ansi@7.0.0": { - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": [ - "ansi-styles@4.3.0", - "string-width@4.2.3", - "strip-ansi@6.0.1" - ] - }, - "wrap-ansi@8.1.0": { - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": [ - "ansi-styles@6.2.1", - "string-width@5.1.2", - "strip-ansi@7.1.0" - ] - } - }, - "workspace": { - "packageJson": { - "dependencies": [ - "npm:@babel/code-frame@^7.26.2", - "npm:@codemirror/lang-javascript@^6.2.2", - "npm:@eslint/js@^9.11.1", - "npm:@types/babel__code-frame@^7.0.6", - "npm:@types/json-stable-stringify@^1.1.0", - "npm:@types/node@^22.10.2", - "npm:@types/react-dom@^19.0.2", - "npm:@types/react@^19.0.2", - "npm:@uiw/codemirror-theme-abcdef@^4.23.7", - "npm:@uiw/react-codemirror@^4.23.7", - "npm:@vitejs/plugin-react@^4.3.4", - "npm:@vitest/coverage-v8@^2.1.8", - "npm:eslint-plugin-react-hooks@^5.1.0", - "npm:eslint-plugin-react-refresh@~0.4.16", - "npm:eslint@^9.17.0", -<<<<<<< HEAD - "npm:globals@^15.13.0", - "npm:ignore@^6.0.2", -======= - "npm:globals@^15.14.0", ->>>>>>> main - "npm:index-to-position@1", - "npm:json-stable-stringify@^1.2.1", - "npm:json-stringify-pretty-compact@4", - "npm:prettier@^3.4.2", - "npm:react-dom@19", - "npm:react-router-dom@^7.1.1", - "npm:react@19", - "npm:typescript-eslint@^8.18.2", - "npm:typescript@^5.5.3", - "npm:vite@^6.0.5", - "npm:vitest@^2.1.5" - ] - } - } -} diff --git a/rtsc/compile-all.ts b/rtsc/compile-all.ts index 9055631..0116ef4 100644 --- a/rtsc/compile-all.ts +++ b/rtsc/compile-all.ts @@ -10,10 +10,6 @@ import { core_patterns } from "../src/syntax-core-patterns.ts"; import { parse } from "../src/parse.ts"; import { assert } from "../src/assert.ts"; -const globals = get_globals("es2024.full"); -const patterns = core_patterns(parse); -const library_manager = new LibraryManager(patterns, globals, ["es2024.full"]); - class DirWatcher { private fswatcher: FSWatcher; constructor(fswatcher: FSWatcher) { @@ -75,9 +71,22 @@ class WatchFS { } } -function check_path(path: string) { - assert(path.endsWith(".rts")); - library_manager.ensureUpToDate(path); +const globals = get_globals("es2024.full"); +const patterns = core_patterns(parse); +const library_manager = new LibraryManager(patterns, globals, ["es2024.full"], { + watchFile(path, callback) { + const watcher = { + close() {}, + }; + return watcher; + }, +}); + +function check_path(rts_file: string) { + assert(rts_file.endsWith(".rts")); + library_manager + .findPackage(rts_file) + .then(([pkg, rel]) => library_manager.ensureUpToDate(pkg, rel, rts_file)); //const suffix = ".rts"; //if (path.endsWith(suffix)) { // const module_dir = dirname(path); diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index f47a3b3..d6c3b2a 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./files.test.ts","./generate-stdlibs.test.ts","./vite.config.ts","./vitest.config.ts","./rtsc/compile-all.ts","./rtsc/watch.ts","./src/assert.ts","./src/ast.ts","./src/data.ts","./src/expander.ts","./src/fs-helpers.ts","./src/generate-stdlibs.ts","./src/generated-stdlibs.ts","./src/global-module.ts","./src/library-manager.ts","./src/llhelpers.ts","./src/parse-dts.ts","./src/parse.ts","./src/pprint.ts","./src/preexpand-handlers.ts","./src/preexpand-helpers.ts","./src/proxy-code.ts","./src/serialize.ts","./src/stx-error.ts","./src/stx.ts","./src/syntax-core-patterns.ts","./src/syntax-structures.ts","./src/tags.ts","./src/zipper.ts","./test-project/index.ts","./test-project/main.rts.ts","./test-project/mod.rts.ts","./ui/astvis.tsx","./ui/app.tsx","./ui/editor.tsx","./ui/main.tsx","./ui/vite-env.d.ts"],"errors":true,"version":"5.7.2"} \ No newline at end of file +{"root":["./files.test.ts","./generate-stdlibs.test.ts","./vite.config.ts","./vitest.config.ts","./rtsc/compile-all.ts","./rtsc/watch.ts","./src/assert.ts","./src/ast.ts","./src/data.ts","./src/expander.ts","./src/fs-helpers.ts","./src/generate-stdlibs.ts","./src/generated-stdlibs.ts","./src/global-module.ts","./src/library-manager.ts","./src/llhelpers.ts","./src/parse-dts.ts","./src/parse.ts","./src/pprint.ts","./src/preexpand-handlers.ts","./src/preexpand-helpers.ts","./src/proxy-code.ts","./src/serialize.ts","./src/stx-error.ts","./src/stx.ts","./src/syntax-core-patterns.ts","./src/syntax-structures.ts","./src/tags.ts","./src/zipper.ts","./test-project/index.ts","./test-project/main.rts.ts","./test-project/mod.rts.ts","./ui/astvis.tsx","./ui/app.tsx","./ui/editor.tsx","./ui/main.tsx","./ui/vite-env.d.ts"],"version":"5.7.2"} \ No newline at end of file From 8798cb31f53045ff065ab15eafa3ee027a78f969 Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Thu, 26 Dec 2024 06:39:24 +0300 Subject: [PATCH 4/5] file watchers now work and force recompilation correctly --- rtsc/compile-all.ts | 57 ++++++++++++++++++++++++++++++++---------- src/library-manager.ts | 6 ++--- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/rtsc/compile-all.ts b/rtsc/compile-all.ts index 0116ef4..4b9fe96 100644 --- a/rtsc/compile-all.ts +++ b/rtsc/compile-all.ts @@ -1,4 +1,4 @@ -import { FSWatcher, watch } from "node:fs"; +import { watch } from "node:fs"; import fs from "node:fs/promises"; import process from "node:process"; import path, { basename, dirname, join } from "node:path"; @@ -11,9 +11,27 @@ import { parse } from "../src/parse.ts"; import { assert } from "../src/assert.ts"; class DirWatcher { - private fswatcher: FSWatcher; - constructor(fswatcher: FSWatcher) { - this.fswatcher = fswatcher; + private dir: string; + private callbacks: { [filename: string]: (path: string) => void } = {}; + public onEvent: ((file: string) => void) | undefined = undefined; + constructor(dir: string) { + this.dir = dir; + } + watchFile(path: string, callback: (path: string) => void): { close(): void } { + assert(dirname(path) === this.dir); + const filename = basename(path); + assert(!this.callbacks[filename], `multiple watches for same path '${path}'`); + this.callbacks[filename] = callback; + return { + close() { + throw new Error(`close is not yet done`); + }, + }; + } + processEvent(event: "rename" | "change", file: string) { + this.onEvent?.(file); + const callback = this.callbacks[file]; + if (callback) callback(join(this.dir, file)); } } @@ -25,6 +43,24 @@ class WatchFS { this.init(); } + watchFile(path: string, callback: (path: string) => void): { close(): void } { + const dir = dirname(path); + const watcher = this.get_or_create_watcher(dir); + return watcher.watchFile(path, callback); + } + + private get_or_create_watcher(abspath: string): DirWatcher { + const existing = this.dir_watchers[abspath]; + if (existing) return existing; + const fswatcher = watch(abspath, { encoding: "utf8", recursive: false }, (event, file) => { + assert(file !== null); + watcher.processEvent(event, file); + }); + const watcher = new DirWatcher(abspath); + this.dir_watchers[abspath] = watcher; + return watcher; + } + private async init() { const gitignore_content = await fs.readFile(".gitignore", { encoding: "utf8" }); const ig = ignore().add(gitignore_content).add("/.git"); @@ -57,11 +93,9 @@ class WatchFS { }; const seed_dir = async (relpath: string, abspath: string) => { - const fswatcher = watch(abspath, { encoding: "utf8", recursive: false }, (event, file) => { - console.log(`watch ${event} ${file} in ${abspath}`); - if (file !== null) check_file(file, relpath, abspath); - }); - this.dir_watchers[abspath] = new DirWatcher(fswatcher); + const watcher = this.get_or_create_watcher(abspath); + assert(!watcher.onEvent); + watcher.onEvent = (file) => check_file(file, relpath, abspath); fs.readdir(relpath).then((files) => files.forEach((file) => check_file(file, relpath, abspath)), ); @@ -75,10 +109,7 @@ const globals = get_globals("es2024.full"); const patterns = core_patterns(parse); const library_manager = new LibraryManager(patterns, globals, ["es2024.full"], { watchFile(path, callback) { - const watcher = { - close() {}, - }; - return watcher; + return FS.watchFile(path, callback); }, }); diff --git a/src/library-manager.ts b/src/library-manager.ts index e46fdd0..c320e33 100644 --- a/src/library-manager.ts +++ b/src/library-manager.ts @@ -191,8 +191,8 @@ abstract class Module implements imported_module { (x) => (x.dependant_modules = x.dependant_modules.filter((x) => x !== this)), ); this.imported_modules = []; - dependant_modules.forEach((x) => x.force_recompile()); - this.ensureUpToDate(); + await Promise.all(dependant_modules.map((x) => x.force_recompile())); + await this.ensureUpToDate(); } async file_changed(): Promise { @@ -202,7 +202,7 @@ abstract class Module implements imported_module { switch (state.type) { case "fresh": { if (t && t > state.mtime) { - this.force_recompile(); + await this.force_recompile(); } return; } From 2fd4234b90cbfdee37cb8be911c9ab4c29d1ef5e Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Thu, 26 Dec 2024 06:52:23 +0300 Subject: [PATCH 5/5] cleanup --- rtsc/compile-all.ts | 32 ++++++++++---------------------- src/parse-dts.ts | 1 - 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/rtsc/compile-all.ts b/rtsc/compile-all.ts index 4b9fe96..48b271e 100644 --- a/rtsc/compile-all.ts +++ b/rtsc/compile-all.ts @@ -22,13 +22,14 @@ class DirWatcher { const filename = basename(path); assert(!this.callbacks[filename], `multiple watches for same path '${path}'`); this.callbacks[filename] = callback; - return { - close() { - throw new Error(`close is not yet done`); - }, + const close = () => { + assert(this.callbacks[filename] !== undefined, `no callback registered`); + assert(this.callbacks[filename] === callback, `closing wrong watch`); + delete this.callbacks[filename]; }; + return { close }; } - processEvent(event: "rename" | "change", file: string) { + processEvent(file: string) { this.onEvent?.(file); const callback = this.callbacks[file]; if (callback) callback(join(this.dir, file)); @@ -52,12 +53,12 @@ class WatchFS { private get_or_create_watcher(abspath: string): DirWatcher { const existing = this.dir_watchers[abspath]; if (existing) return existing; - const fswatcher = watch(abspath, { encoding: "utf8", recursive: false }, (event, file) => { - assert(file !== null); - watcher.processEvent(event, file); - }); const watcher = new DirWatcher(abspath); this.dir_watchers[abspath] = watcher; + watch(abspath, { encoding: "utf8", recursive: false }, (_event, file) => { + assert(file !== null); + watcher.processEvent(file); + }); return watcher; } @@ -118,19 +119,6 @@ function check_path(rts_file: string) { library_manager .findPackage(rts_file) .then(([pkg, rel]) => library_manager.ensureUpToDate(pkg, rel, rts_file)); - //const suffix = ".rts"; - //if (path.endsWith(suffix)) { - // const module_dir = dirname(path); - // const module_name = basename(path, suffix) + ".rts"; - // const rts_file = join(module_dir, module_name); - // fs.stat(rts_file).then((stats) => { - // library_manager.ensureUpToDate(rts_file); - // }); - //} } const FS = new WatchFS(check_path); - -//console.log(path.relative("/x/a/b/c", "/x/a/b2/c2")); - -//const watcher = watch(".", {}, (event, filename) => console.log({ event, filename })); diff --git a/src/parse-dts.ts b/src/parse-dts.ts index 531a36f..8f683e8 100644 --- a/src/parse-dts.ts +++ b/src/parse-dts.ts @@ -299,7 +299,6 @@ function parse_statements(statements: TS.NodeArray, path: string): } export function parse_dts(code: string, my_path: string, full_path: string): ts_exports { - console.log(`parsing ${full_path}`); const options: TS.CreateSourceFileOptions = { languageVersion: TS.ScriptTarget.ESNext, jsDocParsingMode: TS.JSDocParsingMode.ParseNone,