From 8cee40fb5dc34ef17c54e511340dc01662e1dc0a Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 20 Aug 2026 19:28:25 +0300 Subject: [PATCH 01/28] refactor(SOF-8032): rework Job against esse's flattened job schema, make it generic esse's job/base.json and system/job-extended.json are gone (folded into a single flat `job` schema); ExtendedJobSchema no longer exists. Point @mat3ra/esse at the WIP tarball with that change and rework Job to match: - Add scripts/generate-mixins.ts (mirrors wode's), generating JobSchemaMixin straight from esse's `job` schema with skipFields for the keys owned by NamedEntity/Defaultable/etc (_id, slug, systemName, schemaVersion, name, isDefault, metadata) - replaces the hand-written mixin and its ExtendedJobSchema-based ConflictingKeys Omit hack. statusTrack, dataset, _materials/_materialsSet, purged/purgedAt now come through automatically since esse's `job` schema already merges them. - Make Job generic (ade/wode-style), so a host app (e.g. web-app's upcoming CoreJob) can extend it with a narrower schema. JobEntity is esse's own JobSchema (not the Omit-restricted mixin type) plus two client-only fields, material/materials, that hold live @mat3ra/made instances instead of the persisted _material/_materials references - as plain instance properties (like _workflow), never routed through _json: _json only ever holds esse-schema-defined data. - Drop isEntitySet handling entirely - Job always initializes its workflow instance now. Entity-set variants get their own class in web-app (same split as CoreWorkflow/CoreWorkflowSet), not a runtime branch in the shared base class. - Point @mat3ra/ide at wip-a02d972 (generic ComputedEntityMixin - see that repo's SOF-8032 commit) and drop the `compute: EsseJobSchema["compute"]` own-member override + its TODO in favor of ComputedEntityMixin. - Restore render()'s scopeGlobal param; material/materials (and the factory helper's material param) are typed as wode's OrderedMaterial directly, no cast at the render() call site. - setMaterial/setMaterials/setParent no longer need `as unknown as {getAsEntityReference?}` casts - Material/Job already extend InMemoryEntity, which has it natively. - Throughout, prefer the mixin's own this. accessors (this.parent, this._material, this.workflow, this.dataset, ...) over this._json.. - Drop the hand-rolled statusTrack/statusCls-adjacent duplicate accessors now covered by the generated mixin; keep the derived helpers (statusTrackSorted, submittedTimestamp, ...) guarding against undefined. - Removed the CJS/ESM interop dance around the WodeWorkflow default import (`(WodeWorkflowDefault as any).default ?? WodeWorkflowDefault`) - jove's own Vite-bundled standalone entry does a plain default import of the same module and calls `new Workflow(json)` directly with no such handling, and nothing else in wode/jove/job-designer does this anywhere. Not run through eslint - `eslint` was never added as a devDependency in this repo (CI itself passes skip-eslint: true for the same reason), so `lint`/`lint:fix`/the husky pre-commit hook's lint-staged step fail with ENOENT here regardless of this change; not fixing that dependency gap in this commit (pulling in @exabyte-io/eslint-config's ~13 peers is a separate, larger change - same conclusion reached independently for ide). Verified: `tsc --noEmit` clean, `npm ci` in sync with package-lock.json, `npm test` 21/21 passing. --- package-lock.json | 382 +---------------------------- package.json | 6 +- scripts/generate-mixins.ts | 38 +++ src/js/Job.ts | 183 +++++--------- src/js/generated/JobSchemaMixin.ts | 317 +++++++++--------------- src/js/index.ts | 8 +- src/js/utils.ts | 13 +- tests/js/Job.test.ts | 42 +++- 8 files changed, 275 insertions(+), 714 deletions(-) create mode 100644 scripts/generate-mixins.ts diff --git a/package-lock.json b/package-lock.json index 7265ea5..90c5ad9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "devDependencies": { "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "2026.8.18-2", - "@mat3ra/ide": "2026.8.18-0", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-a02d972/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", @@ -23,6 +23,7 @@ "@mat3ra/tsconfig": "^2024.6.3-0", "@mat3ra/utils": "https://github.com/mat3ra/utils/releases/download/wip-9a19d0d/utils.tgz", "@mat3ra/wode": "2026.8.18-0", + "@types/json-schema": "^7.0.15", "@types/mocha": "^10.0.1", "@types/node": "^20.11.30", "chai": "^4.3.4", @@ -3034,9 +3035,9 @@ } }, "node_modules/@mat3ra/esse": { - "version": "2026.8.18-2", - "resolved": "https://registry.npmjs.org/@mat3ra/esse/-/esse-2026.8.18-2.tgz", - "integrity": "sha512-SMkofrqu/P5EKwTkgpi1Q5Mxfca6ZIvhWEK+YeUJDqu203+Z6plAaKx4N4xWFEt91jzNI5Slml/EFiaoVbiFzw==", + "version": "0.0.0", + "resolved": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", + "integrity": "sha512-WukN5ozJcKkYMUkpBtoJwjl+5urXrmJeqIPHI2o8VKuIuBrIZv0xpfYTihFDdfbdy+V/j8lWPKYhNn/jr869pA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3571,21 +3572,12 @@ } }, "node_modules/@mat3ra/ide": { - "version": "2026.8.18-0", - "resolved": "https://registry.npmjs.org/@mat3ra/ide/-/ide-2026.8.18-0.tgz", - "integrity": "sha512-xbV7KlxtFer+ailbZJwTbZttcjSLtIgw4BuQLFt+2VCAki67ojazbHqNAPCV1E0xxMQ+7X6NACOK8vA8ySjukw==", + "version": "0.0.0", + "resolved": "https://github.com/mat3ra/ide/releases/download/wip-a02d972/ide.tgz", + "integrity": "sha512-xAJrN/h4av+uDDh6xmeCsoUYVP7OKtDE3fRRxdYgonBnZHuRn6nsZhUWpdzkyiG5E/+E6v1NNPmYWlr+BUaasQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@babel/cli": "7.16.0", - "@babel/core": "7.16.0", - "@babel/eslint-parser": "7.16.3", - "@babel/plugin-proposal-class-properties": "7.16.0", - "@babel/preset-env": "7.16.4", - "@babel/preset-react": "7.16.7", - "@babel/register": "^7.16.0", - "@babel/runtime-corejs3": "7.16.8", - "chai": "^4.3.4", "moment": "^2.17.1", "pluralize": "^3.0.0" }, @@ -3597,362 +3589,6 @@ "@mat3ra/esse": "*" } }, - "node_modules/@mat3ra/ide/node_modules/@babel/cli": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.16.0.tgz", - "integrity": "sha512-WLrM42vKX/4atIoQB+eb0ovUof53UUvecb4qGjU2PDDWRiZr50ZpiV8NpcLo7iSxeGYrRG0Mqembsa+UrTAV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/eslint-parser": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.3.tgz", - "integrity": "sha512-iB4ElZT0jAt7PKVaeVulOECdGe6UnmA/O0P9jlF5g5GBOwDVbna8AXhHRu4s27xQf6OkveyA8iTDv1jHdDejgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.0", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.19.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/preset-react": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", - "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/@babel/runtime-corejs3": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", - "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mat3ra/ide/node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", - "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.18.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@mat3ra/ide/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@mat3ra/ide/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mat3ra/ide/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@mat3ra/ide/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@mat3ra/made": { "version": "2026.8.18-0", "resolved": "https://registry.npmjs.org/@mat3ra/made/-/made-2026.8.18-0.tgz", diff --git a/package.json b/package.json index 06d3e82..5d13de2 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "lint": "eslint src/js tests/js && prettier --write src/js tests/js", "lint:fix": "eslint --fix --cache src/js tests/js && prettier --write src/js tests/js", "transpile": "tsc -p tsconfig-transpile.json", + "generate-mixins": "ts-node scripts/generate-mixins.ts", "prettier": "prettier --check src/js tests/js", "prepare": "husky install || exit 0", "prepublishOnly": "npm run transpile" @@ -41,8 +42,8 @@ "devDependencies": { "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "2026.8.18-2", - "@mat3ra/ide": "2026.8.18-0", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-a02d972/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", @@ -50,6 +51,7 @@ "@mat3ra/tsconfig": "^2024.6.3-0", "@mat3ra/utils": "https://github.com/mat3ra/utils/releases/download/wip-9a19d0d/utils.tgz", "@mat3ra/wode": "2026.8.18-0", + "@types/json-schema": "^7.0.15", "@types/mocha": "^10.0.1", "@types/node": "^20.11.30", "chai": "^4.3.4", diff --git a/scripts/generate-mixins.ts b/scripts/generate-mixins.ts new file mode 100644 index 0000000..ae222d6 --- /dev/null +++ b/scripts/generate-mixins.ts @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +/** + * Script to generate mixin properties from JSON schema + * + * Usage: + * npx ts-node scripts/generate-mixins.ts + */ + +import generateSchemaMixin from "@mat3ra/code/dist/js/generateSchemaMixin"; +import allSchemas from "@mat3ra/esse/dist/js/schemas.json"; +import type { JSONSchema7 } from "json-schema"; + +/** + * Fields already provided by InMemoryEntity / NamedInMemoryEntity / DefaultableMixin + * (via the `job` schema's `named_defaultable_has_metadata` composition) - skipped so + * the generated mixin does not redeclare them. + */ +const SKIP_FIELDS = ["_id", "slug", "systemName", "schemaVersion", "name", "isDefault", "metadata"]; + +/** + * Output file paths for each schema + */ +const OUTPUT_PATHS = { + job: "src/js/generated/JobSchemaMixin.ts", +}; + +function main() { + // Type assertion to handle schema compatibility - the schemas from esse may have slightly different types + const result = generateSchemaMixin(allSchemas as JSONSchema7[], OUTPUT_PATHS, SKIP_FIELDS); + + if (result.errorCount > 0) { + process.exit(1); + } +} + +// Run the script if it's executed directly +main(); diff --git a/src/js/Job.ts b/src/js/Job.ts index 9322dcb..c1f2b08 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -16,32 +16,15 @@ import { namedEntityMixin, } from "@mat3ra/code/dist/js/entity/mixins/NamedEntityMixin"; import { Taggable, taggableMixin } from "@mat3ra/code/dist/js/entity/mixins/TaggableMixin"; -import type { AnyObject } from "@mat3ra/esse/dist/js/esse/types"; -import type { - JobSchema as EsseJobSchema, - ExtendedJobSchema, -} from "@mat3ra/esse/dist/js/types"; +import type { JobSchema as EsseJobSchema } from "@mat3ra/esse/dist/js/types"; import { ComputedEntityMixin, computedEntityMixin } from "@mat3ra/ide/dist/js/compute"; -import type { Material } from "@mat3ra/made"; -import type WodeWorkflowType from "@mat3ra/wode/dist/js/Workflow"; +import type { OrderedMaterial } from "@mat3ra/wode"; +import WodeWorkflow from "@mat3ra/wode/dist/js/Workflow"; import { defaultDataset } from "./dataset"; import { JOB_FINAL_STATUS_LIST, JobStatus } from "./enums"; import { type JobSchemaMixin, jobSchemaMixin } from "./generated/JobSchemaMixin"; -// Static import for ESM compatibility (Vite/browser). Vite handles CJS→ESM -// interop for Workflow.js so the default export is the Workflow class. -import WodeWorkflowDefault from "@mat3ra/wode/dist/js/Workflow"; -// Normalise: when bundled as CJS, __esModule interop may nest under .default. -const WodeWorkflow = ((WodeWorkflowDefault as any).default ?? - WodeWorkflowDefault) as typeof WodeWorkflowType; - -/** - * Combined Job schema type from ESSE base + extended schemas. - * Uses Partial because not all fields are present at construction time. - */ -export type JobSchema = Partial & Partial & AnyObject; - /** * A minimal entity reference — contains at least an `_id` to identify the entity. */ @@ -50,17 +33,17 @@ export interface EntityReference { [key: string]: unknown; } -interface Job - extends Defaultable, +export type JobEntity = EsseJobSchema; + +interface Job + extends + Defaultable, NamedEntity, JobSchemaMixin, Taggable, HashedEntity, - ComputedEntityMixin, - HasDescription { - // TODO: fix ComputedEntityMixin and remove this - compute: EsseJobSchema["compute"]; -} + ComputedEntityMixin, + HasDescription {} /** * Job — core non-visual model for a computational job. @@ -69,47 +52,44 @@ interface Job * standalone packages (jove, job-designer) as well as in the web-app, * where a host-level subclass may extend it with persistence and routing. */ -class Job extends InMemoryEntity { - declare _json: JobSchema & AnyObject; +class Job extends InMemoryEntity { + _workflow?: WodeWorkflow; - _workflow?: WodeWorkflowType; + /** Live material instance(s) - not part of the esse schema, never in `_json`/`toJSON`. */ + material?: OrderedMaterial; - constructor(config: JobSchema) { - super({ ...(config as AnyObject), _materialsSet: config._materialsSet || undefined }); + materials?: OrderedMaterial[]; - this._json.dataset = this._json.dataset || defaultDataset; + constructor(config: NoInfer) { + super({ ...config, _materialsSet: config._materialsSet || undefined }); - if (!this._json.isEntitySet) { - this.initialize(); - } + this.dataset = this.dataset || defaultDataset; + this.initialize(); } /** * Initializes derived state (workflow instance, material references) from raw JSON. */ initialize(): void { - if (this._json.isEntitySet) return; - - if (this._json.workflow) { + const workflow = this.prop("workflow"); + if (workflow) { // eslint-disable-next-line @typescript-eslint/no-explicit-any - this._workflow = new WodeWorkflow(this._json.workflow as any); + this._workflow = new WodeWorkflow(workflow as any); } } - setProps(json: AnyObject): this { + setProps(json: Partial): this { super.setProps(json); - - if (!this._json.isEntitySet) { - this.initialize(); - } + this.initialize(); return this; } - toJSON(): JobSchema & AnyObject { + toJSON(): S { return { - ...(super.toJSON() as AnyObject), - workflow: this._workflow?.toJSON(), + ...super.toJSON(), + // eslint-disable-next-line @typescript-eslint/no-explicit-any + workflow: this._workflow?.toJSON() as any, }; } @@ -117,7 +97,7 @@ class Job extends InMemoryEntity { * Renders the workflow with the given material context. * Only valid when the job has a workflow and at least one material. */ - render(): void { + render(scopeGlobal?: Record): void { const material = this.material || this.materials?.[0]; if (!material) { throw new Error("Job must have a material and materials"); @@ -125,13 +105,12 @@ class Job extends InMemoryEntity { if (!this._workflow) { throw new Error("Workflow not found"); } - // render() is typed against OrderedMaterial in wode; we cast to any for flexibility. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (this._workflow as any).render({ + this._workflow.render({ material, materials: this.materials || [material], materialsSet: this.materialsSet, jobHasParent: Boolean(this.parent), + scopeGlobal, }); } @@ -145,7 +124,7 @@ class Job extends InMemoryEntity { [JobStatus.finished]: "success", [JobStatus.error]: "error", }; - return colors[(this.status as string) ?? ""] || "default"; + return colors[this.status] || "default"; } /** @@ -176,39 +155,33 @@ class Job extends InMemoryEntity { } // ─── Status Track ──────────────────────────────────────────────────────────── - - get statusTrack(): Array<{ status: string; trackedAt: number }> { - return this.prop("statusTrack", []) as Array<{ status: string; trackedAt: number }>; - } + // `statusTrack` itself is provided by the generated `jobSchemaMixin`. /** Status track items in chronological order. */ - get statusTrackSorted(): Array<{ status: string; trackedAt: number }> { - return [...this.statusTrack].sort((a, b) => a.trackedAt - b.trackedAt); + get statusTrackSorted() { + return [...(this.statusTrack ?? [])].sort((a, b) => a.trackedAt - b.trackedAt); } - get submittedTimestamp(): { status: string; trackedAt: number } | undefined { - return this.statusTrack.find((s) => s.status === JobStatus.submitted); + get submittedTimestamp() { + return this.statusTrack?.find((s) => s.status === JobStatus.submitted); } - get activeTimestamp(): { status: string; trackedAt: number } | undefined { - return this.statusTrack.find((s) => s.status === JobStatus.active); + get activeTimestamp() { + return this.statusTrack?.find((s) => s.status === JobStatus.active); } - get finalTimestamp(): { status: string; trackedAt: number } | undefined { - return JOB_FINAL_STATUS_LIST.reduce( - (result: { status: string; trackedAt: number } | undefined, status) => { - if (result) return result; - return this.statusTrack.find((s) => s.status === status); - }, - undefined, - ); + get finalTimestamp() { + for (const status of JOB_FINAL_STATUS_LIST) { + const entry = this.statusTrack?.find((s) => s.status === status); + if (entry) return entry; + } + return undefined; } get hasBeenActiveMoreThanOnce(): boolean { return Boolean( - this.statusTrack - .map((o) => o.status) - .filter((s) => s === JobStatus.active).length > 1, + (this.statusTrack ?? []).map((o) => o.status).filter((s) => s === JobStatus.active) + .length > 1, ); } @@ -217,59 +190,40 @@ class Job extends InMemoryEntity { /** * Sets the primary material for this job. */ - setMaterial(material: Material): void { - this.setProp("material", material); - const reference = ( - material as unknown as { getAsEntityReference?: () => EntityReference } - ).getAsEntityReference?.(); - if (reference) { - this._json._material = reference; - } + setMaterial(material: OrderedMaterial): void { + this.material = material; + this._material = material.getAsEntityReference(); } /** * Sets multiple materials for a multi-material job. */ - setMaterials(materials: Material[] = []): void { - this.setProp("materials", materials); - const references = materials.map( - (m) => - ( - m as unknown as { getAsEntityReference?: () => EntityReference } - ).getAsEntityReference?.() ?? - ({ _id: (m as unknown as { _id?: string })._id ?? "" } as EntityReference), - ); - this._json._materials = references; - } - - get material(): Material | undefined { - return this.prop("material") as Material | undefined; - } - - get materials(): Material[] | undefined { - return this.prop("materials") as Material[] | undefined; + setMaterials(materials: OrderedMaterial[] = []): void { + this.materials = materials; + this._materials = materials.map((m) => m.getAsEntityReference()); } setMaterialsSet(materialsSet: EntityReference | undefined): void { - this.setProp("_materialsSet", materialsSet || undefined); + this._materialsSet = materialsSet || undefined; } get materialsSet(): EntityReference | undefined { - return this.prop("_materialsSet") as EntityReference | undefined; + return this.prop("_materialsSet"); } // ─── Workflow ──────────────────────────────────────────────────────────────── - get workflowInstance(): WodeWorkflowType { + get workflowInstance(): WodeWorkflow { if (!this._workflow) { throw new Error("Workflow not found"); } return this._workflow; } - setWorkflow(workflowInstance: WodeWorkflowType): void { + setWorkflow(workflowInstance: WodeWorkflow): void { this._workflow = workflowInstance; - this._json.workflow = this._workflow.toJSON() as unknown as JobSchema["workflow"]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.workflow = this._workflow.toJSON() as any; } get usedApplicationNames(): string[] { @@ -279,27 +233,24 @@ class Job extends InMemoryEntity { // ─── Parent ───────────────────────────────────────────────────────────────── setParent(parentJob: Job): void { - const reference = ( - parentJob as unknown as { getAsEntityReference?: () => EntityReference } - ).getAsEntityReference?.(); - if (reference) { - this._json.parent = reference; - } + this.parent = parentJob.getAsEntityReference(); } unsetParent(): void { - delete this._json.parent; + this.unsetProp("parent"); } // ─── Factory ───────────────────────────────────────────────────────────────── /** * Creates a new Job with sensible defaults for a given workflow and material. + * `extraConfig` is expected to supply the remaining required fields (`_project`, + * `compute`) that this host-agnostic factory cannot default on its own. */ static createFromWorkflow( - workflow: WodeWorkflowType, - material: Material | Material[], - extraConfig: Partial = {}, + workflow: WodeWorkflow, + material: OrderedMaterial | OrderedMaterial[], + extraConfig: Partial = {}, ): Job { const singleMaterial = Array.isArray(material) ? material[0] : material; const job = new Job({ @@ -310,7 +261,7 @@ class Job extends InMemoryEntity { workflow: workflow._json as any, dataset: defaultDataset, ...extraConfig, - }); + } as JobEntity); if (workflow.isMultiMaterial) { job.setMaterials(Array.isArray(material) ? material : [material]); diff --git a/src/js/generated/JobSchemaMixin.ts b/src/js/generated/JobSchemaMixin.ts index 6f9d643..b7a249d 100644 --- a/src/js/generated/JobSchemaMixin.ts +++ b/src/js/generated/JobSchemaMixin.ts @@ -1,208 +1,121 @@ import type { InMemoryEntity } from "@mat3ra/code/dist/js/entity"; -import type { ExtendedJobSchema } from "@mat3ra/esse/dist/js/types"; +import type { BaseInMemoryEntitySchema, JobSchema } from "@mat3ra/esse/dist/js/types"; -// Combined schema (esse's base JobSchema + ExtendedJobSchema), not esse's raw -// JobSchema alone - some fields below (mode, isExternal, _materials, ...) only -// exist on ExtendedJobSchema. -import type { JobSchema } from "../Job"; +export type JobSchemaMixin = Omit< + JobSchema, + "_id" | "slug" | "systemName" | "schemaVersion" | "name" | "isDefault" | "metadata" +>; -/** - * Combined partial schema type for the Job mixin. Fields that conflict with - * InMemoryEntity / NamedInMemoryEntity (_id, slug, systemName, schemaVersion, - * name, isDefault, metadata) are omitted — they are already provided by the - * base class hierarchy. - */ -type ConflictingKeys = "_id" | "slug" | "systemName" | "schemaVersion" | "name" | "isDefault" | "metadata"; +export type JobInMemoryEntity = InMemoryEntity; -export type JobSchemaMixin = Omit, ConflictingKeys> & - Partial; - -export type JobInMemoryEntity = InMemoryEntity & JobSchemaMixin; - -export function jobSchemaMixin>( - item: InMemoryEntity, +export function jobSchemaMixin( + item: InMemoryEntity, ): asserts item is T & JobSchemaMixin { - Object.defineProperties(item, { - workflow: { - get(this: InMemoryEntity) { - return this.prop("workflow"); - }, - set(this: InMemoryEntity, value: JobSchema["workflow"]) { - this.setProp("workflow", value); - }, - configurable: true, - enumerable: true, - }, - compute: { - get(this: InMemoryEntity) { - return this.prop("compute"); - }, - set(this: InMemoryEntity, value: JobSchema["compute"]) { - this.setProp("compute", value); - }, - configurable: true, - enumerable: true, - }, - status: { - get(this: InMemoryEntity) { - return this.prop("status"); - }, - set(this: InMemoryEntity, value: JobSchema["status"]) { - this.setProp("status", value); - }, - configurable: true, - enumerable: true, - }, - rmsId: { - get(this: InMemoryEntity) { - return this.prop("rmsId"); - }, - set(this: InMemoryEntity, value: JobSchema["rmsId"]) { - this.setProp("rmsId", value); - }, - configurable: true, - enumerable: true, - }, - startTime: { - get(this: InMemoryEntity) { - return this.prop("startTime"); - }, - set(this: InMemoryEntity, value: JobSchema["startTime"]) { - this.setProp("startTime", value); - }, - configurable: true, - enumerable: true, - }, - workDir: { - get(this: InMemoryEntity) { - return this.prop("workDir"); - }, - set(this: InMemoryEntity, value: JobSchema["workDir"]) { - this.setProp("workDir", value); - }, - configurable: true, - enumerable: true, - }, - _project: { - get(this: InMemoryEntity) { - return this.prop("_project"); - }, - set(this: InMemoryEntity, value: JobSchema["_project"]) { - this.setProp("_project", value); - }, - configurable: true, - enumerable: true, - }, - _material: { - get(this: InMemoryEntity) { - return this.prop("_material"); - }, - set(this: InMemoryEntity, value: JobSchema["_material"]) { - this.setProp("_material", value); - }, - configurable: true, - enumerable: true, - }, - parent: { - get(this: InMemoryEntity) { - return this.prop("parent"); - }, - set(this: InMemoryEntity, value: JobSchema["parent"]) { - this.setProp("parent", value); - }, - configurable: true, - enumerable: true, - }, - runtimeContext: { - get(this: InMemoryEntity) { - return this.prop("runtimeContext"); - }, - set(this: InMemoryEntity, value: JobSchema["runtimeContext"]) { - this.setProp("runtimeContext", value); - }, - configurable: true, - enumerable: true, - }, - scopeTrack: { - get(this: InMemoryEntity) { - return this.prop("scopeTrack"); - }, - set(this: InMemoryEntity, value: JobSchema["scopeTrack"]) { - this.setProp("scopeTrack", value); - }, - configurable: true, - enumerable: true, - }, - // ExtendedJobSchema fields - mode: { - get(this: InMemoryEntity) { - return this.prop("mode"); - }, - set(this: InMemoryEntity, value: ExtendedJobSchema["mode"]) { - this.setProp("mode", value); - }, - configurable: true, - enumerable: true, - }, - isExternal: { - get(this: InMemoryEntity) { - return this.prop("isExternal"); - }, - set(this: InMemoryEntity, value: ExtendedJobSchema["isExternal"]) { - this.setProp("isExternal", value); - }, - configurable: true, - enumerable: true, - }, - _materials: { - get(this: InMemoryEntity) { - return this.prop("_materials"); - }, - set(this: InMemoryEntity, value: ExtendedJobSchema["_materials"]) { - this.setProp("_materials", value); - }, - configurable: true, - enumerable: true, - }, - _materialsSet: { - get(this: InMemoryEntity) { - return this.prop("_materialsSet"); - }, - set(this: InMemoryEntity, value: ExtendedJobSchema["_materialsSet"]) { - this.setProp("_materialsSet", value); - }, - configurable: true, - enumerable: true, - }, - purged: { - get(this: InMemoryEntity) { - return this.prop("purged"); - }, - set(this: InMemoryEntity, value: ExtendedJobSchema["purged"]) { - this.setProp("purged", value); - }, - configurable: true, - enumerable: true, - }, - purgedAt: { - get(this: InMemoryEntity) { - return this.prop("purgedAt"); - }, - set(this: InMemoryEntity, value: ExtendedJobSchema["purgedAt"]) { - this.setProp("purgedAt", value); - }, - configurable: true, - enumerable: true, - }, - dataset: { - get(this: InMemoryEntity) { - return this.prop("dataset"); - }, - set(this: InMemoryEntity, value: ExtendedJobSchema["dataset"]) { - this.setProp("dataset", value); - }, - configurable: true, - enumerable: true, - }, - }); + // @ts-expect-error + const properties: InMemoryEntity & JobSchemaMixin = { + get workflow() { + return this.requiredProp("workflow"); + }, + set workflow(value: JobSchema["workflow"]) { + this.setProp("workflow", value); + }, + get rmsId() { + return this.prop("rmsId"); + }, + set rmsId(value: JobSchema["rmsId"]) { + this.setProp("rmsId", value); + }, + get status() { + return this.requiredProp("status"); + }, + set status(value: JobSchema["status"]) { + this.setProp("status", value); + }, + get startTime() { + return this.prop("startTime"); + }, + set startTime(value: JobSchema["startTime"]) { + this.setProp("startTime", value); + }, + get workDir() { + return this.prop("workDir"); + }, + set workDir(value: JobSchema["workDir"]) { + this.setProp("workDir", value); + }, + get _project() { + return this.requiredProp("_project"); + }, + set _project(value: JobSchema["_project"]) { + this.setProp("_project", value); + }, + get _material() { + return this.prop("_material"); + }, + set _material(value: JobSchema["_material"]) { + this.setProp("_material", value); + }, + get _materials() { + return this.prop("_materials"); + }, + set _materials(value: JobSchema["_materials"]) { + this.setProp("_materials", value); + }, + get _materialsSet() { + return this.prop("_materialsSet"); + }, + set _materialsSet(value: JobSchema["_materialsSet"]) { + this.setProp("_materialsSet", value); + }, + get parent() { + return this.prop("parent"); + }, + set parent(value: JobSchema["parent"]) { + this.setProp("parent", value); + }, + get runtimeContext() { + return this.prop("runtimeContext"); + }, + set runtimeContext(value: JobSchema["runtimeContext"]) { + this.setProp("runtimeContext", value); + }, + get scopeTrack() { + return this.prop("scopeTrack"); + }, + set scopeTrack(value: JobSchema["scopeTrack"]) { + this.setProp("scopeTrack", value); + }, + get dataset() { + return this.prop("dataset"); + }, + set dataset(value: JobSchema["dataset"]) { + this.setProp("dataset", value); + }, + get purged() { + return this.prop("purged"); + }, + set purged(value: JobSchema["purged"]) { + this.setProp("purged", value); + }, + get purgedAt() { + return this.prop("purgedAt"); + }, + set purgedAt(value: JobSchema["purgedAt"]) { + this.setProp("purgedAt", value); + }, + get compute() { + return this.requiredProp("compute"); + }, + set compute(value: JobSchema["compute"]) { + this.setProp("compute", value); + }, + get statusTrack() { + return this.prop("statusTrack"); + }, + set statusTrack(value: JobSchema["statusTrack"]) { + this.setProp("statusTrack", value); + }, + }; + + Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties)); } diff --git a/src/js/index.ts b/src/js/index.ts index d4561a0..88f37cb 100644 --- a/src/js/index.ts +++ b/src/js/index.ts @@ -8,6 +8,10 @@ export { SINGLE_JOB_SUFFIX, TAB_NAVIGATION_CONFIG, } from "./enums"; -export { Job, type EntityReference, type JobSchema } from "./Job"; +export { Job, type EntityReference, type JobEntity } from "./Job"; export { type JobSchemaMixin } from "./generated/JobSchemaMixin"; -export { renderJinjaTemplate, renderConfigsFromJobMaterialsWorkflows, setJobNameBasedOnMaterials } from "./utils"; +export { + renderJinjaTemplate, + renderConfigsFromJobMaterialsWorkflows, + setJobNameBasedOnMaterials, +} from "./utils"; diff --git a/src/js/utils.ts b/src/js/utils.ts index cb11634..3e09f2d 100644 --- a/src/js/utils.ts +++ b/src/js/utils.ts @@ -1,5 +1,5 @@ import type { NamedInMemoryEntity } from "@mat3ra/code/dist/js/entity"; -import type { Material } from "@mat3ra/made"; +import type { OrderedMaterial } from "@mat3ra/wode"; // @ts-expect-error — swig does not have maintained TS types // Constraint: Swig is compiled on in-memory strings only. Do not use file-loading features // (like {% extends %}/{% include %}) in browser environments as fs polyfills are empty stubs. @@ -32,7 +32,7 @@ export function renderConfigsFromJobMaterialsWorkflows({ isMultiMaterial = false, }: { job: NamedJob; - materials: Material[]; + materials: OrderedMaterial[]; isMultiMaterial?: boolean; materialsSet?: object; }): ReturnType[] { @@ -50,18 +50,15 @@ export function renderConfigsFromJobMaterialsWorkflows({ } job.render(); - const { material: _material, materials: _materials, ...jobConfig } = job.toJSON(); - configs.push(jobConfig); + configs.push(job.toJSON()); } else { materials.forEach((material) => { job.setName(renderJinjaTemplate(originalName, { material })); job.setMaterial(material); job.render(); - const jobConfig = { ...job.toJSON() }; - delete jobConfig.materials; + const jobConfig = job.toJSON(); delete jobConfig._materials; - delete jobConfig.material; configs.push(jobConfig); }); } @@ -73,7 +70,7 @@ export function renderConfigsFromJobMaterialsWorkflows({ * Updates the job name to append or remove the per-material jinja suffix based on * whether the job is multi-material and how many materials are selected. */ -export function setJobNameBasedOnMaterials(job: NamedJob, materials: Material[]): void { +export function setJobNameBasedOnMaterials(job: NamedJob, materials: OrderedMaterial[]): void { const { isMultiMaterial } = job.workflow as Record; const hasMultipleMaterials = materials.length > 1; diff --git a/tests/js/Job.test.ts b/tests/js/Job.test.ts index 68bfe4e..d888989 100644 --- a/tests/js/Job.test.ts +++ b/tests/js/Job.test.ts @@ -1,7 +1,13 @@ import { expect } from "chai"; - -import { Job, type JobSchema } from "../../src/js/Job"; -import { JOB_FINAL_STATUS_LIST, JobStatus, JOB_STATUS_CLS, SINGLE_JOB_SUFFIX } from "../../src/js/enums"; +import type { OrderedMaterial } from "@mat3ra/wode"; + +import { Job, type JobEntity } from "../../src/js/Job"; +import { + JOB_FINAL_STATUS_LIST, + JobStatus, + JOB_STATUS_CLS, + SINGLE_JOB_SUFFIX, +} from "../../src/js/enums"; import { defaultDataset } from "../../src/js/dataset"; import { renderJinjaTemplate, setJobNameBasedOnMaterials } from "../../src/js/utils"; @@ -15,7 +21,7 @@ const minimalWorkflowJson = { workflows: [], }; -function makeJobConfig(overrides: Partial = {}): JobSchema { +function makeJobConfig(overrides: Partial = {}): JobEntity { return { name: "Test Job", status: JobStatus.pre_submission, @@ -23,7 +29,7 @@ function makeJobConfig(overrides: Partial = {}): JobSchema { workflow: minimalWorkflowJson, dataset: defaultDataset, ...overrides, - }; + } as JobEntity; } // ─── Tests ─────────────────────────────────────────────────────────────────── @@ -79,7 +85,10 @@ describe("Job", () => { it("reports isInFinalStatus = true for all terminal statuses", () => { for (const terminalStatus of JOB_FINAL_STATUS_LIST) { const job = new Job(makeJobConfig({ status: terminalStatus })); - expect(job.isInFinalStatus, `Expected ${terminalStatus} to be a final status`).to.equal(true); + expect( + job.isInFinalStatus, + `Expected ${terminalStatus} to be a final status`, + ).to.equal(true); } }); @@ -116,7 +125,10 @@ describe("Job", () => { }); it("throws when accessing .workflowInstance when no workflow is set", () => { - const job = new Job({ name: "No Workflow", status: JobStatus.pre_submission }); + const job = new Job({ + name: "No Workflow", + status: JobStatus.pre_submission, + } as JobEntity); expect(() => job.workflowInstance).to.throw("Workflow not found"); }); @@ -138,7 +150,11 @@ describe("Job", () => { const workflow = new WodeWorkflow(minimalWorkflowJson); // Use a plain object with minimum interface as a material stand-in - const mockMaterial = { _id: "mat-1", name: "Silicon" } as unknown as import("@mat3ra/made").Material; + const mockMaterial = { + _id: "mat-1", + name: "Silicon", + getAsEntityReference: () => ({ _id: "mat-1", cls: "Material" }), + } as unknown as OrderedMaterial; const job = Job.createFromWorkflow(workflow, mockMaterial); @@ -191,11 +207,15 @@ describe("setJobNameBasedOnMaterials", () => { it("appends jinja suffix when multi materials and no existing jinja pattern", () => { const WodeWorkflow = require("@mat3ra/wode/dist/js/Workflow").default; const workflow = new WodeWorkflow(minimalWorkflowJson); - const job = new Job({ name: "My Job", status: JobStatus.pre_submission, workflow: minimalWorkflowJson } as JobSchema); + const job = new Job({ + name: "My Job", + status: JobStatus.pre_submission, + workflow: minimalWorkflowJson, + } as unknown as JobEntity); job._workflow = workflow; const materials = [ - { _id: "1" } as unknown as import("@mat3ra/made").Material, - { _id: "2" } as unknown as import("@mat3ra/made").Material, + { _id: "1" } as unknown as OrderedMaterial, + { _id: "2" } as unknown as OrderedMaterial, ]; setJobNameBasedOnMaterials(job, materials); From 2e2c7d9bca819b3f065f6d21db414daa04be9742 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 20 Aug 2026 23:14:51 +0300 Subject: [PATCH 02/28] chore(SOF-8032): repin @mat3ra/ide to wip-d33453e (RMSNotificationsHandler cleanup, no behavior change) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 90c5ad9..97034f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-a02d972/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-d33453e/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", @@ -3573,8 +3573,8 @@ }, "node_modules/@mat3ra/ide": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/ide/releases/download/wip-a02d972/ide.tgz", - "integrity": "sha512-xAJrN/h4av+uDDh6xmeCsoUYVP7OKtDE3fRRxdYgonBnZHuRn6nsZhUWpdzkyiG5E/+E6v1NNPmYWlr+BUaasQ==", + "resolved": "https://github.com/mat3ra/ide/releases/download/wip-d33453e/ide.tgz", + "integrity": "sha512-Y18zFHOEhe73R2iqsnHdS9NjzHxiGVytkNj4fbHZNMk2SOy/F6XsdpkShzKQlNCpmyIHUnj/DEBaeVsfyCEbEA==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 5d13de2..b433a4f 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-a02d972/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-d33453e/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", From 9c9e4a6289ae51a131bf836cca0e84226dee9a95 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 00:00:59 +0300 Subject: [PATCH 03/28] chore(SOF-8032): repin @mat3ra/ide to wip-8db04e1 (computedEntityMixin now extends InMemoryEntity) --- package-lock.json | 920 +--------------------------------------------- package.json | 2 +- 2 files changed, 4 insertions(+), 918 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97034f2..9547429 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-d33453e/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-8db04e1/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", @@ -2410,113 +2410,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@exabyte-io/periodic-table.js": { "version": "2023.12.23-3", "resolved": "https://registry.npmjs.org/@exabyte-io/periodic-table.js/-/periodic-table.js-2023.12.23-3.tgz", @@ -2885,47 +2778,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -3573,8 +3425,8 @@ }, "node_modules/@mat3ra/ide": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/ide/releases/download/wip-d33453e/ide.tgz", - "integrity": "sha512-Y18zFHOEhe73R2iqsnHdS9NjzHxiGVytkNj4fbHZNMk2SOy/F6XsdpkShzKQlNCpmyIHUnj/DEBaeVsfyCEbEA==", + "resolved": "https://github.com/mat3ra/ide/releases/download/wip-8db04e1/ide.tgz", + "integrity": "sha512-2O46T3t8dnLBb3RjKUclwuWL9fpsqbT5QSc1Vr9+WTcyjaYssB9MIGammjzeF1KbyqhfT/3ZqKHq7yW0bhE/rQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4586,47 +4438,6 @@ "eslint-scope": "5.1.1" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.13.tgz", @@ -4806,14 +4617,6 @@ "dev": true, "license": "ISC" }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", - "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", - "dev": true, - "license": "ISC", - "peer": true - }, "node_modules/a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", @@ -4834,17 +4637,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/acorn-walk": { "version": "8.3.5", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", @@ -5351,17 +5143,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -5911,14 +5692,6 @@ "node": ">=6" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -5972,20 +5745,6 @@ "node": ">=0.3.1" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -6210,64 +5969,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -6292,221 +5993,6 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -6581,22 +6067,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/fast-uri": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", @@ -6614,31 +6084,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -6694,30 +6139,6 @@ "flat": "cli.js" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", - "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "dev": true, - "license": "ISC", - "peer": true - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -6969,23 +6390,6 @@ "node": ">= 6" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -7016,14 +6420,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -7164,46 +6560,6 @@ "url": "https://github.com/sponsors/typicode" } }, - "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", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -7580,17 +6936,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -7872,14 +7217,6 @@ "node": ">=6" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/json-pointer": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", @@ -7973,14 +7310,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -7994,17 +7323,6 @@ "node": ">=6" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8015,21 +7333,6 @@ "node": ">=0.10.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/lilconfig": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", @@ -8243,14 +7546,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -8812,14 +8107,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/node-releases": { "version": "2.0.53", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", @@ -8975,25 +8262,6 @@ "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", "license": "MIT" }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/own-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", @@ -9071,20 +8339,6 @@ "node": ">=6" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9281,17 +8535,6 @@ "node": ">= 0.4" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/prettier": { "version": "3.9.6", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", @@ -9308,39 +8551,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -9515,17 +8725,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -9540,18 +8739,6 @@ "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -9559,49 +8746,6 @@ "dev": true, "license": "MIT" }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -10132,14 +9276,6 @@ "node": ">=0.10.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -10294,20 +9430,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-detect": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", @@ -10318,20 +9440,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -10652,17 +9760,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10845,17 +9942,6 @@ "node": ">= 0.8.0" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", diff --git a/package.json b/package.json index b433a4f..8964351 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-d33453e/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-8db04e1/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", From 356213beed31e29b4307fb4a750b280184fed679 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 00:09:18 +0300 Subject: [PATCH 04/28] chore(SOF-8032): repin @mat3ra/ide to wip-a5b4e7c (dead filesRootDir getter removed) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9547429..975e1c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-8db04e1/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-a5b4e7c/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", @@ -3425,8 +3425,8 @@ }, "node_modules/@mat3ra/ide": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/ide/releases/download/wip-8db04e1/ide.tgz", - "integrity": "sha512-2O46T3t8dnLBb3RjKUclwuWL9fpsqbT5QSc1Vr9+WTcyjaYssB9MIGammjzeF1KbyqhfT/3ZqKHq7yW0bhE/rQ==", + "resolved": "https://github.com/mat3ra/ide/releases/download/wip-a5b4e7c/ide.tgz", + "integrity": "sha512-jgtsPRE5kkNG+8i0dKGIp+etBxKy+QQ3jkkitjyFwh/qIjafzREa02UUsCPdm9VAi2JbjJPwkt2SlQfHqEj9Nw==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 8964351..8c790ae 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-8db04e1/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-a5b4e7c/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", From 9e0ebb38e0224716e4f44afe1d71c913da938698 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 00:21:25 +0300 Subject: [PATCH 05/28] chore(SOF-8032): repin @mat3ra/ide to wip-9be76b6 (getApproximateCharge no longer reads owner) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 975e1c6..2cae107 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-a5b4e7c/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-9be76b6/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", @@ -3425,8 +3425,8 @@ }, "node_modules/@mat3ra/ide": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/ide/releases/download/wip-a5b4e7c/ide.tgz", - "integrity": "sha512-jgtsPRE5kkNG+8i0dKGIp+etBxKy+QQ3jkkitjyFwh/qIjafzREa02UUsCPdm9VAi2JbjJPwkt2SlQfHqEj9Nw==", + "resolved": "https://github.com/mat3ra/ide/releases/download/wip-9be76b6/ide.tgz", + "integrity": "sha512-9ahdtAaewE+9ZLkcNSRMLmQ4r85G0e9DMJp9As6cYT6LIB7Gw5/IT7fJtxtD8k2YOFtqnuH2hRXKjP61w8IzFg==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 8c790ae..2802a28 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-a5b4e7c/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-9be76b6/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", From d5758c1cfcff453be363f41c4e9cf642041ceac7 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 00:40:57 +0300 Subject: [PATCH 06/28] chore(SOF-8032): repin @mat3ra/esse to wip-4b9b167 (isExternal restored to job schema) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2cae107..5d5a9f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "devDependencies": { "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-9be76b6/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", @@ -2888,8 +2888,8 @@ }, "node_modules/@mat3ra/esse": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", - "integrity": "sha512-WukN5ozJcKkYMUkpBtoJwjl+5urXrmJeqIPHI2o8VKuIuBrIZv0xpfYTihFDdfbdy+V/j8lWPKYhNn/jr869pA==", + "resolved": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", + "integrity": "sha512-5Iw0NIFY2qeZ95d7G3nJ+qfwsK7C+pujwCFi0TJcX7cw5Xz/GmEH9szic3jVnP2GP/9sSUziRuxo1gejXoUMgg==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 2802a28..9529b1f 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "devDependencies": { "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b348ef5/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-9be76b6/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", From 7e5e0fa3077774a33c9b46e155ae8326faaf6783 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 01:33:25 +0300 Subject: [PATCH 07/28] chore(SOF-8032): repin @mat3ra/ide to wip-ea09356 (computedEntityMixin split into computedEntityMixin + infrastructureMixin, no source changes needed here) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d5a9f5..e5aa598 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-9be76b6/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-ea09356/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", @@ -3425,8 +3425,8 @@ }, "node_modules/@mat3ra/ide": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/ide/releases/download/wip-9be76b6/ide.tgz", - "integrity": "sha512-9ahdtAaewE+9ZLkcNSRMLmQ4r85G0e9DMJp9As6cYT6LIB7Gw5/IT7fJtxtD8k2YOFtqnuH2hRXKjP61w8IzFg==", + "resolved": "https://github.com/mat3ra/ide/releases/download/wip-ea09356/ide.tgz", + "integrity": "sha512-cUGSw7/RvhqPMA01H1n0WBvU7ZBopAllbyOXB21lHdFbqu6P3hNav1MlkOdNarSnWFWqkhVT3d5VKyXLcYpa0g==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 9529b1f..72bd06d 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-9be76b6/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-ea09356/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", From b7d1db43c0c10f006b06ba514747e0ff5c53964d Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 01:42:04 +0300 Subject: [PATCH 08/28] chore(SOF-8032): repin @mat3ra/ide to wip-17e163b (warnings/isExternal dropped from infrastructureMixin) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5aa598..ed2a9a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-ea09356/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", @@ -3425,8 +3425,8 @@ }, "node_modules/@mat3ra/ide": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/ide/releases/download/wip-ea09356/ide.tgz", - "integrity": "sha512-cUGSw7/RvhqPMA01H1n0WBvU7ZBopAllbyOXB21lHdFbqu6P3hNav1MlkOdNarSnWFWqkhVT3d5VKyXLcYpa0g==", + "resolved": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", + "integrity": "sha512-hTWQA2fAjFluImcbwRkopeulkrlcPbIguvzegwSF410SaWjx16xEtnflnX4rXlFvHcQ6VKfCJ5yzPdpM3VBK1Q==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 72bd06d..54ee333 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-ea09356/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", From cf5180542cd94d561aac065a57986401c333f627 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 01:45:43 +0300 Subject: [PATCH 09/28] chore(SOF-8032): repin @mat3ra/esse to wip-0fdb21e (isExternal removed from job schema) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed2a9a3..0130590 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "devDependencies": { "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", @@ -2888,8 +2888,8 @@ }, "node_modules/@mat3ra/esse": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", - "integrity": "sha512-5Iw0NIFY2qeZ95d7G3nJ+qfwsK7C+pujwCFi0TJcX7cw5Xz/GmEH9szic3jVnP2GP/9sSUziRuxo1gejXoUMgg==", + "resolved": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", + "integrity": "sha512-WukN5ozJcKkYMUkpBtoJwjl+5urXrmJeqIPHI2o8VKuIuBrIZv0xpfYTihFDdfbdy+V/j8lWPKYhNn/jr869pA==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 54ee333..63065ed 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "devDependencies": { "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-4b9b167/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", From b7a880dcd899d659cd0dbb022574a979a8e48962 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 17:40:23 +0300 Subject: [PATCH 10/28] chore(SOF-8032): repin ade/mode/prode/standata/utils to latest published npm versions These were pinned to stale WIP tarballs left over from before those packages' own work landed on npm - none of them have in-flight changes from this branch's work, so there's no reason to stay on a WIP pin. esse/ide stay on their WIP tarballs (this branch's own active changes); wode was already on a real published version. ade wip-27f6c05 -> 2026.8.18-0 mode wip-02b85be -> 2026.8.18-0 prode wip-52f33d4 -> 2026.8.18-0 standata wip-35eaef7 -> 2026.8.18-0 utils wip-9a19d0d -> 2026.8.18-1 Also includes an incidental fix picked up in the same install/verify pass: Job.toJSON()'s `workflow: this._workflow?.toJSON() as any` no longer needs the cast (and its eslint-disable) - WodeWorkflowType.toJSON()'s return type already satisfies S["workflow"] against the current dependency set. Verified: clean `rm -rf node_modules package-lock.json && npm install`, tsc clean, npm test 21/21, npm run transpile clean. --- package-lock.json | 116 +++++++++++++++++++++++----------------------- package.json | 10 ++-- src/js/Job.ts | 3 +- 3 files changed, 64 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0130590..a1d1d58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,16 +12,16 @@ "swig": "^1.4.2" }, "devDependencies": { - "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", + "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", "@mat3ra/made": "2026.8.18-0", - "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", - "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", - "@mat3ra/standata": "https://github.com/mat3ra/standata/releases/download/wip-35eaef7/standata.tgz", + "@mat3ra/mode": "2026.8.18-0", + "@mat3ra/prode": "2026.8.18-0", + "@mat3ra/standata": "2026.8.18-0", "@mat3ra/tsconfig": "^2024.6.3-0", - "@mat3ra/utils": "https://github.com/mat3ra/utils/releases/download/wip-9a19d0d/utils.tgz", + "@mat3ra/utils": "2026.8.18-1", "@mat3ra/wode": "2026.8.18-0", "@types/json-schema": "^7.0.15", "@types/mocha": "^10.0.1", @@ -2836,9 +2836,9 @@ "license": "MIT" }, "node_modules/@mat3ra/ade": { - "version": "0.0.0", - "resolved": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", - "integrity": "sha512-+2o+wI3ybHpABiOiwCIPZjzQzn/43uzPpA0gFYeELPf2wHSoq2+t/wmO7om7bNgStStkqzwcvoSUE7GERPLQVQ==", + "version": "2026.8.18-0", + "resolved": "https://registry.npmjs.org/@mat3ra/ade/-/ade-2026.8.18-0.tgz", + "integrity": "sha512-BMFzcCjjVeVu0bGMaU/XpyMbRIY9Z/slpnPzhLhVJCGLISaUzDI8J9s8YYC42EqBUwm3bRW6keGYZhgf1l0D9A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3472,9 +3472,9 @@ } }, "node_modules/@mat3ra/mode": { - "version": "0.0.0", - "resolved": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", - "integrity": "sha512-uz8/4TRfa3eHBwZyi6Dre3BocTpr0bkLiUliKjFE3/k9YI3GKe/O675VSTGgQVFekcCxJMJuz/CsE+99rdD+LQ==", + "version": "2026.8.18-0", + "resolved": "https://registry.npmjs.org/@mat3ra/mode/-/mode-2026.8.18-0.tgz", + "integrity": "sha512-Q2nhBaS8tibFTivaOzQRh5Z3FbqkIIfYhTMKlnnM/sn+UJZPSal8KvUBaHEOUo8Enxe3NxB3oluX+u17vUo0yA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3486,7 +3486,7 @@ "@babel/preset-react": "7.16.7", "@babel/register": "^7.16.0", "@babel/runtime-corejs3": "7.16.8", - "@mat3ra/utils": "https://github.com/mat3ra/utils/releases/download/wip-8b2c388/utils.tgz", + "@mat3ra/utils": "2026.8.18-1", "@types/lodash": "^4.14.202", "@types/node": "^20.11.30", "@types/underscore": "^1.11.14", @@ -3865,9 +3865,9 @@ } }, "node_modules/@mat3ra/prode": { - "version": "0.0.0", - "resolved": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", - "integrity": "sha512-Sg3pf5OlOpLV6DoAshBhzcZNj/5ZFYvtW5sbb5A3xxDTC6bzMsa1MoOI+g2xCgihS1+Yp8Y818jf5NIkhey+OA==", + "version": "2026.8.18-0", + "resolved": "https://registry.npmjs.org/@mat3ra/prode/-/prode-2026.8.18-0.tgz", + "integrity": "sha512-BwsNYt++e/gIXrsawSlnSodoV304lZ8EybZGKeX9JQq/tWQEvz6SQDHpVMRsxEqS6aujIknKyh5YiVxAmo47Nw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3884,9 +3884,9 @@ } }, "node_modules/@mat3ra/standata": { - "version": "0.0.0", - "resolved": "https://github.com/mat3ra/standata/releases/download/wip-35eaef7/standata.tgz", - "integrity": "sha512-y65/084FyaOht3oVyq/NcKxLbIeLbdQGebkSI1xvmjqGSD70+Xu64ms9ZqvPobmqZVdekLEBLT+K6IBNCIcFOw==", + "version": "2026.8.18-0", + "resolved": "https://registry.npmjs.org/@mat3ra/standata/-/standata-2026.8.18-0.tgz", + "integrity": "sha512-EltpDJnQnz9KcyvqdYHpwNCcpCciRAXWs6uKiCum1nstti1vHdbmTkkw7h0MWbdU2qa5SDX2I0aM0NSsPzfpTA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3919,9 +3919,9 @@ } }, "node_modules/@mat3ra/utils": { - "version": "0.0.0", - "resolved": "https://github.com/mat3ra/utils/releases/download/wip-9a19d0d/utils.tgz", - "integrity": "sha512-vzShVrwuC16hi2HQiZsf7sGwnbu6+azHHsshd3OUVKnup+5vlZuIiFdUTXyK1jU5hoxiecCo2Wqb22UV8vlrzQ==", + "version": "2026.8.18-1", + "resolved": "https://registry.npmjs.org/@mat3ra/utils/-/utils-2026.8.18-1.tgz", + "integrity": "sha512-0J9s42sL/2S9tuwjUbxwo6/ORlGCbCvEqYSmHZgSmHNfzIc2mwuiXRNF0S5Al9EJDfYy6VO4WabDCrfpvCci8A==", "dev": true, "license": "ISC", "dependencies": { @@ -4761,19 +4761,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", @@ -4996,9 +4983,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.15", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.15.tgz", - "integrity": "sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA==", + "version": "2.11.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.16.tgz", + "integrity": "sha512-H/bNPUFHewJHyCTdjn1n3Pit5+2GmWT6mmeHImPX+8MA9NA6b67jO4gYmi4jTbCJb2otq34KMZnovndDPqJwhQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5768,9 +5755,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.408", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.408.tgz", - "integrity": "sha512-SLoprcYpJ/OH2v2ps0+N5biv9H4/KBT3+YmmDew64TwK5y9j2wv7pMOFY7IorVkyMtEyLSCRlXKLsNlakeAlPw==", + "version": "1.5.412", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz", + "integrity": "sha512-z4rMe3esBzlzovKHj4gxJnsCGZRK5l4baUvm+gCGJBPE+gsyUMKsuU9tnEUtI1dOebXz1ytAPGjvXhmQ7rIPwA==", "dev": true, "license": "ISC" }, @@ -6084,6 +6071,24 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -9307,24 +9312,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", @@ -9440,6 +9427,19 @@ "node": ">=4" } }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", diff --git a/package.json b/package.json index 63065ed..46f8e5b 100644 --- a/package.json +++ b/package.json @@ -40,16 +40,16 @@ "@mat3ra/wode": "*" }, "devDependencies": { - "@mat3ra/ade": "https://github.com/mat3ra/ade/releases/download/wip-27f6c05/ade.tgz", + "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", "@mat3ra/made": "2026.8.18-0", - "@mat3ra/mode": "https://github.com/mat3ra/mode/releases/download/wip-02b85be/mode.tgz", - "@mat3ra/prode": "https://github.com/mat3ra/prode/releases/download/wip-52f33d4/prode.tgz", - "@mat3ra/standata": "https://github.com/mat3ra/standata/releases/download/wip-35eaef7/standata.tgz", + "@mat3ra/mode": "2026.8.18-0", + "@mat3ra/prode": "2026.8.18-0", + "@mat3ra/standata": "2026.8.18-0", "@mat3ra/tsconfig": "^2024.6.3-0", - "@mat3ra/utils": "https://github.com/mat3ra/utils/releases/download/wip-9a19d0d/utils.tgz", + "@mat3ra/utils": "2026.8.18-1", "@mat3ra/wode": "2026.8.18-0", "@types/json-schema": "^7.0.15", "@types/mocha": "^10.0.1", diff --git a/src/js/Job.ts b/src/js/Job.ts index c1f2b08..45a0a73 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -88,8 +88,7 @@ class Job extends InMemoryEntity { toJSON(): S { return { ...super.toJSON(), - // eslint-disable-next-line @typescript-eslint/no-explicit-any - workflow: this._workflow?.toJSON() as any, + workflow: this._workflow?.toJSON(), }; } From fe42895c3497e4c5c00c8b3f46d8daac45fee223 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 18:15:39 +0300 Subject: [PATCH 11/28] chore(SOF-8032): repin @mat3ra/ide to wip-6c4177b (timeLimit/computeQueue optionality now tied to compute's own) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index a1d1d58..b95032d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "2026.8.18-0", "@mat3ra/prode": "2026.8.18-0", @@ -3425,8 +3425,8 @@ }, "node_modules/@mat3ra/ide": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", - "integrity": "sha512-hTWQA2fAjFluImcbwRkopeulkrlcPbIguvzegwSF410SaWjx16xEtnflnX4rXlFvHcQ6VKfCJ5yzPdpM3VBK1Q==", + "resolved": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", + "integrity": "sha512-Vs4ssjl3ZWkLzbmhzfi5miT1PZrXaz1yyoQF6TjdehoUgWh+whl/8ARK8G6/dRxWxZp1S1nJkydHYdrKdEna7Q==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 46f8e5b..643f6bb 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", - "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-17e163b/ide.tgz", + "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "2026.8.18-0", "@mat3ra/prode": "2026.8.18-0", From d1c70283d867c7baf87baeee92b9065f0b2bb839 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 18:29:15 +0300 Subject: [PATCH 12/28] chore(SOF-8032): retrigger release-wip for CoreJob work [release] From 0b9208950b86673b13f6e1c6b9680d5cadd94da7 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 18:36:32 +0300 Subject: [PATCH 13/28] fix(SOF-8032): regenerate package-lock.json without --legacy-peer-deps @mat3ra/mode's real npm version pulls in @babel/eslint-parser, whose eslint peer dependency npm auto-installs under strict peer resolution. The lockfile had only ever been written with --legacy-peer-deps (which skips peer installs), so it never recorded eslint's own dependency tree - causing CI's bare `npm ci` to fail with EUSAGE ("Missing: X from lock file") on every eslint transitive dep. A plain `npm install` resolves without conflict and regenerates a lockfile `npm ci` accepts. Also drops a now-unnecessary `as any` cast on `workflow._json` in Job.createFromWorkflow. --- package-lock.json | 974 +++++++++++++++++++++++++++++++++++++++++++++- src/js/Job.ts | 3 +- 2 files changed, 958 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index b95032d..7d367e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2410,6 +2410,113 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@exabyte-io/periodic-table.js": { "version": "2023.12.23-3", "resolved": "https://registry.npmjs.org/@exabyte-io/periodic-table.js/-/periodic-table.js-2023.12.23-3.tgz", @@ -2778,6 +2885,47 @@ "dev": true, "license": "MIT" }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -4438,6 +4586,47 @@ "eslint-scope": "5.1.1" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.13.tgz", @@ -4617,6 +4806,14 @@ "dev": true, "license": "ISC" }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", @@ -4637,6 +4834,17 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.3.5", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", @@ -4801,6 +5009,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -5130,6 +5351,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -5679,6 +5911,14 @@ "node": ">=6" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -5732,6 +5972,20 @@ "node": ">=0.3.1" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -5956,6 +6210,64 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -5980,6 +6292,221 @@ "node": ">=10" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -6054,6 +6581,22 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/fast-uri": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", @@ -6071,6 +6614,17 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -6089,6 +6643,20 @@ } } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -6144,6 +6712,30 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -6395,6 +6987,37 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -6425,6 +7048,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -6565,6 +7196,46 @@ "url": "https://github.com/sponsors/typicode" } }, + "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", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -6941,6 +7612,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -7222,6 +7904,14 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/json-pointer": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", @@ -7315,6 +8005,14 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -7328,6 +8026,17 @@ "node": ">=6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -7338,6 +8047,21 @@ "node": ">=0.10.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lilconfig": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", @@ -7551,6 +8275,14 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -7868,6 +8600,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -8112,6 +8857,14 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/node-releases": { "version": "2.0.53", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", @@ -8267,6 +9020,25 @@ "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", "license": "MIT" }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/own-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", @@ -8344,6 +9116,20 @@ "node": ">=6" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8399,13 +9185,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -8540,6 +9326,17 @@ "node": ">= 0.4" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "3.9.6", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", @@ -8556,6 +9353,39 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -8579,6 +9409,19 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -8730,6 +9573,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -8744,6 +9598,18 @@ "node": ">=8" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -8751,6 +9617,49 @@ "dev": true, "license": "MIT" }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -9281,6 +10190,14 @@ "node": ">=0.10.0" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9312,19 +10229,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9417,6 +10321,20 @@ "dev": true, "license": "0BSD" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", @@ -9760,6 +10678,17 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -9942,6 +10871,17 @@ "node": ">= 0.8.0" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", diff --git a/src/js/Job.ts b/src/js/Job.ts index 45a0a73..9a6dd84 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -256,8 +256,7 @@ class Job extends InMemoryEntity { name: "New Job", status: JobStatus.pre_submission, statusTrack: [], - // eslint-disable-next-line @typescript-eslint/no-explicit-any - workflow: workflow._json as any, + workflow: workflow._json, dataset: defaultDataset, ...extraConfig, } as JobEntity); From 0c31ae84c5f7f3c4c220416d5471c4991a551a0f Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 18:36:38 +0300 Subject: [PATCH 14/28] chore(SOF-8032): retrigger release-wip after lockfile fix [release] From 5731e348edb7b0103d4bf1f0c0b1fd37f2e6da9f Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 19:21:55 +0300 Subject: [PATCH 15/28] chore(SOF-8032): add eslint/prettier devDependencies and fix lint errors jode never had eslint wired up (its CI passed skip-eslint: true for this reason). Adds the same eslint/prettier devDependency set wode already uses, fixes the resulting lint errors (for...of loops, require() calls, unused-expression chai assertions, a dead unparseable setup.js), and drops the interface's redundant type parameter - declaration merging between an interface and a class doesn't require matching generics, so it was only there to appease a rule that then had to be disabled for it. --- package-lock.json | 2717 +++++++++++++++++++++++++++++++++++------- package.json | 17 + src/js/Job.ts | 16 +- src/js/enums.ts | 1 - tests/js/Job.test.ts | 17 +- tests/js/setup.js | 1 - 6 files changed, 2352 insertions(+), 417 deletions(-) delete mode 100644 tests/js/setup.js diff --git a/package-lock.json b/package-lock.json index 7d367e4..5016a21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "swig": "^1.4.2" }, "devDependencies": { + "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", @@ -26,11 +27,27 @@ "@types/json-schema": "^7.0.15", "@types/mocha": "^10.0.1", "@types/node": "^20.11.30", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", "chai": "^4.3.4", + "eslint": "^7.32.0", + "eslint-config-airbnb": "^19.0.2", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-exports": "^1.0.0-beta.5", + "eslint-import-resolver-meteor": "^0.4.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsdoc": "^37.1.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-mui-path-imports": "0.0.15", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.30.0", + "eslint-plugin-simple-import-sort": "^7.0.0", "husky": "^7.0.4", "lint-staged": "^12.1.2", "mocha": "^9.1.3", "moment": "^2.29.4", + "prettier": "^2.7.1", "ts-node": "^10.9.2", "typescript": "^5.6.6" }, @@ -537,6 +554,100 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { "version": "7.29.8", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", @@ -2410,13 +2521,27 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.20.1.tgz", + "integrity": "sha512-oeJK41dcdqkvdZy/HctKklJNkt/jh+av3PZARrZEl+fs/8HaHeeYoAvEwOV0u5I6bArTF17JEsTZMY359e/nfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "comment-parser": "1.3.0", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "~2.2.3" + }, + "engines": { + "node": "^12 || ^14 || ^16 || ^17" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -2436,7 +2561,6 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2450,34 +2574,29 @@ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { @@ -2486,7 +2605,6 @@ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2498,23 +2616,87 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@eslint/eslintrc/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, - "license": "MIT", - "peer": true, + "license": "BSD-3-Clause" + }, + "node_modules/@exabyte-io/eslint-config": { + "version": "2025.5.13-0", + "resolved": "https://registry.npmjs.org/@exabyte-io/eslint-config/-/eslint-config-2025.5.13-0.tgz", + "integrity": "sha512-uZcq9jzmDHl+N71GYEM7l0z6mwyYfuZdNA/bIyql6Mp2H++Oot62nIoMhgvds1r7dbrtL/3jD3Xv0YDj12NiYw==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/eslint-parser": "^7.16.3", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.7", + "@babel/register": "^7.16.0", + "@babel/runtime-corejs3": "^7.16.8", + "@typescript-eslint/eslint-plugin": "^5.56.0", + "@typescript-eslint/parser": "^5.56.0", + "eslint": "^7.32.0", + "eslint-config-airbnb": "^19.0.2", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-exports": "^1.0.0-beta.2", + "eslint-import-resolver-meteor": "^0.4.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsdoc": "^37.1.0 || ^50.6.0", + "eslint-plugin-jsonc": "^2.12.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-mui-path-imports": "^0.0.15", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.30.0", + "eslint-plugin-simple-import-sort": "^7.0.0", + "jsonc-eslint-parser": "^2.1.0" } }, "node_modules/@exabyte-io/periodic-table.js": { @@ -2886,45 +3068,28 @@ "license": "MIT" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "deprecated": "Use @eslint/object-schema instead", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", @@ -4592,7 +4757,6 @@ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -4607,7 +4771,6 @@ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 8" } @@ -4618,7 +4781,6 @@ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4627,6 +4789,27 @@ "node": ">= 8" } }, + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@tsconfig/node10": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.13.tgz", @@ -4713,6 +4896,13 @@ "@types/json-schema": "*" } }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/lodash": { "version": "4.17.25", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.25.tgz", @@ -4775,6 +4965,13 @@ "@types/react": "*" } }, + "node_modules/@types/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/sprintf-js": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/sprintf-js/-/sprintf-js-1.1.4.tgz", @@ -4799,115 +4996,315 @@ "@types/underscore": "*" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", - "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", - "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peer": true, + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.11.0" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=0.4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "ajv": "^8.0.0" + "eslint": "*" }, "peerDependenciesMeta": { - "ajv": { + "typescript": { "optional": true } } }, - "node_modules/ajv-keywords": { + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", @@ -5036,6 +5433,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/array-almost-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-almost-equal/-/array-almost-equal-1.0.0.tgz", @@ -5064,20 +5471,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5086,56 +5494,70 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5144,18 +5566,161 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", - "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", - "semver": "^6.3.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, - "peerDependencies": { + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", + "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, @@ -5357,7 +5922,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -5659,6 +6223,16 @@ "node": ">= 6" } }, + "node_modules/comment-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.0.tgz", + "integrity": "sha512-hRpmWIKgzd81vn0ydoWoyPoALEOnF4wt8yKD35Ib1D6XC2siLiYaiqfGkYrunuKdsXGwpBpHU3+9r+RVw2NZfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -5713,6 +6287,13 @@ "dev": true, "license": "MIT" }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true, + "license": "MIT" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -5806,6 +6387,13 @@ "dev": true, "license": "MIT" }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -5916,8 +6504,7 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", @@ -5972,13 +6559,36 @@ "node": ">=0.3.1" } }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -6022,6 +6632,43 @@ "dev": true, "license": "MIT" }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/enquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", @@ -6130,6 +6777,34 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz", + "integrity": "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-object-atoms": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", @@ -6159,6 +6834,19 @@ "node": ">= 0.4" } }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", @@ -6174,98 +6862,640 @@ "is-symbol": "^1.1.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", + "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", + "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-exports": { + "version": "1.0.0-beta.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-exports/-/eslint-import-resolver-exports-1.0.0-beta.5.tgz", + "integrity": "sha512-o6t0w7muUpXr7MkUVzD5igQoDfAQvTmcPp8HEAJdNF8eOuAO+yn6I/TTyMxz9ecCwzX7e02vzlkHURoScUuidg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve.exports": "^2.0.0" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-meteor": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-meteor/-/eslint-import-resolver-meteor-0.4.0.tgz", + "integrity": "sha512-BSqvgt6QZvk9EGhDGnM4azgbxyBD8b0y6FYA52WFzpWpHcZV9ys8PxM33bx8dlCy3HyopRLLsMUnlhTpZzsZmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.0.1", + "resolve": "^1.1.6" + }, + "peerDependencies": { + "eslint-plugin-import": ">=1.4.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-json-compat-utils": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.3.tgz", + "integrity": "sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esquery": "^1.6.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "*", + "jsonc-eslint-parser": "^2.4.0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@eslint/json": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "37.9.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.9.7.tgz", + "integrity": "sha512-8alON8yYcStY94o0HycU2zkLKQdcS+qhhOUNQpfONHHwvI99afbmfpYuPqf6PbLz5pLZldG3Te5I0RbAiTN42g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.20.1", + "comment-parser": "1.3.0", + "debug": "^4.3.3", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.4.0", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": "^12 || ^14 || ^16 || ^17" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jsonc": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.21.1.tgz", + "integrity": "sha512-dbNR5iEnQeORwsK2WZzr3QaMtFCY3kKJVMRHPzUpKzMhmVy2zIpVgFDpX8MNoIdoqz6KCpCfOJavhfiSbZbN+w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.1", + "diff-sequences": "^27.5.1", + "eslint-compat-utils": "^0.6.4", + "eslint-json-compat-utils": "^0.2.1", + "espree": "^9.6.1 || ^10.3.0", + "graphemer": "^1.4.0", + "jsonc-eslint-parser": "^2.4.0", + "natural-compare": "^1.4.0", + "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-jsonc/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsonc/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-mui-path-imports": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/eslint-plugin-mui-path-imports/-/eslint-plugin-mui-path-imports-0.0.15.tgz", + "integrity": "sha512-u61kgRBtUAG+zoApuf8oWuW6mf3SIfrpMq/gSQEM2h/3qzkqvWXB4RRmPzVryS6bpeXT0QsW8rFcdcMVnoz0hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "requireindex": "^1.2.0" + }, + "engines": { + "node": "12.x || 14.x || >= 16" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz", + "integrity": "sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/escape-latex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", - "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "eslint": "bin/eslint.js" + "resolve": "bin/resolve" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz", + "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" } }, "node_modules/eslint-scope": { @@ -6282,6 +7512,32 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -6292,13 +7548,22 @@ "node": ">=10" } }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, "node_modules/eslint/node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6316,7 +7581,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -6327,7 +7591,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -6338,13 +7601,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6356,61 +7628,28 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "license": "BSD-2-Clause", - "peer": true, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">= 4" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, - "license": "ISC", - "peer": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=10.13.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/eslint/node_modules/json-schema-traverse": { @@ -6418,8 +7657,14 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" + }, + "node_modules/eslint/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/eslint/node_modules/strip-ansi": { "version": "6.0.1", @@ -6427,7 +7672,6 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6441,7 +7685,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6450,36 +7693,55 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=0.4.0" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=4" } }, "node_modules/esquery": { @@ -6488,7 +7750,6 @@ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -6502,7 +7763,6 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -6581,21 +7841,43 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.5", @@ -6620,7 +7902,6 @@ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "reusify": "^1.0.4" } @@ -6649,7 +7930,6 @@ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -6718,7 +7998,6 @@ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -6733,8 +8012,7 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.5", @@ -6832,6 +8110,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -6993,7 +8278,6 @@ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -7010,7 +8294,6 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -7035,6 +8318,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -7053,8 +8367,7 @@ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/growl": { "version": "1.10.5", @@ -7202,7 +8515,6 @@ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -7213,7 +8525,6 @@ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7231,7 +8542,6 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } @@ -7612,17 +8922,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -7854,6 +9153,24 @@ "node": ">=0.10.0" } }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/javascript-natural-sort": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", @@ -7891,6 +9208,16 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.5.tgz", + "integrity": "sha512-2a6eRxSxp1BW040hFvaJxhsCMI9lT8QB8t14t+NY5tC5rckIR0U9cr2tjOeaFirmEOy6MHvmJnY7zTBHq431Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -7909,8 +9236,7 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-pointer": { "version": "0.6.2", @@ -7998,6 +9324,22 @@ "node": ">=16.0.0" } }, + "node_modules/json-schema-to-typescript/node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -8010,8 +9352,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", @@ -8026,13 +9367,81 @@ "node": ">=6" } }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -8047,13 +9456,32 @@ "node": ">=0.10.0" } }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -8280,8 +9708,14 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -8469,6 +9903,19 @@ "node": ">=8" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", @@ -8586,6 +10033,16 @@ "dev": true, "license": "MIT" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -8862,8 +10319,43 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/node-releases": { "version": "2.0.53", @@ -8934,6 +10426,16 @@ "node": ">= 6" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -8978,6 +10480,75 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -9026,7 +10597,6 @@ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -9122,7 +10692,6 @@ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -9167,6 +10736,16 @@ "dev": true, "license": "MIT" }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -9323,34 +10902,68 @@ "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">= 0.8.0" + "node": ">=0.4.0" } }, - "node_modules/prettier": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", - "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, "node_modules/punycode": { @@ -9359,7 +10972,6 @@ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9383,8 +10995,7 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", @@ -9396,6 +11007,13 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -9493,6 +11111,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", @@ -9511,6 +11142,16 @@ "node": ">=4" } }, + "node_modules/regextras": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.14" + } + }, "node_modules/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", @@ -9551,6 +11192,16 @@ "node": ">=0.10.0" } }, + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.5" + } + }, "node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", @@ -9579,11 +11230,20 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -9604,7 +11264,6 @@ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -9624,7 +11283,6 @@ "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -9655,7 +11313,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "queue-microtask": "^1.2.2" } @@ -9999,6 +11656,31 @@ "source-map": "^0.6.0" } }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -10048,6 +11730,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", @@ -10124,6 +11860,16 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -10190,13 +11936,135 @@ "node": ">=0.10.0" } }, + "node_modules/synckit": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@pkgr/core": "^0.3.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", @@ -10314,6 +12182,32 @@ "node": ">=0.3.1" } }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -10321,13 +12215,35 @@ "dev": true, "license": "0BSD" }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -10684,7 +12600,6 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -10707,6 +12622,13 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true, + "license": "MIT" + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -10877,7 +12799,6 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } diff --git a/package.json b/package.json index 643f6bb..fb0ceef 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@mat3ra/wode": "*" }, "devDependencies": { + "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", @@ -54,9 +55,25 @@ "@types/json-schema": "^7.0.15", "@types/mocha": "^10.0.1", "@types/node": "^20.11.30", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", "chai": "^4.3.4", + "eslint": "^7.32.0", + "eslint-config-airbnb": "^19.0.2", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-exports": "^1.0.0-beta.5", + "eslint-import-resolver-meteor": "^0.4.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsdoc": "^37.1.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-mui-path-imports": "0.0.15", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.30.0", + "eslint-plugin-simple-import-sort": "^7.0.0", "mocha": "^9.1.3", "moment": "^2.29.4", + "prettier": "^2.7.1", "ts-node": "^10.9.2", "typescript": "^5.6.6", "husky": "^7.0.4", diff --git a/src/js/Job.ts b/src/js/Job.ts index 9a6dd84..7bcc5ec 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -35,9 +35,8 @@ export interface EntityReference { export type JobEntity = EsseJobSchema; -interface Job - extends - Defaultable, +interface Job + extends Defaultable, NamedEntity, JobSchemaMixin, Taggable, @@ -170,11 +169,12 @@ class Job extends InMemoryEntity { } get finalTimestamp() { - for (const status of JOB_FINAL_STATUS_LIST) { - const entry = this.statusTrack?.find((s) => s.status === status); - if (entry) return entry; - } - return undefined; + return JOB_FINAL_STATUS_LIST.reduce< + NonNullable[number] | undefined + >( + (result, status) => result ?? this.statusTrack?.find((s) => s.status === status), + undefined, + ); } get hasBeenActiveMoreThanOnce(): boolean { diff --git a/src/js/enums.ts b/src/js/enums.ts index 0f24652..9fadc18 100644 --- a/src/js/enums.ts +++ b/src/js/enums.ts @@ -55,7 +55,6 @@ export function JOB_STATUS_CLS(status?: JobStatus): string { return colors[status] || "default"; } - export const JOB_MODES = { normal: "normal", parse_only: "parse-only", diff --git a/tests/js/Job.test.ts b/tests/js/Job.test.ts index d888989..f64a0df 100644 --- a/tests/js/Job.test.ts +++ b/tests/js/Job.test.ts @@ -1,14 +1,15 @@ -import { expect } from "chai"; import type { OrderedMaterial } from "@mat3ra/wode"; +import WodeWorkflow from "@mat3ra/wode/dist/js/Workflow"; +import { expect } from "chai"; -import { Job, type JobEntity } from "../../src/js/Job"; +import { defaultDataset } from "../../src/js/dataset"; import { JOB_FINAL_STATUS_LIST, - JobStatus, JOB_STATUS_CLS, + JobStatus, SINGLE_JOB_SUFFIX, } from "../../src/js/enums"; -import { defaultDataset } from "../../src/js/dataset"; +import { type JobEntity, Job } from "../../src/js/Job"; import { renderJinjaTemplate, setJobNameBasedOnMaterials } from "../../src/js/utils"; // ─── Minimal fixtures ──────────────────────────────────────────────────────── @@ -52,6 +53,7 @@ describe("Job", () => { it("initializes a WodeWorkflow instance from the workflow JSON", () => { const job = new Job(makeJobConfig()); + // eslint-disable-next-line no-unused-expressions expect(job._workflow).to.exist; expect(job._workflow?.name).to.equal("Total Energy"); }); @@ -83,13 +85,13 @@ describe("Job", () => { }); it("reports isInFinalStatus = true for all terminal statuses", () => { - for (const terminalStatus of JOB_FINAL_STATUS_LIST) { + JOB_FINAL_STATUS_LIST.forEach((terminalStatus) => { const job = new Job(makeJobConfig({ status: terminalStatus })); expect( job.isInFinalStatus, `Expected ${terminalStatus} to be a final status`, ).to.equal(true); - } + }); }); it("reports isInFinalStatus = false for active status", () => { @@ -115,7 +117,6 @@ describe("Job", () => { describe("setWorkflow / workflow getter", () => { it("allows setting a new workflow and reading it back", () => { - const WodeWorkflow = require("@mat3ra/wode/dist/js/Workflow").default; const job = new Job(makeJobConfig()); const newWorkflow = new WodeWorkflow({ ...minimalWorkflowJson, name: "Band Gap" }); @@ -146,7 +147,6 @@ describe("Job", () => { describe("createDefault", () => { it("creates a Job with pre_submission status", () => { - const WodeWorkflow = require("@mat3ra/wode/dist/js/Workflow").default; const workflow = new WodeWorkflow(minimalWorkflowJson); // Use a plain object with minimum interface as a material stand-in @@ -205,7 +205,6 @@ describe("renderJinjaTemplate", () => { describe("setJobNameBasedOnMaterials", () => { it("appends jinja suffix when multi materials and no existing jinja pattern", () => { - const WodeWorkflow = require("@mat3ra/wode/dist/js/Workflow").default; const workflow = new WodeWorkflow(minimalWorkflowJson); const job = new Job({ name: "My Job", diff --git a/tests/js/setup.js b/tests/js/setup.js deleted file mode 100644 index 7731736..0000000 --- a/tests/js/setup.js +++ /dev/null @@ -1 +0,0 @@ -// Mocha setup file — global test helpers can be added here. From 7d9064d9096bb6dafa511e93733d6eec45b4c872 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 19:22:11 +0300 Subject: [PATCH 16/28] chore(SOF-8032): release jode with eslint setup + cleanup [release] From dae1dccf1ace4dbf1b365a448a0cce048584cd86 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 23:09:56 +0300 Subject: [PATCH 17/28] fix(SOF-8032): use wode's WorkflowSchema for JobEntity.workflow [release] Esse's job schema inlines workflow.workflows (sub-workflows share the parent's schema) as a bare `{ type: "object" }` with no properties, so json-schema-to-typescript generates it as `{}[]` - unusable. wode's own WorkflowSchema expresses the real recursive structure, so it replaces the generated one on JobEntity, same fix web-app's CoreJobSchema already applies on top of its own (separately-generated, same defect) schema. --- src/js/Job.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/js/Job.ts b/src/js/Job.ts index 7bcc5ec..3ef78a0 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -20,6 +20,7 @@ import type { JobSchema as EsseJobSchema } from "@mat3ra/esse/dist/js/types"; import { ComputedEntityMixin, computedEntityMixin } from "@mat3ra/ide/dist/js/compute"; import type { OrderedMaterial } from "@mat3ra/wode"; import WodeWorkflow from "@mat3ra/wode/dist/js/Workflow"; +import type { WorkflowSchema } from "@mat3ra/wode/dist/js/workflows/types"; import { defaultDataset } from "./dataset"; import { JOB_FINAL_STATUS_LIST, JobStatus } from "./enums"; @@ -33,7 +34,13 @@ export interface EntityReference { [key: string]: unknown; } -export type JobEntity = EsseJobSchema; +/** + * `workflow` is inlined by json-schema-to-typescript with a loose shape - the schema's own + * recursive `workflow.workflows` field (sub-workflows share the parent's schema) resolves to a + * bare `{ type: "object" }` with no properties, so the generated type is `{}[]`. wode's own + * `WorkflowSchema` expresses the real recursive structure, so it replaces the generated one here. + */ +export type JobEntity = Omit & { workflow: WorkflowSchema }; interface Job extends Defaultable, From 7bba1772d12800a155e86e5871fcb2714c51eaa6 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Fri, 21 Aug 2026 23:22:28 +0300 Subject: [PATCH 18/28] fix(SOF-8032): hand-write Job.workflow against WorkflowSchema, implements JobEntity [release] Skip `workflow` from the generated jobSchemaMixin (same reason wode's own Workflow.workflows is hand-written rather than generated: the schema's recursive workflow.workflows field resolves to a lossy `{}[]`) and add a real get/set workflow pair typed against wode's WorkflowSchema directly on the class body, mirroring wode's own Workflow.workflows exactly. This lets Job genuinely `implements JobEntity` instead of relying on structural compatibility that the generated mixin couldn't provide. Also fixes a latent bug in setJobNameBasedOnMaterials: it read `isMultiMaterial` off the raw workflow JSON (which has no such field - it's a computed getter on the live Workflow instance), so the check was always false regardless of the actual workflow. Now reads job._workflow directly, matching the correct pattern already used a few lines above in the same file. --- scripts/generate-mixins.ts | 17 ++++++++++++++++- src/js/Job.ts | 24 +++++++++++++++++++----- src/js/generated/JobSchemaMixin.ts | 8 +------- src/js/utils.ts | 2 +- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/scripts/generate-mixins.ts b/scripts/generate-mixins.ts index ae222d6..9799b94 100644 --- a/scripts/generate-mixins.ts +++ b/scripts/generate-mixins.ts @@ -15,8 +15,23 @@ import type { JSONSchema7 } from "json-schema"; * Fields already provided by InMemoryEntity / NamedInMemoryEntity / DefaultableMixin * (via the `job` schema's `named_defaultable_has_metadata` composition) - skipped so * the generated mixin does not redeclare them. + * + * `workflow` is also skipped: the schema's own recursive `workflow.workflows` field (sub-workflows + * share the parent's schema) resolves to a bare `{ type: "object" }` with no properties, so the + * generated type would be `{}[]` - unusable. `Job.ts` hand-writes `workflow` against wode's real + * `WorkflowSchema` instead (same reason wode's own `Workflow.workflows` is hand-written rather + * than generated - see `workflow/base`'s `OUTPUT_PATHS` entry in wode's own generate-mixins.ts). */ -const SKIP_FIELDS = ["_id", "slug", "systemName", "schemaVersion", "name", "isDefault", "metadata"]; +const SKIP_FIELDS = [ + "_id", + "slug", + "systemName", + "schemaVersion", + "name", + "isDefault", + "metadata", + "workflow", +]; /** * Output file paths for each schema diff --git a/src/js/Job.ts b/src/js/Job.ts index 3ef78a0..9989392 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -58,7 +58,7 @@ interface Job * standalone packages (jove, job-designer) as well as in the web-app, * where a host-level subclass may extend it with persistence and routing. */ -class Job extends InMemoryEntity { +class Job extends InMemoryEntity implements JobEntity { _workflow?: WodeWorkflow; /** Live material instance(s) - not part of the esse schema, never in `_json`/`toJSON`. */ @@ -73,14 +73,29 @@ class Job extends InMemoryEntity { this.initialize(); } + /** + * Raw workflow JSON. Hand-written (not part of the generated `jobSchemaMixin`) because the + * schema's own recursive `workflow.workflows` field resolves to a lossy `{}[]` - see + * `JobEntity`'s own doc comment. Fixed to wode's `WorkflowSchema` rather than generic over + * `S`, matching wode's own `Workflow.workflows` (also hand-written, also fixed). + */ + get workflow() { + return this.requiredProp("workflow"); + } + + set workflow(value: WorkflowSchema) { + (this._json as JobEntity).workflow = value; + } + /** * Initializes derived state (workflow instance, material references) from raw JSON. */ initialize(): void { + // Optional read (not `this.workflow`, which throws via requiredProp): a job may be + // constructed without a workflow yet (e.g. before it's assigned via setWorkflow). const workflow = this.prop("workflow"); if (workflow) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this._workflow = new WodeWorkflow(workflow as any); + this._workflow = new WodeWorkflow(workflow); } } @@ -228,8 +243,7 @@ class Job extends InMemoryEntity { setWorkflow(workflowInstance: WodeWorkflow): void { this._workflow = workflowInstance; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.workflow = this._workflow.toJSON() as any; + this.workflow = this._workflow.toJSON(); } get usedApplicationNames(): string[] { diff --git a/src/js/generated/JobSchemaMixin.ts b/src/js/generated/JobSchemaMixin.ts index b7a249d..f6cd980 100644 --- a/src/js/generated/JobSchemaMixin.ts +++ b/src/js/generated/JobSchemaMixin.ts @@ -3,7 +3,7 @@ import type { BaseInMemoryEntitySchema, JobSchema } from "@mat3ra/esse/dist/js/t export type JobSchemaMixin = Omit< JobSchema, - "_id" | "slug" | "systemName" | "schemaVersion" | "name" | "isDefault" | "metadata" + "_id" | "slug" | "systemName" | "schemaVersion" | "name" | "isDefault" | "metadata" | "workflow" >; export type JobInMemoryEntity = InMemoryEntity; @@ -13,12 +13,6 @@ export function jobSchemaMixin( ): asserts item is T & JobSchemaMixin { // @ts-expect-error const properties: InMemoryEntity & JobSchemaMixin = { - get workflow() { - return this.requiredProp("workflow"); - }, - set workflow(value: JobSchema["workflow"]) { - this.setProp("workflow", value); - }, get rmsId() { return this.prop("rmsId"); }, diff --git a/src/js/utils.ts b/src/js/utils.ts index 3e09f2d..67ab777 100644 --- a/src/js/utils.ts +++ b/src/js/utils.ts @@ -71,7 +71,7 @@ export function renderConfigsFromJobMaterialsWorkflows({ * whether the job is multi-material and how many materials are selected. */ export function setJobNameBasedOnMaterials(job: NamedJob, materials: OrderedMaterial[]): void { - const { isMultiMaterial } = job.workflow as Record; + const isMultiMaterial = Boolean(job._workflow?.isMultiMaterial); const hasMultipleMaterials = materials.length > 1; /** From 40061644a4b9f931605b82fe1efe545bba63023d Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Tue, 25 Aug 2026 14:06:17 +0300 Subject: [PATCH 19/28] fix(SOF-8032): write straight to _json in setWorkflow to avoid recursion [release] setWorkflow assigned via `this.workflow = ...`, which dispatches through whatever `workflow` accessor is active on `this` at runtime. A host subclass that shadows `workflow` to mean the live WodeWorkflow instance (web-app's CoreJob) would route that assignment back into setWorkflow with a plain JSON object mistaken for a WodeWorkflow, corrupting `_workflow` and crashing on `plainObject.toJSON is not a function`. Write to `_json` directly instead, matching the pattern the `workflow` setter itself already uses. --- src/js/Job.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/js/Job.ts b/src/js/Job.ts index 9989392..c149614 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -84,6 +84,9 @@ class Job extends InMemoryEntity implements } set workflow(value: WorkflowSchema) { + // `setProp`'s signature (`value: S[typeof name]`) isn't call-site generic, so it widens + // to `S[keyof S]` here rather than narrowing to `S["workflow"]` - same gap wode's own + // `Workflow.workflows` setter works around the same way. (this._json as JobEntity).workflow = value; } @@ -243,7 +246,10 @@ class Job extends InMemoryEntity implements setWorkflow(workflowInstance: WodeWorkflow): void { this._workflow = workflowInstance; - this.workflow = this._workflow.toJSON(); + // Write straight to `_json`, not `this.workflow = ...` - a host subclass (e.g. web-app's + // `CoreJob`) may shadow the `workflow` accessor to mean the live instance, which would + // route this assignment back through `setWorkflow` and corrupt `_workflow`. + (this._json as JobEntity).workflow = this._workflow.toJSON(); } get usedApplicationNames(): string[] { From 3826cd4d3d627fbce1d4034d0b2d9fa011c49bfe Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Tue, 25 Aug 2026 14:54:58 +0300 Subject: [PATCH 20/28] chore(SOF-8032): repin @mat3ra/esse to a valid, durable WIP release [release] The prior pin (wip-0fdb21e) had been garbage-collected by esse's scheduled stale-tarball cleanup, breaking fresh installs and this repo's own release-wip workflow. Repin to wip-b0bf9ef, a fresh release cut from esse's chore/SOF-8032 branch tip - verified to carry the same job schema fields (dataset, statusTrack, _materials, _materialsSet, isExternal removed) that this package's Job.ts and tests depend on. --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5016a21..c322c03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b0bf9ef/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "2026.8.18-0", @@ -3201,8 +3201,8 @@ }, "node_modules/@mat3ra/esse": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", - "integrity": "sha512-WukN5ozJcKkYMUkpBtoJwjl+5urXrmJeqIPHI2o8VKuIuBrIZv0xpfYTihFDdfbdy+V/j8lWPKYhNn/jr869pA==", + "resolved": "https://github.com/mat3ra/esse/releases/download/wip-b0bf9ef/esse.tgz", + "integrity": "sha512-1n721Ez/JAd+muRq4ZJBxD6wMp+LjXyd6RL/HMbQXvasUPRjysMBaHk8iembpWOJ+LqkvmldfWyHlY8McsdhQg==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index fb0ceef..4a0f79e 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-0fdb21e/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b0bf9ef/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "2026.8.18-0", From fc3d3626f339e1053ad19b04126259ee86941b3f Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Sat, 29 Aug 2026 00:13:53 +0300 Subject: [PATCH 21/28] fix(SOF-8032): render templates via precompile+run, not compile [release] `renderJinjaTemplate` crashed with "TypeError: Cannot assign to read only property 'name' of function" for ANY template - even a plain string with no interpolation. Cause: swig's `compile` ends with `utils.extend(compiled, pre.tokens)` (swig.js:622), which copies token metadata onto the compiled function. That metadata includes a `name` key, and `Function.prototype.name` is not writable, so the assignment throws under strict mode. It went unnoticed for as long as it did because Node and Meteor load swig as CommonJS, where sloppy mode silently drops the failed assignment. Every ESM bundle is strict, so Vite pre-bundling this package for job-designer's standalone app crashed on every single job save. Found by the new Cypress scenario covering Save. Fix: `precompile` + `run` instead. `run(tpl, locals)` invokes the same precompiled template function with swig's own filters/utils - exactly what `compiled()` does - and simply never touches the function object. No template features are lost (tests cover filters, loops and conditionals), and no caching is lost either, since `compile` only caches when given an `options.filename` and this call site never supplies one. Tests: pinned by stubbing `swig.compile` to throw and asserting rendering still succeeds, so a revert to the compile-based version fails loudly. Verified by restoring the old implementation and confirming that test fails (20 passing / 1 failing) before restoring the fix (23 passing). Note the browser crash itself is not reproducible under Node - swig loads as CJS there - so the end-to-end confirmation is job-designer's Cypress suite. --- src/js/utils.ts | 18 ++++++++++++++- tests/js/Job.test.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/js/utils.ts b/src/js/utils.ts index 67ab777..db0b27d 100644 --- a/src/js/utils.ts +++ b/src/js/utils.ts @@ -13,9 +13,25 @@ type NamedJob = Job & Pick; /** * Renders a Jinja/Swig template string with a given context object. + * + * Deliberately `precompile` + `run` rather than `compile(content)(context)`. Swig's `compile` + * ends with `utils.extend(compiled, pre.tokens)` (swig.js:622), copying token metadata - which + * includes a `name` key - onto the compiled function. `Function.prototype.name` is not writable, + * so that assignment throws `TypeError: Cannot assign to read only property 'name' of function` + * in strict mode, for ANY template, even one with no interpolation at all. + * + * It goes unnoticed under CommonJS (sloppy mode silently ignores the failed assignment), which is + * why Node and the Meteor bundle are fine, but any ESM bundle - e.g. Vite pre-bundling this + * package for job-designer's standalone app - is strict and crashes on every job save. + * + * `run(tpl, locals)` invokes the same precompiled template function with swig's own filters/utils, + * exactly as `compiled()` would, and simply never touches the function object. No template + * features are lost; `compile`'s result caching is not either, since it only caches when an + * `options.filename` is supplied and this call site never supplies one. */ export function renderJinjaTemplate(content: string, context: object = {}): string { - return jinja.compile(content)(context); + const { tpl } = jinja.precompile(content); + return jinja.run(tpl, context); } /** diff --git a/tests/js/Job.test.ts b/tests/js/Job.test.ts index f64a0df..e5dd305 100644 --- a/tests/js/Job.test.ts +++ b/tests/js/Job.test.ts @@ -1,6 +1,8 @@ import type { OrderedMaterial } from "@mat3ra/wode"; import WodeWorkflow from "@mat3ra/wode/dist/js/Workflow"; import { expect } from "chai"; +// @ts-expect-error — swig does not have maintained TS types +import jinja from "swig"; import { defaultDataset } from "../../src/js/dataset"; import { @@ -201,6 +203,56 @@ describe("renderJinjaTemplate", () => { expect(result).to.equal("Hello world"); }); + + /** + * Regression: swig's `compile` ends with `utils.extend(compiled, pre.tokens)` (swig.js:622), + * assigning a `name` key onto the compiled function. `Function.prototype.name` is not + * writable, so under strict mode that throws for ANY template - even one with no + * interpolation. It is invisible here because Node loads swig as CommonJS (sloppy mode + * silently drops the assignment), but every ESM bundle is strict, so Vite pre-bundling this + * package for job-designer's standalone app crashed on every job save. + * + * Rather than assert the unreproducible-in-Node crash, this pins the fix: rendering must not + * route through `compile` at all. + */ + it("does not route through swig's compile", () => { + const originalCompile = jinja.compile; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (jinja as any).compile = () => { + throw new Error("renderJinjaTemplate must not use swig.compile"); + }; + + try { + expect( + renderJinjaTemplate("Hello {{ material.formula }}", { + material: { formula: "Si" }, + }), + ).to.equal("Hello Si"); + // A plain string is the case that crashed in the browser - it still compiles a + // template internally, so it must be covered too. + expect(renderJinjaTemplate("Saved Test Job")).to.equal("Saved Test Job"); + } finally { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (jinja as any).compile = originalCompile; + } + }); + + it("preserves swig template features beyond plain interpolation", () => { + expect(renderJinjaTemplate("{{ name|upper }}", { name: "si" })).to.equal("SI"); + expect( + renderJinjaTemplate("{% for m in materials %}{{ m.formula }},{% endfor %}", { + materials: [{ formula: "Si" }, { formula: "Ge" }], + }), + ).to.equal("Si,Ge,"); + expect( + renderJinjaTemplate( + "{% if material %}{{ material.formula }}{% else %}none{% endif %}", + { + material: { formula: "C" }, + }, + ), + ).to.equal("C"); + }); }); describe("setJobNameBasedOnMaterials", () => { From 695e1468ea5c5ec57c7e8202c819cefe67507bb0 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 3 Sep 2026 18:09:37 +0300 Subject: [PATCH 22/28] chore(SOF-8032): repin @mat3ra/esse to wip-6fa88f1, regenerate JobSchemaMixin [release] Picks up esse's has-project fragment extraction (schema/job.json now composes _project via system/has-project instead of inlining it) - no behavior change, JobSchemaMixin's _project getter/setter are identical, just reordered. Co-Authored-By: Claude Sonnet 5 --- package-lock.json | 4 ++-- package.json | 2 +- src/js/generated/JobSchemaMixin.ts | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index c322c03..0a2fa43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b0bf9ef/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-6fa88f1/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "2026.8.18-0", @@ -3201,7 +3201,7 @@ }, "node_modules/@mat3ra/esse": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/esse/releases/download/wip-b0bf9ef/esse.tgz", + "resolved": "https://github.com/mat3ra/esse/releases/download/wip-6fa88f1/esse.tgz", "integrity": "sha512-1n721Ez/JAd+muRq4ZJBxD6wMp+LjXyd6RL/HMbQXvasUPRjysMBaHk8iembpWOJ+LqkvmldfWyHlY8McsdhQg==", "dev": true, "license": "Apache-2.0", diff --git a/package.json b/package.json index 4a0f79e..2bfcf2d 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-b0bf9ef/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-6fa88f1/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "2026.8.18-0", diff --git a/src/js/generated/JobSchemaMixin.ts b/src/js/generated/JobSchemaMixin.ts index f6cd980..58743e0 100644 --- a/src/js/generated/JobSchemaMixin.ts +++ b/src/js/generated/JobSchemaMixin.ts @@ -37,12 +37,6 @@ export function jobSchemaMixin( set workDir(value: JobSchema["workDir"]) { this.setProp("workDir", value); }, - get _project() { - return this.requiredProp("_project"); - }, - set _project(value: JobSchema["_project"]) { - this.setProp("_project", value); - }, get _material() { return this.prop("_material"); }, @@ -109,6 +103,12 @@ export function jobSchemaMixin( set statusTrack(value: JobSchema["statusTrack"]) { this.setProp("statusTrack", value); }, + get _project() { + return this.requiredProp("_project"); + }, + set _project(value: JobSchema["_project"]) { + this.setProp("_project", value); + }, }; Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties)); From 4f32f5bd8cd49ea821b8f33a45874fea44f4cc60 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 3 Sep 2026 18:12:26 +0300 Subject: [PATCH 23/28] fix(SOF-8032): correct wip-6fa88f1 esse tarball integrity hash [release] The previous commit's lockfile recorded the hash from a duplicate, concurrent release-wip run that got overwritten before CI could fetch it - same race the earlier "retrigger release-wip" commit hit. Verified against the now-settled asset. Co-Authored-By: Claude Sonnet 5 --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 0a2fa43..a0daf7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3202,7 +3202,7 @@ "node_modules/@mat3ra/esse": { "version": "0.0.0", "resolved": "https://github.com/mat3ra/esse/releases/download/wip-6fa88f1/esse.tgz", - "integrity": "sha512-1n721Ez/JAd+muRq4ZJBxD6wMp+LjXyd6RL/HMbQXvasUPRjysMBaHk8iembpWOJ+LqkvmldfWyHlY8McsdhQg==", + "integrity": "sha512-zCSV9OmF/CYv1R20JhKXdJJQiKBt/iQex594wgUTHOzvupz49j1PSehUzAyZY1FvZYlaOkDAG5HrWeYF9BVmkw==", "dev": true, "license": "Apache-2.0", "dependencies": { From 2c74bf40a57ebd136ea680a057e5f81cf9f690e2 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 3 Sep 2026 18:32:25 +0300 Subject: [PATCH 24/28] refactor(SOF-8032): generate Job's mixin from job/base, add HasProjectSchemaMixin [release] Mirrors wode/made: generate-mixins now points at job/base (job's own properties) instead of the whole resolved job schema, so _project isn't mixed in with status/compute/etc. Job.ts applies the new, separately generated hasProjectSchemaMixin alongside it - same _project getter/setter, just composed rather than baked into one big mixin. No behavior change (23 existing tests pass unchanged). Repins @mat3ra/esse to wip-8200a19 (job/base.json extraction). Co-Authored-By: Claude Sonnet 5 --- package-lock.json | 6 ++-- package.json | 2 +- scripts/generate-mixins.ts | 27 ++++++-------- src/js/Job.ts | 6 ++++ src/js/generated/HasProjectSchemaMixin.ts | 24 +++++++++++++ src/js/generated/JobSchemaMixin.ts | 43 +++++++++-------------- 6 files changed, 61 insertions(+), 47 deletions(-) create mode 100644 src/js/generated/HasProjectSchemaMixin.ts diff --git a/package-lock.json b/package-lock.json index a0daf7f..19d8641 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-6fa88f1/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-8200a19/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "2026.8.18-0", @@ -3201,8 +3201,8 @@ }, "node_modules/@mat3ra/esse": { "version": "0.0.0", - "resolved": "https://github.com/mat3ra/esse/releases/download/wip-6fa88f1/esse.tgz", - "integrity": "sha512-zCSV9OmF/CYv1R20JhKXdJJQiKBt/iQex594wgUTHOzvupz49j1PSehUzAyZY1FvZYlaOkDAG5HrWeYF9BVmkw==", + "resolved": "https://github.com/mat3ra/esse/releases/download/wip-8200a19/esse.tgz", + "integrity": "sha512-w30NCZux0A9Y00LiGEmGZsJiQXYZh/brgE6dImeS/urzyUDiLEvIT98Jx8Q5BZrkQTip7o3gDZcgDWfxbcaujQ==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 2bfcf2d..2ead27b 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.8.18-0", "@mat3ra/code": "2026.8.18-0", - "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-6fa88f1/esse.tgz", + "@mat3ra/esse": "https://github.com/mat3ra/esse/releases/download/wip-8200a19/esse.tgz", "@mat3ra/ide": "https://github.com/mat3ra/ide/releases/download/wip-6c4177b/ide.tgz", "@mat3ra/made": "2026.8.18-0", "@mat3ra/mode": "2026.8.18-0", diff --git a/scripts/generate-mixins.ts b/scripts/generate-mixins.ts index 9799b94..2757cb4 100644 --- a/scripts/generate-mixins.ts +++ b/scripts/generate-mixins.ts @@ -12,32 +12,25 @@ import allSchemas from "@mat3ra/esse/dist/js/schemas.json"; import type { JSONSchema7 } from "json-schema"; /** - * Fields already provided by InMemoryEntity / NamedInMemoryEntity / DefaultableMixin - * (via the `job` schema's `named_defaultable_has_metadata` composition) - skipped so - * the generated mixin does not redeclare them. - * - * `workflow` is also skipped: the schema's own recursive `workflow.workflows` field (sub-workflows + * `workflow` is skipped: the schema's own recursive `workflow.workflows` field (sub-workflows * share the parent's schema) resolves to a bare `{ type: "object" }` with no properties, so the * generated type would be `{}[]` - unusable. `Job.ts` hand-writes `workflow` against wode's real * `WorkflowSchema` instead (same reason wode's own `Workflow.workflows` is hand-written rather * than generated - see `workflow/base`'s `OUTPUT_PATHS` entry in wode's own generate-mixins.ts). */ -const SKIP_FIELDS = [ - "_id", - "slug", - "systemName", - "schemaVersion", - "name", - "isDefault", - "metadata", - "workflow", -]; +const SKIP_FIELDS = ["workflow"]; /** - * Output file paths for each schema + * Output file paths for each schema. `job/base` (job's own properties - status, compute, + * _material, etc.) generates a mixin without `_project` (composed onto the full `job` schema + * separately, see `system/has-project`) or `owner`/`creator`/`name`/etc. (those come from + * InMemoryEntity / NamedInMemoryEntity / DefaultableMixin, applied to `Job.prototype` directly + * in `Job.ts`, not schema-generated) - mirrors `workflow/base`/`material/material-properties` in + * wode/made rather than generating one mixin from the whole resolved `job` schema. */ const OUTPUT_PATHS = { - job: "src/js/generated/JobSchemaMixin.ts", + "job/base": "src/js/generated/JobSchemaMixin.ts", + "system/has-project": "src/js/generated/HasProjectSchemaMixin.ts", }; function main() { diff --git a/src/js/Job.ts b/src/js/Job.ts index c149614..0a99df3 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -24,6 +24,10 @@ import type { WorkflowSchema } from "@mat3ra/wode/dist/js/workflows/types"; import { defaultDataset } from "./dataset"; import { JOB_FINAL_STATUS_LIST, JobStatus } from "./enums"; +import { + type HasProjectSchemaMixin, + hasProjectSchemaMixin, +} from "./generated/HasProjectSchemaMixin"; import { type JobSchemaMixin, jobSchemaMixin } from "./generated/JobSchemaMixin"; /** @@ -46,6 +50,7 @@ interface Job extends Defaultable, NamedEntity, JobSchemaMixin, + HasProjectSchemaMixin, Taggable, HashedEntity, ComputedEntityMixin, @@ -300,6 +305,7 @@ class Job extends InMemoryEntity implements namedEntityMixin(Job.prototype); jobSchemaMixin(Job.prototype); +hasProjectSchemaMixin(Job.prototype); taggableMixin(Job.prototype); computedEntityMixin(Job.prototype); defaultableEntityMixin(Job); diff --git a/src/js/generated/HasProjectSchemaMixin.ts b/src/js/generated/HasProjectSchemaMixin.ts new file mode 100644 index 0000000..5b15c53 --- /dev/null +++ b/src/js/generated/HasProjectSchemaMixin.ts @@ -0,0 +1,24 @@ +import type { InMemoryEntity } from "@mat3ra/code/dist/js/entity"; +import type { BaseInMemoryEntitySchema, HasProjectSchema } from "@mat3ra/esse/dist/js/types"; + +export type HasProjectSchemaMixin = Omit; + +export type HasProjectInMemoryEntity = InMemoryEntity< + BaseInMemoryEntitySchema & HasProjectSchemaMixin +>; + +export function hasProjectSchemaMixin( + item: InMemoryEntity, +): asserts item is T & HasProjectSchemaMixin { + // @ts-expect-error + const properties: InMemoryEntity & HasProjectSchemaMixin = { + get _project() { + return this.requiredProp("_project"); + }, + set _project(value: HasProjectSchema["_project"]) { + this.setProp("_project", value); + }, + }; + + Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties)); +} diff --git a/src/js/generated/JobSchemaMixin.ts b/src/js/generated/JobSchemaMixin.ts index 58743e0..757e623 100644 --- a/src/js/generated/JobSchemaMixin.ts +++ b/src/js/generated/JobSchemaMixin.ts @@ -1,10 +1,7 @@ import type { InMemoryEntity } from "@mat3ra/code/dist/js/entity"; -import type { BaseInMemoryEntitySchema, JobSchema } from "@mat3ra/esse/dist/js/types"; +import type { BaseInMemoryEntitySchema, BaseJobSchema } from "@mat3ra/esse/dist/js/types"; -export type JobSchemaMixin = Omit< - JobSchema, - "_id" | "slug" | "systemName" | "schemaVersion" | "name" | "isDefault" | "metadata" | "workflow" ->; +export type JobSchemaMixin = Omit; export type JobInMemoryEntity = InMemoryEntity; @@ -16,99 +13,93 @@ export function jobSchemaMixin( get rmsId() { return this.prop("rmsId"); }, - set rmsId(value: JobSchema["rmsId"]) { + set rmsId(value: BaseJobSchema["rmsId"]) { this.setProp("rmsId", value); }, get status() { return this.requiredProp("status"); }, - set status(value: JobSchema["status"]) { + set status(value: BaseJobSchema["status"]) { this.setProp("status", value); }, get startTime() { return this.prop("startTime"); }, - set startTime(value: JobSchema["startTime"]) { + set startTime(value: BaseJobSchema["startTime"]) { this.setProp("startTime", value); }, get workDir() { return this.prop("workDir"); }, - set workDir(value: JobSchema["workDir"]) { + set workDir(value: BaseJobSchema["workDir"]) { this.setProp("workDir", value); }, get _material() { return this.prop("_material"); }, - set _material(value: JobSchema["_material"]) { + set _material(value: BaseJobSchema["_material"]) { this.setProp("_material", value); }, get _materials() { return this.prop("_materials"); }, - set _materials(value: JobSchema["_materials"]) { + set _materials(value: BaseJobSchema["_materials"]) { this.setProp("_materials", value); }, get _materialsSet() { return this.prop("_materialsSet"); }, - set _materialsSet(value: JobSchema["_materialsSet"]) { + set _materialsSet(value: BaseJobSchema["_materialsSet"]) { this.setProp("_materialsSet", value); }, get parent() { return this.prop("parent"); }, - set parent(value: JobSchema["parent"]) { + set parent(value: BaseJobSchema["parent"]) { this.setProp("parent", value); }, get runtimeContext() { return this.prop("runtimeContext"); }, - set runtimeContext(value: JobSchema["runtimeContext"]) { + set runtimeContext(value: BaseJobSchema["runtimeContext"]) { this.setProp("runtimeContext", value); }, get scopeTrack() { return this.prop("scopeTrack"); }, - set scopeTrack(value: JobSchema["scopeTrack"]) { + set scopeTrack(value: BaseJobSchema["scopeTrack"]) { this.setProp("scopeTrack", value); }, get dataset() { return this.prop("dataset"); }, - set dataset(value: JobSchema["dataset"]) { + set dataset(value: BaseJobSchema["dataset"]) { this.setProp("dataset", value); }, get purged() { return this.prop("purged"); }, - set purged(value: JobSchema["purged"]) { + set purged(value: BaseJobSchema["purged"]) { this.setProp("purged", value); }, get purgedAt() { return this.prop("purgedAt"); }, - set purgedAt(value: JobSchema["purgedAt"]) { + set purgedAt(value: BaseJobSchema["purgedAt"]) { this.setProp("purgedAt", value); }, get compute() { return this.requiredProp("compute"); }, - set compute(value: JobSchema["compute"]) { + set compute(value: BaseJobSchema["compute"]) { this.setProp("compute", value); }, get statusTrack() { return this.prop("statusTrack"); }, - set statusTrack(value: JobSchema["statusTrack"]) { + set statusTrack(value: BaseJobSchema["statusTrack"]) { this.setProp("statusTrack", value); }, - get _project() { - return this.requiredProp("_project"); - }, - set _project(value: JobSchema["_project"]) { - this.setProp("_project", value); - }, }; Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties)); From 88553bf85893d0f00c0cfb2247288906edbf0167 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 10 Sep 2026 18:52:58 +0300 Subject: [PATCH 25/28] fix(SOF-8032): replace unmaintained swig with nunjucks in renderJinjaTemplate [release] swig (paularmstrong/swig) has been archived since 2017 with issues disabled - there is no upstream to fix or report anything against. The `precompile`+`run` workaround (fc3d362) papers over one specific bug (the `Function.prototype.name` strict-mode crash) but the dependency itself is dead weight, and nunjucks is already this stack's primary templating engine (wode/standata/code all depend on it for the same Jinja2-style rendering, just for the heavier workflow unit input templates rather than job/material name interpolation). Swaps `jinja.precompile(content).tpl` + `jinja.run(tpl, context)` for `nunjucks.renderString(content, context)`, dropping the whole workaround comment along with it - nunjucks has no equivalent bug. Repins the package's own `swig` dependency to `nunjucks`. Tests: removed the "does not route through swig's compile" regression test - its premise (a stubbable `jinja.compile` to guard against regressing into) no longer exists once swig is gone entirely. The remaining filter/loop/conditional coverage (`{{ x|upper }}`, `{% for %}`, `{% if %}`) passes unchanged under nunjucks (22 passing, 0 failing). Co-Authored-By: Claude Sonnet 5 --- package-lock.json | 354 +------------------------------------------ package.json | 2 +- src/js/utils.ts | 27 +--- tests/js/Job.test.ts | 37 +---- 4 files changed, 8 insertions(+), 412 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19d8641..c18fe55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "license": "Apache-2.0", "dependencies": { - "swig": "^1.4.2" + "nunjucks": "^3.2.4" }, "devDependencies": { "@exabyte-io/eslint-config": "2025.5.13-0", @@ -4789,20 +4789,6 @@ "node": ">= 8" } }, - "node_modules/@pkgr/core": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", - "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -5216,7 +5202,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", - "dev": true, "license": "MIT" }, "node_modules/acorn": { @@ -5324,15 +5309,6 @@ "dev": true, "license": "MIT" }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "license": "BSD-3-Clause OR MIT", - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/an-array": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/an-array/-/an-array-1.0.0.tgz", @@ -5628,7 +5604,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, "license": "MIT" }, "node_modules/assertion-error": { @@ -5658,11 +5633,6 @@ "node": ">=8" } }, - "node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" - }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -6559,17 +6529,6 @@ "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6957,23 +6916,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-compat-utils": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", - "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, "node_modules/eslint-config-airbnb": { "version": "19.0.4", "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", @@ -7114,29 +7056,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-json-compat-utils": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.3.tgz", - "integrity": "sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esquery": "^1.6.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": "*", - "jsonc-eslint-parser": "^2.4.0 || ^3.0.0" - }, - "peerDependenciesMeta": { - "@eslint/json": { - "optional": true - } - } - }, "node_modules/eslint-module-utils": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", @@ -7255,67 +7174,6 @@ "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-jsonc": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.21.1.tgz", - "integrity": "sha512-dbNR5iEnQeORwsK2WZzr3QaMtFCY3kKJVMRHPzUpKzMhmVy2zIpVgFDpX8MNoIdoqz6KCpCfOJavhfiSbZbN+w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.5.1", - "diff-sequences": "^27.5.1", - "eslint-compat-utils": "^0.6.4", - "eslint-json-compat-utils": "^0.2.1", - "espree": "^9.6.1 || ^10.3.0", - "graphemer": "^1.4.0", - "jsonc-eslint-parser": "^2.4.0", - "natural-compare": "^1.4.0", - "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-plugin-jsonc/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-jsonc/node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", @@ -7417,20 +7275,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -9367,59 +9211,6 @@ "node": ">=6" } }, - "node_modules/jsonc-eslint-parser": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", - "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "acorn": "^8.5.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/jsonc-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -10394,7 +10185,6 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "a-sync-waterfall": "^1.0.0", @@ -10420,7 +10210,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -10575,22 +10364,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", - "license": "MIT/X11", - "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "node_modules/optimist/node_modules/minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", - "license": "MIT" - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -11919,40 +11692,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/swig": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/swig/-/swig-1.4.2.tgz", - "integrity": "sha512-23eN2Cmm6XmSc9j//g7J/PlYBdm60eznA/snxYZLVpoy4diL2wzCqEsf6ThVwRhhYIngwSNSztvIdrdH9sTCGA==", - "deprecated": "This package is no longer maintained", - "license": "MIT", - "dependencies": { - "optimist": "~0.6", - "uglify-js": "~2.4" - }, - "bin": { - "swig": "bin/swig.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/synckit": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", - "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@pkgr/core": "^0.3.6" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, "node_modules/table": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", @@ -12398,80 +12137,6 @@ "node": ">=14.17" } }, - "node_modules/uglify-js": { - "version": "2.4.24", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", - "integrity": "sha512-tktIjwackfZLd893KGJmXc1hrRHH1vH9Po3xFh1XBjjeGAnN02xJ3SuoA+n1L29/ZaCA18KzCFlckS+vfPugiA==", - "license": "BSD", - "dependencies": { - "async": "~0.2.6", - "source-map": "0.1.34", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.5.4" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/uglify-js/node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uglify-js/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uglify-js/node_modules/source-map": { - "version": "0.1.34", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", - "integrity": "sha512-yfCwDj0vR9RTwt3pEzglgb3ZgmcXHt6DjG3bjJvzPwTL+5zDQ2MhmSzAcTy0GTiQuCiriSWXvWM1/NhKdXuoQA==", - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uglify-js/node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "license": "MIT/X11", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/uglify-js/node_modules/yargs": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", - "integrity": "sha512-5j382E4xQSs71p/xZQsU1PtRA2HXPAjX0E0DkoGLxwNASMOKX6A9doV1NrZmj85u2Pjquz402qonBzz/yLPbPA==", - "license": "MIT/X11", - "dependencies": { - "camelcase": "^1.0.2", - "decamelize": "^1.0.0", - "window-size": "0.1.0", - "wordwrap": "0.0.2" - } - }, - "node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", - "license": "MIT" - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -12785,14 +12450,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -12803,15 +12460,6 @@ "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/workerpool": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", diff --git a/package.json b/package.json index 2ead27b..40b4b2e 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "license": "Apache-2.0", "homepage": "https://github.com/mat3ra/jode", "dependencies": { - "swig": "^1.4.2" + "nunjucks": "^3.2.4" }, "peerDependencies": { "@mat3ra/code": "*", diff --git a/src/js/utils.ts b/src/js/utils.ts index db0b27d..4a28c97 100644 --- a/src/js/utils.ts +++ b/src/js/utils.ts @@ -1,9 +1,6 @@ import type { NamedInMemoryEntity } from "@mat3ra/code/dist/js/entity"; import type { OrderedMaterial } from "@mat3ra/wode"; -// @ts-expect-error — swig does not have maintained TS types -// Constraint: Swig is compiled on in-memory strings only. Do not use file-loading features -// (like {% extends %}/{% include %}) in browser environments as fs polyfills are empty stubs. -import jinja from "swig"; +import nunjucks from "nunjucks"; import { SINGLE_JOB_SUFFIX } from "./enums"; import type { Job } from "./Job"; @@ -12,26 +9,12 @@ import type { Job } from "./Job"; type NamedJob = Job & Pick; /** - * Renders a Jinja/Swig template string with a given context object. - * - * Deliberately `precompile` + `run` rather than `compile(content)(context)`. Swig's `compile` - * ends with `utils.extend(compiled, pre.tokens)` (swig.js:622), copying token metadata - which - * includes a `name` key - onto the compiled function. `Function.prototype.name` is not writable, - * so that assignment throws `TypeError: Cannot assign to read only property 'name' of function` - * in strict mode, for ANY template, even one with no interpolation at all. - * - * It goes unnoticed under CommonJS (sloppy mode silently ignores the failed assignment), which is - * why Node and the Meteor bundle are fine, but any ESM bundle - e.g. Vite pre-bundling this - * package for job-designer's standalone app - is strict and crashes on every job save. - * - * `run(tpl, locals)` invokes the same precompiled template function with swig's own filters/utils, - * exactly as `compiled()` would, and simply never touches the function object. No template - * features are lost; `compile`'s result caching is not either, since it only caches when an - * `options.filename` is supplied and this call site never supplies one. + * Renders a Jinja-style template string with a given context object. Only ever used here for + * plain `{{ variable }}` interpolation (job/material names) - do not use file-loading features + * (`{% extends %}`/`{% include %}`) in browser environments, since fs polyfills are empty stubs. */ export function renderJinjaTemplate(content: string, context: object = {}): string { - const { tpl } = jinja.precompile(content); - return jinja.run(tpl, context); + return nunjucks.renderString(content, context); } /** diff --git a/tests/js/Job.test.ts b/tests/js/Job.test.ts index e5dd305..ecde5ee 100644 --- a/tests/js/Job.test.ts +++ b/tests/js/Job.test.ts @@ -1,8 +1,6 @@ import type { OrderedMaterial } from "@mat3ra/wode"; import WodeWorkflow from "@mat3ra/wode/dist/js/Workflow"; import { expect } from "chai"; -// @ts-expect-error — swig does not have maintained TS types -import jinja from "swig"; import { defaultDataset } from "../../src/js/dataset"; import { @@ -204,40 +202,7 @@ describe("renderJinjaTemplate", () => { expect(result).to.equal("Hello world"); }); - /** - * Regression: swig's `compile` ends with `utils.extend(compiled, pre.tokens)` (swig.js:622), - * assigning a `name` key onto the compiled function. `Function.prototype.name` is not - * writable, so under strict mode that throws for ANY template - even one with no - * interpolation. It is invisible here because Node loads swig as CommonJS (sloppy mode - * silently drops the assignment), but every ESM bundle is strict, so Vite pre-bundling this - * package for job-designer's standalone app crashed on every job save. - * - * Rather than assert the unreproducible-in-Node crash, this pins the fix: rendering must not - * route through `compile` at all. - */ - it("does not route through swig's compile", () => { - const originalCompile = jinja.compile; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (jinja as any).compile = () => { - throw new Error("renderJinjaTemplate must not use swig.compile"); - }; - - try { - expect( - renderJinjaTemplate("Hello {{ material.formula }}", { - material: { formula: "Si" }, - }), - ).to.equal("Hello Si"); - // A plain string is the case that crashed in the browser - it still compiles a - // template internally, so it must be covered too. - expect(renderJinjaTemplate("Saved Test Job")).to.equal("Saved Test Job"); - } finally { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (jinja as any).compile = originalCompile; - } - }); - - it("preserves swig template features beyond plain interpolation", () => { + it("supports filters, loops, and conditionals beyond plain interpolation", () => { expect(renderJinjaTemplate("{{ name|upper }}", { name: "si" })).to.equal("SI"); expect( renderJinjaTemplate("{% for m in materials %}{{ m.formula }},{% endfor %}", { From beacfb3610f319f939d4804ef4c6c5db3a211d25 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 10 Sep 2026 18:55:37 +0300 Subject: [PATCH 26/28] fix(SOF-8032): regenerate package-lock.json without --legacy-peer-deps [release] The previous commit's lockfile update was regenerated with --legacy-peer-deps (needed in the web-app monorepo for an unrelated simpl-schema peer conflict, not applicable here) which silently omitted several eslint-plugin-jsdoc/jsonc transitive entries a strict resolution needs. `npm ci` (no flags - what CI's release-wip.yml actually runs) failed as a result: "Missing: eslint-plugin-jsonc, jsonc-eslint-parser, eslint-plugin-react-hooks, ... from lock file". Regenerated via plain `npm install --package-lock-only` instead (jode has no peer conflict of its own), verified with `npm ci --dry-run` locally - clean, no EUSAGE error. Co-Authored-By: Claude Sonnet 5 --- package-lock.json | 240 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 224 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index c18fe55..7a55373 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4789,6 +4789,20 @@ "node": ">= 8" } }, + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -5372,7 +5386,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -5386,7 +5400,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -5755,7 +5769,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -5779,7 +5793,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -5989,7 +6003,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -6529,6 +6542,17 @@ "node": ">=0.3.1" } }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6916,6 +6940,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-compat-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", + "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-config-airbnb": { "version": "19.0.4", "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", @@ -7056,6 +7097,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-json-compat-utils": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.3.tgz", + "integrity": "sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esquery": "^1.6.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "*", + "jsonc-eslint-parser": "^2.4.0 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@eslint/json": { + "optional": true + } + } + }, "node_modules/eslint-module-utils": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", @@ -7174,6 +7238,67 @@ "eslint": "^7.0.0 || ^8.0.0" } }, + "node_modules/eslint-plugin-jsonc": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.21.1.tgz", + "integrity": "sha512-dbNR5iEnQeORwsK2WZzr3QaMtFCY3kKJVMRHPzUpKzMhmVy2zIpVgFDpX8MNoIdoqz6KCpCfOJavhfiSbZbN+w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.1", + "diff-sequences": "^27.5.1", + "eslint-compat-utils": "^0.6.4", + "eslint-json-compat-utils": "^0.2.1", + "espree": "^9.6.1 || ^10.3.0", + "graphemer": "^1.4.0", + "jsonc-eslint-parser": "^2.4.0", + "natural-compare": "^1.4.0", + "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-jsonc/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsonc/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", @@ -7275,6 +7400,20 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -7785,7 +7924,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -7909,7 +8048,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -8107,7 +8245,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -8492,7 +8630,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -8609,7 +8747,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8668,7 +8806,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -8743,7 +8881,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -9211,6 +9349,59 @@ "node": ">=6" } }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -10162,7 +10353,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10791,7 +10982,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -10804,7 +10995,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -11692,6 +11883,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@pkgr/core": "^0.3.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/table": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", @@ -11840,7 +12048,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" From 7055ba8bbf4da27c1acf4c150209a21233c3c808 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 10 Sep 2026 19:08:25 +0300 Subject: [PATCH 27/28] fix(SOF-8032): thread scopeGlobal through renderConfigsFromJobMaterialsWorkflows [release] web-app's own fork of this function (now being consolidated away) accepted an optional `scopeGlobal` and forwarded it to `job.render(scopeGlobal)`; jode's canonical version never did. web-app's PropertiesCreate use case relies on this for a real, exercised call site (`if (scope?.global) await job.renderAsync(scope.global)`), so without this the consolidation would silently drop that context at runtime rather than just fail to typecheck. Threads `scopeGlobal` through both the multi-material and per-material branches. Covered by a new test asserting `job.render` is called with the given `scopeGlobal` for each material. Tests: 24 passing (was 22). Co-Authored-By: Claude Sonnet 5 --- src/js/utils.ts | 6 ++++-- tests/js/Job.test.ts | 45 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/js/utils.ts b/src/js/utils.ts index 4a28c97..e19400d 100644 --- a/src/js/utils.ts +++ b/src/js/utils.ts @@ -28,12 +28,14 @@ export function renderConfigsFromJobMaterialsWorkflows({ job, materials, materialsSet, + scopeGlobal, isMultiMaterial = false, }: { job: NamedJob; materials: OrderedMaterial[]; isMultiMaterial?: boolean; materialsSet?: object; + scopeGlobal?: Record; }): ReturnType[] { const originalName = job.name ?? "New Job"; const configs: ReturnType[] = []; @@ -48,13 +50,13 @@ export function renderConfigsFromJobMaterialsWorkflows({ job.setMaterialsSet(materialsSet as Parameters[0]); } - job.render(); + job.render(scopeGlobal); configs.push(job.toJSON()); } else { materials.forEach((material) => { job.setName(renderJinjaTemplate(originalName, { material })); job.setMaterial(material); - job.render(); + job.render(scopeGlobal); const jobConfig = job.toJSON(); delete jobConfig._materials; diff --git a/tests/js/Job.test.ts b/tests/js/Job.test.ts index ecde5ee..a614f5b 100644 --- a/tests/js/Job.test.ts +++ b/tests/js/Job.test.ts @@ -10,7 +10,11 @@ import { SINGLE_JOB_SUFFIX, } from "../../src/js/enums"; import { type JobEntity, Job } from "../../src/js/Job"; -import { renderJinjaTemplate, setJobNameBasedOnMaterials } from "../../src/js/utils"; +import { + renderConfigsFromJobMaterialsWorkflows, + renderJinjaTemplate, + setJobNameBasedOnMaterials, +} from "../../src/js/utils"; // ─── Minimal fixtures ──────────────────────────────────────────────────────── @@ -187,6 +191,45 @@ describe("Job", () => { }); }); +function makeMaterial(formula: string): OrderedMaterial { + return { + formula, + getAsEntityReference: () => ({ _id: formula }), + } as unknown as OrderedMaterial; +} + +describe("renderConfigsFromJobMaterialsWorkflows", () => { + it("passes scopeGlobal through to job.render for each material", () => { + const job = new Job(makeJobConfig()); + const renderCalls: (Record | undefined)[] = []; + const originalRender = job.render.bind(job); + + job.render = (scopeGlobal?: Record) => { + renderCalls.push(scopeGlobal); + return originalRender(scopeGlobal); + }; + + const scopeGlobal = { foo: "bar" }; + + renderConfigsFromJobMaterialsWorkflows({ + job, + materials: [makeMaterial("Si")], + scopeGlobal, + }); + + expect(renderCalls).to.deep.equal([scopeGlobal]); + }); + + it("renders one config per material when not multi-material", () => { + const job = new Job(makeJobConfig({ name: "{{ material.formula }}" })); + const materials = [makeMaterial("Si"), makeMaterial("Ge")]; + + const configs = renderConfigsFromJobMaterialsWorkflows({ job, materials }); + + expect(configs.map((c) => c.name)).to.deep.equal(["Si", "Ge"]); + }); +}); + describe("renderJinjaTemplate", () => { it("renders a simple template with material context", () => { const result = renderJinjaTemplate("Hello {{ material.formula }}", { From c95e91638e346cfb60f5d45562ad707473fd5867 Mon Sep 17 00:00:00 2001 From: Kostiantyn Dvornik Date: Thu, 10 Sep 2026 19:37:19 +0300 Subject: [PATCH 28/28] refactor(SOF-8032): turn setJobNameBasedOnMaterials into a Job method [release] It operated entirely on a job instance's own state (name, _workflow) plus a materials array - a free function taking `job` as its first argument, when Job already has this exact shape for setMaterial/setMaterials/setWorkflow/etc. Its only real caller (job-designer) always called it as `setJobNameBasedOnMaterials(job, materials)` immediately after mutating the same job, so nothing relied on it being usable without a Job instance in hand. Moves the logic onto `Job.setNameBasedOnMaterials(materials)`, drops the free function and its `NamedJob`-typed export, and moves its test under the `Job` describe block as an instance-method test. No behavior change (24 passing, same count as before - the test itself is unchanged apart from calling `job.setNameBasedOnMaterials(...)` instead of the free function). Co-Authored-By: Claude Sonnet 5 --- src/js/Job.ts | 28 ++++++++++++++++++++++++++- src/js/index.ts | 6 +----- src/js/utils.ts | 24 ----------------------- tests/js/Job.test.ts | 46 ++++++++++++++++++++------------------------ 4 files changed, 49 insertions(+), 55 deletions(-) diff --git a/src/js/Job.ts b/src/js/Job.ts index 0a99df3..f5f8ba5 100644 --- a/src/js/Job.ts +++ b/src/js/Job.ts @@ -23,7 +23,7 @@ import WodeWorkflow from "@mat3ra/wode/dist/js/Workflow"; import type { WorkflowSchema } from "@mat3ra/wode/dist/js/workflows/types"; import { defaultDataset } from "./dataset"; -import { JOB_FINAL_STATUS_LIST, JobStatus } from "./enums"; +import { JOB_FINAL_STATUS_LIST, JobStatus, SINGLE_JOB_SUFFIX } from "./enums"; import { type HasProjectSchemaMixin, hasProjectSchemaMixin, @@ -142,6 +142,32 @@ class Job extends InMemoryEntity implements }); } + /** + * Updates the job name to append or remove the per-material jinja suffix based on + * whether the job is multi-material and how many materials are selected. + */ + setNameBasedOnMaterials(materials: OrderedMaterial[]): void { + const isMultiMaterial = Boolean(this._workflow?.isMultiMaterial); + const hasMultipleMaterials = materials.length > 1; + + /** + * Matches Jinja template expressions like: + * {{object.property}}, {{object[index].property}}, {{object.property[index].subproperty}} + */ + const hasJinjaPattern = (this.name ?? "").match( + /\{\{\s*\w+(\[\d+\]|\.\w+)*(\[\d+\])*\.\w+\s*\}\}/g, + ); + + if (!isMultiMaterial && hasMultipleMaterials && !hasJinjaPattern) { + this.setName(`${this.name} ${SINGLE_JOB_SUFFIX}`); + } else if ( + (isMultiMaterial && hasJinjaPattern) || + (!hasMultipleMaterials && hasJinjaPattern) + ) { + this.setName((this.name ?? "").replace(SINGLE_JOB_SUFFIX, "").replace(/\s*$/, "")); + } + } + // ─── Status Helpers ───────────────────────────────────────────────────────── get statusCls(): string { diff --git a/src/js/index.ts b/src/js/index.ts index 88f37cb..ffdceca 100644 --- a/src/js/index.ts +++ b/src/js/index.ts @@ -10,8 +10,4 @@ export { } from "./enums"; export { Job, type EntityReference, type JobEntity } from "./Job"; export { type JobSchemaMixin } from "./generated/JobSchemaMixin"; -export { - renderJinjaTemplate, - renderConfigsFromJobMaterialsWorkflows, - setJobNameBasedOnMaterials, -} from "./utils"; +export { renderJinjaTemplate, renderConfigsFromJobMaterialsWorkflows } from "./utils"; diff --git a/src/js/utils.ts b/src/js/utils.ts index e19400d..b9fea65 100644 --- a/src/js/utils.ts +++ b/src/js/utils.ts @@ -2,7 +2,6 @@ import type { NamedInMemoryEntity } from "@mat3ra/code/dist/js/entity"; import type { OrderedMaterial } from "@mat3ra/wode"; import nunjucks from "nunjucks"; -import { SINGLE_JOB_SUFFIX } from "./enums"; import type { Job } from "./Job"; /** Job with guaranteed name/setName methods (provided by NamedInMemoryEntity base class). */ @@ -66,26 +65,3 @@ export function renderConfigsFromJobMaterialsWorkflows({ return configs; } - -/** - * Updates the job name to append or remove the per-material jinja suffix based on - * whether the job is multi-material and how many materials are selected. - */ -export function setJobNameBasedOnMaterials(job: NamedJob, materials: OrderedMaterial[]): void { - const isMultiMaterial = Boolean(job._workflow?.isMultiMaterial); - const hasMultipleMaterials = materials.length > 1; - - /** - * Matches Jinja template expressions like: - * {{object.property}}, {{object[index].property}}, {{object.property[index].subproperty}} - */ - const hasJinjaPattern = (job.name ?? "").match( - /\{\{\s*\w+(\[\d+\]|\.\w+)*(\[\d+\])*\.\w+\s*\}\}/g, - ); - - if (!isMultiMaterial && hasMultipleMaterials && !hasJinjaPattern) { - job.setName(`${job.name} ${SINGLE_JOB_SUFFIX}`); - } else if ((isMultiMaterial && hasJinjaPattern) || (!hasMultipleMaterials && hasJinjaPattern)) { - job.setName((job.name ?? "").replace(SINGLE_JOB_SUFFIX, "").replace(/\s*$/, "")); - } -} diff --git a/tests/js/Job.test.ts b/tests/js/Job.test.ts index a614f5b..33a1a93 100644 --- a/tests/js/Job.test.ts +++ b/tests/js/Job.test.ts @@ -10,11 +10,7 @@ import { SINGLE_JOB_SUFFIX, } from "../../src/js/enums"; import { type JobEntity, Job } from "../../src/js/Job"; -import { - renderConfigsFromJobMaterialsWorkflows, - renderJinjaTemplate, - setJobNameBasedOnMaterials, -} from "../../src/js/utils"; +import { renderConfigsFromJobMaterialsWorkflows, renderJinjaTemplate } from "../../src/js/utils"; // ─── Minimal fixtures ──────────────────────────────────────────────────────── @@ -189,6 +185,26 @@ describe("Job", () => { expect(job.submittedTimestamp?.status).to.equal("submitted"); }); }); + + describe("setNameBasedOnMaterials", () => { + it("appends jinja suffix when multi materials and no existing jinja pattern", () => { + const workflow = new WodeWorkflow(minimalWorkflowJson); + const job = new Job({ + name: "My Job", + status: JobStatus.pre_submission, + workflow: minimalWorkflowJson, + } as unknown as JobEntity); + job._workflow = workflow; + const materials = [ + { _id: "1" } as unknown as OrderedMaterial, + { _id: "2" } as unknown as OrderedMaterial, + ]; + + job.setNameBasedOnMaterials(materials); + + expect(job.name).to.equal(`My Job ${SINGLE_JOB_SUFFIX}`); + }); + }); }); function makeMaterial(formula: string): OrderedMaterial { @@ -262,23 +278,3 @@ describe("renderJinjaTemplate", () => { ).to.equal("C"); }); }); - -describe("setJobNameBasedOnMaterials", () => { - it("appends jinja suffix when multi materials and no existing jinja pattern", () => { - const workflow = new WodeWorkflow(minimalWorkflowJson); - const job = new Job({ - name: "My Job", - status: JobStatus.pre_submission, - workflow: minimalWorkflowJson, - } as unknown as JobEntity); - job._workflow = workflow; - const materials = [ - { _id: "1" } as unknown as OrderedMaterial, - { _id: "2" } as unknown as OrderedMaterial, - ]; - - setJobNameBasedOnMaterials(job, materials); - - expect(job.name).to.equal(`My Job ${SINGLE_JOB_SUFFIX}`); - }); -});