diff --git a/.github/workflows/deploy-release.yaml b/.github/workflows/deploy-release.yaml index 250ccb7f..e3a1f280 100644 --- a/.github/workflows/deploy-release.yaml +++ b/.github/workflows/deploy-release.yaml @@ -15,4 +15,4 @@ jobs: npm run build prepare-script: >- cp package.json LICENSE README.md build/ && - npm --prefix build pkg delete dependencies + npm --prefix build pkg delete dependencies devDependencies diff --git a/package-lock.json b/package-lock.json index 4dbf7d68..636a95b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,6 @@ "is-unicode-supported": "^2.1.0", "jsep": "^1.4.0", "minimatch": "^10.0.3", - "node-emoji": "^2.2.0", "open": "^10.2.0", "prompts": "^2.4.2", "recast": "^0.23.11", @@ -74,70 +73,27 @@ } }, "node_modules/@ardatan/relay-compiler": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.3.tgz", - "integrity": "sha512-mBDFOGvAoVlWaWqs3hm1AciGHSQE1rqFc/liZTyYz/Oek9yZdT5H26pH2zAFuEiTiBVPPyMuqf5VjOFPI2DGsQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-13.0.1.tgz", + "integrity": "sha512-afG3YPwuSA0E5foouZusz5GlXKs74dObv4cuWyLyfKsYFj2r7oGRNB28v18HvwuLSQtQFCi+DpIe0TZkgQDYyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/runtime": "^7.26.10", - "chalk": "^4.0.0", - "fb-watchman": "^2.0.0", - "immutable": "~3.7.6", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "relay-runtime": "12.0.0", - "signedsource": "^1.0.0" - }, - "bin": { - "relay-compiler": "bin/relay-compiler" + "@babel/runtime": "^7.29.2", + "immutable": "^5.1.5", + "invariant": "^2.2.4" }, "peerDependencies": { "graphql": "*" } }, - "node_modules/@ardatan/relay-compiler/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/@ardatan/relay-compiler/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", - "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/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -146,30 +102,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -195,13 +150,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -211,25 +166,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -248,17 +203,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", "semver": "^6.3.1" }, "engines": { @@ -278,49 +233,49 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -330,35 +285,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -368,65 +323,65 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -491,12 +446,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", - "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz", + "integrity": "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -506,13 +461,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -522,13 +477,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -564,13 +519,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -690,12 +645,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -705,16 +660,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", - "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.28.6" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -724,9 +679,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, "license": "MIT", "engines": { @@ -734,31 +689,31 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -766,13 +721,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -896,9 +851,9 @@ "license": "MIT" }, "node_modules/@croct/sdk": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@croct/sdk/-/sdk-0.22.1.tgz", - "integrity": "sha512-fQPsy9fU55chRoAko4y1tzWfxIOc7iysL2hsfmavVw4FiiHp61fjlX8HvbOX6Gz8LVELhc7DoC8RB9ynlj6dMQ==", + "version": "0.22.2", + "resolved": "https://registry.npmjs.org/@croct/sdk/-/sdk-0.22.2.tgz", + "integrity": "sha512-sI9mUI0jfk7cmGMgUo0P5+QapPHPICz6EgiTb/ximJ2ov/vL7Hh1T3pkJpnBVfl9zzXn07LWR/O6IwUc+TPzeA==", "license": "MIT", "dependencies": { "@croct/content-model": "^0.21.1", @@ -910,27 +865,27 @@ } }, "node_modules/@croct/time": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@croct/time/-/time-0.10.2.tgz", - "integrity": "sha512-qJJwIXERtA5OlW9IiPQnMPd8iJVHLZkDIaT5m1nb7HKvcldmePRevBkuPvCPQcGabondzocrdQHIyV7JwA5xdw==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@croct/time/-/time-0.10.3.tgz", + "integrity": "sha512-YJWJ1BzuNh3NArMxo64ea/T6XVSNZqlM7VjKUzMsU6IO9L7nlbpsfsZCv7I/nsEj5XKZZLrpFUgQPWZqz0kixA==", "license": "MIT" }, "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", "optional": true, @@ -939,9 +894,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, "license": "MIT", "optional": true, @@ -950,9 +905,9 @@ } }, "node_modules/@envelop/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.5.0.tgz", - "integrity": "sha512-nsU1EyJQAStaKHR1ZkB/ug9XBm+WPTliYtdedbJ/L1ykrp7dbbn0srqBeDnZ2mbZVp4hH3d0Fy+Og9OgPWZx+g==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.5.1.tgz", + "integrity": "sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==", "dev": true, "license": "MIT", "dependencies": { @@ -994,9 +949,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", "cpu": [ "ppc64" ], @@ -1011,9 +966,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", "cpu": [ "arm" ], @@ -1028,9 +983,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", "cpu": [ "arm64" ], @@ -1045,9 +1000,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", "cpu": [ "x64" ], @@ -1062,9 +1017,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", "cpu": [ "arm64" ], @@ -1079,9 +1034,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", "cpu": [ "x64" ], @@ -1096,9 +1051,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", "cpu": [ "arm64" ], @@ -1113,9 +1068,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", "cpu": [ "x64" ], @@ -1130,9 +1085,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", "cpu": [ "arm" ], @@ -1147,9 +1102,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", "cpu": [ "arm64" ], @@ -1164,9 +1119,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", "cpu": [ "ia32" ], @@ -1181,9 +1136,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", "cpu": [ "loong64" ], @@ -1198,9 +1153,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", "cpu": [ "mips64el" ], @@ -1215,9 +1170,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", "cpu": [ "ppc64" ], @@ -1232,9 +1187,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", "cpu": [ "riscv64" ], @@ -1249,9 +1204,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", "cpu": [ "s390x" ], @@ -1266,9 +1221,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", "cpu": [ "x64" ], @@ -1283,9 +1238,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", "cpu": [ "arm64" ], @@ -1300,9 +1255,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", "cpu": [ "x64" ], @@ -1317,9 +1272,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", "cpu": [ "arm64" ], @@ -1334,9 +1289,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", "cpu": [ "x64" ], @@ -1351,9 +1306,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", "cpu": [ "arm64" ], @@ -1368,9 +1323,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", "cpu": [ "x64" ], @@ -1385,9 +1340,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", "cpu": [ "arm64" ], @@ -1402,9 +1357,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", "cpu": [ "ia32" ], @@ -1419,9 +1374,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", "cpu": [ "x64" ], @@ -1436,9 +1391,9 @@ } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.6.0.tgz", - "integrity": "sha512-2EX2bBQq1ez++xz2o9tEeEQkyvfieWgUFMH4rtJJri2q0Azvhja3hZGXsjPXs31R4fQkZDtWzNDDK2zQn5UE5g==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.7.2.tgz", + "integrity": "sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==", "dev": true, "license": "MIT", "dependencies": { @@ -1452,7 +1407,7 @@ "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1498,24 +1453,42 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -1552,20 +1525,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -1575,6 +1548,24 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -1599,9 +1590,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -1612,9 +1603,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", "engines": { @@ -2042,13 +2033,13 @@ } }, "node_modules/@graphql-tools/apollo-engine-loader": { - "version": "8.0.28", - "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.28.tgz", - "integrity": "sha512-MzgDrUuoxp6dZeo54zLBL3cEJKJtM3N/2RqK0rbPxPq5X2z6TUA7EGg8vIFTUkt5xelAsUrm8/4ai41ZDdxOng==", + "version": "8.0.30", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.30.tgz", + "integrity": "sha512-hUydKGGECrWloERMmfoMzHZi12X99AM9geCGF5XVsv4iMRl/Iyuet24th4kC9bZ8MlAdCwAwtUsCyv9uRfYwSA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/utils": "^11.1.0", "@whatwg-node/fetch": "^0.10.13", "sync-fetch": "0.6.0", "tslib": "^2.4.0" @@ -2061,9 +2052,9 @@ } }, "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2099,14 +2090,14 @@ } }, "node_modules/@graphql-tools/code-file-loader": { - "version": "8.1.28", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.28.tgz", - "integrity": "sha512-BL3Ft/PFlXDE5nNuqA36hYci7Cx+8bDrPDc8X3VSpZy9iKFBY+oQ+IwqnEHCkt8OSp2n2V0gqTg4u3fcQP1Kwg==", + "version": "8.1.32", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.32.tgz", + "integrity": "sha512-gR5mNQjn0BugDL8a4A+ovS2KEvU52RNOGnbwiq9oWAEHiSv7iqJu77bpWARTzlE1ZFPK5MSQe9218+1t5PbXmQ==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.27", - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/graphql-tag-pluck": "8.3.31", + "@graphql-tools/utils": "^11.1.0", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" @@ -2119,9 +2110,9 @@ } }, "node_modules/@graphql-tools/code-file-loader/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2179,13 +2170,13 @@ } }, "node_modules/@graphql-tools/executor": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.1.tgz", - "integrity": "sha512-n94Qcu875Mji9GQ52n5UbgOTxlgvFJicBPYD+FRks9HKIQpdNPjkkrKZUYNG51XKa+bf03rxNflm4+wXhoHHrA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.3.tgz", + "integrity": "sha512-mgBFC0bsrZPZLu9EnydpMnAuQ8Iiq0CEbUcsmvXsm2/iYektGHDN/+bmb7hicA6dWZtdPfklYJmr21WD0GnOfA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/utils": "^11.1.0", "@graphql-typed-document-node/core": "^3.2.0", "@repeaterjs/repeater": "^3.0.4", "@whatwg-node/disposablestack": "^0.0.6", @@ -2280,17 +2271,17 @@ } }, "node_modules/@graphql-tools/executor-legacy-ws": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.25.tgz", - "integrity": "sha512-6uf4AEXO0QMxJ7AWKVPqEZXgYBJaiz5vf29X0boG8QtcqWy8mqkXKWLND2Swdx0SbEx0efoGFcjuKufUcB0ASQ==", + "version": "1.1.28", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.28.tgz", + "integrity": "sha512-O4uj93GG9iUb3s32eyhUohvyfA8mLhN8FvGzEdK628hFQPhZN75yurtVFrR08DHex71mQ3wYCCFkErpwdJbDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/utils": "^11.1.0", "@types/ws": "^8.0.0", "isomorphic-ws": "^5.0.0", "tslib": "^2.4.0", - "ws": "^8.19.0" + "ws": "^8.20.0" }, "engines": { "node": ">=16.0.0" @@ -2300,9 +2291,9 @@ } }, "node_modules/@graphql-tools/executor-legacy-ws/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2319,9 +2310,9 @@ } }, "node_modules/@graphql-tools/executor/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2338,14 +2329,14 @@ } }, "node_modules/@graphql-tools/git-loader": { - "version": "8.0.32", - "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.32.tgz", - "integrity": "sha512-H5HTp2vevv0rRMEnCJBVmVF8md3LpJI1C1+d6OtzvmuONJ8mOX2mkf9rtoqwiztynVegaDUekvMFsc9k5iE2WA==", + "version": "8.0.36", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.36.tgz", + "integrity": "sha512-PDDakesRu8FJYHJLf9/gkTweh8M19Bymz9i+vOlk9OTs9XmNcCqKM+1S610KX2AodvuBFz/xbesjTtTJIppLPg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.27", - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/graphql-tag-pluck": "8.3.31", + "@graphql-tools/utils": "^11.1.0", "is-glob": "4.0.3", "micromatch": "^4.0.8", "tslib": "^2.4.0", @@ -2359,9 +2350,9 @@ } }, "node_modules/@graphql-tools/git-loader/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2434,14 +2425,14 @@ } }, "node_modules/@graphql-tools/graphql-file-loader": { - "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.9.tgz", - "integrity": "sha512-rkLK46Q62Zxift8B6Kfw6h8SH3pCR3DPCfNeC/lpLwYReezZz+2ARuLDFZjQGjW+4lpMwiAw8CIxDyQAUgqU6A==", + "version": "8.1.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.14.tgz", + "integrity": "sha512-CfAcsSEVkkHfEXLFzrd5rUYpcQEGWNV8lfc1Tb1p5m9HnYICzDDH08I5V33iMrEDza3GuujjjRBYqplBkqwIow==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/import": "7.1.9", - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/import": "^7.1.14", + "@graphql-tools/utils": "^11.1.0", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" @@ -2454,9 +2445,9 @@ } }, "node_modules/@graphql-tools/graphql-file-loader/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2473,18 +2464,18 @@ } }, "node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "8.3.27", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.27.tgz", - "integrity": "sha512-CJ0WVXhGYsfFngpRrAAcjRHyxSDHx4dEz2W15bkwvt9he/AWhuyXm07wuGcoLrl0q0iQp1BiRjU7D8SxWZo3JQ==", + "version": "8.3.31", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.31.tgz", + "integrity": "sha512-ema2RRPZGj8TKruNElyDBHVCNFMxioGIVfLBuiA+GdfmRGt95b/i7Uksnj4EwItA6MCmhxokxZoa/fl6mJt3tw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.10", - "@babel/parser": "^7.26.10", + "@babel/core": "^7.28.6", + "@babel/parser": "^7.29.2", "@babel/plugin-syntax-import-assertions": "^7.26.0", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/utils": "^11.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2495,9 +2486,9 @@ } }, "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2514,14 +2505,13 @@ } }, "node_modules/@graphql-tools/import": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.9.tgz", - "integrity": "sha512-mHzOgyfzsAgstaZPIFEtKg4GVH4FbDHeHYrSs73mAPKS5F59/FlRuUJhAoRnxbVnc3qIZ6EsWBjOjNbnPK8viA==", + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.14.tgz", + "integrity": "sha512-aqLcu04aEidszbXM6M0PWWL8bP17eX9sxXwjYWpglLvIRd4NFqb3C9QzBY8pleqXNMtWqXktlm9BQjevgSrirQ==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^11.0.0", - "@theguild/federation-composition": "^0.21.1", + "@graphql-tools/utils": "^11.1.0", "resolve-from": "5.0.0", "tslib": "^2.4.0" }, @@ -2533,9 +2523,9 @@ } }, "node_modules/@graphql-tools/import/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2552,13 +2542,13 @@ } }, "node_modules/@graphql-tools/json-file-loader": { - "version": "8.0.26", - "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.26.tgz", - "integrity": "sha512-kwy9IFi5QtXXTLBgWkvA1RqsZeJDn0CxsTbhNlziCzmga9fNo7qtZ18k9FYIq3EIoQQlok+b7W7yeyJATA2xhw==", + "version": "8.0.28", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.28.tgz", + "integrity": "sha512-qgCsSkPArnjlNkcYpgGKiXxCTNkrAT9E+l1LhR+Por2jTlKBBeZ8stortkQ/PNDDjuL0WPrLQmHKhNPHabnB3A==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/utils": "^11.1.0", "globby": "^11.0.3", "tslib": "^2.4.0", "unixify": "^1.0.0" @@ -2571,9 +2561,9 @@ } }, "node_modules/@graphql-tools/json-file-loader/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2590,14 +2580,14 @@ } }, "node_modules/@graphql-tools/load": { - "version": "8.1.8", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.8.tgz", - "integrity": "sha512-gxO662b64qZSToK3N6XUxWG5E6HOUjlg5jEnmGvD4bMtGJ0HwEe/BaVZbBQemCfLkxYjwRIBiVfOY9o0JyjZJg==", + "version": "8.1.10", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.10.tgz", + "integrity": "sha512-hjcvfEFtwtc8vGi46wtpmGWadNzfEhzbjqinyFIZuIZPlR4aYdWQtqWtY/RMM4Ew4t1USkMNm6xrqC2TH1vCSA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/schema": "^10.0.31", - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/schema": "^10.0.33", + "@graphql-tools/utils": "^11.1.0", "p-limit": "3.1.0", "tslib": "^2.4.0" }, @@ -2609,9 +2599,9 @@ } }, "node_modules/@graphql-tools/load/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2628,13 +2618,13 @@ } }, "node_modules/@graphql-tools/merge": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.7.tgz", - "integrity": "sha512-Y5E1vTbTabvcXbkakdFUt4zUIzB1fyaEnVmIWN0l0GMed2gdD01TpZWLUm4RNAxpturvolrb24oGLQrBbPLSoQ==", + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.9.tgz", + "integrity": "sha512-iHUWNjRHeQRYdgIMIuChThOwoKzA9vrzYeslgfBo5eUYEyHGZCoDPjAavssoYXLwstYt1dZj2J22jSzc2DrN0Q==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/utils": "^11.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2645,9 +2635,9 @@ } }, "node_modules/@graphql-tools/merge/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2745,14 +2735,14 @@ } }, "node_modules/@graphql-tools/relay-operation-optimizer": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.27.tgz", - "integrity": "sha512-rdkL1iDMFaGDiHWd7Bwv7hbhrhnljkJaD0MXeqdwQlZVgVdUDlMot2WuF7CEKVgijpH6eSC6AxXMDeqVgSBS2g==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.1.4.tgz", + "integrity": "sha512-cwOD/GEo/R//1uGCP0/urIxsMFoUgzkJVyMt9BDM2HhQhU6rSgH5l6lFukAFTJyPJVdyeOdYm2i0Jj5vYWbHTw==", "dev": true, "license": "MIT", "dependencies": { - "@ardatan/relay-compiler": "^12.0.3", - "@graphql-tools/utils": "^11.0.0", + "@ardatan/relay-compiler": "^13.0.1", + "@graphql-tools/utils": "^11.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2763,9 +2753,9 @@ } }, "node_modules/@graphql-tools/relay-operation-optimizer/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2782,14 +2772,14 @@ } }, "node_modules/@graphql-tools/schema": { - "version": "10.0.31", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.31.tgz", - "integrity": "sha512-ZewRgWhXef6weZ0WiP7/MV47HXiuFbFpiDUVLQl6mgXsWSsGELKFxQsyUCBos60Qqy1JEFAIu3Ns6GGYjGkqkQ==", + "version": "10.0.33", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.33.tgz", + "integrity": "sha512-O6P3RIftO0jafnSsFAqpjurUuUxJ43s/AdPVLQsBkI6y4Ic/tKm4C1Qm1KKQsCDTOxXPJClh/v3g7k7yLKCFBQ==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/merge": "^9.1.7", - "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/merge": "^9.1.9", + "@graphql-tools/utils": "^11.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2800,9 +2790,9 @@ } }, "node_modules/@graphql-tools/schema/node_modules/@graphql-tools/utils": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", - "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2929,29 +2919,43 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -3002,27 +3006,6 @@ } } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3131,9 +3114,9 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -3190,9 +3173,9 @@ } }, "node_modules/@jest/console/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -3309,9 +3292,9 @@ } }, "node_modules/@jest/core/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -3398,13 +3381,13 @@ } }, "node_modules/@jest/create-cache-key-function": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-30.2.0.tgz", - "integrity": "sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-30.4.1.tgz", + "integrity": "sha512-R+xGEtzA95NIsvpXJSROG4t01956dDOt17KpamguY4XOnGvdHNFFXE7Er0C1OAsRjOwiIxpKqOvGlznIGZIQlQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0" + "@jest/types": "30.4.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -3458,9 +3441,9 @@ } }, "node_modules/@jest/environment/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -3574,9 +3557,9 @@ } }, "node_modules/@jest/fake-timers/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -3661,9 +3644,9 @@ } }, "node_modules/@jest/globals/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -3701,14 +3684,14 @@ } }, "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", + "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "jest-regex-util": "30.0.1" + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -3790,9 +3773,9 @@ } }, "node_modules/@jest/reporters/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -3853,9 +3836,9 @@ } }, "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", + "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3928,9 +3911,9 @@ } }, "node_modules/@jest/test-result/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -4042,9 +4025,9 @@ } }, "node_modules/@jest/transform/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -4092,14 +4075,14 @@ } }, "node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "version": "30.4.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", + "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -4225,16 +4208,22 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, "node_modules/@nodelib/fs.scandir": { @@ -4275,6 +4264,13 @@ "node": ">= 8" } }, + "node_modules/@package-json/types": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@package-json/types/-/types-0.0.12.tgz", + "integrity": "sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==", + "dev": true, + "license": "MIT" + }, "node_modules/@repeaterjs/repeater": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.6.tgz", @@ -4283,9 +4279,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", - "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", "cpu": [ "arm" ], @@ -4297,9 +4293,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz", - "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", "cpu": [ "arm64" ], @@ -4311,9 +4307,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", - "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", "cpu": [ "arm64" ], @@ -4325,9 +4321,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz", - "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", "cpu": [ "x64" ], @@ -4339,9 +4335,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz", - "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", "cpu": [ "arm64" ], @@ -4353,9 +4349,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz", - "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", "cpu": [ "x64" ], @@ -4367,9 +4363,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz", - "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", "cpu": [ "arm" ], @@ -4381,9 +4377,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz", - "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", "cpu": [ "arm" ], @@ -4395,9 +4391,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz", - "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", "cpu": [ "arm64" ], @@ -4409,9 +4405,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz", - "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", "cpu": [ "arm64" ], @@ -4423,9 +4419,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz", - "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", "cpu": [ "loong64" ], @@ -4437,9 +4433,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz", - "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", "cpu": [ "loong64" ], @@ -4451,9 +4447,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz", - "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", "cpu": [ "ppc64" ], @@ -4465,9 +4461,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz", - "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", "cpu": [ "ppc64" ], @@ -4479,9 +4475,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz", - "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", "cpu": [ "riscv64" ], @@ -4493,9 +4489,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz", - "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", "cpu": [ "riscv64" ], @@ -4507,9 +4503,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz", - "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", "cpu": [ "s390x" ], @@ -4521,9 +4517,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz", - "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", "cpu": [ "x64" ], @@ -4535,9 +4531,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz", - "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", "cpu": [ "x64" ], @@ -4549,9 +4545,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz", - "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", "cpu": [ "x64" ], @@ -4563,9 +4559,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz", - "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", "cpu": [ "arm64" ], @@ -4577,9 +4573,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz", - "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", "cpu": [ "arm64" ], @@ -4591,9 +4587,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz", - "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", "cpu": [ "ia32" ], @@ -4605,9 +4601,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz", - "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", "cpu": [ "x64" ], @@ -4619,9 +4615,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz", - "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", "cpu": [ "x64" ], @@ -4633,24 +4629,12 @@ ] }, "node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -4672,14 +4656,14 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.7.1.tgz", - "integrity": "sha512-zjTUwIsEfT+k9BmXwq1QEFYsb4afBlsI1AXFyWQBgggMzwBFOuu92pGrE5OFx90IOjNl+lUbQoTG7f8S0PkOdg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/types": "^8.53.1", + "@typescript-eslint/types": "^8.56.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -4689,20 +4673,20 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=9.0.0" + "eslint": "^9.0.0 || ^10.0.0" } }, "node_modules/@swc/core": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.11.tgz", - "integrity": "sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.40.tgz", + "integrity": "sha512-2kwzJikRvgtNAG7MwVZY2vEzZjTxKIq5jXOihuSV/8U+Hej8Va22t65aKnJZs3P+NwojZvR8Mf8kyM7O+V8sQg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "peer": true, "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.25" + "@swc/types": "^0.1.26" }, "engines": { "node": ">=10" @@ -4712,16 +4696,18 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.15.11", - "@swc/core-darwin-x64": "1.15.11", - "@swc/core-linux-arm-gnueabihf": "1.15.11", - "@swc/core-linux-arm64-gnu": "1.15.11", - "@swc/core-linux-arm64-musl": "1.15.11", - "@swc/core-linux-x64-gnu": "1.15.11", - "@swc/core-linux-x64-musl": "1.15.11", - "@swc/core-win32-arm64-msvc": "1.15.11", - "@swc/core-win32-ia32-msvc": "1.15.11", - "@swc/core-win32-x64-msvc": "1.15.11" + "@swc/core-darwin-arm64": "1.15.40", + "@swc/core-darwin-x64": "1.15.40", + "@swc/core-linux-arm-gnueabihf": "1.15.40", + "@swc/core-linux-arm64-gnu": "1.15.40", + "@swc/core-linux-arm64-musl": "1.15.40", + "@swc/core-linux-ppc64-gnu": "1.15.40", + "@swc/core-linux-s390x-gnu": "1.15.40", + "@swc/core-linux-x64-gnu": "1.15.40", + "@swc/core-linux-x64-musl": "1.15.40", + "@swc/core-win32-arm64-msvc": "1.15.40", + "@swc/core-win32-ia32-msvc": "1.15.40", + "@swc/core-win32-x64-msvc": "1.15.40" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -4733,9 +4719,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.11.tgz", - "integrity": "sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.40.tgz", + "integrity": "sha512-PaYyclfmQ++77D8ityYvmmVzHv9aG8ROwt2GfG6/ccloy4Hgf80qtOnzb9VYvPsUT7Ty1uhuDRhv3XYpf62qhQ==", "cpu": [ "arm64" ], @@ -4745,14 +4731,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz", - "integrity": "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.40.tgz", + "integrity": "sha512-HbbPzvfLBUXjIB1Ezks+//lNUjmLjfyd63XSwprJgrZaXYdm70kohXPJUWdqKZozolFxbPaO+xtBaiUp6BoueA==", "cpu": [ "x64" ], @@ -4762,14 +4749,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz", - "integrity": "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.40.tgz", + "integrity": "sha512-SlRZsCjOCPR2LvFs0Ri/Xrx/5o5TCt8vl4gW6mX1hEZOG0a625RxzRHpHdAQNGykmAN/7IeaFAJG+QnNmxlHcA==", "cpu": [ "arm" ], @@ -4779,14 +4767,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz", - "integrity": "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.40.tgz", + "integrity": "sha512-Q8byxJt2fh8CR3EUX6snBpy47AoBVm+In/+Z3rjDHMjC38ZvR9/gtUUNCT0tfrn4EdVsO8/QPi59nxrxvqxvBQ==", "cpu": [ "arm64" ], @@ -4796,14 +4785,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz", - "integrity": "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.40.tgz", + "integrity": "sha512-4z0MgHU+7M0pZDqBN1El7mFXDI1SBwinfcUkAyA4v8QrhOIUOZltySt2aStQLZGrdXVXM4Y4ylfiTC04ED+MoQ==", "cpu": [ "arm64" ], @@ -4813,14 +4803,51 @@ "os": [ "linux" ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.40.tgz", + "integrity": "sha512-fLI4iUgeSZu0eRWUXwe6YzPFx9gHbFiPkl8Rp3mJfP8OpNR3nTQCGPvHdDh9xniW7mVvgMY4ni7A4VzqI1KrpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.40.tgz", + "integrity": "sha512-YqeKMAb7d4nQSGMJQ454IlaCENpzcDqhvBE9+CPfdnYpnUXxd+BSrB6Xk0YjW8UyoEhUj4p6quATCxbsp6J3jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz", - "integrity": "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.40.tgz", + "integrity": "sha512-7HOuS1iGcme/j/TuL1TfmmLGiMQrjv/GmjyZeydl00FKPtpGXEldwqfI56xgd1YzrzoB2svWjxbGGyQ0TEASxg==", "cpu": [ "x64" ], @@ -4830,14 +4857,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz", - "integrity": "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.40.tgz", + "integrity": "sha512-h4kZYHc7dpc9P9u4brRJaS8Pl7tPVHAeiLSzw7T5RfIJgAoSdaCMKzI/2Uay9gFhaw8uyCDl0L5q37r0EpAfIA==", "cpu": [ "x64" ], @@ -4847,14 +4875,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz", - "integrity": "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.40.tgz", + "integrity": "sha512-+mQgKZXSj6mV38Zh05QaxSjUDmGP/R2JWlXZTDLSPkDzHU6p3GxN9eeSf5dfyDVU86946fmCvSzyl/ucImx8+A==", "cpu": [ "arm64" ], @@ -4864,14 +4893,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz", - "integrity": "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.40.tgz", + "integrity": "sha512-yvwdPLGd25mcj/mNatjNQ0lZujtQD6psH3v9PNmMb+fSzjbNG8KIDxjFWrcV+fsFVLOkyOmdJsFmX7NAFjVyPw==", "cpu": [ "ia32" ], @@ -4881,14 +4911,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=10" } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz", - "integrity": "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==", + "version": "1.15.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.40.tgz", + "integrity": "sha512-OXtKsLU1bVtInzzDEAY2sYiF/rl4tvAnLLLpuMp3HzAOQZ5A+i69AKDhA1YLQTaMAqO3vzyYNVAYVRMPtSYD4w==", "cpu": [ "x64" ], @@ -4898,6 +4929,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=10" } @@ -4928,38 +4960,20 @@ } }, "node_modules/@swc/types": { - "version": "0.1.25", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", - "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.26.tgz", + "integrity": "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3" } }, - "node_modules/@theguild/federation-composition": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@theguild/federation-composition/-/federation-composition-0.21.3.tgz", - "integrity": "sha512-+LlHTa4UbRpZBog3ggAxjYIFvdfH3UMvvBUptur19TMWkqU4+n3GmN+mDjejU+dyBXIG27c25RsiQP1HyvM99g==", - "dev": true, - "license": "MIT", - "dependencies": { - "constant-case": "^3.0.4", - "debug": "4.4.3", - "json5": "^2.2.3", - "lodash.sortby": "^4.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "graphql": "^16.0.0" - } - }, "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "dev": true, "license": "MIT", "optional": true, @@ -5013,9 +5027,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -5089,14 +5103,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.1.0.tgz", - "integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==", + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "undici-types": "~7.16.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/prompts": { @@ -5162,21 +5175,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/type-utils": "8.54.0", - "@typescript-eslint/utils": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5186,23 +5198,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.54.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", "debug": "^4.4.3" }, "engines": { @@ -5213,19 +5224,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.54.0", - "@typescript-eslint/types": "^8.54.0", + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", "debug": "^4.4.3" }, "engines": { @@ -5236,18 +5247,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0" + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5258,9 +5269,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", "dev": true, "license": "MIT", "engines": { @@ -5271,21 +5282,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5295,14 +5306,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", "dev": true, "license": "MIT", "engines": { @@ -5314,21 +5325,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.54.0", - "@typescript-eslint/tsconfig-utils": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/visitor-keys": "8.54.0", + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5338,47 +5349,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.54.0", - "@typescript-eslint/types": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0" + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5388,19 +5372,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.54.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5410,10 +5394,23 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", "cpu": [ "arm" ], @@ -5425,9 +5422,9 @@ ] }, "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", "cpu": [ "arm64" ], @@ -5439,9 +5436,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", "cpu": [ "arm64" ], @@ -5453,9 +5450,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", "cpu": [ "x64" ], @@ -5467,9 +5464,9 @@ ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", "cpu": [ "x64" ], @@ -5481,9 +5478,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", "cpu": [ "arm" ], @@ -5495,9 +5492,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", "cpu": [ "arm" ], @@ -5509,9 +5506,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", "cpu": [ "arm64" ], @@ -5523,9 +5520,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", "cpu": [ "arm64" ], @@ -5536,10 +5533,38 @@ "linux" ] }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", "cpu": [ "ppc64" ], @@ -5551,9 +5576,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", "cpu": [ "riscv64" ], @@ -5565,9 +5590,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", "cpu": [ "riscv64" ], @@ -5579,9 +5604,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", "cpu": [ "s390x" ], @@ -5593,9 +5618,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", "cpu": [ "x64" ], @@ -5607,9 +5632,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", "cpu": [ "x64" ], @@ -5620,10 +5645,24 @@ "linux" ] }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", "cpu": [ "wasm32" ], @@ -5631,16 +5670,18 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", "cpu": [ "arm64" ], @@ -5652,9 +5693,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", "cpu": [ "ia32" ], @@ -5666,9 +5707,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", "cpu": [ "x64" ], @@ -5737,12 +5778,11 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5785,9 +5825,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -5927,9 +5967,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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": { @@ -6104,13 +6144,6 @@ "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/ast-types": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", @@ -6180,9 +6213,9 @@ } }, "node_modules/axe-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", - "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", "dev": true, "license": "MPL-2.0", "engines": { @@ -6359,11 +6392,13 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -6387,12 +6422,15 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/bl": { @@ -6430,14 +6468,15 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -6454,9 +6493,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -6472,13 +6511,12 @@ } ], "license": "MIT", - "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -6571,15 +6609,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -6654,9 +6692,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", "funding": [ { "type": "opencollective", @@ -6741,6 +6779,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -7084,15 +7123,14 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } }, "node_modules/comment-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", - "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.7.tgz", + "integrity": "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==", "dev": true, "license": "MIT", "engines": { @@ -7232,9 +7270,9 @@ } }, "node_modules/create-jest/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -7411,9 +7449,9 @@ } }, "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -7443,9 +7481,9 @@ } }, "node_modules/default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -7647,9 +7685,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.282", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.282.tgz", - "integrity": "sha512-FCPkJtpst28UmFzd903iU7PdeVTfY0KAeJy+Lk0GLZRwgwYHn/irRcaCbQQOmr5Vytc/7rcavsYLvTM8RiHYhQ==", + "version": "1.5.363", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.363.tgz", + "integrity": "sha512-VjUKPyWzGnT1fujlkEGC/BvN70Hh70KXtAqcmniXviYlJC/ivcT+BWGPyxWVbJZLfvtKR6dqg1L7T7pgAMBtWA==", "license": "ISC" }, "node_modules/emittery": { @@ -7672,12 +7710,6 @@ "dev": true, "license": "MIT" }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "license": "MIT" - }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -7689,9 +7721,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -7778,16 +7810,16 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", @@ -7799,16 +7831,16 @@ "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", - "safe-array-concat": "^1.1.3" + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -7866,13 +7898,12 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -7880,32 +7911,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, "node_modules/esbuild-plugin-file-path-extensions": { @@ -7942,26 +7973,25 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -7980,7 +8010,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -8028,13 +8058,13 @@ } }, "node_modules/eslint-plugin-cypress": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-5.2.1.tgz", - "integrity": "sha512-HTJLbcd7fwJ4agbHinZ4FUIl38bUTJT3BmH8zdgS2V32LETmPqCtWHi3xlgZ2vpX0aW6kQoHCVVqHm8NxZJ9sA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-5.3.0.tgz", + "integrity": "sha512-qjHF2Sdi3VkXSMnfQeUqsbYnessgc6T2dus/Q1U+e5102GpPy9eLd8MWW2Xp2SS9bMpPNLnSHwktMhCKr0dIBg==", "dev": true, "license": "MIT", "dependencies": { - "globals": "^16.2.0" + "globals": "^16.5.0" }, "peerDependencies": { "eslint": ">=9" @@ -8054,9 +8084,9 @@ } }, "node_modules/eslint-plugin-import-newlines": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-newlines/-/eslint-plugin-import-newlines-1.4.0.tgz", - "integrity": "sha512-+Cz1x2xBLtI9gJbmuYEpvY7F8K75wskBmJ7rk4VRObIJo+jklUJaejFJgtnWeL0dCFWabGEkhausrikXaNbtoQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-newlines/-/eslint-plugin-import-newlines-1.4.1.tgz", + "integrity": "sha512-C9PQEJ4jS5tKoE9k0yY/5j4l1bxkxmVjrWvAFc1EToCnuQuwZGl1kS1JBlqYNF8svp0pnXLlkSdjByYa3JALcg==", "dev": true, "license": "MIT", "bin": { @@ -8066,22 +8096,23 @@ "node": ">=10.0.0" }, "peerDependencies": { - "eslint": ">=6.0.0" + "eslint": ">=6.0.0 < 10.0.0" } }, "node_modules/eslint-plugin-import-x": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", - "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.2.tgz", + "integrity": "sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "^8.35.0", + "@package-json/types": "^0.0.12", + "@typescript-eslint/types": "^8.56.0", "comment-parser": "^1.4.1", "debug": "^4.4.1", "eslint-import-context": "^0.1.9", "is-glob": "^4.0.3", - "minimatch": "^9.0.3 || ^10.0.1", + "minimatch": "^9.0.3 || ^10.1.2", "semver": "^7.7.2", "stable-hash-x": "^0.2.0", "unrs-resolver": "^1.9.2" @@ -8093,8 +8124,8 @@ "url": "https://opencollective.com/eslint-plugin-import-x" }, "peerDependencies": { - "@typescript-eslint/utils": "^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/utils": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "eslint-import-resolver-node": "*" }, "peerDependenciesMeta": { @@ -8107,9 +8138,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "29.12.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.12.1.tgz", - "integrity": "sha512-Rxo7r4jSANMBkXLICJKS0gjacgyopfNAsoS0e3R9AHnjoKuQOaaPfmsDJPi8UWwygI099OV/K/JhpYRVkxD4AA==", + "version": "29.15.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz", + "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8120,8 +8151,9 @@ }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "jest": "*" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "jest": "*", + "typescript": ">=4.8.4 <7.0.0" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -8129,6 +8161,9 @@ }, "jest": { "optional": true + }, + "typescript": { + "optional": true } } }, @@ -8187,10 +8222,28 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -8256,10 +8309,28 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -8280,20 +8351,20 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.15.4.tgz", - "integrity": "sha512-qP0ZPWAvDrS3oxZJErUfn3SZiIzj5Zh2EWuyWxjR5Bsk84ntxpquh4D0USorfyw5MzECURQ8OcEeBQdspHatzQ==", + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.16.2.tgz", + "integrity": "sha512-8gleGnQXK2ZA3hHwjCwpYTZvM+9VsrJ+/9kDI8CjqAQGAdMQOdn/rJNu7ZySENuiWlGKQWyZJ4ZjEg2zamaRHw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "^8.51.0", - "@typescript-eslint/utils": "^8.51.0" + "@typescript-eslint/scope-manager": "^8.56.0", + "@typescript-eslint/utils": "^8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/eslint-scope": { @@ -8342,6 +8413,24 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8370,9 +8459,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -8588,29 +8677,6 @@ "bser": "2.1.1" } }, - "node_modules/fbjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^1.0.35" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", - "dev": true, - "license": "MIT" - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -8749,9 +8815,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -8876,9 +8942,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "license": "MIT", "engines": { "node": ">=18" @@ -8967,9 +9033,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", "dev": true, "license": "MIT", "dependencies": { @@ -8983,7 +9049,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -9014,10 +9080,28 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -9052,9 +9136,9 @@ } }, "node_modules/globals": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.2.0.tgz", - "integrity": "sha512-tovnCz/fEq+Ripoq+p/gN1u7l6A7wwkoBT9pRCzTHzsD/LvADIzXZdjmRymh5Ztf0DYC3Rwg5cZRYjxzBmzbWg==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", "dev": true, "license": "MIT", "engines": { @@ -9109,108 +9193,263 @@ "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">= 4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphql": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.0.tgz", + "integrity": "sha512-BBvQ/406p+4CZbTpCbVPSxfzrZrbnuWSP1ELYgyS6B+hNeKzgrdB4JczCa5VZUBQrDa9hUngm0KnexY6pJRN5Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-config": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.6.tgz", + "integrity": "sha512-fCkYnm4Kdq3un0YIM4BCZHVR5xl0UeLP6syxxO7KAstdY7QVyVvTHP0kRPDYEP1v08uwtJVgis5sj3IOTLOniQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^9.0.0", + "@graphql-tools/utils": "^11.0.0", + "cosmiconfig": "^8.1.0", + "jiti": "^2.0.0", + "minimatch": "^10.0.0", + "string-env-interpolation": "^1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/graphql-config/node_modules/@graphql-hive/signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-2.0.0.tgz", + "integrity": "sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/batch-execute": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-10.0.8.tgz", + "integrity": "sha512-Kobt37qrVTFhX4HUK5/vPgMXFw/5f97AzmAlfmDBSRh/GnoAmLKCb48FrEI3gdeIwZB2fEhVHJyDqsojldnLQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/delegate": { + "version": "12.0.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.0.16.tgz", + "integrity": "sha512-WEJaFwWG82a0VzhfE4sRsaOPjxgCVfn4fOe3ho+r3uIbPYpc7qHpFdu1PLg6meikq6fuW9NJ1J88fEgnWuXDVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/batch-execute": "^10.0.8", + "@graphql-tools/executor": "^1.4.13", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-1.0.6.tgz", + "integrity": "sha512-23/K5C+LSlHDI0mj2SwCJ33RcELCcyDUgABm1Z8St7u/4Z5+95i925H/NAjUyggRjiaY8vYtNiMOPE49aPX1sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.4.0", + "@graphql-tools/utils": "^11.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-graphql-ws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-3.1.5.tgz", + "integrity": "sha512-WXRsfwu9AkrORD9nShrd61OwwxeQ5+eXYcABRR3XPONFIS8pWQfDJGGqxql9/227o/s0DV5SIfkBURb5Knzv+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.6", + "isows": "^1.0.7", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/graphql-config/node_modules/@graphql-tools/executor-http": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.3.0.tgz", + "integrity": "sha512-IkKXIjSg9U8MNsQUBVJAXE4+LSxaQ0cs7p5JTALLGDABY1o17vPDRwWALsX81AXD5dY27ihi/+OhGMueW/Fopg==", "dev": true, "license": "MIT", + "dependencies": { + "@graphql-hive/signal": "^2.0.0", + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.3.2", + "meros": "^1.3.2", + "tslib": "^2.8.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=20.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphql": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", - "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", + "node_modules/graphql-config/node_modules/@graphql-tools/url-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.1.2.tgz", + "integrity": "sha512-pVSiPrfWQKb3jq23Pl7EjbB2uv3tgZLnWo/axkmg4itAEZ5s/vV/jKa8P1HZzUnSVUTR+8tcEZVeNsUbzFCbkg==", "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^3.1.4", + "@graphql-tools/executor-http": "^3.2.1", + "@graphql-tools/executor-legacy-ws": "^1.1.28", + "@graphql-tools/utils": "^11.1.0", + "@graphql-tools/wrap": "^11.1.1", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0", + "ws": "^8.20.0" + }, "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/graphql-config": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.5.tgz", - "integrity": "sha512-mG2LL1HccpU8qg5ajLROgdsBzx/o2M6kgI3uAmoaXiSH9PCUbtIyLomLqUtCFaAeG2YCFsl0M5cfQ9rKmDoMVA==", + "node_modules/graphql-config/node_modules/@graphql-tools/utils": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz", + "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/graphql-file-loader": "^8.0.0", - "@graphql-tools/json-file-loader": "^8.0.0", - "@graphql-tools/load": "^8.1.0", - "@graphql-tools/merge": "^9.0.0", - "@graphql-tools/url-loader": "^8.0.0", - "@graphql-tools/utils": "^10.0.0", - "cosmiconfig": "^8.1.0", - "jiti": "^2.0.0", - "minimatch": "^9.0.5", - "string-env-interpolation": "^1.0.1", + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", "tslib": "^2.4.0" }, "engines": { - "node": ">= 16.0.0" + "node": ">=16.0.0" }, "peerDependencies": { - "cosmiconfig-toml-loader": "^1.0.0", - "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "cosmiconfig-toml-loader": { - "optional": true - } + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/graphql-config/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/graphql-config/node_modules/@graphql-tools/wrap": { + "version": "11.1.15", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.15.tgz", + "integrity": "sha512-GCMx6l0MPwHVaBMHf29oG8eIrsJ8PBXq9y5DNX9/r9oCpCBfqxfWzcejx4CpO4chA3+yylGOKcAyEbOUgxfI1Q==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@graphql-tools/delegate": "^12.0.16", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "node_modules/graphql-config/node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/graphql-config/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/graphql-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz", @@ -9242,9 +9481,9 @@ } }, "node_modules/graphql-ws": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.7.tgz", - "integrity": "sha512-yoLRW+KRlDmnnROdAu7sX77VNLC0bsFoZyGQJLy1cF+X/SkLg/fWkRGrEEYQK8o2cafJ2wmEaMqMEZB3U3DYDg==", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.8.tgz", + "integrity": "sha512-m3EOaNsUBXwAnkBWbzPfe0Nq8pXUfxsWnolC54sru3FzHvhTZL0Ouf/BoQsaGAXqM+YPerXOJ47BUnmgmoupCw==", "dev": true, "license": "MIT", "engines": { @@ -9349,9 +9588,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -9464,14 +9703,11 @@ } }, "node_modules/immutable": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", - "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.8.0" - } + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", @@ -9892,13 +10128,13 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -10382,9 +10618,9 @@ } }, "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -10434,6 +10670,22 @@ "ws": "*" } }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -10529,7 +10781,6 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -10746,9 +10997,9 @@ } }, "node_modules/jest-circus/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -10851,9 +11102,9 @@ } }, "node_modules/jest-cli/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -10968,9 +11219,9 @@ } }, "node_modules/jest-config/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -11144,9 +11395,9 @@ } }, "node_modules/jest-each/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -11233,9 +11484,9 @@ } }, "node_modules/jest-environment-node/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -11340,9 +11591,9 @@ } }, "node_modules/jest-haste-map/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -11505,9 +11756,9 @@ } }, "node_modules/jest-message-util/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -11591,9 +11842,9 @@ } }, "node_modules/jest-mock/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -11649,9 +11900,9 @@ } }, "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "version": "30.4.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", + "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", "dev": true, "license": "MIT", "engines": { @@ -11737,12 +11988,13 @@ } }, "node_modules/jest-resolve/node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -11822,9 +12074,9 @@ } }, "node_modules/jest-runner/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -11927,9 +12179,9 @@ } }, "node_modules/jest-runtime/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -12040,9 +12292,9 @@ } }, "node_modules/jest-snapshot/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -12129,9 +12381,9 @@ } }, "node_modules/jest-util/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -12185,9 +12437,9 @@ } }, "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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": { @@ -12247,9 +12499,9 @@ } }, "node_modules/jest-validate/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -12351,9 +12603,9 @@ } }, "node_modules/jest-watcher/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -12454,9 +12706,9 @@ } }, "node_modules/jest/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -12547,7 +12799,6 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 10.16.0" } @@ -12864,9 +13115,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, @@ -13267,9 +13518,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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": { @@ -13304,31 +13555,31 @@ } }, "node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^5.0.5" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" } }, "node_modules/ms": { @@ -13411,19 +13662,33 @@ "node": ">=10.5.0" } }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" }, "engines": { - "node": ">=18" + "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-fetch": { @@ -13465,10 +13730,13 @@ } }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "license": "MIT" + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", + "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-path": { "version": "3.0.0", @@ -13507,13 +13775,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, - "license": "MIT" - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14096,9 +14357,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -14291,22 +14552,12 @@ } }, "node_modules/pretty-format/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "asap": "~2.0.3" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -14483,18 +14734,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/relay-runtime": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", - "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.0.0", - "fbjs": "^3.0.0", - "invariant": "^2.2.4" - } - }, "node_modules/remedial": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", @@ -14540,19 +14779,25 @@ } }, "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "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": { - "is-core-module": "^2.13.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": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14650,9 +14895,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", - "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", "dev": true, "license": "MIT", "dependencies": { @@ -14666,34 +14911,41 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.0", - "@rollup/rollup-android-arm64": "4.57.0", - "@rollup/rollup-darwin-arm64": "4.57.0", - "@rollup/rollup-darwin-x64": "4.57.0", - "@rollup/rollup-freebsd-arm64": "4.57.0", - "@rollup/rollup-freebsd-x64": "4.57.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", - "@rollup/rollup-linux-arm-musleabihf": "4.57.0", - "@rollup/rollup-linux-arm64-gnu": "4.57.0", - "@rollup/rollup-linux-arm64-musl": "4.57.0", - "@rollup/rollup-linux-loong64-gnu": "4.57.0", - "@rollup/rollup-linux-loong64-musl": "4.57.0", - "@rollup/rollup-linux-ppc64-gnu": "4.57.0", - "@rollup/rollup-linux-ppc64-musl": "4.57.0", - "@rollup/rollup-linux-riscv64-gnu": "4.57.0", - "@rollup/rollup-linux-riscv64-musl": "4.57.0", - "@rollup/rollup-linux-s390x-gnu": "4.57.0", - "@rollup/rollup-linux-x64-gnu": "4.57.0", - "@rollup/rollup-linux-x64-musl": "4.57.0", - "@rollup/rollup-openbsd-x64": "4.57.0", - "@rollup/rollup-openharmony-arm64": "4.57.0", - "@rollup/rollup-win32-arm64-msvc": "4.57.0", - "@rollup/rollup-win32-ia32-msvc": "4.57.0", - "@rollup/rollup-win32-x64-gnu": "4.57.0", - "@rollup/rollup-win32-x64-msvc": "4.57.0", + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -14751,15 +15003,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -14841,9 +15093,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -14913,13 +15165,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -14942,9 +15187,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true, "license": "MIT", "engines": { @@ -14975,14 +15220,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -15042,31 +15287,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/signedsource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", - "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -15400,12 +15626,12 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -15634,10 +15860,28 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -15701,14 +15945,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -15765,9 +16009,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -15953,18 +16197,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -15979,7 +16223,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15989,16 +16232,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", - "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz", + "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.54.0", - "@typescript-eslint/parser": "8.54.0", - "@typescript-eslint/typescript-estree": "8.54.0", - "@typescript-eslint/utils": "8.54.0" + "@typescript-eslint/eslint-plugin": "8.60.0", + "@typescript-eslint/parser": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -16008,41 +16251,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", - "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "dev": true, "license": "MIT" }, @@ -16076,21 +16292,12 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "dev": true, "license": "MIT" }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/unixify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", @@ -16118,39 +16325,41 @@ } }, "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { - "napi-postinstall": "^0.3.0" + "napi-postinstall": "^0.3.4" }, "funding": { "url": "https://opencollective.com/unrs-resolver" }, "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" } }, "node_modules/update-browserslist-db": { @@ -16383,14 +16592,14 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.21.tgz", + "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -16487,12 +16696,11 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -16571,9 +16779,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", "bin": { diff --git a/package.json b/package.json index 8a3f4a00..f625641d 100644 --- a/package.json +++ b/package.json @@ -95,5 +95,8 @@ "files": [ "**/*.js", "**/*.ts" - ] + ], + "overrides": { + "lodash": "^4.17.24" + } } diff --git a/src/application/model/platform.ts b/src/application/model/platform.ts index d4b0b230..67a38c5a 100644 --- a/src/application/model/platform.ts +++ b/src/application/model/platform.ts @@ -1,6 +1,8 @@ export enum Platform { NEXTJS = 'nextjs', + NUXT = 'nuxt', REACT = 'react', + VUE = 'vue', JAVASCRIPT = 'javascript', } @@ -10,9 +12,15 @@ export namespace Platform { case Platform.NEXTJS: return 'Next.js'; + case Platform.NUXT: + return 'Nuxt'; + case Platform.REACT: return 'React'; + case Platform.VUE: + return 'Vue'; + case Platform.JAVASCRIPT: return 'JavaScript'; } diff --git a/src/application/project/code/generation/example.ts b/src/application/project/code/generation/example.ts index 6d871fee..2d891d28 100644 --- a/src/application/project/code/generation/example.ts +++ b/src/application/project/code/generation/example.ts @@ -4,6 +4,7 @@ export enum CodeLanguage { JAVASCRIPT_XML = 'jsx', TYPESCRIPT = 'typescript', TYPESCRIPT_XML = 'tsx', + VUE = 'vue', } export type ExampleFile = { diff --git a/src/application/project/code/generation/slot/plugNuxtExampleGenerator.ts b/src/application/project/code/generation/slot/plugNuxtExampleGenerator.ts new file mode 100644 index 00000000..708476c2 --- /dev/null +++ b/src/application/project/code/generation/slot/plugNuxtExampleGenerator.ts @@ -0,0 +1,17 @@ +import {VueExampleGenerator} from './vueExampleGenerator'; +import type {SlotDefinition} from './slotExampleGenerator'; +import type {CodeWriter} from '@/application/project/code/generation/codeWritter'; + +export class PlugNuxtExampleGenerator extends VueExampleGenerator { + protected writeSlotScript(writer: CodeWriter, definition: SlotDefinition): void { + this.writeScriptOpening(writer); + + writer.write(`const {data} = await useContent('${definition.id}@${definition.version}');`); + + this.writeScriptClosing(writer); + } + + protected writePageScript(): void { + // Nuxt auto-imports components from `components/`, so the page needs no script section. + } +} diff --git a/src/application/project/code/generation/slot/plugVueExampleGenerator.ts b/src/application/project/code/generation/slot/plugVueExampleGenerator.ts new file mode 100644 index 00000000..db248d38 --- /dev/null +++ b/src/application/project/code/generation/slot/plugVueExampleGenerator.ts @@ -0,0 +1,31 @@ +import {VueExampleGenerator} from './vueExampleGenerator'; +import type {SlotFile} from './vueExampleGenerator'; +import type {SlotDefinition} from './slotExampleGenerator'; +import type {CodeWriter} from '@/application/project/code/generation/codeWritter'; + +export class PlugVueExampleGenerator extends VueExampleGenerator { + protected writeSlotScript(writer: CodeWriter, definition: SlotDefinition): void { + const variable = this.options.contentVariable; + const dataBinding = variable === 'data' ? variable : `data: ${variable}`; + + this.writeScriptOpening(writer); + + writer.write("import {useContent} from '@croct/plug-vue';") + .newLine() + .write(`const {${dataBinding}, isLoading} = useContent('${definition.id}@${definition.version}');`); + + this.writeScriptClosing(writer); + } + + protected writePageScript(writer: CodeWriter, slot: SlotFile): void { + this.writeScriptOpening(writer); + + writer.write(`import ${slot.name} from '${slot.importPath}';`); + + this.writeScriptClosing(writer); + } + + protected override getLoadingFlag(): string { + return 'isLoading'; + } +} diff --git a/src/application/project/code/generation/slot/vueExampleGenerator.ts b/src/application/project/code/generation/slot/vueExampleGenerator.ts new file mode 100644 index 00000000..5882de19 --- /dev/null +++ b/src/application/project/code/generation/slot/vueExampleGenerator.ts @@ -0,0 +1,302 @@ +import type { + AttributeDefinition, + ContentDefinition, + RootDefinition, +} from '@croct/content-model/definition/definition'; +import type {SlotDefinition, SlotExampleGenerator} from './slotExampleGenerator'; +import type {CodeExample, ExampleFile} from '@/application/project/code/generation/example'; +import {CodeLanguage} from '@/application/project/code/generation/example'; +import {CodeWriter} from '@/application/project/code/generation/codeWritter'; +import {formatLabel, formatSlug, sortAttributes} from '@/application/project/code/generation/utils'; +import {formatName} from '@/application/project/utils/formatName'; + +export type Configuration = { + typescript: boolean, + indentationSize?: number, + contentVariable: string, + slotImportPath: string, + slotFilePath: string, + slotComponentName: string, + pageFilePath: string, +}; + +export type SlotFile = { + name: string, + path: string, + importPath: string, + definition: SlotDefinition, +}; + +type Attribute = AttributeDefinition & { + name: string, +}; + +export abstract class VueExampleGenerator implements SlotExampleGenerator { + protected readonly options: Configuration; + + public constructor(options: Configuration) { + this.options = options; + } + + public generate(definition: SlotDefinition): CodeExample { + const slotPath = VueExampleGenerator.replaceVariables(this.options.slotFilePath, definition.id); + const slotName = VueExampleGenerator.replaceVariables(this.options.slotComponentName, definition.id); + + return { + files: [ + this.generatePageFile(definition, { + name: slotName, + path: slotPath, + importPath: VueExampleGenerator.replaceVariables(this.options.slotImportPath, definition.id), + definition: definition, + }), + this.generateSlotFile(definition, slotPath), + ], + }; + } + + protected abstract writeSlotScript(writer: CodeWriter, definition: SlotDefinition): void; + + protected abstract writePageScript(writer: CodeWriter, slot: SlotFile): void; + + protected getLoadingFlag(): string | null { + return null; + } + + private generateSlotFile(definition: SlotDefinition, path: string): ExampleFile { + const writer = this.createWriter(); + const variable = this.options.contentVariable; + const loadingFlag = this.getLoadingFlag(); + + this.writeSlotScript(writer, definition); + + writer.newLine(); + writer.write('', false); + + return { + path: path, + language: CodeLanguage.VUE, + code: writer.toString(), + }; + } + + private generatePageFile(definition: SlotDefinition, slot: SlotFile): ExampleFile { + const writer = this.createWriter(); + const pagePath = VueExampleGenerator.replaceVariables(this.options.pageFilePath, definition.id); + + this.writePageScript(writer, slot); + + if (writer.toString() !== '') { + writer.newLine(); + } + + writer.write('', false); + + return { + path: pagePath, + language: CodeLanguage.VUE, + code: writer.toString(), + }; + } + + protected writeScriptOpening(writer: CodeWriter): void { + writer.write(this.options.typescript ? ''); + } + + private writeRoot(writer: CodeWriter, definition: RootDefinition, path: string): void { + if (definition.type === 'union') { + this.writeUnion(writer, definition, path); + + return; + } + + writer.write(`'); + } + + private writeFragment(writer: CodeWriter, definition: ContentDefinition, path: string): void { + switch (definition.type) { + case 'text': + case 'number': + writer.append(`{{ ${path} }}`); + + break; + + case 'boolean': + writer.append(VueExampleGenerator.formatBooleanInterpolation(definition, path)); + + break; + + case 'list': + this.writeList(writer, definition, path); + + break; + + case 'structure': + writer.write(''); + + break; + + case 'union': + this.writeUnion(writer, definition, path); + + break; + } + } + + private writeList(writer: CodeWriter, definition: ContentDefinition<'list'>, path: string): void { + const variable = definition.itemLabel !== undefined + ? formatName(definition.itemLabel) + : 'item'; + + writer.write('
    ') + .indent() + .write(`
  1. `) + .indent(); + + const inline = VueExampleGenerator.isInline(definition.items); + + if (inline) { + writer.appendIndentation(); + } + + this.writeFragment(writer, definition.items, variable); + + if (inline) { + writer.newLine(); + } + + writer.outdent() + .write('
  2. ') + .outdent() + .write('
'); + } + + private writeStructureAttributes( + writer: CodeWriter, + definition: ContentDefinition<'structure'>, + path: string, + ): void { + for (const [name, attribute] of sortAttributes(definition.attributes)) { + if (attribute.private === true) { + continue; + } + + this.writeAttribute(writer, {name: name, ...attribute}, path); + } + } + + private writeAttribute(writer: CodeWriter, attribute: Attribute, parentPath: string): void { + const path = `${parentPath}.${attribute.name}`; + const definition = attribute.type; + const label = VueExampleGenerator.escapeEntities(attribute.label ?? formatLabel(attribute.name)); + const guard = attribute.optional === true ? ` v-if="${path}"` : ''; + + switch (definition.type) { + case 'boolean': + case 'text': + case 'number': { + writer.write(``, false) + .append(`${label}: `); + + this.writeFragment(writer, definition, path); + + writer.append('') + .newLine(); + + break; + } + + default: + writer.write(``) + .indent() + .write(`${label}`); + + this.writeFragment(writer, definition, path); + + writer.outdent() + .write(''); + + break; + } + } + + private writeUnion(writer: CodeWriter, definition: ContentDefinition<'union'>, path: string): void { + for (const [id, variant] of Object.entries(definition.types)) { + writer.write(`'); + } + } + + private static formatBooleanInterpolation( + definition: ContentDefinition<'boolean'>, + path: string, + ): string { + const trueLabel = definition.label?.true ?? 'Yes'; + const falseLabel = definition.label?.false ?? 'No'; + + return `{{ ${path} ? '${trueLabel.replace(/'/g, "\\'")}' : '${falseLabel.replace(/'/g, "\\'")}' }}`; + } + + private static isInline(definition: ContentDefinition): boolean { + return ['number', 'text', 'boolean'].includes(definition.type); + } + + private static escapeEntities(value: string): string { + return value + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); + } + + private createWriter(): CodeWriter { + return new CodeWriter(this.options.indentationSize); + } + + private static replaceVariables(path: string, id: string): string { + return path.replace(/%name%/g, CodeWriter.formatName(id, true)) + .replace(/%slug%/g, formatSlug(id)); + } +} diff --git a/src/application/project/code/transformation/javascript/nuxtConfigModuleCodemod.ts b/src/application/project/code/transformation/javascript/nuxtConfigModuleCodemod.ts new file mode 100644 index 00000000..7053153d --- /dev/null +++ b/src/application/project/code/transformation/javascript/nuxtConfigModuleCodemod.ts @@ -0,0 +1,221 @@ +import * as t from '@babel/types'; +import {traverse} from '@babel/core'; +import type {Codemod, CodemodOptions, ResultCode} from '@/application/project/code/transformation/codemod'; +import {getImportLocalName} from '@/application/project/code/transformation/javascript/utils/getImportLocalName'; + +export type NuxtConfigModuleConfiguration = { + moduleName: string, +}; + +/** + * Appends a module to the modules array of the Nuxt configuration. + * + * Supports both the defineNuxtConfig call form and bare object exports, + * including the indirect variable forms of each. Type-assertion wrappers + * are transparently unwrapped. If the module is already configured, the + * codemod returns unmodified. + */ +export class NuxtConfigModuleCodemod implements Codemod { + private readonly configuration: NuxtConfigModuleConfiguration; + + public constructor(configuration: NuxtConfigModuleConfiguration) { + this.configuration = configuration; + } + + public apply(input: t.File): Promise> { + const config = NuxtConfigModuleCodemod.findConfig(input); + + if (config === null) { + return Promise.resolve({modified: false, result: input}); + } + + const modulesProperty = NuxtConfigModuleCodemod.findModulesProperty(config); + + if (modulesProperty === null) { + config.properties.push( + t.objectProperty( + t.identifier('modules'), + t.arrayExpression([t.stringLiteral(this.configuration.moduleName)]), + ), + ); + + return Promise.resolve({modified: true, result: input}); + } + + if (!t.isArrayExpression(modulesProperty.value)) { + return Promise.resolve({modified: false, result: input}); + } + + if (this.hasModule(modulesProperty.value)) { + return Promise.resolve({modified: false, result: input}); + } + + modulesProperty.value + .elements + .push(t.stringLiteral(this.configuration.moduleName)); + + return Promise.resolve({modified: true, result: input}); + } + + private hasModule(array: t.ArrayExpression): boolean { + for (const element of array.elements) { + if (element === null) { + continue; + } + + if (t.isStringLiteral(element) && element.value === this.configuration.moduleName) { + return true; + } + + if (t.isArrayExpression(element)) { + const [first] = element.elements; + + if (first !== null && t.isStringLiteral(first) && first.value === this.configuration.moduleName) { + return true; + } + } + } + + return false; + } + + private static findConfig(ast: t.File): t.ObjectExpression | null { + const defineName = NuxtConfigModuleCodemod.resolveDefineName(ast); + + let configObject: t.ObjectExpression | null = null; + + traverse(ast, { + ExportDefaultDeclaration: path => { + const declaration = NuxtConfigModuleCodemod.unwrapTypeWrapper(path.node.declaration); + + if (t.isObjectExpression(declaration)) { + configObject = declaration; + + return path.stop(); + } + + if (t.isCallExpression(declaration)) { + const inner = NuxtConfigModuleCodemod.unwrapDefineCall(declaration, defineName); + + if (inner !== null) { + configObject = inner; + + return path.stop(); + } + + return path.skip(); + } + + if (t.isIdentifier(declaration)) { + const resolved = NuxtConfigModuleCodemod.resolveBinding(ast, declaration.name, defineName); + + if (resolved !== null) { + configObject = resolved; + } + + return path.stop(); + } + + return path.skip(); + }, + }); + + return configObject; + } + + private static resolveDefineName(ast: t.File): string { + return getImportLocalName(ast, { + moduleName: /^nuxt(\/.+)?$/, + importName: 'defineNuxtConfig', + }) ?? 'defineNuxtConfig'; + } + + private static findModulesProperty(config: t.ObjectExpression): t.ObjectProperty | null { + for (const property of config.properties) { + if (!t.isObjectProperty(property) || property.computed) { + continue; + } + + const {key} = property; + + if (t.isIdentifier(key) && key.name === 'modules') { + return property; + } + + if (t.isStringLiteral(key) && key.value === 'modules') { + return property; + } + } + + return null; + } + + private static unwrapDefineCall(call: t.CallExpression, defineName: string): t.ObjectExpression | null { + if (!t.isIdentifier(call.callee) || call.callee.name !== defineName) { + return null; + } + + const firstArg = call.arguments[0]; + + if (firstArg === undefined) { + return null; + } + + const unwrapped = NuxtConfigModuleCodemod.unwrapTypeWrapper(firstArg); + + return t.isObjectExpression(unwrapped) ? unwrapped : null; + } + + private static unwrapTypeWrapper(node: t.Node): t.Node { + let current = node; + + while ( + t.isTSAsExpression(current) + || t.isTSSatisfiesExpression(current) + || t.isTSTypeAssertion(current) + || t.isTSNonNullExpression(current) + ) { + current = current.expression; + } + + return current; + } + + private static resolveBinding(ast: t.File, name: string, defineName: string): t.ObjectExpression | null { + let resolved: t.ObjectExpression | null = null; + + traverse(ast, { + VariableDeclarator: path => { + const {node} = path; + + if (!t.isIdentifier(node.id) || node.id.name !== name) { + return; + } + + if (node.init === undefined || node.init === null) { + return; + } + + const init = NuxtConfigModuleCodemod.unwrapTypeWrapper(node.init); + + if (t.isObjectExpression(init)) { + resolved = init; + + return path.stop(); + } + + if (t.isCallExpression(init)) { + const inner = NuxtConfigModuleCodemod.unwrapDefineCall(init, defineName); + + if (inner !== null) { + resolved = inner; + + return path.stop(); + } + } + }, + }); + + return resolved; + } +} diff --git a/src/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod.ts b/src/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod.ts new file mode 100644 index 00000000..4902a451 --- /dev/null +++ b/src/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod.ts @@ -0,0 +1,107 @@ +import * as t from '@babel/types'; +import {traverse} from '@babel/core'; +import type {Codemod, CodemodOptions, ResultCode} from '@/application/project/code/transformation/codemod'; +import {addImport} from '@/application/project/code/transformation/javascript/utils/addImport'; +import {getImportLocalName} from '@/application/project/code/transformation/javascript/utils/getImportLocalName'; + +export type NuxtStoryblokPluginConfiguration = { + plugin: { + module: string, + factory: string, + }, + storyblokVueModule: string, + nuxtAppModule: string, +}; + +/** + * Scaffolds the Croct Storyblok plugin file for Nuxt. + * + * Generates the canonical plugin body that wires the Storyblok API into Croct + * inside a defineNuxtPlugin callback. Leaves hand-edited files untouched: if a + * plugin definition is already present, the codemod returns unmodified. + */ +export class NuxtStoryblokPluginCodemod implements Codemod { + private readonly configuration: NuxtStoryblokPluginConfiguration; + + public constructor(configuration: NuxtStoryblokPluginConfiguration) { + this.configuration = configuration; + } + + public apply(input: t.File): Promise> { + if (NuxtStoryblokPluginCodemod.hasPluginDefinition(input)) { + return Promise.resolve({modified: false, result: input}); + } + + const factoryImport = addImport(input, { + type: 'value', + moduleName: this.configuration.plugin.module, + importName: this.configuration.plugin.factory, + }); + + const useStoryblokApiImport = addImport(input, { + type: 'value', + moduleName: this.configuration.storyblokVueModule, + importName: 'useStoryblokApi', + }); + + const defineNuxtPluginImport = addImport(input, { + type: 'value', + moduleName: this.configuration.nuxtAppModule, + importName: 'defineNuxtPlugin', + }); + + const pluginCallback = t.arrowFunctionExpression( + [t.identifier('nuxtApp')], + t.blockStatement([ + t.expressionStatement( + t.callExpression( + t.identifier(factoryImport.localName), + [ + t.identifier('nuxtApp'), + t.callExpression( + t.identifier(useStoryblokApiImport.localName), + [], + ), + ], + ), + ), + ]), + ); + + const defaultExport = t.exportDefaultDeclaration( + t.callExpression( + t.identifier(defineNuxtPluginImport.localName), + [pluginCallback], + ), + ); + + input.program + .body + .push(defaultExport); + + return Promise.resolve({modified: true, result: input}); + } + + private static hasPluginDefinition(ast: t.File): boolean { + const defineName = getImportLocalName(ast, { + moduleName: /^(#app|nuxt(\/.+)?)$/, + importName: 'defineNuxtPlugin', + }) ?? 'defineNuxtPlugin'; + + let found = false; + + traverse(ast, { + CallExpression: path => { + const {callee} = path.node; + + if (t.isIdentifier(callee) && callee.name === defineName) { + found = true; + + path.stop(); + } + }, + }); + + return found; + } +} diff --git a/src/application/project/code/transformation/javascript/utils/createJsxProps.ts b/src/application/project/code/transformation/javascript/utils/createJsxProps.ts index 54de21fe..9e74dffe 100644 --- a/src/application/project/code/transformation/javascript/utils/createJsxProps.ts +++ b/src/application/project/code/transformation/javascript/utils/createJsxProps.ts @@ -1,31 +1,8 @@ import * as t from '@babel/types'; +import {buildPropertyExpression} from '@/application/project/code/transformation/javascript/utils/createObjectProps'; +import type {AttributeType} from '@/application/project/code/transformation/javascript/utils/createObjectProps'; -type PropertyTypes = { - reference: { - path: string[], - }, - literal: { - value: string | number | boolean | null, - }, - comparison: { - left: AttributeType, - operator: '===' | '!==' | '>' | '>=' | '<' | '<=', - right: AttributeType, - }, - ternary: { - condition: { - left: AttributeType, - operator: '===' | '!==' | '>' | '>=' | '<' | '<=', - right: AttributeType, - }, - consequent: AttributeType, - alternate: AttributeType, - }, -}; - -export type AttributeType = { - [K in keyof PropertyTypes]: PropertyTypes[K] & {type: K} -}[keyof PropertyTypes]; +export type {AttributeType} from '@/application/project/code/transformation/javascript/utils/createObjectProps'; export function createJsxAttributes(attributes: Record): t.JSXAttribute[] { const nodes: t.JSXAttribute[] = []; @@ -41,55 +18,3 @@ export function createJsxAttributes(attributes: Record): return nodes; } - -function buildPropertyExpression(attribute: AttributeType): t.Expression { - switch (attribute.type) { - case 'reference': - if (attribute.path.length < 2) { - return t.identifier(attribute.path[0]); - } - - return attribute.path - .slice(2) - .reduce( - (object, key) => t.memberExpression(object, t.identifier(key)), - t.memberExpression( - t.identifier(attribute.path[0]), - t.identifier(attribute.path[1]), - ), - ); - - case 'literal': - if (typeof attribute.value === 'string') { - return t.stringLiteral(attribute.value); - } - - if (typeof attribute.value === 'number') { - return t.numericLiteral(attribute.value); - } - - if (typeof attribute.value === 'boolean') { - return t.booleanLiteral(attribute.value); - } - - return t.nullLiteral(); - - case 'comparison': - return t.binaryExpression( - attribute.operator, - buildPropertyExpression(attribute.left), - buildPropertyExpression(attribute.right), - ); - - case 'ternary': - return t.conditionalExpression( - t.binaryExpression( - attribute.condition.operator, - buildPropertyExpression(attribute.condition.left), - buildPropertyExpression(attribute.condition.right), - ), - buildPropertyExpression(attribute.consequent), - buildPropertyExpression(attribute.alternate), - ); - } -} diff --git a/src/application/project/code/transformation/javascript/utils/createObjectProps.ts b/src/application/project/code/transformation/javascript/utils/createObjectProps.ts new file mode 100644 index 00000000..4ad07915 --- /dev/null +++ b/src/application/project/code/transformation/javascript/utils/createObjectProps.ts @@ -0,0 +1,91 @@ +import * as t from '@babel/types'; + +type PropertyTypes = { + reference: { + path: string[], + }, + literal: { + value: string | number | boolean | null, + }, + comparison: { + left: AttributeType, + operator: '===' | '!==' | '>' | '>=' | '<' | '<=', + right: AttributeType, + }, + ternary: { + condition: { + left: AttributeType, + operator: '===' | '!==' | '>' | '>=' | '<' | '<=', + right: AttributeType, + }, + consequent: AttributeType, + alternate: AttributeType, + }, +}; + +export type AttributeType = { + [K in keyof PropertyTypes]: PropertyTypes[K] & {type: K} +}[keyof PropertyTypes]; + +export function buildPropertyExpression(attribute: AttributeType): t.Expression { + switch (attribute.type) { + case 'reference': + if (attribute.path.length < 2) { + return t.identifier(attribute.path[0]); + } + + return attribute.path + .slice(2) + .reduce( + (object, key) => t.memberExpression(object, t.identifier(key)), + t.memberExpression( + t.identifier(attribute.path[0]), + t.identifier(attribute.path[1]), + ), + ); + + case 'literal': + if (typeof attribute.value === 'string') { + return t.stringLiteral(attribute.value); + } + + if (typeof attribute.value === 'number') { + return t.numericLiteral(attribute.value); + } + + if (typeof attribute.value === 'boolean') { + return t.booleanLiteral(attribute.value); + } + + return t.nullLiteral(); + + case 'comparison': + return t.binaryExpression( + attribute.operator, + buildPropertyExpression(attribute.left), + buildPropertyExpression(attribute.right), + ); + + case 'ternary': + return t.conditionalExpression( + t.binaryExpression( + attribute.condition.operator, + buildPropertyExpression(attribute.condition.left), + buildPropertyExpression(attribute.condition.right), + ), + buildPropertyExpression(attribute.consequent), + buildPropertyExpression(attribute.alternate), + ); + } +} + +export function createPropsObject(attributes: Record): t.ObjectExpression { + return t.objectExpression( + Object.entries(attributes).map( + ([key, value]) => t.objectProperty( + t.identifier(key), + buildPropertyExpression(value), + ), + ), + ); +} diff --git a/src/application/project/code/transformation/javascript/vuePluginCodemod.ts b/src/application/project/code/transformation/javascript/vuePluginCodemod.ts new file mode 100644 index 00000000..438657c4 --- /dev/null +++ b/src/application/project/code/transformation/javascript/vuePluginCodemod.ts @@ -0,0 +1,426 @@ +import * as t from '@babel/types'; +import {traverse} from '@babel/core'; +import type {Codemod, CodemodOptions, ResultCode} from '@/application/project/code/transformation/codemod'; +import {addImport} from '@/application/project/code/transformation/javascript/utils/addImport'; +import {getImportLocalName} from '@/application/project/code/transformation/javascript/utils/getImportLocalName'; +import type {AttributeType} from '@/application/project/code/transformation/javascript/utils/createObjectProps'; +import {createPropsObject} from '@/application/project/code/transformation/javascript/utils/createObjectProps'; + +type ChainCall = t.CallExpression & {callee: t.MemberExpression}; + +type ChainAnchor = { + kind: 'chain', + mountCall: ChainCall, +}; + +type VariableAnchor = { + kind: 'variable', + binding: string, + parentBody: t.Statement[], + declarationStatement: t.Node, + mountStatement: t.ExpressionStatement, +}; + +export type MountAnchor = ChainAnchor | VariableAnchor; + +type CreateAppMatch = { + call: t.CallExpression, + parents: t.Node[], +}; + +export type VuePluginConfiguration = { + plugin: { + module: string, + factory: string, + }, + args?: Record, +}; + +export type VuePluginOptions = CodemodOptions & { + args?: Record, +}; + +/** + * Registers a Vue plugin in the main entry file. + * + * Inserts the plugin registration just before app.mount, preserving whichever + * form the user wrote (chained or variable). If the plugin is already + * registered, the codemod returns unmodified. + */ +export class VuePluginCodemod implements Codemod { + private readonly configuration: VuePluginConfiguration; + + public constructor(configuration: VuePluginConfiguration) { + this.configuration = configuration; + } + + public apply(input: t.File, options: VuePluginOptions = {}): Promise> { + const anchor = VuePluginCodemod.findMountAnchor(input); + + if (anchor === null) { + return Promise.resolve({modified: false, result: input}); + } + + const {plugin} = this.configuration; + const args = options.args ?? this.configuration.args; + + const factoryLocal = getImportLocalName(input, { + moduleName: plugin.module, + importName: plugin.factory, + }); + + if (factoryLocal !== null && VuePluginCodemod.hasFactoryCall(anchor, factoryLocal)) { + return Promise.resolve({modified: false, result: input}); + } + + const factoryImport = addImport(input, { + type: 'value', + moduleName: plugin.module, + importName: plugin.factory, + }); + + const factoryCall = t.callExpression( + t.identifier(factoryImport.localName), + args === undefined ? [] : [createPropsObject(args)], + ); + + if (anchor.kind === 'chain') { + VuePluginCodemod.injectIntoChain(anchor, factoryCall); + } else { + VuePluginCodemod.injectAfterDeclaration(anchor, factoryCall); + } + + return Promise.resolve({modified: true, result: input}); + } + + public static findMountAnchor(ast: t.File): MountAnchor | null { + const createAppName = getImportLocalName(ast, { + moduleName: 'vue', + importName: 'createApp', + }); + + if (createAppName === null) { + return null; + } + + const match = VuePluginCodemod.findCreateAppCall(ast, createAppName); + + if (match === null) { + return null; + } + + return VuePluginCodemod.matchChainAnchor(match) ?? VuePluginCodemod.matchVariableAnchor(match); + } + + public static hasFactoryCall(anchor: MountAnchor, factoryLocal: string): boolean { + return anchor.kind === 'chain' + ? VuePluginCodemod.chainHasFactoryCall(anchor, factoryLocal) + : VuePluginCodemod.variableBodyHasFactoryCall(anchor, factoryLocal); + } + + public static findUseCall(anchor: MountAnchor, identifier: string): t.CallExpression | null { + return anchor.kind === 'chain' + ? VuePluginCodemod.findUseCallInChain(anchor, identifier) + : VuePluginCodemod.findUseCallInBody(anchor, identifier); + } + + private static findCreateAppCall(ast: t.File, createAppName: string): CreateAppMatch | null { + let match: CreateAppMatch | null = null; + + traverse(ast, { + CallExpression: path => { + const {node} = path; + + if (!t.isIdentifier(node.callee) || node.callee.name !== createAppName) { + return; + } + + const parents: t.Node[] = []; + let current: typeof path.parentPath | null = path.parentPath; + + while (current !== null) { + parents.push(current.node); + current = current.parentPath; + } + + match = { + call: node, + parents: parents, + }; + + path.stop(); + }, + }); + + return match; + } + + private static matchChainAnchor(match: CreateAppMatch): ChainAnchor | null { + return VuePluginCodemod.walkChain(match.call, match.parents, 0); + } + + private static walkChain(inner: t.Node, parents: t.Node[], index: number): ChainAnchor | null { + const memberNode = parents[index]; + + if ( + memberNode === undefined + || !t.isMemberExpression(memberNode) + || memberNode.object !== inner + || memberNode.computed + || !t.isIdentifier(memberNode.property) + ) { + return null; + } + + const callNode = parents[index + 1]; + + if ( + callNode === undefined + || !VuePluginCodemod.isChainCall(callNode) + || callNode.callee !== memberNode + ) { + return null; + } + + if (memberNode.property.name === 'mount') { + return { + kind: 'chain', + mountCall: callNode, + }; + } + + return VuePluginCodemod.walkChain(callNode, parents, index + 2); + } + + private static matchVariableAnchor(match: CreateAppMatch): VariableAnchor | null { + const [declaratorNode, declarationNode, containerNode] = match.parents; + + if (!t.isVariableDeclarator(declaratorNode) || declaratorNode.init !== match.call) { + return null; + } + + if (!t.isIdentifier(declaratorNode.id)) { + return null; + } + + const parentBody = VuePluginCodemod.extractStatementBody(containerNode); + + if (parentBody === null) { + return null; + } + + const declarationIndex = parentBody.findIndex(statement => statement === declarationNode); + const binding = declaratorNode.id.name; + const mountStatement = VuePluginCodemod.findMountStatement(parentBody, binding, declarationIndex + 1); + + if (mountStatement === null) { + return null; + } + + return { + kind: 'variable', + binding: binding, + parentBody: parentBody, + declarationStatement: declarationNode, + mountStatement: mountStatement, + }; + } + + private static extractStatementBody(container: t.Node | undefined): t.Statement[] | null { + if ( + container !== undefined + && (t.isProgram(container) || t.isBlockStatement(container) || t.isStaticBlock(container)) + ) { + return container.body; + } + + return null; + } + + private static findMountStatement( + body: t.Statement[], + binding: string, + from: number, + ): t.ExpressionStatement | null { + for (let i = from; i < body.length; i++) { + const statement = body[i]; + + if (!t.isExpressionStatement(statement) || !t.isCallExpression(statement.expression)) { + continue; + } + + const {callee} = statement.expression; + + if (!t.isMemberExpression(callee) || callee.computed) { + continue; + } + + if (!t.isIdentifier(callee.object) || callee.object.name !== binding) { + continue; + } + + if (!t.isIdentifier(callee.property) || callee.property.name !== 'mount') { + continue; + } + + return statement; + } + + return null; + } + + private static isChainCall(node: t.Node): node is ChainCall { + return t.isCallExpression(node) && t.isMemberExpression(node.callee); + } + + private static chainHasFactoryCall(anchor: ChainAnchor, factoryLocal: string): boolean { + let {object} = anchor.mountCall.callee; + + while (VuePluginCodemod.isChainCall(object)) { + if ( + t.isIdentifier(object.callee.property) + && object.callee.property.name === 'use' + && VuePluginCodemod.isFactoryInvocation(object.arguments[0], factoryLocal) + ) { + return true; + } + + object = object.callee.object; + } + + return false; + } + + private static variableBodyHasFactoryCall(anchor: VariableAnchor, factoryLocal: string): boolean { + for (const useCall of VuePluginCodemod.iterateUseCalls(anchor)) { + if (VuePluginCodemod.isFactoryInvocation(useCall.arguments[0], factoryLocal)) { + return true; + } + } + + return false; + } + + private static findUseCallInChain(anchor: ChainAnchor, identifier: string): t.CallExpression | null { + let current: t.Node = anchor.mountCall.callee.object; + + while (VuePluginCodemod.isChainCall(current)) { + if ( + t.isIdentifier(current.callee.property) + && current.callee.property.name === 'use' + && VuePluginCodemod.isFirstArgNamed(current.arguments, identifier) + ) { + return current; + } + + current = current.callee.object; + } + + return null; + } + + private static findUseCallInBody(anchor: VariableAnchor, identifier: string): t.CallExpression | null { + for (const useCall of VuePluginCodemod.iterateUseCalls(anchor)) { + if (VuePluginCodemod.isFirstArgNamed(useCall.arguments, identifier)) { + return useCall; + } + } + + return null; + } + + private static* iterateUseCalls(anchor: VariableAnchor): IterableIterator { + let yielding = false; + + for (const statement of anchor.parentBody) { + if (statement === anchor.mountStatement) { + return; + } + + if (!yielding) { + if (statement === anchor.declarationStatement) { + yielding = true; + } + + continue; + } + + if (!t.isExpressionStatement(statement) || !t.isCallExpression(statement.expression)) { + continue; + } + + const {callee} = statement.expression; + + if (!t.isMemberExpression(callee) || callee.computed) { + continue; + } + + if (!t.isIdentifier(callee.object) || callee.object.name !== anchor.binding) { + continue; + } + + if (!t.isIdentifier(callee.property) || callee.property.name !== 'use') { + continue; + } + + yield statement.expression; + } + } + + private static isFactoryInvocation(node: t.Node | undefined, factoryLocal: string): boolean { + return node !== undefined + && t.isCallExpression(node) + && t.isIdentifier(node.callee) + && node.callee.name === factoryLocal; + } + + private static isFirstArgNamed(args: t.Node[], identifier: string): boolean { + const [first] = args; + + return first !== undefined && t.isIdentifier(first) && first.name === identifier; + } + + /** + * Inserts the plugin registration as the first link of the chain. + * + * Walking down through the chained calls and splicing the registration right after + * the createApp call ensures the Croct context is set up before any plugin that + * integrates with it, such as the Storyblok bridge. + */ + private static injectIntoChain(anchor: ChainAnchor, factoryCall: t.CallExpression): void { + let parent: t.MemberExpression = anchor.mountCall.callee; + + // Walk down through chained .use(...) links until we hit the createApp(App) + // call at the bottom. Its callee is an Identifier (createApp), so it fails the + // ChainCall check, which is exactly the stop condition. + while (VuePluginCodemod.isChainCall(parent.object)) { + parent = parent.object.callee; + } + + parent.object = t.callExpression( + t.memberExpression(parent.object, t.identifier('use')), + [factoryCall], + ); + } + + /** + * Inserts the plugin registration immediately after the variable declaration. + * + * Placing the call right next to the declaration guarantees that it runs before any + * other plugin registration against the same binding. + */ + private static injectAfterDeclaration(anchor: VariableAnchor, factoryCall: t.CallExpression): void { + const useStatement = t.expressionStatement( + t.callExpression( + t.memberExpression(t.identifier(anchor.binding), t.identifier('use')), + [factoryCall], + ), + ); + + const declarationIndex = anchor.parentBody.findIndex( + statement => statement === anchor.declarationStatement, + ); + + anchor.parentBody.splice(declarationIndex + 1, 0, useStatement); + } +} diff --git a/src/application/project/code/transformation/javascript/vueStoryblokCodemod.ts b/src/application/project/code/transformation/javascript/vueStoryblokCodemod.ts new file mode 100644 index 00000000..ca0b5df0 --- /dev/null +++ b/src/application/project/code/transformation/javascript/vueStoryblokCodemod.ts @@ -0,0 +1,121 @@ +import * as t from '@babel/types'; +import {traverse} from '@babel/core'; +import type {Codemod, CodemodOptions, ResultCode} from '@/application/project/code/transformation/codemod'; +import {addImport} from '@/application/project/code/transformation/javascript/utils/addImport'; +import {getImportLocalName} from '@/application/project/code/transformation/javascript/utils/getImportLocalName'; +import {VuePluginCodemod} from '@/application/project/code/transformation/javascript/vuePluginCodemod'; + +export type VueStoryblokConfiguration = { + plugin: { + module: string, + factory: string, + }, + storyblok: { + module: string, + identifier: string, + }, +}; + +/** + * Migrates an existing Storyblok Vue plugin registration to Croct. + * + * Rewrites the use call so the original options are passed through the Croct + * Storyblok factory, drops the Storyblok identifier from its import, and adds + * the new factory import. If the migration is already in place, the codemod + * returns unmodified. + */ +export class VueStoryblokCodemod implements Codemod { + private readonly configuration: VueStoryblokConfiguration; + + public constructor(configuration: VueStoryblokConfiguration) { + this.configuration = configuration; + } + + public apply(input: t.File): Promise> { + const anchor = VuePluginCodemod.findMountAnchor(input); + + if (anchor === null) { + return Promise.resolve({modified: false, result: input}); + } + + const {plugin, storyblok} = this.configuration; + + const factoryLocal = getImportLocalName(input, { + moduleName: plugin.module, + importName: plugin.factory, + }); + + if (factoryLocal !== null && VuePluginCodemod.hasFactoryCall(anchor, factoryLocal)) { + return Promise.resolve({modified: false, result: input}); + } + + const storyblokLocal = getImportLocalName(input, { + moduleName: storyblok.module, + importName: storyblok.identifier, + }); + + if (storyblokLocal === null) { + return Promise.resolve({modified: false, result: input}); + } + + const useCall = VuePluginCodemod.findUseCall(anchor, storyblokLocal); + + if (useCall === null) { + return Promise.resolve({modified: false, result: input}); + } + + const factoryImport = addImport(input, { + type: 'value', + moduleName: plugin.module, + importName: plugin.factory, + }); + + const options = useCall.arguments.slice(1); + + useCall.arguments = [ + t.callExpression( + t.identifier(factoryImport.localName), + options.filter((node): node is t.Expression => !t.isJSXNamespacedName(node)), + ), + ]; + + VueStoryblokCodemod.dropImportSpecifier(input, storyblok.module, storyblok.identifier); + + return Promise.resolve({modified: true, result: input}); + } + + private static dropImportSpecifier(ast: t.File, moduleName: string, importName: string): void { + traverse(ast, { + ImportDeclaration: path => { + const {node} = path; + + if (node.source.value !== moduleName) { + return path.skip(); + } + + const remaining = node.specifiers.filter(specifier => { + if (!t.isImportSpecifier(specifier)) { + return true; + } + + const {imported} = specifier; + const importedName = t.isIdentifier(imported) ? imported.name : imported.value; + + return importedName !== importName; + }); + + if (remaining.length === 0) { + path.remove(); + + return; + } + + if (remaining.length !== node.specifiers.length) { + node.specifiers = remaining; + } + + return path.skip(); + }, + }); + } +} diff --git a/src/application/project/sdk/nuxtStoryblokPlugin.ts b/src/application/project/sdk/nuxtStoryblokPlugin.ts new file mode 100644 index 00000000..5c23f3b4 --- /dev/null +++ b/src/application/project/sdk/nuxtStoryblokPlugin.ts @@ -0,0 +1,68 @@ +import type { + InstallationPlan, + JavaScriptPluginContext, + JavaScriptSdkPlugin, +} from '@/application/project/sdk/javasScriptSdk'; +import type {Task} from '@/application/cli/io/output'; +import {HelpfulError} from '@/application/error'; +import type {Codemod} from '@/application/project/code/transformation/codemod'; +import type {Installation} from '@/application/project/sdk/sdk'; + +export type Configuration = { + storyblokPackage: string, + pluginFile: string, + codemod: Codemod, +}; + +export class NuxtStoryblokPlugin implements JavaScriptSdkPlugin { + private readonly configuration: Configuration; + + public constructor(configuration: Configuration) { + this.configuration = configuration; + } + + public async getInstallationPlan( + _: Installation, + context: JavaScriptPluginContext, + ): Promise> { + if (!await context.packageManager.hasDirectDependency(this.configuration.storyblokPackage)) { + return {}; + } + + const tasks: Task[] = [ + { + title: 'Configure Storyblok integration', + task: async notifier => { + notifier.update('Configuring Storyblok integration'); + + try { + await this.scaffoldPluginFile(context); + + notifier.confirm('Storyblok configured'); + } catch (error) { + notifier.alert('Failed to configure Storyblok', HelpfulError.formatMessage(error)); + } + }, + }, + ]; + + return { + tasks: tasks, + dependencies: ['@croct/plug-storyblok'], + }; + } + + private async scaffoldPluginFile(scope: JavaScriptPluginContext): Promise { + const {fileSystem, projectDirectory} = scope; + const path = fileSystem.joinPaths(projectDirectory.get(), this.configuration.pluginFile); + + if (!await fileSystem.exists(path)) { + await fileSystem.createDirectory(fileSystem.getDirectoryName(path), {recursive: true}); + await fileSystem.writeTextFile(path, '', {overwrite: true}); + } + + await this.configuration + .codemod + .apply(path); + } +} diff --git a/src/application/project/sdk/plugNuxtSdk.ts b/src/application/project/sdk/plugNuxtSdk.ts new file mode 100644 index 00000000..3ad74c5f --- /dev/null +++ b/src/application/project/sdk/plugNuxtSdk.ts @@ -0,0 +1,265 @@ +import type {Installation} from '@/application/project/sdk/sdk'; +import {SdkError} from '@/application/project/sdk/sdk'; +import type { + Configuration as JavaScriptSdkConfiguration, + InstallationPlan, +} from '@/application/project/sdk/javasScriptSdk'; +import {JavaScriptSdk} from '@/application/project/sdk/javasScriptSdk'; +import type {ApplicationApi, GeneratedApiKey} from '@/application/api/application'; +import type {WorkspaceApi} from '@/application/api/workspace'; +import {EnvFile} from '@/application/project/code/envFile'; +import type {UserApi} from '@/application/api/user'; +import type {Codemod} from '@/application/project/code/transformation/codemod'; +import type {Task, TaskNotifier} from '@/application/cli/io/output'; +import type {ExampleFile} from '@/application/project/code/generation/example'; +import {PlugNuxtExampleGenerator} from '@/application/project/code/generation/slot/plugNuxtExampleGenerator'; +import {ApiError} from '@/application/api/error'; +import type {Slot} from '@/application/model/slot'; +import {ErrorReason, HelpfulError} from '@/application/error'; +import {ApiKeyPermission} from '@/application/model/application'; +import type {CommandExecutor} from '@/application/system/process/executor'; + +type CodemodConfiguration = { + config: Codemod, +}; + +export type Configuration = JavaScriptSdkConfiguration & { + codemod: CodemodConfiguration, + userApi: UserApi, + workspaceApi: WorkspaceApi, + applicationApi: ApplicationApi, + commandExecutor: CommandExecutor, +}; + +type NuxtProjectInfo = { + typescript: boolean, + config: { + file: string, + }, + envFile: EnvFile, +}; + +type NuxtInstallation = Installation & { + project: NuxtProjectInfo, + notifier: TaskNotifier, +}; + +enum NuxtEnvVar { + API_KEY = 'NUXT_CROCT_API_KEY', + APP_ID = 'NUXT_PUBLIC_CROCT_APP_ID', +} + +export class PlugNuxtSdk extends JavaScriptSdk { + private readonly userApi: UserApi; + + private readonly applicationApi: ApplicationApi; + + private readonly codemod: CodemodConfiguration; + + private readonly commandExecutor: CommandExecutor; + + public constructor(configuration: Configuration) { + super(configuration); + + this.codemod = configuration.codemod; + this.userApi = configuration.userApi; + this.applicationApi = configuration.applicationApi; + this.commandExecutor = configuration.commandExecutor; + } + + protected async generateSlotExampleFiles(slot: Slot, installation: Installation): Promise { + const isTypeScript = await this.isTypeScriptProject(); + + const paths = await this.getPaths(installation.configuration); + const slotPath = this.fileSystem.joinPaths(paths.components, '%slug%.vue'); + const pagePath = this.fileSystem.joinPaths(paths.examples, '%slug%', 'index.vue'); + + const generator = new PlugNuxtExampleGenerator({ + typescript: isTypeScript, + contentVariable: 'data.content', + slotImportPath: this.fileSystem.joinPaths('~', paths.components, '%slug%.vue'), + slotFilePath: slotPath, + slotComponentName: '%name%', + pageFilePath: pagePath, + }); + + const example = generator.generate({ + id: slot.slug, + version: slot.version.major, + definition: slot.resolvedDefinition, + }); + + return example.files; + } + + protected async getInstallationPlan(installation: Installation): Promise { + const {configuration} = installation; + const projectInfo = await this.getProjectInfo(); + + return { + dependencies: ['@croct/plug-nuxt'], + tasks: this.getInstallationTasks({ + ...installation, + project: projectInfo, + }), + configuration: { + ...configuration, + paths: { + ...configuration.paths, + examples: 'pages', + }, + }, + }; + } + + private async getProjectInfo(): Promise { + const [isTypescript, configFile] = await Promise.all([ + this.isTypeScriptProject(), + this.locateNuxtConfig(), + ]); + + const projectDirectory = this.projectDirectory.get(); + const extension = isTypescript ? 'ts' : 'js'; + + return { + typescript: isTypescript, + config: { + file: configFile ?? `nuxt.config.${extension}`, + }, + envFile: new EnvFile( + this.fileSystem, + this.fileSystem.joinPaths(projectDirectory, '.env'), + ), + }; + } + + private async locateNuxtConfig(): Promise { + return this.locateFile( + ...['ts', 'js', 'mjs'].map(ext => `nuxt.config.${ext}`), + ); + } + + private getInstallationTasks(installation: Omit): Task[] { + return [ + { + title: 'Register module', + task: async notifier => { + notifier.update('Registering module'); + + try { + await this.applyConfigCodemod(installation.project.config.file); + + notifier.confirm('Module registered'); + } catch (error) { + notifier.alert('Failed to register module', HelpfulError.formatMessage(error)); + } + }, + }, + { + title: 'Generate Nuxt type aliases', + task: async notifier => { + notifier.update('Generating Nuxt type aliases'); + + try { + await this.generateNuxtTypeAliases(); + + notifier.confirm('Nuxt type aliases generated'); + } catch (error) { + notifier.alert('Failed to generate Nuxt type aliases', HelpfulError.formatMessage(error)); + } + }, + }, + { + title: 'Setup environment variables', + task: async notifier => { + notifier.update('Setting up environment variables'); + + try { + await this.updateEnvVariables({ + ...installation, + notifier: notifier, + }); + + notifier.confirm('Environment variables updated'); + } catch (error) { + notifier.alert('Failed to update environment variables', HelpfulError.formatMessage(error)); + } + }, + }, + ]; + } + + private async applyConfigCodemod(file: string): Promise { + await this.codemod + .config + .apply(this.fileSystem.joinPaths(this.projectDirectory.get(), file)); + } + + private async generateNuxtTypeAliases(): Promise { + const command = await this.packageManager.getPackageCommand('nuxi', ['prepare']); + + const execution = await this.commandExecutor.run(command, { + workingDirectory: this.projectDirectory.get(), + }); + + if (await execution.wait() !== 0) { + throw new HelpfulError(`Failed to execute command \`${command.name}\`.`); + } + } + + private async updateEnvVariables(installation: NuxtInstallation): Promise { + const {project: {envFile}, configuration, notifier} = installation; + + notifier.update('Loading information'); + + const developmentApplication = await this.workspaceApi.getApplication({ + organizationSlug: configuration.organization, + workspaceSlug: configuration.workspace, + applicationSlug: configuration.applications.development, + }); + + if (developmentApplication === null) { + throw new SdkError( + `Development application \`${configuration.applications.development}\` not found.`, + {reason: ErrorReason.NOT_FOUND}, + ); + } + + if (!await envFile.hasVariable(NuxtEnvVar.API_KEY) && installation.skipApiKeySetup !== true) { + const user = await this.userApi.getUser(); + + notifier.update('Creating API key'); + + let apiKey: GeneratedApiKey; + + try { + apiKey = await this.applicationApi.createApiKey({ + organizationSlug: configuration.organization, + workspaceSlug: configuration.workspace, + applicationSlug: developmentApplication.slug, + name: `${user.username} CLI`, + permissions: [ApiKeyPermission.ISSUE_TOKEN], + }); + } catch (error) { + if (error instanceof HelpfulError) { + throw new SdkError( + error instanceof ApiError && error.isAccessDenied() + ? 'Your user does not have permission to create an API key' + : error.message, + error.help, + ); + } + + throw error; + } + + await envFile.setVariables({ + [NuxtEnvVar.API_KEY]: apiKey.secret, + }); + } + + await envFile.setVariables({ + [NuxtEnvVar.APP_ID]: developmentApplication.publicId, + }); + } +} diff --git a/src/application/project/sdk/plugReactSdk.ts b/src/application/project/sdk/plugReactSdk.ts index 55be544b..c4177d56 100644 --- a/src/application/project/sdk/plugReactSdk.ts +++ b/src/application/project/sdk/plugReactSdk.ts @@ -83,10 +83,7 @@ export class PlugReactSdk extends JavaScriptSdk { ? CodeLanguage.TYPESCRIPT_XML : CodeLanguage.JAVASCRIPT_XML, contentVariable: 'content', - slotImportPath: await this.importResolver.getImportPath( - slotPath, - this.fileSystem.getDirectoryName(pagePath), - ), + slotImportPath: await this.importResolver.getImportPath(slotPath, pagePath), slotFilePath: slotPath, slotComponentName: '%name%', pageFilePath: pagePath, diff --git a/src/application/project/sdk/plugVueSdk.ts b/src/application/project/sdk/plugVueSdk.ts new file mode 100644 index 00000000..64adeb82 --- /dev/null +++ b/src/application/project/sdk/plugVueSdk.ts @@ -0,0 +1,292 @@ +import type {Installation} from '@/application/project/sdk/sdk'; +import {SdkError} from '@/application/project/sdk/sdk'; +import type { + InstallationPlan, + Configuration as JavaScriptSdkConfiguration, +} from '@/application/project/sdk/javasScriptSdk'; +import {JavaScriptSdk} from '@/application/project/sdk/javasScriptSdk'; +import type {Codemod} from '@/application/project/code/transformation/codemod'; +import type {Task, TaskNotifier} from '@/application/cli/io/output'; +import type {VuePluginOptions} from '@/application/project/code/transformation/javascript/vuePluginCodemod'; +import {EnvFile} from '@/application/project/code/envFile'; +import type {ExampleFile} from '@/application/project/code/generation/example'; +import {PlugVueExampleGenerator} from '@/application/project/code/generation/slot/plugVueExampleGenerator'; +import type {Slot} from '@/application/model/slot'; +import {ErrorReason, HelpfulError} from '@/application/error'; +import type {ImportResolver} from '@/application/project/import/importResolver'; +import type {AttributeType} from '@/application/project/code/transformation/javascript/utils/createObjectProps'; + +type CodemodConfiguration = { + plugin: Codemod, +}; + +type Bundler = { + package: string, + prefix: string, +}; + +export type Configuration = JavaScriptSdkConfiguration & { + codemod: CodemodConfiguration, + bundlers: Bundler[], + importResolver: ImportResolver, +}; + +type VueProjectInfo = { + typescript: boolean, + sourceDirectory: string, + plugin: { + file: string | null, + }, + env?: { + property: string, + developmentFile: EnvFile, + productionFile: EnvFile, + }, +}; + +type VueInstallation = Installation & { + project: VueProjectInfo, + notifier: TaskNotifier, +}; + +type PublicAppIds = { + development: string, + production?: string, +}; + +export class PlugVueSdk extends JavaScriptSdk { + private readonly codemod: CodemodConfiguration; + + private readonly bundlers: Bundler[]; + + private readonly importResolver: ImportResolver; + + public constructor(configuration: Configuration) { + super(configuration); + + this.codemod = configuration.codemod; + this.bundlers = configuration.bundlers; + this.importResolver = configuration.importResolver; + } + + protected async generateSlotExampleFiles(slot: Slot, installation: Installation): Promise { + const isTypeScript = await this.isTypeScriptProject(); + + const paths = await this.getPaths(installation.configuration); + const slotPath = this.fileSystem.joinPaths(paths.components, '%slug%.vue'); + const pagePath = this.fileSystem.joinPaths(paths.examples, '%slug%-example.vue'); + + const generator = new PlugVueExampleGenerator({ + typescript: isTypeScript, + contentVariable: 'content', + slotImportPath: await this.importResolver.getImportPath(slotPath, pagePath), + slotFilePath: slotPath, + slotComponentName: '%name%', + pageFilePath: pagePath, + }); + + const example = generator.generate({ + id: slot.slug, + version: slot.version.major, + definition: slot.resolvedDefinition, + }); + + return example.files; + } + + protected async getInstallationPlan(installation: Installation): Promise { + const {configuration} = installation; + const projectInfo = await this.getProjectInfo(); + + return { + dependencies: ['@croct/plug-vue'], + tasks: this.getInstallationTasks({ + ...installation, + project: projectInfo, + }), + configuration: configuration, + }; + } + + private async getProjectInfo(): Promise { + const sourceDirectory = 'src'; + const envProperty = await this.getEnvVarProperty(); + const projectDirectory = this.projectDirectory.get(); + + return { + typescript: await this.isTypeScriptProject(), + sourceDirectory: sourceDirectory, + plugin: { + file: await this.locateFile( + ...['main', 'index'].flatMap(name => ['ts', 'js'].map(ext => `${name}.${ext}`)) + .map(file => this.fileSystem.joinPaths(sourceDirectory, file)), + ), + }, + env: envProperty === null + ? undefined + : { + property: envProperty, + productionFile: new EnvFile( + this.fileSystem, + this.fileSystem.joinPaths(projectDirectory, '.env.production'), + ), + developmentFile: new EnvFile( + this.fileSystem, + this.fileSystem.joinPaths(projectDirectory, '.env.development'), + ), + }, + }; + } + + private getInstallationTasks(installation: Omit): Task[] { + const tasks: Task[] = []; + const projectEnv = installation.project.env; + const {configuration} = installation; + + let publicIdsPromise: Promise | null = null; + + const getPublicIds = (): Promise => { + if (publicIdsPromise === null) { + publicIdsPromise = Promise.all([ + this.workspaceApi.getApplication({ + organizationSlug: configuration.organization, + workspaceSlug: configuration.workspace, + applicationSlug: configuration.applications.development, + }), + configuration.applications.production === undefined + ? null + : this.workspaceApi.getApplication({ + organizationSlug: configuration.organization, + workspaceSlug: configuration.workspace, + applicationSlug: configuration.applications.production, + }), + ]).then(([development, production]) => { + if (development === null) { + return Promise.reject( + new SdkError( + `Development application ${configuration.applications.development} not found`, + {reason: ErrorReason.NOT_FOUND}, + ), + ); + } + + return { + development: development.publicId, + production: production?.publicId, + }; + }); + } + + return publicIdsPromise; + }; + + if (projectEnv !== undefined) { + const {developmentFile, productionFile, property} = projectEnv; + const variable = property.split('.').pop()!; + + tasks.push({ + title: 'Setup environment variables', + task: async notifier => { + notifier.update('Setting up environment variables'); + + try { + const publicIds = await getPublicIds(); + + await Promise.all([ + developmentFile.setVariable(variable, publicIds.development), + publicIds.production === undefined + ? Promise.resolve() + : productionFile.setVariable(variable, publicIds.production), + ]); + + notifier.confirm('Environment variables updated'); + } catch (error) { + notifier.alert('Failed to update environment variables', HelpfulError.formatMessage(error)); + } + }, + }); + } + + tasks.push({ + title: 'Register plugin', + task: async notifier => { + notifier.update('Registering plugin'); + + const pluginFile = installation.project.plugin.file; + + try { + if (pluginFile === null) { + notifier.alert('No Vue entry file found'); + } else { + await this.installPlugin(pluginFile, { + args: { + appId: PlugVueSdk.getAppIdProperty(await getPublicIds(), projectEnv?.property), + }, + }); + + notifier.confirm('Plugin registered'); + } + } catch (error) { + notifier.alert('Failed to register plugin', HelpfulError.formatMessage(error)); + } + }, + }); + + return tasks; + } + + private async installPlugin(file: string, options: VuePluginOptions): Promise { + const codemod = this.codemod.plugin; + + await codemod.apply(this.fileSystem.joinPaths(this.projectDirectory.get(), file), options); + } + + private async getEnvVarProperty(): Promise { + for (const bundler of this.bundlers) { + if (await this.packageManager.hasDirectDependency(bundler.package)) { + return `${bundler.prefix}CROCT_APP_ID`; + } + } + + return null; + } + + private static getAppIdProperty(applicationIds: PublicAppIds, env?: string): AttributeType { + if (env !== undefined) { + return { + type: 'reference', + path: env.split('.'), + }; + } + + if (applicationIds.production === undefined) { + return { + type: 'literal', + value: applicationIds.development, + }; + } + + return { + type: 'ternary', + condition: { + operator: '===', + left: { + type: 'reference', + path: ['import', 'meta', 'env', 'MODE'], + }, + right: { + type: 'literal', + value: 'production', + }, + }, + consequent: { + type: 'literal', + value: applicationIds.production, + }, + alternate: { + type: 'literal', + value: applicationIds.development, + }, + }; + } +} diff --git a/src/application/project/sdk/storyblokPlugin.ts b/src/application/project/sdk/wrapperStoryblokPlugin.ts similarity index 63% rename from src/application/project/sdk/storyblokPlugin.ts rename to src/application/project/sdk/wrapperStoryblokPlugin.ts index 5e656231..bfc9c5e4 100644 --- a/src/application/project/sdk/storyblokPlugin.ts +++ b/src/application/project/sdk/wrapperStoryblokPlugin.ts @@ -11,44 +11,43 @@ import type {Installation} from '@/application/project/sdk/sdk'; import type {ScanFilter} from '@/application/fs/fileSystem'; export type Configuration = { + storyblokPackage: string, + marker: string, scanFilter: ScanFilter, codemod: Codemod, }; -export class StoryblokPlugin implements JavaScriptSdkPlugin { - private readonly codemod: Codemod; - - private readonly scanFilter: ScanFilter; +export class WrapperStoryblokPlugin implements JavaScriptSdkPlugin { + private readonly configuration: Configuration; public constructor(configuration: Configuration) { - this.codemod = configuration.codemod; - this.scanFilter = configuration.scanFilter; + this.configuration = configuration; } public async getInstallationPlan( _: Installation, context: JavaScriptPluginContext, ): Promise> { - if (!await context.packageManager.hasDependency('@storyblok/js')) { + if (!await context.packageManager.hasDirectDependency(this.configuration.storyblokPackage)) { return {}; } - const tasks: Task[] = []; - - tasks.push({ - title: 'Configure Storyblok integration', - task: async notifier => { - notifier.update('Configuring Storyblok integration'); + const tasks: Task[] = [ + { + title: 'Configure Storyblok integration', + task: async notifier => { + notifier.update('Configuring Storyblok integration'); - try { - await this.configureStoryblok(context); + try { + await this.configureStoryblok(context); - notifier.confirm('Storyblok configured'); - } catch (error) { - notifier.alert('Failed to configure Storyblok', HelpfulError.formatMessage(error)); - } + notifier.confirm('Storyblok configured'); + } catch (error) { + notifier.alert('Failed to configure Storyblok', HelpfulError.formatMessage(error)); + } + }, }, - }); + ]; return { tasks: tasks, @@ -57,14 +56,15 @@ export class StoryblokPlugin implements JavaScriptSdkPlugin { } private async configureStoryblok(scope: JavaScriptPluginContext): Promise { - const initializationFiles = await this.findStoryblokInitializationFiles(scope); + const candidateFiles = await this.findCandidateFiles(scope); - if (initializationFiles.length === 0) { + if (candidateFiles.length === 0) { throw new HelpfulError('Could not find any file containing Storyblok initialization.'); } - const results = initializationFiles.map( - file => this.codemod + const results = candidateFiles.map( + file => this.configuration + .codemod .apply(file) .then(result => result.modified), ); @@ -74,12 +74,12 @@ export class StoryblokPlugin implements JavaScriptSdkPlugin { } } - private async findStoryblokInitializationFiles(scope: JavaScriptPluginContext): Promise { + private async findCandidateFiles(scope: JavaScriptPluginContext): Promise { const {fileSystem, projectDirectory} = scope; const directory = projectDirectory.get(); const iterator = fileSystem.list(directory, async (path, depth) => { - if (!await this.scanFilter(path, depth) || depth > 20) { + if (!await this.configuration.scanFilter(path, depth) || depth > 20) { return false; } @@ -103,7 +103,7 @@ export class StoryblokPlugin implements JavaScriptSdkPlugin { const path = fileSystem.joinPaths(directory, entry.name); const content = await fileSystem.readTextFile(path); - if (content.includes('storyblokInit')) { + if (content.includes(this.configuration.marker)) { files.push(path); } } diff --git a/src/infrastructure/application/api/graphql/workspace.ts b/src/infrastructure/application/api/graphql/workspace.ts index fe8c4103..24b51c0f 100644 --- a/src/infrastructure/application/api/graphql/workspace.ts +++ b/src/infrastructure/application/api/graphql/workspace.ts @@ -121,10 +121,15 @@ function createNormalizationMap(map: Record< }; } +// The GraphQL schema does not yet have first-class Vue/Nuxt platforms, so they are +// reported to the server as JavaScript. JAVASCRIPT is intentionally listed last so that +// the inverse (api -> model) map resolves the shared `Javascript` value back to JAVASCRIPT. const platformMap = createNormalizationMap({ - [Platform.JAVASCRIPT]: GraphqlPlatform.Javascript, + [Platform.VUE]: GraphqlPlatform.Javascript, + [Platform.NUXT]: GraphqlPlatform.Javascript, [Platform.REACT]: GraphqlPlatform.React, [Platform.NEXTJS]: GraphqlPlatform.Next, + [Platform.JAVASCRIPT]: GraphqlPlatform.Javascript, }); const environmentMap = createNormalizationMap({ diff --git a/src/infrastructure/application/cli/cli.ts b/src/infrastructure/application/cli/cli.ts index 7ffbd716..24329ff7 100644 --- a/src/infrastructure/application/cli/cli.ts +++ b/src/infrastructure/application/cli/cli.ts @@ -22,6 +22,8 @@ import type { import {PlugJsSdk} from '@/application/project/sdk/plugJsSdk'; import {PlugReactSdk} from '@/application/project/sdk/plugReactSdk'; import {PlugNextSdk} from '@/application/project/sdk/plugNextSdk'; +import {PlugVueSdk} from '@/application/project/sdk/plugVueSdk'; +import {PlugNuxtSdk} from '@/application/project/sdk/plugNuxtSdk'; import type {InitInput} from '@/application/cli/command/init'; import {InitCommand} from '@/application/cli/command/init'; import type {LoginInput} from '@/application/cli/command/login'; @@ -349,7 +351,15 @@ import { CreateApiKeyOptionsValidator, } from '@/infrastructure/application/validation/actions/createApiKeyOptionsValidator'; import {StoryblokInitCodemod} from '@/application/project/code/transformation/javascript/storyblokInitCodemod'; -import {StoryblokPlugin} from '@/application/project/sdk/storyblokPlugin'; +import {WrapperStoryblokPlugin} from '@/application/project/sdk/wrapperStoryblokPlugin'; +import {NuxtStoryblokPlugin} from '@/application/project/sdk/nuxtStoryblokPlugin'; +import {VuePluginCodemod} from '@/application/project/code/transformation/javascript/vuePluginCodemod'; +import {VueStoryblokCodemod} from '@/application/project/code/transformation/javascript/vueStoryblokCodemod'; +import {NuxtConfigModuleCodemod} from '@/application/project/code/transformation/javascript/nuxtConfigModuleCodemod'; + +import { + NuxtStoryblokPluginCodemod, +} from '@/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod'; export type Configuration = { program: Program, @@ -1801,6 +1811,59 @@ export class Cli { }, ], }), + [Platform.VUE]: (): Sdk => new PlugVueSdk({ + ...config, + plugins: [this.createVueStoryblokPlugin()], + importResolver: importResolver, + codemod: { + plugin: new FormatCodemod( + formatter, + new FileCodemod({ + fileSystem: this.getFileSystem(), + codemod: new JavaScriptCodemod({ + languages: ['typescript'], + codemod: new VuePluginCodemod({ + plugin: { + module: '@croct/plug-vue', + factory: 'createCroct', + }, + }), + }), + }), + ), + }, + bundlers: [ + { + package: 'vite', + prefix: 'import.meta.env.VITE_', + }, + { + package: 'parcel', + prefix: 'process.env.', + }, + ], + }), + [Platform.NUXT]: (): Sdk => new PlugNuxtSdk({ + ...config, + plugins: [this.createNuxtStoryblokPlugin()], + userApi: this.getUserApi(), + applicationApi: this.getApplicationApi(), + commandExecutor: this.getAsynchronousCommandExecutor(), + codemod: { + config: new FormatCodemod( + formatter, + new FileCodemod({ + fileSystem: this.getFileSystem(), + codemod: new JavaScriptCodemod({ + languages: ['typescript'], + codemod: new NuxtConfigModuleCodemod({ + moduleName: '@croct/plug-nuxt', + }), + }), + }), + ), + }, + }), [Platform.NEXTJS]: (): Sdk => { const providerProps: Record = { appId: { @@ -1947,6 +2010,8 @@ export class Cli { [Platform.JAVASCRIPT]: () => this.getJavaScriptFormatter(), [Platform.REACT]: () => this.getJavaScriptFormatter(), [Platform.NEXTJS]: () => this.getJavaScriptFormatter(), + [Platform.VUE]: () => this.getJavaScriptFormatter(), + [Platform.NUXT]: () => this.getJavaScriptFormatter(), [unknown]: (): never => { throw new ProviderError('No code formatter detected.', { reason: ErrorReason.NOT_SUPPORTED, @@ -1971,7 +2036,9 @@ export class Cli { [Platform.NEXTJS]: 'next', }; - return new StoryblokPlugin({ + return new WrapperStoryblokPlugin({ + storyblokPackage: '@storyblok/js', + marker: 'storyblokInit', scanFilter: this.getScanFilter(), codemod: new FormatCodemod( this.getJavaScriptFormatter(), @@ -1991,6 +2058,57 @@ export class Cli { }); } + private createVueStoryblokPlugin(): JavaScriptSdkPlugin { + return new WrapperStoryblokPlugin({ + storyblokPackage: '@storyblok/vue', + marker: 'StoryblokVue', + scanFilter: this.getScanFilter(), + codemod: new FormatCodemod( + this.getJavaScriptFormatter(), + new FileCodemod({ + fileSystem: this.getFileSystem(), + codemod: new JavaScriptCodemod({ + languages: ['typescript'], + codemod: new VueStoryblokCodemod({ + plugin: { + module: '@croct/plug-storyblok/vue', + factory: 'withCroct', + }, + storyblok: { + module: '@storyblok/vue', + identifier: 'StoryblokVue', + }, + }), + }), + }), + ), + }); + } + + private createNuxtStoryblokPlugin(): JavaScriptSdkPlugin { + return new NuxtStoryblokPlugin({ + storyblokPackage: '@storyblok/nuxt', + pluginFile: 'plugins/croct-storyblok.ts', + codemod: new FormatCodemod( + this.getJavaScriptFormatter(), + new FileCodemod({ + fileSystem: this.getFileSystem(), + codemod: new JavaScriptCodemod({ + languages: ['typescript'], + codemod: new NuxtStoryblokPluginCodemod({ + plugin: { + module: '@croct/plug-storyblok/nuxt', + factory: 'withCroct', + }, + storyblokVueModule: '@storyblok/vue', + nuxtAppModule: '#app', + }), + }), + }), + ), + }); + } + private share any)>(method: M, factory: () => ReturnType): ReturnType { const instance = this.instances.get(method); @@ -2165,6 +2283,8 @@ export class Cli { [Platform.JAVASCRIPT]: () => this.getNodeServerProvider().get(), [Platform.REACT]: () => this.getNodeServerProvider().get(), [Platform.NEXTJS]: () => this.getNodeServerProvider().get(), + [Platform.VUE]: () => this.getNodeServerProvider().get(), + [Platform.NUXT]: () => this.getNodeServerProvider().get(), [unknown]: () => null, }, }); @@ -2313,6 +2433,13 @@ export class Cli { dependencies: ['next'], }), }, + { + value: Platform.NUXT, + condition: new HasDependency({ + packageManager: nodePackageManager, + dependencies: ['nuxt'], + }), + }, { value: Platform.REACT, condition: new HasDependency({ @@ -2320,6 +2447,13 @@ export class Cli { dependencies: ['react'], }), }, + { + value: Platform.VUE, + condition: new HasDependency({ + packageManager: nodePackageManager, + dependencies: ['vue'], + }), + }, { value: Platform.JAVASCRIPT, condition: new IsProject({ diff --git a/test/application/project/code/generation/slot/__snapshots__/plugNuxtExampleGenerator.test.ts.snap b/test/application/project/code/generation/slot/__snapshots__/plugNuxtExampleGenerator.test.ts.snap new file mode 100644 index 00000000..a5bf997c --- /dev/null +++ b/test/application/project/code/generation/slot/__snapshots__/plugNuxtExampleGenerator.test.ts.snap @@ -0,0 +1,635 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for booleanWithLabel: booleanWithLabel-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/feature-toggle/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/feature-toggle.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for labeledAttributes: labeledAttributes-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/stylized/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/stylized.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for listOfScalars: listOfScalars-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/tag-cloud/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/tag-cloud.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for listOfStructures: listOfStructures-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/product-grid/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/product-grid.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for nestedStructure: nestedStructure-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/author-card/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/author-card.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for optionalAttributes: optionalAttributes-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/promo-card/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/promo-card.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for privateAttributes: privateAttributes-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/tracked-banner/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/tracked-banner.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for simpleStructure: simpleStructure-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/home-hero/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/home-hero.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for unionInStructure: unionInStructure-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/block/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/block.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate JavaScript SFCs for unionRoot: unionRoot-js 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/cta-block/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/cta-block.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for booleanWithLabel: booleanWithLabel 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/feature-toggle/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/feature-toggle.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for labeledAttributes: labeledAttributes 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/stylized/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/stylized.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for listOfScalars: listOfScalars 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/tag-cloud/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/tag-cloud.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for listOfStructures: listOfStructures 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/product-grid/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/product-grid.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for nestedStructure: nestedStructure 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/author-card/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/author-card.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for optionalAttributes: optionalAttributes 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/promo-card/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/promo-card.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for privateAttributes: privateAttributes 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/tracked-banner/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/tracked-banner.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for simpleStructure: simpleStructure 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/home-hero/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/home-hero.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for unionInStructure: unionInStructure 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/block/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/block.vue", + }, + ], +} +`; + +exports[`PlugNuxtExampleGenerator should generate TypeScript SFCs for unionRoot: unionRoot 1`] = ` +{ + "files": [ + { + "code": "", + "language": "vue", + "path": "pages/cta-block/index.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "components/cta-block.vue", + }, + ], +} +`; diff --git a/test/application/project/code/generation/slot/__snapshots__/plugVueExampleGenerator.test.ts.snap b/test/application/project/code/generation/slot/__snapshots__/plugVueExampleGenerator.test.ts.snap new file mode 100644 index 00000000..ecd0c6aa --- /dev/null +++ b/test/application/project/code/generation/slot/__snapshots__/plugVueExampleGenerator.test.ts.snap @@ -0,0 +1,815 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for booleanWithLabel: booleanWithLabel-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/feature-toggle-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/feature-toggle.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for labeledAttributes: labeledAttributes-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/stylized-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/stylized.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for listOfScalars: listOfScalars-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/tag-cloud-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/tag-cloud.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for listOfStructures: listOfStructures-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/product-grid-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/product-grid.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for nestedStructure: nestedStructure-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/author-card-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/author-card.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for optionalAttributes: optionalAttributes-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/promo-card-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/promo-card.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for privateAttributes: privateAttributes-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/tracked-banner-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/tracked-banner.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for simpleStructure: simpleStructure-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/home-hero-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/home-hero.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for unionInStructure: unionInStructure-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/block-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/block.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate JavaScript SFCs for unionRoot: unionRoot-js 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/cta-block-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/cta-block.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for booleanWithLabel: booleanWithLabel 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/feature-toggle-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/feature-toggle.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for labeledAttributes: labeledAttributes 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/stylized-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/stylized.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for listOfScalars: listOfScalars 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/tag-cloud-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/tag-cloud.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for listOfStructures: listOfStructures 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/product-grid-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/product-grid.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for nestedStructure: nestedStructure 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/author-card-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/author-card.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for optionalAttributes: optionalAttributes 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/promo-card-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/promo-card.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for privateAttributes: privateAttributes 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/tracked-banner-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/tracked-banner.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for simpleStructure: simpleStructure 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/home-hero-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/home-hero.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for unionInStructure: unionInStructure 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/block-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/block.vue", + }, + ], +} +`; + +exports[`PlugVueExampleGenerator should generate TypeScript SFCs for unionRoot: unionRoot 1`] = ` +{ + "files": [ + { + "code": " + +", + "language": "vue", + "path": "src/examples/cta-block-example.vue", + }, + { + "code": " + +", + "language": "vue", + "path": "src/components/cta-block.vue", + }, + ], +} +`; diff --git a/test/application/project/code/generation/slot/fixtures/booleanWithLabel.json b/test/application/project/code/generation/slot/fixtures/booleanWithLabel.json new file mode 100644 index 00000000..2e783d08 --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/booleanWithLabel.json @@ -0,0 +1,25 @@ +{ + "id": "feature-toggle", + "version": 1, + "definition": { + "type": "structure", + "attributes": { + "enabled": { + "type": { + "type": "boolean", + "label": { + "true": "Active", + "false": "Inactive" + } + }, + "position": 0 + }, + "visible": { + "type": { + "type": "boolean" + }, + "position": 1 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/labeledAttributes.json b/test/application/project/code/generation/slot/fixtures/labeledAttributes.json new file mode 100644 index 00000000..d0ac73d0 --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/labeledAttributes.json @@ -0,0 +1,16 @@ +{ + "id": "stylized", + "version": 1, + "definition": { + "type": "structure", + "attributes": { + "title": { + "type": { + "type": "text" + }, + "label": "Tom & Jerry ", + "position": 0 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/listOfScalars.json b/test/application/project/code/generation/slot/fixtures/listOfScalars.json new file mode 100644 index 00000000..d3e4b74b --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/listOfScalars.json @@ -0,0 +1,18 @@ +{ + "id": "tag-cloud", + "version": 1, + "definition": { + "type": "structure", + "attributes": { + "tags": { + "type": { + "type": "list", + "items": { + "type": "text" + } + }, + "position": 0 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/listOfStructures.json b/test/application/project/code/generation/slot/fixtures/listOfStructures.json new file mode 100644 index 00000000..08ab6cd5 --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/listOfStructures.json @@ -0,0 +1,33 @@ +{ + "id": "product-grid", + "version": 3, + "definition": { + "type": "structure", + "attributes": { + "products": { + "type": { + "type": "list", + "itemLabel": "Product", + "items": { + "type": "structure", + "attributes": { + "name": { + "type": { + "type": "text" + }, + "position": 0 + }, + "price": { + "type": { + "type": "number" + }, + "position": 1 + } + } + } + }, + "position": 0 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/nestedStructure.json b/test/application/project/code/generation/slot/fixtures/nestedStructure.json new file mode 100644 index 00000000..33bf68af --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/nestedStructure.json @@ -0,0 +1,30 @@ +{ + "id": "author-card", + "version": 1, + "definition": { + "type": "structure", + "attributes": { + "author": { + "type": { + "type": "structure", + "attributes": { + "name": { + "type": { + "type": "text" + }, + "position": 0 + }, + "bio": { + "type": { + "type": "text" + }, + "optional": true, + "position": 1 + } + } + }, + "position": 0 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/optionalAttributes.json b/test/application/project/code/generation/slot/fixtures/optionalAttributes.json new file mode 100644 index 00000000..83ae9baa --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/optionalAttributes.json @@ -0,0 +1,22 @@ +{ + "id": "promo-card", + "version": 2, + "definition": { + "type": "structure", + "attributes": { + "title": { + "type": { + "type": "text" + }, + "position": 0 + }, + "subtitle": { + "type": { + "type": "text" + }, + "optional": true, + "position": 1 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/privateAttributes.json b/test/application/project/code/generation/slot/fixtures/privateAttributes.json new file mode 100644 index 00000000..79c18578 --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/privateAttributes.json @@ -0,0 +1,22 @@ +{ + "id": "tracked-banner", + "version": 1, + "definition": { + "type": "structure", + "attributes": { + "headline": { + "type": { + "type": "text" + }, + "position": 0 + }, + "trackingId": { + "type": { + "type": "text" + }, + "private": true, + "position": 1 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/simpleStructure.json b/test/application/project/code/generation/slot/fixtures/simpleStructure.json new file mode 100644 index 00000000..ee2907ae --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/simpleStructure.json @@ -0,0 +1,27 @@ +{ + "id": "home-hero", + "version": 1, + "definition": { + "type": "structure", + "attributes": { + "headline": { + "type": { + "type": "text" + }, + "position": 0 + }, + "viewCount": { + "type": { + "type": "number" + }, + "position": 1 + }, + "featured": { + "type": { + "type": "boolean" + }, + "position": 2 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/unionInStructure.json b/test/application/project/code/generation/slot/fixtures/unionInStructure.json new file mode 100644 index 00000000..760c4246 --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/unionInStructure.json @@ -0,0 +1,39 @@ +{ + "id": "block", + "version": 1, + "definition": { + "type": "structure", + "attributes": { + "media": { + "type": { + "type": "union", + "types": { + "image": { + "type": "structure", + "attributes": { + "url": { + "type": { + "type": "text" + }, + "position": 0 + } + } + }, + "video": { + "type": "structure", + "attributes": { + "source": { + "type": { + "type": "text" + }, + "position": 0 + } + } + } + } + }, + "position": 0 + } + } + } +} diff --git a/test/application/project/code/generation/slot/fixtures/unionRoot.json b/test/application/project/code/generation/slot/fixtures/unionRoot.json new file mode 100644 index 00000000..37ea9714 --- /dev/null +++ b/test/application/project/code/generation/slot/fixtures/unionRoot.json @@ -0,0 +1,37 @@ +{ + "id": "cta-block", + "version": 1, + "definition": { + "type": "union", + "types": { + "button": { + "type": "structure", + "attributes": { + "label": { + "type": { + "type": "text" + }, + "position": 0 + } + } + }, + "link": { + "type": "structure", + "attributes": { + "url": { + "type": { + "type": "text" + }, + "position": 0 + }, + "text": { + "type": { + "type": "text" + }, + "position": 1 + } + } + } + } + } +} diff --git a/test/application/project/code/generation/slot/plugNuxtExampleGenerator.test.ts b/test/application/project/code/generation/slot/plugNuxtExampleGenerator.test.ts new file mode 100644 index 00000000..251c13b8 --- /dev/null +++ b/test/application/project/code/generation/slot/plugNuxtExampleGenerator.test.ts @@ -0,0 +1,49 @@ +import {readFileSync, readdirSync} from 'fs'; +import {basename, resolve} from 'path'; +import type {SlotDefinition} from '@/application/project/code/generation/slot/slotExampleGenerator'; +import type {Configuration} from '@/application/project/code/generation/slot/vueExampleGenerator'; +import {PlugNuxtExampleGenerator} from '@/application/project/code/generation/slot/plugNuxtExampleGenerator'; + +describe('PlugNuxtExampleGenerator', () => { + const fixturesPath = resolve(__dirname, 'fixtures'); + + function loadFixture(file: string): SlotDefinition { + return JSON.parse(readFileSync(resolve(fixturesPath, file), 'utf-8')); + } + + const fixtures = readdirSync(fixturesPath).filter(file => file.endsWith('.json')) + .map( + file => ({ + name: basename(file, '.json'), + definition: loadFixture(file), + }), + ); + + const tsOptions: Configuration = { + typescript: true, + contentVariable: 'data.content', + slotImportPath: '~/components/%slug%.vue', + slotFilePath: 'components/%slug%.vue', + slotComponentName: '%name%', + pageFilePath: 'pages/%slug%/index.vue', + }; + + it.each(fixtures)('should generate TypeScript SFCs for $name', ({name, definition}) => { + const example = new PlugNuxtExampleGenerator(tsOptions).generate(definition); + + expect(example).toMatchSnapshot(name); + }); + + it.each(fixtures)('should generate JavaScript SFCs for $name', ({name, definition}) => { + const example = new PlugNuxtExampleGenerator({...tsOptions, typescript: false}).generate(definition); + + expect(example).toMatchSnapshot(`${name}-js`); + }); + + it('should destructure only data from useContent', () => { + const example = new PlugNuxtExampleGenerator(tsOptions) + .generate(loadFixture('simpleStructure.json')); + + expect(example.files[1].code).toContain("const {data} = await useContent('home-hero@1');"); + }); +}); diff --git a/test/application/project/code/generation/slot/plugVueExampleGenerator.test.ts b/test/application/project/code/generation/slot/plugVueExampleGenerator.test.ts new file mode 100644 index 00000000..bc9dcd35 --- /dev/null +++ b/test/application/project/code/generation/slot/plugVueExampleGenerator.test.ts @@ -0,0 +1,56 @@ +import {readFileSync, readdirSync} from 'fs'; +import {basename, resolve} from 'path'; +import type {SlotDefinition} from '@/application/project/code/generation/slot/slotExampleGenerator'; +import type {Configuration} from '@/application/project/code/generation/slot/vueExampleGenerator'; +import {PlugVueExampleGenerator} from '@/application/project/code/generation/slot/plugVueExampleGenerator'; + +describe('PlugVueExampleGenerator', () => { + const fixturesPath = resolve(__dirname, 'fixtures'); + + function loadFixture(file: string): SlotDefinition { + return JSON.parse(readFileSync(resolve(fixturesPath, file), 'utf-8')); + } + + const fixtures = readdirSync(fixturesPath).filter(file => file.endsWith('.json')) + .map( + file => ({ + name: basename(file, '.json'), + definition: loadFixture(file), + }), + ); + + const tsOptions: Configuration = { + typescript: true, + contentVariable: 'content', + slotImportPath: './%slug%.vue', + slotFilePath: 'src/components/%slug%.vue', + slotComponentName: '%name%', + pageFilePath: 'src/examples/%slug%-example.vue', + }; + + it.each(fixtures)('should generate TypeScript SFCs for $name', ({name, definition}) => { + const example = new PlugVueExampleGenerator(tsOptions).generate(definition); + + expect(example).toMatchSnapshot(name); + }); + + it.each(fixtures)('should generate JavaScript SFCs for $name', ({name, definition}) => { + const example = new PlugVueExampleGenerator({...tsOptions, typescript: false}).generate(definition); + + expect(example).toMatchSnapshot(`${name}-js`); + }); + + it('should use a custom content variable binding', () => { + const example = new PlugVueExampleGenerator({...tsOptions, contentVariable: 'props'}) + .generate(loadFixture('simpleStructure.json')); + + expect(example.files[1].code).toContain("const {data: props, isLoading} = useContent('home-hero@1');"); + }); + + it('should not rebind the destructured variable when it is named "data"', () => { + const example = new PlugVueExampleGenerator({...tsOptions, contentVariable: 'data'}) + .generate(loadFixture('simpleStructure.json')); + + expect(example.files[1].code).toContain("const {data, isLoading} = useContent('home-hero@1');"); + }); +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/aliasedDefineNuxtConfig.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/aliasedDefineNuxtConfig.ts new file mode 100644 index 00000000..8fd5bb81 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/aliasedDefineNuxtConfig.ts @@ -0,0 +1,5 @@ +import { defineNuxtConfig as defineConfig } from 'nuxt/config'; + +export default defineConfig({ + modules: ['@nuxtjs/tailwindcss'], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/aliasedIndirectConfig.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/aliasedIndirectConfig.ts new file mode 100644 index 00000000..67d9a8b2 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/aliasedIndirectConfig.ts @@ -0,0 +1,7 @@ +import { defineNuxtConfig as defineConfig } from 'nuxt/config'; + +const config = defineConfig({ + modules: ['@nuxtjs/tailwindcss'], +}); + +export default config; diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/alreadyConfigured.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/alreadyConfigured.ts new file mode 100644 index 00000000..d3105a41 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/alreadyConfigured.ts @@ -0,0 +1,3 @@ +export default defineNuxtConfig({ + modules: ['@croct/plug-nuxt'], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/alreadyConfiguredAsTuple.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/alreadyConfiguredAsTuple.ts new file mode 100644 index 00000000..abe5dbd9 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/alreadyConfiguredAsTuple.ts @@ -0,0 +1,5 @@ +export default defineNuxtConfig({ + modules: [ + ['@croct/plug-nuxt', { debug: true }], + ], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectExport.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectExport.ts new file mode 100644 index 00000000..4a89b941 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectExport.ts @@ -0,0 +1,3 @@ +export default { + modules: ['@nuxtjs/tailwindcss'], +}; diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectExportNoModules.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectExportNoModules.ts new file mode 100644 index 00000000..ff8b4c56 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectExportNoModules.ts @@ -0,0 +1 @@ +export default {}; diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectIndirectVariable.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectIndirectVariable.ts new file mode 100644 index 00000000..1a32d930 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/bareObjectIndirectVariable.ts @@ -0,0 +1,5 @@ +const config = { + modules: ['@nuxtjs/tailwindcss'], +}; + +export default config; diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/defineCallWithReference.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/defineCallWithReference.ts new file mode 100644 index 00000000..286231ab --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/defineCallWithReference.ts @@ -0,0 +1,3 @@ +const opts = { modules: [] }; + +export default defineNuxtConfig(opts); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/emptyDefineCall.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/emptyDefineCall.ts new file mode 100644 index 00000000..a1e8f808 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/emptyDefineCall.ts @@ -0,0 +1 @@ +export default defineNuxtConfig(); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/emptyModulesArray.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/emptyModulesArray.ts new file mode 100644 index 00000000..3b54fe11 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/emptyModulesArray.ts @@ -0,0 +1,3 @@ +export default defineNuxtConfig({ + modules: [], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/existingModules.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/existingModules.ts new file mode 100644 index 00000000..f270dee8 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/existingModules.ts @@ -0,0 +1,3 @@ +export default defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss'], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/functionDefaultExport.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/functionDefaultExport.ts new file mode 100644 index 00000000..e3ab1f48 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/functionDefaultExport.ts @@ -0,0 +1,3 @@ +export default function makeConfig() { + return { modules: [] }; +} diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/indirectConfigVariable.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/indirectConfigVariable.ts new file mode 100644 index 00000000..0a9aa4c9 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/indirectConfigVariable.ts @@ -0,0 +1,5 @@ +const config = defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss'], +}); + +export default config; diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/indirectConfigWithExtraDeclarator.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/indirectConfigWithExtraDeclarator.ts new file mode 100644 index 00000000..2659987e --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/indirectConfigWithExtraDeclarator.ts @@ -0,0 +1,7 @@ +const unrelated = 1; +const config = defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss'], +}); + +export default config; +export { unrelated }; diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/modulesAsSpread.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/modulesAsSpread.ts new file mode 100644 index 00000000..aaec0536 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/modulesAsSpread.ts @@ -0,0 +1,5 @@ +const sharedModules = ['@nuxtjs/tailwindcss']; + +export default defineNuxtConfig({ + modules: [...sharedModules], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/noModulesKey.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/noModulesKey.ts new file mode 100644 index 00000000..68093d8e --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/noModulesKey.ts @@ -0,0 +1 @@ +export default defineNuxtConfig({}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/nonArrayModules.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/nonArrayModules.ts new file mode 100644 index 00000000..2018c59b --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/nonArrayModules.ts @@ -0,0 +1,5 @@ +const modules = ['@nuxtjs/tailwindcss']; + +export default defineNuxtConfig({ + modules: modules, +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/nonObjectExport.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/nonObjectExport.ts new file mode 100644 index 00000000..a54f8321 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/nonObjectExport.ts @@ -0,0 +1 @@ +export default makeConfig(); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/sparseModulesArray.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/sparseModulesArray.ts new file mode 100644 index 00000000..40635df2 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/sparseModulesArray.ts @@ -0,0 +1,3 @@ +export default defineNuxtConfig({ + modules: [, '@nuxtjs/tailwindcss'], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/spreadConfigProperties.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/spreadConfigProperties.ts new file mode 100644 index 00000000..69e8bdf8 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/spreadConfigProperties.ts @@ -0,0 +1,5 @@ +const shared = { modules: ['@nuxtjs/tailwindcss'] }; + +export default defineNuxtConfig({ + ...shared, +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/stringLiteralModulesKey.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/stringLiteralModulesKey.ts new file mode 100644 index 00000000..e2bba6b3 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/stringLiteralModulesKey.ts @@ -0,0 +1,3 @@ +export default defineNuxtConfig({ + 'modules': ['@nuxtjs/tailwindcss'], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/uninitializedBinding.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/uninitializedBinding.ts new file mode 100644 index 00000000..929f8a20 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/uninitializedBinding.ts @@ -0,0 +1,3 @@ +let config; + +export default config; diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/withStoryblokModule.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/withStoryblokModule.ts new file mode 100644 index 00000000..c6ac16d0 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/withStoryblokModule.ts @@ -0,0 +1,5 @@ +export default defineNuxtConfig({ + modules: [ + ['@storyblok/nuxt', { accessToken: 'YOUR_ACCESS_TOKEN' }], + ], +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/withTypeAssertionAsConst.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/withTypeAssertionAsConst.ts new file mode 100644 index 00000000..24774ce7 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/withTypeAssertionAsConst.ts @@ -0,0 +1,3 @@ +export default defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss'], +} as const); diff --git a/test/application/project/code/transformation/fixtures/nuxt-config-module/withTypeAssertionSatisfies.ts b/test/application/project/code/transformation/fixtures/nuxt-config-module/withTypeAssertionSatisfies.ts new file mode 100644 index 00000000..69e7e237 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-config-module/withTypeAssertionSatisfies.ts @@ -0,0 +1,5 @@ +import type { NuxtConfig } from 'nuxt/schema'; + +export default defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss'], +} satisfies NuxtConfig); diff --git a/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/aliasedDefineNuxtPlugin.ts b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/aliasedDefineNuxtPlugin.ts new file mode 100644 index 00000000..31fd3be1 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/aliasedDefineNuxtPlugin.ts @@ -0,0 +1,5 @@ +import { defineNuxtPlugin as defineNuxt } from '#app'; + +export default defineNuxt(nuxtApp => { + console.log('custom plugin', nuxtApp); +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/alreadyScaffolded.ts b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/alreadyScaffolded.ts new file mode 100644 index 00000000..2ca84d8e --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/alreadyScaffolded.ts @@ -0,0 +1,7 @@ +import { withCroct } from '@croct/plug-storyblok/nuxt'; +import { useStoryblokApi } from '@storyblok/vue'; +import { defineNuxtPlugin } from '#app'; + +export default defineNuxtPlugin(nuxtApp => { + withCroct(nuxtApp, useStoryblokApi()); +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/empty.ts b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/empty.ts new file mode 100644 index 00000000..e69de29b diff --git a/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/partialScaffold.ts b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/partialScaffold.ts new file mode 100644 index 00000000..df5c8814 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/partialScaffold.ts @@ -0,0 +1,5 @@ +import { defineNuxtPlugin } from '#app'; + +export default defineNuxtPlugin(nuxtApp => { + console.log('custom plugin', nuxtApp); +}); diff --git a/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/withComments.ts b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/withComments.ts new file mode 100644 index 00000000..09038338 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/nuxt-storyblok-plugin/withComments.ts @@ -0,0 +1,2 @@ +// Croct + Storyblok bridge plugin. +// Generated by `croct install`. diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/aliasedFactoryImportAndUsed.ts b/test/application/project/code/transformation/fixtures/vue-plugin/aliasedFactoryImportAndUsed.ts new file mode 100644 index 00000000..ab2d0e37 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/aliasedFactoryImportAndUsed.ts @@ -0,0 +1,7 @@ +import { createApp } from 'vue'; +import { createCroct as plug } from '@croct/plug-vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(plug({ appId: 'YOUR_APP_ID' })); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/alreadyRegistered.ts b/test/application/project/code/transformation/fixtures/vue-plugin/alreadyRegistered.ts new file mode 100644 index 00000000..0742d36e --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/alreadyRegistered.ts @@ -0,0 +1,7 @@ +import { createApp } from 'vue'; +import { createCroct } from '@croct/plug-vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(createCroct({ appId: 'YOUR_APP_ID' })); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/argsReference.ts b/test/application/project/code/transformation/fixtures/vue-plugin/argsReference.ts new file mode 100644 index 00000000..b0788dd0 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/argsReference.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/argsTernary.ts b/test/application/project/code/transformation/fixtures/vue-plugin/argsTernary.ts new file mode 100644 index 00000000..b0788dd0 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/argsTernary.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/chainedAlreadyRegistered.ts b/test/application/project/code/transformation/fixtures/vue-plugin/chainedAlreadyRegistered.ts new file mode 100644 index 00000000..659cee7a --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/chainedAlreadyRegistered.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import { createCroct } from '@croct/plug-vue'; +import App from './App.vue'; + +createApp(App).use(createCroct({ appId: 'YOUR_APP_ID' })).mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/chainedMount.ts b/test/application/project/code/transformation/fixtures/vue-plugin/chainedMount.ts new file mode 100644 index 00000000..684d0421 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/chainedMount.ts @@ -0,0 +1,4 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +createApp(App).mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/chainedWithPlugins.ts b/test/application/project/code/transformation/fixtures/vue-plugin/chainedWithPlugins.ts new file mode 100644 index 00000000..64943a35 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/chainedWithPlugins.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue'; +import router from './router'; +import pinia from './pinia'; +import App from './App.vue'; + +createApp(App).use(router).use(pinia).mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/chainedWithStoryblok.ts b/test/application/project/code/transformation/fixtures/vue-plugin/chainedWithStoryblok.ts new file mode 100644 index 00000000..f84a9d54 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/chainedWithStoryblok.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +createApp(App) + .use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], + }) + .mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/computedMountAccess.ts b/test/application/project/code/transformation/fixtures/vue-plugin/computedMountAccess.ts new file mode 100644 index 00000000..26dd4d5d --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/computedMountAccess.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app['mount']('#app'); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/createAppAsArgument.ts b/test/application/project/code/transformation/fixtures/vue-plugin/createAppAsArgument.ts new file mode 100644 index 00000000..b297931c --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/createAppAsArgument.ts @@ -0,0 +1,4 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +console.log(createApp(App)); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/createAppFromOtherPackage.ts b/test/application/project/code/transformation/fixtures/vue-plugin/createAppFromOtherPackage.ts new file mode 100644 index 00000000..f1666979 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/createAppFromOtherPackage.ts @@ -0,0 +1,3 @@ +import { createApp } from 'other-package'; + +createApp({}).mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/createAppImportedButNotCalled.ts b/test/application/project/code/transformation/fixtures/vue-plugin/createAppImportedButNotCalled.ts new file mode 100644 index 00000000..9593c811 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/createAppImportedButNotCalled.ts @@ -0,0 +1,3 @@ +import { createApp } from 'vue'; + +console.log(createApp); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/destructuredCreateApp.ts b/test/application/project/code/transformation/fixtures/vue-plugin/destructuredCreateApp.ts new file mode 100644 index 00000000..97a2de23 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/destructuredCreateApp.ts @@ -0,0 +1,7 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const { mount } = createApp(App); + +mount('#app'); + diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/exportedCreateApp.ts b/test/application/project/code/transformation/fixtures/vue-plugin/exportedCreateApp.ts new file mode 100644 index 00000000..87c45ebb --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/exportedCreateApp.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +export const app = createApp(App); + +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/importedAliasedButNotUsed.ts b/test/application/project/code/transformation/fixtures/vue-plugin/importedAliasedButNotUsed.ts new file mode 100644 index 00000000..03a49ae1 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/importedAliasedButNotUsed.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue'; +import { createCroct as plug } from '@croct/plug-vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/importedButNotUsed.ts b/test/application/project/code/transformation/fixtures/vue-plugin/importedButNotUsed.ts new file mode 100644 index 00000000..e39bcc8f --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/importedButNotUsed.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue'; +import { createCroct } from '@croct/plug-vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/incompleteChain.ts b/test/application/project/code/transformation/fixtures/vue-plugin/incompleteChain.ts new file mode 100644 index 00000000..3ffe1e78 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/incompleteChain.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const mountFn = createApp(App).mount; +mountFn('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/intermediateNonUseStatement.ts b/test/application/project/code/transformation/fixtures/vue-plugin/intermediateNonUseStatement.ts new file mode 100644 index 00000000..3aa02318 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/intermediateNonUseStatement.ts @@ -0,0 +1,8 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +const flag = true; +app.use(router); +console.log(flag); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/intermediateUnrelatedCalls.ts b/test/application/project/code/transformation/fixtures/vue-plugin/intermediateUnrelatedCalls.ts new file mode 100644 index 00000000..82d75b8f --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/intermediateUnrelatedCalls.ts @@ -0,0 +1,11 @@ +import { createApp } from 'vue'; +import { createCroct } from '@croct/plug-vue'; +import App from './App.vue'; + +const app = createApp(App); +app['use'](router); +app.config.globalProperties.foo = 'bar'; +console.log('hi'); +app.mixin({}); +app.mount('#app'); + diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/mountWithDocumentBody.ts b/test/application/project/code/transformation/fixtures/vue-plugin/mountWithDocumentBody.ts new file mode 100644 index 00000000..f32505d0 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/mountWithDocumentBody.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount(document.body); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/multipleCreateAppCallsChainedFirst.ts b/test/application/project/code/transformation/fixtures/vue-plugin/multipleCreateAppCallsChainedFirst.ts new file mode 100644 index 00000000..17c46be8 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/multipleCreateAppCallsChainedFirst.ts @@ -0,0 +1,8 @@ +import { createApp } from 'vue'; +import App from './App.vue'; +import Other from './Other.vue'; + +createApp(App).mount('#app'); + +const second = createApp(Other); +second.mount('#second'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/multipleCreateAppCallsVariableFirst.ts b/test/application/project/code/transformation/fixtures/vue-plugin/multipleCreateAppCallsVariableFirst.ts new file mode 100644 index 00000000..eab42988 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/multipleCreateAppCallsVariableFirst.ts @@ -0,0 +1,8 @@ +import { createApp } from 'vue'; +import App from './App.vue'; +import Other from './Other.vue'; + +const app = createApp(App); +app.mount('#app'); + +createApp(Other).mount('#second'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/noArgs.ts b/test/application/project/code/transformation/fixtures/vue-plugin/noArgs.ts new file mode 100644 index 00000000..b0788dd0 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/noArgs.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/noCreateAppCall.ts b/test/application/project/code/transformation/fixtures/vue-plugin/noCreateAppCall.ts new file mode 100644 index 00000000..99cf8c91 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/noCreateAppCall.ts @@ -0,0 +1,3 @@ +import { something } from 'somewhere'; + +something({ foo: 'bar' }); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/noMountCall.ts b/test/application/project/code/transformation/fixtures/vue-plugin/noMountCall.ts new file mode 100644 index 00000000..728cc113 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/noMountCall.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(router); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/typescriptInput.ts b/test/application/project/code/transformation/fixtures/vue-plugin/typescriptInput.ts new file mode 100644 index 00000000..153b0292 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/typescriptInput.ts @@ -0,0 +1,5 @@ +import { createApp, App as VueApp } from 'vue'; +import App from './App.vue'; + +const app: VueApp = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/variableForm.ts b/test/application/project/code/transformation/fixtures/vue-plugin/variableForm.ts new file mode 100644 index 00000000..b0788dd0 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/variableForm.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/variableWithPlugins.ts b/test/application/project/code/transformation/fixtures/vue-plugin/variableWithPlugins.ts new file mode 100644 index 00000000..1db86670 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/variableWithPlugins.ts @@ -0,0 +1,9 @@ +import { createApp } from 'vue'; +import router from './router'; +import pinia from './pinia'; +import App from './App.vue'; + +const app = createApp(App); +app.use(router); +app.use(pinia); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-plugin/withStoryblokAppUse.ts b/test/application/project/code/transformation/fixtures/vue-plugin/withStoryblokAppUse.ts new file mode 100644 index 00000000..afe7742f --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-plugin/withStoryblokAppUse.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokAliasedImport.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokAliasedImport.ts new file mode 100644 index 00000000..0f88dd91 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokAliasedImport.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue'; +import { StoryblokVue as SbVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(SbVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokAlreadyMigrated.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokAlreadyMigrated.ts new file mode 100644 index 00000000..2363ebc9 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokAlreadyMigrated.ts @@ -0,0 +1,11 @@ +import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import { withCroct } from '@croct/plug-storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokBasicMigration.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokBasicMigration.ts new file mode 100644 index 00000000..afe7742f --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokBasicMigration.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokChainedAppUse.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokChainedAppUse.ts new file mode 100644 index 00000000..f84a9d54 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokChainedAppUse.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +createApp(App) + .use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], + }) + .mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokImportedButNoUseCall.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokImportedButNoUseCall.ts new file mode 100644 index 00000000..135e8bf3 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokImportedButNoUseCall.ts @@ -0,0 +1,8 @@ +import { createApp } from 'vue'; +import { StoryblokVue } from '@storyblok/vue'; +import App from './App.vue'; + +console.log(StoryblokVue); + +const app = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokMultipleAppUseCalls.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokMultipleAppUseCalls.ts new file mode 100644 index 00000000..199b0f40 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokMultipleAppUseCalls.ts @@ -0,0 +1,14 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import router from './router'; +import pinia from './pinia'; +import App from './App.vue'; + +const app = createApp(App); +app.use(router); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.use(pinia); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokNoCreateApp.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokNoCreateApp.ts new file mode 100644 index 00000000..6bb3fee2 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokNoCreateApp.ts @@ -0,0 +1,6 @@ +import { StoryblokVue } from '@storyblok/vue'; + +const app = { use: () => app, mount: () => {} }; + +app.use(StoryblokVue, { accessToken: 'YOUR_ACCESS_TOKEN' }); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokNoImport.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokNoImport.ts new file mode 100644 index 00000000..fbe05305 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokNoImport.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokOnlySpecifier.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokOnlySpecifier.ts new file mode 100644 index 00000000..409e696c --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokOnlySpecifier.ts @@ -0,0 +1,9 @@ +import { createApp } from 'vue'; +import { StoryblokVue } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', +}); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokOptionsArePreserved.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokOptionsArePreserved.ts new file mode 100644 index 00000000..a11a0602 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokOptionsArePreserved.ts @@ -0,0 +1,15 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; +import MyComponent from './MyComponent.vue'; + +const sharedOptions = { foo: 'bar' }; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], + components: { MyComponent }, + ...sharedOptions, +}); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokStringSpecifier.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokStringSpecifier.ts new file mode 100644 index 00000000..b02a2e22 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokStringSpecifier.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue'; +import { 'apiPlugin' as apiPlugin, StoryblokVue } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithCroctAliasedButNotUsed.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithCroctAliasedButNotUsed.ts new file mode 100644 index 00000000..aaa7526b --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithCroctAliasedButNotUsed.ts @@ -0,0 +1,11 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import { withCroct as croctSb } from '@croct/plug-storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithCroctImportedButNotUsed.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithCroctImportedButNotUsed.ts new file mode 100644 index 00000000..edd5f8d7 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithCroctImportedButNotUsed.ts @@ -0,0 +1,11 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import { withCroct } from '@croct/plug-storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.mount('#app'); diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithDefaultSpecifier.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithDefaultSpecifier.ts new file mode 100644 index 00000000..d61886de --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithDefaultSpecifier.ts @@ -0,0 +1,12 @@ +import { createApp } from 'vue'; +import StoryblokDefault, { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.mount('#app'); + +export { StoryblokDefault }; diff --git a/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithOtherSpecifiers.ts b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithOtherSpecifiers.ts new file mode 100644 index 00000000..f243ce47 --- /dev/null +++ b/test/application/project/code/transformation/fixtures/vue-storyblok/storyblokWithOtherSpecifiers.ts @@ -0,0 +1,12 @@ +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin, useStoryblok } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); +app.mount('#app'); + +export { useStoryblok }; diff --git a/test/application/project/code/transformation/javascript/__snapshots__/nuxtConfigModuleCodemod.test.ts.snap b/test/application/project/code/transformation/javascript/__snapshots__/nuxtConfigModuleCodemod.test.ts.snap new file mode 100644 index 00000000..abf2d589 --- /dev/null +++ b/test/application/project/code/transformation/javascript/__snapshots__/nuxtConfigModuleCodemod.test.ts.snap @@ -0,0 +1,200 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`NuxtConfigModuleCodemod should correctly transform aliasedDefineNuxtConfig.ts: aliasedDefineNuxtConfig.ts 1`] = ` +"import { defineNuxtConfig as defineConfig } from 'nuxt/config'; + +export default defineConfig({ + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform aliasedIndirectConfig.ts: aliasedIndirectConfig.ts 1`] = ` +"import { defineNuxtConfig as defineConfig } from 'nuxt/config'; + +const config = defineConfig({ + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}); + +export default config; +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform alreadyConfigured.ts: alreadyConfigured.ts 1`] = ` +"export default defineNuxtConfig({ + modules: ['@croct/plug-nuxt'], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform alreadyConfiguredAsTuple.ts: alreadyConfiguredAsTuple.ts 1`] = ` +"export default defineNuxtConfig({ + modules: [ + ['@croct/plug-nuxt', { debug: true }], + ], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform bareObjectExport.ts: bareObjectExport.ts 1`] = ` +"export default { + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}; +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform bareObjectExportNoModules.ts: bareObjectExportNoModules.ts 1`] = ` +"export default { + modules: ["@croct/plug-nuxt"] +}; +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform bareObjectIndirectVariable.ts: bareObjectIndirectVariable.ts 1`] = ` +"const config = { + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}; + +export default config; +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform defineCallWithReference.ts: defineCallWithReference.ts 1`] = ` +"const opts = { modules: [] }; + +export default defineNuxtConfig(opts); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform emptyDefineCall.ts: emptyDefineCall.ts 1`] = ` +"export default defineNuxtConfig(); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform emptyModulesArray.ts: emptyModulesArray.ts 1`] = ` +"export default defineNuxtConfig({ + modules: ["@croct/plug-nuxt"], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform existingModules.ts: existingModules.ts 1`] = ` +"export default defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform functionDefaultExport.ts: functionDefaultExport.ts 1`] = ` +"export default function makeConfig() { + return { modules: [] }; +} +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform indirectConfigVariable.ts: indirectConfigVariable.ts 1`] = ` +"const config = defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}); + +export default config; +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform indirectConfigWithExtraDeclarator.ts: indirectConfigWithExtraDeclarator.ts 1`] = ` +"const unrelated = 1; +const config = defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}); + +export default config; +export { unrelated }; +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform modulesAsSpread.ts: modulesAsSpread.ts 1`] = ` +"const sharedModules = ['@nuxtjs/tailwindcss']; + +export default defineNuxtConfig({ + modules: [...sharedModules, "@croct/plug-nuxt"], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform noModulesKey.ts: noModulesKey.ts 1`] = ` +"export default defineNuxtConfig({ + modules: ["@croct/plug-nuxt"] +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform nonArrayModules.ts: nonArrayModules.ts 1`] = ` +"const modules = ['@nuxtjs/tailwindcss']; + +export default defineNuxtConfig({ + modules: modules, +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform nonObjectExport.ts: nonObjectExport.ts 1`] = ` +"export default makeConfig(); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform sparseModulesArray.ts: sparseModulesArray.ts 1`] = ` +"export default defineNuxtConfig({ + modules: [, '@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform spreadConfigProperties.ts: spreadConfigProperties.ts 1`] = ` +"const shared = { modules: ['@nuxtjs/tailwindcss'] }; + +export default defineNuxtConfig({ + ...shared, + modules: ["@croct/plug-nuxt"] +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform stringLiteralModulesKey.ts: stringLiteralModulesKey.ts 1`] = ` +"export default defineNuxtConfig({ + 'modules': ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform uninitializedBinding.ts: uninitializedBinding.ts 1`] = ` +"let config; + +export default config; +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform withStoryblokModule.ts: withStoryblokModule.ts 1`] = ` +"export default defineNuxtConfig({ + modules: [ + ['@storyblok/nuxt', { accessToken: 'YOUR_ACCESS_TOKEN' }], + "@croct/plug-nuxt" + ], +}); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform withTypeAssertionAsConst.ts: withTypeAssertionAsConst.ts 1`] = ` +"export default defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +} as const); +" +`; + +exports[`NuxtConfigModuleCodemod should correctly transform withTypeAssertionSatisfies.ts: withTypeAssertionSatisfies.ts 1`] = ` +"import type { NuxtConfig } from 'nuxt/schema'; + +export default defineNuxtConfig({ + modules: ['@nuxtjs/tailwindcss', "@croct/plug-nuxt"], +} satisfies NuxtConfig); +" +`; diff --git a/test/application/project/code/transformation/javascript/__snapshots__/nuxtStoryblokPluginCodemod.test.ts.snap b/test/application/project/code/transformation/javascript/__snapshots__/nuxtStoryblokPluginCodemod.test.ts.snap new file mode 100644 index 00000000..ed4ae8ab --- /dev/null +++ b/test/application/project/code/transformation/javascript/__snapshots__/nuxtStoryblokPluginCodemod.test.ts.snap @@ -0,0 +1,51 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`NuxtStoryblokPluginCodemod should correctly transform aliasedDefineNuxtPlugin.ts: aliasedDefineNuxtPlugin.ts 1`] = ` +"import { defineNuxtPlugin as defineNuxt } from '#app'; + +export default defineNuxt(nuxtApp => { + console.log('custom plugin', nuxtApp); +}); +" +`; + +exports[`NuxtStoryblokPluginCodemod should correctly transform alreadyScaffolded.ts: alreadyScaffolded.ts 1`] = ` +"import { withCroct } from '@croct/plug-storyblok/nuxt'; +import { useStoryblokApi } from '@storyblok/vue'; +import { defineNuxtPlugin } from '#app'; + +export default defineNuxtPlugin(nuxtApp => { + withCroct(nuxtApp, useStoryblokApi()); +}); +" +`; + +exports[`NuxtStoryblokPluginCodemod should correctly transform empty.ts: empty.ts 1`] = ` +"import { defineNuxtPlugin } from "#app"; +import { useStoryblokApi } from "@storyblok/vue"; +import { withCroct } from "@croct/plug-storyblok/nuxt"; + +export default defineNuxtPlugin(nuxtApp => { + withCroct(nuxtApp, useStoryblokApi()); +});" +`; + +exports[`NuxtStoryblokPluginCodemod should correctly transform partialScaffold.ts: partialScaffold.ts 1`] = ` +"import { defineNuxtPlugin } from '#app'; + +export default defineNuxtPlugin(nuxtApp => { + console.log('custom plugin', nuxtApp); +}); +" +`; + +exports[`NuxtStoryblokPluginCodemod should correctly transform withComments.ts: withComments.ts 1`] = ` +"import { defineNuxtPlugin } from "#app"; +import { useStoryblokApi } from "@storyblok/vue"; +import { withCroct } from "@croct/plug-storyblok/nuxt"; + +export default defineNuxtPlugin(nuxtApp => { + withCroct(nuxtApp, useStoryblokApi()); +}); +" +`; diff --git a/test/application/project/code/transformation/javascript/__snapshots__/vuePluginCodemod.test.ts.snap b/test/application/project/code/transformation/javascript/__snapshots__/vuePluginCodemod.test.ts.snap new file mode 100644 index 00000000..17db7128 --- /dev/null +++ b/test/application/project/code/transformation/javascript/__snapshots__/vuePluginCodemod.test.ts.snap @@ -0,0 +1,369 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`VuePluginCodemod apply should correctly transform aliasedFactoryImportAndUsed.ts: aliasedFactoryImportAndUsed.ts 1`] = ` +"import { createApp } from 'vue'; +import { createCroct as plug } from '@croct/plug-vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(plug({ appId: 'YOUR_APP_ID' })); +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform alreadyRegistered.ts: alreadyRegistered.ts 1`] = ` +"import { createApp } from 'vue'; +import { createCroct } from '@croct/plug-vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(createCroct({ appId: 'YOUR_APP_ID' })); +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform argsReference.ts: argsReference.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: import.meta.env.VITE_CROCT_APP_ID +})); + +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform argsTernary.ts: argsTernary.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: import.meta.env.MODE === "production" ? import.meta.env.VITE_CROCT_APP_ID_PROD : import.meta.env.VITE_CROCT_APP_ID_DEV +})); + +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform chainedAlreadyRegistered.ts: chainedAlreadyRegistered.ts 1`] = ` +"import { createApp } from 'vue'; +import { createCroct } from '@croct/plug-vue'; +import App from './App.vue'; + +createApp(App).use(createCroct({ appId: 'YOUR_APP_ID' })).mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform chainedMount.ts: chainedMount.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; + +createApp(App).use(createCroct({ + appId: "YOUR_APP_ID" +})).mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform chainedWithPlugins.ts: chainedWithPlugins.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import router from './router'; +import pinia from './pinia'; +import App from './App.vue'; + +createApp(App).use(createCroct({ + appId: "YOUR_APP_ID" +})).use(router).use(pinia).mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform chainedWithStoryblok.ts: chainedWithStoryblok.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +createApp(App).use(createCroct({ + appId: "YOUR_APP_ID" +})) + .use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], + }) + .mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform computedMountAccess.ts: computedMountAccess.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app['mount']('#app'); +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform createAppAsArgument.ts: createAppAsArgument.ts 1`] = ` +"import { createApp } from 'vue'; +import App from './App.vue'; + +console.log(createApp(App)); +" +`; + +exports[`VuePluginCodemod apply should correctly transform createAppFromOtherPackage.ts: createAppFromOtherPackage.ts 1`] = ` +"import { createApp } from 'other-package'; + +createApp({}).mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform createAppImportedButNotCalled.ts: createAppImportedButNotCalled.ts 1`] = ` +"import { createApp } from 'vue'; + +console.log(createApp); +" +`; + +exports[`VuePluginCodemod apply should correctly transform destructuredCreateApp.ts: destructuredCreateApp.ts 1`] = ` +"import { createApp } from 'vue'; +import App from './App.vue'; + +const { mount } = createApp(App); + +mount('#app'); + +" +`; + +exports[`VuePluginCodemod apply should correctly transform exportedCreateApp.ts: exportedCreateApp.ts 1`] = ` +"import { createApp } from 'vue'; +import App from './App.vue'; + +export const app = createApp(App); + +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform importedAliasedButNotUsed.ts: importedAliasedButNotUsed.ts 1`] = ` +"import { createApp } from 'vue'; +import { createCroct as plug } from '@croct/plug-vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(plug({ + appId: "YOUR_APP_ID" +})); + +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform importedButNotUsed.ts: importedButNotUsed.ts 1`] = ` +"import { createApp } from 'vue'; +import { createCroct } from '@croct/plug-vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform incompleteChain.ts: incompleteChain.ts 1`] = ` +"import { createApp } from 'vue'; +import App from './App.vue'; + +const mountFn = createApp(App).mount; +mountFn('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform intermediateNonUseStatement.ts: intermediateNonUseStatement.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +const flag = true; +app.use(router); +console.log(flag); +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform intermediateUnrelatedCalls.ts: intermediateUnrelatedCalls.ts 1`] = ` +"import { createApp } from 'vue'; +import { createCroct } from '@croct/plug-vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app['use'](router); +app.config.globalProperties.foo = 'bar'; +console.log('hi'); +app.mixin({}); +app.mount('#app'); + +" +`; + +exports[`VuePluginCodemod apply should correctly transform mountWithDocumentBody.ts: mountWithDocumentBody.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app.mount(document.body); +" +`; + +exports[`VuePluginCodemod apply should correctly transform multipleCreateAppCallsChainedFirst.ts: multipleCreateAppCallsChainedFirst.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +import Other from './Other.vue'; + +createApp(App).use(createCroct({ + appId: "YOUR_APP_ID" +})).mount('#app'); + +const second = createApp(Other); +second.mount('#second'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform multipleCreateAppCallsVariableFirst.ts: multipleCreateAppCallsVariableFirst.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +import Other from './Other.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app.mount('#app'); +createApp(Other).mount('#second'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform noArgs.ts: noArgs.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +const app = createApp(App); +app.use(createCroct()); +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform noCreateAppCall.ts: noCreateAppCall.ts 1`] = ` +"import { something } from 'somewhere'; + +something({ foo: 'bar' }); +" +`; + +exports[`VuePluginCodemod apply should correctly transform noMountCall.ts: noMountCall.ts 1`] = ` +"import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(router); +" +`; + +exports[`VuePluginCodemod apply should correctly transform typescriptInput.ts: typescriptInput.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp, App as VueApp } from 'vue'; +import App from './App.vue'; +const app: VueApp = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform variableForm.ts: variableForm.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform variableWithPlugins.ts: variableWithPlugins.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import router from './router'; +import pinia from './pinia'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app.use(router); +app.use(pinia); +app.mount('#app'); +" +`; + +exports[`VuePluginCodemod apply should correctly transform withStoryblokAppUse.ts: withStoryblokAppUse.ts 1`] = ` +"import { createCroct } from "@croct/plug-vue"; +import { createApp } from 'vue'; +import { StoryblokVue, apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(createCroct({ + appId: "YOUR_APP_ID" +})); + +app.use(StoryblokVue, { + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +}); + +app.mount('#app'); +" +`; diff --git a/test/application/project/code/transformation/javascript/__snapshots__/vueStoryblokCodemod.test.ts.snap b/test/application/project/code/transformation/javascript/__snapshots__/vueStoryblokCodemod.test.ts.snap new file mode 100644 index 00000000..bcd26cc6 --- /dev/null +++ b/test/application/project/code/transformation/javascript/__snapshots__/vueStoryblokCodemod.test.ts.snap @@ -0,0 +1,228 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`VueStoryblokCodemod should correctly transform storyblokAliasedImport.ts: storyblokAliasedImport.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); + +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokAlreadyMigrated.ts: storyblokAlreadyMigrated.ts 1`] = ` +"import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import { withCroct } from '@croct/plug-storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokBasicMigration.ts: storyblokBasicMigration.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); + +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokChainedAppUse.ts: storyblokChainedAppUse.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +createApp(App) + .use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], + })) + .mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokImportedButNoUseCall.ts: storyblokImportedButNoUseCall.ts 1`] = ` +"import { createApp } from 'vue'; +import { StoryblokVue } from '@storyblok/vue'; +import App from './App.vue'; + +console.log(StoryblokVue); + +const app = createApp(App); +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokMultipleAppUseCalls.ts: storyblokMultipleAppUseCalls.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import router from './router'; +import pinia from './pinia'; +import App from './App.vue'; +const app = createApp(App); +app.use(router); + +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); + +app.use(pinia); +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokNoCreateApp.ts: storyblokNoCreateApp.ts 1`] = ` +"import { StoryblokVue } from '@storyblok/vue'; + +const app = { use: () => app, mount: () => {} }; + +app.use(StoryblokVue, { accessToken: 'YOUR_ACCESS_TOKEN' }); +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokNoImport.ts: storyblokNoImport.ts 1`] = ` +"import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokOnlySpecifier.ts: storyblokOnlySpecifier.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', +})); +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokOptionsArePreserved.ts: storyblokOptionsArePreserved.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; +import MyComponent from './MyComponent.vue'; +const sharedOptions = { foo: 'bar' }; +const app = createApp(App); + +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], + components: { MyComponent }, + ...sharedOptions, +})); + +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokStringSpecifier.ts: storyblokStringSpecifier.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import { 'apiPlugin' as apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); + +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokWithCroctAliasedButNotUsed.ts: storyblokWithCroctAliasedButNotUsed.ts 1`] = ` +"import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import { withCroct as croctSb } from '@croct/plug-storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(croctSb({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokWithCroctImportedButNotUsed.ts: storyblokWithCroctImportedButNotUsed.ts 1`] = ` +"import { createApp } from 'vue'; +import { apiPlugin } from '@storyblok/vue'; +import { withCroct } from '@croct/plug-storyblok/vue'; +import App from './App.vue'; + +const app = createApp(App); +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); +app.mount('#app'); +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokWithDefaultSpecifier.ts: storyblokWithDefaultSpecifier.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import StoryblokDefault, { apiPlugin } from '@storyblok/vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); + +app.mount('#app'); +export { StoryblokDefault }; +" +`; + +exports[`VueStoryblokCodemod should correctly transform storyblokWithOtherSpecifiers.ts: storyblokWithOtherSpecifiers.ts 1`] = ` +"import { withCroct } from "@croct/plug-storyblok/vue"; +import { createApp } from 'vue'; +import { apiPlugin, useStoryblok } from '@storyblok/vue'; +import App from './App.vue'; +const app = createApp(App); + +app.use(withCroct({ + accessToken: 'YOUR_ACCESS_TOKEN', + use: [apiPlugin], +})); + +app.mount('#app'); +export { useStoryblok }; +" +`; diff --git a/test/application/project/code/transformation/javascript/nuxtConfigModuleCodemod.test.ts b/test/application/project/code/transformation/javascript/nuxtConfigModuleCodemod.test.ts new file mode 100644 index 00000000..3a1f63e2 --- /dev/null +++ b/test/application/project/code/transformation/javascript/nuxtConfigModuleCodemod.test.ts @@ -0,0 +1,30 @@ +import {resolve} from 'path'; +import type { + NuxtConfigModuleConfiguration, +} from '@/application/project/code/transformation/javascript/nuxtConfigModuleCodemod'; +import {NuxtConfigModuleCodemod} from '@/application/project/code/transformation/javascript/nuxtConfigModuleCodemod'; +import {JavaScriptCodemod} from '@/application/project/code/transformation/javascript/javaScriptCodemod'; +import {loadFixtures} from '../fixtures'; + +describe('NuxtConfigModuleCodemod', () => { + const defaultOptions: NuxtConfigModuleConfiguration = { + moduleName: '@croct/plug-nuxt', + }; + + const scenarios = loadFixtures( + resolve(__dirname, '../fixtures/nuxt-config-module'), + defaultOptions, + {}, + ); + + it.each(scenarios)('should correctly transform $name', async ({name, fixture, options}) => { + const transformer = new JavaScriptCodemod({ + languages: ['typescript'], + codemod: new NuxtConfigModuleCodemod(options), + }); + + const output = await transformer.apply(fixture); + + expect(output.result).toMatchSnapshot(name); + }); +}); diff --git a/test/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod.test.ts b/test/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod.test.ts new file mode 100644 index 00000000..20e68e05 --- /dev/null +++ b/test/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod.test.ts @@ -0,0 +1,37 @@ +import {resolve} from 'path'; +import type { + NuxtStoryblokPluginConfiguration, +} from '@/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod'; +import { + NuxtStoryblokPluginCodemod, +} from '@/application/project/code/transformation/javascript/nuxtStoryblokPluginCodemod'; +import {JavaScriptCodemod} from '@/application/project/code/transformation/javascript/javaScriptCodemod'; +import {loadFixtures} from '../fixtures'; + +describe('NuxtStoryblokPluginCodemod', () => { + const defaultOptions: NuxtStoryblokPluginConfiguration = { + plugin: { + module: '@croct/plug-storyblok/nuxt', + factory: 'withCroct', + }, + storyblokVueModule: '@storyblok/vue', + nuxtAppModule: '#app', + }; + + const scenarios = loadFixtures( + resolve(__dirname, '../fixtures/nuxt-storyblok-plugin'), + defaultOptions, + {}, + ); + + it.each(scenarios)('should correctly transform $name', async ({name, fixture, options}) => { + const transformer = new JavaScriptCodemod({ + languages: ['typescript'], + codemod: new NuxtStoryblokPluginCodemod(options), + }); + + const output = await transformer.apply(fixture); + + expect(output.result).toMatchSnapshot(name); + }); +}); diff --git a/test/application/project/code/transformation/javascript/utils/createObjectProps.test.ts b/test/application/project/code/transformation/javascript/utils/createObjectProps.test.ts new file mode 100644 index 00000000..3479bcf5 --- /dev/null +++ b/test/application/project/code/transformation/javascript/utils/createObjectProps.test.ts @@ -0,0 +1,201 @@ +import * as t from '@babel/types'; +import {generate} from '@babel/generator'; +import type {AttributeType} from '@/application/project/code/transformation/javascript/utils/createObjectProps'; +import { + buildPropertyExpression, + createPropsObject, +} from '@/application/project/code/transformation/javascript/utils/createObjectProps'; + +describe('createObjectProps', () => { + function print(node: t.Node): string { + return generate(node, {concise: true}).code; + } + + describe('buildPropertyExpression', () => { + it('should build a single-segment identifier reference', () => { + const expression = buildPropertyExpression({ + type: 'reference', + path: ['foo'], + }); + + expect(t.isIdentifier(expression)).toBe(true); + expect(print(expression)).toBe('foo'); + }); + + it('should build a two-segment member reference', () => { + const expression = buildPropertyExpression({ + type: 'reference', + path: ['foo', 'bar'], + }); + + expect(print(expression)).toBe('foo.bar'); + }); + + it('should build a deep member reference', () => { + const expression = buildPropertyExpression({ + type: 'reference', + path: ['process', 'env', 'NODE_ENV'], + }); + + expect(print(expression)).toBe('process.env.NODE_ENV'); + }); + + it('should build a string literal', () => { + const expression = buildPropertyExpression({ + type: 'literal', + value: 'hello', + }); + + expect(print(expression)).toBe('"hello"'); + }); + + it('should build a number literal', () => { + const expression = buildPropertyExpression({ + type: 'literal', + value: 42, + }); + + expect(print(expression)).toBe('42'); + }); + + it('should build a boolean literal', () => { + const expression = buildPropertyExpression({ + type: 'literal', + value: true, + }); + + expect(print(expression)).toBe('true'); + }); + + it('should build a null literal', () => { + const expression = buildPropertyExpression({ + type: 'literal', + value: null, + }); + + expect(print(expression)).toBe('null'); + }); + + it('should build a comparison expression', () => { + const expression = buildPropertyExpression({ + type: 'comparison', + operator: '===', + left: {type: 'reference', path: ['process', 'env', 'NODE_ENV']}, + right: {type: 'literal', value: 'production'}, + }); + + expect(print(expression)).toBe('process.env.NODE_ENV === "production"'); + }); + + type ComparisonScenario = { + description: string, + operator: Extract['operator'], + }; + + it.each([ + { + description: 'strict equality', + operator: '===', + }, + { + description: 'strict inequality', + operator: '!==', + }, + { + description: 'greater than', + operator: '>', + }, + { + description: 'greater than or equal', + operator: '>=', + }, + { + description: 'less than', + operator: '<', + }, + { + description: 'less than or equal', + operator: '<=', + }, + ])('should build a comparison expression with $description', ({operator}) => { + const expression = buildPropertyExpression({ + type: 'comparison', + operator: operator, + left: {type: 'literal', value: 1}, + right: {type: 'literal', value: 2}, + }); + + expect(print(expression)).toBe(`1 ${operator} 2`); + }); + + it('should build a ternary expression', () => { + const expression = buildPropertyExpression({ + type: 'ternary', + condition: { + operator: '===', + left: {type: 'reference', path: ['process', 'env', 'NODE_ENV']}, + right: {type: 'literal', value: 'production'}, + }, + consequent: {type: 'literal', value: 'prod'}, + alternate: {type: 'literal', value: 'dev'}, + }); + + expect(print(expression)).toBe('process.env.NODE_ENV === "production" ? "prod" : "dev"'); + }); + }); + + describe('createPropsObject', () => { + it('should build an empty object expression from no attributes', () => { + const expression = createPropsObject({}); + + expect(t.isObjectExpression(expression)).toBe(true); + expect(expression.properties).toHaveLength(0); + }); + + it('should build an object expression with a single property', () => { + const expression = createPropsObject({ + appId: {type: 'literal', value: 'abc'}, + }); + + expect(print(expression)).toBe('{ appId: "abc" }'); + }); + + it('should build an object expression with multiple properties', () => { + const expression = createPropsObject({ + appId: {type: 'literal', value: 'abc'}, + debug: {type: 'literal', value: true}, + count: {type: 'literal', value: 7}, + }); + + expect(print(expression)).toBe('{ appId: "abc", debug: true, count: 7 }'); + }); + + it('should build an object expression mixing all attribute types', () => { + const expression = createPropsObject({ + literal: {type: 'literal', value: 'l'}, + reference: {type: 'reference', path: ['process', 'env', 'X']}, + ternary: { + type: 'ternary', + condition: { + operator: '===', + left: {type: 'reference', path: ['mode']}, + right: {type: 'literal', value: 'prod'}, + }, + consequent: {type: 'literal', value: 'a'}, + alternate: {type: 'literal', value: 'b'}, + }, + comparison: { + type: 'comparison', + operator: '>', + left: {type: 'literal', value: 1}, + right: {type: 'literal', value: 0}, + }, + }); + + expect(print(expression)).toBe( + '{ literal: "l", reference: process.env.X, ' + + 'ternary: mode === "prod" ? "a" : "b", comparison: 1 > 0 }', + ); + }); + }); +}); diff --git a/test/application/project/code/transformation/javascript/vuePluginCodemod.test.ts b/test/application/project/code/transformation/javascript/vuePluginCodemod.test.ts new file mode 100644 index 00000000..f2285439 --- /dev/null +++ b/test/application/project/code/transformation/javascript/vuePluginCodemod.test.ts @@ -0,0 +1,213 @@ +import {resolve} from 'path'; +import {readFileSync} from 'fs'; +import type * as t from '@babel/types'; +import type {VuePluginConfiguration} from '@/application/project/code/transformation/javascript/vuePluginCodemod'; +import {VuePluginCodemod} from '@/application/project/code/transformation/javascript/vuePluginCodemod'; +import {JavaScriptCodemod} from '@/application/project/code/transformation/javascript/javaScriptCodemod'; +import {parse} from '@/application/project/code/transformation/javascript/utils/parse'; +import {loadFixtures} from '../fixtures'; + +describe('VuePluginCodemod', () => { + const fixturesPath = resolve(__dirname, '../fixtures/vue-plugin'); + + const defaultOptions: VuePluginConfiguration = { + plugin: { + module: '@croct/plug-vue', + factory: 'createCroct', + }, + args: { + appId: {type: 'literal', value: 'YOUR_APP_ID'}, + }, + }; + + function loadFixture(name: string): t.File { + return parse(readFileSync(resolve(fixturesPath, name), 'utf-8'), ['typescript']); + } + + it.each( + loadFixtures( + fixturesPath, + defaultOptions, + { + 'argsReference.ts': { + ...defaultOptions, + args: { + appId: { + type: 'reference', + path: ['import', 'meta', 'env', 'VITE_CROCT_APP_ID'], + }, + }, + }, + 'noArgs.ts': { + plugin: defaultOptions.plugin, + args: undefined, + }, + 'argsTernary.ts': { + ...defaultOptions, + args: { + appId: { + type: 'ternary', + condition: { + left: { + type: 'reference', + path: ['import', 'meta', 'env', 'MODE'], + }, + operator: '===', + right: {type: 'literal', value: 'production'}, + }, + consequent: { + type: 'reference', + path: ['import', 'meta', 'env', 'VITE_CROCT_APP_ID_PROD'], + }, + alternate: { + type: 'reference', + path: ['import', 'meta', 'env', 'VITE_CROCT_APP_ID_DEV'], + }, + }, + }, + }, + }, + ), + )('apply should correctly transform $name', async ({name, fixture, options}) => { + const transformer = new JavaScriptCodemod({ + languages: ['typescript'], + codemod: new VuePluginCodemod(options), + }); + + const output = await transformer.apply(fixture); + + expect(output.result).toMatchSnapshot(name); + }); + + it.each<{name: string, fixture: string, expected: object | null}>([ + { + name: 'a chained mount call', + fixture: 'chainedMount.ts', + expected: expect.objectContaining({kind: 'chain'}), + }, + { + name: 'a chained mount call with intermediate plugins', + fixture: 'chainedWithPlugins.ts', + expected: expect.objectContaining({kind: 'chain'}), + }, + { + name: 'a variable-form mount call', + fixture: 'variableForm.ts', + expected: expect.objectContaining({kind: 'variable', binding: 'app'}), + }, + { + name: 'a file without createApp import', + fixture: 'noCreateAppCall.ts', + expected: null, + }, + { + name: 'a file where createApp is imported but never called', + fixture: 'createAppImportedButNotCalled.ts', + expected: null, + }, + { + name: 'a file with createApp call but no .mount', + fixture: 'noMountCall.ts', + expected: null, + }, + { + name: 'multiple createApp calls (only the first is anchored)', + fixture: 'multipleCreateAppCallsChainedFirst.ts', + expected: expect.objectContaining({kind: 'chain'}), + }, + ])('findMountAnchor should resolve $name', ({fixture, expected}) => { + const ast = loadFixture(fixture); + + expect(VuePluginCodemod.findMountAnchor(ast)).toEqual(expected); + }); + + it.each<{name: string, fixture: string, factoryLocal: string, expected: boolean}>([ + { + name: 'a variable-form anchor with the factory already registered', + fixture: 'alreadyRegistered.ts', + factoryLocal: 'createCroct', + expected: true, + }, + { + name: 'a chained anchor with the factory already registered', + fixture: 'chainedAlreadyRegistered.ts', + factoryLocal: 'createCroct', + expected: true, + }, + { + name: 'a variable-form anchor where the factory is imported but never used', + fixture: 'importedButNotUsed.ts', + factoryLocal: 'createCroct', + expected: false, + }, + { + name: 'a variable-form anchor where the factory is aliased and used', + fixture: 'aliasedFactoryImportAndUsed.ts', + factoryLocal: 'plug', + expected: true, + }, + { + name: 'a chained anchor without any use call', + fixture: 'chainedMount.ts', + factoryLocal: 'createCroct', + expected: false, + }, + { + name: 'a chained anchor walking past unrelated use calls', + fixture: 'chainedWithPlugins.ts', + factoryLocal: 'createCroct', + expected: false, + }, + { + name: 'a variable-form anchor without the factory', + fixture: 'variableForm.ts', + factoryLocal: 'createCroct', + expected: false, + }, + { + name: 'a variable-form anchor walking past unrelated use calls', + fixture: 'intermediateNonUseStatement.ts', + factoryLocal: 'createCroct', + expected: false, + }, + ])('hasFactoryCall should report $name', ({fixture, factoryLocal, expected}) => { + const ast = loadFixture(fixture); + const anchor = VuePluginCodemod.findMountAnchor(ast); + const result = anchor !== null && VuePluginCodemod.hasFactoryCall(anchor, factoryLocal); + + expect(result).toBe(expected); + }); + + it.each<{name: string, fixture: string, identifier: string, expected: object | null}>([ + { + name: 'a variable-form .use(StoryblokVue, ...) call', + fixture: '../vue-storyblok/storyblokBasicMigration.ts', + identifier: 'StoryblokVue', + expected: expect.objectContaining({type: 'CallExpression'}), + }, + { + name: 'a chained .use(StoryblokVue, ...) call', + fixture: '../vue-storyblok/storyblokChainedAppUse.ts', + identifier: 'StoryblokVue', + expected: expect.objectContaining({type: 'CallExpression'}), + }, + { + name: 'a missing identifier in variable form', + fixture: 'variableWithPlugins.ts', + identifier: 'NotPresent', + expected: null, + }, + { + name: 'a missing identifier in chain form', + fixture: 'chainedWithPlugins.ts', + identifier: 'NotPresent', + expected: null, + }, + ])('findUseCall should locate $name', ({fixture, identifier, expected}) => { + const ast = loadFixture(fixture); + const anchor = VuePluginCodemod.findMountAnchor(ast); + const useCall = anchor === null ? null : VuePluginCodemod.findUseCall(anchor, identifier); + + expect(useCall).toEqual(expected); + }); +}); diff --git a/test/application/project/code/transformation/javascript/vueStoryblokCodemod.test.ts b/test/application/project/code/transformation/javascript/vueStoryblokCodemod.test.ts new file mode 100644 index 00000000..2e97491d --- /dev/null +++ b/test/application/project/code/transformation/javascript/vueStoryblokCodemod.test.ts @@ -0,0 +1,35 @@ +import {resolve} from 'path'; +import type {VueStoryblokConfiguration} from '@/application/project/code/transformation/javascript/vueStoryblokCodemod'; +import {VueStoryblokCodemod} from '@/application/project/code/transformation/javascript/vueStoryblokCodemod'; +import {JavaScriptCodemod} from '@/application/project/code/transformation/javascript/javaScriptCodemod'; +import {loadFixtures} from '../fixtures'; + +describe('VueStoryblokCodemod', () => { + const defaultOptions: VueStoryblokConfiguration = { + plugin: { + module: '@croct/plug-storyblok/vue', + factory: 'withCroct', + }, + storyblok: { + module: '@storyblok/vue', + identifier: 'StoryblokVue', + }, + }; + + const scenarios = loadFixtures( + resolve(__dirname, '../fixtures/vue-storyblok'), + defaultOptions, + {}, + ); + + it.each(scenarios)('should correctly transform $name', async ({name, fixture, options}) => { + const transformer = new JavaScriptCodemod({ + languages: ['typescript'], + codemod: new VueStoryblokCodemod(options), + }); + + const output = await transformer.apply(fixture); + + expect(output.result).toMatchSnapshot(name); + }); +});