From 434e988d14f31179255721243a0cbfa0b963405b Mon Sep 17 00:00:00 2001 From: "pragya.dave" Date: Mon, 1 Jun 2026 15:35:42 +0530 Subject: [PATCH 1/2] WIP: LWC engine POC --- package-lock.json | 3695 +++++++++++++---- packages/code-analyzer-lwc-engine/README.md | 14 + .../eslint.config.mjs | 16 + .../code-analyzer-lwc-engine/package.json | 69 + .../code-analyzer-lwc-engine/src/bundle.ts | 35 + .../code-analyzer-lwc-engine/src/compile.ts | 190 + .../code-analyzer-lwc-engine/src/engine.ts | 85 + .../code-analyzer-lwc-engine/src/index.ts | 8 + .../code-analyzer-lwc-engine/src/messages.ts | 16 + .../code-analyzer-lwc-engine/src/plugin.ts | 20 + .../code-analyzer-lwc-engine/src/rules.ts | 113 + .../code-analyzer-lwc-engine/src/severity.ts | 20 + .../code-analyzer-lwc-engine/src/translate.ts | 18 + .../test/bundle.test.ts | 32 + .../test/engine.test.ts | 83 + .../test/severity.test.ts | 18 + .../test/test-data/lwc/bad/bad.js | 7 + .../test/test-data/lwc/good/good.js | 2 + .../test/translate.test.ts | 39 + .../tsconfig.build.json | 17 + .../code-analyzer-lwc-engine/tsconfig.json | 11 + 21 files changed, 3793 insertions(+), 715 deletions(-) create mode 100644 packages/code-analyzer-lwc-engine/README.md create mode 100644 packages/code-analyzer-lwc-engine/eslint.config.mjs create mode 100644 packages/code-analyzer-lwc-engine/package.json create mode 100644 packages/code-analyzer-lwc-engine/src/bundle.ts create mode 100644 packages/code-analyzer-lwc-engine/src/compile.ts create mode 100644 packages/code-analyzer-lwc-engine/src/engine.ts create mode 100644 packages/code-analyzer-lwc-engine/src/index.ts create mode 100644 packages/code-analyzer-lwc-engine/src/messages.ts create mode 100644 packages/code-analyzer-lwc-engine/src/plugin.ts create mode 100644 packages/code-analyzer-lwc-engine/src/rules.ts create mode 100644 packages/code-analyzer-lwc-engine/src/severity.ts create mode 100644 packages/code-analyzer-lwc-engine/src/translate.ts create mode 100644 packages/code-analyzer-lwc-engine/test/bundle.test.ts create mode 100644 packages/code-analyzer-lwc-engine/test/engine.test.ts create mode 100644 packages/code-analyzer-lwc-engine/test/severity.test.ts create mode 100644 packages/code-analyzer-lwc-engine/test/test-data/lwc/bad/bad.js create mode 100644 packages/code-analyzer-lwc-engine/test/test-data/lwc/good/good.js create mode 100644 packages/code-analyzer-lwc-engine/test/translate.test.ts create mode 100644 packages/code-analyzer-lwc-engine/tsconfig.build.json create mode 100644 packages/code-analyzer-lwc-engine/tsconfig.json diff --git a/package-lock.json b/package-lock.json index 01cb8e60..a6028547 100644 --- a/package-lock.json +++ b/package-lock.json @@ -166,6 +166,36 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "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.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": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-globals": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", @@ -175,6 +205,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "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.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", @@ -189,14 +232,14 @@ } }, "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" @@ -205,6 +248,18 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "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.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", @@ -214,6 +269,53 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "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.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "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.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", @@ -241,6 +343,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helpers": { "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", @@ -316,6 +432,21 @@ "@babel/core": "^7.0.0-0" } }, + "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==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", "devOptional": true, @@ -462,12 +593,61 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { + "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.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { "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==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "license": "MIT", "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { @@ -477,6 +657,72 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz", @@ -542,6 +788,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "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.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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/preset-react": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz", @@ -562,6 +827,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", @@ -618,6 +902,7 @@ "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": { @@ -629,6 +914,7 @@ "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, "dependencies": { @@ -639,6 +925,7 @@ "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, "dependencies": { @@ -1507,6 +1794,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "license": "MIT" @@ -1679,487 +1976,1694 @@ "tslib": "2" } }, - "node_modules/@lwc/eslint-plugin-lwc": { - "version": "2.2.0", + "node_modules/@komaci/common-shared": { + "version": "262.22.0", + "resolved": "https://registry.npmjs.org/@komaci/common-shared/-/common-shared-262.22.0.tgz", + "integrity": "sha512-6dA9u6uDAqPv8bs2MKoU+mETlqHB+AwSauCoS+yN7TGDSWiU7eTIbZ22NRVMjxtrJnjoMqZ08bgVvDB2HzXhjw==", "license": "MIT", "dependencies": { - "fast-xml-parser": "^4.5.1", - "globals": "^13.24.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "@babel/eslint-parser": "^7", - "eslint": "^7 || ^8" + "@babel/core": "^7.9.0", + "@babel/generator": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0" } }, - "node_modules/@lwc/eslint-plugin-lwc-platform": { - "version": "5.2.0", + "node_modules/@komaci/esm-generator": { + "version": "264.5.0", + "resolved": "https://registry.npmjs.org/@komaci/esm-generator/-/esm-generator-264.5.0.tgz", + "integrity": "sha512-ZqNkTp5EbwyWL3zfHVae6gUlI5fG0sNB42xf7rwx5BJwPh4/eN7eH45mj2ylbK7P9d60uVbrMAqrE+d5C+w9og==", "license": "MIT", "dependencies": { - "minimatch": "~5.1.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@babel/eslint-parser": "^7", - "eslint": "^6 || ^7 || ^8" + "@babel/core": "^7.9.0", + "@babel/generator": "^7.9.0", + "@babel/types": "^7.9.0", + "@komaci/common-shared": "^262.14.0", + "@komaci/static-analyzer": "^262.14.0" } }, - "node_modules/@lwc/eslint-plugin-lwc-platform/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", + "node_modules/@komaci/esm-generator/node_modules/@babel/parser": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "license": "MIT", + "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@babel/types": "^7.26.10" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=10" + "node": ">=6.0.0" } }, - "node_modules/@lwc/eslint-plugin-lwc/node_modules/globals": { - "version": "13.24.0", + "node_modules/@komaci/esm-generator/node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "license": "MIT", + "peer": true, "dependencies": { - "type-fest": "^0.20.2" + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@lwc/eslint-plugin-lwc/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "node_modules/@komaci/esm-generator/node_modules/@babel/types": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@napi-rs/wasm-runtime": { - "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==", + "node_modules/@komaci/esm-generator/node_modules/@komaci/static-analyzer": { + "version": "262.22.0", + "resolved": "https://registry.npmjs.org/@komaci/static-analyzer/-/static-analyzer-262.22.0.tgz", + "integrity": "sha512-lCGs/o6b1euG/Fi8REU6FQnX4SNYRrm7Rr+35nXZ7wGgJuvq8/pD/FrO8wLdsONvJDMYwr50Mc57KzUvwAeLrw==", "license": "MIT", - "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" + "@babel/types": "^7.9.0", + "@komaci/common-shared": "^262.14.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" + "peerDependencies": { + "@lwc/metadata": "^12.0.0", + "@lwc/sfdc-compiler-utils": "^12.0.0" + } + }, + "node_modules/@komaci/esm-generator/node_modules/@lwc/metadata": { + "version": "12.3.4", + "resolved": "https://registry.npmjs.org/@lwc/metadata/-/metadata-12.3.4.tgz", + "integrity": "sha512-90+AW7d+txJYAoa5Be+FR5KtppzVOB4pT9bV1OJatZedz79b0JtP/NJGIxItLJHB8mKwb2bAyuzNibysoaM6AA==", + "license": "SEE LICENSE IN LICENSE.txt", + "peer": true, + "dependencies": { + "@babel/parser": "~7.26.2", + "@babel/traverse": "~7.25.9", + "@babel/types": "~7.26.0", + "@lwc/sfdc-compiler-utils": "12.3.4", + "postcss": "~8.4.49", + "postcss-selector-parser": "~6.1.2", + "postcss-value-parser": "~4.2.0" + }, + "engines": { + "node": ">=14" }, "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" + "@lwc/errors": ">=8", + "@lwc/template-compiler": ">=8" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", + "node_modules/@komaci/esm-generator/node_modules/@lwc/sfdc-compiler-utils": { + "version": "12.3.4", + "resolved": "https://registry.npmjs.org/@lwc/sfdc-compiler-utils/-/sfdc-compiler-utils-12.3.4.tgz", + "integrity": "sha512-AtP9XBzCnrGreJFunohDGD3ZkdT7VTCBs+EncCJPxD2Ej7pRKXX242d5A/TTfi8sp656FuZ6M/jleMNvIyXlKg==", + "license": "SEE LICENSE IN LICENSE.txt", + "peer": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@komaci/esm-generator/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "license": "MIT", - "dependencies": { - "eslint-scope": "5.1.1" + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/@nodable/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", + "node_modules/@komaci/esm-generator/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, { "type": "github", - "url": "https://github.com/sponsors/nodable" + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", "license": "MIT", + "peer": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 8" + "node": "^10 || ^12 || >=14" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@komaci/esm-generator/node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", "license": "MIT", + "peer": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@locker/babel-plugin-transform-unforgeables": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@locker/babel-plugin-transform-unforgeables/-/babel-plugin-transform-unforgeables-0.22.0.tgz", + "integrity": "sha512-CH4vMYMY/VJlYzb6l+Xy1nHdXogrNxHNXf1cCPSJB1kBXJgkuw7E0X/IEyfCTuFh06ciI31s4qqyEeXqxPWBTg==", "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "@babel/generator": "7.22.10", + "match-json": "1.3.7" } }, - "node_modules/@pinojs/redact": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@locker/babel-plugin-transform-unforgeables/node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "license": "MIT", - "optional": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "devOptional": true, + "node_modules/@locker/babel-plugin-transform-unforgeables/node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "bin": { + "jsesc": "bin/jsesc" }, - "funding": { - "url": "https://opencollective.com/pkgr" + "engines": { + "node": ">=4" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/@salesforce-ux/eslint-plugin-slds": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@salesforce-ux/eslint-plugin-slds/-/eslint-plugin-slds-1.2.1.tgz", - "integrity": "sha512-DeByr0oCNnKKnDKOhHt2kzeOGgN7lf/WnD43y20YFMhN2kWZ/aDHMG2fRwWSuG4iBBjHXIGFb9SdJoN8+murOg==", - "license": "ISC", + "node_modules/@lwc/babel-plugin-component": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/babel-plugin-component/-/babel-plugin-component-9.2.1.tgz", + "integrity": "sha512-o4EuXgfo2OuhXxeqfEhZyLxT6EPlA8ISkIY4x3Gd29Fl+zfKZqCzlD9fZ35U8azEGJ/6lh3n5Y6BlGbKi/c/fQ==", + "license": "MIT", "dependencies": { - "@eslint/css": "^0.9.0", - "@eslint/css-tree": "^3.6.5", - "@html-eslint/eslint-plugin": "^0.34.0", - "@html-eslint/parser": "^0.34.0", - "@salesforce-ux/sds-metadata": "^1.2.1", - "chroma-js": "^3.1.2" + "@babel/helper-module-imports": "7.28.6", + "@lwc/errors": "9.2.1", + "@lwc/shared": "9.2.1", + "line-column": "~1.0.2" }, "engines": { - "node": ">=18.18.0" + "node": ">=16.6.0" }, "peerDependencies": { - "eslint": "^8.0.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": false - } + "@babel/core": "^7" } }, - "node_modules/@salesforce-ux/sds-metadata": { - "version": "1.2.1", - "license": "ISC", + "node_modules/@lwc/babel-plugin-component/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==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" } }, - "node_modules/@salesforce/code-analyzer-apexguru-engine": { - "resolved": "packages/code-analyzer-apexguru-engine", - "link": true - }, - "node_modules/@salesforce/code-analyzer-core": { - "resolved": "packages/code-analyzer-core", - "link": true - }, - "node_modules/@salesforce/code-analyzer-engine-api": { - "resolved": "packages/code-analyzer-engine-api", - "link": true - }, - "node_modules/@salesforce/code-analyzer-eslint-engine": { - "resolved": "packages/code-analyzer-eslint-engine", - "link": true - }, - "node_modules/@salesforce/code-analyzer-eslint8-engine": { - "resolved": "packages/code-analyzer-eslint8-engine", - "link": true - }, - "node_modules/@salesforce/code-analyzer-flow-engine": { - "resolved": "packages/code-analyzer-flow-engine", - "link": true - }, - "node_modules/@salesforce/code-analyzer-pmd-engine": { - "resolved": "packages/code-analyzer-pmd-engine", - "link": true - }, - "node_modules/@salesforce/code-analyzer-regex-engine": { - "resolved": "packages/code-analyzer-regex-engine", - "link": true - }, - "node_modules/@salesforce/code-analyzer-retirejs-engine": { - "resolved": "packages/code-analyzer-retirejs-engine", - "link": true - }, - "node_modules/@salesforce/code-analyzer-sfge-engine": { - "resolved": "packages/code-analyzer-sfge-engine", - "link": true + "node_modules/@lwc/babel-plugin-component/node_modules/@lwc/shared": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/shared/-/shared-9.2.1.tgz", + "integrity": "sha512-IdCbGTUo7SzehrR16RWsF4q2LbYjfSCuvjcejptoHWXsFDGxZbSG/Fh1oXC9D5xhszD2ToFXxlPy5EbyOr8vtQ==", + "license": "MIT", + "engines": { + "node": ">=16.6.0" + } }, - "node_modules/@salesforce/core": { - "version": "8.31.2", - "resolved": "https://registry.npmjs.org/@salesforce/core/-/core-8.31.2.tgz", - "integrity": "sha512-naqnq7Z+gbl1LdnyNvrGrNUoeMUQtCOsnrS6DfqeuLMJTFqcL9Dq0/od+xcuqi0+l7HTyH0/gU1BQitWpd1rag==", - "license": "BSD-3-Clause", + "node_modules/@lwc/compiler": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/compiler/-/compiler-9.2.1.tgz", + "integrity": "sha512-BeSeTrz2mcQc6pW3KBLLp4CCEGvXVgh7pj3ylib4zozvULJL7jz1KpezrygmC48Vm/0W5teZdGA20LBZ/IPXFw==", + "license": "MIT", "dependencies": { - "@jsforce/jsforce-node": "^3.10.13", - "@salesforce/kit": "^3.2.4", - "@salesforce/ts-types": "^2.0.12", - "ajv": "^8.18.0", - "change-case": "^4.1.2", - "fast-levenshtein": "^3.0.0", - "faye": "^1.4.1", - "form-data": "^4.0.5", - "js2xmlparser": "^4.0.1", - "jsonwebtoken": "9.0.3", - "jszip": "3.10.1", - "memfs": "4.38.1", - "pino": "^9.7.0", - "pino-abstract-transport": "^1.2.0", - "pino-pretty": "^11.3.0", - "proper-lockfile": "^4.1.2", - "semver": "^7.8.0", - "ts-retry-promise": "^0.8.1", - "zod": "^4.1.12" + "@babel/core": "7.29.0", + "@babel/plugin-transform-async-generator-functions": "7.29.0", + "@babel/plugin-transform-async-to-generator": "7.28.6", + "@babel/plugin-transform-class-properties": "7.28.6", + "@babel/plugin-transform-object-rest-spread": "7.28.6", + "@locker/babel-plugin-transform-unforgeables": "0.22.0", + "@lwc/babel-plugin-component": "9.2.1", + "@lwc/errors": "9.2.1", + "@lwc/shared": "9.2.1", + "@lwc/ssr-compiler": "9.2.1", + "@lwc/style-compiler": "9.2.1", + "@lwc/template-compiler": "9.2.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.6.0" } }, - "node_modules/@salesforce/core/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "node_modules/@lwc/compiler/node_modules/@lwc/shared": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/shared/-/shared-9.2.1.tgz", + "integrity": "sha512-IdCbGTUo7SzehrR16RWsF4q2LbYjfSCuvjcejptoHWXsFDGxZbSG/Fh1oXC9D5xhszD2ToFXxlPy5EbyOr8vtQ==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=16.6.0" } }, - "node_modules/@salesforce/core/node_modules/fast-levenshtein": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", - "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "node_modules/@lwc/compiler/node_modules/@lwc/template-compiler": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/template-compiler/-/template-compiler-9.2.1.tgz", + "integrity": "sha512-JeWT72QPkNRSeyfbHG8UiHOmtdrcJW6biBygTRlE1aMu+uESxP9F69nfpRlC1ZbD0mBWBOxxwDShINfVzJ4KFw==", "license": "MIT", "dependencies": { - "fastest-levenshtein": "^1.0.7" + "@lwc/errors": "9.2.1", + "@lwc/shared": "9.2.1", + "acorn": "~8.16.0", + "astring": "~1.9.0", + "he": "~1.2.0" + }, + "engines": { + "node": ">=16.6.0" } }, - "node_modules/@salesforce/core/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "node_modules/@lwc/dev-server-plugin-lex": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@lwc/dev-server-plugin-lex/-/dev-server-plugin-lex-15.0.5.tgz", + "integrity": "sha512-Ocg7GOTFVli6JjcGuqlcoCHsMqxUT21TOw8mdSkx80yAzDWk4PK0+ATFTjY9gmvimlU6Sd3OKkRZR/XTe9WouA==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "magic-string": "~0.30.21" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@lwc/compiler": ">=9", + "@lwc/errors": ">=9" + } }, - "node_modules/@salesforce/core/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "node_modules/@lwc/errors": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/errors/-/errors-9.2.1.tgz", + "integrity": "sha512-BBHoPbZZ0i6haGlthQDEkHO27BNJmy473gFUZhuFhfl6C4P7W+RZxxdioFal4N3sBG9Pl6jjRMijHY1I4mqlAQ==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "engines": { + "node": ">=16.6.0" } }, - "node_modules/@salesforce/engine-template": { - "resolved": "packages/ENGINE-TEMPLATE", - "link": true - }, - "node_modules/@salesforce/eslint-plugin-lightning": { - "version": "1.0.1", + "node_modules/@lwc/eslint-plugin-lwc": { + "version": "2.2.0", "license": "MIT", + "dependencies": { + "fast-xml-parser": "^4.5.1", + "globals": "^13.24.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=10.0.0" + }, "peerDependencies": { + "@babel/eslint-parser": "^7", "eslint": "^7 || ^8" } }, - "node_modules/@salesforce/kit": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@salesforce/kit/-/kit-3.2.6.tgz", - "integrity": "sha512-O8S4LWerHa9Zosqh+IoQjgLtpxMOfObRxaRnUdRV4MLtFUi+bQxQiyFvve6eEaBaMP1b1xVDQpvSvQ+PXEDGFQ==", - "license": "Apache-2.0", + "node_modules/@lwc/eslint-plugin-lwc-platform": { + "version": "5.2.0", + "license": "MIT", "dependencies": { - "@salesforce/ts-types": "^2.0.12" + "minimatch": "~5.1.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@babel/eslint-parser": "^7", + "eslint": "^6 || ^7 || ^8" } }, - "node_modules/@salesforce/ts-types": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@salesforce/ts-types/-/ts-types-2.0.12.tgz", - "integrity": "sha512-BIJyduJC18Kc8z+arUm5AZ9VkPRyw1KKAm+Tk+9LT99eOzhNilyfKzhZ4t+tG2lIGgnJpmytZfVDZ0e2kFul8g==", - "license": "BSD-3-Clause", + "node_modules/@lwc/eslint-plugin-lwc-platform/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=18.0.0" + "node": ">=10" } }, - "node_modules/@sinclair/typebox": { - "version": "0.34.49", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", - "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", - "devOptional": 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==", + "node_modules/@lwc/eslint-plugin-lwc/node_modules/globals": { + "version": "13.24.0", "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lwc/eslint-plugin-lwc/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "devOptional": true, - "license": "BSD-3-Clause", + "node_modules/@lwc/metadata": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@lwc/metadata/-/metadata-15.0.5.tgz", + "integrity": "sha512-HO8ymdwVbKh6xNXUUD0YLcc2gGysbOYqA/bc7pamD+lYKwe5KM7zO4zYiZzUd9QsnGd24wbkSmQoDqWsxUY2zw==", + "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "type-detect": "4.0.8" + "@babel/parser": "~7.29.0", + "@babel/traverse": "~7.29.0", + "@babel/types": "~7.29.0", + "@lwc/sfdc-compiler-utils": "15.0.5", + "postcss": "~8.5.6", + "postcss-selector-parser": "~7.1.1", + "postcss-value-parser": "~4.2.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@lwc/errors": ">=9", + "@lwc/template-compiler": ">=9" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "15.4.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", - "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", - "devOptional": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" + "node_modules/@lwc/sfdc-compiler-utils": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@lwc/sfdc-compiler-utils/-/sfdc-compiler-utils-15.0.5.tgz", + "integrity": "sha512-uSShL3HF4fUi8NNj/1X2bOGHxuCGcNTx/j3yiPgpbm6j0S45YjN4HpaEp0C2zDzd7Tfv28Z4omGasGdKnEaW0w==", + "license": "SEE LICENSE IN LICENSE.txt", + "engines": { + "node": ">=20" } }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "license": "MIT" + "node_modules/@lwc/sfdc-lwc-compiler": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@lwc/sfdc-lwc-compiler/-/sfdc-lwc-compiler-15.0.5.tgz", + "integrity": "sha512-gsFqgmsmjK5d0bWtl/wzXmEzayPQmqCkcgQmJZ8B8IT47GCrlJRPFLSR3XibBLM6tZLYxKrwYCXBxj/SVbH1lg==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@babel/core": "7.29.0", + "@babel/parser": "7.29.0", + "@babel/plugin-syntax-decorators": "7.28.6", + "@babel/preset-typescript": "7.28.5", + "@babel/traverse": "7.29.0", + "@babel/types": "7.29.0", + "@komaci/esm-generator": "264.5.0", + "@lwc/dev-server-plugin-lex": "15.0.5", + "@lwc/eslint-plugin-lwc": "3.5.0", + "@lwc/eslint-plugin-lwc-platform": "6.3.0", + "@lwc/metadata": "15.0.5", + "@lwc/sfdc-compiler-utils": "15.0.5", + "@rollup/plugin-babel": "^6.1.0", + "@rollup/plugin-replace": "^6.0.3", + "@rollup/wasm-node": "4.52.5", + "@salesforce/eslint-config-lwc": "4.1.2", + "@salesforce/eslint-plugin-lightning": "2.0.0", + "@swc/wasm": "1.15.21", + "astring": "~1.9.0", + "doctrine": "~3.0.0", + "eslint": "~9.39.3", + "eslint-plugin-import": "~2.32.0", + "gray-matter": "~4.0.3", + "line-column": "~1.0.2", + "magic-string": "~0.30.21", + "markdown-it": "~14.1.1", + "meriyah": "^7.1.0", + "parse5-sax-parser": "~8.0.0", + "postcss": "~8.5.6", + "postcss-selector-parser": "~7.1.1", + "terser": "~5.46.0", + "typescript": "5.9.3" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@lwc/compiler": ">=9", + "@lwc/errors": ">=9", + "@lwc/shared": ">=9", + "@lwc/template-compiler": ">=9" + } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/archiver": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.4.tgz", - "integrity": "sha512-ULdQpARQ3sz9WH4nb98mJDYA0ft2A8C4f4fovvUcFwINa1cgGjY36JCAYuP5YypRq4mco1lJp1/7jEMS2oR0Hg==", - "dev": true, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { - "@types/readdir-glob": "*" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "devOptional": true, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "devOptional": true, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@eslint/eslintrc": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "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.3.0", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "devOptional": true, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "devOptional": true, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/eslint": { - "version": "8.56.12", - "dev": true, - "license": "MIT", + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "devOptional": true, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "devOptional": true, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@lwc/eslint-plugin-lwc": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@lwc/eslint-plugin-lwc/-/eslint-plugin-lwc-3.5.0.tgz", + "integrity": "sha512-Xq4i0ZWhBp1ZbGXqv8KEUqAOzo07BCD3yFD/EdOPafMjpXkeH5RpCFn09+sXVe1vdqtm47JwX+OUDXOMWfIsQg==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "fast-xml-parser": "^5.3.6", + "globals": "~15.14.0", + "minimatch": "~9.0.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@babel/eslint-parser": "^7", + "eslint": "^9" } }, - "node_modules/@types/jest": { - "version": "30.0.0", - "dev": true, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@lwc/eslint-plugin-lwc-platform": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@lwc/eslint-plugin-lwc-platform/-/eslint-plugin-lwc-platform-6.3.0.tgz", + "integrity": "sha512-wlLiHeYureubt/JDhPllXbQcjJu58NMpiSkZMF6KRCBtZzHs4m6cxwpXJ1iy6d638/66O1B79FL3ZTC7v1hDxg==", "license": "MIT", "dependencies": { - "expect": "^30.0.0", + "minimatch": "~5.1.1" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@babel/eslint-parser": "^7", + "eslint": "^9" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@lwc/eslint-plugin-lwc-platform/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@nodable/entities": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz", + "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@salesforce/eslint-config-lwc": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@salesforce/eslint-config-lwc/-/eslint-config-lwc-4.1.2.tgz", + "integrity": "sha512-GMoXOiqdSLYYuup8i6HWJYIScTGyOdgJCXXNzWb76Xa0RehqViigVAroTYB5OKvp4F5T7OLnGq06dARduphauQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "~7.26.0", + "@babel/eslint-parser": "~7.25.9", + "@eslint/js": "^9.17.0", + "eslint-restricted-globals": "~0.2.0", + "globals": "~15.14.0", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@lwc/eslint-plugin-lwc": "^3.0.0 || ^3.0.0-0", + "@salesforce/eslint-plugin-lightning": "^2.0.0 || ^2.0.0-0", + "eslint": "^9", + "eslint-plugin-import": "*", + "eslint-plugin-jest": "*" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/eslint-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz", + "integrity": "sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/@salesforce/eslint-plugin-lightning": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@salesforce/eslint-plugin-lightning/-/eslint-plugin-lightning-2.0.0.tgz", + "integrity": "sha512-lC3GL2j6B2wAGeTFWT0h47BFg+0R7naqqlQW+ANvNSaIC/qEB+tNSRcdAZ8DRTojsI3GRdpgq3FTB1llbrFBng==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "eslint": "^9" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@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.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/fast-xml-parser": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.0.tgz", + "integrity": "sha512-9IGxMqvqLOnqP+Egi1nqDHKv5k8aZ7r9n558enxcucmyVGEBNPAU+MOg/8jPIS7rO7sSq4gFm1/nHtiaubMruw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^3.0.0", + "fast-xml-builder": "^1.2.0", + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.2", + "xml-naming": "^0.3.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/is-unsafe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.0.tgz", + "integrity": "sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/meriyah": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-7.3.2.tgz", + "integrity": "sha512-uFPXbsoxaEd7PafMz3K/n/Z3kXz7iZBJtYU0VQB/kcV7i33+JghLTKweabLir480FUsyLz6gUIj4LW7kCQ35TA==", + "license": "ISC", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/strnum": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.2.tgz", + "integrity": "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "anynum": "^1.0.1" + } + }, + "node_modules/@lwc/sfdc-lwc-compiler/node_modules/xml-naming": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lwc/shared": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@lwc/shared/-/shared-9.4.1.tgz", + "integrity": "sha512-su3Xnqc4YoOpAE9l7u18fz8ap9VKPyTVgTmixHzefeHgHJI4m+r7XhyEX0Qiox97kkELpOuSf8AfOvlNR8sqEw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@lwc/ssr-compiler": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/ssr-compiler/-/ssr-compiler-9.2.1.tgz", + "integrity": "sha512-0SwvmmUaV4Z5NqwOUQE0KlzhFtTbLKKEXN3UPZQECi7R8U06JSJBeFU2kT7rmBmfrdagu6cFkdDMFVgRiHjW2w==", + "license": "MIT", + "dependencies": { + "@babel/types": "7.29.0", + "@lwc/errors": "9.2.1", + "@lwc/shared": "9.2.1", + "@lwc/template-compiler": "9.2.1", + "acorn": "8.16.0", + "astring": "^1.9.0", + "estree-toolkit": "^1.7.13", + "immer": "^11.1.4", + "meriyah": "^7.1.0" + }, + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@lwc/ssr-compiler/node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@lwc/ssr-compiler/node_modules/@lwc/shared": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/shared/-/shared-9.2.1.tgz", + "integrity": "sha512-IdCbGTUo7SzehrR16RWsF4q2LbYjfSCuvjcejptoHWXsFDGxZbSG/Fh1oXC9D5xhszD2ToFXxlPy5EbyOr8vtQ==", + "license": "MIT", + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@lwc/ssr-compiler/node_modules/@lwc/template-compiler": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/template-compiler/-/template-compiler-9.2.1.tgz", + "integrity": "sha512-JeWT72QPkNRSeyfbHG8UiHOmtdrcJW6biBygTRlE1aMu+uESxP9F69nfpRlC1ZbD0mBWBOxxwDShINfVzJ4KFw==", + "license": "MIT", + "dependencies": { + "@lwc/errors": "9.2.1", + "@lwc/shared": "9.2.1", + "acorn": "~8.16.0", + "astring": "~1.9.0", + "he": "~1.2.0" + }, + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@lwc/ssr-compiler/node_modules/meriyah": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-7.3.2.tgz", + "integrity": "sha512-uFPXbsoxaEd7PafMz3K/n/Z3kXz7iZBJtYU0VQB/kcV7i33+JghLTKweabLir480FUsyLz6gUIj4LW7kCQ35TA==", + "license": "ISC", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@lwc/style-compiler": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/style-compiler/-/style-compiler-9.2.1.tgz", + "integrity": "sha512-IQz3tChWutIUKUo6VDO902L7S9VrnTIwHId1VrX5pND/KaB+LhkQi1oih0LGwYcczVZBTq/AX68XAQclv1Lulg==", + "license": "MIT", + "dependencies": { + "@lwc/shared": "9.2.1", + "postcss": "~8.5.10", + "postcss-selector-parser": "~7.1.1", + "postcss-value-parser": "~4.2.0" + }, + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@lwc/style-compiler/node_modules/@lwc/shared": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@lwc/shared/-/shared-9.2.1.tgz", + "integrity": "sha512-IdCbGTUo7SzehrR16RWsF4q2LbYjfSCuvjcejptoHWXsFDGxZbSG/Fh1oXC9D5xhszD2ToFXxlPy5EbyOr8vtQ==", + "license": "MIT", + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@lwc/template-compiler": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@lwc/template-compiler/-/template-compiler-9.4.1.tgz", + "integrity": "sha512-OYGWSHBsks4O7oiJgpftaWB9Q1Thq9KlDoFwEy6DHD9tqx2zetRqiaAK52Cyd4Nd+xUILgqnoe7NiRCu5LB0WQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@lwc/errors": "9.4.1", + "@lwc/shared": "9.4.1", + "acorn": "~8.18.0", + "astring": "~1.9.0", + "he": "~1.2.0" + }, + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@lwc/template-compiler/node_modules/@lwc/errors": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@lwc/errors/-/errors-9.4.1.tgz", + "integrity": "sha512-a34ZRVSL82LNmfP6rbvzXIZYnxe4bFYjgwBGTOprSrpSEyP38vdbie04dYX8OtrCbCHdACvBbQs8g70hT4MZlw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.6.0" + } + }, + "node_modules/@lwc/template-compiler/node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "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": { + "@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/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodable/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz", + "integrity": "sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz", + "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/wasm-node": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.52.5.tgz", + "integrity": "sha512-ldY4tEzSMBHNwB8TfRpi7RRRjjyfKlwjdebw5pS1lu0xaY3g4RDc6ople2wEYulVOKVeH7ZJwRx0iw4pGtjMHg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/@salesforce-ux/eslint-plugin-slds": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@salesforce-ux/eslint-plugin-slds/-/eslint-plugin-slds-1.2.1.tgz", + "integrity": "sha512-DeByr0oCNnKKnDKOhHt2kzeOGgN7lf/WnD43y20YFMhN2kWZ/aDHMG2fRwWSuG4iBBjHXIGFb9SdJoN8+murOg==", + "license": "ISC", + "dependencies": { + "@eslint/css": "^0.9.0", + "@eslint/css-tree": "^3.6.5", + "@html-eslint/eslint-plugin": "^0.34.0", + "@html-eslint/parser": "^0.34.0", + "@salesforce-ux/sds-metadata": "^1.2.1", + "chroma-js": "^3.1.2" + }, + "engines": { + "node": ">=18.18.0" + }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": false + } + } + }, + "node_modules/@salesforce-ux/sds-metadata": { + "version": "1.2.1", + "license": "ISC", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@salesforce/code-analyzer-apexguru-engine": { + "resolved": "packages/code-analyzer-apexguru-engine", + "link": true + }, + "node_modules/@salesforce/code-analyzer-core": { + "resolved": "packages/code-analyzer-core", + "link": true + }, + "node_modules/@salesforce/code-analyzer-engine-api": { + "resolved": "packages/code-analyzer-engine-api", + "link": true + }, + "node_modules/@salesforce/code-analyzer-eslint-engine": { + "resolved": "packages/code-analyzer-eslint-engine", + "link": true + }, + "node_modules/@salesforce/code-analyzer-eslint8-engine": { + "resolved": "packages/code-analyzer-eslint8-engine", + "link": true + }, + "node_modules/@salesforce/code-analyzer-flow-engine": { + "resolved": "packages/code-analyzer-flow-engine", + "link": true + }, + "node_modules/@salesforce/code-analyzer-lwc-engine": { + "resolved": "packages/code-analyzer-lwc-engine", + "link": true + }, + "node_modules/@salesforce/code-analyzer-pmd-engine": { + "resolved": "packages/code-analyzer-pmd-engine", + "link": true + }, + "node_modules/@salesforce/code-analyzer-regex-engine": { + "resolved": "packages/code-analyzer-regex-engine", + "link": true + }, + "node_modules/@salesforce/code-analyzer-retirejs-engine": { + "resolved": "packages/code-analyzer-retirejs-engine", + "link": true + }, + "node_modules/@salesforce/code-analyzer-sfge-engine": { + "resolved": "packages/code-analyzer-sfge-engine", + "link": true + }, + "node_modules/@salesforce/core": { + "version": "8.31.2", + "resolved": "https://registry.npmjs.org/@salesforce/core/-/core-8.31.2.tgz", + "integrity": "sha512-naqnq7Z+gbl1LdnyNvrGrNUoeMUQtCOsnrS6DfqeuLMJTFqcL9Dq0/od+xcuqi0+l7HTyH0/gU1BQitWpd1rag==", + "license": "BSD-3-Clause", + "dependencies": { + "@jsforce/jsforce-node": "^3.10.13", + "@salesforce/kit": "^3.2.4", + "@salesforce/ts-types": "^2.0.12", + "ajv": "^8.18.0", + "change-case": "^4.1.2", + "fast-levenshtein": "^3.0.0", + "faye": "^1.4.1", + "form-data": "^4.0.5", + "js2xmlparser": "^4.0.1", + "jsonwebtoken": "9.0.3", + "jszip": "3.10.1", + "memfs": "4.38.1", + "pino": "^9.7.0", + "pino-abstract-transport": "^1.2.0", + "pino-pretty": "^11.3.0", + "proper-lockfile": "^4.1.2", + "semver": "^7.8.0", + "ts-retry-promise": "^0.8.1", + "zod": "^4.1.12" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@salesforce/core/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@salesforce/core/node_modules/fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/@salesforce/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@salesforce/core/node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@salesforce/engine-template": { + "resolved": "packages/ENGINE-TEMPLATE", + "link": true + }, + "node_modules/@salesforce/eslint-plugin-lightning": { + "version": "1.0.1", + "license": "MIT", + "peerDependencies": { + "eslint": "^7 || ^8" + } + }, + "node_modules/@salesforce/kit": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@salesforce/kit/-/kit-3.2.6.tgz", + "integrity": "sha512-O8S4LWerHa9Zosqh+IoQjgLtpxMOfObRxaRnUdRV4MLtFUi+bQxQiyFvve6eEaBaMP1b1xVDQpvSvQ+PXEDGFQ==", + "license": "Apache-2.0", + "dependencies": { + "@salesforce/ts-types": "^2.0.12" + } + }, + "node_modules/@salesforce/ts-types": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@salesforce/ts-types/-/ts-types-2.0.12.tgz", + "integrity": "sha512-BIJyduJC18Kc8z+arUm5AZ9VkPRyw1KKAm+Tk+9LT99eOzhNilyfKzhZ4t+tG2lIGgnJpmytZfVDZ0e2kFul8g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "devOptional": 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", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz", + "integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@swc/wasm": { + "version": "1.15.21", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.15.21.tgz", + "integrity": "sha512-AVomFdpE9LiB8Q0dNo1UqpqGut//Q7HJNyyCzyHsywHSUM/1pKfzywIjdha4WipgjyOPebYb93pTDBUn2iWvVA==", + "license": "Apache-2.0" + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "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, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/archiver": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.4.tgz", + "integrity": "sha512-ULdQpARQ3sz9WH4nb98mJDYA0ft2A8C4f4fovvUcFwINa1cgGjY36JCAYuP5YypRq4mco1lJp1/7jEMS2oR0Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/readdir-glob": "*" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", "pretty-format": "^30.0.0" } }, @@ -2499,6 +4003,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2512,6 +4017,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2525,6 +4031,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2538,6 +4045,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2551,6 +4059,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2564,6 +4073,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2577,6 +4087,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2590,6 +4101,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2603,6 +4115,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2616,6 +4129,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2629,6 +4143,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2642,6 +4157,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2655,6 +4171,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2668,6 +4185,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2681,6 +4199,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2694,6 +4213,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2707,6 +4227,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2720,6 +4241,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2733,6 +4255,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -2751,6 +4274,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2764,6 +4288,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2777,6 +4302,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2796,7 +4322,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3195,6 +4723,15 @@ "version": "0.0.8", "license": "MIT" }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, "node_modules/astronomical": { "version": "3.0.0", "license": "Apache-2.0", @@ -3623,7 +5160,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "devOptional": true, "license": "MIT" }, "node_modules/call-bind": { @@ -4096,6 +5632,18 @@ "node": ">=0.6.0" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csv-parse": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz", @@ -4363,6 +5911,18 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -5097,6 +6657,22 @@ "node": ">=4.0" } }, + "node_modules/estree-toolkit": { + "version": "1.7.14", + "resolved": "https://registry.npmjs.org/estree-toolkit/-/estree-toolkit-1.7.14.tgz", + "integrity": "sha512-UD46XPj9xCQ+5r+JRv1qdaJuWLbQaconfnFHWOc20ugbHzZSOO6/A+vye46arVxbOSr/KnzRzKfnp9SJ0IqaUw==", + "license": "MIT", + "dependencies": { + "@types/estree": ">=1.0.8", + "@types/estree-jsx": ">=1.0.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "license": "BSD-2-Clause", @@ -5190,6 +6766,18 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-copy": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", @@ -5755,6 +7343,43 @@ "version": "1.4.0", "license": "MIT" }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/handlebars": { "version": "4.7.9", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", @@ -5852,6 +7477,15 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -5980,6 +7614,16 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, + "node_modules/immer": { + "version": "11.1.18", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.18.tgz", + "integrity": "sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "license": "MIT", @@ -6170,6 +7814,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "license": "MIT", @@ -6446,6 +8099,24 @@ "version": "2.0.0", "license": "ISC" }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isobject/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "devOptional": true, @@ -7331,6 +9002,15 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "license": "CC0-1.0" @@ -7387,6 +9067,22 @@ "immediate": "~3.0.5" } }, + "node_modules/line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==", + "license": "MIT", + "dependencies": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + } + }, + "node_modules/line-column/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -7394,6 +9090,25 @@ "devOptional": true, "license": "MIT" }, + "node_modules/linkify-it": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "license": "MIT", @@ -7490,6 +9205,15 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -7519,6 +9243,29 @@ "tmpl": "1.0.5" } }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/match-json": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/match-json/-/match-json-1.3.7.tgz", + "integrity": "sha512-2/GIaio/oVWVHGdKOIbqfgqT5vH91K3c91l6EAsVydMAjB0iGy5PVABicKzNT1VAgHskZHbaZK9q96AmgTEqkw==", + "license": "MIT" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "license": "MIT", @@ -7530,6 +9277,12 @@ "version": "2.23.0", "license": "CC0-1.0" }, + "node_modules/mdurl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", + "license": "MIT" + }, "node_modules/memfs": { "version": "4.38.1", "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.38.1.tgz", @@ -7671,6 +9424,24 @@ "node": ">= 6" } }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/napi-postinstall": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", @@ -8047,6 +9818,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -8075,9 +9882,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.1.tgz", - "integrity": "sha512-h7bxdzhHk8Knyc4Tj+jMaa7fEEoUJy7p1qtbVgkYg1Uhpe5Np5VuGXCRZnkZvU+Q42M1vStt0ifa3ueykRJPmQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", "funding": [ { "type": "github", @@ -8398,6 +10205,53 @@ "node": ">= 0.4" } }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "license": "MIT", @@ -8536,6 +10390,15 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pure-rand": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", @@ -8986,6 +10849,19 @@ "node": ">=11.0.0" } }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", @@ -9222,7 +11098,6 @@ }, "node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -9257,7 +11132,6 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "devOptional": true, "license": "BSD-3-Clause" }, "node_modules/stack-utils": { @@ -9515,6 +11389,15 @@ "node": ">=8" } }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -9602,6 +11485,40 @@ "streamx": "^2.12.5" } }, + "node_modules/terser": { + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", + "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "devOptional": true, @@ -10067,6 +11984,12 @@ "typescript": ">=4.8.4 <6.1.0" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", @@ -10704,10 +12627,10 @@ }, "packages/code-analyzer-apexguru-engine": { "name": "@salesforce/code-analyzer-apexguru-engine", - "version": "0.42.0", + "version": "0.43.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.41.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@salesforce/core": "^8.31.2", "archiver": "^7.0.1", "form-data": "^4.0.6" @@ -10959,10 +12882,10 @@ }, "packages/code-analyzer-core": { "name": "@salesforce/code-analyzer-core", - "version": "0.52.0", + "version": "0.53.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.41.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@types/node": "^20.0.0", "csv-stringify": "^6.8.1", "isbinaryfile": "^5.0.7", @@ -11211,7 +13134,7 @@ }, "packages/code-analyzer-engine-api": { "name": "@salesforce/code-analyzer-engine-api", - "version": "0.41.0", + "version": "0.42.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { "@types/node": "^20.0.0", @@ -11528,7 +13451,7 @@ }, "packages/code-analyzer-eslint-engine": { "name": "@salesforce/code-analyzer-eslint-engine", - "version": "0.46.0", + "version": "0.47.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { "@babel/preset-react": "^7.29.7", @@ -11536,8 +13459,8 @@ "@lwc/eslint-plugin-lwc": "^3.5.0", "@lwc/eslint-plugin-lwc-platform": "^6.3.0", "@salesforce-ux/eslint-plugin-slds": "^1.2.1", - "@salesforce/code-analyzer-engine-api": "0.41.0", - "@salesforce/code-analyzer-eslint8-engine": "0.18.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", + "@salesforce/code-analyzer-eslint8-engine": "0.19.0-SNAPSHOT", "@salesforce/eslint-config-lwc": "^4.1.2", "@salesforce/eslint-plugin-lightning": "^2.0.0", "@types/node": "^20.0.0", @@ -12000,7 +13923,7 @@ }, "packages/code-analyzer-eslint8-engine": { "name": "@salesforce/code-analyzer-eslint8-engine", - "version": "0.18.0", + "version": "0.19.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { "@babel/core": "7.27.4", @@ -12008,7 +13931,7 @@ "@eslint/js": "8.57.1", "@lwc/eslint-plugin-lwc": "2.2.0", "@lwc/eslint-plugin-lwc-platform": "5.2.0", - "@salesforce/code-analyzer-engine-api": "0.41.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@salesforce/eslint-config-lwc": "3.7.2", "@salesforce/eslint-plugin-lightning": "1.0.1", "@types/node": "^20.0.0", @@ -12061,162 +13984,445 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "packages/code-analyzer-eslint8-engine/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "url": "https://opencollective.com/babel" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@babel/eslint-parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.5.tgz", + "integrity": "sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc": { + "version": "3.7.2", + "license": "MIT", + "dependencies": { + "@babel/core": "~7.24.7", + "@babel/eslint-parser": "~7.24.7", + "eslint-restricted-globals": "~0.2.0", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "@lwc/eslint-plugin-lwc": "^2.0.0", + "@salesforce/eslint-plugin-lightning": "^1.0.0", + "eslint": "^7 || ^8", + "eslint-plugin-import": "*", + "eslint-plugin-jest": "*" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/core": { + "version": "7.24.9", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/eslint-parser": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", + "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/type-utils": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", + "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", + "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/parser": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", + "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@babel/eslint-parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.5.tgz", - "integrity": "sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==", + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/scope-manager": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", + "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", "license": "MIT", "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/types": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc": { - "version": "3.7.2", + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", + "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", "license": "MIT", "dependencies": { - "@babel/core": "~7.24.7", - "@babel/eslint-parser": "~7.24.7", - "eslint-restricted-globals": "~0.2.0", - "semver": "^7.6.2" + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@lwc/eslint-plugin-lwc": "^2.0.0", - "@salesforce/eslint-plugin-lightning": "^1.0.0", - "eslint": "^7 || ^8", - "eslint-plugin-import": "*", - "eslint-plugin-jest": "*" + "typescript": ">=4.8.4 <5.9.0" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/core": { - "version": "7.24.9", + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", + "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@typescript-eslint/types": "8.30.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://opencollective.com/typescript-eslint" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/eslint-parser": { - "version": "7.24.8", + "packages/code-analyzer-eslint8-engine/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "license": "MIT", "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + "node": ">=0.10.0" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" }, "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@salesforce/eslint-config-lwc/node_modules/@babel/eslint-parser/node_modules/semver": { + "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", - "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", + "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-jest": { + "version": "28.10.0", "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.30.1", - "@typescript-eslint/type-utils": "8.30.1", - "@typescript-eslint/utils": "8.30.1", - "@typescript-eslint/visitor-keys": "8.30.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/code-analyzer-eslint8-engine/node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "engines": { + "node": ">=14.17" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "packages/code-analyzer-eslint8-engine/node_modules/typescript-eslint": { "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", - "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.30.1.tgz", + "integrity": "sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==", "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.30.1", - "@typescript-eslint/utils": "8.30.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "@typescript-eslint/eslint-plugin": "8.30.1", + "@typescript-eslint/parser": "8.30.1", + "@typescript-eslint/utils": "8.30.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -12230,7 +14436,7 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "packages/code-analyzer-eslint8-engine/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { "version": "8.30.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", @@ -12253,107 +14459,158 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/parser": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", - "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", - "license": "MIT", + "packages/code-analyzer-flow-engine": { + "name": "@salesforce/code-analyzer-flow-engine", + "version": "0.41.0-SNAPSHOT", + "license": "BSD-3-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.30.1", - "@typescript-eslint/types": "8.30.1", - "@typescript-eslint/typescript-estree": "8.30.1", - "@typescript-eslint/visitor-keys": "8.30.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", + "@types/node": "^20.0.0", + "@types/semver": "^7.7.1", + "semver": "^7.8.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "devDependencies": { + "@eslint/js": "^9.39.5", + "@types/jest": "^30.0.0", + "eslint": "^9.39.5", + "jest": "^30.4.2", + "rimraf": "^6.1.3", + "ts-jest": "^29.4.11", + "typescript": "^5.9.3", + "typescript-eslint": "^8.64.0" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "engines": { + "node": ">=20.0.0" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/scope-manager": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", - "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", + "packages/code-analyzer-flow-engine/node_modules/@eslint/eslintrc": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.30.1", - "@typescript-eslint/visitor-keys": "8.30.1" + "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.3.0", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/types": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", - "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", + "packages/code-analyzer-flow-engine/node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://eslint.org/donate" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", - "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", + "packages/code-analyzer-flow-engine/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.30.1", - "@typescript-eslint/visitor-keys": "8.30.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/code-analyzer-flow-engine/node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@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.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", - "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", - "license": "MIT", + "packages/code-analyzer-flow-engine/node_modules/eslint-scope": { + "version": "8.4.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.30.1", - "eslint-visitor-keys": "^4.2.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" } }, - "packages/code-analyzer-eslint8-engine/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "packages/code-analyzer-flow-engine/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -12361,206 +14618,119 @@ "funding": { "url": "https://opencollective.com/eslint" } - }, - "packages/code-analyzer-eslint8-engine/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "packages/code-analyzer-eslint8-engine/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", + }, + "packages/code-analyzer-flow-engine/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "brace-expansion": "^1.1.7" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "packages/code-analyzer-flow-engine/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "packages/code-analyzer-eslint8-engine/node_modules/eslint-plugin-jest": { - "version": "28.10.0", + "packages/code-analyzer-flow-engine/node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^16.10.0 || ^18.12.0 || >=20.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } + "node": ">=16.0.0" } }, - "packages/code-analyzer-eslint8-engine/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "packages/code-analyzer-flow-engine/node_modules/flat-cache": { + "version": "4.0.1", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "packages/code-analyzer-eslint8-engine/node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=14.17" + "node": ">=16" } }, - "packages/code-analyzer-eslint8-engine/node_modules/typescript-eslint": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.30.1.tgz", - "integrity": "sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==", + "packages/code-analyzer-flow-engine/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.30.1", - "@typescript-eslint/parser": "8.30.1", - "@typescript-eslint/utils": "8.30.1" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/code-analyzer-eslint8-engine/node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { - "version": "8.30.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", - "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", + "packages/code-analyzer-flow-engine/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "packages/code-analyzer-flow-engine/node_modules/minimatch": { + "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": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.30.1", - "@typescript-eslint/types": "8.30.1", - "@typescript-eslint/typescript-estree": "8.30.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "node": "*" } }, - "packages/code-analyzer-flow-engine": { - "name": "@salesforce/code-analyzer-flow-engine", - "version": "0.40.0", + "packages/code-analyzer-lwc-engine": { + "name": "@salesforce/code-analyzer-lwc-engine", + "version": "0.1.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.41.0", - "@types/node": "^20.0.0", - "@types/semver": "^7.7.1", - "semver": "^7.8.5" + "@lwc/compiler": "9.2.1", + "@lwc/errors": "9.2.1", + "@lwc/metadata": "15.0.5", + "@lwc/sfdc-lwc-compiler": "15.0.5", + "@salesforce/code-analyzer-engine-api": "0.36.0", + "@types/node": "^20.0.0" }, "devDependencies": { - "@eslint/js": "^9.39.5", + "@eslint/js": "^9.39.2", "@types/jest": "^30.0.0", - "eslint": "^9.39.5", - "jest": "^30.4.2", - "rimraf": "^6.1.3", - "ts-jest": "^29.4.11", + "eslint": "^9.39.2", + "jest": "^30.2.0", + "rimraf": "^6.1.2", + "ts-jest": "^29.4.6", "typescript": "^5.9.3", - "typescript-eslint": "^8.64.0" + "typescript-eslint": "^8.50.0" }, "engines": { "node": ">=20.0.0" } }, - "packages/code-analyzer-flow-engine/node_modules/@eslint/eslintrc": { + "packages/code-analyzer-lwc-engine/node_modules/@eslint/eslintrc": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", @@ -12584,7 +14754,38 @@ "url": "https://opencollective.com/eslint" } }, - "packages/code-analyzer-flow-engine/node_modules/@eslint/js": { + "packages/code-analyzer-lwc-engine/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" + }, + "packages/code-analyzer-lwc-engine/node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/code-analyzer-lwc-engine/node_modules/@eslint/eslintrc/node_modules/minimatch": { + "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": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/code-analyzer-lwc-engine/node_modules/@eslint/js": { "version": "9.39.5", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", @@ -12597,18 +14798,41 @@ "url": "https://eslint.org/donate" } }, - "packages/code-analyzer-flow-engine/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, + "packages/code-analyzer-lwc-engine/node_modules/@salesforce/code-analyzer-engine-api": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@salesforce/code-analyzer-engine-api/-/code-analyzer-engine-api-0.36.0.tgz", + "integrity": "sha512-lNqG8TdXSoeqAdFjGUlyJb+CrM90kjDKzXmSsJhAgbb7u8mBMjkAlNTHvvIPMybRxeg180Fs+OyWb1fhGs9EeQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/node": "^20.0.0", + "minimatch": "^10.2.4" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "packages/code-analyzer-lwc-engine/node_modules/balanced-match": { + "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" + } + }, + "packages/code-analyzer-lwc-engine/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, - "packages/code-analyzer-flow-engine/node_modules/eslint": { + "packages/code-analyzer-lwc-engine/node_modules/eslint": { "version": "9.39.5", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", @@ -12668,8 +14892,10 @@ } } }, - "packages/code-analyzer-flow-engine/node_modules/eslint-scope": { + "packages/code-analyzer-lwc-engine/node_modules/eslint-scope": { "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12683,7 +14909,7 @@ "url": "https://opencollective.com/eslint" } }, - "packages/code-analyzer-flow-engine/node_modules/eslint-visitor-keys": { + "packages/code-analyzer-lwc-engine/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", @@ -12696,7 +14922,38 @@ "url": "https://opencollective.com/eslint" } }, - "packages/code-analyzer-flow-engine/node_modules/espree": { + "packages/code-analyzer-lwc-engine/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" + }, + "packages/code-analyzer-lwc-engine/node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "packages/code-analyzer-lwc-engine/node_modules/eslint/node_modules/minimatch": { + "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": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "packages/code-analyzer-lwc-engine/node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", @@ -12714,16 +14971,20 @@ "url": "https://opencollective.com/eslint" } }, - "packages/code-analyzer-flow-engine/node_modules/estraverse": { + "packages/code-analyzer-lwc-engine/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "packages/code-analyzer-flow-engine/node_modules/file-entry-cache": { + "packages/code-analyzer-lwc-engine/node_modules/file-entry-cache": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12733,8 +14994,10 @@ "node": ">=16.0.0" } }, - "packages/code-analyzer-flow-engine/node_modules/flat-cache": { + "packages/code-analyzer-lwc-engine/node_modules/flat-cache": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -12745,7 +15008,7 @@ "node": ">=16" } }, - "packages/code-analyzer-flow-engine/node_modules/globals": { + "packages/code-analyzer-lwc-engine/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", @@ -12758,7 +15021,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/code-analyzer-flow-engine/node_modules/ignore": { + "packages/code-analyzer-lwc-engine/node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", @@ -12768,25 +15031,27 @@ "node": ">= 4" } }, - "packages/code-analyzer-flow-engine/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", + "packages/code-analyzer-lwc-engine/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.8" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "packages/code-analyzer-pmd-engine": { "name": "@salesforce/code-analyzer-pmd-engine", - "version": "0.45.0", + "version": "0.46.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.41.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@types/node": "^20.0.0", "@types/semver": "^7.7.1", "semver": "^7.8.5" @@ -13028,10 +15293,10 @@ }, "packages/code-analyzer-regex-engine": { "name": "@salesforce/code-analyzer-regex-engine", - "version": "0.39.0", + "version": "0.40.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.41.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@types/node": "^20.0.0", "isbinaryfile": "^5.0.7", "p-limit": "^3.1.0" @@ -13273,10 +15538,10 @@ }, "packages/code-analyzer-retirejs-engine": { "name": "@salesforce/code-analyzer-retirejs-engine", - "version": "0.38.0", + "version": "0.39.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.41.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@types/node": "^20.0.0", "isbinaryfile": "^5.0.7", "node-stream-zip": "^1.15.0", @@ -13519,10 +15784,10 @@ }, "packages/code-analyzer-sfge-engine": { "name": "@salesforce/code-analyzer-sfge-engine", - "version": "0.24.0", + "version": "0.25.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.41.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@types/node": "^20.0.0", "semver": "^7.8.5" }, @@ -13767,7 +16032,7 @@ "version": "0.1.0-SNAPSHOT", "license": "BSD-3-Clause", "dependencies": { - "@salesforce/code-analyzer-engine-api": "0.41.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@types/node": "^20.0.0" }, "devDependencies": { diff --git a/packages/code-analyzer-lwc-engine/README.md b/packages/code-analyzer-lwc-engine/README.md new file mode 100644 index 00000000..5fbdd29d --- /dev/null +++ b/packages/code-analyzer-lwc-engine/README.md @@ -0,0 +1,14 @@ +# @salesforce/code-analyzer-lwc-engine + +POC implementation of the LWC compiler engine for Salesforce Code Analyzer. + +This engine runs the LWC compiler (`@lwc/compiler`) against `.js` / `.html` / `.css` +files inside LWC component bundles and translates each `CompilerDiagnostic` into +a Code Analyzer `Violation`. + +See [`handoff-notes/lwc-engine-spike-doc.md`](../../../handoff-notes/lwc-engine-spike-doc.md) +for the full design. + +## Status + +Draft / proof-of-concept. Not yet wired into `code-analyzer-core`'s plugin loader. diff --git a/packages/code-analyzer-lwc-engine/eslint.config.mjs b/packages/code-analyzer-lwc-engine/eslint.config.mjs new file mode 100644 index 00000000..44661709 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/eslint.config.mjs @@ -0,0 +1,16 @@ +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.recommended, + { + rules: { + "@typescript-eslint/no-unused-vars": ["error", { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + }] + } + } +); diff --git a/packages/code-analyzer-lwc-engine/package.json b/packages/code-analyzer-lwc-engine/package.json new file mode 100644 index 00000000..141d116e --- /dev/null +++ b/packages/code-analyzer-lwc-engine/package.json @@ -0,0 +1,69 @@ +{ + "name": "@salesforce/code-analyzer-lwc-engine", + "description": "LWC compiler engine for Salesforce Code Analyzer (POC)", + "version": "0.1.0-SNAPSHOT", + "author": "The Salesforce Code Analyzer Team", + "license": "BSD-3-Clause", + "homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview", + "repository": { + "type": "git", + "url": "git+https://github.com/forcedotcom/code-analyzer-core.git", + "directory": "packages/code-analyzer-lwc-engine" + }, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "dependencies": { + "@types/node": "^20.0.0", + "@salesforce/code-analyzer-engine-api": "0.36.0", + "@lwc/compiler": "9.2.1", + "@lwc/errors": "9.2.1", + "@lwc/sfdc-lwc-compiler": "15.0.5", + "@lwc/metadata": "15.0.5" + }, + "devDependencies": { + "@eslint/js": "^9.39.2", + "@types/jest": "^30.0.0", + "eslint": "^9.39.2", + "jest": "^30.2.0", + "rimraf": "^6.1.2", + "ts-jest": "^29.4.6", + "typescript": "^5.9.3", + "typescript-eslint": "^8.50.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "files": [ + "dist", + "LICENSE", + "package.json" + ], + "scripts": { + "build": "tsc --build tsconfig.build.json --verbose", + "test": "tsc --build tsconfig.json && cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage", + "lint": "eslint src/**/*.ts", + "package": "npm pack", + "all": "npm run build && npm run lint && npm run test && npm run package", + "clean": "tsc --build tsconfig.build.json --clean", + "postclean": "rimraf dist && rimraf coverage && rimraf ./*.tgz", + "scrub": "npm run clean && rimraf node_modules" + }, + "jest": { + "preset": "ts-jest", + "testEnvironment": "node", + "testMatch": [ + "**/*.test.ts" + ], + "testPathIgnorePatterns": [ + "/node_modules/", + "/dist/" + ], + "collectCoverageFrom": [ + "src/**/*.ts", + "!src/index.ts" + ], + "transformIgnorePatterns": [ + "node_modules/(?!(@lwc)/)" + ] + } +} diff --git a/packages/code-analyzer-lwc-engine/src/bundle.ts b/packages/code-analyzer-lwc-engine/src/bundle.ts new file mode 100644 index 00000000..d2629e05 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/bundle.ts @@ -0,0 +1,35 @@ +import path from "node:path"; + +const BUNDLE_EXTENSIONS = new Set([".js", ".ts", ".mjs", ".html", ".css"]); +// TODO: Parse namespace from sfdx-project.json instead of hard-coding "c" +const DEFAULT_NAMESPACE = "c"; + +export interface BundleIdentity { + name: string; + namespace: string; +} + +// Spike doc §10.1. A file qualifies as an LWC bundle file when its extension +// is supported AND its parent directory's basename matches the file's stem +// AND the file is not under a __tests__/ directory. +export function isLwcBundleFile(absPath: string): boolean { + const ext = path.extname(absPath).toLowerCase(); + if (!BUNDLE_EXTENSIONS.has(ext)) return false; + + const stem = path.basename(absPath, ext); + const parentDir = path.basename(path.dirname(absPath)); + if (parentDir !== stem) return false; + + const segments = absPath.split(path.sep); + if (segments.includes("__tests__")) return false; + + return true; +} + +// Spike doc §10.2. v1: namespace is hard-coded to "c". sfdx-project.json +// parsing is a known limitation (§16). +export function bundleIdentity(absPath: string): BundleIdentity { + const ext = path.extname(absPath); + const stem = path.basename(absPath, ext); + return { name: stem, namespace: DEFAULT_NAMESPACE }; +} diff --git a/packages/code-analyzer-lwc-engine/src/compile.ts b/packages/code-analyzer-lwc-engine/src/compile.ts new file mode 100644 index 00000000..cf28f76e --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/compile.ts @@ -0,0 +1,190 @@ +import * as fsp from "node:fs/promises"; +import path from "node:path"; +import { BundleIdentity } from "./bundle"; + +export interface CollectedDiagnostic { + code: number; + message: string; + filename?: string; + location?: { line: number; column: number; start?: number; length?: number }; + level: number; + url?: string; +} + +// Compile a single LWC file using both open-source and platform compilers. +// Returns a merged, deduplicated list of diagnostics from both paths. +// +// Path 1: @lwc/compiler transformSync — throws CompilerError/CompilerAggregateError (codes 1001-1213) +// Path 2: @lwc/sfdc-lwc-compiler compile() — returns diagnostics on output (codes 1500-1538) +export async function compileAndCollect( + file: string, + bundle: BundleIdentity +): Promise { + const source = await fsp.readFile(file, "utf-8"); + const bundleFiles = await readBundleFiles(file, bundle.name); + + // Sequential — not parallel. Both paths import @lwc/compiler internally; + // concurrent dynamic import() of the same ESM module causes a Node race condition. + const openSourceDiags = await collectFromTransformSync(source, file, bundle); + const platformDiags = await collectFromPlatformCompile(bundleFiles, bundle); + + return deduplicateDiagnostics([...openSourceDiags, ...platformDiags]); +} + +// Read all sibling files in the bundle directory that belong to this component. +async function readBundleFiles(file: string, name: string): Promise> { + const dir = path.dirname(file); + const files: Record = {}; + try { + const entries = await fsp.readdir(dir); + for (const entry of entries) { + const stem = path.basename(entry, path.extname(entry)); + if (stem === name && !entry.includes("__tests__")) { + const content = await fsp.readFile(path.join(dir, entry), "utf-8"); + files[entry] = content; + } + } + } catch { + // If we can't read the directory, just use the single file + files[path.basename(file)] = await fsp.readFile(file, "utf-8"); + } + return files; +} + +// Path 1: open-source @lwc/compiler (throws on error) +async function collectFromTransformSync( + source: string, + file: string, + bundle: BundleIdentity +): Promise { + const lwcCompiler = await import("@lwc/compiler"); + const lwcErrors = await import("@lwc/errors"); + const { transformSync } = lwcCompiler as { transformSync: (src: string, filename: string, opts: { name: string; namespace: string }) => unknown }; + const { CompilerError, CompilerAggregateError } = lwcErrors as { + CompilerError: new (...args: unknown[]) => Error & CollectedDiagnostic; + CompilerAggregateError: new (...args: unknown[]) => Error & { errors: (Error & CollectedDiagnostic)[] }; + }; + + try { + transformSync(source, file, { name: bundle.name, namespace: bundle.namespace }); + return []; + } catch (e) { + if (e instanceof CompilerError) { + return [unwrap(e)]; + } + if (e instanceof CompilerAggregateError) { + return e.errors.map(unwrap); + } + const err = e as Error; + return [{ + code: 1001, + message: `Unexpected compilation error: ${err.message}`, + filename: file, + level: 1, + }]; + } +} + +// Path 2: @lwc/sfdc-lwc-compiler platform compile (returns diagnostics, doesn't throw) +async function collectFromPlatformCompile( + bundleFiles: Record, + bundle: BundleIdentity +): Promise { + try { + const sfdcCompiler = await import("@lwc/sfdc-lwc-compiler"); + const compile = (sfdcCompiler as { compile: (config: unknown) => Promise }).compile; + + const output = await compile({ + bundle: { + type: "platform" as const, + name: bundle.name, + namespace: bundle.namespace, + files: bundleFiles, + }, + }); + + const diagnostics: CollectedDiagnostic[] = []; + + // Top-level diagnostics + if (output.diagnostics) { + for (const d of output.diagnostics) { + if (isPlatformDiagnostic(d)) diagnostics.push(toDiag(d)); + } + } + + // Per-bundle result diagnostics + if (output.results) { + for (const result of output.results) { + if (result.diagnostics) { + for (const d of result.diagnostics) { + if (isPlatformDiagnostic(d)) diagnostics.push(toDiag(d)); + } + } + } + } + + return diagnostics; + } catch (_err) { + // If platform compile fails entirely (missing deps, version mismatch), fall back silently. + // Open-source path still provides coverage for codes 1001-1213. + // Platform compile unavailable — open-source path still covers codes 1001-1213. + return []; + } +} + +// Only keep diagnostics in the platform range (1500+) to avoid double-counting +// open-source errors that both compilers might emit. +function isPlatformDiagnostic(d: unknown): d is RawDiagnostic { + if (!d || typeof d !== "object") return false; + const obj = d as Record; + return typeof obj.code === "number" && obj.code >= 1500; +} + +function toDiag(d: RawDiagnostic): CollectedDiagnostic { + return { + code: d.code, + message: d.message ?? "", + filename: d.filename, + location: d.location, + level: d.level ?? 1, + url: d.url, + }; +} + +function unwrap(e: Error & CollectedDiagnostic): CollectedDiagnostic { + return { + code: e.code, + message: e.message, + filename: e.filename, + location: e.location, + level: e.level, + url: e.url, + }; +} + +function deduplicateDiagnostics(diags: CollectedDiagnostic[]): CollectedDiagnostic[] { + const seen = new Set(); + const result: CollectedDiagnostic[] = []; + for (const d of diags) { + const key = `${d.code}|${d.message}|${d.filename ?? ""}|${d.location?.line ?? ""}|${d.location?.column ?? ""}`; + if (!seen.has(key)) { + seen.add(key); + result.push(d); + } + } + return result; +} + +interface RawDiagnostic { + code: number; + message?: string; + filename?: string; + location?: { line: number; column: number; start?: number; length?: number }; + level?: number; + url?: string; +} + +interface PlatformOutput { + diagnostics?: unknown[]; + results?: Array<{ diagnostics?: unknown[] }>; +} diff --git a/packages/code-analyzer-lwc-engine/src/engine.ts b/packages/code-analyzer-lwc-engine/src/engine.ts new file mode 100644 index 00000000..041168d7 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/engine.ts @@ -0,0 +1,85 @@ +import { + DescribeOptions, + Engine, + EngineRunResults, + LogLevel, + RuleDescription, + RunOptions, + Violation, +} from "@salesforce/code-analyzer-engine-api"; +import * as fsp from "node:fs/promises"; +import path from "node:path"; +import { buildRuleCatalog } from "./rules"; +import { isLwcBundleFile, bundleIdentity } from "./bundle"; +import { compileAndCollect } from "./compile"; +import { toViolation } from "./translate"; +import { getMessage } from "./messages"; + +export class LwcEngine extends Engine { + static readonly NAME = "lwc"; + + getName(): string { + return LwcEngine.NAME; + } + + async getEngineVersion(): Promise { + const pathToPackageJson = path.join(__dirname, "..", "package.json"); + const packageJson: { version: string } = JSON.parse(await fsp.readFile(pathToPackageJson, "utf-8")); + return packageJson.version; + } + + async describeRules(opts: DescribeOptions): Promise { + this.emitDescribeRulesProgressEvent(0); + + if (opts.workspace) { + const targetedFiles = await opts.workspace.getTargetedFiles(); + const hasLwcFiles = targetedFiles.some(isLwcBundleFile); + if (!hasLwcFiles) { + this.emitDescribeRulesProgressEvent(100); + return []; + } + } + + const rules = await buildRuleCatalog(); + this.emitDescribeRulesProgressEvent(100); + return rules; + } + + async runRules(ruleNames: string[], opts: RunOptions): Promise { + this.emitRunRulesProgressEvent(0); + + const selected = new Set(ruleNames); + const violations: Violation[] = []; + const targetedFiles = await opts.workspace.getTargetedFiles(); + const lwcFiles = targetedFiles.filter(isLwcBundleFile); + + if (lwcFiles.length === 0) { + this.emitRunRulesProgressEvent(100); + return { violations: [] }; + } + + const step = 100 / lwcFiles.length; + let progress = 0; + + for (const file of lwcFiles) { + try { + const diagnostics = await compileAndCollect(file, bundleIdentity(file)); + for (const d of diagnostics) { + const ruleName = `LWC${d.code}`; + if (selected.size > 0 && !selected.has(ruleName)) continue; + violations.push(toViolation(d, file)); + } + } catch (e) { + this.emitLogEvent( + LogLevel.Warn, + getMessage("UnexpectedThrowDuringCompile", file, (e as Error).message) + ); + } + progress += step; + this.emitRunRulesProgressEvent(progress); + } + + this.emitRunRulesProgressEvent(100); + return { violations }; + } +} diff --git a/packages/code-analyzer-lwc-engine/src/index.ts b/packages/code-analyzer-lwc-engine/src/index.ts new file mode 100644 index 00000000..6040d093 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/index.ts @@ -0,0 +1,8 @@ +import { EnginePlugin } from "@salesforce/code-analyzer-engine-api"; +import { LwcEnginePlugin } from "./plugin"; + +function createEnginePlugin(): EnginePlugin { + return new LwcEnginePlugin(); +} + +export { createEnginePlugin, LwcEnginePlugin }; diff --git a/packages/code-analyzer-lwc-engine/src/messages.ts b/packages/code-analyzer-lwc-engine/src/messages.ts new file mode 100644 index 00000000..f3f08cdd --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/messages.ts @@ -0,0 +1,16 @@ +import { getMessageFromCatalog } from "@salesforce/code-analyzer-engine-api"; + +const MESSAGE_CATALOG: { [key: string]: string } = { + UnsupportedEngineName: + `The LwcEnginePlugin does not support an engine with name '%s'.`, + + CompileFailed: + `Failed to compile %s: %s`, + + UnexpectedThrowDuringCompile: + `Unexpected error while compiling %s: %s`, +}; + +export function getMessage(msgId: string, ...args: (string | number)[]): string { + return getMessageFromCatalog(MESSAGE_CATALOG, msgId, ...args); +} diff --git a/packages/code-analyzer-lwc-engine/src/plugin.ts b/packages/code-analyzer-lwc-engine/src/plugin.ts new file mode 100644 index 00000000..8fedddc6 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/plugin.ts @@ -0,0 +1,20 @@ +import { + ConfigObject, + Engine, + EnginePluginV1, +} from "@salesforce/code-analyzer-engine-api"; +import { getMessage } from "./messages"; +import { LwcEngine } from "./engine"; + +export class LwcEnginePlugin extends EnginePluginV1 { + getAvailableEngineNames(): string[] { + return [LwcEngine.NAME]; + } + + async createEngine(engineName: string, _resolvedConfig: ConfigObject): Promise { + if (engineName !== LwcEngine.NAME) { + throw new Error(getMessage('UnsupportedEngineName', engineName)); + } + return new LwcEngine(); + } +} diff --git a/packages/code-analyzer-lwc-engine/src/rules.ts b/packages/code-analyzer-lwc-engine/src/rules.ts new file mode 100644 index 00000000..d2c922cf --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/rules.ts @@ -0,0 +1,113 @@ +import { RuleDescription } from "@salesforce/code-analyzer-engine-api"; +import { toSeverityLevel } from "./severity"; + +interface LWCErrorInfoLike { + code: number; + message: string; + level: number; + url?: string; +} + +// Lazy-load all error registries from three sources: +// 1. @lwc/errors (open-source compiler, codes 1001-1213) +// 2. @lwc/sfdc-lwc-compiler (platform compiler, codes 1500-1538) +// 3. @lwc/metadata (metadata extraction, codes 1700-1720) +// +// Platform packages (2 & 3) are CJS but require() @lwc/errors which is ESM-only. +// CJS cannot require ESM — this is a broken dependency in the published packages. +// Workaround: read the .js file from disk and execute it in a VM with a fake require() +// that supplies the only constants the file actually needs (DiagnosticLevel enum values). + +async function loadPlatformErrors(packageName: string): Promise> { + const resolvePath = require.resolve(`${packageName}/dist/errors/errors.js`); + const fs = await import("node:fs"); + const vm = await import("node:vm"); + const code = fs.readFileSync(resolvePath, "utf-8").replace(/\/\/# sourceMappingURL=.*$/m, ""); + const mod = { exports: {} as Record }; + const wrapped = `(function(exports, require, module) {\n${code}\n})`; + const fn = vm.runInThisContext(wrapped); + fn(mod.exports, () => ({ DiagnosticLevel: { Fatal: 0, Error: 1, Warning: 2, Log: 3 }, SITE_LOCAL_NAMESPACE: "Site" }), mod); + return mod.exports; +} + +async function loadRegistries(): Promise { + const lwcErrors = await import("@lwc/errors"); + const [sfdcErrors, metadataErrors] = await Promise.all([ + loadPlatformErrors("@lwc/sfdc-lwc-compiler"), + loadPlatformErrors("@lwc/metadata"), + ]); + + const collected: LWCErrorInfoLike[] = []; + + const pushFrom = (source: unknown) => { + if (!source || typeof source !== "object") return; + if (isLwcErrorInfo(source)) { + collected.push(source); + return; + } + for (const value of Object.values(source as Record)) { + if (isLwcErrorInfo(value)) { + collected.push(value); + } + } + }; + + // @lwc/errors registries + const e = lwcErrors as Record; + pushFrom(e.GENERIC_COMPILER_ERROR); + pushFrom(e.CompilerValidationErrors); + pushFrom(e.ModuleResolutionErrors); + pushFrom(e.TransformerErrors); + pushFrom(e.LWCClassErrors); + pushFrom(e.DecoratorErrors); + pushFrom(e.TemplateErrors); + pushFrom(e.ParserDiagnostics); + pushFrom(e.SsrCompilerErrors); + + // @lwc/sfdc-lwc-compiler platform errors (1500s) + const s = sfdcErrors as Record; + pushFrom(s.Errors); + pushFrom(s.JSDocErrors); + + // @lwc/metadata errors (1700s) + const m = metadataErrors as Record; + pushFrom(m.Errors); + + return collected; +} + +function isLwcErrorInfo(v: unknown): v is LWCErrorInfoLike { + if (!v || typeof v !== "object") return false; + const o = v as Record; + return typeof o.code === "number" + && typeof o.message === "string" + && typeof o.level === "number"; +} + +export function ruleNameForCode(code: number): string { + return `LWC${code}`; +} + +export async function buildRuleCatalog(): Promise { + const infos = await loadRegistries(); + + // Dedupe by code — registries can repeat entries for shared codes. + const byCode = new Map(); + for (const info of infos) { + if (!byCode.has(info.code)) byCode.set(info.code, info); + } + + const rules: RuleDescription[] = []; + for (const info of byCode.values()) { + rules.push({ + name: ruleNameForCode(info.code), + severityLevel: toSeverityLevel(info.level), + tags: ["Recommended", "LWC"], + description: info.message, + resourceUrls: info.url ? [info.url] : [] + }); + } + + rules.sort((a, b) => a.name.localeCompare(b.name)); + return rules; +} diff --git a/packages/code-analyzer-lwc-engine/src/severity.ts b/packages/code-analyzer-lwc-engine/src/severity.ts new file mode 100644 index 00000000..f61ca290 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/severity.ts @@ -0,0 +1,20 @@ +import { SeverityLevel } from "@salesforce/code-analyzer-engine-api"; + +// DiagnosticLevel from @lwc/errors: +// Fatal=0, Error=1, Warning=2, Log=3 +// +// SeverityLevel from code-analyzer-engine-api: +// Critical=1, High=2, Moderate=3, Low=4, Info=5 +// +// TODO: Discuss this mapping further with the team +// Log collapses to Info; SARIF round-trip imperfection is accepted as +// a v1 known limitation (§16). +export function toSeverityLevel(level: number | undefined): SeverityLevel { + switch (level) { + case 0: return SeverityLevel.Critical; // Fatal + case 1: return SeverityLevel.Critical; // Error + case 2: return SeverityLevel.High; // Warning + case 3: return SeverityLevel.Info; // Log + default: return SeverityLevel.Moderate; // unknown — bias toward visibility + } +} diff --git a/packages/code-analyzer-lwc-engine/src/translate.ts b/packages/code-analyzer-lwc-engine/src/translate.ts new file mode 100644 index 00000000..3c33c0ba --- /dev/null +++ b/packages/code-analyzer-lwc-engine/src/translate.ts @@ -0,0 +1,18 @@ +import { Violation } from "@salesforce/code-analyzer-engine-api"; +import { CollectedDiagnostic } from "./compile"; +import { ruleNameForCode } from "./rules"; + +// Spike doc §11. Trust d.url only — no synthesis or fallback. +export function toViolation(d: CollectedDiagnostic, fallbackFile: string): Violation { + return { + ruleName: ruleNameForCode(d.code), + message: d.message, + codeLocations: [{ + file: d.filename ?? fallbackFile, + startLine: d.location?.line ?? 1, + startColumn: d.location?.column ?? 1, + }], + primaryLocationIndex: 0, + resourceUrls: d.url ? [d.url] : [], + }; +} diff --git a/packages/code-analyzer-lwc-engine/test/bundle.test.ts b/packages/code-analyzer-lwc-engine/test/bundle.test.ts new file mode 100644 index 00000000..910ac558 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/test/bundle.test.ts @@ -0,0 +1,32 @@ +import path from "node:path"; +import { isLwcBundleFile, bundleIdentity } from "../src/bundle"; + +const j = (...p: string[]) => path.sep + path.join(...p); + +describe("isLwcBundleFile", () => { + it("accepts a JS file matching its parent directory name", () => { + expect(isLwcBundleFile(j("project", "force-app", "lwc", "foo", "foo.js"))).toBe(true); + }); + + it("accepts an HTML template", () => { + expect(isLwcBundleFile(j("project", "lwc", "foo", "foo.html"))).toBe(true); + }); + + it("rejects when stem doesn't match parent directory", () => { + expect(isLwcBundleFile(j("project", "lwc", "foo", "helper.js"))).toBe(false); + }); + + it("rejects unsupported extensions", () => { + expect(isLwcBundleFile(j("project", "lwc", "foo", "foo.json"))).toBe(false); + }); + + it("rejects files under __tests__", () => { + expect(isLwcBundleFile(j("project", "lwc", "foo", "__tests__", "foo.js"))).toBe(false); + }); +}); + +describe("bundleIdentity", () => { + it("derives name from file stem and namespace defaults to c", () => { + expect(bundleIdentity(j("project", "lwc", "foo", "foo.js"))).toEqual({ name: "foo", namespace: "c" }); + }); +}); diff --git a/packages/code-analyzer-lwc-engine/test/engine.test.ts b/packages/code-analyzer-lwc-engine/test/engine.test.ts new file mode 100644 index 00000000..57d71e24 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/test/engine.test.ts @@ -0,0 +1,83 @@ +import { Workspace } from "@salesforce/code-analyzer-engine-api"; +import * as fs from "node:fs"; +import * as os from "node:os"; +import * as path from "node:path"; +import { LwcEngine } from "../src/engine"; +import { LwcEnginePlugin } from "../src/plugin"; + +const TEST_DATA = path.join(__dirname, "test-data"); + +function mkRunOpts(workspace: Workspace) { + return { + logFolder: os.tmpdir(), + workspace, + workingFolder: fs.mkdtempSync(path.join(os.tmpdir(), "lwc-engine-test-")), + }; +} + +function mkDescribeOpts(workspace?: Workspace) { + return { + logFolder: os.tmpdir(), + workspace, + workingFolder: fs.mkdtempSync(path.join(os.tmpdir(), "lwc-engine-test-")), + }; +} + +describe("LwcEnginePlugin", () => { + it("advertises only the lwc engine name", () => { + expect(new LwcEnginePlugin().getAvailableEngineNames()).toEqual(["lwc"]); + }); + + it("creates an LwcEngine instance for the right name", async () => { + const engine = await new LwcEnginePlugin().createEngine("lwc", {}); + expect(engine).toBeInstanceOf(LwcEngine); + }); + + it("rejects unknown engine names", async () => { + await expect(new LwcEnginePlugin().createEngine("nope", {})).rejects.toThrow(); + }); +}); + +describe("LwcEngine", () => { + it("getName returns 'lwc'", () => { + expect(new LwcEngine().getName()).toBe("lwc"); + }); + + it("getEngineVersion returns a semver-shaped string", async () => { + const v = await new LwcEngine().getEngineVersion(); + expect(v).toMatch(/\d+\.\d+\.\d+/); + }); + + it("describeRules returns a non-empty rule catalog", async () => { + const engine = new LwcEngine(); + const rules = await engine.describeRules(mkDescribeOpts()); + expect(rules.length).toBeGreaterThan(0); + // Spike doc §7: every rule is named LWC + for (const r of rules) { + expect(r.name).toMatch(/^LWC\d+$/); + expect(r.tags).toContain("LWC"); + expect(r.tags).toContain("Recommended"); + } + }); + + it("runRules on a clean bundle produces zero violations", async () => { + const engine = new LwcEngine(); + const ws = new Workspace("test-good", [path.join(TEST_DATA, "lwc", "good")]); + const results = await engine.runRules([], mkRunOpts(ws)); + expect(results.violations).toEqual([]); + }); + + it("runRules on a bundle with bad decorators emits an LWC violation", async () => { + const engine = new LwcEngine(); + const ws = new Workspace("test-bad", [path.join(TEST_DATA, "lwc", "bad")]); + // Empty selector means "all rules" in this engine; if you want to scope, + // pass an explicit list. + const results = await engine.runRules([], mkRunOpts(ws)); + expect(results.violations.length).toBeGreaterThan(0); + for (const v of results.violations) { + expect(v.ruleName).toMatch(/^LWC\d+$/); + expect(v.message).toBeTruthy(); + expect(v.codeLocations.length).toBe(1); + } + }); +}); diff --git a/packages/code-analyzer-lwc-engine/test/severity.test.ts b/packages/code-analyzer-lwc-engine/test/severity.test.ts new file mode 100644 index 00000000..6c912c21 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/test/severity.test.ts @@ -0,0 +1,18 @@ +import { SeverityLevel } from "@salesforce/code-analyzer-engine-api"; +import { toSeverityLevel } from "../src/severity"; + +describe("toSeverityLevel", () => { + it.each([ + [0, SeverityLevel.Critical], // Fatal + [1, SeverityLevel.High], // Error + [2, SeverityLevel.Moderate], // Warning + [3, SeverityLevel.Info], // Log + ])("DiagnosticLevel %i maps to SeverityLevel %i", (level, expected) => { + expect(toSeverityLevel(level)).toBe(expected); + }); + + it("unknown level falls back to Moderate", () => { + expect(toSeverityLevel(undefined)).toBe(SeverityLevel.Moderate); + expect(toSeverityLevel(99)).toBe(SeverityLevel.Moderate); + }); +}); diff --git a/packages/code-analyzer-lwc-engine/test/test-data/lwc/bad/bad.js b/packages/code-analyzer-lwc-engine/test/test-data/lwc/bad/bad.js new file mode 100644 index 00000000..b433d62e --- /dev/null +++ b/packages/code-analyzer-lwc-engine/test/test-data/lwc/bad/bad.js @@ -0,0 +1,7 @@ +// A LightningElement-class file with a decorator misuse that the +// LWC compiler rejects with an LWC1xxx diagnostic. +import { LightningElement, api } from 'lwc'; + +export default class Bad extends LightningElement { + @api @api duplicateApiOnSameField; +} diff --git a/packages/code-analyzer-lwc-engine/test/test-data/lwc/good/good.js b/packages/code-analyzer-lwc-engine/test/test-data/lwc/good/good.js new file mode 100644 index 00000000..71d8105f --- /dev/null +++ b/packages/code-analyzer-lwc-engine/test/test-data/lwc/good/good.js @@ -0,0 +1,2 @@ +import { LightningElement } from 'lwc'; +export default class Good extends LightningElement {} diff --git a/packages/code-analyzer-lwc-engine/test/translate.test.ts b/packages/code-analyzer-lwc-engine/test/translate.test.ts new file mode 100644 index 00000000..811f6789 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/test/translate.test.ts @@ -0,0 +1,39 @@ +import { toViolation } from "../src/translate"; + +describe("toViolation", () => { + it("maps a basic diagnostic to a violation", () => { + const v = toViolation({ + code: 1121, + message: "Bad import", + level: 1, + filename: "/p/lwc/foo/foo.js", + location: { line: 3, column: 5, length: 4 }, + url: "https://lwc.dev/guide/error_codes#lwc1121", + }, "/p/lwc/foo/foo.js"); + + expect(v.ruleName).toBe("LWC1121"); + expect(v.message).toBe("Bad import"); + expect(v.codeLocations).toHaveLength(1); + expect(v.codeLocations[0]).toEqual({ + file: "/p/lwc/foo/foo.js", + startLine: 3, + startColumn: 5, + }); + expect(v.primaryLocationIndex).toBe(0); + expect(v.resourceUrls).toEqual(["https://lwc.dev/guide/error_codes#lwc1121"]); + }); + + it("returns empty resourceUrls when d.url is missing (spike doc §9: no synthesis)", () => { + const v = toViolation({ + code: 1099, message: "x", level: 2, filename: "/p/lwc/foo/foo.js", + }, "/p/lwc/foo/foo.js"); + expect(v.resourceUrls).toEqual([]); + }); + + it("falls back to provided file when d.filename is absent", () => { + const v = toViolation({ code: 1, message: "x", level: 1 }, "/fallback/path.js"); + expect(v.codeLocations[0].file).toBe("/fallback/path.js"); + expect(v.codeLocations[0].startLine).toBe(1); + expect(v.codeLocations[0].startColumn).toBe(1); + }); +}); diff --git a/packages/code-analyzer-lwc-engine/tsconfig.build.json b/packages/code-analyzer-lwc-engine/tsconfig.build.json new file mode 100644 index 00000000..91426db6 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/tsconfig.build.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "outDir": "./dist", + "rootDir": "./src", + "skipLibCheck": true + }, + "include": [ + "./src" + ], + "references": [ + { + "path": "../code-analyzer-engine-api/tsconfig.build.json" + } + ] +} diff --git a/packages/code-analyzer-lwc-engine/tsconfig.json b/packages/code-analyzer-lwc-engine/tsconfig.json new file mode 100644 index 00000000..8077e9a0 --- /dev/null +++ b/packages/code-analyzer-lwc-engine/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "rootDir": ".", + "noEmit": true + }, + "include": [ + "./src", + "./test" + ] +} From 456d7356ffbe96dfa005bb35771ae554f9b3a704 Mon Sep 17 00:00:00 2001 From: "pragya.dave" Date: Fri, 21 Aug 2026 11:53:12 +0530 Subject: [PATCH 2/2] Address PR review: logging, namespace parsing, severity test, race comment - compile.ts/engine.ts/messages.ts: surface platform-compiler failures at debug level via a DebugLogger callback instead of swallowing them silently - bundle.ts: resolve namespace from nearest sfdx-project.json (fallback "c") instead of hardcoding; +tests - severity.test.ts: align expected mapping with implementation (Error->Critical, Warning->High) - compile.ts: rewrite sequential-compile comment to state the real reason (sync CPU-bound transformSync + shared @lwc/compiler re-entrancy) - package.json: bump engine-api dep 0.36.0 -> 0.42.0-SNAPSHOT to match workspace - validate-changed-package-versions.js: exempt the unpublished lwc-engine from the version-ahead check (mirrors the apexguru-engine precedent) --- .../validate-changed-package-versions.js | 3 +- .../code-analyzer-lwc-engine/package.json | 2 +- .../code-analyzer-lwc-engine/src/bundle.ts | 64 +++++++++++++++++-- .../code-analyzer-lwc-engine/src/compile.ts | 31 ++++++--- .../code-analyzer-lwc-engine/src/engine.ts | 3 +- .../code-analyzer-lwc-engine/src/messages.ts | 3 + .../code-analyzer-lwc-engine/src/rules.ts | 8 +++ .../test/bundle.test.ts | 48 +++++++++++++- .../test/severity.test.ts | 4 +- 9 files changed, 147 insertions(+), 19 deletions(-) diff --git a/.node-scripts/validate-changed-package-versions.js b/.node-scripts/validate-changed-package-versions.js index 5239e716..e7cca7ae 100644 --- a/.node-scripts/validate-changed-package-versions.js +++ b/.node-scripts/validate-changed-package-versions.js @@ -114,7 +114,8 @@ function getLatestReleasedVersion(changedPackage) { function isPackageThatHasNotPublished(changedPackage) { return [ - "packages/ENGINE-TEMPLATE" + "packages/ENGINE-TEMPLATE", + "packages/code-analyzer-lwc-engine" // remove this exception once the PR merges and the package is published ].includes(changedPackage.replace("\\","/")); } diff --git a/packages/code-analyzer-lwc-engine/package.json b/packages/code-analyzer-lwc-engine/package.json index 141d116e..955284f2 100644 --- a/packages/code-analyzer-lwc-engine/package.json +++ b/packages/code-analyzer-lwc-engine/package.json @@ -14,7 +14,7 @@ "types": "dist/index.d.ts", "dependencies": { "@types/node": "^20.0.0", - "@salesforce/code-analyzer-engine-api": "0.36.0", + "@salesforce/code-analyzer-engine-api": "0.42.0-SNAPSHOT", "@lwc/compiler": "9.2.1", "@lwc/errors": "9.2.1", "@lwc/sfdc-lwc-compiler": "15.0.5", diff --git a/packages/code-analyzer-lwc-engine/src/bundle.ts b/packages/code-analyzer-lwc-engine/src/bundle.ts index d2629e05..788400e0 100644 --- a/packages/code-analyzer-lwc-engine/src/bundle.ts +++ b/packages/code-analyzer-lwc-engine/src/bundle.ts @@ -1,8 +1,14 @@ import path from "node:path"; +import * as fs from "node:fs"; const BUNDLE_EXTENSIONS = new Set([".js", ".ts", ".mjs", ".html", ".css"]); -// TODO: Parse namespace from sfdx-project.json instead of hard-coding "c" +// The default LWC namespace, used when no sfdx-project.json declares one. const DEFAULT_NAMESPACE = "c"; +const SFDX_PROJECT_FILE = "sfdx-project.json"; + +// Cache resolved namespaces per directory so we don't re-walk/re-read for every +// file in the same project during a single run. +const namespaceCache = new Map(); export interface BundleIdentity { name: string; @@ -26,10 +32,60 @@ export function isLwcBundleFile(absPath: string): boolean { return true; } -// Spike doc §10.2. v1: namespace is hard-coded to "c". sfdx-project.json -// parsing is a known limitation (§16). +// Spike doc §10.2. The namespace is read from the nearest ancestor +// sfdx-project.json's top-level "namespace" field, falling back to "c" when the +// manifest is absent, unreadable, or declares no (non-empty) namespace. export function bundleIdentity(absPath: string): BundleIdentity { const ext = path.extname(absPath); const stem = path.basename(absPath, ext); - return { name: stem, namespace: DEFAULT_NAMESPACE }; + return { name: stem, namespace: resolveNamespace(path.dirname(absPath)) }; +} + +// Walk up from startDir looking for an sfdx-project.json and return its declared +// namespace. Results are cached per directory. A missing/blank namespace, a +// missing manifest, or malformed JSON all resolve to DEFAULT_NAMESPACE. +function resolveNamespace(startDir: string): string { + const cached = namespaceCache.get(startDir); + if (cached !== undefined) return cached; + + const visited: string[] = []; + let dir = startDir; + // Stop when path.dirname stops changing (filesystem root). + while (true) { + visited.push(dir); + const cachedForDir = namespaceCache.get(dir); + if (cachedForDir !== undefined) { + return cacheFor(visited, cachedForDir); + } + const manifest = path.join(dir, SFDX_PROJECT_FILE); + if (fs.existsSync(manifest)) { + return cacheFor(visited, readNamespace(manifest)); + } + const parent = path.dirname(dir); + if (parent === dir) break; + dir = parent; + } + return cacheFor(visited, DEFAULT_NAMESPACE); +} + +function readNamespace(manifestPath: string): string { + try { + const parsed = JSON.parse(fs.readFileSync(manifestPath, "utf-8")) as { namespace?: unknown }; + const ns = parsed.namespace; + if (typeof ns === "string" && ns.trim().length > 0) { + return ns.trim(); + } + } catch { + // Malformed or unreadable manifest — fall back to the default namespace. + } + return DEFAULT_NAMESPACE; +} + +// Cache the resolved namespace against every directory visited on the walk so +// sibling files short-circuit on the next lookup. +function cacheFor(dirs: string[], namespace: string): string { + for (const d of dirs) { + namespaceCache.set(d, namespace); + } + return namespace; } diff --git a/packages/code-analyzer-lwc-engine/src/compile.ts b/packages/code-analyzer-lwc-engine/src/compile.ts index cf28f76e..4bd11ed8 100644 --- a/packages/code-analyzer-lwc-engine/src/compile.ts +++ b/packages/code-analyzer-lwc-engine/src/compile.ts @@ -1,6 +1,7 @@ import * as fsp from "node:fs/promises"; import path from "node:path"; import { BundleIdentity } from "./bundle"; +import { getMessage } from "./messages"; export interface CollectedDiagnostic { code: number; @@ -11,6 +12,11 @@ export interface CollectedDiagnostic { url?: string; } +// Callback used to surface non-fatal issues (e.g. the platform compiler being unavailable) +// back to the engine, which owns the event emitter. compile.ts stays free of any Engine +// dependency so it remains a plain, testable module. +export type DebugLogger = (message: string) => void; + // Compile a single LWC file using both open-source and platform compilers. // Returns a merged, deduplicated list of diagnostics from both paths. // @@ -18,15 +24,19 @@ export interface CollectedDiagnostic { // Path 2: @lwc/sfdc-lwc-compiler compile() — returns diagnostics on output (codes 1500-1538) export async function compileAndCollect( file: string, - bundle: BundleIdentity + bundle: BundleIdentity, + logDebug?: DebugLogger ): Promise { const source = await fsp.readFile(file, "utf-8"); const bundleFiles = await readBundleFiles(file, bundle.name); - // Sequential — not parallel. Both paths import @lwc/compiler internally; - // concurrent dynamic import() of the same ESM module causes a Node race condition. + // Run the two compiler paths sequentially, not via Promise.all. The open-source + // path (transformSync) is a synchronous, CPU-bound call, so overlapping it with the + // platform path yields no throughput win on Node's single thread. Both paths also + // drive the same @lwc/compiler internals; serializing avoids depending on that shared + // machinery being safe to re-enter concurrently. const openSourceDiags = await collectFromTransformSync(source, file, bundle); - const platformDiags = await collectFromPlatformCompile(bundleFiles, bundle); + const platformDiags = await collectFromPlatformCompile(bundleFiles, bundle, file, logDebug); return deduplicateDiagnostics([...openSourceDiags, ...platformDiags]); } @@ -88,7 +98,9 @@ async function collectFromTransformSync( // Path 2: @lwc/sfdc-lwc-compiler platform compile (returns diagnostics, doesn't throw) async function collectFromPlatformCompile( bundleFiles: Record, - bundle: BundleIdentity + bundle: BundleIdentity, + file: string, + logDebug?: DebugLogger ): Promise { try { const sfdcCompiler = await import("@lwc/sfdc-lwc-compiler"); @@ -124,10 +136,11 @@ async function collectFromPlatformCompile( } return diagnostics; - } catch (_err) { - // If platform compile fails entirely (missing deps, version mismatch), fall back silently. - // Open-source path still provides coverage for codes 1001-1213. - // Platform compile unavailable — open-source path still covers codes 1001-1213. + } catch (err) { + // If platform compile fails entirely (missing deps, version mismatch), fall back to the + // open-source path (codes 1001-1213). This is non-fatal, but we surface it at debug level + // so the absence of platform-range diagnostics (1500+) is explainable rather than silent. + logDebug?.(getMessage("PlatformCompilerUnavailable", file, (err as Error).message)); return []; } } diff --git a/packages/code-analyzer-lwc-engine/src/engine.ts b/packages/code-analyzer-lwc-engine/src/engine.ts index 041168d7..897dd063 100644 --- a/packages/code-analyzer-lwc-engine/src/engine.ts +++ b/packages/code-analyzer-lwc-engine/src/engine.ts @@ -63,7 +63,8 @@ export class LwcEngine extends Engine { for (const file of lwcFiles) { try { - const diagnostics = await compileAndCollect(file, bundleIdentity(file)); + const diagnostics = await compileAndCollect(file, bundleIdentity(file), + (msg: string) => this.emitLogEvent(LogLevel.Debug, msg)); for (const d of diagnostics) { const ruleName = `LWC${d.code}`; if (selected.size > 0 && !selected.has(ruleName)) continue; diff --git a/packages/code-analyzer-lwc-engine/src/messages.ts b/packages/code-analyzer-lwc-engine/src/messages.ts index f3f08cdd..52e3b028 100644 --- a/packages/code-analyzer-lwc-engine/src/messages.ts +++ b/packages/code-analyzer-lwc-engine/src/messages.ts @@ -9,6 +9,9 @@ const MESSAGE_CATALOG: { [key: string]: string } = { UnexpectedThrowDuringCompile: `Unexpected error while compiling %s: %s`, + + PlatformCompilerUnavailable: + `Platform compiler unavailable for %s (open-source path still covers codes 1001-1213): %s`, }; export function getMessage(msgId: string, ...args: (string | number)[]): string { diff --git a/packages/code-analyzer-lwc-engine/src/rules.ts b/packages/code-analyzer-lwc-engine/src/rules.ts index d2c922cf..df588793 100644 --- a/packages/code-analyzer-lwc-engine/src/rules.ts +++ b/packages/code-analyzer-lwc-engine/src/rules.ts @@ -17,6 +17,14 @@ interface LWCErrorInfoLike { // CJS cannot require ESM — this is a broken dependency in the published packages. // Workaround: read the .js file from disk and execute it in a VM with a fake require() // that supplies the only constants the file actually needs (DiagnosticLevel enum values). +// +// RESOLUTION PATH (pending team decision): Node ships flagless require(esm) as of +// Node >= 20.19 / >= 22.12. On those versions the inner require("@lwc/errors") no longer +// throws ERR_REQUIRE_ESM, so this VM hack can be deleted and replaced with a plain +// `await import(`${packageName}/dist/errors/errors.js`)`. Doing so requires bumping this +// package's engines floor from ">=20.0.0" to ">=20.19.0" (Node 20.0–20.18 would still +// crash). Whether we can raise the Node floor — here only, or repo-wide (every package is +// currently ">=20.0.0") — is a decision for the team, not the POC. async function loadPlatformErrors(packageName: string): Promise> { const resolvePath = require.resolve(`${packageName}/dist/errors/errors.js`); diff --git a/packages/code-analyzer-lwc-engine/test/bundle.test.ts b/packages/code-analyzer-lwc-engine/test/bundle.test.ts index 910ac558..00cea577 100644 --- a/packages/code-analyzer-lwc-engine/test/bundle.test.ts +++ b/packages/code-analyzer-lwc-engine/test/bundle.test.ts @@ -1,4 +1,6 @@ import path from "node:path"; +import * as fs from "node:fs"; +import * as os from "node:os"; import { isLwcBundleFile, bundleIdentity } from "../src/bundle"; const j = (...p: string[]) => path.sep + path.join(...p); @@ -26,7 +28,51 @@ describe("isLwcBundleFile", () => { }); describe("bundleIdentity", () => { - it("derives name from file stem and namespace defaults to c", () => { + it("derives name from file stem and namespace defaults to c when no manifest exists", () => { expect(bundleIdentity(j("project", "lwc", "foo", "foo.js"))).toEqual({ name: "foo", namespace: "c" }); }); + + describe("namespace resolution from sfdx-project.json", () => { + let tmpRoot: string; + + beforeEach(() => { + tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "lwc-engine-ns-")); + }); + + afterEach(() => { + fs.rmSync(tmpRoot, { recursive: true, force: true }); + }); + + // Build a component file path under tmpRoot and ensure its bundle dir exists. + const componentFile = (name = "foo") => { + const dir = path.join(tmpRoot, "force-app", "main", "default", "lwc", name); + fs.mkdirSync(dir, { recursive: true }); + return path.join(dir, `${name}.js`); + }; + + const writeManifest = (namespace: unknown) => { + const body = namespace === undefined ? {} : { namespace }; + fs.writeFileSync(path.join(tmpRoot, "sfdx-project.json"), JSON.stringify(body)); + }; + + it("reads the declared namespace from an ancestor sfdx-project.json", () => { + writeManifest("myns"); + expect(bundleIdentity(componentFile())).toEqual({ name: "foo", namespace: "myns" }); + }); + + it("falls back to c when the manifest declares no namespace", () => { + writeManifest(undefined); + expect(bundleIdentity(componentFile())).toEqual({ name: "foo", namespace: "c" }); + }); + + it("falls back to c when the manifest namespace is blank", () => { + writeManifest(" "); + expect(bundleIdentity(componentFile())).toEqual({ name: "foo", namespace: "c" }); + }); + + it("falls back to c when the manifest is malformed JSON", () => { + fs.writeFileSync(path.join(tmpRoot, "sfdx-project.json"), "{ not valid json"); + expect(bundleIdentity(componentFile())).toEqual({ name: "foo", namespace: "c" }); + }); + }); }); diff --git a/packages/code-analyzer-lwc-engine/test/severity.test.ts b/packages/code-analyzer-lwc-engine/test/severity.test.ts index 6c912c21..a5a93645 100644 --- a/packages/code-analyzer-lwc-engine/test/severity.test.ts +++ b/packages/code-analyzer-lwc-engine/test/severity.test.ts @@ -4,8 +4,8 @@ import { toSeverityLevel } from "../src/severity"; describe("toSeverityLevel", () => { it.each([ [0, SeverityLevel.Critical], // Fatal - [1, SeverityLevel.High], // Error - [2, SeverityLevel.Moderate], // Warning + [1, SeverityLevel.Critical], // Error + [2, SeverityLevel.High], // Warning [3, SeverityLevel.Info], // Log ])("DiagnosticLevel %i maps to SeverityLevel %i", (level, expected) => { expect(toSeverityLevel(level)).toBe(expected);