diff --git a/.github/workflows/validate-code.yml b/.github/workflows/validate-code.yml index 4fae304..474cc85 100644 --- a/.github/workflows/validate-code.yml +++ b/.github/workflows/validate-code.yml @@ -14,5 +14,7 @@ jobs: cache: 'npm' - name: Install Dependencies run: npm ci + - name: Run formatter + run: npm run format:check - name: Run linter run: npm run lint diff --git a/.gitignore b/.gitignore index 417f992..5f478f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .DS_Store .idea/ -.vscode/ node_modules/ .env diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..304e0f6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,65 @@ +{ + "editor.indentSize": "tabSize", + "editor.tabSize": 2, + "files.insertFinalNewline": true, + "[brightscript]": { + "editor.defaultFormatter": "bchelkowski.vscode-kopytko" + }, + "brightscript.languageServer.enabled": false, + "kopytko.imports.resolveModules": true, + "kopytko.casing.keyword": "lower-case", + "kopytko.casing.type": "pascal-case", + "kopytko.casing.literal": "lower-case", + "kopytko.casing.logicOperator": "upper-case", + "kopytko.casing.mathOperator": "upper-case", + "kopytko.casing.builtin": "pascal-case", + "kopytko.casing.method": "camel-case", + "kopytko.casing.userFunction": "preserve", + "kopytko.casing.userMethod": "preserve", + "kopytko.casing.exact": { + "invalid": "Invalid" + }, + // -- Linter -- + "kopytko.lint.rules.type/missing-param-type": "off", + "kopytko.lint.rules.type/missing-return-type": "off", + // -- Formatter -- + "kopytko.format.indentSize": 2, + "kopytko.format.useTabs": false, + "kopytko.format.trimTrailingWhitespace": true, + "kopytko.format.insertFinalNewline": true, + "kopytko.format.maxEmptyLines": 1, + "kopytko.format.emptyLinesBetweenFunctions": 1, + "kopytko.format.emptyLinesBetweenMethods": 1, + "kopytko.format.emptyLinesAtBlockBoundaries": "strip", + "kopytko.format.emptyLineBeforeReturn": "not-alone", + "kopytko.format.endKeywordStyle": "spaced", + "kopytko.format.thenStyle": "singleline-only", + "kopytko.format.functionVsSubForVoid": "sub", + "kopytko.format.spaceAfterCommentMarker": true, + "kopytko.format.spaceAroundAssignment": true, + "kopytko.format.spaceAroundOperators": true, + "kopytko.format.spaceBeforeNamedFunctionParens": false, + "kopytko.format.spaceBeforeAnonymousFunctionParens": true, + "kopytko.format.spaceBeforeCallParens": false, + "kopytko.format.spaceInsideParens": "never", + "kopytko.format.arrayCommaStyle": "always", + "kopytko.format.arraySplitOpenBracket": true, + "kopytko.format.associativeArrayBracketSpacing": true, + "kopytko.format.associativeArrayCommaStyle": "always", + "kopytko.format.associativeArrayCommaSpacing": "after", + "kopytko.format.trailingComma": "always", + "kopytko.format.commentStyle": "'", + "kopytko.format.unarySpacing": true, + "kopytko.format.sortImports": true, + "kopytko.format.emptyLineAfterImports": true, + "kopytko.format.parenthesisIfCase": "always", + "kopytko.format.elseOnNewLine": true, + "kopytko.format.forLoopSpacing": true, + "kopytko.format.observeFieldStyle": "always-scoped", + "kopytko.format.mPrefixStyle": "preserve", + "kopytko.format.fieldAccessConsistency": "preserve", + "kopytko.format.printStatement": "warn", + "kopytko.format.alignAssignments": false, + "kopytko.format.maxLineLength": 160, + "kopytko.format.wrapLongStrings": "array-join" +} diff --git a/package-lock.json b/package-lock.json index 79e1d94..a32b61c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "2.6.3", "license": "MIT", "dependencies": { - "fs-extra": "^11.3.4", - "glob": "^10.4.5" + "fs-extra": "^11.3.5", + "glob": "^10.5.0" }, "devDependencies": { "@babel/core": "^7.29.0", @@ -18,18 +18,19 @@ "@babel/preset-env": "^7.29.2", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^12.0.6", - "eslint": "^8.57.1", - "semantic-release": "^25.0.3" + "@semantic-release/github": "^12.0.8", + "kopytko-formatter": "^1.1.2", + "kopytko-linter": "^1.3.1", + "semantic-release": "^25.0.5" }, "peerDependencies": { "@dazn/kopytko-packager": "^1.4.2" } }, "node_modules/@actions/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz", - "integrity": "sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.1.tgz", + "integrity": "sha512-a6d/Nwahm9fliVGRhdhofo40HjHQasUPusmc7vBfyky+7Z+P2A1J68zyFVaNcEclc/Se+eO595oAr5nwEIoIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -48,9 +49,9 @@ } }, "node_modules/@actions/http-client": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.0.tgz", - "integrity": "sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.1.tgz", + "integrity": "sha512-+Nvd1ImaOZBSoPbsUtEhv+1z99H12xzncCkz0a3RuehINE81FZSe2QTj3uvAPTcJX/SCzUQHQ0D1GrPMbrPitg==", "dev": true, "license": "MIT", "dependencies": { @@ -59,9 +60,9 @@ } }, "node_modules/@actions/http-client/node_modules/undici": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz", - "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", + "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", "dev": true, "license": "MIT", "engines": { @@ -76,13 +77,13 @@ "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -91,9 +92,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -101,21 +102,21 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -132,9 +133,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.6.tgz", - "integrity": "sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.29.7.tgz", + "integrity": "sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw==", "dev": true, "license": "MIT", "dependencies": { @@ -151,14 +152,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -168,27 +169,27 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -198,18 +199,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", "semver": "^6.3.1" }, "engines": { @@ -220,13 +221,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-annotate-as-pure": "^7.29.7", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, @@ -255,9 +256,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -265,43 +266,43 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "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" @@ -311,22 +312,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { @@ -334,15 +335,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@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" @@ -352,15 +353,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -370,23 +371,23 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -394,9 +395,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -404,9 +405,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -414,42 +415,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@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", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -459,14 +460,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -476,13 +477,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -492,13 +493,30 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -508,15 +526,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -526,14 +544,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -556,13 +574,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -572,13 +590,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -605,13 +623,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -621,15 +639,15 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -639,15 +657,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", "dev": true, "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" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -657,13 +675,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -673,13 +691,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -689,14 +707,14 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -706,14 +724,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -723,18 +741,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -744,14 +762,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -761,14 +779,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -778,14 +796,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -795,13 +813,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -811,14 +829,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -828,13 +846,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -844,14 +862,14 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -861,13 +879,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -877,13 +895,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -893,14 +911,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -910,15 +928,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -928,13 +946,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -944,13 +962,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -960,13 +978,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -976,13 +994,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -992,14 +1010,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1009,14 +1027,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1026,16 +1044,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1045,14 +1063,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1062,14 +1080,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1079,13 +1097,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1095,13 +1113,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1111,13 +1129,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1127,17 +1145,17 @@ } }, "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==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", "dev": true, "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" + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1147,14 +1165,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1164,13 +1182,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1180,14 +1198,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1197,13 +1215,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1213,14 +1231,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1230,15 +1248,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1248,13 +1266,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1264,13 +1282,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", + "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1280,14 +1298,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1297,13 +1315,13 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1313,13 +1331,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1329,14 +1347,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", + "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1346,13 +1364,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1362,13 +1380,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1378,13 +1396,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1394,13 +1412,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1410,14 +1428,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1427,14 +1445,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1444,14 +1462,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1461,76 +1479,77 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.29.0", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.29.0", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.15", "babel-plugin-polyfill-corejs3": "^0.14.0", @@ -1561,33 +1580,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@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", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -1595,14 +1614,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1659,6 +1678,7 @@ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -1678,6 +1698,7 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1691,58 +1712,159 @@ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1751,6 +1873,7 @@ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=12.22" }, @@ -1759,13 +1882,20 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -1784,21 +1914,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1859,44 +1974,6 @@ "eslint-scope": "5.1.1" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@octokit/auth-token": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", @@ -2014,16 +2091,16 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", - "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.10.tgz", + "integrity": "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w==", "dev": true, "license": "MIT", "dependencies": { "@octokit/endpoint": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", - "fast-content-type-parse": "^3.0.0", + "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, @@ -2095,9 +2172,9 @@ "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", - "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz", + "integrity": "sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==", "dev": true, "license": "MIT", "dependencies": { @@ -2192,9 +2269,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.6.tgz", - "integrity": "sha512-aYYFkwHW3c6YtHwQF0t0+lAjlU+87NFOZuH2CvWFD0Ylivc7MwhZMiHOJ0FMpIgPpCVib/VUAcOwvrW0KnxQtA==", + "version": "12.0.8", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.8.tgz", + "integrity": "sha512-tej5AAgK5X9wHRoDmYhecMXEHEkFeGOY1XsEblKxu8pIQwahzf1STYyr7iPU6Lpbg6C5I3N2w/ocXrBo+L7jhw==", "dev": true, "license": "MIT", "dependencies": { @@ -2206,8 +2283,8 @@ "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", + "http-proxy-agent": "^9.0.0", + "https-proxy-agent": "^9.0.0", "issue-parser": "^7.0.0", "lodash-es": "^4.17.21", "mime": "^4.0.0", @@ -2489,9 +2566,9 @@ } }, "node_modules/@semantic-release/npm/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "bin": { @@ -2541,9 +2618,9 @@ } }, "node_modules/@semantic-release/release-notes-generator": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.0.tgz", - "integrity": "sha512-CcyDRk7xq+ON/20YNR+1I/jP7BYKICr1uKd1HHpROSnnTdGqOTburi4jcRiTYz0cpfhxSloQO3cGhnoot7IEkA==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.1.tgz", + "integrity": "sha512-Pbd2e2XRMUD0OxehHpgd5/YghsE76cddkRHSoDvKLK+OCy4Ewxn49rWR631MEUU01lgwF/uyVXvbnVuu6+Z6VA==", "dev": true, "license": "MIT", "dependencies": { @@ -2552,9 +2629,7 @@ "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", - "get-stream": "^7.0.0", "import-from-esm": "^2.0.0", - "into-stream": "^7.0.0", "lodash-es": "^4.17.21", "read-package-up": "^11.0.0" }, @@ -2565,19 +2640,6 @@ "semantic-release": ">=20.1.0" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", - "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@semantic-release/release-notes-generator/node_modules/hosted-git-info": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", @@ -2670,9 +2732,9 @@ } }, "node_modules/@semantic-release/release-notes-generator/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "bin": { @@ -2747,6 +2809,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -2754,19 +2832,13 @@ "dev": true, "license": "MIT" }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2780,14 +2852,15 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", "license": "MIT", "peer": true, "engines": { @@ -2795,13 +2868,13 @@ } }, "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", + "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/aggregate-error": { @@ -2819,11 +2892,12 @@ } }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2976,9 +3050,9 @@ "peer": true }, "node_modules/baseline-browser-mapping": { - "version": "2.10.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", - "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", + "version": "2.10.38", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3015,9 +3089,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { @@ -3039,9 +3113,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ { @@ -3059,11 +3133,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -3108,9 +3182,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001781", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", - "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", "dev": true, "funding": [ { @@ -3206,6 +3280,16 @@ "npm": ">=5.0.0" } }, + "node_modules/cli-highlight/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cli-highlight/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3240,6 +3324,19 @@ "node": ">=8" } }, + "node_modules/cli-highlight/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-highlight/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3316,6 +3413,16 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3338,6 +3445,19 @@ "node": ">=8" } }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", @@ -3391,22 +3511,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", @@ -3482,10 +3586,24 @@ "proto-list": "~1.2.1" } }, + "node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/conventional-changelog-angular": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.0.tgz", - "integrity": "sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", "dev": true, "license": "ISC", "dependencies": { @@ -3516,9 +3634,9 @@ } }, "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "bin": { @@ -3539,9 +3657,9 @@ } }, "node_modules/conventional-commits-parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.3.0.tgz", - "integrity": "sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", "dev": true, "license": "MIT", "dependencies": { @@ -3597,9 +3715,9 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", - "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, "license": "MIT", "dependencies": { @@ -3709,7 +3827,8 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/defaults": { "version": "1.0.4", @@ -3737,19 +3856,6 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -3764,9 +3870,9 @@ } }, "node_modules/dotenv": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", - "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", "license": "BSD-2-Clause", "peer": true, "engines": { @@ -3826,9 +3932,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.323", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.323.tgz", - "integrity": "sha512-oQm+FxbazvN2WICCbvJgj3IYPKV8awip57+W5VP+Aatk4kFU4pDYCPHZOX22Z27zpw8uttBehEqgK+VTJAYrVw==", + "version": "1.5.375", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.375.tgz", + "integrity": "sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q==", "dev": true, "license": "ISC" }, @@ -4036,6 +4142,16 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4052,6 +4168,7 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -4060,60 +4177,64 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@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.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "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": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-scope": { @@ -4141,30 +4262,32 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "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", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -4176,36 +4299,39 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -4217,6 +4343,7 @@ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -4230,6 +4357,7 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } @@ -4301,53 +4429,29 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT", + "peer": true }, "node_modules/figures": { "version": "6.1.0", @@ -4379,16 +4483,17 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "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", + "peer": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -4410,6 +4515,7 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4452,18 +4558,18 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "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", + "peer": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { @@ -4471,7 +4577,8 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/foreground-child": { "version": "3.3.1", @@ -4501,54 +4608,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/from2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -4559,13 +4622,6 @@ "node": ">=14.14" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4610,9 +4666,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { @@ -4677,6 +4733,7 @@ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -4685,9 +4742,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -4709,16 +4766,14 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "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": { - "type-fest": "^0.20.2" - }, + "peer": true, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4730,17 +4785,10 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4769,9 +4817,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -4805,9 +4853,9 @@ } }, "node_modules/hosted-git-info": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", - "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", "dev": true, "license": "ISC", "dependencies": { @@ -4818,9 +4866,9 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -4828,31 +4876,33 @@ } }, "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz", + "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", + "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/human-signals": { @@ -4892,6 +4942,7 @@ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 4" } @@ -4944,6 +4995,7 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.19" } @@ -4971,18 +5023,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -4996,23 +5036,6 @@ "dev": true, "license": "ISC" }, - "node_modules/into-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", - "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/iota-array": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", @@ -5035,13 +5058,13 @@ "peer": true }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -5056,6 +5079,7 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -5075,6 +5099,7 @@ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5112,16 +5137,6 @@ "node": ">=8" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -5175,9 +5190,9 @@ "license": "ISC" }, "node_modules/issue-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", - "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.2.tgz", + "integrity": "sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==", "dev": true, "license": "MIT", "dependencies": { @@ -5231,10 +5246,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -5261,7 +5286,8 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-parse-better-errors": { "version": "1.0.2", @@ -5282,14 +5308,16 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-with-bigint": { "version": "3.5.8", @@ -5312,9 +5340,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -5329,10 +5357,53 @@ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "json-buffer": "3.0.1" } }, + "node_modules/kopytko-brightscript-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/kopytko-brightscript-parser/-/kopytko-brightscript-parser-1.0.2.tgz", + "integrity": "sha512-3kc5DlJ1djpVDDuGri7VMXqSCUWb69UsSPbW4PjDuL+OAlK60BRovNTqXOEEuyeWlRUk4zWu0SGFDFYdWgAPcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=24.0.0" + } + }, + "node_modules/kopytko-formatter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/kopytko-formatter/-/kopytko-formatter-1.1.2.tgz", + "integrity": "sha512-Bj4htrebO47IqURwHHYHLocS2IhqHyOyCZxL3kSIDGh1eVoZ6pEHZ03cjrhIQlmKQwlZes7PzyCdsGueT6jshg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kopytko-brightscript-parser": "^1.0.2" + }, + "bin": { + "kopytko-format": "dist/bin/kopytko-format.js" + }, + "engines": { + "node": ">=24.0.0" + } + }, + "node_modules/kopytko-linter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/kopytko-linter/-/kopytko-linter-1.3.1.tgz", + "integrity": "sha512-c2Q5gio9V6FmEBRcuoBtsvvXCmdLuG4c/C8qism3Mw44rqa0Mu+mAEKkml3yPGcBQGz/kMex8N5Vd4kwqDf0Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kopytko-brightscript-parser": "^1.0.2" + }, + "bin": { + "kopytko-lint": "dist/bin/kopytko-lint.js" + }, + "engines": { + "node": ">=24.0.0" + } + }, "node_modules/latinize": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/latinize/-/latinize-0.5.0.tgz", @@ -5356,6 +5427,7 @@ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5407,6 +5479,7 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -5418,15 +5491,15 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "dev": true, "license": "MIT" }, @@ -5470,7 +5543,8 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/lodash.uniqby": { "version": "4.7.0", @@ -5699,7 +5773,8 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ndarray": { "version": "1.0.19", @@ -5773,11 +5848,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "version": "2.0.48", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", + "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-package-data": { "version": "8.0.0", @@ -5795,9 +5873,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "bin": { @@ -5808,9 +5886,9 @@ } }, "node_modules/normalize-url": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.0.tgz", - "integrity": "sha512-z9nC87iaZXXySbWWtTHfCFJyFvKaUAW6lODhikG7ILSbVgmwuFjUqkgnheHvAUcGedO29e2QGBRXMUD64aurqQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.1.tgz", + "integrity": "sha512-ARftfC5HdUNu9jJeL8pHj8debUIHA2b91FizCoMzY4lG6dDX13jdvTK0TBe24IBDRf2HvJSzzwEPvmbkQWHRSg==", "dev": true, "license": "MIT", "engines": { @@ -5821,9 +5899,9 @@ } }, "node_modules/npm": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.12.0.tgz", - "integrity": "sha512-xPhOap4ZbJWyd7DAOukP564WFwNSGu/2FeTRFHhiiKthcauxhH/NpkJAQm24xD+cAn8av5tQ00phi98DqtfLsg==", + "version": "11.17.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.17.0.tgz", + "integrity": "sha512-PurxiZexEHDTE4SSaLI3ZrnbAGiZfeyUcQcxcP5D+hfytNAze/D1IzDuInTn9XVLIbAQUnQuSPXJx02LHjLvQw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -5902,8 +5980,8 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.4.2", - "@npmcli/config": "^10.8.0", + "@npmcli/arborist": "^9.8.0", + "@npmcli/config": "^10.11.0", "@npmcli/fs": "^5.0.0", "@npmcli/map-workspaces": "^5.0.3", "@npmcli/metavuln-calculator": "^9.0.3", @@ -5921,27 +5999,27 @@ "fs-minipass": "^3.0.3", "glob": "^13.0.6", "graceful-fs": "^4.2.11", - "hosted-git-info": "^9.0.2", + "hosted-git-info": "^9.0.3", "ini": "^6.0.0", "init-package-json": "^8.2.5", - "is-cidr": "^6.0.3", + "is-cidr": "^6.0.4", "json-parse-even-better-errors": "^5.0.0", "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.5", - "libnpmexec": "^10.2.5", - "libnpmfund": "^7.0.19", + "libnpmdiff": "^8.1.10", + "libnpmexec": "^10.3.0", + "libnpmfund": "^7.0.24", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.5", - "libnpmpublish": "^11.1.3", + "libnpmpack": "^9.1.10", + "libnpmpublish": "^11.2.0", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", - "libnpmversion": "^8.0.3", - "make-fetch-happen": "^15.0.5", - "minimatch": "^10.2.4", + "libnpmversion": "^8.0.4", + "make-fetch-happen": "^15.0.6", + "minimatch": "^10.2.5", "minipass": "^7.1.3", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^12.2.0", + "node-gyp": "^12.4.0", "nopt": "^9.0.0", "npm-audit-report": "^7.0.0", "npm-install-checks": "^8.0.0", @@ -5951,16 +6029,16 @@ "npm-registry-fetch": "^19.1.1", "npm-user-validate": "^4.0.0", "p-map": "^7.0.4", - "pacote": "^21.5.0", + "pacote": "^21.5.1", "parse-conflict-json": "^5.0.1", "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", "read": "^5.0.1", - "semver": "^7.7.4", + "semver": "^7.8.4", "spdx-expression-parse": "^4.0.0", "ssri": "^13.0.1", "supports-color": "^10.2.2", - "tar": "^7.5.11", + "tar": "^7.5.16", "text-table": "~0.2.0", "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", @@ -6016,7 +6094,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { - "version": "4.0.0", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -6032,7 +6110,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.4.2", + "version": "9.8.0", "dev": true, "inBundle": true, "license": "ISC", @@ -6080,7 +6158,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.8.0", + "version": "10.11.0", "dev": true, "inBundle": true, "license": "ISC", @@ -6274,7 +6352,7 @@ } }, "node_modules/npm/node_modules/@sigstore/core": { - "version": "3.2.0", + "version": "3.2.1", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -6283,7 +6361,7 @@ } }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.5.0", + "version": "0.5.1", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -6322,13 +6400,13 @@ } }, "node_modules/npm/node_modules/@sigstore/verify": { - "version": "3.1.0", + "version": "3.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { @@ -6397,7 +6475,7 @@ } }, "node_modules/npm/node_modules/bin-links": { - "version": "6.0.0", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -6425,7 +6503,7 @@ } }, "node_modules/npm/node_modules/brace-expansion": { - "version": "5.0.4", + "version": "5.0.6", "dev": true, "inBundle": true, "license": "MIT", @@ -6494,7 +6572,7 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.3", + "version": "5.0.5", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -6550,7 +6628,7 @@ } }, "node_modules/npm/node_modules/diff": { - "version": "8.0.3", + "version": "8.0.4", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -6618,7 +6696,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "9.0.2", + "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", @@ -6717,7 +6795,7 @@ } }, "node_modules/npm/node_modules/ip-address": { - "version": "10.1.0", + "version": "10.2.0", "dev": true, "inBundle": true, "license": "MIT", @@ -6726,12 +6804,12 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^5.0.1" + "cidr-regex": "^5.0.4" }, "engines": { "node": ">=20" @@ -6799,12 +6877,12 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.1.5", + "version": "8.1.10", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.4.2", + "@npmcli/arborist": "^9.8.0", "@npmcli/installed-package-contents": "^4.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", @@ -6818,13 +6896,13 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "10.2.5", + "version": "10.3.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", - "@npmcli/arborist": "^9.4.2", + "@npmcli/arborist": "^9.8.0", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", @@ -6841,12 +6919,12 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.19", + "version": "7.0.24", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.4.2" + "@npmcli/arborist": "^9.8.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -6866,12 +6944,12 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "9.1.5", + "version": "9.1.10", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.4.2", + "@npmcli/arborist": "^9.8.0", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" @@ -6881,7 +6959,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "11.1.3", + "version": "11.2.0", "dev": true, "inBundle": true, "license": "ISC", @@ -6925,7 +7003,7 @@ } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "8.0.3", + "version": "8.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -6941,7 +7019,7 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "11.2.7", + "version": "11.5.1", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -6950,7 +7028,7 @@ } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.5", + "version": "15.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -6973,12 +7051,12 @@ } }, "node_modules/npm/node_modules/minimatch": { - "version": "10.2.4", + "version": "10.2.5", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -7026,35 +7104,17 @@ } }, "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", + "version": "1.0.6", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", "dev": true, @@ -7134,7 +7194,7 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "12.2.0", + "version": "12.4.0", "dev": true, "inBundle": true, "license": "MIT", @@ -7142,12 +7202,12 @@ "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^15.0.0", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", + "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { @@ -7311,7 +7371,7 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "21.5.0", + "version": "21.5.1", "dev": true, "inBundle": true, "license": "ISC", @@ -7372,7 +7432,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.1", + "version": "7.1.4", "dev": true, "inBundle": true, "license": "MIT", @@ -7469,7 +7529,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.7.4", + "version": "7.8.4", "dev": true, "inBundle": true, "license": "ISC", @@ -7493,17 +7553,17 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "4.1.0", + "version": "4.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", + "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.0", - "@sigstore/tuf": "^4.0.1", - "@sigstore/verify": "^3.1.0" + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -7520,12 +7580,12 @@ } }, "node_modules/npm/node_modules/socks": { - "version": "2.8.7", + "version": "2.8.9", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", + "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -7594,7 +7654,7 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "7.5.11", + "version": "7.5.16", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -7622,13 +7682,13 @@ "license": "MIT" }, "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.15", + "version": "0.2.17", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -7655,7 +7715,7 @@ } }, "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", "dev": true, "inBundle": true, "license": "MIT", @@ -7689,6 +7749,15 @@ "node": "^20.17.0 || >=22.9.0" } }, + "node_modules/npm/node_modules/undici": { + "version": "6.26.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", "dev": true, @@ -7764,17 +7833,7 @@ "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", "license": "MIT", - "peer": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } + "peer": true }, "node_modules/onetime": { "version": "5.1.2", @@ -7797,6 +7856,7 @@ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -7833,6 +7893,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-each-series": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", @@ -7878,22 +7961,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -7910,6 +7984,7 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -8047,20 +8122,11 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -8232,6 +8298,7 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -8266,37 +8333,35 @@ "dev": true, "license": "ISC" }, + "node_modules/proxy-agent-negotiate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", + "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "kerberos": "^2.0.0" + }, + "peerDependenciesMeta": { + "kerberos": { + "optional": true + } + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -8341,22 +8406,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-package-up/node_modules/type-fest": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", - "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/read-pkg": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz", @@ -8408,22 +8457,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", - "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -8498,9 +8531,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8521,12 +8554,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -8565,80 +8599,6 @@ "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -8671,9 +8631,9 @@ } }, "node_modules/semantic-release": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.3.tgz", - "integrity": "sha512-WRgl5GcypwramYX4HV+eQGzUbD7UUbljVmS+5G1uMwX/wLgYuJAxGeerXJDMO2xshng4+FXqCgyB5QfClV6WjA==", + "version": "25.0.5", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.5.tgz", + "integrity": "sha512-mn61SUJwtM8ThrWn2WmgLVpwVJeG/hPSupua1psdMoufmwRIPyvRLkRkL0JDXkP67OntlLWUYnBnfVc8EDO3/g==", "dev": true, "license": "MIT", "dependencies": { @@ -8903,9 +8863,9 @@ } }, "node_modules/semantic-release/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "bin": { @@ -9302,13 +9262,34 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/string-width/node_modules/strip-ansi": { + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", @@ -9323,18 +9304,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", @@ -9357,15 +9326,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -9392,6 +9352,7 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -9547,13 +9508,6 @@ "node": ">=16.13.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -9638,14 +9592,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -9712,9 +9666,9 @@ } }, "node_modules/tree-kit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.8.8.tgz", - "integrity": "sha512-L7zwpXp0/Nha6mljVcVOnhhxuCkFRWmt26wza3TKnyMBewid4F2vyiVdcSsw41ZoG1Wj+3lM48Er9lhttbxfLA==", + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.8.10.tgz", + "integrity": "sha512-mwuV3lHL+utI9z7vxah/27wrMJprx925xhkw1N4KuGa1dqIi0DLHWfXJpHEyR+ZI0Ij80zN58ztiGp3KlH0wtw==", "license": "MIT", "peer": true, "engines": { @@ -9737,6 +9691,7 @@ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -9745,13 +9700,16 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", + "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", "dev": true, "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9772,9 +9730,9 @@ } }, "node_modules/undici": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", - "integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "dev": true, "license": "MIT", "engines": { @@ -9924,6 +9882,7 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -9993,6 +9952,7 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -10039,6 +9999,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -10059,6 +10028,18 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", @@ -10071,28 +10052,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/xml2js": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", @@ -10197,28 +10156,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index e7773b7..ed11b11 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,10 @@ "version": "2.6.3", "description": "Kopytko Unit Testing Framework", "scripts": { - "lint": "eslint ./" + "format": "kopytko-format --write \"src/**/*.brs\"", + "format:check": "kopytko-format --check \"src/**/*.brs\"", + "lint": "kopytko-lint --check --source-dir src", + "lint:fix": "kopytko-lint --fix --source-dir src" }, "keywords": [ "roku", @@ -36,8 +39,8 @@ }, "kopytkoModuleDir": "src/", "dependencies": { - "fs-extra": "^11.3.4", - "glob": "^10.4.5" + "fs-extra": "^11.3.5", + "glob": "^10.5.0" }, "devDependencies": { "@babel/core": "^7.29.0", @@ -45,9 +48,10 @@ "@babel/preset-env": "^7.29.2", "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^12.0.6", - "eslint": "^8.57.1", - "semantic-release": "^25.0.3" + "@semantic-release/github": "^12.0.8", + "kopytko-formatter": "^1.1.2", + "kopytko-linter": "^1.3.1", + "semantic-release": "^25.0.5" }, "peerDependencies": { "@dazn/kopytko-packager": "^1.4.2" diff --git a/src/components/KopytkoExpect.brs b/src/components/KopytkoExpect.brs index 04514d1..7ff26ec 100644 --- a/src/components/KopytkoExpect.brs +++ b/src/components/KopytkoExpect.brs @@ -18,10 +18,9 @@ ' toThrow ' not - ' ---------------------------------------------------------------- -' The expect function is used every time you want to test a value. -' You will rarely call expect by itself. +' The expect function is used every time you want to test a value. +' You will rarely call expect by itself. ' Instead, you will use expect along with a "matcher" function to assert something about a value ' @param value (dynamic) - Value which needs to be asserted @@ -30,7 +29,7 @@ ' ---------------------------------------------------------------- function expect(value as Dynamic) as Object context = {} - context._ts = GetGlobalAA()["$$ts"] + context._ts = GetGlobalAA()["$$testSuite"] context._received = Invalid context._isNot = false @@ -43,7 +42,7 @@ function expect(value as Dynamic) as Object ' To compare primitive values or to check referential identity of node instances ' It fails for object types as object referencee check is not supported in BrightScript ' - ' @param value (dynamic) - Expected value + ' @param value (dynamic) - Expected value ' ' @return Empty string (if equal) OR an error message ' ---------------------------------------------------------------- @@ -162,7 +161,7 @@ function expect(value as Dynamic) as Object ' ---------------------------------------------------------------- ' To ensure if value is eqaul to the expected value ' - ' @param value (dynamic) - Expected value + ' @param value (dynamic) - Expected value ' ' @return Empty string (if equal) OR an error message ' ---------------------------------------------------------------- @@ -229,14 +228,14 @@ function expect(value as Dynamic) as Object MATCHER_NAME = "toHaveBeenCalled()" EXPECTED_STR = "Expected number of calls" RECEIVED_STR = "Received number of calls" - + methodMock = m._ts.getProperty(GetGlobalAA().__mocks, m._received, { calls: [] }) numberOfCalls = 0 - + if (TF_Utils__IsValid(methodMock.calls)) numberOfCalls = methodMock.calls.count() end if - + passed = (numberOfCalls > 0) ' if matcher has been called with expect.not passed = m._ts.ternary(m._isNot, NOT passed, passed) @@ -258,7 +257,7 @@ function expect(value as Dynamic) as Object methodMock = m._ts.getProperty(GetGlobalAA().__mocks, m._received, { calls: [] }) numberOfCalls = 0 - + if (TF_Utils__IsValid(methodMock.calls)) numberOfCalls = methodMock.calls.count() end if @@ -382,7 +381,7 @@ function expect(value as Dynamic) as Object ' ---------------------------------------------------------------- ' To ensure if Array or AssociativeArray has expected length ' - ' @param number (dynamic) - Expected length + ' @param number (dynamic) - Expected length ' ' @return Empty string (if expected length) OR an error message ' ---------------------------------------------------------------- @@ -533,10 +532,10 @@ function expect(value as Dynamic) as Object ' Set the "", fields[key].subtype(), Chr(34), fields[key].id, Chr(34)) - ' It is possible for a user to pass somewhere self-reference to the tested entity. - ' We can recognize it by $$ts field that we add to it. - ' Set the "" string instead. - else if (m._isAssociativeArray(fields[key]) AND fields[key]["$$ts"] <> Invalid) + ' It is possible for a user to pass somewhere self-reference to the tested entity. + ' We can recognize it by $$testSuite field that we add to it. + ' Set the "" string instead. + else if (m._isAssociativeArray(fields[key]) AND fields[key]["$$testSuite"] <> Invalid) destination[key] = "" else destination[key] = m._prepareToFormat(fields[key]) @@ -563,7 +562,7 @@ function expect(value as Dynamic) as Object context._isList = function (value as Dynamic) as Boolean return TF_Utils__IsValid(value) AND m._ts.getType(value) = "roList" end function - + context._assertNodeContains = function (node as Object, subset as Dynamic) as String if (m._isAssociativeArray(subset)) obj = node.getFields() @@ -616,6 +615,7 @@ function expect(value as Dynamic) as Object notExpect = {} notExpect.append(this) notExpect.addReplace("_isNot", true) + return notExpect end function)(context) diff --git a/src/components/KopytkoFrameworkTestSuite.brs b/src/components/KopytkoFrameworkTestSuite.brs index 7472db7..ef2ccd3 100644 --- a/src/components/KopytkoFrameworkTestSuite.brs +++ b/src/components/KopytkoFrameworkTestSuite.brs @@ -1,4 +1,5 @@ ' @import /components/KopytkoTestSuite.brs + function KopytkoFrameworkTestSuite() as Object ts = KopytkoTestSuite() @@ -14,7 +15,7 @@ function KopytkoFrameworkTestSuite() as Object end if end sub) - ts._beforeEach.push(sub (ts as Object) + ts._beforeEach.push(sub (_ts as Object) componentAA = GetGlobalAA() componentAA.global.removeField("eventBus") end sub) @@ -28,7 +29,7 @@ function KopytkoFrameworkTestSuite() as Object ' Setting defaultProps only for Kopytko components because other components may have observers set in the init() ' function (should be avoided in Kopytko) and setting defaultProps after each test would call these callbacks if (componentInterface.isSubtype("KopytkoGroup")) - ts = GetGlobalAA()["$$ts"] + ts = GetGlobalAA()["$$testSuite"] ts._defaultProps = componentInterface.getFields() ts._defaultProps.delete("change") ts._defaultProps.delete("focusedChild") @@ -41,7 +42,7 @@ function KopytkoFrameworkTestSuite() as Object end sub) ts._afterEach.push(sub () - ts = GetGlobalAA()["$$ts"] + ts = GetGlobalAA()["$$testSuite"] ts._clearComponent(m) end sub) #end if @@ -61,8 +62,8 @@ function KopytkoFrameworkTestSuite() as Object end function ts._clearComponent = sub (componentScope as Object) - if (Type(destroyKopytko) <> "Invalid") - destroyKopytko() + if (Type(destroyKopytko) <> "Invalid") ' kopytko-disable-line identifier/undefined-variable + destroyKopytko() ' kopytko-disable-line identifier/undefined-function componentScope.top.setFocus(true) ' Unobserving fields only of Kopytko components because non-kopytko may set up observers in the init() function diff --git a/src/components/KopytkoMockFunction.brs b/src/components/KopytkoMockFunction.brs index 6b1232f..1927bfa 100644 --- a/src/components/KopytkoMockFunction.brs +++ b/src/components/KopytkoMockFunction.brs @@ -2,7 +2,7 @@ function mockFunction(functionName as String) as Object _globalAA = GetGlobalAA() context = {} context._functionName = functionName - context._ts = _globalAA["$$ts"] + context._ts = _globalAA["$$testSuite"] if (_globalAA["__mocks"] = Invalid) _globalAA["__mocks"] = {} @@ -81,8 +81,8 @@ function mockFunction(functionName as String) as Object ' @param value (dynamic) - Expected value ' ---------------------------------------------------------------- context.resolvedValue = sub (value as Dynamic) - if (PromiseResolve <> Invalid) - m._mock.returnValue = PromiseResolve(value) + if (PromiseResolve <> Invalid) ' kopytko-disable-line identifier/undefined-variable + m._mock.returnValue = PromiseResolve(value) ' kopytko-disable-line identifier/undefined-function else error = [ "To mock resolvedValue you need to import PromiseResolve from @dazn/kopytko-utils in your test", @@ -99,8 +99,8 @@ function mockFunction(functionName as String) as Object ' @param error (dynamic) - Expected error ' ---------------------------------------------------------------- context.rejectedValue = sub (error as Dynamic) - if (PromiseReject <> Invalid) - m._mock.returnValue = PromiseReject(error) + if (PromiseReject <> Invalid) ' kopytko-disable-line identifier/undefined-variable + m._mock.returnValue = PromiseReject(error) ' kopytko-disable-line identifier/undefined-function else error = [ "To mock rejectedValue you need to import PromiseReject from @dazn/kopytko-utils in your test", diff --git a/src/components/KopytkoTestFunctions.brs b/src/components/KopytkoTestFunctions.brs index 1b6fa0a..d1b581a 100644 --- a/src/components/KopytkoTestFunctions.brs +++ b/src/components/KopytkoTestFunctions.brs @@ -2,14 +2,14 @@ ' Calls ts.addTest with the same arguments ' ---------------------------------------------------------------- sub test(testName as String, func as Function) - ts().addTest(testName, func) + getTestSuite().addTest(testName, func) end sub ' ---------------------------------------------------------------- ' Calls ts.addParameterizedTests with the same arguments ' ---------------------------------------------------------------- sub testEach(paramsList as Object, testName as String, func as Function) - ts().addParameterizedTests(paramsList, testName, func) + getTestSuite().addParameterizedTests(paramsList, testName, func) end sub ' ---------------------------------------------------------------- @@ -17,7 +17,7 @@ end sub ' adds "it " to the beginning of the test name ' ---------------------------------------------------------------- sub it(testName as String, func as Function) - ts().addTest("it " + testName, func) + getTestSuite().addTest("it " + testName, func) end sub ' ---------------------------------------------------------------- @@ -25,40 +25,40 @@ end sub ' adds "it " to the beginning of the test name ' ---------------------------------------------------------------- sub itEach(paramsList as Object, testName as String, func as Function) - ts().addParameterizedTests(paramsList, "it " + testName, func) + getTestSuite().addParameterizedTests(paramsList, "it " + testName, func) end sub ' ---------------------------------------------------------------- ' Calls ts.setBeforeAll with the same arguments ' ---------------------------------------------------------------- sub beforeAll(callback as Function) - ts().setBeforeAll(callback) + getTestSuite().setBeforeAll(callback) end sub ' ---------------------------------------------------------------- ' Calls ts.setBeforeEach with the same arguments ' ---------------------------------------------------------------- sub beforeEach(callback as Function) - ts().setBeforeEach(callback) + getTestSuite().setBeforeEach(callback) end sub ' ---------------------------------------------------------------- ' Calls ts.setAfterEach with the same arguments ' ---------------------------------------------------------------- sub afterEach(callback as Function) - ts().setAfterEach(callback) + getTestSuite().setAfterEach(callback) end sub ' ---------------------------------------------------------------- ' Calls ts.setAfterAll with the same arguments ' ---------------------------------------------------------------- sub afterAll(callback as Function) - ts().setAfterAll(callback) + getTestSuite().setAfterAll(callback) end sub ' ---------------------------------------------------------------- ' Returns test suite object ' ---------------------------------------------------------------- -function ts() as Object - return m["$$ts"] +function getTestSuite() as Object + return m["$$testSuite"] end function diff --git a/src/components/KopytkoTestSuite.brs b/src/components/KopytkoTestSuite.brs index db9d10b..35fbb4e 100644 --- a/src/components/KopytkoTestSuite.brs +++ b/src/components/KopytkoTestSuite.brs @@ -2,14 +2,16 @@ ' @import /components/_testUtils/getType.brs ' @import /components/_testUtils/NodeUtils.brs ' @import /components/_testUtils/ternary.brs +' kopytko-disable-next-line import/unused ' @import /components/KopytkoExpect.brs +' kopytko-disable-next-line import/unused ' @import /components/KopytkoMockFunction.brs ' @import /components/KopytkoTestFunctions.brs ' @import /source/UnitTestFramework.brs function KopytkoTestSuite() as Object ts = BaseTestSuite() - GetGlobalAA()["$$ts"] = ts + GetGlobalAA()["$$testSuite"] = ts ts._ERROR_MESSAGE_LINE_BREAK = Chr(10) + "--- " @@ -83,7 +85,7 @@ function KopytkoTestSuite() as Object end sub ' "func as Function" crashes the app - ts.createTest = function (name as String, func as Object, setup = invalid as Object, teardown = invalid as Object, arg = invalid as Dynamic, hasArgs = false as Boolean, _skip = false as Boolean) as Object + ts.createTest = function (name as String, func as Object, setup = Invalid as Object, teardown = Invalid as Object, arg = Invalid as Dynamic, hasArgs = false as Boolean, _skip = false as Boolean) as Object return { Name: name, _func: [func], @@ -161,7 +163,7 @@ function KopytkoTestSuite() as Object hasArguments: hasArgs, arg: arg, } - End Function + end function ts.setBeforeAll = sub (callback as Function) m._beforeAll.push(callback) @@ -189,15 +191,15 @@ function KopytkoTestSuite() as Object end if if (container = Invalid) - container = getGlobalAA().top + container = GetGlobalAA().top end if return m._getByTextIterator(regExp, container) end function - '''''''''''''''''''''' + ' ''''''''''''''''''''' ' Custom assertions: ' - '''''''''''''''''''''' + ' ''''''''''''''''''''' ts.assertNodesAreEqual = function (expected as Object, tested as Object, msg = "" as String) as String expectedType = Type(Box(expected), 3) testedType = Type(Box(tested), 3) @@ -247,9 +249,9 @@ function KopytkoTestSuite() as Object return "The method was called" end function - '''''''''' + ' ''''''''' ' Utils: ' - '''''''''' + ' ''''''''' ts.wasMethodCalled = function (methodPath as String, expectedParams = {} as Object, options = {} as Object) as Boolean expectedCallsCount = options.times isStrict = (options.strict <> Invalid AND options.strict) diff --git a/src/components/_mocks/Mock.brs b/src/components/_mocks/Mock.brs index 76873ee..99c9d72 100644 --- a/src/components/_mocks/Mock.brs +++ b/src/components/_mocks/Mock.brs @@ -72,20 +72,20 @@ function ObjectMock(options as Object) as Object options.testComponent.__mocks[options.name] = {} end if - mock = options.testComponent.__mocks[options.name] + objectPropertyMock = options.testComponent.__mocks[options.name] if (options.properties <> Invalid) prototype.append(options.properties) end if - if (mock.properties <> Invalid) - prototype.append(mock.properties) + if (objectPropertyMock.properties <> Invalid) + prototype.append(objectPropertyMock.properties) end if - if (mock.constructorCalls = Invalid) - mock.constructorCalls = [] + if (objectPropertyMock.constructorCalls = Invalid) + objectPropertyMock.constructorCalls = [] end if - mock.constructorCalls.push({ params: options.constructorParams }) + objectPropertyMock.constructorCalls.push({ params: options.constructorParams }) for each methodName in options.methods prototype[methodName] = options.methods[methodName] @@ -104,7 +104,7 @@ function ObjectMock(options as Object) as Object m.testComponent.__mocks[m.name][methodName].calls.push({ params: methodParams }) - if (m.testComponent.__mocks[m.name][methodName].getReturnValue <> Invalid AND type(m.testComponent.__mocks[m.name][methodName].getReturnValue) = "roFunction") + if (m.testComponent.__mocks[m.name][methodName].getReturnValue <> Invalid AND Type(m.testComponent.__mocks[m.name][methodName].getReturnValue) = "roFunction") return m.testComponent.__mocks[m.name][methodName].getReturnValue(methodParams, m.testComponent) end if diff --git a/src/components/_testUtils/NodeUtils.brs b/src/components/_testUtils/NodeUtils.brs index c01b867..6162532 100644 --- a/src/components/_testUtils/NodeUtils.brs +++ b/src/components/_testUtils/NodeUtils.brs @@ -11,7 +11,7 @@ function kopytkoUnitTestingFramework__NodeUtils() as Object ' @returns {Boolean} prototype.areNodesTheSame = function (node1 as Object, node2 as Object) as Boolean if (node1 <> Invalid) - return node1.isSameNode(node2) + return node1.isSameNode(node2) end if return (node2 = Invalid) @@ -108,4 +108,3 @@ function kopytkoUnitTestingFramework__NodeUtils() as Object return prototype end function - \ No newline at end of file diff --git a/src/components/_testUtils/fakeClock.brs b/src/components/_testUtils/fakeClock.brs index e3c626a..bd5f51e 100644 --- a/src/components/_testUtils/fakeClock.brs +++ b/src/components/_testUtils/fakeClock.brs @@ -1,4 +1,4 @@ -function fakeClock(scope as Object) +function fakeClock(scope as Object) as Object prototype = {} prototype._scope = scope diff --git a/src/components/_testUtils/getProperty.brs b/src/components/_testUtils/getProperty.brs index 3effe77..fd639c1 100644 --- a/src/components/_testUtils/getProperty.brs +++ b/src/components/_testUtils/getProperty.brs @@ -31,4 +31,3 @@ function kopytkoUnitTestingFramework__getProperty(source as Object, path as Dyna return currentSource end function - \ No newline at end of file diff --git a/src/components/_testUtils/ternary.brs b/src/components/_testUtils/ternary.brs index 795ca0b..3a365c8 100644 --- a/src/components/_testUtils/ternary.brs +++ b/src/components/_testUtils/ternary.brs @@ -12,4 +12,3 @@ function kopytkoUnitTestingFramework__ternary(conditionResult as Boolean, trueRe return falseReturnValue end function - \ No newline at end of file diff --git a/src/source/UnitTestFramework.brs b/src/source/UnitTestFramework.brs index fa91c56..13108a5 100644 --- a/src/source/UnitTestFramework.brs +++ b/src/source/UnitTestFramework.brs @@ -1,18 +1,18 @@ -'***************************************************************** -'* Roku Unit Testing Framework -'* Automating test suites for Roku channels. -'* -'* Build Version: 2.1.1 -'* Build Date: 05/06/2019 -'* -'* Public Documentation is avaliable on GitHub: -'* https://github.com/rokudev/unit-testing-framework -'* -'***************************************************************** -'***************************************************************** -'* Copyright Roku 2011-2019 -'* All Rights Reserved -'***************************************************************** +' ***************************************************************** +' * Roku Unit Testing Framework +' * Automating test suites for Roku channels. +' * +' * Build Version: 2.1.1 +' * Build Date: 05/06/2019 +' * +' * Public Documentation is avaliable on GitHub: +' * https://github.com/rokudev/unit-testing-framework +' * +' ***************************************************************** +' ***************************************************************** +' * Copyright Roku 2011-2019 +' * All Rights Reserved +' ***************************************************************** ' Functions in this file: @@ -44,46 +44,46 @@ ' @return A BaseTestSuite object. ' ---------------------------------------------------------------- -function BaseTestSuite() - this = {} - this.Name = "BaseTestSuite" - this.SKIP_TEST_MESSAGE_PREFIX = "SKIP_TEST_MESSAGE_PREFIX__" - ' Test Cases methods - this.testCases = [] - this.IS_NEW_APPROACH = false - this.addTest = BTS__AddTest - this.createTest = BTS__CreateTest - this.StorePerformanceData = BTS__StorePerformanceData - - ' Assertion methods which determine test failure or skipping - this.skip = BTS__Skip - this.fail = BTS__Fail - this.assertFalse = BTS__AssertFalse - this.assertTrue = BTS__AssertTrue - this.assertEqual = BTS__AssertEqual - this.assertNotEqual = BTS__AssertNotEqual - this.assertInvalid = BTS__AssertInvalid - this.assertNotInvalid = BTS__AssertNotInvalid - this.assertAAHasKey = BTS__AssertAAHasKey - this.assertAANotHasKey = BTS__AssertAANotHasKey - this.assertAAHasKeys = BTS__AssertAAHasKeys - this.assertAANotHasKeys = BTS__AssertAANotHasKeys - this.assertArrayContains = BTS__AssertArrayContains - this.assertArrayNotContains = BTS__AssertArrayNotContains - this.assertArrayContainsSubset = BTS__AssertArrayContainsSubset - this.assertArrayNotContainsSubset = BTS__AssertArrayNotContainsSubset - this.assertArrayCount = BTS__AssertArrayCount - this.assertArrayNotCount = BTS__AssertArrayNotCount - this.assertEmpty = BTS__AssertEmpty - this.assertNotEmpty = BTS__AssertNotEmpty - - ' Type Comparison Functionality - this.eqValues = TF_Utils__EqValues - this.eqAssocArrays = TF_Utils__EqAssocArray - this.eqArrays = TF_Utils__EqArray - this.baseComparator = TF_Utils__BaseComparator - - return this +function BaseTestSuite() as Object + this = {} + this.Name = "BaseTestSuite" + this.SKIP_TEST_MESSAGE_PREFIX = "SKIP_TEST_MESSAGE_PREFIX__" + ' Test Cases methods + this.testCases = [] + this.IS_NEW_APPROACH = false + this.addTest = BTS__AddTest + this.createTest = BTS__CreateTest + this.StorePerformanceData = BTS__StorePerformanceData + + ' Assertion methods which determine test failure or skipping + this.skip = BTS__Skip + this.fail = BTS__Fail + this.assertFalse = BTS__AssertFalse + this.assertTrue = BTS__AssertTrue + this.assertEqual = BTS__AssertEqual + this.assertNotEqual = BTS__AssertNotEqual + this.assertInvalid = BTS__AssertInvalid + this.assertNotInvalid = BTS__AssertNotInvalid + this.assertAAHasKey = BTS__AssertAAHasKey + this.assertAANotHasKey = BTS__AssertAANotHasKey + this.assertAAHasKeys = BTS__AssertAAHasKeys + this.assertAANotHasKeys = BTS__AssertAANotHasKeys + this.assertArrayContains = BTS__AssertArrayContains + this.assertArrayNotContains = BTS__AssertArrayNotContains + this.assertArrayContainsSubset = BTS__AssertArrayContainsSubset + this.assertArrayNotContainsSubset = BTS__AssertArrayNotContainsSubset + this.assertArrayCount = BTS__AssertArrayCount + this.assertArrayNotCount = BTS__AssertArrayNotCount + this.assertEmpty = BTS__AssertEmpty + this.assertNotEmpty = BTS__AssertNotEmpty + + ' Type Comparison Functionality + this.eqValues = TF_Utils__EqValues + this.eqAssocArrays = TF_Utils__EqAssocArray + this.eqArrays = TF_Utils__EqArray + this.baseComparator = TF_Utils__BaseComparator + + return this end function ' ---------------------------------------------------------------- @@ -97,8 +97,8 @@ end function ' @param hasArgs (boolean) True if test function has parameters. ' @param skip (boolean) Skip test run. ' ---------------------------------------------------------------- -sub BTS__AddTest(name as String, func as Object, setup = invalid as Object, teardown = invalid as Object, arg = invalid as Dynamic, hasArgs = false as Boolean, skip = false as Boolean) - m.testCases.Push(m.createTest(name, func, setup, teardown, arg, hasArgs, skip)) +sub BTS__AddTest(name as String, func as Object, setup = Invalid as Object, teardown = Invalid as Object, arg = Invalid as Dynamic, hasArgs = false as Boolean, skip = false as Boolean) + m.testCases.Push(m.createTest(name, func, setup, teardown, arg, hasArgs, skip)) end sub ' ---------------------------------------------------------------- @@ -114,39 +114,39 @@ end sub ' ' @return TestCase object. ' ---------------------------------------------------------------- -function BTS__CreateTest(name as String, func as Object, setup = invalid as Object, teardown = invalid as Object, arg = invalid as Dynamic, hasArgs = false as Boolean, skip = false as Boolean) as Object - return { - Name: name - Func: func - SetUp: setup - TearDown: teardown +function BTS__CreateTest(name as String, func as Object, setup = Invalid as Object, teardown = Invalid as Object, arg = Invalid as Dynamic, hasArgs = false as Boolean, skip = false as Boolean) as Object + return { + Name: name, + Func: func, + SetUp: setup, + TearDown: teardown, - perfData: {} + perfData: {}, - hasArguments: hasArgs - arg: arg + hasArguments: hasArgs, + arg: arg, - skip: skip - } + skip: skip, + } end function -'---------------------------------------------------------------- +' ---------------------------------------------------------------- ' Store performance data to current test instance. ' ' @param name (string) A property name. ' @param value (Object) A value of data. -'---------------------------------------------------------------- -Sub BTS__StorePerformanceData(name as String, value as Object) - timestamp = StrI(CreateObject("roDateTime").AsSeconds()) - m.testInstance.perfData.Append({ - name: { - "value" : value - "timestamp": timestamp - } - }) - ' print performance data to console - ? "PERF_DATA: " + m.testInstance.Name + ": " + timestamp + ": " + name + "|" + TF_Utils__AsString(value) -End Sub +' ---------------------------------------------------------------- +sub BTS__StorePerformanceData(name as String, value as Object) + timestamp = StrI(CreateObject("roDateTime").AsSeconds()) + m.testInstance.perfData.Append({ + name: { + "value" : value, + "timestamp": timestamp, + } + }) + ' print performance data to console + ? "PERF_DATA: " + m.testInstance.Name + ": " + timestamp + ": " + name + "|" + TF_Utils__AsString(value) +end sub ' ---------------------------------------------------------------- ' Assertion methods which determine test failure or skipping @@ -161,8 +161,8 @@ End Sub ' @return A skip message, with a specific prefix added, in order to runner know that this test should be skipped. ' ---------------------------------------------------------------- function BTS__Skip(message = "" as String) as String - ' add prefix so we know that this test is skipped, but not failed - return m.SKIP_TEST_MESSAGE_PREFIX + message + ' add prefix so we know that this test is skipped, but not failed + return m.SKIP_TEST_MESSAGE_PREFIX + message end function ' ---------------------------------------------------------------- @@ -174,7 +174,7 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__Fail(msg = "Error" as String) as String - return msg + return msg end function ' ---------------------------------------------------------------- @@ -187,10 +187,11 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertFalse(expr as Dynamic, msg = "Expression evaluates to true" as String) as String - if not TF_Utils__IsBoolean(expr) or expr - return BTS__Fail(msg) - end if - return "" + if (NOT TF_Utils__IsBoolean(expr) OR expr) + return BTS__Fail(msg) + end if + + return "" end function ' ---------------------------------------------------------------- @@ -203,10 +204,11 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertTrue(expr as Dynamic, msg = "Expression evaluates to false" as String) as String - if not TF_Utils__IsBoolean(expr) or not expr then - return msg - end if - return "" + if (NOT TF_Utils__IsBoolean(expr) OR NOT expr) + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -220,15 +222,17 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertEqual(first as Dynamic, second as Dynamic, msg = "" as String) as String - if not TF_Utils__EqValues(first, second) - if msg = "" - first_as_string = TF_Utils__AsString(first) - second_as_string = TF_Utils__AsString(second) - msg = first_as_string + " != " + second_as_string - end if - return msg + if (NOT TF_Utils__EqValues(first, second)) + if msg = "" + first_as_string = TF_Utils__AsString(first) + second_as_string = TF_Utils__AsString(second) + msg = first_as_string + " != " + second_as_string end if - return "" + + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -242,15 +246,17 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertNotEqual(first as Dynamic, second as Dynamic, msg = "" as String) as String - if TF_Utils__EqValues(first, second) - if msg = "" - first_as_string = TF_Utils__AsString(first) - second_as_string = TF_Utils__AsString(second) - msg = first_as_string + " == " + second_as_string - end if - return msg + if (TF_Utils__EqValues(first, second)) + if msg = "" + first_as_string = TF_Utils__AsString(first) + second_as_string = TF_Utils__AsString(second) + msg = first_as_string + " == " + second_as_string end if - return "" + + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -263,14 +269,16 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertInvalid(value as Dynamic, msg = "" as String) as String - if TF_Utils__IsValid(value) - if msg = "" - expr_as_string = TF_Utils__AsString(value) - msg = expr_as_string + " <> Invalid" - end if - return msg + if (TF_Utils__IsValid(value)) + if msg = "" + expr_as_string = TF_Utils__AsString(value) + msg = expr_as_string + " <> Invalid" end if - return "" + + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -283,15 +291,17 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertNotInvalid(value as Dynamic, msg = "" as String) as String - if not TF_Utils__IsValid(value) - if msg = "" - if LCase(Type(value)) = "" then value = invalid - expr_as_string = TF_Utils__AsString(value) - msg = expr_as_string + " = Invalid" - end if - return msg + if (NOT TF_Utils__IsValid(value)) + if msg = "" + if LCase(Type(value)) = "" then value = Invalid + expr_as_string = TF_Utils__AsString(value) + msg = expr_as_string + " = Invalid" end if - return "" + + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -305,23 +315,25 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertAAHasKey(array as Dynamic, key as Dynamic, msg = "" as String) as String - if not TF_Utils__IsString(key) - return "Key value has invalid type." - end if + if (NOT TF_Utils__IsString(key)) + return "Key value has invalid type." + end if - if TF_Utils__IsAssociativeArray(array) - if not array.DoesExist(key) - if msg = "" - msg = "Array doesn't have the '" + key + "' key." - end if - return msg - end if - else - msg = "Input value is not an Associative Array." - return msg + if (TF_Utils__IsAssociativeArray(array)) + if (NOT array.DoesExist(key)) + if msg = "" + msg = "Array doesn't have the '" + key + "' key." + end if + + return msg end if + else + msg = "Input value is not an Associative Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -335,23 +347,25 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertAANotHasKey(array as Dynamic, key as Dynamic, msg = "" as String) as String - if not TF_Utils__IsString(key) - return "Key value has invalid type." - end if + if (NOT TF_Utils__IsString(key)) + return "Key value has invalid type." + end if - if TF_Utils__IsAssociativeArray(array) - if array.DoesExist(key) - if msg = "" - msg = "Array has the '" + key + "' key." - end if - return msg - end if - else - msg = "Input value is not an Associative Array." - return msg + if (TF_Utils__IsAssociativeArray(array)) + if (array.DoesExist(key)) + if msg = "" + msg = "Array has the '" + key + "' key." + end if + + return msg end if + else + msg = "Input value is not an Associative Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -365,34 +379,35 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertAAHasKeys(array as Dynamic, keys as Object, msg = "" as String) as String - if not TF_Utils__IsAssociativeArray(array) - return "Input value is not an Associative Array." - end if + if (NOT TF_Utils__IsAssociativeArray(array)) + return "Input value is not an Associative Array." + end if - if not TF_Utils__IsArray(keys) or keys.Count() = 0 - return "Keys value is not an Array or is empty." - end if + if NOT TF_Utils__IsArray(keys) OR keys.Count() = 0 + return "Keys value is not an Array or is empty." + end if - if TF_Utils__IsAssociativeArray(array) and TF_Utils__IsArray(keys) - for each key in keys - if not TF_Utils__IsString(key) - return "Key value has invalid type." - end if + if (TF_Utils__IsAssociativeArray(array) AND TF_Utils__IsArray(keys)) + for each key in keys + if (NOT TF_Utils__IsString(key)) + return "Key value has invalid type." + end if - if not array.DoesExist(key) - if msg = "" - msg = "Array doesn't have the '" + key + "' key." - end if + if (NOT array.DoesExist(key)) + if msg = "" + msg = "Array doesn't have the '" + key + "' key." + end if - return msg - end if - end for - else - msg = "Input value is not an Associative Array." return msg - end if + end if + end for + else + msg = "Input value is not an Associative Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -406,32 +421,35 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertAANotHasKeys(array as Dynamic, keys as Object, msg = "" as String) as String - if not TF_Utils__IsAssociativeArray(array) - return "Input value is not an Associative Array." - end if + if (NOT TF_Utils__IsAssociativeArray(array)) + return "Input value is not an Associative Array." + end if - if not TF_Utils__IsArray(keys) or keys.Count() = 0 - return "Keys value is not an Array or is empty." - end if + if NOT TF_Utils__IsArray(keys) OR keys.Count() = 0 + return "Keys value is not an Array or is empty." + end if - if TF_Utils__IsAssociativeArray(array) and TF_Utils__IsArray(keys) - for each key in keys - if not TF_Utils__IsString(key) - return "Key value has invalid type." - end if + if (TF_Utils__IsAssociativeArray(array) AND TF_Utils__IsArray(keys)) + for each key in keys + if (NOT TF_Utils__IsString(key)) + return "Key value has invalid type." + end if + + if (array.DoesExist(key)) + if msg = "" + msg = "Array has the '" + key + "' key." + end if - if array.DoesExist(key) - if msg = "" - msg = "Array has the '" + key + "' key." - end if - return msg - end if - end for - else - msg = "Input value is not an Associative Array." return msg - end if - return "" + end if + end for + else + msg = "Input value is not an Associative Array." + + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -445,24 +463,24 @@ end function ' @return An error message. ' ---------------------------------------------------------------- -function BTS__AssertArrayContains(array as Dynamic, value as Dynamic, key = invalid as Dynamic, msg = "" as String) as String - if key <> invalid and not TF_Utils__IsString(key) - return "Key value has invalid type." - end if +function BTS__AssertArrayContains(array as Dynamic, value as Dynamic, key = Invalid as Dynamic, msg = "" as String) as String + if (key <> Invalid AND NOT TF_Utils__IsString(key)) + return "Key value has invalid type." + end if - if TF_Utils__IsAssociativeArray(array) or TF_Utils__IsArray(array) - if not TF_Utils__ArrayContains(array, value, key) - msg = "Array doesn't have the '" + TF_Utils__AsString(value) + "' value." + if (TF_Utils__IsAssociativeArray(array) OR TF_Utils__IsArray(array)) + if (NOT TF_Utils__ArrayContains(array, value, key)) + msg = "Array doesn't have the '" + TF_Utils__AsString(value) + "' value." - return msg - end if - else - msg = "Input value is not an Array." - - return msg + return msg end if + else + msg = "Input value is not an Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -476,24 +494,24 @@ end function ' @return An error message. ' ---------------------------------------------------------------- -function BTS__AssertArrayNotContains(array as Dynamic, value as Dynamic, key = invalid as Dynamic, msg = "" as String) as String - if key <> invalid and not TF_Utils__IsString(key) - return "Key value has invalid type." - end if +function BTS__AssertArrayNotContains(array as Dynamic, value as Dynamic, key = Invalid as Dynamic, msg = "" as String) as String + if (key <> Invalid AND NOT TF_Utils__IsString(key)) + return "Key value has invalid type." + end if - if TF_Utils__IsAssociativeArray(array) or TF_Utils__IsArray(array) - if TF_Utils__ArrayContains(array, value, key) - msg = "Array has the '" + TF_Utils__AsString(value) + "' value." + if (TF_Utils__IsAssociativeArray(array) OR TF_Utils__IsArray(array)) + if (TF_Utils__ArrayContains(array, value, key)) + msg = "Array has the '" + TF_Utils__AsString(value) + "' value." - return msg - end if - else - msg = "Input value is not an Array." - - return msg + return msg end if + else + msg = "Input value is not an Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -507,29 +525,29 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertArrayContainsSubset(array as Dynamic, subset as Dynamic, msg = "" as String) as String - if (TF_Utils__IsAssociativeArray(array) and TF_Utils__IsAssociativeArray(subset)) or (TF_Utils__IsArray(array) and TF_Utils__IsArray(subset)) - isAA = TF_Utils__IsAssociativeArray(subset) - for each item in subset - key = invalid - value = item - if isAA - key = item - value = subset[key] - end if - - if not TF_Utils__ArrayContains(array, value, key) - msg = "Array doesn't have the '" + TF_Utils__AsString(value) + "' value." - - return msg - end if - end for - else - msg = "Input value is not an Array." + if ((TF_Utils__IsAssociativeArray(array) AND TF_Utils__IsAssociativeArray(subset)) OR (TF_Utils__IsArray(array) AND TF_Utils__IsArray(subset))) + isAA = TF_Utils__IsAssociativeArray(subset) + for each item in subset + key = Invalid + value = item + if (isAA) + key = item + value = subset[key] + end if + + if (NOT TF_Utils__ArrayContains(array, value, key)) + msg = "Array doesn't have the '" + TF_Utils__AsString(value) + "' value." return msg - end if + end if + end for + else + msg = "Input value is not an Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -543,29 +561,29 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertArrayNotContainsSubset(array as Dynamic, subset as Dynamic, msg = "" as String) as String - if (TF_Utils__IsAssociativeArray(array) and TF_Utils__IsAssociativeArray(subset)) or (TF_Utils__IsArray(array) and TF_Utils__IsArray(subset)) - isAA = TF_Utils__IsAssociativeArray(subset) - for each item in subset - key = invalid - value = item - if isAA - key = item - value = subset[key] - end if - - if TF_Utils__ArrayContains(array, value, key) - msg = "Array has the '" + TF_Utils__AsString(value) + "' value." - - return msg - end if - end for - else - msg = "Input value is not an Array." + if ((TF_Utils__IsAssociativeArray(array) AND TF_Utils__IsAssociativeArray(subset)) OR (TF_Utils__IsArray(array) AND TF_Utils__IsArray(subset))) + isAA = TF_Utils__IsAssociativeArray(subset) + for each item in subset + key = Invalid + value = item + if (isAA) + key = item + value = subset[key] + end if + + if (TF_Utils__ArrayContains(array, value, key)) + msg = "Array has the '" + TF_Utils__AsString(value) + "' value." return msg - end if + end if + end for + else + msg = "Input value is not an Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -579,23 +597,23 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertArrayCount(array as Dynamic, count as Dynamic, msg = "" as String) as String - if not TF_Utils__IsInteger(count) - return "Count value should be an integer." - end if + if (NOT TF_Utils__IsInteger(count)) + return "Count value should be an integer." + end if - if TF_Utils__IsAssociativeArray(array) or TF_Utils__IsArray(array) - if array.Count() <> count - msg = "Array items count <> " + TF_Utils__AsString(count) + "." - - return msg - end if - else - msg = "Input value is not an Array." + if (TF_Utils__IsAssociativeArray(array) OR TF_Utils__IsArray(array)) + if (array.Count() <> count) + msg = "Array items count <> " + TF_Utils__AsString(count) + "." - return msg + return msg end if + else + msg = "Input value is not an Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -609,23 +627,23 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertArrayNotCount(array as Dynamic, count as Dynamic, msg = "" as String) as String - if not TF_Utils__IsInteger(count) - return "Count value should be an integer." - end if - - if TF_Utils__IsAssociativeArray(array) or TF_Utils__IsArray(array) - if array.Count() = count - msg = "Array items count = " + TF_Utils__AsString(count) + "." + if (NOT TF_Utils__IsInteger(count)) + return "Count value should be an integer." + end if - return msg - end if - else - msg = "Input value is not an Array." + if (TF_Utils__IsAssociativeArray(array) OR TF_Utils__IsArray(array)) + if array.Count() = count + msg = "Array items count = " + TF_Utils__AsString(count) + "." - return msg + return msg end if + else + msg = "Input value is not an Array." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -638,25 +656,25 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertEmpty(item as Dynamic, msg = "" as String) as String - if TF_Utils__IsAssociativeArray(item) or TF_Utils__IsArray(item) - if item.Count() > 0 - msg = "Array is not empty." - - return msg - end if - else if TF_Utils__IsString(item) - if Len(item) <> 0 - msg = "Input value is not empty." + if (TF_Utils__IsAssociativeArray(item) OR TF_Utils__IsArray(item)) + if (item.Count() > 0) + msg = "Array is not empty." - return msg - end if - else - msg = "Input value is not an Array, AssociativeArray or String." + return msg + end if + else if (TF_Utils__IsString(item)) + if (Len(item) <> 0) + msg = "Input value is not empty." - return msg + return msg end if + else + msg = "Input value is not an Array, AssociativeArray or String." - return "" + return msg + end if + + return "" end function ' ---------------------------------------------------------------- @@ -669,31 +687,31 @@ end function ' @return An error message. ' ---------------------------------------------------------------- function BTS__AssertNotEmpty(item as Dynamic, msg = "" as String) as String - if TF_Utils__IsAssociativeArray(item) or TF_Utils__IsArray(item) - if item.Count() = 0 - msg = "Array is empty." + if (TF_Utils__IsAssociativeArray(item) OR TF_Utils__IsArray(item)) + if item.Count() = 0 + msg = "Array is empty." - return msg - end if - else if TF_Utils__IsString(item) - if Len(item) = 0 - msg = "Input value is empty." - - return msg - end if - else - msg = "Input value is not an Array, AssociativeArray or String." + return msg + end if + else if (TF_Utils__IsString(item)) + if Len(item) = 0 + msg = "Input value is empty." - return msg + return msg end if + else + msg = "Input value is not an Array, AssociativeArray or String." - return "" + return msg + end if + + return "" end function -'***************************************************************** -'* Copyright Roku 2011-2019 -'* All Rights Reserved -'***************************************************************** +' ***************************************************************** +' * Copyright Roku 2011-2019 +' * All Rights Reserved +' ***************************************************************** ' Functions in this file: ' ItemGenerator @@ -720,22 +738,22 @@ end function ' if scheme is not valid. ' ---------------------------------------------------------------- function ItemGenerator(scheme as Object) as Object - this = {} - - this.getItem = IG_GetItem - this.getAssocArray = IG_GetAssocArray - this.getArray = IG_GetArray - this.getSimpleType = IG_GetSimpleType - this.getInteger = IG_GetInteger - this.getFloat = IG_GetFloat - this.getString = IG_GetString - this.getBoolean = IG_GetBoolean - - if not TF_Utils__IsValid(scheme) - return invalid - end if + this = {} + + this.getItem = IG_GetItem + this.getAssocArray = IG_GetAssocArray + this.getArray = IG_GetArray + this.getSimpleType = IG_GetSimpleType + this.getInteger = IG_GetInteger + this.getFloat = IG_GetFloat + this.getString = IG_GetString + this.getBoolean = IG_GetBoolean + + if (NOT TF_Utils__IsValid(scheme)) + return Invalid + end if - return this.getItem(scheme) + return this.getItem(scheme) end function ' TODO: Create IG_GetInvalidItem function with random type fields @@ -751,17 +769,17 @@ end function ' associative array. ' ---------------------------------------------------------------- function IG_GetItem(scheme as Object) as Object - item = invalid - - if TF_Utils__IsAssociativeArray(scheme) - item = IG_GetAssocArray(scheme) - else if TF_Utils__IsArray(scheme) - item = IG_GetArray(scheme) - else if TF_Utils__IsString(scheme) - item = IG_GetSimpleType(LCase(scheme)) - end if + item = Invalid + + if (TF_Utils__IsAssociativeArray(scheme)) + item = IG_GetAssocArray(scheme) + else if (TF_Utils__IsArray(scheme)) + item = IG_GetArray(scheme) + else if (TF_Utils__IsString(scheme)) + item = IG_GetSimpleType(LCase(scheme)) + end if - return item + return item end function ' ---------------------------------------------------------------- @@ -777,15 +795,15 @@ end function ' @return An associative array according to specified scheme. ' ---------------------------------------------------------------- function IG_GetAssocArray(scheme as Object) as Object - item = {} + item = {} - for each key in scheme - if not item.DoesExist(key) - item[key] = IG_GetItem(scheme[key]) - end if - end for + for each key in scheme + if (NOT item.DoesExist(key)) + item[key] = IG_GetItem(scheme[key]) + end if + end for - return item + return item end function ' ---------------------------------------------------------------- @@ -796,13 +814,13 @@ end function ' @return An array according to specified scheme. ' ---------------------------------------------------------------- function IG_GetArray(scheme as Object) as Object - item = [] + item = [] - for each key in scheme - item.Push(IG_GetItem(key)) - end for + for each key in scheme + item.Push(IG_GetItem(key)) + end for - return item + return item end function ' ---------------------------------------------------------------- @@ -813,19 +831,19 @@ end function ' @return A simple type object or invalid if type is not supported. ' ---------------------------------------------------------------- function IG_GetSimpleType(typeStr as String) as Object - item = invalid - - if typeStr = "integer" or typeStr = "int" or typeStr = "roint" - item = IG_GetInteger() - else if typeStr = "float" or typeStr = "rofloat" - item = IG_GetFloat() - else if typeStr = "string" or typeStr = "rostring" - item = IG_GetString(10) - else if typeStr = "boolean" or typeStr = "roboolean" - item = IG_GetBoolean() - end if + item = Invalid - return item + if typeStr = "integer" OR typeStr = "int" OR typeStr = "roint" + item = IG_GetInteger() + else if typeStr = "float" OR typeStr = "rofloat" + item = IG_GetFloat() + else if typeStr = "string" OR typeStr = "rostring" + item = IG_GetString(10) + else if typeStr = "boolean" OR typeStr = "roboolean" + item = IG_GetBoolean() + end if + + return item end function ' ---------------------------------------------------------------- @@ -834,7 +852,7 @@ end function ' @return A random boolean value. ' ---------------------------------------------------------------- function IG_GetBoolean() as Boolean - return TF_Utils__AsBoolean(Rnd(2) \ Rnd(2)) + return TF_Utils__AsBoolean(Rnd(2) \ Rnd(2)) end function ' ---------------------------------------------------------------- @@ -846,7 +864,7 @@ end function ' @return A random integer value. ' ---------------------------------------------------------------- function IG_GetInteger(seed = 100 as Integer) as Integer - return Rnd(seed) + return Rnd(seed) end function ' ---------------------------------------------------------------- @@ -855,7 +873,7 @@ end function ' @return A random float value. ' ---------------------------------------------------------------- function IG_GetFloat() as Float - return Rnd(0) + return Rnd(0) end function ' ---------------------------------------------------------------- @@ -866,31 +884,31 @@ end function ' @return A random string value or empty string if seed is 0. ' ---------------------------------------------------------------- function IG_GetString(seed as Integer) as String - item = "" - if seed > 0 - stringLength = Rnd(seed) - - for i = 0 to stringLength - chType = Rnd(3) - - if chType = 1 ' Chr(48-57) - numbers - chNumber = 47 + Rnd(10) - else if chType = 2 ' Chr(65-90) - Uppercase Letters - chNumber = 64 + Rnd(26) - else ' Chr(97-122) - Lowercase Letters - chNumber = 96 + Rnd(26) - end if - - item = item + Chr(chNumber) - end for - end if + item = "" + if (seed > 0) + stringLength = Rnd(seed) + + for _i = 0 to stringLength + chType = Rnd(3) + + if chType = 1 ' Chr(48-57) - numbers + chNumber = 47 + Rnd(10) + else if chType = 2 ' Chr(65-90) - Uppercase Letters + chNumber = 64 + Rnd(26) + else ' Chr(97-122) - Lowercase Letters + chNumber = 96 + Rnd(26) + end if + + item = item + Chr(chNumber) + end for + end if - return item + return item end function -'***************************************************************** -'* Copyright Roku 2011-2019 -'* All Rights Reserved -'***************************************************************** +' ***************************************************************** +' * Copyright Roku 2011-2019 +' * All Rights Reserved +' ***************************************************************** ' Functions in this file: ' Logger @@ -923,52 +941,52 @@ end function ' @return A Logger object. ' ---------------------------------------------------------------- function Logger() as Object - this = {} - - this.verbosityLevel = { - basic: 0 - normal: 1 - verboseFailed: 2 - verbose: 3 - } - - ' Internal properties - this.verbosity = this.verbosityLevel.normal - this.echoEnabled = false - this.serverURL = "" - this.jUnitEnabled = false - - ' Interface - this.SetVerbosity = Logger__SetVerbosity - this.SetEcho = Logger__SetEcho - this.SetJUnit = Logger__SetJUnit - this.SetServer = Logger__SetServer - this.SetServerURL = Logger__SetServerURL ' Deprecated. Use Logger__SetServer instead. - this.PrintStatistic = Logger__PrintStatistic - this.SendToServer = Logger__SendToServer - - this.CreateTotalStatistic = Logger__CreateTotalStatistic - this.CreateSuiteStatistic = Logger__CreateSuiteStatistic - this.CreateTestStatistic = Logger__CreateTestStatistic - this.AppendSuiteStatistic = Logger__AppendSuiteStatistic - this.AppendTestStatistic = Logger__AppendTestStatistic - - ' Internal functions - this.PrintSuiteStatistic = Logger__PrintSuiteStatistic - this.PrintTestStatistic = Logger__PrintTestStatistic - this.PrintStart = Logger__PrintStart - this.PrintEnd = Logger__PrintEnd - this.PrintSuiteSetUp = Logger__PrintSuiteSetUp - this.PrintSuiteStart = Logger__PrintSuiteStart - this.PrintSuiteEnd = Logger__PrintSuiteEnd - this.PrintSuiteTearDown = Logger__PrintSuiteTearDown - this.PrintTestSetUp = Logger__PrintTestSetUp - this.PrintTestStart = Logger__PrintTestStart - this.PrintTestEnd = Logger__PrintTestEnd - this.PrintTestTearDown = Logger__PrintTestTearDown - this.PrintJUnitFormat = Logger__PrintJUnitFormat - - return this + this = {} + + this.verbosityLevel = { + basic: 0, + normal: 1, + verboseFailed: 2, + verbose: 3, + } + + ' Internal properties + this.verbosity = this.verbosityLevel.normal + this.echoEnabled = false + this.serverURL = "" + this.jUnitEnabled = false + + ' Interface + this.SetVerbosity = Logger__SetVerbosity + this.SetEcho = Logger__SetEcho + this.SetJUnit = Logger__SetJUnit + this.SetServer = Logger__SetServer + this.SetServerURL = Logger__SetServerURL ' Deprecated. Use Logger__SetServer instead. + this.PrintStatistic = Logger__PrintStatistic + this.SendToServer = Logger__SendToServer + + this.CreateTotalStatistic = Logger__CreateTotalStatistic + this.CreateSuiteStatistic = Logger__CreateSuiteStatistic + this.CreateTestStatistic = Logger__CreateTestStatistic + this.AppendSuiteStatistic = Logger__AppendSuiteStatistic + this.AppendTestStatistic = Logger__AppendTestStatistic + + ' Internal functions + this.PrintSuiteStatistic = Logger__PrintSuiteStatistic + this.PrintTestStatistic = Logger__PrintTestStatistic + this.PrintStart = Logger__PrintStart + this.PrintEnd = Logger__PrintEnd + this.PrintSuiteSetUp = Logger__PrintSuiteSetUp + this.PrintSuiteStart = Logger__PrintSuiteStart + this.PrintSuiteEnd = Logger__PrintSuiteEnd + this.PrintSuiteTearDown = Logger__PrintSuiteTearDown + this.PrintTestSetUp = Logger__PrintTestSetUp + this.PrintTestStart = Logger__PrintTestStart + this.PrintTestEnd = Logger__PrintTestEnd + this.PrintTestTearDown = Logger__PrintTestTearDown + this.PrintJUnitFormat = Logger__PrintJUnitFormat + + return this end function ' ---------------------------------------------------------------- @@ -983,9 +1001,9 @@ end function ' Default level: 1 ' ---------------------------------------------------------------- sub Logger__SetVerbosity(verbosity = m.verbosityLevel.normal as Integer) - if verbosity >= m.verbosityLevel.basic and verbosity <= m.verbosityLevel.verbose - m.verbosity = verbosity - end if + if (verbosity >= m.verbosityLevel.basic AND verbosity <= m.verbosityLevel.verbose) + m.verbosity = verbosity + end if end sub ' ---------------------------------------------------------------- @@ -996,7 +1014,7 @@ end sub ' Default value: false ' ---------------------------------------------------------------- sub Logger__SetEcho(enable = false as Boolean) - m.echoEnabled = enable + m.echoEnabled = enable end sub ' ---------------------------------------------------------------- @@ -1007,7 +1025,7 @@ end sub ' Default value: false ' ---------------------------------------------------------------- sub Logger__SetJUnit(enable = false as Boolean) - m.jUnitEnabled = enable + m.jUnitEnabled = enable end sub ' ---------------------------------------------------------------- @@ -1019,13 +1037,13 @@ end sub ' Default value: "" ' ---------------------------------------------------------------- sub Logger__SetServer(host = "" as String, port = "" as String) - if TF_Utils__IsNotEmptyString(host) - if TF_Utils__IsNotEmptyString(port) - m.serverURL = "http://" + host + ":" + port - else - m.serverURL = "http://" + host - end if + if (TF_Utils__IsNotEmptyString(host)) + if (TF_Utils__IsNotEmptyString(port)) + m.serverURL = "http://" + host + ":" + port + else + m.serverURL = "http://" + host end if + end if end sub ' ---------------------------------------------------------------- @@ -1034,29 +1052,29 @@ end sub ' @param url (string) A storage server URL. ' Default value: "" ' ---------------------------------------------------------------- -sub Logger__SetServerURL(url = "" as String) - ? "This function is deprecated. Please use Logger__SetServer(host, port)" +sub Logger__SetServerURL(_url = "" as String) + ? "This function is deprecated. Please use Logger__SetServer(host, port)" end sub -'---------------------------------------------------------------- +' ---------------------------------------------------------------- ' Send test results as a POST json payload. ' ' @param statObj (object) stats of the test run. ' Default value: invalid ' ---------------------------------------------------------------- sub Logger__SendToServer(statObj as Object) - if TF_Utils__IsNotEmptyString(m.serverURL) and TF_Utils__IsValid(statObj) - ? "***" - ? "*** Sending statsObj to server: "; m.serverURL + if (TF_Utils__IsNotEmptyString(m.serverURL) AND TF_Utils__IsValid(statObj)) + ? "***" + ? "*** Sending statsObj to server: "; m.serverURL - request = CreateObject("roUrlTransfer") - request.SetUrl(m.serverURL) - statString = FormatJson(statObj) + request = CreateObject("roUrlTransfer") + request.SetUrl(m.serverURL) + statString = FormatJson(statObj) - ? "*** Response: "; request.postFromString(statString) - ? "***" - ? "******************************************************************" - end if + ? "*** Response: "; request.postFromString(statString) + ? "***" + ? "******************************************************************" + end if end sub ' ---------------------------------------------------------------- @@ -1065,38 +1083,38 @@ end sub ' @param statObj (object) A statistic object to print. ' ---------------------------------------------------------------- sub Logger__PrintStatistic(statObj as Object) - if not m.echoEnabled - m.PrintStart() - - if m.verbosity = m.verbosityLevel.normal or m.verbosity = m.verbosityLevel.verboseFailed - for each testSuite in statObj.Suites - for each testCase in testSuite.Tests - if m.verbosity = m.verbosityLevel.verboseFailed and testCase.result = "Fail" - m.printTestStatistic(testCase) - else - ? "*** "; testSuite.Name; ": "; testCase.Name; " - "; testCase.Result - end if - end for - end for - else if m.verbosity = m.verbosityLevel.verbose - for each testSuite in statObj.Suites - m.PrintSuiteStatistic(testSuite) - end for - end if + if (NOT m.echoEnabled) + m.PrintStart() + + if m.verbosity = m.verbosityLevel.normal OR m.verbosity = m.verbosityLevel.verboseFailed + for each testSuite in statObj.Suites + for each testCase in testSuite.Tests + if m.verbosity = m.verbosityLevel.verboseFailed AND testCase.result = "Fail" + m.printTestStatistic(testCase) + else + ? "*** "; testSuite.Name; ": "; testCase.Name; " - "; testCase.Result + end if + end for + end for + else if m.verbosity = m.verbosityLevel.verbose + for each testSuite in statObj.Suites + m.PrintSuiteStatistic(testSuite) + end for end if + end if - ? "***" - ? "*** Total = "; TF_Utils__AsString(statObj.Total); " ; Passed = "; statObj.Correct; " ; Failed = "; statObj.Fail; " ; Skipped = "; statObj.skipped; " ; Crashes = "; statObj.Crash; - ? "*** Time spent: "; statObj.Time; "ms" - ? "***" + ? "***" + ? "*** Total = "; TF_Utils__AsString(statObj.Total); " ; Passed = "; statObj.Correct; " ; Failed = "; statObj.Fail; " ; Skipped = "; statObj.skipped; " ; Crashes = "; statObj.Crash; + ? "*** Time spent: "; statObj.Time; "ms" + ? "***" - m.PrintEnd() + m.PrintEnd() - m.SendToServer(statObj) + m.SendToServer(statObj) - if m.jUnitEnabled - m.printJUnitFormat(statObj) - end if + if (m.jUnitEnabled) + m.printJUnitFormat(statObj) + end if end sub ' ---------------------------------------------------------------- @@ -1105,21 +1123,21 @@ end sub ' @return An empty statistic object. ' ---------------------------------------------------------------- function Logger__CreateTotalStatistic() as Object - statTotalItem = { - Suites: [] - Time: 0 - Total: 0 - Correct: 0 - Fail: 0 - Skipped: 0 - Crash: 0 - } + statTotalItem = { + Suites: [], + Time: 0, + Total: 0, + Correct: 0, + Fail: 0, + Skipped: 0, + Crash: 0, + } - if m.echoEnabled - m.PrintStart() - end if + if (m.echoEnabled) + m.PrintStart() + end if - return statTotalItem + return statTotalItem end function ' ---------------------------------------------------------------- @@ -1130,24 +1148,24 @@ end function ' @return An empty statistic object for test suite. ' ---------------------------------------------------------------- function Logger__CreateSuiteStatistic(name as String) as Object - statSuiteItem = { - Name: name - Tests: [] - Time: 0 - Total: 0 - Correct: 0 - Fail: 0 - Skipped: 0 - Crash: 0 - } - - if m.echoEnabled - if m.verbosity = m.verbosityLevel.verbose - m.PrintSuiteStart(name) - end if + statSuiteItem = { + Name: name, + Tests: [], + Time: 0, + Total: 0, + Correct: 0, + Fail: 0, + Skipped: 0, + Crash: 0, + } + + if (m.echoEnabled) + if m.verbosity = m.verbosityLevel.verbose + m.PrintSuiteStart(name) end if + end if - return statSuiteItem + return statSuiteItem end function ' ---------------------------------------------------------------- @@ -1176,24 +1194,24 @@ end function ' @return A statistic object for test. ' ---------------------------------------------------------------- function Logger__CreateTestStatistic(name as String, result = "Success" as String, time = 0 as Integer, errorCode = 0 as Integer, errorMessage = "" as String, isInit = false as Boolean) as Object - statTestItem = { - Name: name - Result: result - Time: time - PerfData: {} - Error: { - Code: errorCode - Message: errorMessage - } + statTestItem = { + Name: name, + Result: result, + Time: time, + PerfData: {}, + Error: { + Code: errorCode, + Message: errorMessage, } + } - if m.echoEnabled and not isInit - if m.verbosity = m.verbosityLevel.verbose - m.PrintTestStart(name) - end if + if (m.echoEnabled AND NOT isInit) + if m.verbosity = m.verbosityLevel.verbose + m.PrintTestStart(name) end if + end if - return statTestItem + return statTestItem end function ' ---------------------------------------------------------------- @@ -1203,33 +1221,33 @@ end function ' @param statTestObj (object) A test statistic to append. ' ---------------------------------------------------------------- sub Logger__AppendTestStatistic(statSuiteObj as Object, statTestObj as Object) - if TF_Utils__IsAssociativeArray(statSuiteObj) and TF_Utils__IsAssociativeArray(statTestObj) - statSuiteObj.Tests.Push(statTestObj) + if (TF_Utils__IsAssociativeArray(statSuiteObj) AND TF_Utils__IsAssociativeArray(statTestObj)) + statSuiteObj.Tests.Push(statTestObj) - if TF_Utils__IsInteger(statTestObj.time) - statSuiteObj.Time = statSuiteObj.Time + statTestObj.Time - end if + if (TF_Utils__IsInteger(statTestObj.time)) + statSuiteObj.Time = statSuiteObj.Time + statTestObj.Time + end if - statSuiteObj.Total = statSuiteObj.Total + 1 + statSuiteObj.Total = statSuiteObj.Total + 1 - if LCase(statTestObj.Result) = "success" - statSuiteObj.Correct = statSuiteObj.Correct + 1 - else if LCase(statTestObj.result) = "fail" - statSuiteObj.Fail = statSuiteObj.Fail + 1 - else if LCase(statTestObj.result) = "skipped" - statSuiteObj.skipped++ - else - statSuiteObj.crash = statSuiteObj.crash + 1 - end if + if LCase(statTestObj.Result) = "success" + statSuiteObj.Correct = statSuiteObj.Correct + 1 + else if LCase(statTestObj.result) = "fail" + statSuiteObj.Fail = statSuiteObj.Fail + 1 + else if LCase(statTestObj.result) = "skipped" + statSuiteObj.skipped++ + else + statSuiteObj.crash = statSuiteObj.crash + 1 + end if - if m.echoEnabled - if m.verbosity = m.verbosityLevel.normal - ? "*** "; statSuiteObj.Name; ": "; statTestObj.Name; " - "; statTestObj.Result - else if m.verbosity = m.verbosityLevel.verbose - m.PrintTestStatistic(statTestObj) - end if - end if + if (m.echoEnabled) + if m.verbosity = m.verbosityLevel.normal + ? "*** "; statSuiteObj.Name; ": "; statTestObj.Name; " - "; statTestObj.Result + else if m.verbosity = m.verbosityLevel.verbose + m.PrintTestStatistic(statTestObj) + end if end if + end if end sub ' ---------------------------------------------------------------- @@ -1239,36 +1257,36 @@ end sub ' @param statSuiteObj (object) A test suite statistic object to append. ' ---------------------------------------------------------------- sub Logger__AppendSuiteStatistic(statTotalObj as Object, statSuiteObj as Object) - if TF_Utils__IsAssociativeArray(statTotalObj) and TF_Utils__IsAssociativeArray(statSuiteObj) - statTotalObj.Suites.Push(statSuiteObj) - statTotalObj.Time = statTotalObj.Time + statSuiteObj.Time + if (TF_Utils__IsAssociativeArray(statTotalObj) AND TF_Utils__IsAssociativeArray(statSuiteObj)) + statTotalObj.Suites.Push(statSuiteObj) + statTotalObj.Time = statTotalObj.Time + statSuiteObj.Time - if TF_Utils__IsInteger(statSuiteObj.Total) - statTotalObj.Total = statTotalObj.Total + statSuiteObj.Total - end if + if (TF_Utils__IsInteger(statSuiteObj.Total)) + statTotalObj.Total = statTotalObj.Total + statSuiteObj.Total + end if - if TF_Utils__IsInteger(statSuiteObj.Correct) - statTotalObj.Correct = statTotalObj.Correct + statSuiteObj.Correct - end if + if (TF_Utils__IsInteger(statSuiteObj.Correct)) + statTotalObj.Correct = statTotalObj.Correct + statSuiteObj.Correct + end if - if TF_Utils__IsInteger(statSuiteObj.Fail) - statTotalObj.Fail = statTotalObj.Fail + statSuiteObj.Fail - end if + if (TF_Utils__IsInteger(statSuiteObj.Fail)) + statTotalObj.Fail = statTotalObj.Fail + statSuiteObj.Fail + end if - if TF_Utils__IsInteger(statSuiteObj.skipped) - statTotalObj.skipped += statSuiteObj.skipped - end if + if (TF_Utils__IsInteger(statSuiteObj.skipped)) + statTotalObj.skipped += statSuiteObj.skipped + end if - if TF_Utils__IsInteger(statSuiteObj.Crash) - statTotalObj.Crash = statTotalObj.Crash + statSuiteObj.Crash - end if + if (TF_Utils__IsInteger(statSuiteObj.Crash)) + statTotalObj.Crash = statTotalObj.Crash + statSuiteObj.Crash + end if - if m.echoEnabled - if m.verbosity = m.verbosityLevel.verbose - m.PrintSuiteStatistic(statSuiteObj) - end if - end if + if (m.echoEnabled) + if m.verbosity = m.verbosityLevel.verbose + m.PrintSuiteStatistic(statSuiteObj) + end if end if + end if end sub ' ---------------------------------------------------------------- @@ -1277,20 +1295,20 @@ end sub ' @param statSuiteObj (object) A target test suite object to print. ' ---------------------------------------------------------------- sub Logger__PrintSuiteStatistic(statSuiteObj as Object) - if not m.echoEnabled - m.PrintSuiteStart(statSuiteObj.Name) + if (NOT m.echoEnabled) + m.PrintSuiteStart(statSuiteObj.Name) - for each testCase in statSuiteObj.Tests - m.PrintTestStatistic(testCase) - end for - end if + for each testCase in statSuiteObj.Tests + m.PrintTestStatistic(testCase) + end for + end if - ? "===" - ? "=== Total = "; TF_Utils__AsString(statSuiteObj.Total); " ; Passed = "; statSuiteObj.Correct; " ; Failed = "; statSuiteObj.Fail; " ; Skipped = "; statSuiteObj.skipped; " ; Crashes = "; statSuiteObj.Crash; - ? " Time spent: "; statSuiteObj.Time; "ms" - ? "===" + ? "===" + ? "=== Total = "; TF_Utils__AsString(statSuiteObj.Total); " ; Passed = "; statSuiteObj.Correct; " ; Failed = "; statSuiteObj.Fail; " ; Skipped = "; statSuiteObj.skipped; " ; Crashes = "; statSuiteObj.Crash; + ? " Time spent: "; statSuiteObj.Time; "ms" + ? "===" - m.PrintSuiteEnd(statSuiteObj.Name) + m.PrintSuiteEnd(statSuiteObj.Name) end sub ' ---------------------------------------------------------------- @@ -1299,164 +1317,164 @@ end sub ' @param statTestObj (object) A target test object to print. ' ---------------------------------------------------------------- sub Logger__PrintTestStatistic(statTestObj as Object) - if not m.echoEnabled - m.PrintTestStart(statTestObj.Name) - end if + if (NOT m.echoEnabled) + m.PrintTestStart(statTestObj.Name) + end if - ? "--- Result: "; statTestObj.Result - ? "--- Time: "; statTestObj.Time + ? "--- Result: "; statTestObj.Result + ? "--- Time: "; statTestObj.Time - if LCase(statTestObj.result) = "skipped" - if Len(statTestObj.message) > 0 - ? "--- Message: "; statTestObj.message - end if - else if LCase(statTestObj.Result) <> "success" - ? "--- Error Code: "; statTestObj.Error.Code - ? "--- Error Message: "; statTestObj.Error.Message + if LCase(statTestObj.result) = "skipped" + if (Len(statTestObj.message) > 0) + ? "--- Message: "; statTestObj.message end if + else if (LCase(statTestObj.Result) <> "success") + ? "--- Error Code: "; statTestObj.Error.Code + ? "--- Error Message: "; statTestObj.Error.Message + end if - m.PrintTestEnd(statTestObj.Name) + m.PrintTestEnd(statTestObj.Name) end sub ' ---------------------------------------------------------------- ' Print testting start message. ' ---------------------------------------------------------------- sub Logger__PrintStart() - ? "" - ? "******************************************************************" - ? "******************************************************************" - ? "************* Start testing *************" - ? "******************************************************************" + ? "" + ? "******************************************************************" + ? "******************************************************************" + ? "************* Start testing *************" + ? "******************************************************************" end sub ' ---------------------------------------------------------------- ' Print testing end message. ' ---------------------------------------------------------------- sub Logger__PrintEnd() - ? "******************************************************************" - ? "************* End testing *************" - ? "******************************************************************" - ? "******************************************************************" - ? "" + ? "******************************************************************" + ? "************* End testing *************" + ? "******************************************************************" + ? "******************************************************************" + ? "" end sub ' ---------------------------------------------------------------- ' Print test suite SetUp message. ' ---------------------------------------------------------------- sub Logger__PrintSuiteSetUp(sName as String) - if m.verbosity = m.verbosityLevel.verbose - ? "=================================================================" - ? "=== SetUp "; sName; " suite." - ? "=================================================================" - end if + if m.verbosity = m.verbosityLevel.verbose + ? "=================================================================" + ? "=== SetUp "; sName; " suite." + ? "=================================================================" + end if end sub ' ---------------------------------------------------------------- ' Print test suite start message. ' ---------------------------------------------------------------- sub Logger__PrintSuiteStart(sName as String) - ? "=================================================================" - ? "=== Start "; sName; " suite:" - ? "===" + ? "=================================================================" + ? "=== Start "; sName; " suite:" + ? "===" end sub ' ---------------------------------------------------------------- ' Print test suite end message. ' ---------------------------------------------------------------- sub Logger__PrintSuiteEnd(sName as String) - ? "===" - ? "=== End "; sName; " suite." - ? "=================================================================" + ? "===" + ? "=== End "; sName; " suite." + ? "=================================================================" end sub ' ---------------------------------------------------------------- ' Print test suite TearDown message. ' ---------------------------------------------------------------- sub Logger__PrintSuiteTearDown(sName as String) - if m.verbosity = m.verbosityLevel.verbose - ? "=================================================================" - ? "=== TearDown "; sName; " suite." - ? "=================================================================" - end if + if m.verbosity = m.verbosityLevel.verbose + ? "=================================================================" + ? "=== TearDown "; sName; " suite." + ? "=================================================================" + end if end sub ' ---------------------------------------------------------------- ' Print test setUp message. ' ---------------------------------------------------------------- sub Logger__PrintTestSetUp(tName as String) - if m.verbosity = m.verbosityLevel.verbose - ? "----------------------------------------------------------------" - ? "--- SetUp "; tName; " test." - ? "----------------------------------------------------------------" - end if + if m.verbosity = m.verbosityLevel.verbose + ? "----------------------------------------------------------------" + ? "--- SetUp "; tName; " test." + ? "----------------------------------------------------------------" + end if end sub ' ---------------------------------------------------------------- ' Print test start message. ' ---------------------------------------------------------------- sub Logger__PrintTestStart(tName as String) - ? "----------------------------------------------------------------" - ? "--- Start "; tName; " test:" - ? "---" + ? "----------------------------------------------------------------" + ? "--- Start "; tName; " test:" + ? "---" end sub ' ---------------------------------------------------------------- ' Print test end message. ' ---------------------------------------------------------------- sub Logger__PrintTestEnd(tName as String) - ? "---" - ? "--- End "; tName; " test." - ? "----------------------------------------------------------------" + ? "---" + ? "--- End "; tName; " test." + ? "----------------------------------------------------------------" end sub ' ---------------------------------------------------------------- ' Print test TearDown message. ' ---------------------------------------------------------------- sub Logger__PrintTestTearDown(tName as String) - if m.verbosity = m.verbosityLevel.verbose - ? "----------------------------------------------------------------" - ? "--- TearDown "; tName; " test." - ? "----------------------------------------------------------------" - end if + if m.verbosity = m.verbosityLevel.verbose + ? "----------------------------------------------------------------" + ? "--- TearDown "; tName; " test." + ? "----------------------------------------------------------------" + end if end sub sub Logger__PrintJUnitFormat(statObj as Object) - ' TODO finish report - xml = CreateObject("roXMLElement") - xml.SetName("testsuites") - for each testSuiteAA in statObj.suites - testSuite = xml.AddElement("testsuite") - ' name="FeatureManagerTest" time="13.923" tests="2" errors="0" skipped="0" failures="0" - testSuite.AddAttribute("name", testSuiteAA.name) - testSuite.AddAttribute("time", testSuiteAA.time.toStr()) - testSuite.AddAttribute("tests", testSuiteAA.Tests.count().toStr()) - - skippedNum = 0 - failedNum = 0 - for each testAA in testSuiteAA.Tests - test = testSuite.AddElement("testcase") - test.AddAttribute("name", testAA.name) - test.AddAttribute("time", testAA.time.toStr()) - - if LCase(testAA.result) = "skipped" then - test.AddElement("skipped") - skippedNum++ - else if LCase(testAA.Result) <> "success" - failure = test.AddElement("failure") - failure.AddAttribute("message", testAA.error.message) - failure.AddAttribute("type", testAA.error.code.tostr()) - failedNum++ - end if - end for - testSuite.AddAttribute("errors", failedNum.tostr()) - testSuite.AddAttribute("skipped", skippedNum.tostr()) + ' TODO finish report + xml = CreateObject("roXMLElement") + xml.SetName("testsuites") + for each testSuiteAA in statObj.suites + testSuite = xml.AddElement("testsuite") + ' name="FeatureManagerTest" time="13.923" tests="2" errors="0" skipped="0" failures="0" + testSuite.AddAttribute("name", testSuiteAA.name) + testSuite.AddAttribute("time", testSuiteAA.time.toStr()) + testSuite.AddAttribute("tests", testSuiteAA.Tests.count().toStr()) + + skippedNum = 0 + failedNum = 0 + for each testAA in testSuiteAA.Tests + test = testSuite.AddElement("testcase") + test.AddAttribute("name", testAA.name) + test.AddAttribute("time", testAA.time.toStr()) + + if LCase(testAA.result) = "skipped" + test.AddElement("skipped") + skippedNum++ + else if (LCase(testAA.Result) <> "success") + failure = test.AddElement("failure") + failure.AddAttribute("message", testAA.error.message) + failure.AddAttribute("type", testAA.error.code.tostr()) + failedNum++ + end if end for - ? xml.GenXML(true) + testSuite.AddAttribute("errors", failedNum.tostr()) + testSuite.AddAttribute("skipped", skippedNum.tostr()) + end for + ? xml.GenXML(true) end sub -'***************************************************************** -'* Copyright Roku 2011-2019 -'* All Rights Reserved -'***************************************************************** +' ***************************************************************** +' * Copyright Roku 2011-2019 +' * All Rights Reserved +' ***************************************************************** ' Functions in this file: ' TestRunner @@ -1479,49 +1497,49 @@ end sub ' @return A TestRunner object. ' ---------------------------------------------------------------- function TestRunner() as Object - this = {} - GetGlobalAA().globalErrorsList = [] - this.isNodeMode = GetGlobalAA().top <> invalid - this.Logger = Logger() - - ' Internal properties - this.SKIP_TEST_MESSAGE_PREFIX = "SKIP_TEST_MESSAGE_PREFIX__" - this.nodesTestDirectory = "pkg:/components/tests" - if this.isNodeMode - this.testsDirectory = this.nodesTestDirectory - this.testFilePrefix = m.top.subtype() - else - this.testsDirectory = "pkg:/source/tests" - this.testFilePrefix = "Test__" - end if - this.testSuitePrefix = "TestSuite__" - this.testSuiteName = "" - this.testCaseName = "" - this.failFast = false - this.testsFilter = [] - - ' Interface - this.Run = TestRunner__Run - this.SetTestsDirectory = TestRunner__SetTestsDirectory - this.SetTestFilePrefix = TestRunner__SetTestFilePrefix - this.SetTestSuitePrefix = TestRunner__SetTestSuitePrefix - this.SetTestSuiteName = TestRunner__SetTestSuiteName ' Obsolete, will be removed in next versions - this.SetTestCaseName = TestRunner__SetTestCaseName ' Obsolete, will be removed in next versions - this.SetFailFast = TestRunner__SetFailFast - this.SetFunctions = TestRunner__SetFunctions - this.SetIncludeFilter = TestRunner__SetIncludeFilter - this.SetExcludeFilter = TestRunner__SetExcludeFilter - this.SetTestsFilter = TestRunner__SetTestsFilter - - ' Internal functions - this.GetTestFilesList = TestRunner__GetTestFilesList - this.GetTestSuitesList = TestRunner__GetTestSuitesList - this.GetTestNodesList = TestRunner__GetTestNodesList - this.GetTestSuiteNamesList = TestRunner__GetTestSuiteNamesList - this.GetIncludeFilter = TestRunner__GetIncludeFilter - this.GetExcludeFilter = TestRunner__GetExcludeFilter - - return this + this = {} + GetGlobalAA().globalErrorsList = [] + this.isNodeMode = GetGlobalAA().top <> Invalid + this.Logger = Logger() + + ' Internal properties + this.SKIP_TEST_MESSAGE_PREFIX = "SKIP_TEST_MESSAGE_PREFIX__" + this.nodesTestDirectory = "pkg:/components/tests" + if (this.isNodeMode) + this.testsDirectory = this.nodesTestDirectory + this.testFilePrefix = m.top.subtype() + else + this.testsDirectory = "pkg:/source/tests" + this.testFilePrefix = "Test__" + end if + this.testSuitePrefix = "TestSuite__" + this.testSuiteName = "" + this.testCaseName = "" + this.failFast = false + this.testsFilter = [] + + ' Interface + this.Run = TestRunner__Run + this.SetTestsDirectory = TestRunner__SetTestsDirectory + this.SetTestFilePrefix = TestRunner__SetTestFilePrefix + this.SetTestSuitePrefix = TestRunner__SetTestSuitePrefix + this.SetTestSuiteName = TestRunner__SetTestSuiteName ' Obsolete, will be removed in next versions + this.SetTestCaseName = TestRunner__SetTestCaseName ' Obsolete, will be removed in next versions + this.SetFailFast = TestRunner__SetFailFast + this.SetFunctions = TestRunner__SetFunctions + this.SetIncludeFilter = TestRunner__SetIncludeFilter + this.SetExcludeFilter = TestRunner__SetExcludeFilter + this.SetTestsFilter = TestRunner__SetTestsFilter + + ' Internal functions + this.GetTestFilesList = TestRunner__GetTestFilesList + this.GetTestSuitesList = TestRunner__GetTestSuitesList + this.GetTestNodesList = TestRunner__GetTestNodesList + this.GetTestSuiteNamesList = TestRunner__GetTestSuiteNamesList + this.GetIncludeFilter = TestRunner__GetIncludeFilter + this.GetExcludeFilter = TestRunner__GetExcludeFilter + + return this end function ' ---------------------------------------------------------------- @@ -1533,246 +1551,247 @@ end function ' @return Statistic object if run in node mode, invalid otherwise ' ---------------------------------------------------------------- function TestRunner__Run(statObj = m.Logger.CreateTotalStatistic() as Object, testSuiteNamesList = [] as Object) as Object - alltestCount = 0 - totalStatObj = statObj - testSuitesList = m.GetTestSuitesList(testSuiteNamesList) - - globalErrorsList = GetGlobalAA().globalErrorsList - for each testSuite in testSuitesList - testCases = testSuite.testCases - testCount = testCases.Count() - alltestCount = alltestCount + testCount - - IS_NEW_APPROACH = testSuite.IS_NEW_APPROACH - ' create dedicated env for each test, so that they will have not global m and don't rely on m.that is set in another suite - env = {} - - if TF_Utils__IsFunction(testSuite.SetUp) - m.Logger.PrintSuiteSetUp(testSuite.Name) - if IS_NEW_APPROACH then - env.functionToCall = testSuite.SetUp + alltestCount = 0 + totalStatObj = statObj + testSuitesList = m.GetTestSuitesList(testSuiteNamesList) + + globalErrorsList = GetGlobalAA().globalErrorsList + for each testSuite in testSuitesList + testCases = testSuite.testCases + testCount = testCases.Count() + alltestCount = alltestCount + testCount + + IS_NEW_APPROACH = testSuite.IS_NEW_APPROACH + ' create dedicated env for each test, so that they will have not global m and don't rely on m.that is set in another suite + env = {} + + if (TF_Utils__IsFunction(testSuite.SetUp)) + m.Logger.PrintSuiteSetUp(testSuite.Name) + if (IS_NEW_APPROACH) + env.functionToCall = testSuite.SetUp + env.functionToCall() + else + testSuite.SetUp() + end if + end if + + suiteStatObj = m.Logger.CreateSuiteStatistic(testSuite.Name) + ' Initiate empty test statistics object to print results if no tests was run + testStatObj = m.Logger.CreateTestStatistic("", "Success", 0, 0, "", true) + for each testCase in testCases + ' clear all existing errors + globalErrorsList.clear() + + if m.testCaseName = "" OR (m.testCaseName <> "" AND LCase(testCase.Name) = LCase(m.testCaseName)) + skipTest = TF_Utils__AsBoolean(testCase.skip) + + if (TF_Utils__IsFunction(testCase.SetUp) AND NOT skipTest) + m.Logger.PrintTestSetUp(testCase.Name) + if (IS_NEW_APPROACH) + env.functionToCall = testCase.SetUp + env.functionToCall() + else + testCase.SetUp() + end if + end if + + testTimer = CreateObject("roTimespan") + testStatObj = m.Logger.CreateTestStatistic(testCase.Name) + + if (skipTest) + runResult = m.SKIP_TEST_MESSAGE_PREFIX + "Test was skipped according to specified filters" + else + testSuite.testInstance = testCase + testSuite.testCase = testCase.Func + + runResult = "" + if (IS_NEW_APPROACH) + env.functionToCall = testCase.Func + + if (GetInterface(env.functionToCall, "ifFunction") <> Invalid) + if (testCase.hasArguments) + env.functionToCall(testCase.arg) + else env.functionToCall() + end if else - testSuite.SetUp() + UTF_fail("Failed to execute test """ + testCase.Name + """ function pointer not found") end if + else + runResult = testSuite.testCase() + end if end if - suiteStatObj = m.Logger.CreateSuiteStatistic(testSuite.Name) - ' Initiate empty test statistics object to print results if no tests was run - testStatObj = m.Logger.CreateTestStatistic("", "Success", 0, 0, "", true) - for each testCase in testCases - ' clear all existing errors - globalErrorsList.clear() - - if m.testCaseName = "" or (m.testCaseName <> "" and LCase(testCase.Name) = LCase(m.testCaseName)) - skipTest = TF_Utils__AsBoolean(testCase.skip) - - if TF_Utils__IsFunction(testCase.SetUp) and not skipTest - m.Logger.PrintTestSetUp(testCase.Name) - if IS_NEW_APPROACH then - env.functionToCall = testCase.SetUp - env.functionToCall() - else - testCase.SetUp() - end if - end if - - testTimer = CreateObject("roTimespan") - testStatObj = m.Logger.CreateTestStatistic(testCase.Name) - - if skipTest - runResult = m.SKIP_TEST_MESSAGE_PREFIX + "Test was skipped according to specified filters" - else - testSuite.testInstance = testCase - testSuite.testCase = testCase.Func - - runResult = "" - if IS_NEW_APPROACH then - env.functionToCall = testCase.Func - - if GetInterface(env.functionToCall, "ifFunction") <> invalid - if testCase.hasArguments then - env.functionToCall(testCase.arg) - else - env.functionToCall() - end if - else - UTF_fail("Failed to execute test """ + testCase.Name + """ function pointer not found") - end if - else - runResult = testSuite.testCase() - end if - end if - - if TF_Utils__IsFunction(testCase.TearDown) and not skipTest - m.Logger.PrintTestTearDown(testCase.Name) - if IS_NEW_APPROACH then - env.functionToCall = testCase.TearDown - env.functionToCall() - else - testCase.TearDown() - end if - end if - - if IS_NEW_APPROACH then - if globalErrorsList.count() > 0 - for each error in globalErrorsList - runResult += error + Chr(10) + String(10, "-") + Chr(10) - end for - end if - end if - - if runResult <> "" - if InStr(0, runResult, m.SKIP_TEST_MESSAGE_PREFIX) = 1 - testStatObj.result = "Skipped" - testStatObj.message = runResult.Mid(Len(m.SKIP_TEST_MESSAGE_PREFIX)) ' remove prefix from the message - else - testStatObj.Result = "Fail" - testStatObj.Error.Code = 1 - testStatObj.Error.Message = runResult - end if - else - testStatObj.Result = "Success" - end if - - testStatObj.Time = testTimer.TotalMilliseconds() - m.Logger.AppendTestStatistic(suiteStatObj, testStatObj) - - if testStatObj.Result = "Fail" and m.failFast - suiteStatObj.Result = "Fail" - exit for - end if - end if - end for + if (TF_Utils__IsFunction(testCase.TearDown) AND NOT skipTest) + m.Logger.PrintTestTearDown(testCase.Name) + if (IS_NEW_APPROACH) + env.functionToCall = testCase.TearDown + env.functionToCall() + else + testCase.TearDown() + end if + end if - m.Logger.AppendSuiteStatistic(totalStatObj, suiteStatObj) + if (IS_NEW_APPROACH) + if (globalErrorsList.count() > 0) + for each error in globalErrorsList + runResult += error + Chr(10) + String(10, "-") + Chr(10) + end for + end if + end if - if TF_Utils__IsFunction(testSuite.TearDown) - m.Logger.PrintSuiteTearDown(testSuite.Name) - testSuite.TearDown() + if (runResult <> "") + if Instr(0, runResult, m.SKIP_TEST_MESSAGE_PREFIX) = 1 + testStatObj.result = "Skipped" + testStatObj.message = runResult.Mid(Len(m.SKIP_TEST_MESSAGE_PREFIX)) ' remove prefix from the message + else + testStatObj.Result = "Fail" + testStatObj.Error.Code = 1 + testStatObj.Error.Message = runResult + end if + else + testStatObj.Result = "Success" end if - if suiteStatObj.Result = "Fail" and m.failFast - exit for + testStatObj.Time = testTimer.TotalMilliseconds() + m.Logger.AppendTestStatistic(suiteStatObj, testStatObj) + + if testStatObj.Result = "Fail" AND m.failFast + suiteStatObj.Result = "Fail" + exit for end if + end if end for - gthis = GetGlobalAA() - msg = "" - if gthis.notFoundFunctionPointerList <> invalid then - msg = Chr(10) + String(40, "---") + Chr(10) - if m.isNodeMode - fileNamesString = "" - - for each testSuiteObject in testSuiteNamesList - if GetInterface(testSuiteObject, "ifString") <> invalid then - fileNamesString += testSuiteObject + ".brs, " - else if GetInterface(testSuiteObject, "ifAssociativeArray") <> invalid then - if testSuiteObject.filePath <> invalid then - fileNamesString += testSuiteObject.filePath + ", " - end if - end if - end for + m.Logger.AppendSuiteStatistic(totalStatObj, suiteStatObj) - msg += Chr(10) + "Create this function below in one of these files" - msg += Chr(10) + fileNamesString + Chr(10) + if (TF_Utils__IsFunction(testSuite.TearDown)) + m.Logger.PrintSuiteTearDown(testSuite.Name) + testSuite.TearDown() + end if - msg += Chr(10) + "sub init()" - end if - msg += Chr(10) + "Runner.SetFunctions([" + Chr(10) + " testCase" + Chr(10) + "])" - msg += Chr(10) + "For example we think this might resolve your issue" - msg += Chr(10) + "Runner = TestRunner()" - msg += Chr(10) + "Runner.SetFunctions([" - - tmpMap = {} - for each functionName in gthis.notFoundFunctionPointerList - if tmpMap[functionName] = invalid then - tmpMap[functionName] = "" - msg += Chr(10) + " " + functionName - end if - end for + if suiteStatObj.Result = "Fail" AND m.failFast + exit for + end if + end for - msg += Chr(10) + "])" - if m.isNodeMode then - msg += Chr(10) + "end sub" - else - msg += Chr(10) + "Runner.Run()" + gthis = GetGlobalAA() + msg = "" + if (gthis.notFoundFunctionPointerList <> Invalid) + msg = Chr(10) + String(40, "---") + Chr(10) + if (m.isNodeMode) + fileNamesString = "" + + for each testSuiteObject in testSuiteNamesList + if (GetInterface(testSuiteObject, "ifString") <> Invalid) + fileNamesString += testSuiteObject + ".brs, " + else if (GetInterface(testSuiteObject, "ifAssociativeArray") <> Invalid) + if (testSuiteObject.filePath <> Invalid) + fileNamesString += testSuiteObject.filePath + ", " + end if end if + end for + + msg += Chr(10) + "Create this function below in one of these files" + msg += Chr(10) + fileNamesString + Chr(10) + + msg += Chr(10) + "sub init()" end if + msg += Chr(10) + "Runner.SetFunctions([" + Chr(10) + " testCase" + Chr(10) + "])" + msg += Chr(10) + "For example we think this might resolve your issue" + msg += Chr(10) + "Runner = TestRunner()" + msg += Chr(10) + "Runner.SetFunctions([" - if m.isNodeMode - if msg.Len() > 0 then - if totalStatObj.notFoundFunctionsMessage = invalid then totalStatObj.notFoundFunctionsMessage = "" - totalStatObj.notFoundFunctionsMessage += msg - end if - return totalStatObj + tmpMap = {} + for each functionName in gthis.notFoundFunctionPointerList + if tmpMap[functionName] = Invalid + tmpMap[functionName] = "" + msg += Chr(10) + " " + functionName + end if + end for + + msg += Chr(10) + "])" + if (m.isNodeMode) + msg += Chr(10) + "end sub" else - testNodes = m.getTestNodesList() - if m.testsFilter.count() > 0 - filteredNodes = [] - for each testNodeName in testNodes - for each filterPattern in m.testsFilter - regexStr = filterPattern.replace("*", ".*") - regex = CreateObject("roRegex", "^" + regexStr + "$", "i") - if regex.isMatch(testNodeName) - filteredNodes.push(testNodeName) - exit for - end if - end for - end for - testNodes = filteredNodes - end if - for each testNodeName in testNodes - testNode = CreateObject("roSGNode", testNodeName) - if testNode <> invalid - testSuiteNamesList = m.GetTestSuiteNamesList(testNodeName) - if CreateObject("roSGScreen").CreateScene(testNodeName) <> invalid - ? "WARNING: Test cases cannot be run in main scene." - for each testSuiteName in testSuiteNamesList - suiteStatObj = m.Logger.CreateSuiteStatistic(testSuiteName) - suiteStatObj.fail = 1 - suiteStatObj.total = 1 - m.Logger.AppendSuiteStatistic(totalStatObj, suiteStatObj) - end for - else - params = [m, totalStatObj, testSuiteNamesList, m.GetIncludeFilter(), m.GetExcludeFilter()] - tmp = testNode.callFunc("TestFramework__RunNodeTests", params) - if tmp <> invalid then - totalStatObj = tmp - end if - end if - end if + msg += Chr(10) + "Runner.Run()" + end if + end if + + if (m.isNodeMode) + if (msg.Len() > 0) + if totalStatObj.notFoundFunctionsMessage = Invalid then totalStatObj.notFoundFunctionsMessage = "" + totalStatObj.notFoundFunctionsMessage += msg + end if + + return totalStatObj + else + testNodes = m.getTestNodesList() + if (m.testsFilter.count() > 0) + filteredNodes = [] + for each testNodeName in testNodes + for each filterPattern in m.testsFilter + regexStr = filterPattern.replace("*", ".*") + regex = CreateObject("roRegex", "^" + regexStr + "$", "i") + if (regex.isMatch(testNodeName)) + filteredNodes.push(testNodeName) + exit for + end if end for + end for + testNodes = filteredNodes + end if + for each testNodeName in testNodes + testNode = CreateObject("roSGNode", testNodeName) + if (testNode <> Invalid) + testSuiteNamesList = m.GetTestSuiteNamesList(testNodeName) + if (CreateObject("roSGScreen").CreateScene(testNodeName) <> Invalid) + ? "WARNING: Test cases cannot be run in main scene." + for each testSuiteName in testSuiteNamesList + suiteStatObj = m.Logger.CreateSuiteStatistic(testSuiteName) + suiteStatObj.fail = 1 + suiteStatObj.total = 1 + m.Logger.AppendSuiteStatistic(totalStatObj, suiteStatObj) + end for + else + params = [m, totalStatObj, testSuiteNamesList, m.GetIncludeFilter(), m.GetExcludeFilter()] + tmp = testNode.callFunc("TestFramework__RunNodeTests", params) + if (tmp <> Invalid) + totalStatObj = tmp + end if + end if + end if + end for - m.Logger.PrintStatistic(totalStatObj) - end if + m.Logger.PrintStatistic(totalStatObj) + end if - if msg.Len() > 0 or totalStatObj.notFoundFunctionsMessage <> invalid then - title = "" - title += Chr(10) + "NOTE: If some your tests haven't been executed this might be due to outdated list of functions" - title += Chr(10) + "To resolve this issue please execute" + Chr(10) + Chr(10) + if (msg.Len() > 0 OR totalStatObj.notFoundFunctionsMessage <> Invalid) + title = "" + title += Chr(10) + "NOTE: If some your tests haven't been executed this might be due to outdated list of functions" + title += Chr(10) + "To resolve this issue please execute" + Chr(10) + Chr(10) - title += msg + title += msg - if totalStatObj.notFoundFunctionsMessage <> invalid then - title += totalStatObj.notFoundFunctionsMessage - end if - ? title + if (totalStatObj.notFoundFunctionsMessage <> Invalid) + title += totalStatObj.notFoundFunctionsMessage end if + ? title + end if end function ' ---------------------------------------------------------------- ' Set testsDirectory property. ' ---------------------------------------------------------------- sub TestRunner__SetTestsDirectory(testsDirectory as String) - m.testsDirectory = testsDirectory + m.testsDirectory = testsDirectory end sub ' ---------------------------------------------------------------- ' Set testFilePrefix property. ' ---------------------------------------------------------------- sub TestRunner__SetTestFilePrefix(testFilePrefix as String) - m.testFilePrefix = testFilePrefix + m.testFilePrefix = testFilePrefix end sub ' ---------------------------------------------------------------- @@ -1781,35 +1800,35 @@ end sub ' Each entry should be a full test node name, e.g. "Test__Tile_". ' ---------------------------------------------------------------- sub TestRunner__SetTestsFilter(testsFilter as Object) - m.testsFilter = testsFilter + m.testsFilter = testsFilter end sub ' ---------------------------------------------------------------- ' Set testSuitePrefix property. ' ---------------------------------------------------------------- sub TestRunner__SetTestSuitePrefix(testSuitePrefix as String) - m.testSuitePrefix = testSuitePrefix + m.testSuitePrefix = testSuitePrefix end sub ' ---------------------------------------------------------------- ' Set testSuiteName property. ' ---------------------------------------------------------------- sub TestRunner__SetTestSuiteName(testSuiteName as String) - m.testSuiteName = testSuiteName + m.testSuiteName = testSuiteName end sub ' ---------------------------------------------------------------- ' Set testCaseName property. ' ---------------------------------------------------------------- sub TestRunner__SetTestCaseName(testCaseName as String) - m.testCaseName = testCaseName + m.testCaseName = testCaseName end sub ' ---------------------------------------------------------------- ' Set failFast property. ' ---------------------------------------------------------------- sub TestRunner__SetFailFast(failFast = false as Boolean) - m.failFast = failFast + m.failFast = failFast end sub ' ---------------------------------------------------------------- @@ -1820,400 +1839,400 @@ end sub ' @return An array of test suites. ' ---------------------------------------------------------------- function TestRunner__GetTestSuitesList(testSuiteNamesList = [] as Object) as Object - result = [] - - if testSuiteNamesList.count() > 0 - for each value in testSuiteNamesList - if TF_Utils__IsString(value) then - tmpTestSuiteFunction = TestFramework__getFunctionPointer(value) - if tmpTestSuiteFunction <> invalid then - testSuite = tmpTestSuiteFunction() - - if TF_Utils__IsAssociativeArray(testSuite) - result.Push(testSuite) - end if - end if - ' also we can get AA that will give source code and filePath - ' Please be aware this is executed in render thread - else if GetInterface(value, "ifAssociativeArray") <> invalid then - ' try to use new approach - testSuite = ScanFileForNewTests(value.code, value.filePath) - if testSuite <> invalid then - result.push(testSuite) - end if - else if GetInterface(value, "ifFunction") <> invalid then - result.Push(value) - end if - end for - else - testSuiteRegex = CreateObject("roRegex", "^(function|sub)\s(" + m.testSuitePrefix + m.testSuiteName + "[0-9a-z\_]*)\s*\(", "i") - testFilesList = m.GetTestFilesList() - - for each filePath in testFilesList - code = TF_Utils__AsString(ReadAsciiFile(filePath)) - - if code <> "" - foundTestSuite = false - for each line in code.Tokenize(Chr(10)) - line.Trim() - - if testSuiteRegex.IsMatch(line) - testSuite = invalid - functionName = testSuiteRegex.Match(line).Peek() - - tmpTestSuiteFunction = TestFramework__getFunctionPointer(functionName) - if tmpTestSuiteFunction <> invalid then - testSuite = tmpTestSuiteFunction() - - if TF_Utils__IsAssociativeArray(testSuite) - result.Push(testSuite) - foundTestSuite = true - else - ' TODO check if we need this - ' using new mode -' testSuite = ScanFileForNewTests(code, filePath) - -' exit for - end if - end if - end if - end for - if not foundTestSuite then - testSuite = ScanFileForNewTests(code, filePath) - if testSuite <> invalid then - result.push(testSuite) - end if - end if + result = [] + + if (testSuiteNamesList.count() > 0) + for each value in testSuiteNamesList + if (TF_Utils__IsString(value)) + tmpTestSuiteFunction = TestFramework__getFunctionPointer(value) + if (tmpTestSuiteFunction <> Invalid) + testSuite = tmpTestSuiteFunction() + + if (TF_Utils__IsAssociativeArray(testSuite)) + result.Push(testSuite) + end if + end if + ' also we can get AA that will give source code and filePath + ' Please be aware this is executed in render thread + else if (GetInterface(value, "ifAssociativeArray") <> Invalid) + ' try to use new approach + testSuite = ScanFileForNewTests(value.code, value.filePath) + if (testSuite <> Invalid) + result.push(testSuite) + end if + else if (GetInterface(value, "ifFunction") <> Invalid) + result.Push(value) + end if + end for + else + testSuiteRegex = CreateObject("roRegex", "^(function|sub)\s(" + m.testSuitePrefix + m.testSuiteName + "[0-9a-z\_]*)\s*\(", "i") + testFilesList = m.GetTestFilesList() + + for each filePath in testFilesList + code = TF_Utils__AsString(ReadAsciiFile(filePath)) + + if (code <> "") + foundTestSuite = false + for each line in code.Tokenize(Chr(10)) + line.Trim() + + if (testSuiteRegex.IsMatch(line)) + testSuite = Invalid + functionName = testSuiteRegex.Match(line).Peek() + tmpTestSuiteFunction = TestFramework__getFunctionPointer(functionName) + if (tmpTestSuiteFunction <> Invalid) + testSuite = tmpTestSuiteFunction() + + if (TF_Utils__IsAssociativeArray(testSuite)) + result.Push(testSuite) + foundTestSuite = true + else + ' TODO check if we need this + ' using new mode + ' testSuite = ScanFileForNewTests(code, filePath) + + ' exit for + end if end if + end if end for - end if - - return result -end function + if (NOT foundTestSuite) + testSuite = ScanFileForNewTests(code, filePath) + if (testSuite <> Invalid) + result.push(testSuite) + end if + end if + end if + end for + end if + + return result +end function + +function ScanFileForNewTests(souceCode as String, filePath as String) as Object + foundAnyTest = false + testSuite = BaseTestSuite() + + allowedAnnotationsRegex = CreateObject("roRegex", "^'\s*@(test|beforeall|beforeeach|afterall|aftereach|repeatedtest|parameterizedtest|methodsource|ignore)\s*|\n", "i") + voidFunctionRegex = CreateObject("roRegex", "^(function|sub)\s([a-z0-9A-Z_]*)\(\)", "i") + anyArgsFunctionRegex = CreateObject("roRegex", "^(function|sub)\s([a-z0-9A-Z_]*)\(", "i") + + processors = { + testSuite: testSuite, + filePath: filePath, + currentLine: "", + annotations: {}, + + functionName: "", + tests: [], + + beforeEachFunc: Invalid, + beforeAllFunc: Invalid, + + AfterEachFunc: Invalid, + AfterAllFunc: Invalid, + + isParameterizedTest: false, + MethodForArguments: "", + executedParametrizedAdding: false, + + test: sub() + skipTest = m.doSkipTest(m.functionName) + funcPointer = m.getFunctionPointer(m.functionName) + m.tests.push({ name: m.functionName, pointer: funcPointer, skip: skipTest }) + end sub + + repeatedtest: sub() + allowedAnnotationsRegex = CreateObject("roRegex", "^'\s*@(repeatedtest)\((\d*)\)", "i") + annotationLine = m.annotations["repeatedtest"].line + if (allowedAnnotationsRegex.IsMatch(annotationLine)) + groups = allowedAnnotationsRegex.Match(annotationLine) + numberOfLoops = groups[2] + if (numberOfLoops <> Invalid AND TF_Utils__AsInteger(numberOfLoops) > 0) + numberOfLoops = TF_Utils__AsInteger(numberOfLoops) + funcPointer = m.getFunctionPointer(m.functionName) + for index = 1 to numberOfLoops + skipTest = m.doSkipTest(m.functionName) + text = " " + index.tostr() + " of " + numberOfLoops.tostr() + m.tests.push({ name: m.functionName + text, pointer: funcPointer, skip: skipTest }) + end for + end if + else + ? "WARNING: Wrong format of repeatedTest(numberOfRuns) "annotationLine + end if + end sub -function ScanFileForNewTests(souceCode, filePath) - foundAnyTest = false - testSuite = BaseTestSuite() + parameterizedTest: sub() + m.processParameterizedTests() + end sub - allowedAnnotationsRegex = CreateObject("roRegex", "^'\s*@(test|beforeall|beforeeach|afterall|aftereach|repeatedtest|parameterizedtest|methodsource|ignore)\s*|\n", "i") - voidFunctionRegex = CreateObject("roRegex", "^(function|sub)\s([a-z0-9A-Z_]*)\(\)", "i") - anyArgsFunctionRegex = CreateObject("roRegex", "^(function|sub)\s([a-z0-9A-Z_]*)\(", "i") + methodSource: sub() + m.processParameterizedTests() + end sub - processors = { - testSuite: testSuite - filePath: filePath - currentLine: "" - annotations: {} + processParameterizedTests: sub() + ' add test if it was not added already + if (NOT m.executedParametrizedAdding) + if (m.annotations.methodSource <> Invalid AND m.annotations.parameterizedTest <> Invalid) + methodAnottation = m.annotations.methodSource.line - functionName: "" + allowedAnnotationsRegex = CreateObject("roRegex", "^'\s*@(methodsource)\(" + Chr(34) + "([A-Za-z0-9_]*)" + Chr(34) + "\)", "i") - tests: [] + if (allowedAnnotationsRegex.IsMatch(methodAnottation)) + groups = allowedAnnotationsRegex.Match(methodAnottation) + providerFunction = groups[2] - beforeEachFunc: invalid - beforeAllFunc: invalid + providerFunctionPointer = m.getFunctionPointer(providerFunction) - AfterEachFunc: invalid - AfterAllFunc: invalid + if (providerFunctionPointer <> Invalid) + funcPointer = m.getFunctionPointer(m.functionName) - isParameterizedTest: false - MethodForArguments: "" - executedParametrizedAdding: false + args = providerFunctionPointer() - test: sub() - skipTest = m.doSkipTest(m.functionName) - funcPointer = m.getFunctionPointer(m.functionName) - m.tests.push({ name: m.functionName, pointer: funcPointer, skip: skipTest }) - end sub - - repeatedtest: sub() - allowedAnnotationsRegex = CreateObject("roRegex", "^'\s*@(repeatedtest)\((\d*)\)", "i") - annotationLine = m.annotations["repeatedtest"].line - if allowedAnnotationsRegex.IsMatch(annotationLine) - groups = allowedAnnotationsRegex.Match(annotationLine) - numberOfLoops = groups[2] - if numberOfLoops <> invalid and TF_Utils__AsInteger(numberOfLoops) > 0 then - numberOfLoops = TF_Utils__AsInteger(numberOfLoops) - funcPointer = m.getFunctionPointer(m.functionName) - for index = 1 to numberOfLoops - skipTest = m.doSkipTest(m.functionName) - text = " " + index.tostr() + " of " + numberOfLoops.tostr() - m.tests.push({ name: m.functionName + text, pointer: funcPointer, skip: skipTest }) - end for - end if + index = 1 + for each arg in args + skipTest = m.doSkipTest(m.functionName) + text = " " + index.tostr() + " of " + args.count().tostr() + m.tests.push({ name: m.functionName + text, pointer: funcPointer, arg: arg, hasArgs: true, skip: skipTest }) + index++ + end for else - ? "WARNING: Wrong format of repeatedTest(numberOfRuns) "annotationLine - end if - end sub - - parameterizedTest: sub() - m.processParameterizedTests() - end sub - - methodSource: sub() - m.processParameterizedTests() - end sub - - processParameterizedTests: sub() - ' add test if it was not added already - if not m.executedParametrizedAdding - if m.annotations.methodSource <> invalid and m.annotations.parameterizedTest <> invalid then - methodAnottation = m.annotations.methodSource.line - - allowedAnnotationsRegex = CreateObject("roRegex", "^'\s*@(methodsource)\(" + Chr(34) + "([A-Za-z0-9_]*)" + Chr(34) + "\)", "i") - - if allowedAnnotationsRegex.IsMatch(methodAnottation) - groups = allowedAnnotationsRegex.Match(methodAnottation) - providerFunction = groups[2] - - providerFunctionPointer = m.getFunctionPointer(providerFunction) - - if providerFunctionPointer <> invalid then - funcPointer = m.getFunctionPointer(m.functionName) - - args = providerFunctionPointer() - - index = 1 - for each arg in args - skipTest = m.doSkipTest(m.functionName) - text = " " + index.tostr() + " of " + args.count().tostr() - m.tests.push({ name: m.functionName + text, pointer: funcPointer, arg: arg, hasArgs: true, skip: skipTest }) - index++ - end for - else - ? "WARNING: Cannot find function [" providerFunction "]" - end if - end if - else - ? "WARNING: Wrong format of @ParameterizedTest \n @MethodSource(providerFunctionName)" - ? "m.executedParametrizedAdding = "m.executedParametrizedAdding - ? "m.annotations.methodSource = "m.annotations.methodSource - ? "m.annotations.parameterizedTest = "m.annotations.parameterizedTest - ? "" - end if + ? "WARNING: Cannot find function [" providerFunction "]" end if - end sub - - beforeEach: sub() - m.beforeEachFunc = m.getFunctionPointer(m.functionName) - end sub - - beforeAll: sub() - m.beforeAllFunc = m.getFunctionPointer(m.functionName) - end sub - - AfterEach: sub() - m.AfterEachFunc = m.getFunctionPointer(m.functionName) - end sub - - AfterAll: sub() - m.AfterAllFunc = m.getFunctionPointer(m.functionName) - end sub - - ignore: sub() - funcPointer = m.getFunctionPointer(m.functionName) - m.tests.push({ name: m.functionName, pointer: funcPointer, skip: true }) - end sub - - doSkipTest: function(name as String) - includeFilter = [] - excludeFilter = [] - - gthis = GetGlobalAA() - if gthis.IncludeFilter <> invalid then includeFilter.append(gthis.IncludeFilter) - if gthis.ExcludeFilter <> invalid then excludeFilter.append(gthis.ExcludeFilter) - - ' apply test filters - skipTest = false - ' skip test if it is found in exclude filter - for each testName in excludeFilter - if TF_Utils__IsNotEmptyString(testName) and LCase(testName.Trim()) = LCase(name.Trim()) - skipTest = true - exit for - end if - end for - - ' skip test if it is not found in include filter - if not skipTest and includeFilter.Count() > 0 - foundInIncludeFilter = false - - for each testName in includeFilter - if TF_Utils__IsNotEmptyString(testName) and LCase(testName) = LCase(name) - foundInIncludeFilter = true - exit for - end if - end for + end if + else + ? "WARNING: Wrong format of @ParameterizedTest \n @MethodSource(providerFunctionName)" + ? "m.executedParametrizedAdding = "m.executedParametrizedAdding + ? "m.annotations.methodSource = "m.annotations.methodSource + ? "m.annotations.parameterizedTest = "m.annotations.parameterizedTest + ? "" + end if + end if + end sub + + beforeEach: sub() + m.beforeEachFunc = m.getFunctionPointer(m.functionName) + end sub + + beforeAll: sub() + m.beforeAllFunc = m.getFunctionPointer(m.functionName) + end sub + + AfterEach: sub() + m.AfterEachFunc = m.getFunctionPointer(m.functionName) + end sub + + AfterAll: sub() + m.AfterAllFunc = m.getFunctionPointer(m.functionName) + end sub + + ignore: sub() + funcPointer = m.getFunctionPointer(m.functionName) + m.tests.push({ name: m.functionName, pointer: funcPointer, skip: true }) + end sub + + doSkipTest: function(name as String) + includeFilter = [] + excludeFilter = [] + + gthis = GetGlobalAA() + if gthis.IncludeFilter <> Invalid then includeFilter.append(gthis.IncludeFilter) + if gthis.ExcludeFilter <> Invalid then excludeFilter.append(gthis.ExcludeFilter) + + ' apply test filters + skipTest = false + ' skip test if it is found in exclude filter + for each testName in excludeFilter + if TF_Utils__IsNotEmptyString(testName) AND LCase(testName.Trim()) = LCase(name.Trim()) + skipTest = true + exit for + end if + end for - skipTest = not foundInIncludeFilter - end if + ' skip test if it is not found in include filter + if (NOT skipTest AND includeFilter.Count() > 0) + foundInIncludeFilter = false - return skipTest - end function - - buildTests: sub() - testSuite = m.testSuite - testSuite.Name = m.filePath - if m.beforeAllFunc <> invalid then testSuite.SetUp = m.beforeAllFunc - if m.AfterAllFunc <> invalid then testSuite.TearDown = m.AfterAllFunc - testSuite.IS_NEW_APPROACH = true - - for each test in m.tests - ' Add tests to suite's tests collection - arg = invalid - hasArgs = false - if test.hasArgs <> invalid then - arg = test.arg - hasArgs = true - end if - - testSuite.addTest(test.name, test.pointer, m.beforeEachFunc, m.AfterEachFunc, arg, hasArgs, test.skip) - end for - end sub + for each testName in includeFilter + if TF_Utils__IsNotEmptyString(testName) AND LCase(testName) = LCase(name) + foundInIncludeFilter = true + exit for + end if + end for - getFunctionPointer: TestFramework__getFunctionPointer - } + skipTest = NOT foundInIncludeFilter + end if + + return skipTest + end function + + buildTests: sub() + testSuite = m.testSuite + testSuite.Name = m.filePath + if m.beforeAllFunc <> Invalid then testSuite.SetUp = m.beforeAllFunc + if m.AfterAllFunc <> Invalid then testSuite.TearDown = m.AfterAllFunc + testSuite.IS_NEW_APPROACH = true + + for each test in m.tests + ' Add tests to suite's tests collection + arg = Invalid + hasArgs = false + if (test.hasArgs <> Invalid) + arg = test.arg + hasArgs = true + end if - currentAnottations = [] - index = 0 - - for each line in souceCode.Tokenize(Chr(10)) - line = line.Trim() - if line <> "" ' skipping empty lines - if allowedAnnotationsRegex.IsMatch(line) - groups = allowedAnnotationsRegex.Match(line) - anottationType = groups[1] - if anottationType <> invalid and processors[anottationType] <> invalid then - currentAnottations.push(anottationType) - processors.annotations[anottationType] = { line: line, lineIndex: index } - end if - else - if currentAnottations.count() > 0 then - isParametrized = anyArgsFunctionRegex.IsMatch(line) - properMap = { parameterizedtest: "", methodsource: "" } - for each availableAnottation in currentAnottations - isParametrized = isParametrized or properMap[availableAnottation] <> invalid - end for - - if voidFunctionRegex.IsMatch(line) or isParametrized then - groups = voidFunctionRegex.Match(line) - - if isParametrized then - groups = anyArgsFunctionRegex.Match(line) - end if - if groups[2] <> invalid then - processors.functionName = groups[2] - processors.currentLine = line - - ' process all handlers - if isParametrized then processors.executedParametrizedAdding = false - for each availableAnottation in currentAnottations - processors[availableAnottation]() - if isParametrized then processors.executedParametrizedAdding = true - end for - currentAnottations = [] - processors.annotations = {} - foundAnyTest = true - end if - else - ' invalidating annotation - ' TODO print message here that we skipped annotation - ? "WARNING: annotation " currentAnottations " isparametrized=" isParametrized " skipped at line " index ":[" line "]" - processors.annotations = {} - currentAnottations = [] - end if - end if + testSuite.addTest(test.name, test.pointer, m.beforeEachFunc, m.AfterEachFunc, arg, hasArgs, test.skip) + end for + end sub + + getFunctionPointer: TestFramework__getFunctionPointer, + } + + currentAnottations = [] + index = 0 + + for each line in souceCode.Tokenize(Chr(10)) + line = line.Trim() + if (line <> "") ' skipping empty lines + if (allowedAnnotationsRegex.IsMatch(line)) + groups = allowedAnnotationsRegex.Match(line) + anottationType = groups[1] + if (anottationType <> Invalid AND processors[anottationType] <> Invalid) + currentAnottations.push(anottationType) + processors.annotations[anottationType] = { line: line, lineIndex: index } + end if + else + if (currentAnottations.count() > 0) + isParametrized = anyArgsFunctionRegex.IsMatch(line) + properMap = { parameterizedtest: "", methodsource: "" } + for each availableAnottation in currentAnottations + isParametrized = isParametrized OR properMap[availableAnottation] <> Invalid + end for + + if (voidFunctionRegex.IsMatch(line) OR isParametrized) + groups = voidFunctionRegex.Match(line) + + if (isParametrized) + groups = anyArgsFunctionRegex.Match(line) + end if + if (groups[2] <> Invalid) + processors.functionName = groups[2] + processors.currentLine = line + + ' process all handlers + if isParametrized then processors.executedParametrizedAdding = false + for each availableAnottation in currentAnottations + processors[availableAnottation]() + if isParametrized then processors.executedParametrizedAdding = true + end for + currentAnottations = [] + processors.annotations = {} + foundAnyTest = true end if + else + ' invalidating annotation + ' TODO print message here that we skipped annotation + ? "WARNING: annotation " currentAnottations " isparametrized=" isParametrized " skipped at line " index ":[" line "]" + processors.annotations = {} + currentAnottations = [] + end if end if - index++ - end for + end if + end if + index++ + end for - processors.buildTests() + processors.buildTests() - if not foundAnyTest then - testSuite = invalid - end if - return testSuite + if (NOT foundAnyTest) + testSuite = Invalid + end if + + return testSuite end function function TestFramework__getFunctionPointer(functionName as String) as Dynamic - result = invalid - - gthis = GetGlobalAA() - if gthis.FunctionsList <> invalid then - for each value in gthis.FunctionsList - if Type(value) <> "" and LCase(Type(value)) <> "" and GetInterface(value, "ifFunction") <> invalid and LCase(value.tostr()) = "function: " + LCase(functionName) then - result = value - exit for - end if - end for - end if + result = Invalid + + gthis = GetGlobalAA() + if (gthis.FunctionsList <> Invalid) + for each value in gthis.FunctionsList + if Type(value) <> "" AND LCase(Type(value)) <> "" AND GetInterface(value, "ifFunction") <> Invalid AND LCase(value.tostr()) = "function: " + LCase(functionName) + result = value + exit for + end if + end for + end if - if LCase(Type(result)) = "" then result = invalid - if result = invalid then - if gthis.notFoundFunctionPointerList = invalid then gthis.notFoundFunctionPointerList = [] - gthis.notFoundFunctionPointerList.push(functionName) - end if - return result + if LCase(Type(result)) = "" then result = Invalid + if result = Invalid + if gthis.notFoundFunctionPointerList = Invalid then gthis.notFoundFunctionPointerList = [] + gthis.notFoundFunctionPointerList.push(functionName) + end if + + return result end function sub TestRunner__SetFunctions(listOfFunctions as Dynamic) - gthis = GetGlobalAA() + gthis = GetGlobalAA() - if gthis.FunctionsList = invalid then - gthis.FunctionsList = [] - end if - gthis.FunctionsList.append(listOfFunctions) + if gthis.FunctionsList = Invalid + gthis.FunctionsList = [] + end if + gthis.FunctionsList.append(listOfFunctions) end sub sub TestRunner__SetIncludeFilter(listOfFunctions as Dynamic) - gthis = GetGlobalAA() - - if gthis.IncludeFilter = invalid - gthis.IncludeFilter = [] - end if - - if TF_Utils__IsArray(listOfFunctions) - gthis.IncludeFilter.Append(listOfFunctions) - else if TF_Utils__IsNotEmptyString(listOfFunctions) - gthis.IncludeFilter.Append(listOfFunctions.Split(",")) - else - ? "WARNING: Could not parse input parameters for Include Filter. Filter wont be applied." - end if + gthis = GetGlobalAA() + + if gthis.IncludeFilter = Invalid + gthis.IncludeFilter = [] + end if + + if (TF_Utils__IsArray(listOfFunctions)) + gthis.IncludeFilter.Append(listOfFunctions) + else if (TF_Utils__IsNotEmptyString(listOfFunctions)) + gthis.IncludeFilter.Append(listOfFunctions.Split(",")) + else + ? "WARNING: Could not parse input parameters for Include Filter. Filter wont be applied." + end if end sub -function TestRunner__GetIncludeFilter() - gthis = GetGlobalAA() +function TestRunner__GetIncludeFilter() as Object + gthis = GetGlobalAA() - if gthis.IncludeFilter = invalid - gthis.IncludeFilter = [] - end if + if gthis.IncludeFilter = Invalid + gthis.IncludeFilter = [] + end if - return gthis.IncludeFilter + return gthis.IncludeFilter end function sub TestRunner__SetExcludeFilter(listOfFunctions as Dynamic) - gthis = GetGlobalAA() - - if gthis.ExcludeFilter = invalid - gthis.ExcludeFilter = [] - end if - - if TF_Utils__IsArray(listOfFunctions) - gthis.ExcludeFilter.Append(listOfFunctions) - else if TF_Utils__IsNotEmptyString(listOfFunctions) - gthis.ExcludeFilter.Append(listOfFunctions.Split(",")) - else - ? "WARNING: Could not parse input parameters for Exclude Filter. Filter wont be applied." - end if + gthis = GetGlobalAA() + + if gthis.ExcludeFilter = Invalid + gthis.ExcludeFilter = [] + end if + + if (TF_Utils__IsArray(listOfFunctions)) + gthis.ExcludeFilter.Append(listOfFunctions) + else if (TF_Utils__IsNotEmptyString(listOfFunctions)) + gthis.ExcludeFilter.Append(listOfFunctions.Split(",")) + else + ? "WARNING: Could not parse input parameters for Exclude Filter. Filter wont be applied." + end if end sub -function TestRunner__GetExcludeFilter() - gthis = GetGlobalAA() +function TestRunner__GetExcludeFilter() as Object + gthis = GetGlobalAA() - if gthis.ExcludeFilter = invalid - gthis.ExcludeFilter = [] - end if + if gthis.ExcludeFilter = Invalid + gthis.ExcludeFilter = [] + end if - return gthis.ExcludeFilter + return gthis.ExcludeFilter end function ' ---------------------------------------------------------------- @@ -2224,34 +2243,34 @@ end function ' @return An array of test suite names. ' ---------------------------------------------------------------- function TestRunner__GetTestSuiteNamesList(testNodeName as String) as Object - result = [] - testSuiteRegex = CreateObject("roRegex", "^(function|sub)\s(" + m.testSuitePrefix + m.testSuiteName + "[0-9a-z\_]*)\s*\(", "i") - testFilesList = m.GetTestFilesList(m.nodesTestDirectory, testNodeName) - - for each filePath in testFilesList - code = TF_Utils__AsString(ReadAsciiFile(filePath)) - - if code <> "" - foundTestSuite = false - for each line in code.Tokenize(Chr(10)) - line.Trim() - - if testSuiteRegex.IsMatch(line) - functionName = testSuiteRegex.Match(line).Peek() - result.Push(functionName) - foundTestSuite = true - end if - end for - - if not foundTestSuite then - ' we cannot scan for new tests as we are not in proper scope - ' so we need to pass some data so this can be executed in render thread - result.push({ filePath: filePath, code: code }) - end if + result = [] + testSuiteRegex = CreateObject("roRegex", "^(function|sub)\s(" + m.testSuitePrefix + m.testSuiteName + "[0-9a-z\_]*)\s*\(", "i") + testFilesList = m.GetTestFilesList(m.nodesTestDirectory, testNodeName) + + for each filePath in testFilesList + code = TF_Utils__AsString(ReadAsciiFile(filePath)) + + if (code <> "") + foundTestSuite = false + for each line in code.Tokenize(Chr(10)) + line.Trim() + + if (testSuiteRegex.IsMatch(line)) + functionName = testSuiteRegex.Match(line).Peek() + result.Push(functionName) + foundTestSuite = true end if - end for + end for + + if (NOT foundTestSuite) + ' we cannot scan for new tests as we are not in proper scope + ' so we need to pass some data so this can be executed in render thread + result.push({ filePath: filePath, code: code }) + end if + end if + end for - return result + return result end function ' ---------------------------------------------------------------- @@ -2263,36 +2282,36 @@ end function ' @return An array of test files. ' ---------------------------------------------------------------- function TestRunner__GetTestFilesList(testsDirectory = m.testsDirectory as String, testFilePrefix = m.testFilePrefix as String) as Object - result = [] - testsFileRegex = CreateObject("roRegex", "^(" + testFilePrefix + ")[0-9a-z\_]*\.brs$", "i") - - if testsDirectory <> "" - fileSystem = CreateObject("roFileSystem") - - if m.isNodeMode - ? String(2, Chr(10)) - ? String(10, "!!!") - ? "Note if you crash here this means that we are in render thread and searching for tests" - ? "Problem is that file naming is wrong" - ? "check brs file name they should match pattern ""Test_ExactComponentName_anything.brs""" - ? "In this case we were looking for "testFilePrefix - ? String(10, "!!!") String(2, Chr(10)) - end if - listing = fileSystem.GetDirectoryListing(testsDirectory) - - for each item in listing - itemPath = testsDirectory + "/" + item - itemStat = fileSystem.Stat(itemPath) - - if itemStat.type = "directory" then - result.Append(m.getTestFilesList(itemPath, testFilePrefix)) - else if testsFileRegex.IsMatch(item) then - result.Push(itemPath) - end if - end for - end if + result = [] + testsFileRegex = CreateObject("roRegex", "^(" + testFilePrefix + ")[0-9a-z\_]*\.brs$", "i") + + if (testsDirectory <> "") + fileSystem = CreateObject("roFileSystem") + + if (m.isNodeMode) + ? String(2, Chr(10)) + ? String(10, "!!!") + ? "Note if you crash here this means that we are in render thread and searching for tests" + ? "Problem is that file naming is wrong" + ? "check brs file name they should match pattern ""Test_ExactComponentName_anything.brs""" + ? "In this case we were looking for "testFilePrefix + ? String(10, "!!!") String(2, Chr(10)) + end if + listing = fileSystem.GetDirectoryListing(testsDirectory) + + for each item in listing + itemPath = testsDirectory + "/" + item + itemStat = fileSystem.Stat(itemPath) + + if itemStat.type = "directory" + result.Append(m.getTestFilesList(itemPath, testFilePrefix)) + else if (testsFileRegex.IsMatch(item)) + result.Push(itemPath) + end if + end for + end if - return result + return result end function ' ---------------------------------------------------------------- @@ -2303,26 +2322,26 @@ end function ' @return An array of test node names. ' ---------------------------------------------------------------- function TestRunner__GetTestNodesList(testsDirectory = m.nodesTestDirectory as String) as Object - result = [] - testsFileRegex = CreateObject("roRegex", "^(" + m.testFilePrefix + ")[0-9a-z\_]*\.xml$", "i") - - if testsDirectory <> "" - fileSystem = CreateObject("roFileSystem") - listing = fileSystem.GetDirectoryListing(testsDirectory) - - for each item in listing - itemPath = testsDirectory + "/" + item - itemStat = fileSystem.Stat(itemPath) - - if itemStat.type = "directory" then - result.Append(m.getTestNodesList(itemPath)) - else if testsFileRegex.IsMatch(item) then - result.Push(item.replace(".xml", "")) - end if - end for - end if + result = [] + testsFileRegex = CreateObject("roRegex", "^(" + m.testFilePrefix + ")[0-9a-z\_]*\.xml$", "i") + + if (testsDirectory <> "") + fileSystem = CreateObject("roFileSystem") + listing = fileSystem.GetDirectoryListing(testsDirectory) + + for each item in listing + itemPath = testsDirectory + "/" + item + itemStat = fileSystem.Stat(itemPath) + + if itemStat.type = "directory" + result.Append(m.getTestNodesList(itemPath)) + else if (testsFileRegex.IsMatch(item)) + result.Push(item.replace(".xml", "")) + end if + end for + end if - return result + return result end function ' ---------------------------------------------------------------- @@ -2333,115 +2352,116 @@ end function ' @return statistic object. ' ---------------------------------------------------------------- function TestFramework__RunNodeTests(params as Object) as Object - this = params[0] + this = params[0] - statObj = params[1] - testSuiteNamesList = params[2] + statObj = params[1] + testSuiteNamesList = params[2] - Runner = TestRunner() + Runner = TestRunner() - Runner.SetTestSuitePrefix(this.testSuitePrefix) - Runner.SetTestFilePrefix(this.testFilePrefix) - Runner.SetTestSuiteName(this.testSuiteName) - Runner.SetTestCaseName(this.testCaseName) - Runner.SetFailFast(this.failFast) + Runner.SetTestSuitePrefix(this.testSuitePrefix) + Runner.SetTestFilePrefix(this.testFilePrefix) + Runner.SetTestSuiteName(this.testSuiteName) + Runner.SetTestCaseName(this.testCaseName) + Runner.SetFailFast(this.failFast) - Runner.SetIncludeFilter(params[3]) - Runner.SetExcludeFilter(params[4]) + Runner.SetIncludeFilter(params[3]) + Runner.SetExcludeFilter(params[4]) - return Runner.Run(statObj, testSuiteNamesList) + return Runner.Run(statObj, testSuiteNamesList) end function -function UTF_skip(msg = "") - return UTF_PushErrorMessage(BTS__Skip(msg)) + +function UTF_skip(msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__Skip(msg)) end function -function UTF_fail(msg = "") - return UTF_PushErrorMessage(BTS__Fail(msg)) +function UTF_fail(msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__Fail(msg)) end function -function UTF_assertFalse(expr, msg = "Expression evaluates to true") - return UTF_PushErrorMessage(BTS__AssertFalse(expr, msg)) +function UTF_assertFalse(expr as Dynamic, msg = "Expression evaluates to true" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertFalse(expr, msg)) end function -function UTF_assertTrue(expr, msg = "Expression evaluates to false") - return UTF_PushErrorMessage(BTS__AssertTrue(expr, msg)) +function UTF_assertTrue(expr as Dynamic, msg = "Expression evaluates to false" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertTrue(expr, msg)) end function -function UTF_assertEqual(first, second, msg = "") - return UTF_PushErrorMessage(BTS__AssertEqual(first, second, msg)) +function UTF_assertEqual(first as Dynamic, second as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertEqual(first, second, msg)) end function -function UTF_assertNotEqual(first, second, msg = "") - return UTF_PushErrorMessage(BTS__AssertNotEqual(first, second, msg)) +function UTF_assertNotEqual(first as Dynamic, second as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertNotEqual(first, second, msg)) end function -function UTF_assertInvalid(value, msg = "") - return UTF_PushErrorMessage(BTS__AssertInvalid(value, msg)) +function UTF_assertInvalid(value as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertInvalid(value, msg)) end function -function UTF_assertNotInvalid(value, msg = "") - return UTF_PushErrorMessage(BTS__AssertNotInvalid(value, msg)) +function UTF_assertNotInvalid(value as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertNotInvalid(value, msg)) end function -function UTF_assertAAHasKey(array, key, msg = "") - return UTF_PushErrorMessage(BTS__AssertAAHasKey(array, key, msg)) +function UTF_assertAAHasKey(array as Dynamic, key as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertAAHasKey(array, key, msg)) end function -function UTF_assertAANotHasKey(array, key, msg = "") - return UTF_PushErrorMessage(BTS__AssertAANotHasKey(array, key, msg)) +function UTF_assertAANotHasKey(array as Dynamic, key as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertAANotHasKey(array, key, msg)) end function -function UTF_assertAAHasKeys(array, keys, msg = "") - return UTF_PushErrorMessage(BTS__AssertAAHasKeys(array, keys, msg)) +function UTF_assertAAHasKeys(array as Dynamic, keys as Object, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertAAHasKeys(array, keys, msg)) end function -function UTF_assertAANotHasKeys(array, keys, msg = "") - return UTF_PushErrorMessage(BTS__AssertAANotHasKeys(array, keys, msg)) +function UTF_assertAANotHasKeys(array as Dynamic, keys as Object, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertAANotHasKeys(array, keys, msg)) end function -function UTF_assertArrayContains(array, value, key = invalid, msg = "") - return UTF_PushErrorMessage(BTS__AssertArrayContains(array, value, key, msg)) +function UTF_assertArrayContains(array as Dynamic, value as Dynamic, key = Invalid as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertArrayContains(array, value, key, msg)) end function -function UTF_assertArrayNotContains(array, value, key = invalid, msg = "") - return UTF_PushErrorMessage(BTS__AssertArrayNotContains(array, value, key, msg)) +function UTF_assertArrayNotContains(array as Dynamic, value as Dynamic, key = Invalid as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertArrayNotContains(array, value, key, msg)) end function -function UTF_assertArrayContainsSubset(array, subset, msg = "") - return UTF_PushErrorMessage(BTS__AssertArrayContainsSubset(array, subset, msg)) +function UTF_assertArrayContainsSubset(array as Dynamic, subset as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertArrayContainsSubset(array, subset, msg)) end function -function UTF_assertArrayNotContainsSubset(array, subset, msg = "") - return UTF_PushErrorMessage(BTS__AssertArrayNotContainsSubset(array, subset, msg)) +function UTF_assertArrayNotContainsSubset(array as Dynamic, subset as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertArrayNotContainsSubset(array, subset, msg)) end function -function UTF_assertArrayCount(array, count, msg = "") - return UTF_PushErrorMessage(BTS__AssertArrayCount(array, count, msg)) +function UTF_assertArrayCount(array as Dynamic, count as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertArrayCount(array, count, msg)) end function -function UTF_assertArrayNotCount(array, count, msg = "") - return UTF_PushErrorMessage(BTS__AssertArrayNotCount(array, count, msg)) +function UTF_assertArrayNotCount(array as Dynamic, count as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertArrayNotCount(array, count, msg)) end function -function UTF_assertEmpty(item, msg = "") - return UTF_PushErrorMessage(BTS__AssertEmpty(item, msg)) +function UTF_assertEmpty(item as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertEmpty(item, msg)) end function -function UTF_assertNotEmpty(item, msg = "") - return UTF_PushErrorMessage(BTS__AssertNotEmpty(item, msg)) +function UTF_assertNotEmpty(item as Dynamic, msg = "" as String) as Boolean + return UTF_PushErrorMessage(BTS__AssertNotEmpty(item, msg)) end function function UTF_PushErrorMessage(message as String) as Boolean - result = Len(message) <= 0 - if not result then - m.globalErrorsList.push(message) - end if - - return result -end function'***************************************************************** -'* Copyright Roku 2011-2019 -'* All Rights Reserved -'***************************************************************** + result = Len(message) <= 0 + if (NOT result) + m.globalErrorsList.push(message) + end if + + return result +end function' ***************************************************************** +' * Copyright Roku 2011-2019 +' * All Rights Reserved +' ***************************************************************** ' Common framework utility functions ' ***************************************************************** @@ -2451,7 +2471,7 @@ end function'***************************************************************** ' @return As Boolean - true if value contains XMLElement interface, else return false ' ************************************************* function TF_Utils__IsXmlElement(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifXMLElement") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifXMLElement") <> Invalid end function ' ************************************************* @@ -2460,7 +2480,7 @@ end function ' @return As Boolean - true if value contains Function interface, else return false ' ************************************************* function TF_Utils__IsFunction(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifFunction") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifFunction") <> Invalid end function ' ************************************************* @@ -2469,7 +2489,7 @@ end function ' @return As Boolean - true if value contains Boolean interface, else return false ' ************************************************* function TF_Utils__IsBoolean(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifBoolean") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifBoolean") <> Invalid end function ' ************************************************* @@ -2478,7 +2498,7 @@ end function ' @return As Boolean - true if value type equals Integer, else return false ' ************************************************* function TF_Utils__IsInteger(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifInt") <> invalid and (Type(value) = "roInt" or Type(value) = "roInteger" or Type(value) = "Integer") + return TF_Utils__IsValid(value) AND GetInterface(value, "ifInt") <> Invalid AND (Type(value) = "roInt" OR Type(value) = "roInteger" OR Type(value) = "Integer") end function ' ************************************************* @@ -2487,7 +2507,7 @@ end function ' @return As Boolean - true if value contains Float interface, else return false ' ************************************************* function TF_Utils__IsFloat(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifFloat") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifFloat") <> Invalid end function ' ************************************************* @@ -2496,7 +2516,7 @@ end function ' @return As Boolean - true if value contains Double interface, else return false ' ************************************************* function TF_Utils__IsDouble(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifDouble") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifDouble") <> Invalid end function ' ************************************************* @@ -2505,7 +2525,7 @@ end function ' @return As Boolean - true if value contains LongInteger interface, else return false ' ************************************************* function TF_Utils__IsLongInteger(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifLongInt") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifLongInt") <> Invalid end function ' ************************************************* @@ -2514,7 +2534,7 @@ end function ' @return As Boolean - true if value is number, else return false ' ************************************************* function TF_Utils__IsNumber(value as Dynamic) as Boolean - return TF_Utils__IsLongInteger(value) or TF_Utils__IsDouble(value) or TF_Utils__IsInteger(value) or TF_Utils__IsFloat(value) + return TF_Utils__IsLongInteger(value) OR TF_Utils__IsDouble(value) OR TF_Utils__IsInteger(value) OR TF_Utils__IsFloat(value) end function ' ************************************************* @@ -2523,7 +2543,7 @@ end function ' @return As Boolean - true if value contains List interface, else return false ' ************************************************* function TF_Utils__IsList(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifList") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifList") <> Invalid end function ' ************************************************* @@ -2532,7 +2552,7 @@ end function ' @return As Boolean - true if value contains Array interface, else return false ' ************************************************* function TF_Utils__IsArray(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifArray") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifArray") <> Invalid end function ' ************************************************* @@ -2541,7 +2561,7 @@ end function ' @return As Boolean - true if value contains AssociativeArray interface, else return false ' ************************************************* function TF_Utils__IsAssociativeArray(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifAssociativeArray") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifAssociativeArray") <> Invalid end function ' ************************************************* @@ -2550,7 +2570,7 @@ end function ' @return As Boolean - true if value contains SGNodeChildren interface, else return false ' ************************************************* function TF_Utils__IsSGNode(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifSGNodeChildren") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifSGNodeChildren") <> Invalid end function ' ************************************************* @@ -2559,7 +2579,7 @@ end function ' @return As Boolean - true if value contains String interface, else return false ' ************************************************* function TF_Utils__IsString(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and GetInterface(value, "ifString") <> invalid + return TF_Utils__IsValid(value) AND GetInterface(value, "ifString") <> Invalid end function ' ************************************************* @@ -2568,7 +2588,7 @@ end function ' @return As Boolean - true if value contains String interface and length more 0, else return false ' ************************************************* function TF_Utils__IsNotEmptyString(value as Dynamic) as Boolean - return TF_Utils__IsString(value) and Len(value) > 0 + return TF_Utils__IsString(value) AND Len(value) > 0 end function ' ************************************************* @@ -2577,7 +2597,7 @@ end function ' @return As Boolean - true if value contains DateTime interface, else return false ' ************************************************* function TF_Utils__IsDateTime(value as Dynamic) as Boolean - return TF_Utils__IsValid(value) and (GetInterface(value, "ifDateTime") <> invalid or Type(value) = "roDateTime") + return TF_Utils__IsValid(value) AND (GetInterface(value, "ifDateTime") <> Invalid OR Type(value) = "roDateTime") end function ' ************************************************* @@ -2586,7 +2606,7 @@ end function ' @return As Boolean - true if value initialized and not equal invalid, else return false ' ************************************************* function TF_Utils__IsValid(value as Dynamic) as Boolean - return Type(value) <> "" and value <> invalid + return Type(value) <> "" AND value <> Invalid end function ' ************************************************* @@ -2595,11 +2615,11 @@ end function ' @return As String - value if his contains String interface else return empty string ' ************************************************* function TF_Utils__ValidStr(obj as Object) as String - if obj <> invalid and GetInterface(obj, "ifString") <> invalid - return obj - else - return "" - end if + if (obj <> Invalid AND GetInterface(obj, "ifString") <> Invalid) + return obj + else + return "" + end if end function ' ************************************************* @@ -2608,17 +2628,17 @@ end function ' @return As String - return converted string ' ************************************************* function TF_Utils__AsString(input as Dynamic) as String - if TF_Utils__IsValid(input) = false - return "" - else if TF_Utils__IsString(input) - return input - else if TF_Utils__IsInteger(input) or TF_Utils__IsLongInteger(input) or TF_Utils__IsBoolean(input) - return input.ToStr() - else if TF_Utils__IsFloat(input) or TF_Utils__IsDouble(input) - return Str(input).Trim() - else - return "" - end if + if TF_Utils__IsValid(input) = false + return "" + else if (TF_Utils__IsString(input)) + return input + else if (TF_Utils__IsInteger(input) OR TF_Utils__IsLongInteger(input) OR TF_Utils__IsBoolean(input)) + return input.ToStr() + else if (TF_Utils__IsFloat(input) OR TF_Utils__IsDouble(input)) + return Str(input).Trim() + else + return "" + end if end function ' ************************************************* @@ -2627,17 +2647,17 @@ end function ' @return As Integer - return converted Integer ' ************************************************* function TF_Utils__AsInteger(input as Dynamic) as Integer - if TF_Utils__IsValid(input) = false - return 0 - else if TF_Utils__IsString(input) - return input.ToInt() - else if TF_Utils__IsInteger(input) - return input - else if TF_Utils__IsFloat(input) or TF_Utils__IsDouble(input) or TF_Utils__IsLongInteger(input) - return Int(input) - else - return 0 - end if + if TF_Utils__IsValid(input) = false + return 0 + else if (TF_Utils__IsString(input)) + return input.ToInt() + else if (TF_Utils__IsInteger(input)) + return input + else if (TF_Utils__IsFloat(input) OR TF_Utils__IsDouble(input) OR TF_Utils__IsLongInteger(input)) + return Int(input) + else + return 0 + end if end function ' ************************************************* @@ -2646,15 +2666,15 @@ end function ' @return As Integer - return converted LongInteger ' ************************************************* function TF_Utils__AsLongInteger(input as Dynamic) as Longinteger - if TF_Utils__IsValid(input) = false - return 0 - else if TF_Utils__IsString(input) - return TF_Utils__AsInteger(input) - else if TF_Utils__IsLongInteger(input) or TF_Utils__IsFloat(input) or TF_Utils__IsDouble(input) or TF_Utils__IsInteger(input) - return input - else - return 0 - end if + if TF_Utils__IsValid(input) = false + return 0 + else if (TF_Utils__IsString(input)) + return TF_Utils__AsInteger(input) + else if (TF_Utils__IsLongInteger(input) OR TF_Utils__IsFloat(input) OR TF_Utils__IsDouble(input) OR TF_Utils__IsInteger(input)) + return input + else + return 0 + end if end function ' ************************************************* @@ -2663,17 +2683,17 @@ end function ' @return As Float - return converted Float ' ************************************************* function TF_Utils__AsFloat(input as Dynamic) as Float - if TF_Utils__IsValid(input) = false - return 0.0 - else if TF_Utils__IsString(input) - return input.ToFloat() - else if TF_Utils__IsInteger(input) - return (input / 1) - else if TF_Utils__IsFloat(input) or TF_Utils__IsDouble(input) or TF_Utils__IsLongInteger(input) - return input - else - return 0.0 - end if + if TF_Utils__IsValid(input) = false + return 0.0 + else if (TF_Utils__IsString(input)) + return input.ToFloat() + else if (TF_Utils__IsInteger(input)) + return (input / 1) + else if (TF_Utils__IsFloat(input) OR TF_Utils__IsDouble(input) OR TF_Utils__IsLongInteger(input)) + return input + else + return 0.0 + end if end function ' ************************************************* @@ -2682,15 +2702,15 @@ end function ' @return As Float - return converted Double ' ************************************************* function TF_Utils__AsDouble(input as Dynamic) as Double - if TF_Utils__IsValid(input) = false - return 0.0 - else if TF_Utils__IsString(input) - return TF_Utils__AsFloat(input) - else if TF_Utils__IsInteger(input) or TF_Utils__IsLongInteger(input) or TF_Utils__IsFloat(input) or TF_Utils__IsDouble(input) - return input - else - return 0.0 - end if + if TF_Utils__IsValid(input) = false + return 0.0 + else if (TF_Utils__IsString(input)) + return TF_Utils__AsFloat(input) + else if (TF_Utils__IsInteger(input) OR TF_Utils__IsLongInteger(input) OR TF_Utils__IsFloat(input) OR TF_Utils__IsDouble(input)) + return input + else + return 0.0 + end if end function ' ************************************************* @@ -2699,17 +2719,17 @@ end function ' @return As Boolean ' ************************************************* function TF_Utils__AsBoolean(input as Dynamic) as Boolean - if TF_Utils__IsValid(input) = false - return false - else if TF_Utils__IsString(input) - return LCase(input) = "true" - else if TF_Utils__IsInteger(input) or TF_Utils__IsFloat(input) - return input <> 0 - else if TF_Utils__IsBoolean(input) - return input - else - return false - end if + if TF_Utils__IsValid(input) = false + return false + else if (TF_Utils__IsString(input)) + return LCase(input) = "true" + else if (TF_Utils__IsInteger(input) OR TF_Utils__IsFloat(input)) + return input <> 0 + else if (TF_Utils__IsBoolean(input)) + return input + else + return false + end if end function ' ************************************************* @@ -2718,14 +2738,15 @@ end function ' @return As Object - roArray ' ************************************************* function TF_Utils__AsArray(value as Object) as Object - if TF_Utils__IsValid(value) - if not TF_Utils__IsArray(value) - return [value] - else - return value - end if + if (TF_Utils__IsValid(value)) + if (NOT TF_Utils__IsArray(value)) + return [value] + else + return value end if - return [] + end if + + return [] end function ' ===================== @@ -2738,11 +2759,11 @@ end function ' @return As Boolean - true if value is null or empty string, else return false ' ************************************************* function TF_Utils__IsNullOrEmpty(value as Dynamic) as Boolean - if TF_Utils__IsString(value) - return Len(value) = 0 - else - return not TF_Utils__IsValid(value) - end if + if (TF_Utils__IsString(value)) + return Len(value) = 0 + else + return NOT TF_Utils__IsValid(value) + end if end function ' ===================== @@ -2757,28 +2778,28 @@ end function ' @param caseSensitive As Boolean ' @return As Integer - element index if array contains a value, else return -1 ' ************************************************* -function TF_Utils__FindElementIndexInArray(array as Object, value as Object, compareAttribute = invalid as Dynamic, caseSensitive = false as Boolean) as Integer - if TF_Utils__IsArray(array) - for i = 0 to TF_Utils__AsArray(array).Count() - 1 - compareValue = array[i] - - if compareAttribute <> invalid and TF_Utils__IsAssociativeArray(compareValue) and compareValue.DoesExist(compareAttribute) - compareValue = compareValue.LookupCI(compareAttribute) - end if - - if TF_Utils__IsString(compareValue) and TF_Utils__IsString(value) and not caseSensitive - if LCase(compareValue) = LCase(value) - return i - end if - else if TF_Utils__BaseComparator(compareValue, value) - return i - end if +function TF_Utils__FindElementIndexInArray(array as Object, value as Object, compareAttribute = Invalid as Dynamic, caseSensitive = false as Boolean) as Integer + if (TF_Utils__IsArray(array)) + for i = 0 to TF_Utils__AsArray(array).Count() - 1 + compareValue = array[i] + + if (compareAttribute <> Invalid AND TF_Utils__IsAssociativeArray(compareValue) AND compareValue.DoesExist(compareAttribute)) + compareValue = compareValue.LookupCI(compareAttribute) + end if + + if (TF_Utils__IsString(compareValue) AND TF_Utils__IsString(value) AND NOT caseSensitive) + if LCase(compareValue) = LCase(value) + return i + end if + else if (TF_Utils__BaseComparator(compareValue, value)) + return i + end if - item = array[i] - next - end if + _item = array[i] + next + end if - return -1 + return -1 end function ' ************************************************* @@ -2788,8 +2809,8 @@ end function ' @param compareAttribute As Dynamic ' @return As Boolean - true if array contains a value, else return false ' ************************************************* -function TF_Utils__ArrayContains(array as Object, value as Object, compareAttribute = invalid as Dynamic) as Boolean - return (TF_Utils__FindElementIndexInArray(array, value, compareAttribute) > - 1) +function TF_Utils__ArrayContains(array as Object, value as Object, compareAttribute = Invalid as Dynamic) as Boolean + return (TF_Utils__FindElementIndexInArray(array, value, compareAttribute) > - 1) end function ' ---------------------------------------------------------------- @@ -2805,12 +2826,12 @@ end function ' @return True if values are equal or False in other case. ' ---------------------------------------------------------------- -function TF_Utils__EqValues(Value1 as Dynamic, Value2 as Dynamic, comparator = invalid as Object) as Boolean - if comparator = invalid - return TF_Utils__BaseComparator(value1, value2) - else - return comparator(value1, value2) - end if +function TF_Utils__EqValues(Value1 as Dynamic, Value2 as Dynamic, comparator = Invalid as Object) as Boolean + if comparator = Invalid + return TF_Utils__BaseComparator(value1, value2) + else + return comparator(value1, value2) + end if end function ' ---------------------------------------------------------------- @@ -2821,25 +2842,25 @@ end function ' @return True if values are equal or False in other case. function TF_Utils__BaseComparator(value1 as Dynamic, value2 as Dynamic) as Boolean - ' This method was modified by DAZN, remove this comment once https://github.com/rokudev/unit-testing-framework/pull/37 is merged and we update the framework - if (Type(Box(value1), 3) <> Type(Box(value2), 3)) - return false - end if - - valuesType = Type(Box(value1), 3) - - if (valuesType = "roSGNode") - return value1.isSameNode(value2) - else if (valuesType = "roList" or valuesType = "roArray") - return TF_Utils__EqArray(value1, value2) - else if (valuesType = "roAssociativeArray") - return TF_Utils__EqAssocArray(value1, value2) + ' This method was modified by DAZN, remove this comment once https://github.com/rokudev/unit-testing-framework/pull/37 is merged and we update the framework + if (Type(Box(value1), 3) <> Type(Box(value2), 3)) + return false + end if + + valuesType = Type(Box(value1), 3) + + if (valuesType = "roSGNode") + return value1.isSameNode(value2) + else if (valuesType = "roList" OR valuesType = "roArray") + return TF_Utils__EqArray(value1, value2) + else if (valuesType = "roAssociativeArray") + return TF_Utils__EqAssocArray(value1, value2) ' This check fixes Brightscript's float values comparison issue - else if (valuesType = "roFloat") - return (Cdbl(value1) = Cdbl(value2)) - end if + else if (valuesType = "roFloat") + return (Cdbl(value1) = Cdbl(value2)) + end if - return value1 = value2 + return value1 = value2 end function ' ---------------------------------------------------------------- @@ -2851,25 +2872,26 @@ end function ' @return True if arrays are equal or False in other case. ' ---------------------------------------------------------------- function TF_Utils__EqAssocArray(Value1 as Object, Value2 as Object) as Boolean - l1 = Value1.Count() - l2 = Value2.Count() - - if not l1 = l2 + l1 = Value1.Count() + l2 = Value2.Count() + + if NOT l1 = l2 + return false + else + for each k in Value1 + if (NOT Value2.DoesExist(k)) return false - else - for each k in Value1 - if not Value2.DoesExist(k) - return false - else - v1 = Value1[k] - v2 = Value2[k] - if not TF_Utils__EqValues(v1, v2) - return false - end if - end if - end for - return true - end if + else + v1 = Value1[k] + v2 = Value2[k] + if (NOT TF_Utils__EqValues(v1, v2)) + return false + end if + end if + end for + + return true + end if end function ' ---------------------------------------------------------------- @@ -2881,19 +2903,20 @@ end function ' @return True if arrays are equal or False in other case. ' ---------------------------------------------------------------- function TF_Utils__EqArray(Value1 as Object, Value2 as Object) as Boolean - l1 = Value1.Count() - l2 = Value2.Count() - - if not l1 = l2 + l1 = Value1.Count() + l2 = Value2.Count() + + if NOT l1 = l2 + return false + else + for i = 0 to l1 - 1 + v1 = Value1[i] + v2 = Value2[i] + if (NOT TF_Utils__EqValues(v1, v2)) return false - else - for i = 0 to l1 - 1 - v1 = Value1[i] - v2 = Value2[i] - if not TF_Utils__EqValues(v1, v2) then - return false - end if - end for - return true - end if + end if + end for + + return true + end if end function