From 51d8f417289653e79b79cf743f41b0a53d74b43d Mon Sep 17 00:00:00 2001 From: Merlin Beutlberger Date: Mon, 24 Nov 2025 17:06:48 +0100 Subject: [PATCH 01/16] refactor(project): Use cacache --- package-lock.json | 3 +-- packages/project/package.json | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39b760fffd3..b13df20e2fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14052,8 +14052,6 @@ }, "node_modules/ssri": { "version": "13.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", - "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" @@ -16122,6 +16120,7 @@ "@ui5/logger": "^5.0.0-alpha.4", "ajv": "^8.18.0", "ajv-errors": "^3.0.0", + "cacache": "^20.0.3", "chalk": "^5.6.2", "chokidar": "^3.6.0", "escape-string-regexp": "^5.0.0", diff --git a/packages/project/package.json b/packages/project/package.json index b571af7fc37..6d62804d7cf 100644 --- a/packages/project/package.json +++ b/packages/project/package.json @@ -61,6 +61,7 @@ "@ui5/logger": "^5.0.0-alpha.4", "ajv": "^8.18.0", "ajv-errors": "^3.0.0", + "cacache": "^20.0.3", "chalk": "^5.6.2", "chokidar": "^3.6.0", "escape-string-regexp": "^5.0.0", From 61a4cd3062c54469493ec7623b565d1022191f9d Mon Sep 17 00:00:00 2001 From: Max Reichmann Date: Fri, 27 Mar 2026 10:41:29 +0100 Subject: [PATCH 02/16] test(internal): Add new "e2e-tests" dir to internal/ * Add test for "ui5 --version" * Add test for "ui5 build" (currently testing a TS application) Currently, those tests are not included in any CI pipeline and also need a manual "npm install" (no node_modules included yet). --- .../fixtures/application.a.ts/ui5.yaml | 12 +++++++ .../webapp/controller/Test.controller.ts | 22 +++++++++++++ internal/e2e-tests/test/version.js | 31 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 internal/e2e-tests/fixtures/application.a.ts/ui5.yaml create mode 100644 internal/e2e-tests/fixtures/application.a.ts/webapp/controller/Test.controller.ts create mode 100644 internal/e2e-tests/test/version.js diff --git a/internal/e2e-tests/fixtures/application.a.ts/ui5.yaml b/internal/e2e-tests/fixtures/application.a.ts/ui5.yaml new file mode 100644 index 00000000000..6b6160533ca --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a.ts/ui5.yaml @@ -0,0 +1,12 @@ +specVersion: "5.0" +metadata: + name: application.a.ts +type: application +builder: + customTasks: + - name: ui5-tooling-transpile-task + afterTask: replaceVersion +server: + customMiddleware: + - name: ui5-tooling-transpile-middleware + afterMiddleware: compression diff --git a/internal/e2e-tests/fixtures/application.a.ts/webapp/controller/Test.controller.ts b/internal/e2e-tests/fixtures/application.a.ts/webapp/controller/Test.controller.ts new file mode 100644 index 00000000000..e20a74790f2 --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a.ts/webapp/controller/Test.controller.ts @@ -0,0 +1,22 @@ +type randomTSType = { + first: { + a: number, + b: number, + c: number + }, + second: string +} + +export default class Main { + onInit(): void { + const z : randomTSType = { + first: { + a: 1, + b: 2, + c: 3 + }, + second: "test" + }; + console.log(z.first.a); + } +} diff --git a/internal/e2e-tests/test/version.js b/internal/e2e-tests/test/version.js new file mode 100644 index 00000000000..4d9414ad61f --- /dev/null +++ b/internal/e2e-tests/test/version.js @@ -0,0 +1,31 @@ +// Test running "ui5 --version" +// without any fixtures or additional setup. +// and by using node's child_process module and the ui5.cjs under ../../../packages/cli/bin/ui5.cjs. + +import { exec } from "node:child_process"; +import {test, describe} from "node:test"; +import {fileURLToPath} from "node:url"; +import path from "node:path"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +describe("ui5 version", () => { + test("output the version of the UI5 CLI", ({assert}) => { + const ui5Path = path.resolve(__dirname, "../../../packages/cli/bin/ui5.cjs"); + exec(`node ${ui5Path} --version`, (error, stdout, stderr) => { + if (error) { + assert.fail(error); + return; + } + if (stderr) { + assert.fail(new Error(stderr)); + return; + } + // Test: the expected CLI version output is printed + // e.g. "5.0.0 (from /path/to/ui5/cli)" + const outPattern = /\d+\..* \(from .*\)/; + assert.ok(stdout.match(outPattern)); + }); + }); +}); From 17dd9d59e59062fa907bdfb8f1399d79a3b5189d Mon Sep 17 00:00:00 2001 From: Max Reichmann Date: Wed, 1 Apr 2026 12:10:19 +0200 Subject: [PATCH 03/16] test: E2E-tests: Fix child process security + Include "npm install" in test runtime --- internal/e2e-tests/test/version.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/e2e-tests/test/version.js b/internal/e2e-tests/test/version.js index 4d9414ad61f..30c2eb9e22e 100644 --- a/internal/e2e-tests/test/version.js +++ b/internal/e2e-tests/test/version.js @@ -2,7 +2,7 @@ // without any fixtures or additional setup. // and by using node's child_process module and the ui5.cjs under ../../../packages/cli/bin/ui5.cjs. -import { exec } from "node:child_process"; +import { execFile } from "node:child_process"; import {test, describe} from "node:test"; import {fileURLToPath} from "node:url"; import path from "node:path"; @@ -13,7 +13,7 @@ const __dirname = path.dirname(__filename); describe("ui5 version", () => { test("output the version of the UI5 CLI", ({assert}) => { const ui5Path = path.resolve(__dirname, "../../../packages/cli/bin/ui5.cjs"); - exec(`node ${ui5Path} --version`, (error, stdout, stderr) => { + execFile("node", [ui5Path, "--version"], (error, stdout, stderr) => { if (error) { assert.fail(error); return; From 6f0e70bdd95d763e0d244860e7066ad21fb492d9 Mon Sep 17 00:00:00 2001 From: Max Reichmann Date: Thu, 2 Apr 2026 17:17:17 +0200 Subject: [PATCH 04/16] test: E2E-tests: Cover scenario for "ui5-task-zipper" + Refactor test environment for better reuse + Extend typescript test to cover Incremental Build --- .../application.a.ts/package-lock.json | 2348 ----------------- .../application.a.ts/ui5-task-zipper.yaml | 10 + ... => ui5-tooling-transpile-middleware.yaml} | 0 internal/e2e-tests/test/build.js | 1 - 4 files changed, 10 insertions(+), 2349 deletions(-) delete mode 100644 internal/e2e-tests/fixtures/application.a.ts/package-lock.json create mode 100644 internal/e2e-tests/fixtures/application.a.ts/ui5-task-zipper.yaml rename internal/e2e-tests/fixtures/application.a.ts/{ui5.yaml => ui5-tooling-transpile-middleware.yaml} (100%) diff --git a/internal/e2e-tests/fixtures/application.a.ts/package-lock.json b/internal/e2e-tests/fixtures/application.a.ts/package-lock.json deleted file mode 100644 index 8ee2970176d..00000000000 --- a/internal/e2e-tests/fixtures/application.a.ts/package-lock.json +++ /dev/null @@ -1,2348 +0,0 @@ -{ - "name": "@ui5-internal/application.a.ts", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@ui5-internal/application.a.ts", - "version": "1.0.0", - "license": "Apache-2.0", - "devDependencies": { - "@openui5/types": "^1.115.1", - "ui5-tooling-transpile": "^3.11.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "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", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "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", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", - "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "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==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-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==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", - "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", - "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-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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", - "@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-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/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.15", - "babel-plugin-polyfill-corejs3": "^0.14.0", - "babel-plugin-polyfill-regenerator": "^0.6.6", - "core-js-compat": "^3.48.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "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==", - "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", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@openui5/types": { - "version": "1.147.1", - "resolved": "https://registry.npmjs.org/@openui5/types/-/types-1.147.1.tgz", - "integrity": "sha512-f6OffWT9Wxv8VWOczP4cP9hCtfaQHEUGpnW0cXgXp1n6sq5LpKmmeLgwoKNAsjPzmLkCHoZizFHA0z7l2DWGaQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/jquery": "3.5.13", - "@types/qunit": "2.5.4" - } - }, - "node_modules/@types/jquery": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.13.tgz", - "integrity": "sha512-ZxJrup8nz/ZxcU0vantG+TPdboMhB24jad2uSap50zE7Q9rUeYlCF25kFMSmHR33qoeOgqcdHEp3roaookC0Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/sizzle": "*" - } - }, - "node_modules/@types/qunit": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@types/qunit/-/qunit-2.5.4.tgz", - "integrity": "sha512-VHi2lEd4/zp8OOouf43JXGJJ5ZxHvdLL1dU0Yakp6Iy73SjpuXl7yjwAwmh1qhTv8krDgHteSwaySr++uXX9YQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sizzle": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", - "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", - "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-timsort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", - "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", - "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8", - "core-js-compat": "^3.48.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", - "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-async-to-promises": { - "version": "0.8.18", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.18.tgz", - "integrity": "sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-plugin-transform-modules-ui5": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-modules-ui5/-/babel-plugin-transform-modules-ui5-7.8.1.tgz", - "integrity": "sha512-rp8TrQkPjKNOSsRyyH+VMqsTs9yZzslgMvF4x3cAM6pwGcdycolMQJ0RO2EGbOhN2eDeiN6ShN72UozZnk191g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-flatten": "^3.0.0", - "doctrine": "^3.0.0", - "ignore-case": "^0.1.0", - "object-assign-defined": "^1.2.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/babel-plugin-transform-remove-console": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", - "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-preset-transform-ui5": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/babel-preset-transform-ui5/-/babel-preset-transform-ui5-7.8.1.tgz", - "integrity": "sha512-OF7e2ahVE/pYT9B/lX/XdewZI52kdzYnCjGdorsLLX1xq8cKeUmC9pQuQCb/su1M6HLmT2OyFCk1DEeiOikuAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-transform-modules-ui5": "^7.8.1" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.23", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz", - "integrity": "sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/browserslist": { - "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": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "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" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001791", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", - "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/comment-json": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz", - "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-timsort": "^1.0.3", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/core-js-compat": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", - "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", - "dev": true, - "license": "ISC" - }, - "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", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore-case": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ignore-case/-/ignore-case-0.1.0.tgz", - "integrity": "sha512-tQS9ucNf134w040JaMWzQ0WXfDR8Vdelk8E6ITviSzE6cOY2K12kNU04lLa8yy9WtcRrKWh3sdv0Xn8uLbMjUA==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign-defined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object-assign-defined/-/object-assign-defined-1.2.0.tgz", - "integrity": "sha512-9hzHOUnV8YoBsLB07KhqehUWdeUUW8nyP1j0kPluxXWpoXD6NNyiJNRa3YES0Ds32z+mZtUL/Wqbj+CCLDXJgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", - "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/resolve": { - "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" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ui5-tooling-transpile": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/ui5-tooling-transpile/-/ui5-tooling-transpile-3.11.0.tgz", - "integrity": "sha512-cy9STzBVNzqZebDV9pQR3vifSkk3ZULTDxovAlXm8VSOgD5rvdW91ESg/zKMHr8pI6zmTwRAoQZrIILf2nr09A==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/core": "^7.29.0", - "@babel/preset-env": "^7.29.0", - "@babel/preset-typescript": "^7.28.5", - "babel-plugin-transform-async-to-promises": "^0.8.18", - "babel-plugin-transform-remove-console": "^6.9.4", - "babel-preset-transform-ui5": "^7.8.1", - "browserslist": "^4.28.1", - "comment-json": "^4.6.2", - "js-yaml": "^4.1.1" - }, - "peerDependencies": { - "@ui5/ts-interface-generator": ">=0.8.0" - }, - "peerDependenciesMeta": { - "@ui5/ts-interface-generator": { - "optional": true - } - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - } - } -} diff --git a/internal/e2e-tests/fixtures/application.a.ts/ui5-task-zipper.yaml b/internal/e2e-tests/fixtures/application.a.ts/ui5-task-zipper.yaml new file mode 100644 index 00000000000..8f24fb3f125 --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a.ts/ui5-task-zipper.yaml @@ -0,0 +1,10 @@ +specVersion: "5.0" +metadata: + name: application.a.ts +type: application +builder: + customTasks: + - name: ui5-task-zipper + afterTask: generateVersionInfo + configuration: + archiveName: "webapp" diff --git a/internal/e2e-tests/fixtures/application.a.ts/ui5.yaml b/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile-middleware.yaml similarity index 100% rename from internal/e2e-tests/fixtures/application.a.ts/ui5.yaml rename to internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile-middleware.yaml diff --git a/internal/e2e-tests/test/build.js b/internal/e2e-tests/test/build.js index b999b803f57..075adcdd7b2 100644 --- a/internal/e2e-tests/test/build.js +++ b/internal/e2e-tests/test/build.js @@ -41,7 +41,6 @@ class FixtureHelper { async _installNodeModules() { await execa("npm", ["ci"], {cwd: this.tmpPath}); } -} describe("ui5 build", () => { test("ui5-tooling-transpile", async ({assert}) => { From b8803f135f09614d2899e37b8d355901238904c1 Mon Sep 17 00:00:00 2001 From: Max Reichmann Date: Thu, 2 Apr 2026 18:13:47 +0200 Subject: [PATCH 05/16] test: E2E-tests: Cover scenario for "ui5-tooling-modules" + Add "application.a" (Javascript project fixture) --- .../fixtures/application.a.ts/ui5-task-zipper.yaml | 10 ---------- .../ui5-tooling-transpile-middleware.yaml | 12 ------------ 2 files changed, 22 deletions(-) delete mode 100644 internal/e2e-tests/fixtures/application.a.ts/ui5-task-zipper.yaml delete mode 100644 internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile-middleware.yaml diff --git a/internal/e2e-tests/fixtures/application.a.ts/ui5-task-zipper.yaml b/internal/e2e-tests/fixtures/application.a.ts/ui5-task-zipper.yaml deleted file mode 100644 index 8f24fb3f125..00000000000 --- a/internal/e2e-tests/fixtures/application.a.ts/ui5-task-zipper.yaml +++ /dev/null @@ -1,10 +0,0 @@ -specVersion: "5.0" -metadata: - name: application.a.ts -type: application -builder: - customTasks: - - name: ui5-task-zipper - afterTask: generateVersionInfo - configuration: - archiveName: "webapp" diff --git a/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile-middleware.yaml b/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile-middleware.yaml deleted file mode 100644 index 6b6160533ca..00000000000 --- a/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile-middleware.yaml +++ /dev/null @@ -1,12 +0,0 @@ -specVersion: "5.0" -metadata: - name: application.a.ts -type: application -builder: - customTasks: - - name: ui5-tooling-transpile-task - afterTask: replaceVersion -server: - customMiddleware: - - name: ui5-tooling-transpile-middleware - afterMiddleware: compression From 2fd44c64a4ea8c55da79b64b2cb00f46c75ed01e Mon Sep 17 00:00:00 2001 From: Max Reichmann Date: Wed, 8 Apr 2026 15:26:49 +0200 Subject: [PATCH 06/16] test: Remove E2E-test --- internal/e2e-tests/README.md | 34 --- .../fixtures/application.a.ts/package.json | 10 - .../fixtures/application.a.ts/tsconfig.json | 21 -- .../ui5-tooling-transpile.yaml | 20 -- .../webapp/controller/Test.controller.ts | 22 -- .../application.a.ts/webapp/manifest.json | 66 ------ .../fixtures/application.a/package.json | 15 -- .../application.a/ui5-task-zipper.yaml | 10 - .../application.a/ui5-tooling-modules.yaml | 12 -- .../ui5-tooling-stringreplace.yaml | 14 -- .../webapp/controller/Test.controller.js | 16 -- .../application.a/webapp/manifest.json | 66 ------ internal/e2e-tests/package.json | 19 -- internal/e2e-tests/test/build.js | 200 ------------------ internal/e2e-tests/test/version.js | 31 --- package-lock.json | 31 --- 16 files changed, 587 deletions(-) delete mode 100644 internal/e2e-tests/README.md delete mode 100644 internal/e2e-tests/fixtures/application.a.ts/package.json delete mode 100644 internal/e2e-tests/fixtures/application.a.ts/tsconfig.json delete mode 100644 internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile.yaml delete mode 100644 internal/e2e-tests/fixtures/application.a.ts/webapp/controller/Test.controller.ts delete mode 100644 internal/e2e-tests/fixtures/application.a.ts/webapp/manifest.json delete mode 100644 internal/e2e-tests/fixtures/application.a/package.json delete mode 100644 internal/e2e-tests/fixtures/application.a/ui5-task-zipper.yaml delete mode 100644 internal/e2e-tests/fixtures/application.a/ui5-tooling-modules.yaml delete mode 100644 internal/e2e-tests/fixtures/application.a/ui5-tooling-stringreplace.yaml delete mode 100644 internal/e2e-tests/fixtures/application.a/webapp/controller/Test.controller.js delete mode 100644 internal/e2e-tests/fixtures/application.a/webapp/manifest.json delete mode 100644 internal/e2e-tests/package.json delete mode 100644 internal/e2e-tests/test/build.js delete mode 100644 internal/e2e-tests/test/version.js diff --git a/internal/e2e-tests/README.md b/internal/e2e-tests/README.md deleted file mode 100644 index 7d99ace3cff..00000000000 --- a/internal/e2e-tests/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# E2E Tests for UI5 CLI - -End-to-end test environment for the UI5 CLI containing realistic user scenarios. - -## Usage - -```bash -npm install -npm run unit -``` - -## How It Works - -Tests are run with the **Node.js built-in test runner**. Each test: - -1. Copies a fixture project to a temporary directory (`./tmp`) -2. Runs `npm install` there (child process) -3. Runs `ui5 build` with varying configurations (child process) - -The UI5 CLI executables are sourced directly from this repository at `packages/cli/bin/ui5.cjs`. - -Some scenarios include multiple sequential builds with file modifications in between to simulate real-world development workflows. Node modules are getting installed on the fly for the first build and reused for subsequent builds (no reinstall). - - - - -## Fixtures - -Located under `./fixtures/`: - -| Fixture | Description | -|---|---| -| `application.a` | Sample JavaScript project (controller + `manifest.json`) | -| `application.a.ts` | Sample TypeScript project (based on [generator-ui5-ts-app](https://github.com/ui5-community/generator-ui5-ts-app)) | diff --git a/internal/e2e-tests/fixtures/application.a.ts/package.json b/internal/e2e-tests/fixtures/application.a.ts/package.json deleted file mode 100644 index 59f1b0407b5..00000000000 --- a/internal/e2e-tests/fixtures/application.a.ts/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@ui5-internal/application.a.ts", - "version": "1.0.0", - "description": "UI5 Application: application.a.ts", - "license": "Apache-2.0", - "devDependencies": { - "@openui5/types": "^1.115.1", - "ui5-tooling-transpile": "^3.11.0" - } -} diff --git a/internal/e2e-tests/fixtures/application.a.ts/tsconfig.json b/internal/e2e-tests/fixtures/application.a.ts/tsconfig.json deleted file mode 100644 index 76f47447feb..00000000000 --- a/internal/e2e-tests/fixtures/application.a.ts/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "es2022", - "module": "es2022", - "moduleResolution": "node", - "skipLibCheck": true, - "allowJs": true, - "strict": true, - "strictNullChecks": false, - "strictPropertyInitialization": false, - "rootDir": "./webapp", - "types": ["@openui5/types", "@types/qunit"], - "paths": { - "application/a/ts/*": ["./webapp/*"], - "unit/*": ["./webapp/test/unit/*"], - "integration/*": ["./webapp/test/integration/*"] - } - }, - "include": ["./webapp/**/*"], - "exclude": ["./webapp/coverage/**/*"] -} diff --git a/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile.yaml b/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile.yaml deleted file mode 100644 index 56ae28a5d56..00000000000 --- a/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile.yaml +++ /dev/null @@ -1,20 +0,0 @@ -specVersion: "5.0" -metadata: - name: application.a.ts -type: application -framework: - name: OpenUI5 - version: "1.115.1" - libraries: - - name: sap.m - - name: sap.ui.core - - name: sap.ui.layout - - name: themelib_sap_horizon -builder: - customTasks: - - name: ui5-tooling-transpile-task - afterTask: replaceVersion -server: - customMiddleware: - - name: ui5-tooling-transpile-middleware - afterMiddleware: compression diff --git a/internal/e2e-tests/fixtures/application.a.ts/webapp/controller/Test.controller.ts b/internal/e2e-tests/fixtures/application.a.ts/webapp/controller/Test.controller.ts deleted file mode 100644 index e20a74790f2..00000000000 --- a/internal/e2e-tests/fixtures/application.a.ts/webapp/controller/Test.controller.ts +++ /dev/null @@ -1,22 +0,0 @@ -type randomTSType = { - first: { - a: number, - b: number, - c: number - }, - second: string -} - -export default class Main { - onInit(): void { - const z : randomTSType = { - first: { - a: 1, - b: 2, - c: 3 - }, - second: "test" - }; - console.log(z.first.a); - } -} diff --git a/internal/e2e-tests/fixtures/application.a.ts/webapp/manifest.json b/internal/e2e-tests/fixtures/application.a.ts/webapp/manifest.json deleted file mode 100644 index ae5be89bac7..00000000000 --- a/internal/e2e-tests/fixtures/application.a.ts/webapp/manifest.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_version": "1.12.0", - "sap.app": { - "id": "application.a.ts", - "type": "application", - "i18n": "i18n/i18n.properties", - "title": "{{appTitle}}", - "description": "{{appDescription}}", - "applicationVersion": { - "version": "1.0.0" - } - }, - "sap.ui": { - "technology": "UI5", - "icons": {}, - "deviceTypes": { - "desktop": true, - "tablet": true, - "phone": true - } - }, - "sap.ui5": { - "rootView": { - "viewName": "application.a.ts.view.App", - "type": "XML", - "async": true, - "id": "app" - }, - "handleValidation": true, - "contentDensities": { - "compact": true, - "cozy": true - }, - "models": { - "i18n": { - "type": "sap.ui.model.resource.ResourceModel", - "settings": { - "bundleName": "application.a.ts.i18n.i18n" - } - } - }, - "routing": { - "config": { - "routerClass": "sap.m.routing.Router", - "viewType": "XML", - "viewPath": "application.a.ts.view", - "controlId": "app", - "controlAggregation": "pages", - "async": true - }, - "routes": [ - { - "pattern": "", - "name": "main", - "target": "main" - } - ], - "targets": { - "main": { - "viewId": "main", - "viewName": "Main" - } - } - } - } -} diff --git a/internal/e2e-tests/fixtures/application.a/package.json b/internal/e2e-tests/fixtures/application.a/package.json deleted file mode 100644 index 209707ddf0f..00000000000 --- a/internal/e2e-tests/fixtures/application.a/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@ui5-internal/application.a", - "version": "1.0.0", - "description": "UI5 Application: application.a", - "license": "Apache-2.0", - "dependencies": { - "chart.js": "4.5.1" - }, - "devDependencies": { - "@openui5/types": "^1.115.1", - "ui5-task-zipper": "^3.6.0", - "ui5-tooling-modules": "^3.35.0", - "ui5-tooling-stringreplace": "^3.6.0" - } -} diff --git a/internal/e2e-tests/fixtures/application.a/ui5-task-zipper.yaml b/internal/e2e-tests/fixtures/application.a/ui5-task-zipper.yaml deleted file mode 100644 index b217eb59ec7..00000000000 --- a/internal/e2e-tests/fixtures/application.a/ui5-task-zipper.yaml +++ /dev/null @@ -1,10 +0,0 @@ -specVersion: "5.0" -metadata: - name: application.a -type: application -builder: - customTasks: - - name: ui5-task-zipper - afterTask: generateVersionInfo - configuration: - archiveName: "webapp" diff --git a/internal/e2e-tests/fixtures/application.a/ui5-tooling-modules.yaml b/internal/e2e-tests/fixtures/application.a/ui5-tooling-modules.yaml deleted file mode 100644 index 943ea39c81a..00000000000 --- a/internal/e2e-tests/fixtures/application.a/ui5-tooling-modules.yaml +++ /dev/null @@ -1,12 +0,0 @@ -specVersion: "5.0" -metadata: - name: application.a -type: application -server: - customMiddleware: - - name: ui5-tooling-modules-middleware - afterMiddleware: compression -builder: - customTasks: - - name: ui5-tooling-modules-task - afterTask: replaceVersion diff --git a/internal/e2e-tests/fixtures/application.a/ui5-tooling-stringreplace.yaml b/internal/e2e-tests/fixtures/application.a/ui5-tooling-stringreplace.yaml deleted file mode 100644 index 36fad93ceee..00000000000 --- a/internal/e2e-tests/fixtures/application.a/ui5-tooling-stringreplace.yaml +++ /dev/null @@ -1,14 +0,0 @@ -specVersion: "5.0" -metadata: - name: application.a -type: application -builder: - customTasks: - - name: ui5-tooling-stringreplace-task - afterTask: replaceVersion - configuration: - files: - - "**/*.js" - replace: - - placeholder: ${PLACEHOLDER_TEXT} - value: "'INSERTED_TEXT'" diff --git a/internal/e2e-tests/fixtures/application.a/webapp/controller/Test.controller.js b/internal/e2e-tests/fixtures/application.a/webapp/controller/Test.controller.js deleted file mode 100644 index 8b0befdce30..00000000000 --- a/internal/e2e-tests/fixtures/application.a/webapp/controller/Test.controller.js +++ /dev/null @@ -1,16 +0,0 @@ -sap.ui.define([], () => { - return Controller.extend("application.a.controller.Test",{ - onInit() { - const z = { - first: { - a: 1, - b: 2, - c: 3 - }, - second: "test" - }; - console.log(z.first.a); - } - }); -}); - diff --git a/internal/e2e-tests/fixtures/application.a/webapp/manifest.json b/internal/e2e-tests/fixtures/application.a/webapp/manifest.json deleted file mode 100644 index 58eb693c97f..00000000000 --- a/internal/e2e-tests/fixtures/application.a/webapp/manifest.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_version": "1.12.0", - "sap.app": { - "id": "application.a", - "type": "application", - "i18n": "i18n/i18n.properties", - "title": "{{appTitle}}", - "description": "{{appDescription}}", - "applicationVersion": { - "version": "1.0.0" - } - }, - "sap.ui": { - "technology": "UI5", - "icons": {}, - "deviceTypes": { - "desktop": true, - "tablet": true, - "phone": true - } - }, - "sap.ui5": { - "rootView": { - "viewName": "application.a.view.App", - "type": "XML", - "async": true, - "id": "app" - }, - "handleValidation": true, - "contentDensities": { - "compact": true, - "cozy": true - }, - "models": { - "i18n": { - "type": "sap.ui.model.resource.ResourceModel", - "settings": { - "bundleName": "application.a.i18n.i18n" - } - } - }, - "routing": { - "config": { - "routerClass": "sap.m.routing.Router", - "viewType": "XML", - "viewPath": "application.a.view", - "controlId": "app", - "controlAggregation": "pages", - "async": true - }, - "routes": [ - { - "pattern": "", - "name": "main", - "target": "main" - } - ], - "targets": { - "main": { - "viewId": "main", - "viewName": "Main" - } - } - } - } -} diff --git a/internal/e2e-tests/package.json b/internal/e2e-tests/package.json deleted file mode 100644 index f4d834aff90..00000000000 --- a/internal/e2e-tests/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@ui5-internal/e2e-tests", - "private": true, - "license": "Apache-2.0", - "type": "module", - "engines": { - "node": "^22.20.0 || >=24.0.0", - "npm": ">= 8" - }, - "scripts": { - "test": "node --test 'test/**/*.js'", - "test-watch": "node --test --watch 'test/**/*.js'", - "lint": "eslint ." - }, - "dependencies": { - "adm-zip": "^0.5.17", - "execa": "^9.6.0" - } -} diff --git a/internal/e2e-tests/test/build.js b/internal/e2e-tests/test/build.js deleted file mode 100644 index 075adcdd7b2..00000000000 --- a/internal/e2e-tests/test/build.js +++ /dev/null @@ -1,200 +0,0 @@ -// Tests for "ui5 build" -// with fixtures (under ../fixtures) -// and by using execa running ui5.cjs under ../../../packages/cli/bin/ui5.cjs. - -import {execa} from "execa"; -import {describe, test} from "node:test"; -import {fileURLToPath} from "node:url"; -import path from "node:path"; -import fs from "node:fs/promises"; -import AdmZip from "adm-zip"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const ui5CliPath = path.resolve(__dirname, "../../../packages/cli/bin/ui5.cjs"); -const ui5 = (args, options = {}) => execa(ui5CliPath, args, options); - -class FixtureHelper { - constructor(fixtureName) { - this.fixtureName = fixtureName; - this.originFixturePath = path.resolve(__dirname, "../fixtures", fixtureName); - this.tmpPath = path.resolve(__dirname, "../tmp", fixtureName); - this.dotUi5Path = path.resolve(this.tmpPath, ".ui5"); - this.distPath = path.resolve(this.tmpPath, "dist"); - } - - async init() { - // Clean up previous runs - await fs.rm(this.tmpPath, {recursive: true, force: true}); - // Copy source files to temp location - await fs.cp(this.originFixturePath, this.tmpPath, {recursive: true}); - // Install node_modules - await this._installNodeModules(); - } - - async build(assert, ui5YamlName) { - const {stdout} = await ui5(["build", "--config", ui5YamlName, "--dest", this.distPath], - {cwd: this.tmpPath, env: {UI5_DATA_DIR: this.dotUi5Path}}); - return stdout; - } - - async _installNodeModules() { - await execa("npm", ["ci"], {cwd: this.tmpPath}); - } - -describe("ui5 build", () => { - test("ui5-tooling-transpile", async ({assert}) => { - const fixtureHelper = new FixtureHelper("application.a.ts"); - await fixtureHelper.init(); - const ui5YamlName = "ui5-tooling-transpile.yaml"; - - // #1 Build - await fixtureHelper.build(assert, ui5YamlName); - - // Test: no TS syntax is left in the preload (transpile + preload tasks succeeeded) - const componentPreload = await fs.readFile( - path.resolve(fixtureHelper.distPath, "Component-preload.js"), "utf-8"); - assert.ok(componentPreload.includes("application/a/ts/controller/Base.controller"), - "Component-preload.js should contain the TS resource transpiled to JS"); - assert.ok(!componentPreload.includes("AppComponent"), "Component-preload.js should NOT contain any TS syntax"); - - // -------------------------------------------------------------------------------------------- - - // Modify source files - const fileToModify = path.resolve(fixtureHelper.tmpPath, "webapp/controller/Base.controller.ts"); - const fileContent = await fs.readFile(fileToModify, "utf-8"); - const modifiedContent = fileContent.replace("public getOwnerComponent()", "public getNewOwnerComponent()"); - await fs.writeFile(fileToModify, modifiedContent, "utf-8"); - - // #2 Build - await fixtureHelper.build(assert, ui5YamlName); - - // Test: the modified content is reflected in the new build output (transpile + preload tasks succeeeded) - const newComponentPreload = await fs.readFile( - path.resolve(fixtureHelper.distPath, "Component-preload.js"), "utf-8"); - assert.ok(newComponentPreload.includes("getNewOwnerComponent"), - "Component-preload.js should contain the updated content from the modified source file"); - }); - - test("ui5-task-zipper", async ({assert}) => { - const fixtureHelper = new FixtureHelper("application.a"); - await fixtureHelper.init(); - const ui5YamlName = "ui5-task-zipper.yaml"; - - // #1 Build - await fixtureHelper.build(assert, ui5YamlName); - - // Test: the zip file is created in the dist folder - const zipFilePath = path.resolve(fixtureHelper.distPath, "webapp.zip"); - const zipFileExists = await fs.access(zipFilePath).then(() => true).catch(() => false); - assert.ok(zipFileExists, "The zip file should be created in the dist folder"); - - // Check the archive content - const zip = new AdmZip(zipFilePath); - const zipEntries = zip.getEntries(); - assert.ok(zipEntries.length > 0, "The zip file should contain entries"); - - // Check that the zip file contains the expected source file - const testControllerEntry = zipEntries.find((entry) => entry.entryName === "controller/Test.controller.js"); - assert.ok(testControllerEntry, "The zip file should contain the expected source file"); - - // -------------------------------------------------------------------------------------------- - - // Delete a source file - await fs.rm(path.resolve(fixtureHelper.tmpPath, "webapp/controller/Test.controller.js")); - - // #2 Build - await fixtureHelper.build(assert, ui5YamlName); - - // Test: the zip file is updated and does not contain the deleted file - const newZipFileExists = await fs.access(zipFilePath).then(() => true).catch(() => false); - assert.ok(newZipFileExists, "The zip file should be created in the dist folder after the second build"); - - // Check the archive content - const zip2 = new AdmZip(zipFilePath); - const zipEntries2 = zip2.getEntries(); - assert.ok(zipEntries2.length > 0, "The zip file should contain entries after the second build"); - - // Check that the zip file does NOT contain the expected source file anymore - const deletedTestControllerEntry = zipEntries2.find((entry) => - entry.entryName === "controller/Test.controller.js"); - assert.ok(!deletedTestControllerEntry, "The zip file should NOT contain the deleted source file"); - }); - - test("ui5-tooling-modules", async ({assert}) => { - const fixtureHelper = new FixtureHelper("application.a"); - await fixtureHelper.init(); - const ui5YamlName = "ui5-tooling-modules.yaml"; - - // #1 Build (no thirdparty module yet -> just checking that the build succeeds) - await fixtureHelper.build(assert, ui5YamlName); - - // -------------------------------------------------------------------------------------------- - - // Add a new source file with a third party import - const newControllerPath = path.resolve(fixtureHelper.tmpPath, "webapp/controller/New.controller.js"); - const newControllerContent = -`sap.ui.define(["chart.js"], (chartJS) => { - return Controller.extend("application.a.controller.New",{ - onInit() { - console.log(chartJS); - } - }); -});`; - await fs.writeFile(newControllerPath, newControllerContent, "utf-8"); - - // #2 Build - await fixtureHelper.build(assert, ui5YamlName); - - // Test: the dist contains the new controller and the third party import - const newComponentPreload = await fs.readFile( - path.resolve(fixtureHelper.distPath, "Component-preload.js"), "utf-8"); - assert.ok(newComponentPreload.includes( - "sap.ui.predefine(\"application/a/controller/New.controller\", [\"application/a/thirdparty/chart.js\"]"), - "Component-preload.js should contain the 'New' controller and chart.js"); - // Test: the dist contains the expected third party module - const chartJSModule = await fs.readFile( - path.resolve(fixtureHelper.distPath, "thirdparty/chart.js.js"), "utf-8"); - assert.ok(chartJSModule.includes("Chart"), "The expected third party module should be included in the dist"); - }); - - test("ui5-tooling-stringreplace", async ({assert}) => { - const fixtureHelper = new FixtureHelper("application.a"); - await fixtureHelper.init(); - const ui5YamlName = "ui5-tooling-stringreplace.yaml"; - - // #1 Build (no string replacing yet -> just checking that the build succeeds) - await fixtureHelper.build(assert, ui5YamlName); - - // -------------------------------------------------------------------------------------------- - - - // Add a new source file with a placeholder string - const newControllerPath = path.resolve(fixtureHelper.tmpPath, "webapp/controller/New.controller.js"); - const newControllerContent = -`sap.ui.define([], () => { - return Controller.extend("application.a.controller.New",{ - onInit() { - console.log(\${PLACEHOLDER_TEXT}); - } - }); -});`; - await fs.writeFile(newControllerPath, newControllerContent, "utf-8"); - - // #2 Build - // FIXME: Currently failing here for IB (https://github.com/UI5/cli/pull/1267), April 02 2026 - aa3a2c1c04f7a5cd27650335cde37a798baacf2a - // Error message: - // ("Minification failed with error: Unexpected token punc «{», expected punc «,» - // in file /resources/application/a/controller/New.controller.js (line 4, col 16, pos 114)") - // - // -> Probably, the string replacement doesn't get executed as very first middleware - // (minify happens earlier unexpectedly) - await fixtureHelper.build(assert, ui5YamlName); - - // Test: the placeholder in the source file is replaced in the dist output - const componentPreload = await fs.readFile( - path.resolve(fixtureHelper.distPath, "Component-preload.js"), "utf-8"); - assert.ok(componentPreload.includes("console.log(\"INSERTED_TEXT\")"), - "The placeholder should get replaced with the expected text in the component preload"); - }); -}); diff --git a/internal/e2e-tests/test/version.js b/internal/e2e-tests/test/version.js deleted file mode 100644 index 30c2eb9e22e..00000000000 --- a/internal/e2e-tests/test/version.js +++ /dev/null @@ -1,31 +0,0 @@ -// Test running "ui5 --version" -// without any fixtures or additional setup. -// and by using node's child_process module and the ui5.cjs under ../../../packages/cli/bin/ui5.cjs. - -import { execFile } from "node:child_process"; -import {test, describe} from "node:test"; -import {fileURLToPath} from "node:url"; -import path from "node:path"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -describe("ui5 version", () => { - test("output the version of the UI5 CLI", ({assert}) => { - const ui5Path = path.resolve(__dirname, "../../../packages/cli/bin/ui5.cjs"); - execFile("node", [ui5Path, "--version"], (error, stdout, stderr) => { - if (error) { - assert.fail(error); - return; - } - if (stderr) { - assert.fail(new Error(stderr)); - return; - } - // Test: the expected CLI version output is printed - // e.g. "5.0.0 (from /path/to/ui5/cli)" - const outPattern = /\d+\..* \(from .*\)/; - assert.ok(stdout.match(outPattern)); - }); - }); -}); diff --git a/package-lock.json b/package-lock.json index b13df20e2fb..c3d291f3cf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4273,10 +4273,6 @@ "resolved": "internal/benchmark", "link": true }, - "node_modules/@ui5-internal/e2e-tests": { - "resolved": "internal/e2e-tests", - "link": true - }, "node_modules/@ui5/builder": { "resolved": "packages/builder", "link": true @@ -4634,15 +4630,6 @@ "node": ">=0.4.0" } }, - "node_modules/adm-zip": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", - "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", - "license": "MIT", - "engines": { - "node": ">=12.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "license": "MIT", @@ -4783,8 +4770,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -4796,8 +4781,6 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -5136,8 +5119,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", "engines": { "node": ">=8" @@ -5658,8 +5639,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -5682,8 +5661,6 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -9252,8 +9229,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -11110,8 +11085,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12958,8 +12931,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -12970,8 +12941,6 @@ }, "node_modules/readdirp/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" From a7ebd7a8f39ea6ef1c3a34eccb17427df8e3c9cf Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Mon, 27 Apr 2026 12:20:56 +0300 Subject: [PATCH 07/16] refactor: Add fallback mechanism for removed middlewares --- .../lib/middleware/MiddlewareManager.js | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/server/lib/middleware/MiddlewareManager.js b/packages/server/lib/middleware/MiddlewareManager.js index 10348b82154..f826d954d72 100644 --- a/packages/server/lib/middleware/MiddlewareManager.js +++ b/packages/server/lib/middleware/MiddlewareManager.js @@ -2,6 +2,16 @@ import middlewareRepository from "./middlewareRepository.js"; import MiddlewareUtil from "./MiddlewareUtil.js"; import {getLogger} from "@ui5/logger"; const hasOwn = Function.prototype.call.bind(Object.prototype.hasOwnProperty); +const log = getLogger("server:MiddlewareManager"); + +/** + * Mapping of removed standard middleware names to their predecessor and successor + * in the original execution order. Used to remap custom middleware references + * to the nearest remaining middleware when a removed middleware is referenced. + */ +const LEGACY_MIDDLEWARE_MAPPING = { + serveThemes: {before: "testRunner", after: "versionInfo"} +}; /** * @private @@ -96,7 +106,7 @@ class MiddlewareManager { } if (beforeMiddleware || afterMiddleware) { - const refMiddlewareName = beforeMiddleware || afterMiddleware; + let refMiddlewareName = beforeMiddleware || afterMiddleware; let refMiddlewareIdx = this.middlewareExecutionOrder.indexOf(refMiddlewareName); if (refMiddlewareName === "connectUi5Proxy") { @@ -106,6 +116,26 @@ class MiddlewareManager { `has been removed in this version of UI5 CLI and can't be referenced anymore. ` + `Please see the migration guide at https://ui5.github.io/cli/updates/migrate-v3/`); } + + // Handle legacy middleware with graceful fallback + const legacyMapping = LEGACY_MIDDLEWARE_MAPPING[refMiddlewareName]; + if (legacyMapping) { + const originalRef = refMiddlewareName; + // Replace with the appropriate fallback based on reference type + refMiddlewareName = afterMiddleware ? legacyMapping.before : legacyMapping.after; + + log.warn( + `Standard middleware "${originalRef}" has been removed. ` + + `Custom middleware "${middlewareName}" defined in project ` + + `"${this.middlewareUtil.getProject()}" references it and ` + + `is now placed ${afterMiddleware ? "after" : "before"} ` + + `"${refMiddlewareName}" instead. ` + + `For details, see the migration guide at ` + + `https://ui5.github.io/cli/next/updates/migrate-v5`); + } + + refMiddlewareIdx = this.middlewareExecutionOrder.indexOf(refMiddlewareName); + if (refMiddlewareIdx === -1) { throw new Error(`Could not find middleware ${refMiddlewareName}, referenced by custom ` + `middleware ${middlewareName}`); From 7bf96f40cfdff5fc9bc4c3c920190f786eda0d9a Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Mon, 27 Apr 2026 12:29:04 +0300 Subject: [PATCH 08/16] refactor: Remove serveThemes and cleanup after it --- .../lib/middleware/MiddlewareManager.js | 2 - .../lib/middleware/middlewareRepository.js | 1 - packages/server/lib/middleware/serveThemes.js | 123 ------------------ 3 files changed, 126 deletions(-) delete mode 100644 packages/server/lib/middleware/serveThemes.js diff --git a/packages/server/lib/middleware/MiddlewareManager.js b/packages/server/lib/middleware/MiddlewareManager.js index f826d954d72..ec645915d7d 100644 --- a/packages/server/lib/middleware/MiddlewareManager.js +++ b/packages/server/lib/middleware/MiddlewareManager.js @@ -250,8 +250,6 @@ class MiddlewareManager { }); await this.addMiddleware("serveResources"); await this.addMiddleware("testRunner"); - // TODO: Allow to still reference 'serveThemes' middleware in custom middleware - // await this.addMiddleware("serveThemes"); await this.addMiddleware("versionInfo", { mountPath: "/resources/sap-ui-version.json" }); diff --git a/packages/server/lib/middleware/middlewareRepository.js b/packages/server/lib/middleware/middlewareRepository.js index a9e0d25a1b1..863380de18e 100644 --- a/packages/server/lib/middleware/middlewareRepository.js +++ b/packages/server/lib/middleware/middlewareRepository.js @@ -6,7 +6,6 @@ const middlewareInfos = { serveIndex: {path: "./serveIndex.js"}, discovery: {path: "./discovery.js"}, versionInfo: {path: "./versionInfo.js"}, - serveThemes: {path: "./serveThemes.js"}, testRunner: {path: "./testRunner.js"}, nonReadRequests: {path: "./nonReadRequests.js"} }; diff --git a/packages/server/lib/middleware/serveThemes.js b/packages/server/lib/middleware/serveThemes.js deleted file mode 100644 index 57771224805..00000000000 --- a/packages/server/lib/middleware/serveThemes.js +++ /dev/null @@ -1,123 +0,0 @@ -import {ThemeBuilder} from "@ui5/builder/processors/themeBuilder"; -import fsInterface from "@ui5/fs/fsInterface"; -import {basename, dirname} from "node:path/posix"; -import etag from "etag"; -import fresh from "fresh"; -import parseurl from "parseurl"; - -function isFresh(req, res) { - return fresh(req.headers, { - "etag": res.getHeader("ETag") - }); -} - -// List of experimental css variables resources that should activate the "cssVariables" build -const cssVariablesThemeResources = [ - "css_variables.source.less", - "css_variables.css", - "library_skeleton.css", - "library_skeleton-RTL.css" -]; - -// List of resources that should be handled by the middleware -const themeResources = [ - "library.css", - "library-RTL.css", - "library-parameters.json", - ...cssVariablesThemeResources -]; - -/** - * Creates and returns the middleware to build themes. - * - * The theme is built in realtime. If a less file was modified, the theme build is triggered to rebuild the theme. - * - * @module @ui5/server/middleware/serveThemes - * @param {object} parameters Parameters - * @param {@ui5/server/internal/MiddlewareManager.middlewareResources} parameters.resources Parameters - * @param {object} parameters.middlewareUtil Specification version dependent interface to a - * [MiddlewareUtil]{@link @ui5/server/middleware/MiddlewareUtil} instance - * @returns {Function} Returns a server middleware closure. - */ -function createMiddleware({resources, middlewareUtil}) { - const builder = new ThemeBuilder({ - fs: fsInterface(resources.all) - }); - const buildOptions = Object.create(null); - - const currentRequests = Object.create(null); - - async function buildTheme(pathname) { - const filename = basename(pathname); - - if (cssVariablesThemeResources.includes(filename) && !buildOptions.cssVariables) { - // Activate CSS Variables build the first time a relevant resource is requested - buildOptions.cssVariables = true; - // Clear the cache to ensure that the build is executed again with "cssVariables: true" - builder.clearCache(); - } - - const sourceLessPath = dirname(pathname) + "/library.source.less"; - const sourceLessResource = await resources.all.byPath(sourceLessPath); - if (!sourceLessResource) { // Not found - return; - } - - const createdResources = await builder.build([sourceLessResource], buildOptions); - - // Pick requested file resource - const resource = createdResources.find((res) => basename(res.getPath()) === filename); - if (!resource) { - throw new Error(`Theme Build did not return requested file "${pathname}"`); - } - - return resource; - } - - async function sendResponse(req, res, resource) { - const resourcePath = resource.getPath(); - const {contentType} = middlewareUtil.getMimeInfo(resourcePath); - res.setHeader("Content-Type", contentType); - - const content = await resource.getBuffer(); - - res.setHeader("ETag", etag(content)); - - if (isFresh(req, res)) { - // client has a fresh copy of the resource - res.statusCode = 304; - res.end(); - return; - } - - res.end(content); - } - - return async function theme(req, res, next) { - try { - const pathname = parseurl(req).pathname; - const filename = basename(pathname); - if (!themeResources.includes(filename)) { - next(); - return; - } - - if (!currentRequests[pathname]) { - currentRequests[pathname] = buildTheme(pathname); - } - - const resource = await currentRequests[pathname]; - if (!resource) { - next(); - } else { - await sendResponse(req, res, resource); - } - - delete currentRequests[pathname]; - } catch (err) { - next(err); - } - }; -} - -export default createMiddleware; From c74f92222a91053b25775b518d7d0b66104e388a Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Mon, 27 Apr 2026 14:35:13 +0300 Subject: [PATCH 09/16] refactor: Cleanup redundant check --- packages/server/lib/middleware/MiddlewareManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/lib/middleware/MiddlewareManager.js b/packages/server/lib/middleware/MiddlewareManager.js index ec645915d7d..397fc6422b6 100644 --- a/packages/server/lib/middleware/MiddlewareManager.js +++ b/packages/server/lib/middleware/MiddlewareManager.js @@ -35,7 +35,7 @@ class MiddlewareManager { sendSAPTargetCSP: false, serveCSPReports: false }}) { - if (!graph || !rootProject || !sources || !resources || !resources.all || + if (!graph || !rootProject || !resources || !resources.all || !resources.rootProject || !resources.dependencies) { throw new Error("[MiddlewareManager]: One or more mandatory parameters not provided"); } From fe0d8850a68090171428e4900ae79769cc3966b1 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Mon, 27 Apr 2026 14:35:30 +0300 Subject: [PATCH 10/16] test: Cleanup already incorrect tests --- packages/server/test/lib/server/main.js | 109 ---- .../test/lib/server/middleware/serveThemes.js | 478 ------------------ 2 files changed, 587 deletions(-) delete mode 100644 packages/server/test/lib/server/middleware/serveThemes.js diff --git a/packages/server/test/lib/server/main.js b/packages/server/test/lib/server/main.js index 6a8abe32f4d..9cca96cf6a1 100644 --- a/packages/server/test/lib/server/main.js +++ b/packages/server/test/lib/server/main.js @@ -250,115 +250,6 @@ test("Get sap-ui-version.json from versionInfo middleware (/resources/sap-ui-ver }, "Correct response"); }); -test("Get library.css from theme middleware (/resources/library/a/themes/base/library.css)", async (t) => { - const res = await request.get("/resources/library/a/themes/base/library.css"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /css/, "Correct content type"); - t.is(res.text, `.library-a-foo { - color: #fafad2; - padding: 1px 2px 3px 4px; -} - -/* Inline theming parameters */ -#sap-ui-theme-library\\.a{background-image:url('data:text/plain;utf-8,%7B%22libraryAColor1%22%3A%22%23fafad2%22%7D')} -`, "Correct response"); -}); - -test("Get library-RTL.css from theme middleware (/resources/library/a/themes/base/library-RTL.css)", async (t) => { - const res = await request.get("/resources/library/a/themes/base/library-RTL.css"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /css/, "Correct content type"); - t.is(res.text, `.library-a-foo { - color: #fafad2; - padding: 1px 4px 3px 2px; -} - -/* Inline theming parameters */ -#sap-ui-theme-library\\.a{background-image:url('data:text/plain;utf-8,%7B%22libraryAColor1%22%3A%22%23fafad2%22%7D')} -`, "Correct response"); -}); - -test("Get library-parameters.json from theme middleware (/resources/library/a/themes/base/library-parameters.json)", - async (t) => { - const res = await request.get("/resources/library/a/themes/base/library-parameters.json"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /json/, "Correct content type"); - t.deepEqual(res.body, { - libraryAColor1: "#fafad2" - }, "Correct response"); - }); - -test("Get css_variables.source.less from theme middleware (/resources/library/a/themes/base/css_variables.source.less)", - async (t) => { - const res = await request.get("/resources/library/a/themes/base/css_variables.source.less"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /less/, "Correct content type"); - t.is(res.text, `@libraryAColor1: #fafad2; - -:root { ---libraryAColor1: @libraryAColor1; -} -`, "Correct response"); - }); - -test("Get css_variables.css from theme middleware (/resources/library/a/themes/base/css_variables.css)", async (t) => { - const res = await request.get("/resources/library/a/themes/base/css_variables.css"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /css/, "Correct content type"); - t.is(res.text, `:root { - --libraryAColor1: #fafad2; -} - -/* Inline theming parameters */ -#sap-ui-theme-library\\.a{background-image:url('data:text/plain;utf-8,%7B%22libraryAColor1%22%3A%22%23fafad2%22%7D')} -`, "Correct response"); -}); - -test("Get library_skeleton.css from theme middleware (/resources/library/a/themes/base/library_skeleton.css)", - async (t) => { - const res = await request.get("/resources/library/a/themes/base/library_skeleton.css"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /css/, "Correct content type"); - t.is(res.text, `.library-a-foo { - color: var(--libraryAColor1); - padding: 1px 2px 3px 4px; -} -`, "Correct response"); - }); - -test("Get library_skeleton-RTL.css from theme middleware (/resources/library/a/themes/base/library_skeleton-RTL.css)", - async (t) => { - const res = await request.get("/resources/library/a/themes/base/library_skeleton-RTL.css"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /css/, "Correct content type"); - t.is(res.text, `.library-a-foo { - color: var(--libraryAColor1); - padding: 1px 4px 3px 2px; -} -`, "Correct response"); - }); - test("Stop server", async (t) => { const port = 3350; const request = supertest(`http://localhost:${port}`); diff --git a/packages/server/test/lib/server/middleware/serveThemes.js b/packages/server/test/lib/server/middleware/serveThemes.js deleted file mode 100644 index deb58536f60..00000000000 --- a/packages/server/test/lib/server/middleware/serveThemes.js +++ /dev/null @@ -1,478 +0,0 @@ -import test from "ava"; - -import sinon from "sinon"; -import esmock from "esmock"; - -import {ThemeBuilder} from "@ui5/builder/processors/themeBuilder"; -import MiddlewareUtil from "../../../../lib/middleware/MiddlewareUtil.js"; - -const failOnNext = function(t, reject) { - return function(err) { - if (err) { - t.fail("Unexpected error passed to next function: " + err); - } else { - t.fail("Unexpected call of next function"); - } - reject(); - }; -}; - -const createResources = function() { - return { - // Input - "library.source.less": {}, - - // Default result - "library.css": { - getBuffer: sinon.stub().resolves("/* library.css */"), - getPath: sinon.stub().returns("/resources/sap/ui/test/themes/base/library.css") - }, - "library-RTL.css": { - getBuffer: sinon.stub().resolves("/* library-RTL.css */"), - getPath: sinon.stub().returns("/resources/sap/ui/test/themes/base/library-RTL.css") - }, - "library-parameters.json": { - getBuffer: sinon.stub().resolves("/* library-parameters.json */"), - getPath: sinon.stub().returns("/resources/sap/ui/test/themes/base/library-parameters.json") - }, - - // CSS Variables result - "css_variables.source.less": { - getBuffer: sinon.stub().resolves(`/* css_variables.source.less */`), - getPath: sinon.stub().returns("/resources/sap/ui/test/themes/base/css_variables.source.less") - }, - "css_variables.css": { - getBuffer: sinon.stub().resolves(`/* css_variables.css */`), - getPath: sinon.stub().returns("/resources/sap/ui/test/themes/base/css_variables.css") - }, - "library_skeleton.css": { - getBuffer: sinon.stub().resolves(`/* library_skeleton.css */`), - getPath: sinon.stub().returns("/resources/sap/ui/test/themes/base/library_skeleton.css") - }, - "library_skeleton-RTL.css": { - getBuffer: sinon.stub().resolves(`/* library_skeleton-RTL.css */`), - getPath: sinon.stub().returns("/resources/sap/ui/test/themes/base/library_skeleton-RTL.css") - } - }; -}; - -const stubThemeBuild = function(resources) { - const build = sinon.stub(ThemeBuilder.prototype, "build"); - build.rejects(new Error("File not found!")); - build.withArgs([resources["library.source.less"]], {}).resolves([ - resources["library.css"], - resources["library-RTL.css"], - resources["library-parameters.json"] - ]); - build.withArgs([resources["library.source.less"]], {cssVariables: true}).resolves([ - resources["library.css"], - resources["library-RTL.css"], - resources["library-parameters.json"], - resources["css_variables.source.less"], - resources["css_variables.css"], - resources["library_skeleton.css"], - resources["library_skeleton-RTL.css"] - ]); - return build; -}; - -const verifyThemeRequest = function(t, filename) { - const resources = createResources(); - - stubThemeBuild(resources); - - const {middleware, byPath} = t.context; - byPath.withArgs("/resources/sap/ui/test/themes/base/library.source.less") - .resolves(resources["library.source.less"]); - - const req = { - url: "/resources/sap/ui/test/themes/base/" + filename, - headers: {} - }; - - return new Promise((resolve, reject) => { - const res = { - setHeader: sinon.stub(), - getHeader: sinon.stub(), - end: function(responseText) { - t.is(responseText, `/* ${filename} */`); - if (filename.endsWith(".css")) { - t.deepEqual(res.setHeader.getCall(0).args, ["Content-Type", "text/css; charset=UTF-8"]); - } else if (filename.endsWith(".less")) { - t.deepEqual(res.setHeader.getCall(0).args, ["Content-Type", "text/less; charset=UTF-8"]); - } else if (filename.endsWith(".json")) { - t.deepEqual(res.setHeader.getCall(0).args, ["Content-Type", "application/json; charset=UTF-8"]); - } else { - t.fail("Invalid file extension provided to 'verifyThemeRequest'"); - } - resolve(); - } - }; - - middleware(req, res, failOnNext(t, reject)); - }); -}; - -test.beforeEach(async (t) => { - t.context.etag = sinon.stub(); - t.context.fresh = sinon.stub(); - - t.context.serveThemes = await esmock("../../../../lib/middleware/serveThemes.js", { - "etag": t.context.etag, - "fresh": t.context.fresh - }); - - const resources = { - all: { - byPath: sinon.stub() - } - }; - t.context.byPath = resources.all.byPath; - - t.context.middleware = t.context.serveThemes({ - middlewareUtil: new MiddlewareUtil({graph: "graph", project: "project"}), - resources - }); -}); - -test.afterEach.always((t) => { - sinon.restore(); -}); - -test.serial("Serving library.css", (t) => { - return verifyThemeRequest(t, "library.css"); -}); - -test.serial("Serving library-RTL.css", (t) => { - return verifyThemeRequest(t, "library-RTL.css"); -}); - -test.serial("Serving library-parameters.json", (t) => { - return verifyThemeRequest(t, "library-parameters.json"); -}); - -test.serial("Serving css_variables.source.less", (t) => { - return verifyThemeRequest(t, "css_variables.source.less"); -}); - -test.serial("Serving css_variables.css", (t) => { - return verifyThemeRequest(t, "css_variables.css"); -}); - -test.serial("Serving library_skeleton.css", (t) => { - return verifyThemeRequest(t, "library_skeleton.css"); -}); - -test.serial("Serving library_skeleton-RTL.css", (t) => { - return verifyThemeRequest(t, "library_skeleton-RTL.css"); -}); - -test.serial("Clear cache to rebuild themes when CSS Variables file is requested", (t) => { - const resources = createResources(); - - const build = stubThemeBuild(resources); - const clearCache = sinon.stub(ThemeBuilder.prototype, "clearCache"); - - const {middleware, byPath} = t.context; - byPath.withArgs("/resources/sap/ui/test/themes/base/library.source.less") - .resolves(resources["library.source.less"]); - - return new Promise((resolve, reject) => { - function firstRequest() { - const req = { - url: "/resources/sap/ui/test/themes/base/library.css", - headers: {} - }; - - const res = { - setHeader: sinon.stub(), - getHeader: sinon.stub(), - end: function() { - t.deepEqual(build.getCall(0).args, [[resources["library.source.less"]], {}], - "Build should be called without options"); - - t.false(clearCache.called, "Clear cache should not be called"); - - // Trigger next request - secondRequest(); - } - }; - - middleware(req, res, failOnNext(t)); - } - - function secondRequest() { - const req = { - url: "/resources/sap/ui/test/themes/base/css_variables.css", - headers: {} - }; - - const res = { - setHeader: sinon.stub(), - getHeader: sinon.stub(), - end: function() { - t.deepEqual(build.getCall(1).args, [[resources["library.source.less"]], {cssVariables: true}], - "Build should be called with cssVariables option"); - - t.true(clearCache.called, "Clear cache should be called"); - - resolve(); - } - }; - - middleware(req, res, failOnNext(t, reject)); - } - - firstRequest(); - }); -}); - -test.serial("Clear cache only once after enabling CSS Variables", (t) => { - const resources = createResources(); - - const build = stubThemeBuild(resources); - const clearCache = sinon.stub(ThemeBuilder.prototype, "clearCache"); - - const {middleware, byPath} = t.context; - byPath.withArgs("/resources/sap/ui/test/themes/base/library.source.less") - .resolves(resources["library.source.less"]); - - return new Promise((resolve, reject) => { - function firstRequest() { - const req = { - url: "/resources/sap/ui/test/themes/base/css_variables.css", - headers: {} - }; - - const res = { - setHeader: sinon.stub(), - getHeader: sinon.stub(), - end: function() { - t.deepEqual(build.getCall(0).args, [[resources["library.source.less"]], {cssVariables: true}], - "Build should be called with cssVariables option"); - - t.true(clearCache.calledOnce, "Clear cache should be called once"); - - // Trigger next request - secondRequest(); - } - }; - - middleware(req, res, failOnNext(t, reject)); - } - - function secondRequest() { - const req = { - url: "/resources/sap/ui/test/themes/base/library_skeleton.css", - headers: {} - }; - - const res = { - setHeader: sinon.stub(), - getHeader: sinon.stub(), - end: function() { - t.deepEqual(build.getCall(1).args, [[resources["library.source.less"]], {cssVariables: true}], - "Build should be called with cssVariables option"); - - t.true(clearCache.calledOnce, "Clear cache should still only be called once"); - - resolve(); - } - }; - - middleware(req, res, failOnNext(t, reject)); - } - - firstRequest(); - }); -}); - -test.serial("Do not handle non-theme requests", (t) => { - const {middleware} = t.context; - - const req = { - url: "/resources/sap/ui/test/test.js" - }; - - const res = {}; - - return new Promise((resolve) => { - middleware(req, res, function() { - t.pass("Next middleware is called for non-theme requests"); - resolve(); - }); - }); -}); - -test.serial("Do not handle requests without an existing library.source.less file", (t) => { - const resources = createResources(); - - stubThemeBuild(resources); - - const {middleware, byPath} = t.context; - byPath.withArgs("/resources/sap/ui/test/themes/base/library.source.less").resolves(null); - - const req = { - url: "/resources/sap/ui/test/themes/base/library.css", - headers: {} - }; - - const res = {}; - - return new Promise((resolve) => { - middleware(req, res, function() { - t.pass("Next middleware is called when no library.source.less file is found"); - resolve(); - }); - }); -}); - -test.serial("Only send 304 response in case the client has cached the response already", (t) => { - const {middleware, byPath, etag, fresh} = t.context; - - const ETag = `"fake-etag"`; - - etag.returns(ETag); - - fresh.callsFake(function(reqHeaders, resHeaders) { - t.deepEqual(reqHeaders, { - "If-None-Match": ETag - }); - t.deepEqual(resHeaders, { - "etag": ETag - }); - return true; - }); - - const resources = createResources(); - - stubThemeBuild(resources); - - byPath.withArgs("/resources/sap/ui/test/themes/base/library.source.less") - .resolves(resources["library.source.less"]); - - const req = { - url: "/resources/sap/ui/test/themes/base/library.css", - headers: { - "If-None-Match": ETag - } - }; - - return new Promise((resolve, reject) => { - const res = { - setHeader: sinon.stub(), - getHeader: sinon.stub().withArgs("ETag").returns(ETag), - end: function(responseText) { - t.is(responseText, undefined); - t.is(res.statusCode, 304); - t.deepEqual(res.setHeader.getCall(1).args, ["ETag", ETag]); - resolve(); - } - }; - - middleware(req, res, failOnNext(t, reject)); - }); -}); - -// This could only happen when the theme build processor does not return an expected resource -test.serial("Error handling: Request resource that ThemeBuild doesn't return", (t) => { - const resources = createResources(); - - // Adopt path of library.css so that it can't be found from the theme build results - resources["library.css"].getPath.returns("/foo.js"); - - stubThemeBuild(resources); - - const {middleware, byPath} = t.context; - byPath.withArgs("/resources/sap/ui/test/themes/base/library.source.less") - .resolves(resources["library.source.less"]); - - const req = { - url: "/resources/sap/ui/test/themes/base/library.css", - headers: {} - }; - - const res = {}; - - return new Promise((resolve, reject) => { - middleware(req, res, function(err) { - t.is(err.message, - `Theme Build did not return requested file "/resources/sap/ui/test/themes/base/library.css"`); - resolve(); - }); - }); -}); - -test.serial("Error handling: Unexpected exception within middleware should call next with error", (t) => { - const error = new Error("Unexpected Error"); - - const {middleware, byPath} = t.context; - byPath.rejects(error); - - const req = { - url: "/resources/sap/ui/test/themes/base/library.css", - headers: {} - }; - - const res = {}; - - return new Promise((resolve, reject) => { - middleware(req, res, function(err) { - t.is(err, error); - resolve(); - }); - }); -}); - -test.serial("Multiple parallel requests to the same path should only result in one theme build", async (t) => { - const resources = createResources(); - - const build = stubThemeBuild(resources); - - const {middleware, byPath} = t.context; - byPath.withArgs("/resources/sap/ui/test/themes/base/library.source.less") - .resolves(resources["library.source.less"]); - byPath.withArgs("/resources/sap/ui/test2/themes/base/library.source.less") - .resolves(resources["library.source.less"]); - - function request(url) { - return new Promise((resolve, reject) => { - const req = { - url, - headers: {} - }; - - const res = { - setHeader: sinon.stub(), - getHeader: sinon.stub(), - end: resolve - }; - - middleware(req, res, reject); - }); - } - - await Promise.all([ - request("/resources/sap/ui/test/themes/base/library.css"), - request("/resources/sap/ui/test/themes/base/library.css"), - request("/resources/sap/ui/test/themes/base/library.css"), - - request("/resources/sap/ui/test2/themes/base/library.css"), - request("/resources/sap/ui/test2/themes/base/library.css") - ]); - // Should only build once per url - t.is(build.callCount, 2, "Build should be called 2 times"); - - - // After all requests have finished, the build should be started again when another request comes in - await Promise.all([ - request("/resources/sap/ui/test/themes/base/library.css"), - request("/resources/sap/ui/test/themes/base/library.css"), - request("/resources/sap/ui/test/themes/base/library.css"), - - request("/resources/sap/ui/test2/themes/base/library.css"), - request("/resources/sap/ui/test2/themes/base/library.css") - ]); - // Should only build once per url - t.is(build.callCount, 4, "Build should be called 4 times"); -}); From 5859e4b5dd5364d5a0784b2535ad83663f1f4e2d Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Mon, 27 Apr 2026 14:37:13 +0300 Subject: [PATCH 11/16] test: Add test cases --- .../server/middleware/MiddlewareManager.js | 122 +++++++++++++++++- 1 file changed, 120 insertions(+), 2 deletions(-) diff --git a/packages/server/test/lib/server/middleware/MiddlewareManager.js b/packages/server/test/lib/server/middleware/MiddlewareManager.js index fb297df3f02..a1fcf036821 100644 --- a/packages/server/test/lib/server/middleware/MiddlewareManager.js +++ b/packages/server/test/lib/server/middleware/MiddlewareManager.js @@ -203,6 +203,125 @@ test("addMiddleware: Add middleware with beforeMiddleware=connectUi5Proxy", asyn "Trying to bind to a non-existing standard middleware"); }); +test("addMiddleware: Add middleware with afterMiddleware referencing removed middleware", async (t) => { + const {sinon} = t.context; + const warnSpy = sinon.spy(); + const StubbedMiddlewareManager = await esmock("../../../../lib/middleware/MiddlewareManager.js", { + "@ui5/logger": {getLogger: sinon.stub().returns({warn: warnSpy})} + }); + const middlewareManager = new StubbedMiddlewareManager({ + graph: {}, + rootProject: "root project", + resources: { + all: "I", + rootProject: "like", + dependencies: "ponies" + } + }); + + await middlewareManager.addStandardMiddleware(); + + await middlewareManager.addMiddleware("customMiddleware", { + customMiddleware: () => {}, + afterMiddleware: "serveThemes", + mountPath: "/pony" + }); + + // Custom middleware should be placed after testRunner (predecessor of serveThemes) + const testRunnerIdx = middlewareManager.middlewareExecutionOrder.indexOf("testRunner"); + const customIdx = middlewareManager.middlewareExecutionOrder.indexOf("customMiddleware"); + t.is(customIdx, testRunnerIdx + 1, + "Custom middleware is placed right after testRunner (predecessor of removed serveThemes)"); + + t.is(warnSpy.callCount, 1, "Warning was logged"); + t.true(warnSpy.getCall(0).args[0].includes("serveThemes"), + "Warning message mentions removed middleware"); + t.true(warnSpy.getCall(0).args[0].includes("testRunner"), + "Warning message mentions fallback target"); + t.true(warnSpy.getCall(0).args[0].includes("migrate-v5"), + "Warning message includes migration guide URL"); +}); + +test("addMiddleware: Add middleware with beforeMiddleware referencing removed middleware", async (t) => { + const {sinon} = t.context; + const warnSpy = sinon.spy(); + const StubbedMiddlewareManager = await esmock("../../../../lib/middleware/MiddlewareManager.js", { + "@ui5/logger": {getLogger: sinon.stub().returns({warn: warnSpy})} + }); + const middlewareManager = new StubbedMiddlewareManager({ + graph: {}, + rootProject: "root project", + resources: { + all: "I", + rootProject: "like", + dependencies: "ponies" + } + }); + + await middlewareManager.addStandardMiddleware(); + + await middlewareManager.addMiddleware("customMiddleware", { + customMiddleware: () => {}, + beforeMiddleware: "serveThemes", + mountPath: "/pony" + }); + + // Custom middleware should be placed before versionInfo (successor of serveThemes) + const versionInfoIdx = middlewareManager.middlewareExecutionOrder.indexOf("versionInfo"); + const customIdx = middlewareManager.middlewareExecutionOrder.indexOf("customMiddleware"); + t.is(customIdx, versionInfoIdx - 1, + "Custom middleware is placed right before versionInfo (successor of removed serveThemes)"); + + t.is(warnSpy.callCount, 1, "Warning was logged"); + t.true(warnSpy.getCall(0).args[0].includes("serveThemes"), + "Warning message mentions removed middleware"); + t.true(warnSpy.getCall(0).args[0].includes("versionInfo"), + "Warning message mentions fallback target"); + t.true(warnSpy.getCall(0).args[0].includes("migrate-v5"), + "Warning message includes migration guide URL"); +}); + +test("addMiddleware: Multiple custom middlewares referencing removed middleware", async (t) => { + const {sinon} = t.context; + const warnSpy = sinon.spy(); + const StubbedMiddlewareManager = await esmock("../../../../lib/middleware/MiddlewareManager.js", { + "@ui5/logger": {getLogger: sinon.stub().returns({warn: warnSpy})} + }); + const middlewareManager = new StubbedMiddlewareManager({ + graph: {}, + rootProject: "root project", + resources: { + all: "I", + rootProject: "like", + dependencies: "ponies" + } + }); + + await middlewareManager.addStandardMiddleware(); + + await middlewareManager.addMiddleware("customMiddleware1", { + customMiddleware: () => {}, + afterMiddleware: "serveThemes" + }); + await middlewareManager.addMiddleware("customMiddleware2", { + customMiddleware: () => {}, + afterMiddleware: "serveThemes" + }); + + // Both should be placed after testRunner (predecessor of serveThemes) + // Since both reference the same position, they end up in reverse insertion order + const testRunnerIdx = middlewareManager.middlewareExecutionOrder.indexOf("testRunner"); + const custom1Idx = middlewareManager.middlewareExecutionOrder.indexOf("customMiddleware1"); + const custom2Idx = middlewareManager.middlewareExecutionOrder.indexOf("customMiddleware2"); + + t.is(custom2Idx, testRunnerIdx + 1, + "Second custom middleware is placed right after testRunner (inserted last)"); + t.is(custom1Idx, testRunnerIdx + 2, + "First custom middleware is placed after the second one (was pushed forward)"); + + t.is(warnSpy.callCount, 2, "Warning was logged for both middlewares"); +}); + test("addMiddleware: Add middleware with afterMiddleware parameter", async (t) => { const middlewareManager = new MiddlewareManager({ graph: {}, @@ -330,7 +449,7 @@ test("addStandardMiddleware: Adds standard middleware in correct order", async ( const addMiddlewareStub = sinon.stub(middlewareManager, "addMiddleware").resolves(); await middlewareManager.addStandardMiddleware(); - t.is(addMiddlewareStub.callCount, 10, "Expected count of middleware got added"); + t.is(addMiddlewareStub.callCount, 9, "Expected count of middleware got added"); const addedMiddlewareNames = []; for (let i = 0; i < addMiddlewareStub.callCount; i++) { addedMiddlewareNames.push(addMiddlewareStub.getCall(i).args[0]); @@ -342,7 +461,6 @@ test("addStandardMiddleware: Adds standard middleware in correct order", async ( "discovery", "serveResources", "testRunner", - "serveThemes", "versionInfo", "nonReadRequests", "serveIndex" From 9cb63897a1b716472a312b5c7e78fb339a47efbf Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Mon, 27 Apr 2026 15:01:13 +0300 Subject: [PATCH 12/16] docs: Provide migration information --- internal/documentation/docs/pages/Server.md | 12 +++++------ .../documentation/docs/updates/migrate-v5.md | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/internal/documentation/docs/pages/Server.md b/internal/documentation/docs/pages/Server.md index f3dc2ed6865..64fd885fe4a 100644 --- a/internal/documentation/docs/pages/Server.md +++ b/internal/documentation/docs/pages/Server.md @@ -25,6 +25,12 @@ Please be aware of the following risks when using the server: ## Standard Middleware +::: info Removed Middleware +The `serveThemes` middleware has been removed in UI5 CLI v5. Theme compilation is now handled by the `buildThemes` build task during the incremental build, which pre-compiles all theme CSS files. The resulting CSS files (including `library.css`, `library-RTL.css`, `library-parameters.json`, and CSS Variables resources) are served via the `serveResources` middleware, providing the same functionality with better performance through build-time compilation and caching. + +Custom middleware previously referencing `serveThemes` via `beforeMiddleware` or `afterMiddleware` will continue to work with automatic remapping and a deprecation warning. See the [v5 migration guide](../updates/migrate-v5.md) for details. +::: + All available standard middleware are listed below in the order of their execution. A project can also add custom middleware to the server by using the [Custom Server Middleware Extensibility](./extensibility/CustomServerMiddleware.md). @@ -37,7 +43,6 @@ A project can also add custom middleware to the server by using the [Custom Serv | `discovery` | See chapter [discovery](#discovery) | | `serveResources` | See chapter [serveResources](#serveresources) | | `testRunner` | See chapter [testRunner](#testrunner) | -| `serveThemes` | See chapter [serveThemes](#servethemes) | | `versionInfo` | See chapter [versionInfo](#versioninfo) | | `nonReadRequests` | See chapter [nonReadRequests](#nonreadrequests) | | `serveIndex` | See chapter [serveIndex](#serveindex) | @@ -73,11 +78,6 @@ The following file content transformations are executed: ### testRunner Serves a static version of the UI5 QUnit TestRunner at `/test-resources/sap/ui/qunit/testrunner.html`. -### serveThemes -Compiles CSS files for themes on-the-fly from the source `*.less` files. - -Changes made to these `*.less` files while the server is running will automatically lead to the re-compilation of the relevant CSS files when requested again. - ### versionInfo Generates and serves the version info file `/resources/sap-ui-version.json`, which is required for several framework functionalities. diff --git a/internal/documentation/docs/updates/migrate-v5.md b/internal/documentation/docs/updates/migrate-v5.md index b4de575af10..68a27c2fdff 100644 --- a/internal/documentation/docs/updates/migrate-v5.md +++ b/internal/documentation/docs/updates/migrate-v5.md @@ -198,6 +198,27 @@ Delete the custom `test/Test.qunit.html` file from your test directory. This fil Depending on your project setup, you might need to update additional paths in configuration files or test runners to reflect the new structure. The test suite is now served under the standard `/test-resources/` path with the component's full namespace (e.g. `/test-resources/sap/ui/demo/todo/testsuite.qunit.html`). +## Removal of Standard Server Middleware + +The following middleware has been removed from the [standard middlewares list](../pages/Server.md#standard-middleware): + +* `serveThemes` — Theme compilation (LESS to CSS) is now handled by the `buildThemes` build task during the incremental build, rather than on-demand during runtime. The resulting CSS files are served via the `serveResources` middleware. This change improves performance through build-time compilation and caching while maintaining the same functionality. + +**Backward Compatibility:** +If your project or any custom middleware references a removed middleware via `beforeMiddleware` or `afterMiddleware`, UI5 CLI will automatically remap the reference to the nearest remaining middleware and log a deprecation warning. Your custom middleware will still be executed in the expected order. + +**What Changed:** +- Theme CSS files (`library.css`, `library-RTL.css`, etc.) are now **pre-built** during the incremental build +- Files are served via `serveResources` instead of being compiled on-demand +- The same CSS files are available at the same URLs as before + +**Recommended Action:** +Update your `ui5.yaml` configuration to reference an existing middleware instead. + +| Removed Middleware | Replacement Behavior | Recommended `afterMiddleware` | +| ------------------ | -------------------- | ----------------------------- | +| `serveThemes` | CSS files pre-built by `buildThemes` task and served via `serveResources` | `testRunner` | + ## Learn More - [Project: Type `component`](../pages/Project#component) From 32d0532b8a0c4af1dc4259eb6e3f1a36d825a092 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Mon, 27 Apr 2026 15:46:40 +0300 Subject: [PATCH 13/16] test: Stabilize tests for serving css Co-authored-by: Copilot --- packages/server/test/lib/server/main.js | 119 +++++++++++++++++++++++- 1 file changed, 117 insertions(+), 2 deletions(-) diff --git a/packages/server/test/lib/server/main.js b/packages/server/test/lib/server/main.js index 9cca96cf6a1..5423a679c0f 100644 --- a/packages/server/test/lib/server/main.js +++ b/packages/server/test/lib/server/main.js @@ -12,6 +12,12 @@ test.before(async (t) => { cwd: "./test/fixtures/application.a" }); + // Wrap graph.serve to enable CSS Variables for theme tests + const originalServe = graph.serve.bind(graph); + graph.serve = function(options) { + return originalServe({...options, cssVariables: true}); + }; + server = await serve(graph, { port: 3333 }); @@ -124,11 +130,19 @@ test("Get app_pages from discovery middleware (/discovery/app_pages)", async (t) throw new Error(res.error); } t.is(res.statusCode, 200, "Correct HTTP status code"); + // Note: With BuildServer/incremental build, additional resources are discovered + // including those under /resources/id1/ namespace t.deepEqual(res.body, { "app_pages": [ { "entry": "index.html" }, + { + "entry": "resources/id1/index.html" + }, + { + "entry": "resources/id1/versionTest.html" + }, { "entry": "versionTest.html" } @@ -250,6 +264,107 @@ test("Get sap-ui-version.json from versionInfo middleware (/resources/sap-ui-ver }, "Correct response"); }); +test("Get library.css (built by buildThemes task) (/resources/library/a/themes/base/library.css)", async (t) => { + const res = await request.get("/resources/library/a/themes/base/library.css"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /css/, "Correct content type"); + // CSS is minified by default in buildThemes task + t.is(res.text, `.library-a-foo{color:#fafad2;padding:1px 2px 3px 4px} +/* Inline theming parameters */ +#sap-ui-theme-library\\.a{background-image:url('data:text/plain;utf-8,%7B%22libraryAColor1%22%3A%22%23fafad2%22%7D')} +`, "Correct response"); +}); + +test("Get library-RTL.css (built by buildThemes task) (/resources/library/a/themes/base/library-RTL.css)", async (t) => { + const res = await request.get( + "/resources/library/a/themes/base/library-RTL.css", + ); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /css/, "Correct content type"); + // CSS is minified by default in buildThemes task + t.is( + res.text, + `.library-a-foo{color:#fafad2;padding:1px 4px 3px 2px} +/* Inline theming parameters */ +#sap-ui-theme-library\\.a{background-image:url('data:text/plain;utf-8,%7B%22libraryAColor1%22%3A%22%23fafad2%22%7D')} +`, + "Correct response", + ); +}); + +test("Get library-parameters.json (built by buildThemes task) (/resources/library/a/themes/base/library-parameters.json)", + async (t) => { + const res = await request.get("/resources/library/a/themes/base/library-parameters.json"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /json/, "Correct content type"); + t.deepEqual(res.body, { + libraryAColor1: "#fafad2" + }, "Correct response"); + }); + +test("Get css_variables.source.less (built by buildThemes task) (/resources/library/a/themes/base/css_variables.source.less)", + async (t) => { + const res = await request.get("/resources/library/a/themes/base/css_variables.source.less"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /less/, "Correct content type"); + t.is(res.text, `@libraryAColor1: #fafad2; + +:root { +--libraryAColor1: @libraryAColor1; +} +`, "Correct response"); + }); + +test("Get css_variables.css (built by buildThemes task) (/resources/library/a/themes/base/css_variables.css)", async (t) => { + const res = await request.get("/resources/library/a/themes/base/css_variables.css"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /css/, "Correct content type"); + // CSS is minified by default in buildThemes task + t.is(res.text, `:root{--libraryAColor1:#fafad2} +/* Inline theming parameters */ +#sap-ui-theme-library\\.a{background-image:url('data:text/plain;utf-8,%7B%22libraryAColor1%22%3A%22%23fafad2%22%7D')} +`, "Correct response"); +}); + +test("Get library_skeleton.css (built by buildThemes task) (/resources/library/a/themes/base/library_skeleton.css)", + async (t) => { + const res = await request.get("/resources/library/a/themes/base/library_skeleton.css"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /css/, "Correct content type"); + // CSS is minified by default in buildThemes task + t.is(res.text, `.library-a-foo{color:var(--libraryAColor1);padding:1px 2px 3px 4px}`, "Correct response"); + }); + +test("Get library_skeleton-RTL.css (built by buildThemes task) (/resources/library/a/themes/base/library_skeleton-RTL.css)", + async (t) => { + const res = await request.get("/resources/library/a/themes/base/library_skeleton-RTL.css"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /css/, "Correct content type"); + // CSS is minified by default in buildThemes task + t.is(res.text, `.library-a-foo{color:var(--libraryAColor1);padding:1px 4px 3px 2px}`, "Correct response"); + }); + test("Stop server", async (t) => { const port = 3350; const request = supertest(`http://localhost:${port}`); @@ -262,7 +377,7 @@ test("Stop server", async (t) => { port: port }); - const res = await request.get("/resources/library/a/themes/base/library-parameters.json"); + const res = await request.get("/resources/library/a/.library"); if (res.error) { throw new Error(res.error); @@ -281,7 +396,7 @@ test("Stop server", async (t) => { }); try { - await request.get("/resources/library/a/themes/base/library-parameters.json"); + await request.get("/resources/library/a/.library"); t.fail("Server was not closed!"); } catch { t.pass("Server was closed properly."); From efef5cfd9a4db954607dad684b10efb165b97c09 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Tue, 28 Apr 2026 13:30:41 +0300 Subject: [PATCH 14/16] test: Revert some test changes --- packages/server/test/lib/server/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/test/lib/server/main.js b/packages/server/test/lib/server/main.js index 5423a679c0f..a22b4503036 100644 --- a/packages/server/test/lib/server/main.js +++ b/packages/server/test/lib/server/main.js @@ -377,7 +377,7 @@ test("Stop server", async (t) => { port: port }); - const res = await request.get("/resources/library/a/.library"); + const res = await request.get("/resources/library/a/themes/base/library-parameters.json"); if (res.error) { throw new Error(res.error); @@ -396,7 +396,7 @@ test("Stop server", async (t) => { }); try { - await request.get("/resources/library/a/.library"); + await request.get("/resources/library/a/themes/base/library-parameters.json"); t.fail("Server was not closed!"); } catch { t.pass("Server was closed properly."); From 09a4670df7016353317846f69d32574d6d98791e Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Thu, 30 Apr 2026 17:51:24 +0300 Subject: [PATCH 15/16] fix: lint errors in test/lib/server/main.js Break long test names to multiple lines to meet max-len 120 limit --- packages/server/test/lib/server/main.js | 105 +++++++++++++----------- 1 file changed, 58 insertions(+), 47 deletions(-) diff --git a/packages/server/test/lib/server/main.js b/packages/server/test/lib/server/main.js index a22b4503036..acba0d1b91a 100644 --- a/packages/server/test/lib/server/main.js +++ b/packages/server/test/lib/server/main.js @@ -278,7 +278,8 @@ test("Get library.css (built by buildThemes task) (/resources/library/a/themes/b `, "Correct response"); }); -test("Get library-RTL.css (built by buildThemes task) (/resources/library/a/themes/base/library-RTL.css)", async (t) => { +test("Get library-RTL.css (built by buildThemes task) " + + "(/resources/library/a/themes/base/library-RTL.css)", async (t) => { const res = await request.get( "/resources/library/a/themes/base/library-RTL.css", ); @@ -298,37 +299,43 @@ test("Get library-RTL.css (built by buildThemes task) (/resources/library/a/them ); }); -test("Get library-parameters.json (built by buildThemes task) (/resources/library/a/themes/base/library-parameters.json)", - async (t) => { - const res = await request.get("/resources/library/a/themes/base/library-parameters.json"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /json/, "Correct content type"); - t.deepEqual(res.body, { - libraryAColor1: "#fafad2" - }, "Correct response"); - }); +test("Get library-parameters.json (built by buildThemes task) " + + "(/resources/library/a/themes/base/library-parameters.json)", +async (t) => { + const res = await request.get( + "/resources/library/a/themes/base/library-parameters.json"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /json/, "Correct content type"); + t.deepEqual(res.body, { + libraryAColor1: "#fafad2" + }, "Correct response"); +}); -test("Get css_variables.source.less (built by buildThemes task) (/resources/library/a/themes/base/css_variables.source.less)", - async (t) => { - const res = await request.get("/resources/library/a/themes/base/css_variables.source.less"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /less/, "Correct content type"); - t.is(res.text, `@libraryAColor1: #fafad2; +test("Get css_variables.source.less (built by buildThemes task) " + + "(/resources/library/a/themes/base/css_variables.source.less)", +async (t) => { + const res = await request.get( + "/resources/library/a/themes/base/css_variables.source.less"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /less/, "Correct content type"); + t.is(res.text, `@libraryAColor1: #fafad2; :root { --libraryAColor1: @libraryAColor1; } `, "Correct response"); - }); +}); -test("Get css_variables.css (built by buildThemes task) (/resources/library/a/themes/base/css_variables.css)", async (t) => { - const res = await request.get("/resources/library/a/themes/base/css_variables.css"); +test("Get css_variables.css (built by buildThemes task) " + + "(/resources/library/a/themes/base/css_variables.css)", async (t) => { + const res = await request.get( + "/resources/library/a/themes/base/css_variables.css"); if (res.error) { throw new Error(res.error); } @@ -341,29 +348,33 @@ test("Get css_variables.css (built by buildThemes task) (/resources/library/a/th `, "Correct response"); }); -test("Get library_skeleton.css (built by buildThemes task) (/resources/library/a/themes/base/library_skeleton.css)", - async (t) => { - const res = await request.get("/resources/library/a/themes/base/library_skeleton.css"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /css/, "Correct content type"); - // CSS is minified by default in buildThemes task - t.is(res.text, `.library-a-foo{color:var(--libraryAColor1);padding:1px 2px 3px 4px}`, "Correct response"); - }); +test("Get library_skeleton.css (built by buildThemes task) " + + "(/resources/library/a/themes/base/library_skeleton.css)", +async (t) => { + const res = await request.get( + "/resources/library/a/themes/base/library_skeleton.css"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /css/, "Correct content type"); + // CSS is minified by default in buildThemes task + t.is(res.text, `.library-a-foo{color:var(--libraryAColor1);padding:1px 2px 3px 4px}`, "Correct response"); +}); -test("Get library_skeleton-RTL.css (built by buildThemes task) (/resources/library/a/themes/base/library_skeleton-RTL.css)", - async (t) => { - const res = await request.get("/resources/library/a/themes/base/library_skeleton-RTL.css"); - if (res.error) { - throw new Error(res.error); - } - t.is(res.statusCode, 200, "Correct HTTP status code"); - t.regex(res.headers["content-type"], /css/, "Correct content type"); - // CSS is minified by default in buildThemes task - t.is(res.text, `.library-a-foo{color:var(--libraryAColor1);padding:1px 4px 3px 2px}`, "Correct response"); - }); +test("Get library_skeleton-RTL.css (built by buildThemes task) " + + "(/resources/library/a/themes/base/library_skeleton-RTL.css)", +async (t) => { + const res = await request.get( + "/resources/library/a/themes/base/library_skeleton-RTL.css"); + if (res.error) { + throw new Error(res.error); + } + t.is(res.statusCode, 200, "Correct HTTP status code"); + t.regex(res.headers["content-type"], /css/, "Correct content type"); + // CSS is minified by default in buildThemes task + t.is(res.text, `.library-a-foo{color:var(--libraryAColor1);padding:1px 4px 3px 2px}`, "Correct response"); +}); test("Stop server", async (t) => { const port = 3350; From 42fbf1a6cc3b2ea8b1d732aa3e24294d1b187d11 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Thu, 30 Apr 2026 18:02:29 +0300 Subject: [PATCH 16/16] chore: revert unrelated changes from rebase - Remove cacache dependency from packages/project/package.json - Restore internal/e2e-tests/ files that were incorrectly deleted - Update package-lock.json to match base branch --- internal/e2e-tests/README.md | 34 + .../application.a.ts/package-lock.json | 2348 +++++++++++++++++ .../fixtures/application.a.ts/package.json | 10 + .../fixtures/application.a.ts/tsconfig.json | 21 + .../ui5-tooling-transpile.yaml | 20 + .../application.a.ts/webapp/manifest.json | 66 + .../fixtures/application.a/package.json | 15 + .../application.a/ui5-task-zipper.yaml | 10 + .../application.a/ui5-tooling-modules.yaml | 12 + .../ui5-tooling-stringreplace.yaml | 14 + .../webapp/controller/Test.controller.js | 16 + .../application.a/webapp/manifest.json | 66 + internal/e2e-tests/package.json | 19 + internal/e2e-tests/test/build.js | 201 ++ package-lock.json | 34 +- packages/project/package.json | 1 - 16 files changed, 2885 insertions(+), 2 deletions(-) create mode 100644 internal/e2e-tests/README.md create mode 100644 internal/e2e-tests/fixtures/application.a.ts/package-lock.json create mode 100644 internal/e2e-tests/fixtures/application.a.ts/package.json create mode 100644 internal/e2e-tests/fixtures/application.a.ts/tsconfig.json create mode 100644 internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile.yaml create mode 100644 internal/e2e-tests/fixtures/application.a.ts/webapp/manifest.json create mode 100644 internal/e2e-tests/fixtures/application.a/package.json create mode 100644 internal/e2e-tests/fixtures/application.a/ui5-task-zipper.yaml create mode 100644 internal/e2e-tests/fixtures/application.a/ui5-tooling-modules.yaml create mode 100644 internal/e2e-tests/fixtures/application.a/ui5-tooling-stringreplace.yaml create mode 100644 internal/e2e-tests/fixtures/application.a/webapp/controller/Test.controller.js create mode 100644 internal/e2e-tests/fixtures/application.a/webapp/manifest.json create mode 100644 internal/e2e-tests/package.json create mode 100644 internal/e2e-tests/test/build.js diff --git a/internal/e2e-tests/README.md b/internal/e2e-tests/README.md new file mode 100644 index 00000000000..7d99ace3cff --- /dev/null +++ b/internal/e2e-tests/README.md @@ -0,0 +1,34 @@ +# E2E Tests for UI5 CLI + +End-to-end test environment for the UI5 CLI containing realistic user scenarios. + +## Usage + +```bash +npm install +npm run unit +``` + +## How It Works + +Tests are run with the **Node.js built-in test runner**. Each test: + +1. Copies a fixture project to a temporary directory (`./tmp`) +2. Runs `npm install` there (child process) +3. Runs `ui5 build` with varying configurations (child process) + +The UI5 CLI executables are sourced directly from this repository at `packages/cli/bin/ui5.cjs`. + +Some scenarios include multiple sequential builds with file modifications in between to simulate real-world development workflows. Node modules are getting installed on the fly for the first build and reused for subsequent builds (no reinstall). + + + + +## Fixtures + +Located under `./fixtures/`: + +| Fixture | Description | +|---|---| +| `application.a` | Sample JavaScript project (controller + `manifest.json`) | +| `application.a.ts` | Sample TypeScript project (based on [generator-ui5-ts-app](https://github.com/ui5-community/generator-ui5-ts-app)) | diff --git a/internal/e2e-tests/fixtures/application.a.ts/package-lock.json b/internal/e2e-tests/fixtures/application.a.ts/package-lock.json new file mode 100644 index 00000000000..8ee2970176d --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a.ts/package-lock.json @@ -0,0 +1,2348 @@ +{ + "name": "@ui5-internal/application.a.ts", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@ui5-internal/application.a.ts", + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "@openui5/types": "^1.115.1", + "ui5-tooling-transpile": "^3.11.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "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", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "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", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "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-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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", + "@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-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/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "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==", + "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", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@openui5/types": { + "version": "1.147.1", + "resolved": "https://registry.npmjs.org/@openui5/types/-/types-1.147.1.tgz", + "integrity": "sha512-f6OffWT9Wxv8VWOczP4cP9hCtfaQHEUGpnW0cXgXp1n6sq5LpKmmeLgwoKNAsjPzmLkCHoZizFHA0z7l2DWGaQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/jquery": "3.5.13", + "@types/qunit": "2.5.4" + } + }, + "node_modules/@types/jquery": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.13.tgz", + "integrity": "sha512-ZxJrup8nz/ZxcU0vantG+TPdboMhB24jad2uSap50zE7Q9rUeYlCF25kFMSmHR33qoeOgqcdHEp3roaookC0Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/qunit": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@types/qunit/-/qunit-2.5.4.tgz", + "integrity": "sha512-VHi2lEd4/zp8OOouf43JXGJJ5ZxHvdLL1dU0Yakp6Iy73SjpuXl7yjwAwmh1qhTv8krDgHteSwaySr++uXX9YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz", + "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-async-to-promises": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.18.tgz", + "integrity": "sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-plugin-transform-modules-ui5": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-modules-ui5/-/babel-plugin-transform-modules-ui5-7.8.1.tgz", + "integrity": "sha512-rp8TrQkPjKNOSsRyyH+VMqsTs9yZzslgMvF4x3cAM6pwGcdycolMQJ0RO2EGbOhN2eDeiN6ShN72UozZnk191g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-flatten": "^3.0.0", + "doctrine": "^3.0.0", + "ignore-case": "^0.1.0", + "object-assign-defined": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/babel-plugin-transform-remove-console": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", + "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-preset-transform-ui5": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/babel-preset-transform-ui5/-/babel-preset-transform-ui5-7.8.1.tgz", + "integrity": "sha512-OF7e2ahVE/pYT9B/lX/XdewZI52kdzYnCjGdorsLLX1xq8cKeUmC9pQuQCb/su1M6HLmT2OyFCk1DEeiOikuAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-transform-modules-ui5": "^7.8.1" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz", + "integrity": "sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/comment-json": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz", + "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/electron-to-chromium": { + "version": "1.5.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", + "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "dev": true, + "license": "ISC" + }, + "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", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore-case": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ignore-case/-/ignore-case-0.1.0.tgz", + "integrity": "sha512-tQS9ucNf134w040JaMWzQ0WXfDR8Vdelk8E6ITviSzE6cOY2K12kNU04lLa8yy9WtcRrKWh3sdv0Xn8uLbMjUA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign-defined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object-assign-defined/-/object-assign-defined-1.2.0.tgz", + "integrity": "sha512-9hzHOUnV8YoBsLB07KhqehUWdeUUW8nyP1j0kPluxXWpoXD6NNyiJNRa3YES0Ds32z+mZtUL/Wqbj+CCLDXJgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/resolve": { + "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" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ui5-tooling-transpile": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/ui5-tooling-transpile/-/ui5-tooling-transpile-3.11.0.tgz", + "integrity": "sha512-cy9STzBVNzqZebDV9pQR3vifSkk3ZULTDxovAlXm8VSOgD5rvdW91ESg/zKMHr8pI6zmTwRAoQZrIILf2nr09A==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/preset-env": "^7.29.0", + "@babel/preset-typescript": "^7.28.5", + "babel-plugin-transform-async-to-promises": "^0.8.18", + "babel-plugin-transform-remove-console": "^6.9.4", + "babel-preset-transform-ui5": "^7.8.1", + "browserslist": "^4.28.1", + "comment-json": "^4.6.2", + "js-yaml": "^4.1.1" + }, + "peerDependencies": { + "@ui5/ts-interface-generator": ">=0.8.0" + }, + "peerDependenciesMeta": { + "@ui5/ts-interface-generator": { + "optional": true + } + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/internal/e2e-tests/fixtures/application.a.ts/package.json b/internal/e2e-tests/fixtures/application.a.ts/package.json new file mode 100644 index 00000000000..59f1b0407b5 --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a.ts/package.json @@ -0,0 +1,10 @@ +{ + "name": "@ui5-internal/application.a.ts", + "version": "1.0.0", + "description": "UI5 Application: application.a.ts", + "license": "Apache-2.0", + "devDependencies": { + "@openui5/types": "^1.115.1", + "ui5-tooling-transpile": "^3.11.0" + } +} diff --git a/internal/e2e-tests/fixtures/application.a.ts/tsconfig.json b/internal/e2e-tests/fixtures/application.a.ts/tsconfig.json new file mode 100644 index 00000000000..76f47447feb --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a.ts/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "es2022", + "module": "es2022", + "moduleResolution": "node", + "skipLibCheck": true, + "allowJs": true, + "strict": true, + "strictNullChecks": false, + "strictPropertyInitialization": false, + "rootDir": "./webapp", + "types": ["@openui5/types", "@types/qunit"], + "paths": { + "application/a/ts/*": ["./webapp/*"], + "unit/*": ["./webapp/test/unit/*"], + "integration/*": ["./webapp/test/integration/*"] + } + }, + "include": ["./webapp/**/*"], + "exclude": ["./webapp/coverage/**/*"] +} diff --git a/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile.yaml b/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile.yaml new file mode 100644 index 00000000000..56ae28a5d56 --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a.ts/ui5-tooling-transpile.yaml @@ -0,0 +1,20 @@ +specVersion: "5.0" +metadata: + name: application.a.ts +type: application +framework: + name: OpenUI5 + version: "1.115.1" + libraries: + - name: sap.m + - name: sap.ui.core + - name: sap.ui.layout + - name: themelib_sap_horizon +builder: + customTasks: + - name: ui5-tooling-transpile-task + afterTask: replaceVersion +server: + customMiddleware: + - name: ui5-tooling-transpile-middleware + afterMiddleware: compression diff --git a/internal/e2e-tests/fixtures/application.a.ts/webapp/manifest.json b/internal/e2e-tests/fixtures/application.a.ts/webapp/manifest.json new file mode 100644 index 00000000000..ae5be89bac7 --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a.ts/webapp/manifest.json @@ -0,0 +1,66 @@ +{ + "_version": "1.12.0", + "sap.app": { + "id": "application.a.ts", + "type": "application", + "i18n": "i18n/i18n.properties", + "title": "{{appTitle}}", + "description": "{{appDescription}}", + "applicationVersion": { + "version": "1.0.0" + } + }, + "sap.ui": { + "technology": "UI5", + "icons": {}, + "deviceTypes": { + "desktop": true, + "tablet": true, + "phone": true + } + }, + "sap.ui5": { + "rootView": { + "viewName": "application.a.ts.view.App", + "type": "XML", + "async": true, + "id": "app" + }, + "handleValidation": true, + "contentDensities": { + "compact": true, + "cozy": true + }, + "models": { + "i18n": { + "type": "sap.ui.model.resource.ResourceModel", + "settings": { + "bundleName": "application.a.ts.i18n.i18n" + } + } + }, + "routing": { + "config": { + "routerClass": "sap.m.routing.Router", + "viewType": "XML", + "viewPath": "application.a.ts.view", + "controlId": "app", + "controlAggregation": "pages", + "async": true + }, + "routes": [ + { + "pattern": "", + "name": "main", + "target": "main" + } + ], + "targets": { + "main": { + "viewId": "main", + "viewName": "Main" + } + } + } + } +} diff --git a/internal/e2e-tests/fixtures/application.a/package.json b/internal/e2e-tests/fixtures/application.a/package.json new file mode 100644 index 00000000000..209707ddf0f --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a/package.json @@ -0,0 +1,15 @@ +{ + "name": "@ui5-internal/application.a", + "version": "1.0.0", + "description": "UI5 Application: application.a", + "license": "Apache-2.0", + "dependencies": { + "chart.js": "4.5.1" + }, + "devDependencies": { + "@openui5/types": "^1.115.1", + "ui5-task-zipper": "^3.6.0", + "ui5-tooling-modules": "^3.35.0", + "ui5-tooling-stringreplace": "^3.6.0" + } +} diff --git a/internal/e2e-tests/fixtures/application.a/ui5-task-zipper.yaml b/internal/e2e-tests/fixtures/application.a/ui5-task-zipper.yaml new file mode 100644 index 00000000000..b217eb59ec7 --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a/ui5-task-zipper.yaml @@ -0,0 +1,10 @@ +specVersion: "5.0" +metadata: + name: application.a +type: application +builder: + customTasks: + - name: ui5-task-zipper + afterTask: generateVersionInfo + configuration: + archiveName: "webapp" diff --git a/internal/e2e-tests/fixtures/application.a/ui5-tooling-modules.yaml b/internal/e2e-tests/fixtures/application.a/ui5-tooling-modules.yaml new file mode 100644 index 00000000000..943ea39c81a --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a/ui5-tooling-modules.yaml @@ -0,0 +1,12 @@ +specVersion: "5.0" +metadata: + name: application.a +type: application +server: + customMiddleware: + - name: ui5-tooling-modules-middleware + afterMiddleware: compression +builder: + customTasks: + - name: ui5-tooling-modules-task + afterTask: replaceVersion diff --git a/internal/e2e-tests/fixtures/application.a/ui5-tooling-stringreplace.yaml b/internal/e2e-tests/fixtures/application.a/ui5-tooling-stringreplace.yaml new file mode 100644 index 00000000000..36fad93ceee --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a/ui5-tooling-stringreplace.yaml @@ -0,0 +1,14 @@ +specVersion: "5.0" +metadata: + name: application.a +type: application +builder: + customTasks: + - name: ui5-tooling-stringreplace-task + afterTask: replaceVersion + configuration: + files: + - "**/*.js" + replace: + - placeholder: ${PLACEHOLDER_TEXT} + value: "'INSERTED_TEXT'" diff --git a/internal/e2e-tests/fixtures/application.a/webapp/controller/Test.controller.js b/internal/e2e-tests/fixtures/application.a/webapp/controller/Test.controller.js new file mode 100644 index 00000000000..8b0befdce30 --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a/webapp/controller/Test.controller.js @@ -0,0 +1,16 @@ +sap.ui.define([], () => { + return Controller.extend("application.a.controller.Test",{ + onInit() { + const z = { + first: { + a: 1, + b: 2, + c: 3 + }, + second: "test" + }; + console.log(z.first.a); + } + }); +}); + diff --git a/internal/e2e-tests/fixtures/application.a/webapp/manifest.json b/internal/e2e-tests/fixtures/application.a/webapp/manifest.json new file mode 100644 index 00000000000..58eb693c97f --- /dev/null +++ b/internal/e2e-tests/fixtures/application.a/webapp/manifest.json @@ -0,0 +1,66 @@ +{ + "_version": "1.12.0", + "sap.app": { + "id": "application.a", + "type": "application", + "i18n": "i18n/i18n.properties", + "title": "{{appTitle}}", + "description": "{{appDescription}}", + "applicationVersion": { + "version": "1.0.0" + } + }, + "sap.ui": { + "technology": "UI5", + "icons": {}, + "deviceTypes": { + "desktop": true, + "tablet": true, + "phone": true + } + }, + "sap.ui5": { + "rootView": { + "viewName": "application.a.view.App", + "type": "XML", + "async": true, + "id": "app" + }, + "handleValidation": true, + "contentDensities": { + "compact": true, + "cozy": true + }, + "models": { + "i18n": { + "type": "sap.ui.model.resource.ResourceModel", + "settings": { + "bundleName": "application.a.i18n.i18n" + } + } + }, + "routing": { + "config": { + "routerClass": "sap.m.routing.Router", + "viewType": "XML", + "viewPath": "application.a.view", + "controlId": "app", + "controlAggregation": "pages", + "async": true + }, + "routes": [ + { + "pattern": "", + "name": "main", + "target": "main" + } + ], + "targets": { + "main": { + "viewId": "main", + "viewName": "Main" + } + } + } + } +} diff --git a/internal/e2e-tests/package.json b/internal/e2e-tests/package.json new file mode 100644 index 00000000000..f4d834aff90 --- /dev/null +++ b/internal/e2e-tests/package.json @@ -0,0 +1,19 @@ +{ + "name": "@ui5-internal/e2e-tests", + "private": true, + "license": "Apache-2.0", + "type": "module", + "engines": { + "node": "^22.20.0 || >=24.0.0", + "npm": ">= 8" + }, + "scripts": { + "test": "node --test 'test/**/*.js'", + "test-watch": "node --test --watch 'test/**/*.js'", + "lint": "eslint ." + }, + "dependencies": { + "adm-zip": "^0.5.17", + "execa": "^9.6.0" + } +} diff --git a/internal/e2e-tests/test/build.js b/internal/e2e-tests/test/build.js new file mode 100644 index 00000000000..b999b803f57 --- /dev/null +++ b/internal/e2e-tests/test/build.js @@ -0,0 +1,201 @@ +// Tests for "ui5 build" +// with fixtures (under ../fixtures) +// and by using execa running ui5.cjs under ../../../packages/cli/bin/ui5.cjs. + +import {execa} from "execa"; +import {describe, test} from "node:test"; +import {fileURLToPath} from "node:url"; +import path from "node:path"; +import fs from "node:fs/promises"; +import AdmZip from "adm-zip"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const ui5CliPath = path.resolve(__dirname, "../../../packages/cli/bin/ui5.cjs"); +const ui5 = (args, options = {}) => execa(ui5CliPath, args, options); + +class FixtureHelper { + constructor(fixtureName) { + this.fixtureName = fixtureName; + this.originFixturePath = path.resolve(__dirname, "../fixtures", fixtureName); + this.tmpPath = path.resolve(__dirname, "../tmp", fixtureName); + this.dotUi5Path = path.resolve(this.tmpPath, ".ui5"); + this.distPath = path.resolve(this.tmpPath, "dist"); + } + + async init() { + // Clean up previous runs + await fs.rm(this.tmpPath, {recursive: true, force: true}); + // Copy source files to temp location + await fs.cp(this.originFixturePath, this.tmpPath, {recursive: true}); + // Install node_modules + await this._installNodeModules(); + } + + async build(assert, ui5YamlName) { + const {stdout} = await ui5(["build", "--config", ui5YamlName, "--dest", this.distPath], + {cwd: this.tmpPath, env: {UI5_DATA_DIR: this.dotUi5Path}}); + return stdout; + } + + async _installNodeModules() { + await execa("npm", ["ci"], {cwd: this.tmpPath}); + } +} + +describe("ui5 build", () => { + test("ui5-tooling-transpile", async ({assert}) => { + const fixtureHelper = new FixtureHelper("application.a.ts"); + await fixtureHelper.init(); + const ui5YamlName = "ui5-tooling-transpile.yaml"; + + // #1 Build + await fixtureHelper.build(assert, ui5YamlName); + + // Test: no TS syntax is left in the preload (transpile + preload tasks succeeeded) + const componentPreload = await fs.readFile( + path.resolve(fixtureHelper.distPath, "Component-preload.js"), "utf-8"); + assert.ok(componentPreload.includes("application/a/ts/controller/Base.controller"), + "Component-preload.js should contain the TS resource transpiled to JS"); + assert.ok(!componentPreload.includes("AppComponent"), "Component-preload.js should NOT contain any TS syntax"); + + // -------------------------------------------------------------------------------------------- + + // Modify source files + const fileToModify = path.resolve(fixtureHelper.tmpPath, "webapp/controller/Base.controller.ts"); + const fileContent = await fs.readFile(fileToModify, "utf-8"); + const modifiedContent = fileContent.replace("public getOwnerComponent()", "public getNewOwnerComponent()"); + await fs.writeFile(fileToModify, modifiedContent, "utf-8"); + + // #2 Build + await fixtureHelper.build(assert, ui5YamlName); + + // Test: the modified content is reflected in the new build output (transpile + preload tasks succeeeded) + const newComponentPreload = await fs.readFile( + path.resolve(fixtureHelper.distPath, "Component-preload.js"), "utf-8"); + assert.ok(newComponentPreload.includes("getNewOwnerComponent"), + "Component-preload.js should contain the updated content from the modified source file"); + }); + + test("ui5-task-zipper", async ({assert}) => { + const fixtureHelper = new FixtureHelper("application.a"); + await fixtureHelper.init(); + const ui5YamlName = "ui5-task-zipper.yaml"; + + // #1 Build + await fixtureHelper.build(assert, ui5YamlName); + + // Test: the zip file is created in the dist folder + const zipFilePath = path.resolve(fixtureHelper.distPath, "webapp.zip"); + const zipFileExists = await fs.access(zipFilePath).then(() => true).catch(() => false); + assert.ok(zipFileExists, "The zip file should be created in the dist folder"); + + // Check the archive content + const zip = new AdmZip(zipFilePath); + const zipEntries = zip.getEntries(); + assert.ok(zipEntries.length > 0, "The zip file should contain entries"); + + // Check that the zip file contains the expected source file + const testControllerEntry = zipEntries.find((entry) => entry.entryName === "controller/Test.controller.js"); + assert.ok(testControllerEntry, "The zip file should contain the expected source file"); + + // -------------------------------------------------------------------------------------------- + + // Delete a source file + await fs.rm(path.resolve(fixtureHelper.tmpPath, "webapp/controller/Test.controller.js")); + + // #2 Build + await fixtureHelper.build(assert, ui5YamlName); + + // Test: the zip file is updated and does not contain the deleted file + const newZipFileExists = await fs.access(zipFilePath).then(() => true).catch(() => false); + assert.ok(newZipFileExists, "The zip file should be created in the dist folder after the second build"); + + // Check the archive content + const zip2 = new AdmZip(zipFilePath); + const zipEntries2 = zip2.getEntries(); + assert.ok(zipEntries2.length > 0, "The zip file should contain entries after the second build"); + + // Check that the zip file does NOT contain the expected source file anymore + const deletedTestControllerEntry = zipEntries2.find((entry) => + entry.entryName === "controller/Test.controller.js"); + assert.ok(!deletedTestControllerEntry, "The zip file should NOT contain the deleted source file"); + }); + + test("ui5-tooling-modules", async ({assert}) => { + const fixtureHelper = new FixtureHelper("application.a"); + await fixtureHelper.init(); + const ui5YamlName = "ui5-tooling-modules.yaml"; + + // #1 Build (no thirdparty module yet -> just checking that the build succeeds) + await fixtureHelper.build(assert, ui5YamlName); + + // -------------------------------------------------------------------------------------------- + + // Add a new source file with a third party import + const newControllerPath = path.resolve(fixtureHelper.tmpPath, "webapp/controller/New.controller.js"); + const newControllerContent = +`sap.ui.define(["chart.js"], (chartJS) => { + return Controller.extend("application.a.controller.New",{ + onInit() { + console.log(chartJS); + } + }); +});`; + await fs.writeFile(newControllerPath, newControllerContent, "utf-8"); + + // #2 Build + await fixtureHelper.build(assert, ui5YamlName); + + // Test: the dist contains the new controller and the third party import + const newComponentPreload = await fs.readFile( + path.resolve(fixtureHelper.distPath, "Component-preload.js"), "utf-8"); + assert.ok(newComponentPreload.includes( + "sap.ui.predefine(\"application/a/controller/New.controller\", [\"application/a/thirdparty/chart.js\"]"), + "Component-preload.js should contain the 'New' controller and chart.js"); + // Test: the dist contains the expected third party module + const chartJSModule = await fs.readFile( + path.resolve(fixtureHelper.distPath, "thirdparty/chart.js.js"), "utf-8"); + assert.ok(chartJSModule.includes("Chart"), "The expected third party module should be included in the dist"); + }); + + test("ui5-tooling-stringreplace", async ({assert}) => { + const fixtureHelper = new FixtureHelper("application.a"); + await fixtureHelper.init(); + const ui5YamlName = "ui5-tooling-stringreplace.yaml"; + + // #1 Build (no string replacing yet -> just checking that the build succeeds) + await fixtureHelper.build(assert, ui5YamlName); + + // -------------------------------------------------------------------------------------------- + + + // Add a new source file with a placeholder string + const newControllerPath = path.resolve(fixtureHelper.tmpPath, "webapp/controller/New.controller.js"); + const newControllerContent = +`sap.ui.define([], () => { + return Controller.extend("application.a.controller.New",{ + onInit() { + console.log(\${PLACEHOLDER_TEXT}); + } + }); +});`; + await fs.writeFile(newControllerPath, newControllerContent, "utf-8"); + + // #2 Build + // FIXME: Currently failing here for IB (https://github.com/UI5/cli/pull/1267), April 02 2026 - aa3a2c1c04f7a5cd27650335cde37a798baacf2a + // Error message: + // ("Minification failed with error: Unexpected token punc «{», expected punc «,» + // in file /resources/application/a/controller/New.controller.js (line 4, col 16, pos 114)") + // + // -> Probably, the string replacement doesn't get executed as very first middleware + // (minify happens earlier unexpectedly) + await fixtureHelper.build(assert, ui5YamlName); + + // Test: the placeholder in the source file is replaced in the dist output + const componentPreload = await fs.readFile( + path.resolve(fixtureHelper.distPath, "Component-preload.js"), "utf-8"); + assert.ok(componentPreload.includes("console.log(\"INSERTED_TEXT\")"), + "The placeholder should get replaced with the expected text in the component preload"); + }); +}); diff --git a/package-lock.json b/package-lock.json index c3d291f3cf7..39b760fffd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4273,6 +4273,10 @@ "resolved": "internal/benchmark", "link": true }, + "node_modules/@ui5-internal/e2e-tests": { + "resolved": "internal/e2e-tests", + "link": true + }, "node_modules/@ui5/builder": { "resolved": "packages/builder", "link": true @@ -4630,6 +4634,15 @@ "node": ">=0.4.0" } }, + "node_modules/adm-zip": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "license": "MIT", @@ -4770,6 +4783,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -4781,6 +4796,8 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -5119,6 +5136,8 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", "engines": { "node": ">=8" @@ -5639,6 +5658,8 @@ }, "node_modules/chokidar": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -5661,6 +5682,8 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -9229,6 +9252,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -11085,6 +11110,8 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12931,6 +12958,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -12941,6 +12970,8 @@ }, "node_modules/readdirp/node_modules/picomatch": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -14021,6 +14052,8 @@ }, "node_modules/ssri": { "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" @@ -16089,7 +16122,6 @@ "@ui5/logger": "^5.0.0-alpha.4", "ajv": "^8.18.0", "ajv-errors": "^3.0.0", - "cacache": "^20.0.3", "chalk": "^5.6.2", "chokidar": "^3.6.0", "escape-string-regexp": "^5.0.0", diff --git a/packages/project/package.json b/packages/project/package.json index 6d62804d7cf..b571af7fc37 100644 --- a/packages/project/package.json +++ b/packages/project/package.json @@ -61,7 +61,6 @@ "@ui5/logger": "^5.0.0-alpha.4", "ajv": "^8.18.0", "ajv-errors": "^3.0.0", - "cacache": "^20.0.3", "chalk": "^5.6.2", "chokidar": "^3.6.0", "escape-string-regexp": "^5.0.0",