diff --git a/.github/dependabot.yml b/.github/dependabot.yml index bda23cd..bc8946c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,9 +4,49 @@ updates: directory: / schedule: interval: weekly - # The CAP app's own dependencies live in src/ (@sap/cds, jest, mbt, …); the - # published app lock is regenerated from here, so keep this manifest current. + + # The builder's own dev dependencies (eslint, jest). No ecosystem covered + # this manifest until 2026-08, so nothing here was ever proposed for update + # -- it had drifted a full eslint major behind and carried two high + # advisories that a routine bump cleared. The PR gate (test.yml: lint + + # assemble + the app's jest suite) runs on these, so a bump that breaks the + # build is caught before merge. + - package-ecosystem: npm + directory: / + schedule: + interval: weekly + groups: + builder-dev: + dependency-type: development + + # The CAP app's own dependencies. They live HERE, in src/ -- the published + # app repo is regenerated on every publish, so a dependency bump merged + # over there is reverted by the next nightly (it happened: @cap-js/cds-test + # went to ^1.0.2 in cap2UI5/cap2UI5#67 and came back as ^1.0.1 in the + # publish commit two days later). src/package.json and src/package-lock.json + # are the only place an app dependency update survives. + # + # Grouped deliberately: @sap/* and @cap-js/* move together and a split PR + # per package produces a version skew that fails for reasons unrelated to + # either package. - package-ecosystem: npm directory: /src schedule: interval: weekly + open-pull-requests-limit: 5 + groups: + cap: + patterns: + - "@sap/*" + - "@cap-js/*" + dev-dependencies: + dependency-type: development + ignore: + # openui5-dist pins the UI5 runtime served at /resources in local + # development (the deployed app gets UI5 from the `ui5` destination -- + # scripts/vendor-core.js drops the package from the staged tree). The + # framework's supported-version story is tracked upstream in abap2UI5 + # (floor 1.71), so bumping it is a deliberate decision with a + # compatibility question attached, not a routine dependency update -- + # see the pin policy in builder-abap2UI5-js:AGENTS.md. + - dependency-name: openui5-dist diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bd00c8b..a8ef15f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,8 +20,8 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version-file: src/.nvmrc # the builder's own dev deps (jest for the script tests, eslint) diff --git a/.github/workflows/update_cap.yml b/.github/workflows/update_cap.yml index ab7bb2a..7a7b006 100644 --- a/.github/workflows/update_cap.yml +++ b/.github/workflows/update_cap.yml @@ -36,10 +36,10 @@ jobs: run: runs-on: ubuntu-latest steps: - - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: main - - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: # from src/.nvmrc — the app's own declared runtime, so the nightly # and the published app can never disagree on the Node version diff --git a/AGENTS.md b/AGENTS.md index 9208460..1437646 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -25,7 +25,7 @@ that push starts `update_cap`. | Path | What it is | Hand-edit? | |---|---|---| -| `src/` | hand-written SOURCE of the CAP app: skeleton (`server.js`, `z2ui5-service.*`, `db/`, `mta.yaml`, `xs-security.json`), platform wiring (draft store → CDS entity `cap2ui5.z2ui5_t_01`, app discovery → `srv/app/`), the custom app `srv/app/z2ui5_cl_app_read_odata.js`, app `README.md`, `.devcontainer/`, `AGENTS.md` (published into the app repo) | **yes — app changes go here** | +| `src/` | hand-written SOURCE of the CAP app: skeleton (`server.js`, `z2ui5-service.*`, `db/`, `mta.yaml`, `xs-security.json`), platform wiring (draft store → CDS entity `cap2ui5.z2ui5_t_01`, app discovery → `srv/app/`), the custom app `srv/app/z2ui5_cl_app_read_odata.js`, the production-build step `scripts/vendor-core.js`, app `README.md`, `.devcontainer/`, `AGENTS.md` (published into the app repo) | **yes — app changes go here** | | `run/input/core/` | mirror of builder-abap2UI5-js:`core/` (committed; upstream sha in `run/input/UPSTREAM_COMMIT`) | never — rewritten by `npm run mirror_core` | | `run/output/cap2UI5/` | the assembled app (gitignored staging; `node_modules` preserved across builds) | never | | `scripts/` | `mirror-core.js`, `assemble-cap.js`, `publish-cap.js` | yes | @@ -107,3 +107,43 @@ back to HEAD instead of failing. Keep both properties if you touch it. - Keep the rewrite pairs in `assemble-cap.js` in sync with the dependency paths if you ever move `run/input/core` or the vendored `core/`. - The app's jest suite gates every publish; keep it green. +- A change to the CORE's own dependencies needs a coordinated refresh here: + `mirror_core` does not touch the frozen `"core"` entry in + `src/package-lock.json`, so assemble's drift guard fails the build until + someone runs `npm install` in `src/` in the same change set. That is the + guard working, not a bug — the merged `core/node_modules/*` entries and + the frozen entry have to agree or the app's `npm ci` breaks. Land the + mirror and the refreshed lock together. +- The app carries `openui5-dist` as its own devDependency. The core stopped + declaring it as a runtime dependency (optional peer instead — see + builder-abap2UI5-js:AGENTS.md, "The UI5 runtime pin"), so this is what + keeps `cds watch` serving `/resources` locally. It must stay a + devDependency: production gets UI5 from the `ui5` destination, and the + package is 611 MB of deprecated tooling. +- App dependency updates belong in `src/package.json` + `src/package-lock.json` + and nowhere else. The app repo is regenerated on every publish, so a bump + merged there is reverted by the next nightly — it happened to + `@cap-js/cds-test` (^1.0.2 in cap2UI5/cap2UI5#67, back to ^1.0.1 in the + publish commit two days later), which is why that repo's dependabot now + watches GitHub Actions only. + +## The production build (`npm run build:production`) + +`cds build --production` alone does not produce a startable module. It stages +`gen/srv` with the app's `"abap2UI5": "file:./core"` dependency and never +copies `core/` there, so the deployed module resolved the framework to a +dangling symlink — `npm ci` creates it without checking the target, the +archive builds, `cf deploy` succeeds, and the instance crash-loops on +`Cannot find module 'abap2UI5/engine'`. + +`src/scripts/vendor-core.js` is the second half: it copies the vendored core +into `gen/srv/core` and drops `openui5-dist` (611 MB of deprecated release +tooling, 43 advisories, 3 critical) from the staged tree — the deployed +server never serves `/resources`, xs-app.json routes it to the `ui5` +destination. It bails out of that prune if the core ever declares a +dependency other than `openui5-dist`, since the whole `core/node_modules/` +subtree of the app lock is reachable only from that one package today. + +Gates: `src/test/production-build.test.js` in the app suite (so it runs on +every PR and every publish) and the app repo's `deploy-check.yml`, which +installs the staged module with `npm ci --omit=dev` and requires it. diff --git a/eslint.config.js b/eslint.config.js index 62db8b5..fd04872 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -19,7 +19,7 @@ module.exports = [ }, js.configs.recommended, { - files: ["scripts/**/*.js", "test/**/*.js", "src/srv/**/*.js", "src/test/**/*.js"], + files: ["scripts/**/*.js", "test/**/*.js", "src/scripts/**/*.js", "src/srv/**/*.js", "src/test/**/*.js"], languageOptions: { ecmaVersion: 2023, sourceType: "commonjs", diff --git a/package-lock.json b/package-lock.json index 9aacf32..ec9acf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,9 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { - "@eslint/js": "^9.39.5", - "eslint": "^9.39.5", - "jest": "^30.4.2" + "@eslint/js": "^10.0.1", + "eslint": "^10.9.1", + "jest": "^30.5.0" }, "engines": { "node": ">=22" @@ -74,14 +74,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -204,13 +204,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -474,18 +474,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", + "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", + "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -493,9 +493,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { @@ -590,183 +590,89 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "minimatch": "^10.2.4" }, "engines": { - "node": "*" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0" + "@eslint/core": "^1.2.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", - "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.3.0", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/js": { - "version": "9.39.5", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", - "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@humanfs/core": { @@ -853,6 +759,91 @@ "node": ">=12" } }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -870,6 +861,62 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", @@ -881,17 +928,17 @@ } }, "node_modules/@jest/console": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.4.1.tgz", - "integrity": "sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.5.0.tgz", + "integrity": "sha512-BI1DpOedrJqbrYVi9yNhDWGjqphR/+gsM4STmg2+VaeXm7851hvpBDyKOZGMXATTrGEnFuEseQvLCtrrRmG0GQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.4.1", + "@jest/types": "30.5.0", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", + "jest-message-util": "30.5.0", + "jest-util": "30.5.0", "slash": "^3.0.0" }, "engines": { @@ -899,18 +946,18 @@ } }, "node_modules/@jest/core": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.4.2.tgz", - "integrity": "sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.5.0.tgz", + "integrity": "sha512-DLjRME+NY//j+UDTSfWnjoP0srrdR3DrJRy7yFZktGIwzpN2iVy2vMo0jziZ5c2Ij7bOwlJRXKVWtxZusazOJg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.4.1", - "@jest/pattern": "30.4.0", - "@jest/reporters": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", + "@jest/console": "30.5.0", + "@jest/pattern": "30.5.0", + "@jest/reporters": "30.5.0", + "@jest/test-result": "30.5.0", + "@jest/transform": "30.5.0", + "@jest/types": "30.5.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", @@ -918,20 +965,20 @@ "exit-x": "^0.2.2", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.4.1", - "jest-config": "30.4.2", - "jest-haste-map": "30.4.1", - "jest-message-util": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-resolve-dependencies": "30.4.2", - "jest-runner": "30.4.2", - "jest-runtime": "30.4.2", - "jest-snapshot": "30.4.1", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", - "jest-watcher": "30.4.1", - "pretty-format": "30.4.1", + "jest-changed-files": "30.5.0", + "jest-config": "30.5.0", + "jest-haste-map": "30.5.0", + "jest-message-util": "30.5.0", + "jest-regex-util": "30.5.0", + "jest-resolve": "30.5.0", + "jest-resolve-dependencies": "30.5.0", + "jest-runner": "30.5.0", + "jest-runtime": "30.5.0", + "jest-snapshot": "30.5.0", + "jest-util": "30.5.0", + "jest-validate": "30.5.0", + "jest-watcher": "30.5.0", + "pretty-format": "30.5.0", "slash": "^3.0.0" }, "engines": { @@ -947,9 +994,9 @@ } }, "node_modules/@jest/diff-sequences": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz", - "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.5.0.tgz", + "integrity": "sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==", "dev": true, "license": "MIT", "engines": { @@ -957,70 +1004,70 @@ } }, "node_modules/@jest/environment": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.4.1.tgz", - "integrity": "sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.5.0.tgz", + "integrity": "sha512-HUaqexIauIh69IQ4NTuPDEUCB8g8T4TOPSIzQOS18mwI/KEHKQk1j013K2o6ra031szZE2t5jGmVx3xbzdjgKA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.4.1", - "@jest/types": "30.4.1", + "@jest/fake-timers": "30.5.0", + "@jest/types": "30.5.0", "@types/node": "*", - "jest-mock": "30.4.1" + "jest-mock": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.4.1.tgz", - "integrity": "sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.5.0.tgz", + "integrity": "sha512-jEmgmgJEobJ3zEhDOGp1VAJ6JkoVelpS8uZ1ae1Ul/5lP78UKJKmmU0lciJwd6JdnqOXHaaS/QCKwbf1dHI9MA==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.4.1", - "jest-snapshot": "30.4.1" + "expect": "30.5.0", + "jest-snapshot": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.4.1.tgz", - "integrity": "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.5.0.tgz", + "integrity": "sha512-5j0ztPxSy3McUJihjkDdCyCfjvT2hxykFTWsgEBZKB8qsw9ALdCiGTpTRH5gnf/d+qI4SflYUJ0dWNbzjQCWbA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0" + "@jest/get-type": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.4.1.tgz", - "integrity": "sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.5.0.tgz", + "integrity": "sha512-sg8xIbYwe5GdB/vT3/0qrDIpO7Ov9mazHi++M95uynmDKEZ70G1r169AWct73H07VrTZhrz1SJEfLtjYv8tE3A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.4.1", + "@jest/types": "30.5.0", "@sinonjs/fake-timers": "^15.4.0", "@types/node": "*", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-util": "30.4.1" + "jest-message-util": "30.5.0", + "jest-mock": "30.5.0", + "jest-util": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.5.0.tgz", + "integrity": "sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==", "dev": true, "license": "MIT", "engines": { @@ -1028,62 +1075,78 @@ } }, "node_modules/@jest/globals": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.4.1.tgz", - "integrity": "sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.5.0.tgz", + "integrity": "sha512-h7eJx534czwL8lQMYB0hwLT4/HquO8EX/RtYL7RNUHyUyWWVciYjoudN4Ns5JmNvn2/jh0Vm9UstZjEzJJ5EsQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.4.1", - "@jest/expect": "30.4.1", - "@jest/types": "30.4.1", - "jest-mock": "30.4.1" + "@jest/environment": "30.5.0", + "@jest/expect": "30.5.0", + "@jest/types": "30.5.0", + "jest-mock": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/pattern": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.4.0.tgz", - "integrity": "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.5.0.tgz", + "integrity": "sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "jest-regex-util": "30.4.0" + "jest-regex-util": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@jest/react-is-18": { + "name": "react-is", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/react-is-19": { + "name": "react-is", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/reporters": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.4.1.tgz", - "integrity": "sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.5.0.tgz", + "integrity": "sha512-FEAuusWm+PUOn9ydjaHhpOpyPmS6IbGE04HaKTuUI4zd8eqYZiXiNLoCsdCog/l2XnNj53E9pFy64UltcvfJKg==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", - "@jridgewell/trace-mapping": "^0.3.25", + "@jest/console": "30.5.0", + "@jest/test-result": "30.5.0", + "@jest/transform": "30.5.0", + "@jest/types": "30.5.0", + "@jridgewell/trace-mapping": "^0.3.31", "@types/node": "*", "chalk": "^4.1.2", "collect-v8-coverage": "^1.0.2", "exit-x": "^0.2.2", - "glob": "^10.5.0", + "glob": "^13.0.6", "graceful-fs": "^4.2.11", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", - "jest-worker": "30.4.1", + "jest-message-util": "30.5.0", + "jest-util": "30.5.0", + "jest-worker": "30.5.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -1101,9 +1164,9 @@ } }, "node_modules/@jest/schemas": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz", - "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.5.0.tgz", + "integrity": "sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==", "dev": true, "license": "MIT", "dependencies": { @@ -1114,13 +1177,13 @@ } }, "node_modules/@jest/snapshot-utils": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.4.1.tgz", - "integrity": "sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.5.0.tgz", + "integrity": "sha512-iWQtIsi2dRsO2oWzVceOeynuRJiYTW8gsDVp5wFQ02ipHluQsNgBpasWSHiawVxukIlsGLdCtCSbIEK7fPtpvQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.4.1", + "@jest/types": "30.5.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" @@ -1130,14 +1193,15 @@ } }, "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.5.0.tgz", + "integrity": "sha512-xWpTJP9D0bDFGbPGT8XuWSwwha/iHADyyKzUnMx4UbdgnHugxrDaQFO4RZ8x4ZsFzRP6pNii8uvlgKCDxCIuDg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.31", "callsites": "^3.1.0", + "convert-source-map": "^2.0.0", "graceful-fs": "^4.2.11" }, "engines": { @@ -1145,14 +1209,14 @@ } }, "node_modules/@jest/test-result": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.4.1.tgz", - "integrity": "sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.5.0.tgz", + "integrity": "sha512-9IlPqUzUMkVDmoDqSSrVVLroVotgN3hTUPWPwq24XWXhh1Zpg915RXZ5pgRJ/7j4YE/kng5nqjSn4p3S68SZJA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.4.1", - "@jest/types": "30.4.1", + "@jest/console": "30.5.0", + "@jest/types": "30.5.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -1161,15 +1225,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.4.1.tgz", - "integrity": "sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.5.0.tgz", + "integrity": "sha512-TXlvSDIVv482b83hD8A8WtxDJEmGF47f60W6jRXOQL0Isfs3hKtk4rZIm9R/jLzAibg8+c56y+Q00BQs8R7Xcg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.4.1", + "@jest/test-result": "30.5.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", + "jest-haste-map": "30.5.0", "slash": "^3.0.0" }, "engines": { @@ -1177,23 +1241,23 @@ } }, "node_modules/@jest/transform": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.4.1.tgz", - "integrity": "sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.5.0.tgz", + "integrity": "sha512-n1cYhoByyULEIXi64wbT4Lq91qeT1E6bwpM//sprFXhw955qaiHTdAmy1c1rNFGB6fCf1J+nxDUSf3RGwgZP5A==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.4.1", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", + "@jest/types": "30.5.0", + "@jridgewell/trace-mapping": "^0.3.31", + "babel-plugin-istanbul": "^8.0.0", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-util": "30.4.1", + "jest-haste-map": "30.5.0", + "jest-regex-util": "30.5.0", + "jest-util": "30.5.0", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" @@ -1203,14 +1267,14 @@ } }, "node_modules/@jest/types": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.4.1.tgz", - "integrity": "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.5.0.tgz", + "integrity": "sha512-s1N+79S4Yp9ZgklCauZXi+YPJdCdtStNYQT32stuD6EeQaIBGHoUfyj2P0YWy8RmuQfaJboO+ulxEvEheR/POQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.4.0", - "@jest/schemas": "30.4.1", + "@jest/pattern": "30.5.0", + "@jest/schemas": "30.5.0", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -1254,9 +1318,9 @@ } }, "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==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "dev": true, "license": "MIT" }, @@ -1272,54 +1336,344 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "@tybys/wasm-util": "^0.10.3" }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", - "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">= 10.0.0" }, "funding": { - "url": "https://opencollective.com/pkgr" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@sinclair/typebox": { - "version": "0.34.52", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", - "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", - "dev": true, - "license": "MIT" + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.52", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz", + "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==", + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", @@ -1397,6 +1751,13 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -1439,9 +1800,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", - "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", + "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1473,9 +1834,9 @@ "license": "MIT" }, "node_modules/@ungap/structured-clone": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", - "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", "dev": true, "license": "ISC" }, @@ -1793,9 +2154,9 @@ ] }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -1849,16 +2210,13 @@ } }, "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/ansi-styles": { @@ -1915,16 +2273,16 @@ } }, "node_modules/babel-jest": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.4.1.tgz", - "integrity": "sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.5.0.tgz", + "integrity": "sha512-PrhPHlKC+MsLnuNzgIH/y1dkz1f6cSfKWaQeaG8WxLMuG44dYWQ8E9uRrsBbAGCU/3+BEFYPN4d6G3Zc5Y+waA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.4.1", + "@jest/transform": "30.5.0", "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.4.0", + "babel-plugin-istanbul": "^8.0.0", + "babel-preset-jest": "30.5.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -1937,9 +2295,9 @@ } }, "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-8.0.0.tgz", + "integrity": "sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg==", "dev": true, "license": "BSD-3-Clause", "workspaces": [ @@ -1950,16 +2308,16 @@ "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" + "test-exclude": "^7.0.1" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.4.0.tgz", - "integrity": "sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.5.0.tgz", + "integrity": "sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A==", "dev": true, "license": "MIT", "dependencies": { @@ -1997,33 +2355,36 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.4.0.tgz", - "integrity": "sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.5.0.tgz", + "integrity": "sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.4.0", + "babel-plugin-jest-hoist": "30.5.0", "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1 || ^8.0.0" } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.43", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", - "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2034,19 +2395,22 @@ } }, "node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/browserslist": { - "version": "4.28.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", - "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -2064,11 +2428,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.42", - "caniuse-lite": "^1.0.30001803", - "electron-to-chromium": "^1.5.389", - "node-releases": "^2.0.51", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -2087,13 +2451,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2115,9 +2472,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true, "funding": [ { @@ -2179,9 +2536,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.1.tgz", + "integrity": "sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==", "dev": true, "license": "MIT" }, @@ -2200,95 +2557,32 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" + "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" @@ -2301,13 +2595,6 @@ "dev": true, "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2380,6 +2667,16 @@ "node": ">=0.10.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -2398,9 +2695,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.393", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.393.tgz", - "integrity": "sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==", + "version": "1.5.416", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz", + "integrity": "sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==", "dev": true, "license": "ISC" }, @@ -2418,9 +2715,9 @@ } }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, @@ -2434,6 +2731,13 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT" + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2445,43 +2749,46 @@ } }, "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "9.39.5", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", - "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.1.tgz", + "integrity": "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==", "dev": true, "license": "MIT", + "workspaces": [ + "packages/*" + ], "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.6", - "@eslint/js": "9.39.5", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", - "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -2491,8 +2798,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", + "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -2500,7 +2806,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -2515,134 +2821,50 @@ } }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2732,13 +2954,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, "node_modules/exit-x": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", @@ -2750,18 +2965,18 @@ } }, "node_modules/expect": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.4.1.tgz", - "integrity": "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.5.0.tgz", + "integrity": "sha512-8fiMWcEjPU7B9nErC4FtFcCzf2tC6I75Qf7m8wzBAWC2taZmcno3yAFEjIQL34SwoGZNgPf63UDiJLyh4SMPaw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.4.1", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-util": "30.4.1" + "@jest/expect-utils": "30.5.0", + "@jest/get-type": "30.5.0", + "jest-matcher-utils": "30.5.0", + "jest-message-util": "30.5.0", + "jest-mock": "30.5.0", + "jest-util": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2798,6 +3013,24 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -2812,17 +3045,20 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -2840,9 +3076,9 @@ } }, "node_modules/flatted": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", - "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, @@ -2863,26 +3099,17 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "ISC", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/gensync": { @@ -2929,22 +3156,18 @@ } }, "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2963,19 +3186,6 @@ "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3020,33 +3230,6 @@ "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -3077,25 +3260,6 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3267,16 +3431,16 @@ } }, "node_modules/jest": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.4.2.tgz", - "integrity": "sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.5.0.tgz", + "integrity": "sha512-HeFeOUEKh5gjnp1rjuSCse8Dhj0Y3KA8lsZ3azr4Wnq1nCxwMBu35MDc9mp8iblZxmeAz6wV4P241tyUB7J2Ew==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.4.2", - "@jest/types": "30.4.1", + "@jest/core": "30.5.0", + "@jest/types": "30.5.0", "import-local": "^3.2.0", - "jest-cli": "30.4.2" + "jest-cli": "30.5.0" }, "bin": { "jest": "bin/jest.js" @@ -3294,14 +3458,14 @@ } }, "node_modules/jest-changed-files": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.4.1.tgz", - "integrity": "sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.5.0.tgz", + "integrity": "sha512-dq1x8JiEnHkJDxxOrF6UJDivBRAQMwAa5tzr+VX3um0SfyMFseUPQUbe51wLwggfoa5h/EmOtSpdJxxkzSlNRQ==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.4.1", + "jest-util": "30.5.0", "p-limit": "^3.1.0" }, "engines": { @@ -3309,29 +3473,29 @@ } }, "node_modules/jest-circus": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.4.2.tgz", - "integrity": "sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.5.0.tgz", + "integrity": "sha512-T3v7uM4wwCu+RQicjsAWCgoL3CiyuX3THSKwv2uMb9N2bMUgb+HfwDWEUma85vOGbvQNQ/YfoCXF1OCZot0ZEw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.4.1", - "@jest/expect": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/types": "30.4.1", + "@jest/environment": "30.5.0", + "@jest/expect": "30.5.0", + "@jest/test-result": "30.5.0", + "@jest/types": "30.5.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.4.1", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-runtime": "30.4.2", - "jest-snapshot": "30.4.1", - "jest-util": "30.4.1", + "jest-each": "30.5.0", + "jest-matcher-utils": "30.5.0", + "jest-message-util": "30.5.0", + "jest-runtime": "30.5.0", + "jest-snapshot": "30.5.0", + "jest-util": "30.5.0", "p-limit": "^3.1.0", - "pretty-format": "30.4.1", + "pretty-format": "30.5.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -3341,21 +3505,21 @@ } }, "node_modules/jest-cli": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.4.2.tgz", - "integrity": "sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.5.0.tgz", + "integrity": "sha512-QHZMiy32x2K+NzJ1AuuoCAVc1Y5co0VXib3R7kD9MWcWFflzsD1eJN0wR+mkNlM+ts7C+Bjz0oOoFE5IiHylCg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.4.2", - "@jest/test-result": "30.4.1", - "@jest/types": "30.4.1", + "@jest/core": "30.5.0", + "@jest/test-result": "30.5.0", + "@jest/types": "30.5.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.4.2", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", + "jest-config": "30.5.0", + "jest-util": "30.5.0", + "jest-validate": "30.5.0", "yargs": "^17.7.2" }, "bin": { @@ -3374,33 +3538,33 @@ } }, "node_modules/jest-config": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.4.2.tgz", - "integrity": "sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.5.0.tgz", + "integrity": "sha512-gYQl2FqYgiVpyuB7DutBIbJRWaq5VcHdzOXJJ51HNa8J5JrsZehIlzNFW0/9s5uvvcbzM5/LTUizYSbsFErv+w==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.4.0", - "@jest/test-sequencer": "30.4.1", - "@jest/types": "30.4.1", - "babel-jest": "30.4.1", + "@jest/get-type": "30.5.0", + "@jest/pattern": "30.5.0", + "@jest/test-sequencer": "30.5.0", + "@jest/types": "30.5.0", + "babel-jest": "30.5.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", - "glob": "^10.5.0", + "glob": "^13.0.6", "graceful-fs": "^4.2.11", - "jest-circus": "30.4.2", - "jest-docblock": "30.4.0", - "jest-environment-node": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-runner": "30.4.2", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", + "jest-circus": "30.5.0", + "jest-docblock": "30.5.0", + "jest-environment-node": "30.5.0", + "jest-regex-util": "30.5.0", + "jest-resolve": "30.5.0", + "jest-runner": "30.5.0", + "jest-util": "30.5.0", + "jest-validate": "30.5.0", "parse-json": "^5.2.0", - "pretty-format": "30.4.1", + "pretty-format": "30.5.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3425,25 +3589,25 @@ } }, "node_modules/jest-diff": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", - "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.5.0.tgz", + "integrity": "sha512-QjCfDMwdPFvLxTQmS4/Dswx3PUCiqmSXVLGljMC3SU7YG1qHVoR6b86IH/O2G9k9OMyKXz2vS2Q60VnAozNDwA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.4.0", - "@jest/get-type": "30.1.0", + "@jest/diff-sequences": "30.5.0", + "@jest/get-type": "30.5.0", "chalk": "^4.1.2", - "pretty-format": "30.4.1" + "pretty-format": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-docblock": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.4.0.tgz", - "integrity": "sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.5.0.tgz", + "integrity": "sha512-NwDqcxtoZi33RhuW+zJS/RVA3rmheQ8BnwpYZuc/Eruaz6seQb7+aoCeDZu/3X7W2XmD8DbSo9Pn72DbKsBFYw==", "dev": true, "license": "MIT", "dependencies": { @@ -3454,111 +3618,109 @@ } }, "node_modules/jest-each": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.4.1.tgz", - "integrity": "sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.5.0.tgz", + "integrity": "sha512-NiMFNhRygJEFqYNt8pnkxppUF6CR486GEpt9rSU6lPBf7KeccaOL0zbjxG8fgJgD//6e7zYdssnlt6j+1kI31A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.4.1", + "@jest/get-type": "30.5.0", + "@jest/types": "30.5.0", "chalk": "^4.1.2", - "jest-util": "30.4.1", - "pretty-format": "30.4.1" + "jest-util": "30.5.0", + "pretty-format": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.4.1.tgz", - "integrity": "sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.5.0.tgz", + "integrity": "sha512-bTc79ywKLz0ogbT3JIYuEhgWV4Ffd/cJe06co4v8CyRtlmju8x5gokMlGFR8ARWhmk5SnbDRxmf50XWnlZVhDg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.4.1", - "@jest/fake-timers": "30.4.1", - "@jest/types": "30.4.1", + "@jest/environment": "30.5.0", + "@jest/fake-timers": "30.5.0", + "@jest/types": "30.5.0", "@types/node": "*", - "jest-mock": "30.4.1", - "jest-util": "30.4.1", - "jest-validate": "30.4.1" + "jest-mock": "30.5.0", + "jest-util": "30.5.0", + "jest-validate": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.4.1.tgz", - "integrity": "sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.5.0.tgz", + "integrity": "sha512-0FStogBslBVOEqTOJr4oXMtFitmrWp9WscG6Gbns88i0YAuMXijCT2G5VMfg/HCR4QAnL+OF2C2ednag+HlDuA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.4.1", + "@jest/types": "30.5.0", + "@parcel/watcher": "^2.6.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", + "fdir": "^6.5.0", "graceful-fs": "^4.2.11", - "jest-regex-util": "30.4.0", - "jest-util": "30.4.1", - "jest-worker": "30.4.1", - "picomatch": "^4.0.3", - "walker": "^1.0.8" + "jest-regex-util": "30.5.0", + "jest-util": "30.5.0", + "jest-worker": "30.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" } }, "node_modules/jest-leak-detector": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.4.1.tgz", - "integrity": "sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.5.0.tgz", + "integrity": "sha512-Mq11ceAkNR250Iv45RoOwuG9fb4kYbJ02qoyL7A0nCI8FV5+aG/THmcEUx5uR2dNSa4KOtz+xBKrJ8cZPhPpuQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.4.1" + "@jest/get-type": "30.5.0", + "pretty-format": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.4.1.tgz", - "integrity": "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.5.0.tgz", + "integrity": "sha512-EfaYMC9f9ds7fahB/LYFTgd1Z2RS9Vpm2e46gazij0onkpoQG7Daq+MLm8/gQVqWwRVjL/RNDggbFx9MsrJEmQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", + "@jest/get-type": "30.5.0", "chalk": "^4.1.2", - "jest-diff": "30.4.1", - "pretty-format": "30.4.1" + "jest-diff": "30.5.0", + "pretty-format": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.4.1.tgz", - "integrity": "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.5.0.tgz", + "integrity": "sha512-dBYMhplGfspKaCnVk9TUy1cZnknWubpuPNEputjz0YJk1G/92R45rn45BvbPMPMtC5LVcIdxJGPOaOSQTiuzJw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.4.1", + "@jest/types": "30.5.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-util": "30.4.1", + "jest-util": "30.5.0", "picomatch": "^4.0.3", - "pretty-format": "30.4.1", + "pretty-format": "30.5.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -3567,42 +3729,25 @@ } }, "node_modules/jest-mock": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.4.1.tgz", - "integrity": "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.5.0.tgz", + "integrity": "sha512-bP5MHZpkYrV7xpV+yvhl36DPcXoEmTR57Un5EACcdVpMY7mpkDefCBq+V4mhcjE/3rwUajT6OTrcJTN7EwN1BA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.4.1", + "@jest/expect-utils": "30.5.0", + "@jest/types": "30.5.0", "@types/node": "*", - "jest-util": "30.4.1" + "jest-util": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, "node_modules/jest-regex-util": { - "version": "30.4.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.4.0.tgz", - "integrity": "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.5.0.tgz", + "integrity": "sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==", "dev": true, "license": "MIT", "engines": { @@ -3610,100 +3755,100 @@ } }, "node_modules/jest-resolve": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.4.1.tgz", - "integrity": "sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.5.0.tgz", + "integrity": "sha512-NFvQWJ4G7e2kN5712iG+12Xr325NRFGAIhovrwLfgq5Oqd4bFHITw4CzcFkZGp1GTCqemC4v1l8/yZzedKZkjw==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.4.1", - "jest-validate": "30.4.1", + "jest-haste-map": "30.5.0", + "jest-util": "30.5.0", + "jest-validate": "30.5.0", "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" + "unrs-resolver": "^1.12.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.4.2.tgz", - "integrity": "sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.5.0.tgz", + "integrity": "sha512-TnSBAp3wGOnqXBmLT3OXtJkugw6Vj2KU0IPde2EJmbGns/QMoNlkauJ7jZ8KYaxONSpx0o4pUvi+u1Q/LSk3Pg==", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "30.4.0", - "jest-snapshot": "30.4.1" + "jest-regex-util": "30.5.0", + "jest-snapshot": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.4.2.tgz", - "integrity": "sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.5.0.tgz", + "integrity": "sha512-Q6Yt+1LvXvEstvru6sQLT7OQYC77VNl6dK0KEvBkeOHgThmXDqNp3Ox9TglDWFHU85pemqTNdKwxfnmO3vgrdA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.4.1", - "@jest/environment": "30.4.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", + "@jest/console": "30.5.0", + "@jest/environment": "30.5.0", + "@jest/source-map": "30.5.0", + "@jest/test-result": "30.5.0", + "@jest/transform": "30.5.0", + "@jest/types": "30.5.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-docblock": "30.4.0", - "jest-environment-node": "30.4.1", - "jest-haste-map": "30.4.1", - "jest-leak-detector": "30.4.1", - "jest-message-util": "30.4.1", - "jest-resolve": "30.4.1", - "jest-runtime": "30.4.2", - "jest-util": "30.4.1", - "jest-watcher": "30.4.1", - "jest-worker": "30.4.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "jest-docblock": "30.5.0", + "jest-environment-node": "30.5.0", + "jest-haste-map": "30.5.0", + "jest-leak-detector": "30.5.0", + "jest-message-util": "30.5.0", + "jest-resolve": "30.5.0", + "jest-runtime": "30.5.0", + "jest-util": "30.5.0", + "jest-watcher": "30.5.0", + "jest-worker": "30.5.0", + "p-limit": "^3.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runtime": { - "version": "30.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.4.2.tgz", - "integrity": "sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.5.0.tgz", + "integrity": "sha512-VTRz0sRIw2EISeHigx1O+CMuwoG4+RKJjF8dp8okzFaDNQEcv5Mw0h5QW8VJXgb2CRF4gZIjSEBb2jdzXPagFQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.4.1", - "@jest/fake-timers": "30.4.1", - "@jest/globals": "30.4.1", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", + "@jest/environment": "30.5.0", + "@jest/fake-timers": "30.5.0", + "@jest/globals": "30.5.0", + "@jest/source-map": "30.5.0", + "@jest/test-result": "30.5.0", + "@jest/transform": "30.5.0", + "@jest/types": "30.5.0", "@types/node": "*", "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", + "cjs-module-lexer": "^2.2.0", "collect-v8-coverage": "^1.0.2", - "glob": "^10.5.0", + "es-module-lexer": "^2.1.0", + "glob": "^13.0.6", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.4.1", - "jest-message-util": "30.4.1", - "jest-mock": "30.4.1", - "jest-regex-util": "30.4.0", - "jest-resolve": "30.4.1", - "jest-snapshot": "30.4.1", - "jest-util": "30.4.1", + "jest-haste-map": "30.5.0", + "jest-message-util": "30.5.0", + "jest-mock": "30.5.0", + "jest-regex-util": "30.5.0", + "jest-resolve": "30.5.0", + "jest-snapshot": "30.5.0", + "jest-util": "30.5.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3712,9 +3857,9 @@ } }, "node_modules/jest-snapshot": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.4.1.tgz", - "integrity": "sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.5.0.tgz", + "integrity": "sha512-pZWETdcqmKve9MDTE/AX6RaeAbRhzKhhAXGozAW8Pg2FfOSdUrQ/7D+VdwE3fLQsqjpITXJVQvYVZoMEzrUl0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3723,20 +3868,20 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.4.1", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.4.1", - "@jest/transform": "30.4.1", - "@jest/types": "30.4.1", + "@jest/expect-utils": "30.5.0", + "@jest/get-type": "30.5.0", + "@jest/snapshot-utils": "30.5.0", + "@jest/transform": "30.5.0", + "@jest/types": "30.5.0", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.4.1", + "expect": "30.5.0", "graceful-fs": "^4.2.11", - "jest-diff": "30.4.1", - "jest-matcher-utils": "30.4.1", - "jest-message-util": "30.4.1", - "jest-util": "30.4.1", - "pretty-format": "30.4.1", + "jest-diff": "30.5.0", + "jest-matcher-utils": "30.5.0", + "jest-message-util": "30.5.0", + "jest-util": "30.5.0", + "pretty-format": "30.5.0", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -3758,13 +3903,13 @@ } }, "node_modules/jest-util": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.4.1.tgz", - "integrity": "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.5.0.tgz", + "integrity": "sha512-lzU4aGUWaS+2X/B0CmgheDasfnsVlRfZh/rNQxB9b9s8cSYUq5BcqdQA95ld+KqJXBUVVt1sqnMQ2T3OxIalmg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.4.1", + "@jest/types": "30.5.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -3776,18 +3921,18 @@ } }, "node_modules/jest-validate": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.4.1.tgz", - "integrity": "sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.5.0.tgz", + "integrity": "sha512-N/hsPYKgBSzBeVZ2RHCs3yvBbTZNPX7Be8q33zhyo/yeFneBL1swzly31LYU4LJ3zJM9e8TxSM8IYLo2SDJZYQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.4.1", + "@jest/get-type": "30.5.0", + "@jest/types": "30.5.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.4.1" + "pretty-format": "30.5.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -3807,19 +3952,19 @@ } }, "node_modules/jest-watcher": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.4.1.tgz", - "integrity": "sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.5.0.tgz", + "integrity": "sha512-ujjnEoL4Uu+Swu3WRwYenWMB9JMEiD2T3OypnveMJ64S/1r/5G8eC4OQ1wEOgYWQqMi+mT+buzccflCHr/XJ9Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.4.1", - "@jest/types": "30.4.1", + "@jest/test-result": "30.5.0", + "@jest/types": "30.5.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.4.1", + "jest-util": "30.5.0", "string-length": "^4.0.2" }, "engines": { @@ -3827,15 +3972,15 @@ } }, "node_modules/jest-worker": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.4.1.tgz", - "integrity": "sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.5.0.tgz", + "integrity": "sha512-7kFk/607EoynNHLJa20daivkElM+c9PrCLduYy6AlMkYrXbh5TmVtW1BLXE05Y8baAFsJHMoC3xs2QRRTotwLw==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.4.1", + "jest-util": "30.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -3867,9 +4012,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", - "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", "dev": true, "license": "MIT", "dependencies": { @@ -3976,25 +4121,21 @@ "license": "MIT" }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -4034,16 +4175,6 @@ "node": ">=10" } }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4062,16 +4193,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4117,6 +4248,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4125,9 +4263,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", - "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", "dev": true, "license": "MIT", "engines": { @@ -4157,16 +4295,6 @@ "node": ">=8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -4218,29 +4346,16 @@ } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4263,19 +4378,6 @@ "dev": true, "license": "BlueOak-1.0.0" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -4305,16 +4407,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -4326,28 +4418,31 @@ } }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/picocolors": { "version": "1.1.1", @@ -4357,9 +4452,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -4392,6 +4487,62 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4403,16 +4554,16 @@ } }, "node_modules/pretty-format": { - "version": "30.4.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", - "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==", + "version": "30.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.5.0.tgz", + "integrity": "sha512-mzNzBErpHwM0zpmWS7ExOv62yhQhvd546nUuFqVR0dmnJB59tfrw9sjDF0DJknwsr59OXP0buwJ7PaKguczHSg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.4.1", - "ansi-styles": "^5.2.0", - "react-is-18": "npm:react-is@^18.3.1", - "react-is-19": "npm:react-is@^19.2.5" + "@jest/react-is-18": "npm:react-is@^18.3.1", + "@jest/react-is-19": "npm:react-is@^19.2.5", + "@jest/schemas": "30.5.0", + "ansi-styles": "^5.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -4458,22 +4609,6 @@ ], "license": "MIT" }, - "node_modules/react-is-18": { - "name": "react-is", - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-is-19": { - "name": "react-is", - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", - "dev": true, - "license": "MIT" - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4541,17 +4676,11 @@ } }, "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "ISC" }, "node_modules/slash": { "version": "3.0.0", @@ -4563,27 +4692,6 @@ "node": ">=8" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4604,6 +4712,16 @@ "node": ">=10" } }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -4618,45 +4736,19 @@ "node": ">=10" } }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/string-width-cjs": { @@ -4675,24 +4767,7 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -4705,22 +4780,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", @@ -4735,16 +4794,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -4808,72 +4857,98 @@ } }, "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^10.2.2" }, "engines": { - "node": ">=8" + "node": ">=18" } }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "node_modules/test-exclude/node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.2" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "node_modules/test-exclude/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "ISC" + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/tslib": { "version": "2.8.1", @@ -4965,9 +5040,9 @@ } }, "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==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", "dev": true, "funding": [ { @@ -5020,16 +5095,6 @@ "node": ">=10.12.0" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5057,18 +5122,18 @@ } }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -5093,71 +5158,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/write-file-atomic": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", @@ -5172,6 +5172,19 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -5218,51 +5231,6 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index aab618f..8772c61 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,8 @@ }, "repository": "github:cap2UI5/builder-cap2UI5", "devDependencies": { - "@eslint/js": "^9.39.5", - "eslint": "^9.39.5", - "jest": "^30.4.2" + "@eslint/js": "^10.0.1", + "eslint": "^10.9.1", + "jest": "^30.5.0" } } diff --git a/run/input/UPSTREAM_COMMIT b/run/input/UPSTREAM_COMMIT index cb056f1..77b713a 100644 --- a/run/input/UPSTREAM_COMMIT +++ b/run/input/UPSTREAM_COMMIT @@ -1 +1 @@ -68729ce40fa87bd9addff10267378f3cc3d92c5a +802087b57d3ddb348693cea236344bd5db434793 diff --git a/run/input/core/README.md b/run/input/core/README.md index 84261b2..b0f6686 100644 --- a/run/input/core/README.md +++ b/run/input/core/README.md @@ -29,7 +29,12 @@ by hand. ```jsonc // package.json -{ "dependencies": { "abap2UI5": "..." } } +{ + "dependencies": { "abap2UI5": "..." }, + // OPTIONAL — see "The UI5 runtime" below. Without it the shell bootstraps + // from a CDN and /resources is not served. + "devDependencies": { "openui5-dist": "1.113.0" } +} ``` ```cds @@ -75,6 +80,35 @@ view-builder chain, the engine seam and the CAP entry point. The view builder is the one that pays for itself — a fluent chain with no completion is a guessing game. +## The UI5 runtime is not a dependency of this package + +`openui5-dist` is declared as an **optional peer dependency**, not a +dependency: install it and the server serves the UI5 runtime at `/resources` +(offline-capable local development); leave it out and the framework logs + +``` +[z2ui5] openui5-dist not resolvable — /resources not served; bootstrap from a CDN instead +``` + +once at startup and carries on — the shell then bootstraps UI5 from +`https://sdk.openui5.org`. `engine.ui5_resources_dir()` returns `null` in that +case, and every mount point already guards on it. + +It is optional because it is 611 MB and, being a *distribution* package, its +own dependencies are its release tooling — `npm@6`, `request`, `jsdom`, +`simple-git` — which carry advisories (3 critical at the time of writing) and +run no code this framework ever calls. Nothing here loads it; only the +`/resources` static mount reads files out of it. A deployment that gets UI5 +from a CDN or a platform destination — which is the normal shape on BTP — +should not be paying for that, and until 2026-08 it did. + +The version is a **pin, not a range**: 1.113.0 sits deliberately between +upstream abap2UI5's 1.71 floor and the 1.136+ v2 track, so moving it is a +compatibility decision with a testing story attached, not a routine +dependency bump. Dependabot is configured to leave it alone. If you install +it yourself, matching the pin is what keeps your local `/resources` identical +to what the framework was tested against; npm will warn if you do not. + ## The seam The platform surface is tiny — see [`srv/z2ui5/engine.js`](srv/z2ui5/engine.js): diff --git a/run/input/core/app/z2ui5/webapp/Component.js b/run/input/core/app/z2ui5/webapp/Component.js index 5d823a9..6f98072 100644 --- a/run/input/core/app/z2ui5/webapp/Component.js +++ b/run/input/core/app/z2ui5/webapp/Component.js @@ -52,7 +52,7 @@ sap.ui.define( // "../z2ui5_ccc/"), a sibling of THIS BSP. In the standalone HTTP // service there is no BSP for them to be a sibling of, so the backend // hands the absolute paths over on the global instead - // (z2ui5_cl_http_handler=>_http_get). + // (z2ui5_cl_ui5_http_handler=>_http_get). // // They have to be applied HERE and not in the page: the manifest // registers its own value while the component is being created, which @@ -281,6 +281,8 @@ sap.ui.define( DevTools.exit(); Server.endSession(); + // and drop the module-scoped request state with it - see Server.reset + Server.reset(); // Global state that would outlive the component (FLP keeps the page // alive): cancel any pending backend timer, empty the shortcut diff --git a/run/input/core/app/z2ui5/webapp/cc/Dirty.js b/run/input/core/app/z2ui5/webapp/cc/Dirty.js index 7956ae6..9be677b 100644 --- a/run/input/core/app/z2ui5/webapp/cc/Dirty.js +++ b/run/input/core/app/z2ui5/webapp/cc/Dirty.js @@ -54,6 +54,12 @@ sap.ui.define( launchpad?.Container?.setDirtyFlag && launchpad.ShellUIService; if (hasFlpDirtyFlag) { launchpad.Container.setDirtyFlag(anyDirty); + // the branch is decided PER CALL, and ShellUIService arrives + // asynchronously (Component._initLaunchpad): a setIsDirty(true) + // before it resolved took the else branch and set the unload + // prompt - clear it here, or the FLP user keeps answering a + // "leave page?" dialog for a dirty state that is long gone + syncUnloadPrompt(false); } else { syncUnloadPrompt(anyDirty); } @@ -66,7 +72,7 @@ sap.ui.define( dirtyControls.delete(this); this._applyDirtyState(); }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, }); }, ); diff --git a/run/input/core/app/z2ui5/webapp/cc/Favicon.js b/run/input/core/app/z2ui5/webapp/cc/Favicon.js index c9b97d1..41f2b09 100644 --- a/run/input/core/app/z2ui5/webapp/cc/Favicon.js +++ b/run/input/core/app/z2ui5/webapp/cc/Favicon.js @@ -16,6 +16,11 @@ sap.ui.define(["sap/ui/core/Control", "z2ui5/core/Lib"], (Control, Lib) => { // (updating the tag) is what actually matters. this.setProperty("favicon", val, true); const href = Lib.toText(val); + // same guard as the SET_FAVICON action - see core/actions/Browser.js + if (!Lib.isSafeDownloadURL(href)) { + Lib.logError(`Favicon: refused unsafe URL "${href}"`); + return; + } // Match ANY icon link, not just rel="shortcut icon": a page that // declares the modern rel="icon" (or "icon shortcut") would otherwise // keep its own link and get a second, competing one appended on every @@ -31,6 +36,6 @@ sap.ui.define(["sap/ui/core/Control", "z2ui5/core/Lib"], (Control, Lib) => { link.href = href; document.head.appendChild(link); }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, }); }); diff --git a/run/input/core/app/z2ui5/webapp/cc/FileUploader.js b/run/input/core/app/z2ui5/webapp/cc/FileUploader.js index 79e3ec7..370d738 100644 --- a/run/input/core/app/z2ui5/webapp/cc/FileUploader.js +++ b/run/input/core/app/z2ui5/webapp/cc/FileUploader.js @@ -103,76 +103,93 @@ sap.ui.define( if (this._oHBox) this._oHBox.destroy(); }, - renderer: { - apiVersion: 2, - render(oRm, oControl) { - const directUpload = oControl.getProperty("checkDirectUpload"); - const path = oControl.getProperty("path"); - - // Clean up controls from a previous render pass. - if (oControl._oHBox) oControl._oHBox.destroy(); - oControl._oHBox = null; - oControl.oUploadButton = null; - oControl.oFileUploader = null; - - if (!directUpload) { - oControl.oUploadButton = new Button({ - text: oControl.getProperty("uploadButtonText"), - enabled: path !== "", - press: () => { - oControl.setProperty( - "path", - oControl.oFileUploader.getProperty("value"), - ); - if (oControl._pendingFile) { - oControl._readFile(oControl._pendingFile); - } - }, - }); - } + // Build the inner controls ONCE and update their properties per + // render - the renderer used to create (and destroy) all three on + // every pass, which violates the "renderers stay cheap and free of + // visible side effects" rule (core/Lib.js) and threw away the inner + // file input's selection and focus on every roundtrip that re- + // rendered the view. Create-once is the cc/CameraPicture pattern. + // checkDirectUpload changes the STRUCTURE (upload button yes/no, + // uploadOnChange is init-only on the inner control), so a toggle of + // it is the one case that rebuilds. + _ensureControls(directUpload) { + if (this._oHBox && this._builtDirectUpload === directUpload) return; + if (this._oHBox) this._oHBox.destroy(); + this._builtDirectUpload = directUpload; + this.oUploadButton = null; - oControl.oFileUploader = new FileUploader({ - tooltip: oControl.getProperty("tooltip"), - icon: oControl.getProperty("icon"), - iconOnly: oControl.getProperty("iconOnly"), - buttonOnly: oControl.getProperty("buttonOnly"), - buttonText: oControl.getProperty("buttonText"), - style: oControl.getProperty("style"), - fileType: oControl.getProperty("fileType"), - visible: oControl.getProperty("visible"), - uploadOnChange: directUpload, - multiple: oControl.getProperty("multiple"), - enabled: oControl.getProperty("enabled"), - value: path, - placeholder: oControl.getProperty("placeholder"), - change: (oEvent) => { - // Remember the selected file from the event's public "files" - // parameter (the inner file input is private API). It is - // consumed by the upload button press or, in direct-upload - // mode, by uploadComplete below. - const files = oEvent.getParameter("files"); - oControl._pendingFile = files?.[0]; - if (directUpload) return; - const value = oEvent.getSource().getProperty("value"); - oControl.setProperty("path", value); - if (oControl.oUploadButton) { - oControl.oUploadButton.setEnabled(Boolean(value)); - } - }, - uploadComplete: (oEvent) => { - if (!directUpload) return; - const source = oEvent.getSource(); - oControl.setProperty("path", source.getProperty("value")); - if (oControl._pendingFile) { - oControl._readFile(oControl._pendingFile); + if (!directUpload) { + this.oUploadButton = new Button({ + text: this.getProperty("uploadButtonText"), + enabled: this.getProperty("path") !== "", + press: () => { + this.setProperty("path", this.oFileUploader.getProperty("value")); + if (this._pendingFile) { + this._readFile(this._pendingFile); } }, }); + } - oControl._oHBox = new HBox().addItem(oControl.oFileUploader); - if (oControl.oUploadButton) { - oControl._oHBox.addItem(oControl.oUploadButton); - } + this.oFileUploader = new FileUploader({ + uploadOnChange: directUpload, + change: (oEvent) => { + // Remember the selected file from the event's public "files" + // parameter (the inner file input is private API). It is + // consumed by the upload button press or, in direct-upload + // mode, by uploadComplete below. + const files = oEvent.getParameter("files"); + this._pendingFile = files?.[0]; + if (directUpload) return; + const value = oEvent.getSource().getProperty("value"); + this.setProperty("path", value); + if (this.oUploadButton) { + this.oUploadButton.setEnabled(Boolean(value)); + } + }, + uploadComplete: (oEvent) => { + if (!directUpload) return; + const source = oEvent.getSource(); + this.setProperty("path", source.getProperty("value")); + if (this._pendingFile) { + this._readFile(this._pendingFile); + } + }, + }); + + this._oHBox = new HBox().addItem(this.oFileUploader); + if (this.oUploadButton) { + this._oHBox.addItem(this.oUploadButton); + } + }, + + // Push the current property values into the inner controls - cheap, + // and UI5 only invalidates them when a value actually changed. + _syncControls() { + const u = this.oFileUploader; + u.setTooltip(this.getProperty("tooltip")); + u.setIcon(this.getProperty("icon")); + u.setIconOnly(this.getProperty("iconOnly")); + u.setButtonOnly(this.getProperty("buttonOnly")); + u.setButtonText(this.getProperty("buttonText")); + u.setStyle(this.getProperty("style")); + u.setFileType(this.getProperty("fileType")); + u.setVisible(this.getProperty("visible")); + u.setMultiple(this.getProperty("multiple")); + u.setEnabled(this.getProperty("enabled")); + u.setValue(this.getProperty("path")); + u.setPlaceholder(this.getProperty("placeholder")); + if (this.oUploadButton) { + this.oUploadButton.setText(this.getProperty("uploadButtonText")); + this.oUploadButton.setEnabled(this.getProperty("path") !== ""); + } + }, + + renderer: { + apiVersion: 2, + render(oRm, oControl) { + oControl._ensureControls(oControl.getProperty("checkDirectUpload")); + oControl._syncControls(); oRm.renderControl(oControl._oHBox); }, }, diff --git a/run/input/core/app/z2ui5/webapp/cc/History.js b/run/input/core/app/z2ui5/webapp/cc/History.js index ab522cb..1ea67f4 100644 --- a/run/input/core/app/z2ui5/webapp/cc/History.js +++ b/run/input/core/app/z2ui5/webapp/cc/History.js @@ -20,15 +20,20 @@ sap.ui.define(["sap/ui/core/Control", "z2ui5/core/Lib"], (Control, Lib) => { const search = Lib.toText(val); // Pass the existing state object along instead of null so we do // not clobber state someone else stored on the history entry. + // The HASH is kept: core/Router.js is the hash's only owner, and + // in the FLP the front of it is the SHELL's (#SO-action&/...) - + // rewriting the URL without it stranded the launchpad, and with + // routing active it dropped the #/app// route, so + // Back/Forward/Reload fell back to ?app_start=. history.replaceState( history.state, "", - `${window.location.pathname}${search}`, + `${window.location.pathname}${search}${window.location.hash}`, ); } catch (e) { Lib.logError("History.setSearch: replaceState failed", e); } }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, }); }); diff --git a/run/input/core/app/z2ui5/webapp/cc/Info.js b/run/input/core/app/z2ui5/webapp/cc/Info.js index af72092..911290a 100644 --- a/run/input/core/app/z2ui5/webapp/cc/Info.js +++ b/run/input/core/app/z2ui5/webapp/cc/Info.js @@ -60,6 +60,20 @@ sap.ui.define( }, }, + // One-shot like cc/Geolocation: the pending flag is set ONCE in + // init(), not by the renderer on every render. The renderer version + // re-fired `finished` per render, and an app that answers the event + // with a roundtrip that rebuilds the view closes a loop + // (render -> finished -> roundtrip -> rebuild -> render). The values + // are session-constant, so once is also all the event can ever say. + init() { + this._pendingInfo = true; + }, + + exit() { + this._pendingInfo = false; + }, + // Follows the shared rendering pattern (see core/Lib.js): the renderer // only marks the work, onAfterRendering reads the device info and // fires the event. @@ -113,7 +127,6 @@ sap.ui.define( apiVersion: 2, render(oRm, oControl) { Lib.renderInvisibleSpan(oRm, oControl); - oControl._pendingInfo = true; }, }, }); diff --git a/run/input/core/app/z2ui5/webapp/cc/InputExt.js b/run/input/core/app/z2ui5/webapp/cc/InputExt.js new file mode 100644 index 0000000..d49b18f --- /dev/null +++ b/run/input/core/app/z2ui5/webapp/cc/InputExt.js @@ -0,0 +1,116 @@ +sap.ui.define( + ["sap/m/Input", "sap/m/InputRenderer", "z2ui5/core/Lib"], + (Input, InputRenderer, Lib) => { + "use strict"; + + // A sap.m.Input that carries the HTML `inputmode` of its inner as + // a bindable PROPERTY. It is a sap.m.Input in every other respect: the + // renderer is sap.m.InputRenderer unchanged, and with the property empty + // the control writes nothing at all, so value binding, suggestions, value + // state, events and the rendered DOM are the ones the app already knows. + // + // `inputmode` asks the on-screen keyboard for a layout without changing + // what the field IS - `numeric` gives a digit pad on a field that still + // takes any text, and `none` keeps the soft keyboard DOWN while the field + // goes on taking input, which is what a barcode scanner needs. UI5 has no + // property for it, so the only other way to set it is to write the + // attribute onto the DOM - and every re-render throws that DOM away. Here + // the mode is part of what the control IS: it is written on every + // rendering, so nothing can lose it and no follow-up action has to arrive + // in the right order. + + // The complete inputmode keyword list of the HTML standard. An unknown + // value is refused rather than written, because a browser silently falls + // back to its default for a keyword it does not know - which on screen + // looks exactly like the property having had no effect at all. + const HTML_MODES = new Set([ + "decimal", + "email", + "none", + "numeric", + "search", + "tel", + "text", + "url", + ]); + + return Input.extend("z2ui5.cc.InputExt", { + metadata: { + properties: { + // The HTML inputmode: "none" hides the soft keyboard, "numeric", + // "decimal", "tel", ... restore it with that layout. Empty leaves + // the field exactly as sap.m.Input rendered it - so a BOUND mode can + // switch the behaviour off again without the app having to restore + // anything, and that is the point of the property: "keyboard on/off" + // is a plain model update, with no action travelling at all. + inputMode: { + type: "string", + defaultValue: "", + }, + }, + }, + + // Written WITHOUT invalidating: the mode is one DOM attribute and UI5 + // renders nothing from it, so a bound mode must not cost a re-render of + // the input (and of its suggestion popup) on every toggle. The write + // below reaches the live DOM directly; onAfterRendering covers the case + // where there is no DOM yet. + setInputMode(val) { + this.setProperty("inputMode", val, true); + this._applyInputMode(); + return this; + }, + + onAfterRendering(...args) { + Input.prototype.onAfterRendering.apply(this, args); + // What sap.m.Input rendered on the fresh DOM, remembered per + // rendering. Today it renders no inputmode, so clearing the property + // takes the attribute off; should a release start rendering one, an + // empty property still leaves that release's own field behind rather + // than a field this control stripped an attribute from. + const dom = this.getFocusDomRef(); + this._renderedMode = dom ? dom.getAttribute("inputmode") : null; + this._applyInputMode(); + }, + + // the mode to write, "" when unset; an unknown one is logged once and + // treated as unset + _htmlMode() { + const raw = this.getInputMode(); + if (!raw) return ""; + // HTML compares the attribute case-insensitively and an ABAP caller + // writes `NUMERIC` as readily as `numeric`, so normalize before the + // lookup rather than refuse a value the browser would have taken. + const mode = String(raw).trim().toLowerCase(); + if (HTML_MODES.has(mode)) return mode; + // _applyInputMode runs on every rendering, and a bad mode must not + // fill the log with the same line + if (this._refusedMode !== mode) { + this._refusedMode = mode; + Lib.logError( + `InputExt: inputMode "${raw}" is not an HTML inputmode keyword - ` + + `ignored`, + ); + } + return ""; + }, + + _applyInputMode() { + // the inner , which is what carries the attribute - not the + // control's outer DOM root + const dom = this.getFocusDomRef(); + if (!dom) return; + const mode = this._htmlMode(); + if (mode) { + dom.setAttribute("inputmode", mode); + } else if (this._renderedMode) { + dom.setAttribute("inputmode", this._renderedMode); + } else { + dom.removeAttribute("inputmode"); + } + }, + + renderer: InputRenderer, + }); + }, +); diff --git a/run/input/core/app/z2ui5/webapp/cc/LPTitle.js b/run/input/core/app/z2ui5/webapp/cc/LPTitle.js index dc341b7..70a3a92 100644 --- a/run/input/core/app/z2ui5/webapp/cc/LPTitle.js +++ b/run/input/core/app/z2ui5/webapp/cc/LPTitle.js @@ -50,7 +50,7 @@ sap.ui.define( } }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, }); }, ); diff --git a/run/input/core/app/z2ui5/webapp/cc/MessageManager.js b/run/input/core/app/z2ui5/webapp/cc/MessageManager.js index 932a1c8..8dcbcff 100644 --- a/run/input/core/app/z2ui5/webapp/cc/MessageManager.js +++ b/run/input/core/app/z2ui5/webapp/cc/MessageManager.js @@ -46,11 +46,10 @@ sap.ui.define( // own rows and never touches auto-collected validation messages. this._added = new Map(); this._ready = false; - this._setupBound = this.setup.bind(this); - Lib.registerCallback("onAfterRendering", this._setupBound); + this._unhook = Lib.hookCallback(this, "onAfterRendering", "setup"); }, exit() { - Lib.unregisterCallback("onAfterRendering", this._setupBound); + this._unhook(); // remove this control's own rows from the message model, otherwise a // full view rebuild leaves them behind and re-adds a duplicate set if (this._added.size && this._messaging) { @@ -58,7 +57,7 @@ sap.ui.define( } this._added.clear(); }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, setup() { if (this.getProperty("checkInit")) return; diff --git a/run/input/core/app/z2ui5/webapp/cc/MultiInputExt.js b/run/input/core/app/z2ui5/webapp/cc/MultiInputExt.js index 2dde776..f63ece6 100644 --- a/run/input/core/app/z2ui5/webapp/cc/MultiInputExt.js +++ b/run/input/core/app/z2ui5/webapp/cc/MultiInputExt.js @@ -11,8 +11,11 @@ sap.ui.define( // Invisible companion control for a sap.m.MultiInput (referenced via // MultiInputId): mirrors added/removed tokens into the bindable // addedTokens/removedTokens properties and fires `change` so the - // backend sees every token update. Also installs a validator that - // turns free-text entries into tokens. + // backend sees every token update. Also installs the validator + // MultiInput.addValidator takes: free-text entries always become tokens, + // and a picked suggestion ROW becomes one too once TokenKeyCell / + // TokenTextCells say which cells to build it from (tabular suggestions + // have no default token at all). return Control.extend("z2ui5.cc.MultiInputExt", { metadata: { properties: { @@ -32,6 +35,24 @@ sap.ui.define( removedTokens: { type: "object", }, + // Suggestion-ROW validator (optional). MultiInput.addValidator's + // callback gets `suggestionObject` when the user picked a suggestion + // ROW rather than typing free text, and with tabular suggestions + // there is no default token at all - without a validator, picking a + // row produces nothing. TokenKeyCell names the cell whose text + // becomes the token key; TokenTextCells names the cells composing + // the rest, rendered as `key(a b)` - the demo kit's own shape. + // Both unset: the free-text branch below behaves exactly as before. + TokenKeyCell: { + type: "int", + defaultValue: -1, + }, + // comma-separated cell indices ("2,3"): an XML attribute is a + // string, and a typed int[] cannot be written from a view + TokenTextCells: { + type: "string", + defaultValue: "", + }, }, events: { change: { @@ -42,19 +63,58 @@ sap.ui.define( }, init() { - this._setControlBound = this.setControl.bind(this); - Lib.registerCallback("onAfterRendering", this._setControlBound); + this._unhook = Lib.hookCallback(this, "onAfterRendering", "setControl"); }, exit() { - Lib.unregisterCallback("onAfterRendering", this._setControlBound); + this._unhook(); }, onTokenUpdate(oEvent) { Lib.applyTokenUpdate(this, oEvent); this.fireChange(); }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, + // one suggestion row -> one Token, or null when this instance was not + // configured for rows (which is what MultiInput expects for "no token") + tokenFromRow(row) { + const keyIdx = this.getProperty("TokenKeyCell"); + if (!(keyIdx >= 0)) return null; + const cells = typeof row.getCells === "function" ? row.getCells() : []; + const cellText = (i) => { + const c = cells[i]; + return c && typeof c.getText === "function" ? c.getText() : undefined; + }; + const key = cellText(keyIdx); + if (key === undefined) { + Lib.logError( + `MultiInputExt: TokenKeyCell ${keyIdx} is not a text cell of the picked row`, + ); + return null; + } + const rest = String(this.getProperty("TokenTextCells") || "") + .split(",") + .map((s) => s.trim()) + .filter((s) => s !== "") + .map(Number) + .map((i) => { + const v = cellText(i); + if (v === undefined) { + Lib.logError( + `MultiInputExt: TokenTextCells entry ${i} is not a text cell of the picked row`, + ); + } + return v; + }) + .filter((v) => v !== undefined && v !== ""); + return new Token({ + key, + text: rest.length ? `${key}(${rest.join(" ")})` : key, + }); + }, setControl() { + // Once claimed there is nothing left to do - skip the target lookup + // (byIdOfOwner walks the parent chain on every roundtrip) entirely. + if (this.getProperty("checkInit")) return; const input = ViewSlots.byIdOfOwner( this, this.getProperty("MultiInputId"), @@ -62,9 +122,15 @@ sap.ui.define( if (!Lib.claimOnce(this, input)) return; try { input.attachTokenUpdate(this.onTokenUpdate.bind(this)); - // Custom validator: turn any free-text entry into a Token where - // both key and visible text equal the input string. - input.addValidator(({ text }) => new Token({ key: text, text })); + // Custom validator: a picked suggestion ROW becomes a Token built + // from its cells (only when TokenKeyCell says which one), any + // free-text entry becomes a Token whose key and visible text are + // both the input string. + input.addValidator((args) => { + const row = args && args.suggestionObject; + if (row) return this.tokenFromRow(row); + return new Token({ key: args.text, text: args.text }); + }); } catch (e) { Lib.logError("MultiInputExt.setControl: setup failed", e); } diff --git a/run/input/core/app/z2ui5/webapp/cc/Scrolling.js b/run/input/core/app/z2ui5/webapp/cc/Scrolling.js index af627b6..a63b33c 100644 --- a/run/input/core/app/z2ui5/webapp/cc/Scrolling.js +++ b/run/input/core/app/z2ui5/webapp/cc/Scrolling.js @@ -50,7 +50,11 @@ sap.ui.define( bindingInfo?.parts?.[0]?.path ?? bindingInfo?.path; // Mark changed entries dirty on THIS control's own model - the same // per-model set View1 ships as the delta - not a shared global set. - const changedPaths = this.getModel()?._z2ui5ChangedPaths; + // resolved through the shared tracked-model resolver: in switch + // mode this control's propagated DEFAULT model is the OData one, + // which has no change set - the scroll positions then never + // travelled + const changedPaths = ViewSlots.trackedModel(this)?._z2ui5ChangedPaths; for (const [index, item] of items.entries()) { const scrollTop = this._getScrollTop(item); if (item.V !== scrollTop) { @@ -66,12 +70,15 @@ sap.ui.define( }, init() { - this._setBackendBound = this.setBackend.bind(this); - Lib.registerCallback("onBeforeRoundtrip", this._setBackendBound); + this._unhook = Lib.hookCallback( + this, + "onBeforeRoundtrip", + "setBackend", + ); }, exit() { - Lib.unregisterCallback("onBeforeRoundtrip", this._setBackendBound); + this._unhook(); }, _restoreScrollPosition(item) { diff --git a/run/input/core/app/z2ui5/webapp/cc/SmartMultiInputExt.js b/run/input/core/app/z2ui5/webapp/cc/SmartMultiInputExt.js index 593fe97..950759c 100644 --- a/run/input/core/app/z2ui5/webapp/cc/SmartMultiInputExt.js +++ b/run/input/core/app/z2ui5/webapp/cc/SmartMultiInputExt.js @@ -38,14 +38,13 @@ sap.ui.define( }, init() { - this._setControlBound = this.setControl.bind(this); this._oInput = null; this._aPendingInnerControlsCreated = []; this._bInnerControlsCreated = false; - Lib.registerCallback("onAfterRendering", this._setControlBound); + this._unhook = Lib.hookCallback(this, "onAfterRendering", "setControl"); }, exit() { - Lib.unregisterCallback("onAfterRendering", this._setControlBound); + this._unhook(); // Resolve any still-pending promises so awaiters don't hang. this._aPendingInnerControlsCreated.forEach((resolve) => resolve(null)); this._aPendingInnerControlsCreated = []; @@ -110,8 +109,11 @@ sap.ui.define( Lib.logError("SmartMultiInputExt.setRangeData failed", e); } }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, setControl() { + // Once claimed there is nothing left to do - skip the target lookup + // (byIdOfOwner walks the parent chain on every roundtrip) entirely. + if (this.getProperty("checkInit")) return; const input = ViewSlots.byIdOfOwner( this, this.getProperty("multiInputId"), diff --git a/run/input/core/app/z2ui5/webapp/cc/Title.js b/run/input/core/app/z2ui5/webapp/cc/Title.js index 3469762..099edb4 100644 --- a/run/input/core/app/z2ui5/webapp/cc/Title.js +++ b/run/input/core/app/z2ui5/webapp/cc/Title.js @@ -17,6 +17,6 @@ sap.ui.define(["sap/ui/core/Control", "z2ui5/core/Lib"], (Control, Lib) => { this.setProperty("title", val, true); document.title = Lib.toText(val); }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, }); }); diff --git a/run/input/core/app/z2ui5/webapp/cc/Tree.js b/run/input/core/app/z2ui5/webapp/cc/Tree.js index 5d69577..5fca70b 100644 --- a/run/input/core/app/z2ui5/webapp/cc/Tree.js +++ b/run/input/core/app/z2ui5/webapp/cc/Tree.js @@ -52,12 +52,15 @@ sap.ui.define( }, init() { - this._setBackendBound = this.setBackend.bind(this); - Lib.registerCallback("onBeforeRoundtrip", this._setBackendBound); + this._unhook = Lib.hookCallback( + this, + "onBeforeRoundtrip", + "setBackend", + ); }, exit() { - Lib.unregisterCallback("onBeforeRoundtrip", this._setBackendBound); + this._unhook(); }, onAfterRendering() { diff --git a/run/input/core/app/z2ui5/webapp/cc/UITableExt.js b/run/input/core/app/z2ui5/webapp/cc/UITableExt.js index f58fa54..28b7269 100644 --- a/run/input/core/app/z2ui5/webapp/cc/UITableExt.js +++ b/run/input/core/app/z2ui5/webapp/cc/UITableExt.js @@ -25,21 +25,29 @@ sap.ui.define( }, init() { - this._beforeBound = () => { - this.readFilter(); - this.readSort(); - }; - this._afterBound = () => { - this.setFilter(); - this.setSort(); - }; - Lib.registerCallback("onBeforeRoundtrip", this._beforeBound); - Lib.registerCallback("onAfterRoundtrip", this._afterBound); + this._unhooks = [ + Lib.hookCallback(this, "onBeforeRoundtrip", "readBackend"), + // onAfterRENDERING, not onAfterRoundtrip: the latter fires + // right after the request DISPATCH (see View1.eB), long before a + // rebuild could have produced the fresh unfiltered binding this + // re-apply exists for - the pass was unreachable there. After the + // rendering the new binding exists and the compare below decides. + Lib.hookCallback(this, "onAfterRendering", "applyBackend"), + ]; }, exit() { - Lib.unregisterCallback("onBeforeRoundtrip", this._beforeBound); - Lib.unregisterCallback("onAfterRoundtrip", this._afterBound); + this._unhooks.forEach((unhook) => unhook()); + }, + + readBackend() { + this.readFilter(); + this.readSort(); + }, + + applyBackend() { + this.setFilter(); + this.setSort(); }, _getTable() { @@ -68,14 +76,13 @@ sap.ui.define( if (!aFilters) return; const binding = oTable.getBinding(); if (!binding) return; - // The re-apply pass (onAfterRoundtrip) runs synchronously right - // after the request is dispatched, before the response can rebuild - // the table. When the binding is still the exact object we read the - // filters from, it already carries them and the column indicators - // are in sync - re-running binding.filter() would re-evaluate the - // whole client dataset for an identical result. Only re-apply when - // the binding was replaced (e.g. a fresh view build produced a new, - // unfiltered binding). + // The re-apply pass runs on onAfterRendering (see init), i.e. AFTER + // a response may have rebuilt the table. When the binding is still + // the exact object we read the filters from, it already carries + // them and the column indicators are in sync - re-running + // binding.filter() would re-evaluate the whole client dataset for + // an identical result. Only re-apply when the binding was replaced + // (a fresh view build produced a new, unfiltered binding). if (binding === this._filterBinding) return; binding.filter(aFilters); const columns = oTable.getColumns(); @@ -196,7 +203,7 @@ sap.ui.define( "UITableExt.setSort failed", ); }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, }); }, ); diff --git a/run/input/core/app/z2ui5/webapp/cc/UploadSetExt.js b/run/input/core/app/z2ui5/webapp/cc/UploadSetExt.js index 5faa423..cb87520 100644 --- a/run/input/core/app/z2ui5/webapp/cc/UploadSetExt.js +++ b/run/input/core/app/z2ui5/webapp/cc/UploadSetExt.js @@ -51,11 +51,10 @@ sap.ui.define( }, init() { - this._setControlBound = this.setControl.bind(this); - Lib.registerCallback("onAfterRendering", this._setControlBound); + this._unhook = Lib.hookCallback(this, "onAfterRendering", "setControl"); }, exit() { - Lib.unregisterCallback("onAfterRendering", this._setControlBound); + this._unhook(); }, _readFile(file) { @@ -84,8 +83,11 @@ sap.ui.define( this.fireRemove(); }, - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, setControl() { + // Once claimed there is nothing left to do - skip the target lookup + // (byIdOfOwner walks the parent chain on every roundtrip) entirely. + if (this.getProperty("checkInit")) return; const uploadSet = ViewSlots.byIdOfOwner( this, this.getProperty("uploadSetId"), diff --git a/run/input/core/app/z2ui5/webapp/cc/Websocket.js b/run/input/core/app/z2ui5/webapp/cc/Websocket.js index aa46d10..51c31a3 100644 --- a/run/input/core/app/z2ui5/webapp/cc/Websocket.js +++ b/run/input/core/app/z2ui5/webapp/cc/Websocket.js @@ -16,6 +16,24 @@ sap.ui.define( // items are actually waiting. const DRAIN_RETRY_MS = 50; + // Reconnect policy for a connection the app did not close: exponential + // backoff starting here, capped there, and after MAX_CONNECT_ATTEMPTS + // consecutive failed handshakes the control stops trying until the app + // changes path/checkActive (each failure already fired `error`, so the + // backend heard about every one). Without this, an app that answers the + // error event with a view-rebuilding roundtrip re-entered _connect on + // every render - an unbounded reconnect storm against an inactive ICF + // node. + const RECONNECT_BASE_MS = 500; + const RECONNECT_MAX_MS = 30000; + const MAX_CONNECT_ATTEMPTS = 5; + + // The queue is bounded like every other buffer in the frontend + // (Lib.MAX_ERRORS, Console.MAX_ENTRIES, Recorder.MAX_RECORDS): a fast + // APC channel against a busy backend otherwise grows it without limit, + // one item drained per roundtrip. + const MAX_QUEUE = 100; + return Control.extend("z2ui5.cc.Websocket", { metadata: { properties: { @@ -62,13 +80,20 @@ sap.ui.define( }, init() { this._queue = []; + this._failedAttempts = 0; + this._dropped = 0; }, // Every state change (checkActive toggled, path rebound) invalidates // the control, so this single hook is where the connection is brought // in line with the properties - no setter override needed. onAfterRendering() { const url = this._resolveUrl(); - if (url !== this._url) this._disconnect(); + if (url !== this._url) { + this._disconnect(); + // a NEW target gets a fresh set of attempts - the give-up above + // is about hammering the same dead endpoint + this._failedAttempts = 0; + } this._url = url; if (this.getProperty("checkActive")) { this._connect(); @@ -78,6 +103,7 @@ sap.ui.define( }, exit() { clearTimeout(this._drainId); + clearTimeout(this._reconnectId); this._disconnect(); }, _resolveUrl() { @@ -90,6 +116,7 @@ sap.ui.define( }, _connect() { if (this._ws || !this._url) return; + if (this._failedAttempts >= MAX_CONNECT_ATTEMPTS) return; const url = this._url; let ws; try { @@ -103,7 +130,10 @@ sap.ui.define( this._ws = ws; this._opened = false; ws.onopen = () => { - if (this._ws === ws) this._opened = true; + if (this._ws === ws) { + this._opened = true; + this._failedAttempts = 0; + } }; ws.onmessage = (event) => { // The control may have been torn down, or replaced by a newer @@ -134,13 +164,42 @@ sap.ui.define( : "Connection to " + url + " could not be established"; const message = event.reason ? cause + ": " + event.reason : cause; Lib.logError("Websocket (" + event.code + "): " + message); + if (!this._opened) { + this._failedAttempts += 1; + if (this._failedAttempts >= MAX_CONNECT_ATTEMPTS) { + Lib.logError( + "Websocket: " + + MAX_CONNECT_ATTEMPTS + + " failed connection attempts to " + + url + + " - giving up until path or checkActive changes", + ); + } + } this._report({ kind: "error", code: String(event.code), message: message, }); + this._scheduleReconnect(); }; }, + // Try again on our own timer, not only on the next render: a model-only + // response never re-renders, and the push channel used to stay silently + // dead until something else happened to rebuild the view. + _scheduleReconnect() { + if (this._failedAttempts >= MAX_CONNECT_ATTEMPTS) return; + const delay = Math.min( + RECONNECT_MAX_MS, + RECONNECT_BASE_MS * 2 ** this._failedAttempts, + ); + clearTimeout(this._reconnectId); + this._reconnectId = setTimeout(() => { + if (Lib.isDestroyed(this)) return; + if (!this.getProperty("checkActive")) return; + this._connect(); + }, delay); + }, _disconnect() { const ws = this._ws; if (!ws) return; @@ -159,6 +218,20 @@ sap.ui.define( // errors share the queue so they reach the app in the order they // happened - an error after three messages is reported after them. _report(item) { + if (this._queue.length >= MAX_QUEUE) { + // drop the NEW item and count it, the Console.getDropped shape - + // reordering or silently shifting the oldest would deliver a + // sequence the channel never sent + this._dropped += 1; + Lib.logError( + "Websocket: queue full (" + + MAX_QUEUE + + "), dropped " + + this._dropped + + " item(s) so far", + ); + return; + } this._queue.push(item); this._drain(); }, diff --git a/run/input/core/app/z2ui5/webapp/controller/View1.controller.js b/run/input/core/app/z2ui5/webapp/controller/View1.controller.js index d53e068..3f252df 100644 --- a/run/input/core/app/z2ui5/webapp/controller/View1.controller.js +++ b/run/input/core/app/z2ui5/webapp/controller/View1.controller.js @@ -122,7 +122,13 @@ sap.ui.define( Lib.runCallbacks(AppState.state.onAfterRendering); } catch (e) { Lib.logError("_processAfterRendering: unexpected error", e); - Server.responseError(e, "Unexpected Error Occurred - App Terminated"); + // Server decides which overlay this failure gets: a view that could + // not load a sap.com module on openui5 shows the SDK hint, anything + // else the fatal overlay (see Server.showRenderError). + Server.showRenderError( + e, + "Unexpected Error Occurred - App Terminated", + ); } finally { BusyIndicator.hide(); AppState.state.isBusy = false; @@ -225,10 +231,14 @@ sap.ui.define( }, // Ancestor-text breadcrumb of a control resolved in an event argument, - // e.g. `$controller.textPath(${$parameters>/item})` on a menu's - // itemSelected -> "Create New Site > Official Store". The parent-chain - // walk happens on the live control tree, so no binding path can express - // it; the separator defaults to " > ". + // e.g. `$controller.textPath(${$parameters>/item})` on a tree or list + // item -> "Create New Site > Official Store". The parent-chain walk + // happens on the live control tree, so no binding path can express it; + // the separator defaults to " > ". + // + // It stops at the first ancestor without getText, which for a sap.m.Menu + // item is the internal MenuWrapper one hop up - so a MENU is the one + // example not to reach for here; see getTextPath in core/Lib.js. textPath(oControl, sSeparator) { return Lib.getTextPath(oControl, sSeparator); }, @@ -325,6 +335,10 @@ sap.ui.define( oBody.ARGUMENTS = Lib.normalizeEventArgs(args); Server.roundtrip(oBody); + // "after roundtrip" means AFTER THE DISPATCH, not after the + // response: readHttp is fire-and-forget, so these callbacks run + // synchronously once the request went out. A hook that needs the + // response or the re-rendered view belongs on onAfterRendering. Lib.runCallbacks(AppState.state.onAfterRoundtrip); }, diff --git a/run/input/core/app/z2ui5/webapp/core/AppState.js b/run/input/core/app/z2ui5/webapp/core/AppState.js index 38270bd..aee9629 100644 --- a/run/input/core/app/z2ui5/webapp/core/AppState.js +++ b/run/input/core/app/z2ui5/webapp/core/AppState.js @@ -140,7 +140,8 @@ sap.ui.define([], () => { oSentModel: null, search: null, - // Hash-based app routing (UI5 Router style, opt-in via set_nav_routing). + // Hash-based app routing (UI5 Router style, opt-in per app via + // follow_up_action( cs_event-set_nav_routing )). // Owned by core/Router.js - see there for the route format and how the // hash is split between the FLP shell and the app. // navRouting once the running app enabled routing, the URL hash mirrors diff --git a/run/input/core/app/z2ui5/webapp/core/FrontendAction.js b/run/input/core/app/z2ui5/webapp/core/FrontendAction.js index e4ab6b2..e44c8f4 100644 --- a/run/input/core/app/z2ui5/webapp/core/FrontendAction.js +++ b/run/input/core/app/z2ui5/webapp/core/FrontendAction.js @@ -34,8 +34,12 @@ sap.ui.define( // controller state (eB, ...) receive the calling controller as first // argument. // ------------------------------------------------------------------ + // Object.create(null) rather than {}: args[0] is an action name off the + // wire, and on a plain object handlers["valueOf"] resolves to a function + // from Object.prototype and gets CALLED as a handler. Same reasoning as + // the whitelists in core/actions/ControlCall.js. const handlers = Object.assign( - {}, + Object.create(null), ControlCall.handlers, Browser.handlers, Launchpad.handlers, diff --git a/run/input/core/app/z2ui5/webapp/core/Lib.js b/run/input/core/app/z2ui5/webapp/core/Lib.js index 3f02f56..49cca89 100644 --- a/run/input/core/app/z2ui5/webapp/core/Lib.js +++ b/run/input/core/app/z2ui5/webapp/core/Lib.js @@ -210,13 +210,23 @@ sap.ui.define( } // Join a control's own text with its ancestors' texts, outermost first - // ("Create New Site > Official Store"). The walk climbs getParent() and - // stops at the first ancestor that has no getText - for a menu item that - // is the Menu itself, so the result is exactly the item's breadcrumb - // (the `while (oItem instanceof MenuItem)` loop UI5 samples write in a - // controller). A control-tree walk cannot be expressed as a binding path, - // which is why it lives here and is reachable from an event argument via - // the controller's textPath(). + // ("Create New Site > Official Store"), the `while (oItem instanceof + // MenuItem)` loop UI5 samples write in a controller. A control-tree walk + // cannot be expressed as a binding path, which is why it lives here and is + // reachable from an event argument via the controller's textPath(). + // + // The walk climbs getParent() and BREAKS at the first ancestor that has no + // getText - it does not skip that ancestor and keep climbing. So the result + // is a breadcrumb only while every level in between is text-bearing, and + // whether that holds is a question about the control, not about this + // function. It notably does NOT hold for sap.m.Menu any more: since UI5 + // 1.136 a Menu forwards its items aggregation into an internal + // sap.m.MenuWrapper (Menu.js, forwarding idSuffix "-menuWrapper"), the + // wrapper declares no text property and no getText, and it sits between + // every item and its parent item - so the walk stops after one hop and + // returns the leaf text alone. UI5's own sample loop breaks on the same + // wrapper, so that is upstream behaviour rather than a difference, but do + // not promise a menu breadcrumb on the strength of this helper. function getTextPath(control, separator) { const texts = []; let node = control; @@ -233,6 +243,12 @@ sap.ui.define( // Copy text to the clipboard, preferring the async clipboard API with a // fallback to the legacy textarea + execCommand approach. + // Async clipboard API FIRST, execCommand fallback second - the inverse + // of core/ErrorView.js, deliberately: Lib serves ordinary app features + // on pages that are usually secure origins, where the async API is the + // reliable one. ErrorView prefers execCommand because it must also work + // on the insecure on-prem HTTP origins where navigator.clipboard does + // not exist - and a fatal-error overlay is exactly where that matters. function copyToClipboard(textToCopy) { if (navigator.clipboard?.writeText) { navigator.clipboard.writeText(textToCopy).catch((err) => { @@ -522,6 +538,22 @@ sap.ui.define( oRm.close("span"); } + // The renderer of a companion control that renders NOTHING (not even a + // placeholder span - it lives outside the visible tree entirely). One + // shared spec instead of the same literal in every cc/ module; UI5 copies + // the spec into the control's own renderer class, so sharing is safe. + const EMPTY_RENDERER = { apiVersion: 2, render() {} }; + + // The init/exit pair every companion control repeats: register the bound + // hook method as a shared-state callback and hand back the unregister. + // init() { this._unhook = Lib.hookCallback(this, "onAfterRendering", "setControl"); } + // exit() { this._unhook(); } + function hookCallback(owner, callbackName, method) { + const bound = owner[method].bind(owner); + registerCallback(callbackName, bound); + return () => unregisterCallback(callbackName, bound); + } + // Event arguments are whatever the UI5 expression grammar produced for // them. Most are strings or numbers, but a UI5 event parameter is quite // often a CONTROL or an ARRAY OF CONTROLS - @@ -553,13 +585,52 @@ sap.ui.define( ); } + /* A Date property carries a CALENDAR DAY the user picked in their own + * timezone, not a point on the timeline - UI5 fills DateRange.startDate, + * CalendarAppointment.startDate, DatePicker.dateValue and friends with + * LOCAL midnight of that day. JSON.stringify would take it through + * Date.prototype.toJSON -> toISOString(), which is UTC, so east of + * Greenwich the date part came out as the PREVIOUS day - a wrong day + * delivered with no error anywhere. + * + * Serialize the local parts instead, as an ISO local timestamp with no Z. + * That is the shape the framework already uses in the INBOUND direction + * (model/formatter.js builds a Date from local parts precisely so a + * date-only string does not shift), and an app reads the first ten + * characters as the day. Sending the instant plus an offset would also be + * recoverable, but it makes every consumer do arithmetic to recover a + * value that was never more than a calendar day. + * + * An INVALID Date is left alone deliberately: UI5 produces one for an + * empty optional date, and it must not become the string "Invalid Date" - + * the existing path yields null, which is what the curated formatter's + * DateCreateObject returns for a falsy input. */ + function projectValue(value) { + // toString rather than `instanceof Date`: instanceof compares against + // ONE realm's constructor, so a Date that crossed a realm boundary (an + // iframe, or the vm sandbox the unit tests load this module in) is not + // recognized and silently keeps the UTC serialization this exists to + // avoid. The tag is realm-independent. + if ( + Object.prototype.toString.call(value) === "[object Date]" && + !isNaN(value) + ) { + const p = (n, w = 2) => String(n).padStart(w, "0"); + return ( + `${p(value.getFullYear(), 4)}-${p(value.getMonth() + 1)}-${p(value.getDate())}` + + `T${p(value.getHours())}:${p(value.getMinutes())}:${p(value.getSeconds())}` + ); + } + return value; + } + function projectControl(control) { const result = { ID: control.getId() }; const properties = control.getMetadata().getAllProperties(); for (const name in properties) { try { const value = control.getProperty(name); - if (value !== undefined) result[name] = value; + if (value !== undefined) result[name] = projectValue(value); } catch { // a property whose getter throws is simply not reported - the // remaining ones still have to reach the backend @@ -614,6 +685,8 @@ sap.ui.define( isRootModelSlot, effectiveSizeLimit, renderInvisibleSpan, + EMPTY_RENDERER, + hookCallback, normalizeEventArgs, }; }, diff --git a/run/input/core/app/z2ui5/webapp/core/Server.js b/run/input/core/app/z2ui5/webapp/core/Server.js index 44b2b39..2a7ef48 100644 --- a/run/input/core/app/z2ui5/webapp/core/Server.js +++ b/run/input/core/app/z2ui5/webapp/core/Server.js @@ -126,6 +126,24 @@ sap.ui.define( AppState.state.contextId = null; }, + // Drop everything this module holds ACROSS a component teardown. Both + // fields below are module-scoped, so on an FLP re-launch they outlived + // the component that started them: + // _inflight - the old fetch resolves into the NEW session. isStale( ) + // does not catch it, because _requestSeq is module state too and no + // newer request has gone out yet, so the response is adopted: its + // sap-contextid becomes the new session's, then responseSuccess + // reaches for the MAIN controller, finds null, and the app that just + // started shows the fatal "App Terminated" overlay. + // _viewBuild - a queued rebuild continuation calls removeAllPages( ) + // on an oApp that AppState.initGlobal( ) has since cleared. + // _abortInflight( ) existed for the other case (a newer request + // superseding older ones) and was never reachable from teardown. + reset() { + this._abortInflight(); + this._viewBuild = null; + }, + // Restore the app state a matched hash route points at. Wired into // core/Router by Component.js and called when the browser Back/Forward // buttons (or a manual URL edit / bookmark) select a different route. @@ -299,10 +317,15 @@ sap.ui.define( if (Lib.isValidContextId(AppState.state.contextId)) { headers["sap-contextid"] = AppState.state.contextId; } + const body = JSON.stringify({ value: oBody }); + // one shared number, not recorder code: whoever wants the + // request size (the devtools recorder does) reads it here + // instead of serializing the body a second time + AppState.state.lastRequestBytes = body.length; response = await fetch(AppState.getGlobal("url"), { method: "POST", headers, - body: JSON.stringify({ value: oBody }), + body, signal, }); } catch (e) { @@ -399,6 +422,13 @@ sap.ui.define( }, seq, ); + } catch (e) { + // readHttp is fire-and-forget (roundtrip/onRetry never await it), so + // anything thrown between the inner try/catches - header handling, + // session bookkeeping, the success handler - would otherwise reject + // this promise silently: busy indicator spinning forever, no overlay. + // A superseded request stays silent; the newer one owns the outcome. + if (!isStale()) this.responseError(e); } finally { this._inflight.delete(superseder); cancel(); @@ -435,17 +465,31 @@ sap.ui.define( // nothing left to do. The request stamp rides along so the display // guards compare against THIS response's request, not whatever is // newest by the time processing starts. - oController._processAfterRendering(reqSeq); + // Awaited so a rejection that escapes _processAfterRendering (its + // own catch handles everything inside the try) still lands in the + // catch below instead of an unhandled rejection. + await oController._processAfterRendering(reqSeq); } catch (e) { BusyIndicator.hide(); AppState.state.isBusy = false; Lib.logError("responseSuccess: unexpected error", e); - const msg = e.message || ""; - if (msg.includes("openui5") && msg.includes("script load error")) { - this._checkSDKcompatibility(e); - } else { - this.responseError(e); - } + this.showRenderError(e); + } + }, + + // Route a render/view-load failure to the right overlay: an openui5 + // script-load error gets the SDK hint (_checkSDKcompatibility), every + // other failure the fatal-error overlay. Shared by the catch above and + // View1._processAfterRendering's catch - the render phase is where a + // view actually fails to load a sap.com module, so without this hook + // there the SDK hint was unreachable (View1 caught the error first and + // showed only the generic overlay). + showRenderError(e, title) { + const msg = e?.message || ""; + if (msg.includes("openui5") && msg.includes("script load error")) { + this._checkSDKcompatibility(e); + } else { + this.responseError(e, title); } }, diff --git a/run/input/core/app/z2ui5/webapp/core/Session.js b/run/input/core/app/z2ui5/webapp/core/Session.js index 822bd23..eaa8137 100644 --- a/run/input/core/app/z2ui5/webapp/core/Session.js +++ b/run/input/core/app/z2ui5/webapp/core/Session.js @@ -106,10 +106,14 @@ sap.ui.define(["sap/ui/Device", "z2ui5/core/Lib"], (Device, Lib) => { } // The carrying request won - what IT carried is now known to the backend. + // Each latch advances only for the value THIS token actually carried: a + // token built by location( ) alone has no `live`, and overwriting the live + // key with undefined would re-send the device block for no reason. function confirmSent(p) { if (!p) return; if (p.config) sessionConfigSent = true; - liveSent = p.live; + if (p.live !== undefined) liveSent = p.live; + if (p.location) locationSent = true; } // The page location (origin, pathname, query) is session-constant like @@ -120,11 +124,19 @@ sap.ui.define(["sap/ui/Device", "z2ui5/core/Lib"], (Device, Lib) => { // can store it with the draft (z2ui5_cl_ui5_handler=>session_merge). // Event roundtrips omit it. The hash is NOT part of this: it carries the // live routing state and stays a per-request field (Server.roundtrip). + // + // The latch is confirm-gated like the ones above, and for the same reason: + // an app started FROM a draft id sends the location on a request that + // already carries that id, and if that request is aborted or superseded a + // build-time latch would leave the backend without an origin for good - + // every later event roundtrip omits it. let locationSent = false; function location(draftId, search) { if (draftId && locationSent) return null; - locationSent = true; + // rides in the same per-request token as the session block, which + // config( ) has already built (or cleared) by the time we get here + pending = { ...pending, location: true }; return { ORIGIN: window.location.origin, PATHNAME: window.location.pathname, diff --git a/run/input/core/app/z2ui5/webapp/core/ViewSlots.js b/run/input/core/app/z2ui5/webapp/core/ViewSlots.js index adb0b2c..baba773 100644 --- a/run/input/core/app/z2ui5/webapp/core/ViewSlots.js +++ b/run/input/core/app/z2ui5/webapp/core/ViewSlots.js @@ -161,6 +161,20 @@ sap.ui.define( return Lib.getElementById(id); } + // The framework-owned JSON model as seen from a view or control: the + // DEFAULT model normally, the NAMED "http" model when the app switched + // the default slot to OData (SWITCH_DEFAULT_MODEL_PATH). Undefined when + // neither carries the _z2ui5Tracked marker. THE one resolver - five + // call sites used to answer "which model is the framework's" five + // different ways, and four of them silently picked the OData model in + // switch mode (SET_SIZE_LIMIT, scroll dirty-marking, the devtools + // bindings tab). + function trackedModel(owner) { + const isOurs = (m) => (m?._z2ui5Tracked ? m : undefined); + if (!owner?.getModel) return undefined; + return isOurs(owner.getModel()) ?? isOurs(owner.getModel("http")); + } + // Returns the key of the slot a UI5 element belongs to, by walking up // the control tree until a live slot view is hit (innermost slot wins, // e.g. nested views). Undefined when the element is in no slot. @@ -246,6 +260,7 @@ sap.ui.define( byIdOfOwner, resolveById, containingSlotKey, + trackedModel, destroy, }; }, diff --git a/run/input/core/app/z2ui5/webapp/core/actions/Browser.js b/run/input/core/app/z2ui5/webapp/core/actions/Browser.js index f3b16ad..6c744da 100644 --- a/run/input/core/app/z2ui5/webapp/core/actions/Browser.js +++ b/run/input/core/app/z2ui5/webapp/core/actions/Browser.js @@ -246,6 +246,13 @@ sap.ui.define( function evSetFavicon(oController, args) { const href = Lib.toText(args[1]); + // the one URL-consuming action that had no validator - no current + // browser executes javascript: in a , but consistency + // is what keeps the NEXT copy-paste of this shape safe + if (!Lib.isSafeDownloadURL(href)) { + Lib.logError(`SET_FAVICON: refused unsafe URL "${href}"`); + return; + } try { // Reuse the icon link the page already has instead of appending a // second one - which of two competing elements the diff --git a/run/input/core/app/z2ui5/webapp/core/actions/ControlCall.js b/run/input/core/app/z2ui5/webapp/core/actions/ControlCall.js index c121937..2b9a16b 100644 --- a/run/input/core/app/z2ui5/webapp/core/actions/ControlCall.js +++ b/run/input/core/app/z2ui5/webapp/core/actions/ControlCall.js @@ -145,9 +145,48 @@ sap.ui.define( // control method -> kinds of its positional args. Args beyond the // declared kinds are dropped; trailing args the caller did not send are // not passed at all (so `open()` stays a true no-arg call). + // This table and the two whitelists below are prototype-less - see the + // Object.setPrototypeOf right after each one. They are indexed with a name + // that comes off the wire, and a plain object answers for every key + // Object.prototype has: with a method named "constructor" the + // CONTROL_METHODS lookup below returned a truthy value, skipped + // isSafeControlMethod( ) entirely and then invoked + // control["constructor"](...); BINDING_METHODS["toString"] silently ran + // Object.prototype.toString instead of logging "method not allowed". + // Not a security boundary by this module's own model - the backend is + // trusted - but it defeated the deny-list and turned a malformed payload + // into a silent wrong call rather than the log line that says what + // happened. const CONTROL_METHODS = { - to: ["controlId", "string"], // target page + optional transitionName + // `pageId`, NOT `controlId`: the three containers that own a `to( )` + // disagree about what the first argument may be. sap.m.NavContainer + // normalises a Control to its id on its own first line, but + // sap.f.FlexibleColumnLayout.to and sap.m.SplitContainer.to PROBE the + // columns with `getPage( sPageId )`, which compares `aPages[i].getId() + // == pageId` - a Control never equals an id string, so every probe + // misses and the trailing `else` navigates the LAST column instead of + // the one that owns the page. Measured on samples-controls app 578, + // whose begin column never moved. Handing over the RESOLVED control's + // id serves all three: NavContainer would compute exactly that id + // itself, and the two probing containers finally match. + to: ["pageId", "string"], // target page + optional transitionName back: [], + // Same `pageId` kind as `to`, and MEASURED the same way (2026-08-27, + // samples-controls app 101 on the live Node backend). Unlike `to`, + // sap.m.NavContainer.backToPage does NOT rescue a raw id: + // `_backTo` normalises only a Control (`if (sRequestedPageId instanceof + // Control) sRequestedPageId = sRequestedPageId.getId()`), then hands the + // value to `_findClosestPreviousPageInfo`, which walks `_pageStack` and + // compares `info.id === sRequestedPreviousPageId` - strict, no prefixing. + // Every `_pageStack` entry was pushed as `page.getId()`, so it carries + // the view prefix the backend never sees. The unlisted-method path used + // to hand over the raw ABAP literal, which therefore matched nothing: + // UI5 logged "Cannot navigate backToPage('wizardContentPage') because + // target page was not found among the previous pages." and `_backTo` + // returned without navigating - a SILENT miss, the review page stayed up + // and app 101's four "Edit" links and its Cancel/Submit legs did nothing. + // Resolving to `mainView--wizardContentPage` navigates. + backToPage: ["pageId"], toDetail: ["controlId"], // sap.m.SplitApp/SplitContainer: show a detail page toMaster: ["controlId"], // sap.m.SplitApp/SplitContainer: show a master page backDetail: [], // sap.m.SplitApp/SplitContainer: back in the detail stack @@ -168,12 +207,24 @@ sap.ui.define( setActivePage: ["controlId"], // sap.m.Carousel expandToLevel: ["int"], // sap.m.Tree / sap.ui.table.TreeTable: expand to N levels collapseAll: [], // sap.m.Tree / sap.ui.table.TreeTable: collapse every node + expandSelected: [], // NOT a UI5 method: expand the tree's selected nodes + collapseSelected: [], // NOT a UI5 method: collapse the tree's selected nodes setHiddenInPopin: ["object"], // sap.m.Table: hide columns by importance (JSON array of Priority keys) setSticky: ["object"], // sap.m.ListBase/sap.m.Table: JSON array of sap.m.Sticky keys setSelectedSection: ["controlIdOrNull"], // sap.uxap.ObjectPageLayout: an EMPTY argument clears the association setSelectedItem: ["controlIdOrNull"], // sap.m.List/sap.m.Select/...: an EMPTY argument clears the selection setP13nData: ["object"], // sap.m.p13n.*Panel: JSON array of the panel's items + // sap.m.Button badge bounds. The `int` kind is load-bearing, not + // decoration: both setters compare the incoming value against the + // STORED bound (`iMax >= this._badgeMinValue`), so an undeclared + // numeric string makes the second comparison a STRING comparison - + // "50" >= "9" is false - and the setter drops the value into an `else` + // whose only effect is a Log.warning. min 9 / max 50 is the smallest + // pair that breaks (samples-controls app 249 drives both). + setBadgeMinValue: ["int"], // below this value the badge stays hidden + setBadgeMaxValue: ["int"], // above this value the badge reads "999+" + css: ["string", "string"], // NOT a UI5 method: set one CSS property on the control's own DOM node enablePostButton: ["bool"], // sap.m.FeedInput: toggle the Post button independent of `enabled` addStyleClass: ["string"], // sap.ui.core.Control: add a CSS style class @@ -181,6 +232,14 @@ sap.ui.define( toggleStyleClass: ["string"], // sap.ui.core.Control: toggle a CSS style class setAsyncURLHandler: ["string"], // sap.m.MessagePopover: name of a URL_POLICY below }; + // Prototype-less, but written as a plain literal on purpose: the + // abap2UI5 linter mirrors this set and finds it by the exact source text + // `const CONTROL_METHODS = {` in the embedded carrier (its + // scripts/check-upstream.mjs). Wrapping the literal in a call made that + // lookup miss, and the mirror check degraded to "SKIPPED, not verified" - + // a cross-repository check that stops checking without failing. Same + // effect, marker intact. + Object.setPrototypeOf(CONTROL_METHODS, null); // sap.m.MessagePopover.setAsyncURLHandler expects a live JS callback that // resolves a promise per message link - a shape no backend payload can @@ -380,6 +439,23 @@ sap.ui.define( get: () => BusyIndicator, methods: { show: ["int"], hide: [] }, }, + // A UI5 icon collection outside the default SAP-icons font - sap.tnt's + // SAP-icons-TNT is the common one - resolves only once something has + // called IconPool.registerFont({ fontFamily, fontURI }). In a normal UI5 + // app that call sits in the Component's init. An abap2UI5 app has no + // Component of its own, and IconPool is a module-level SINGLETON rather + // than a control, so CONTROL_BY_ID cannot address it and no global target + // reached it: a sap-icon://SAP-icons-TNT/... URI rendered no glyph at + // all, silently (samples-controls app 350). + // + // Two positional arguments rather than the config object UI5 takes, + // because that is what a t_arg can carry; the hook assembles it. + ICON_POOL: { + get: () => sap.ui.require("sap/ui/core/IconPool"), + methods: { registerFont: ["string", "string"] }, + display: (oController, method, aArgs) => + registerIconFont(aArgs[0], aArgs[1]), + }, // sap/ui/core/Theming only exists since UI5 1.118, so it must NOT be a // hard dependency (it 404s on 1.71 and kills the whole component load). // Resolve it lazily: on modern UI5 the core has it loaded, on 1.71 the @@ -412,25 +488,40 @@ sap.ui.define( }, methods: { announce: ["string", "string"] }, }, - // sap/ui/core/Formatting (@since 1.120) carries the global formatting + // sap/base/i18n/Formatting (@since 1.120) carries the global formatting // configuration. Custom currencies are the case an app cannot express // otherwise: the digit count of a currency code is neither a control // property nor something a per-binding formatter can register for the // standard sap.ui.model.type.Currency. The payload is a JSON object - // data the backend owns anyway. Lazy-require like THEMING. // The two are NOT interchangeable and the difference is silent: set - // REPLACES the whole registration, add ADDS one code to it. An app + // REPLACES the whole registration, add MERGES codes into it. An app // that registers currencies as it loads more data and reaches for // `set` drops the ones it registered before - and the symptom is a // wrong digit count in a table, never an error. + // Both names are the module's own and were WRONG here until 2026-08-23: + // the target read `sap/ui/core/Formatting`, which is not a module in any + // UI5 release (Core.js loads the base one), so the require returned + // undefined and every call logged "not available" and did nothing; and + // the second method was spelled `addCustomCurrency`, which the module + // does not have either - it is addCustomCurrencies, taking the same map + // as set. Found through samples-controls app 196. FORMATTING: { - get: () => sap.ui.require("sap/ui/core/Formatting"), + get: () => sap.ui.require("sap/base/i18n/Formatting"), methods: { setCustomCurrencies: ["object"], // REPLACES: { CODE: { digits: n }, ... } - addCustomCurrency: ["string", "object"], // ADDS one: code, { digits: n } + addCustomCurrencies: ["object"], // MERGES: same shape, keeps the rest }, }, }; + // Prototype-less, but written as a plain literal on purpose: the + // abap2UI5 linter mirrors this set and finds it by the exact source text + // `const GLOBAL_TARGETS = {` in the embedded carrier (its + // scripts/check-upstream.mjs). Wrapping the literal in a call made that + // lookup miss, and the mirror check degraded to "SKIPPED, not verified" - + // a cross-repository check that stops checking without failing. Same + // effect, marker intact. + Object.setPrototypeOf(GLOBAL_TARGETS, null); // Cast one raw string argument to the kind the whitelist declared. // `view` (optional) is the slot the owning control was resolved in, so a @@ -491,6 +582,26 @@ sap.ui.define( return raw === "true" || raw === "X" || raw === true; case "controlId": return resolveControl(raw, view); + case "pageId": { + // Like `controlId`, but hands the container the resolved control's + // ID rather than the control. Only for methods whose UI5 signature + // is a page ID and which do NOT normalise a Control themselves - + // see the `to` entry in CONTROL_METHODS for the measurement. The + // resolution step is what makes this safe: the rendered id carries + // the view prefix the backend never sees, so passing the raw ABAP + // literal instead would break every existing navigation. + const page = resolveControl(raw, view); + if (page && typeof page.getId === "function") return page.getId(); + // No control under that id. Today the container absorbs this + // silently (it just navigates its last column and logs a UI5 + // warning nobody reads), so name it here; the raw value is still + // handed over, which is the best effort an already-qualified id + // needs and is never worse than the `undefined` this used to pass. + Lib.logError( + `CONTROL_CALL: no control '${raw}' for the page argument`, + ); + return raw; + } case "controlIdOrNull": // an ASSOCIATION cannot be data-bound, so clearing one // (setSelectedSection(null), setSelectedItem(null)) can only travel @@ -545,15 +656,48 @@ sap.ui.define( return raw; } + // The one case where inference is provably wrong: a string-typed property. + // castArgAuto has to map ""/" " to false - that is how an ABAP boolean + // travels - which leaves the EMPTY STRING with no spelling at all, so every + // string setter on the unlisted path can be given any value except "". + // UI5 then hides the failure instead of reporting it: validateProperty does + // not reject a boolean for a string property, it casts implicitly + // (`oValue = "" + oValue`), so setText("") arrives as setText(false) and + // renders the four characters "false" - no error, no warning, and a + // screenshot that reads like a typo rather than a type bug. + // + // The control and the method are both known here, so UI5's own declaration + // can settle it instead of a guess: for a setXxx whose property is declared + // `string`, pass the raw value through untouched. Everything else keeps the + // inference, so the "X"/space boolean contract is untouched. + function setsStringProperty(control, method) { + if (!control || typeof method !== "string" || !/^set[A-Z]/.test(method)) + return false; + const prop = control.getMetadata?.()?.getAllProperties?.()[ + method.charAt(3).toLowerCase() + method.slice(4) + ]; + return !!prop && prop.type === "string"; + } + // kinds whose EMPTY value is meaningful (null), so a missing trailing // argument still has to be passed: the backend wire drops a trailing empty // t_arg entry, and "clear this association" is exactly a call whose only // argument is empty. const NULLABLE_KINDS = ["controlIdOrNull"]; - function castArgs(kinds, rawArgs, view) { + // `target` (optional) is the { control, method } the call will land on - + // only the CONTROL_BY_ID path can supply it, and it is only consulted on + // the inferred branch. + function castArgs(kinds, rawArgs, view, target) { // kinds === null: unlisted-but-allowed method, infer each arg's type - if (kinds === null) return rawArgs.map((raw) => castArgAuto(raw)); + if (kinds === null) { + // a setXxx takes its value first, and that is the only position a + // declared property type can speak for + const keepString = setsStringProperty(target?.control, target?.method); + return rawArgs.map((raw, i) => + i === 0 && keepString ? raw : castArgAuto(raw), + ); + } // only cast args the caller actually sent - padding missing trailing // args would turn open() into open(undefined) and ints into NaN. The one // exception is a nullable kind (see above): pad it so the call carries @@ -566,6 +710,59 @@ sap.ui.define( .map((kind, i) => castArg(kind, rawArgs[i], view)); } + // Collections already registered in this session. UI5 tolerates a repeat + // registerFont but Log.warning's on it, and a port issuing this from its + // init branch would do so on every single round-trip. + const registeredIconFonts = new Set(); + + function registerIconFont(fontFamily, fontURI) { + const IconPool = sap.ui.require("sap/ui/core/IconPool"); + if (!IconPool) { + Lib.logError("ICON_POOL: sap/ui/core/IconPool is not loaded"); + return; + } + if (!fontFamily || !fontURI) { + Lib.logError( + "ICON_POOL: registerFont needs a fontFamily AND a fontURI", + ); + return; + } + if (registeredIconFonts.has(fontFamily)) return; + /* fontURI is a MODULE PATH in every real use ('sap/tnt/themes/base/fonts/'), + * and resolving it through sap.ui.require.toUrl is what makes the + * registration survive a different mount point - it is also what the UI5 + * samples pass. Anything that already looks like a URL is left alone. */ + const uri = /^(?:[a-z]+:)?\/\//i.test(fontURI) + ? fontURI + : sap.ui.require.toUrl(fontURI); + IconPool.registerFont({ fontFamily, fontURI: uri }); + registeredIconFonts.add(fontFamily); + } + + // The selected rows of a tree, as the row INDICES its expand()/collapse() + // take. Two shapes, because the two tree controls disagree: + // sap.ui.table.TreeTable - getSelectedIndices() gives them directly + // sap.m.Tree - getSelectedItems() + indexOfItem() per item + // Returns null when the control is neither, so the caller can say so + // rather than silently doing nothing. An index of -1 (an item the tree no + // longer holds) is dropped: expand(-1) is not a smaller mistake than + // expand(undefined). + function selectedIndicesOf(control) { + if (typeof control.getSelectedIndices === "function") { + return control.getSelectedIndices(); + } + if ( + typeof control.getSelectedItems === "function" && + typeof control.indexOfItem === "function" + ) { + return control + .getSelectedItems() + .map((item) => control.indexOfItem(item)) + .filter((i) => i >= 0); + } + return null; + } + // Run fn once the openBy/toggleBy anchor is in the DOM. A control anchor // goes through Lib.whenRendered (immediate if already rendered, otherwise // after its next onAfterRendering); anything else (a bare DOM element, or a @@ -591,8 +788,13 @@ sap.ui.define( } kinds = null; } + // slot first, registry fallback - the SAME rule resolveControl + // applies to argument controls. The target used to be slot-ONLY when + // `view` was set, so a fully-qualified id (the form UI5 messages + // return from getControlIds()) resolved fine as an argument and + // reported "not callable" as the target of the very same call. const control = view - ? ViewSlots.byId(view.toUpperCase(), id) + ? (ViewSlots.byId(view.toUpperCase(), id) ?? ViewSlots.resolveById(id)) : ViewSlots.resolveById(id); // toggleBy is not a real control method: open the control anchored to // the anchor control if it is closed, close it if it is already open @@ -637,6 +839,40 @@ sap.ui.define( el.style.setProperty(prop, String(args[5] ?? "")); return; } + // expandSelected / collapseSelected are not UI5 methods either. Both + // trees take INDICES (`expand(int|int[])`, `collapse(int|int[])`), and + // only sap.ui.table.TreeTable can hand them over: it has + // getSelectedIndices(). sap.m.Tree offers getSelectedItems() plus + // indexOfItem(), so the mapping is a LOOP - and a loop written into an + // event argument needs a JS callback, which UI5's ExpressionParser has + // no grammar for (no `function` keyword, `{` is the object-literal nud), + // so `.getSelectedItems().map(function (o) { ... })` does not fail on that + // argument, it takes the WHOLE handler down and every argument with it. + // The loop therefore lives here, which is the same reason `css` does: + // the app has no spelling for it at all. It stays a thin executor - no + // decision is made, the selection is read and handed straight back to + // the control's own method. + if (method === "expandSelected" || method === "collapseSelected") { + const op = method === "expandSelected" ? "expand" : "collapse"; + if (!control || typeof control[op] !== "function") { + Lib.logError( + `CONTROL_BY_ID: '${method}' not callable on control '${id}'`, + ); + return; + } + const indices = selectedIndicesOf(control); + if (indices === null) { + Lib.logError( + `CONTROL_BY_ID: '${method}' - control '${id}' exposes no selection`, + ); + return; + } + // an empty selection is not an error: nothing selected, nothing to + // expand. Calling expand([]) would be a no-op anyway, but skipping it + // keeps a stray re-render off a tree the user did not touch. + if (indices.length) control[op](indices); + return; + } // setAsyncURLHandler takes a FUNCTION, so the argument names a policy // (see URL_POLICIES) and the client installs the matching built-in // validator - the wire still carries data, never code. @@ -694,7 +930,9 @@ sap.ui.define( ); return; } - control[method](...castArgs(kinds, args.slice(4), view)); + control[method]( + ...castArgs(kinds, args.slice(4), view, { control, method }), + ); } // args: [_, object, method, ...params]. `ctx` is the action context the @@ -897,6 +1135,14 @@ sap.ui.define( ]); }, }; + // Prototype-less, but written as a plain literal on purpose: the + // abap2UI5 linter mirrors this set and finds it by the exact source text + // `const BINDING_METHODS = {` in the embedded carrier (its + // scripts/check-upstream.mjs). Wrapping the literal in a call made that + // lookup miss, and the mirror check degraded to "SKIPPED, not verified" - + // a cross-repository check that stops checking without failing. Same + // effect, marker intact. + Object.setPrototypeOf(BINDING_METHODS, null); // args: [_, id, aggregation, method, ...params] function evBindingCall(oController, args) { diff --git a/run/input/core/app/z2ui5/webapp/core/actions/Shortcuts.js b/run/input/core/app/z2ui5/webapp/core/actions/Shortcuts.js index acd92d2..297cd52 100644 --- a/run/input/core/app/z2ui5/webapp/core/actions/Shortcuts.js +++ b/run/input/core/app/z2ui5/webapp/core/actions/Shortcuts.js @@ -113,6 +113,11 @@ sap.ui.define( try { const entry = shortcutEntry(shortcutFromEvent(oEvent)); if (!entry) return; + // a registration whose controller died with its view (an app + // switch clears the registry, an in-app teardown does not) must + // not dispatch into a destroyed controller - same guard as + // ViewOps.evStartTimer + if (Lib.isDestroyed(entry.controller)) return; // the browser's own default for the combo (Ctrl+S saves the page, // Ctrl+D bookmarks it) must not fire alongside the app command oEvent.preventDefault(); @@ -159,8 +164,14 @@ sap.ui.define( function evKeyboardSetMode(oController, args) { try { - const oElement = ViewSlots.byId("MAIN", args[1]); - if (!oElement) return; + // resolveById, not byId("MAIN", ...): an input in a dialog or a + // nested view is not in the MAIN slot, and this used to no-op on it + // without even a log line + const oElement = ViewSlots.resolveById(args[1]); + if (!oElement) { + Lib.logError(`KEYBOARD_SET_MODE: '${args[1]}' not found`); + return; + } const dom = oElement.getDomRef(); if (!dom) return; const input = dom.matches("input, textarea") diff --git a/run/input/core/app/z2ui5/webapp/core/actions/Slots.js b/run/input/core/app/z2ui5/webapp/core/actions/Slots.js index 9c7f1e0..3121cbf 100644 --- a/run/input/core/app/z2ui5/webapp/core/actions/Slots.js +++ b/run/input/core/app/z2ui5/webapp/core/actions/Slots.js @@ -71,13 +71,11 @@ sap.ui.define( return oModel; } - // The framework-owned JSON model on a slot's view: the DEFAULT model - // normally, but the NAMED "http" model when SWITCH_DEFAULT_MODEL_PATH put - // an OData model in the default slot. Returns undefined when neither model - // is ours (marked by _z2ui5Tracked). + // The framework-owned JSON model on a slot's view - the shared + // resolver lives on ViewSlots so cc/ and devtools/ modules reach it + // without importing this action module. function resolveTrackedModel(oView) { - const isOurs = (m) => (m?._z2ui5Tracked ? m : undefined); - return isOurs(oView.getModel()) ?? isOurs(oView.getModel("http")); + return ViewSlots.trackedModel(oView); } function createViewModel() { @@ -241,10 +239,19 @@ sap.ui.define( serviceUrl: switchPath, annotationURI: mOptions.switchDefaultModelAnnoUri || "", }); + // marks the OData client as FRAMEWORK-created, so the next MAIN + // rebuild may destroy it (displayMain) - an app-provided model via + // SET_ODATA_MODEL is never touched through this marker + oModel._z2ui5OwnedOData = true; } else { oModel = oViewModel; } - applyStoredSizeLimit("MAIN", oModel); + // the stored limit reaches BOTH models in switch mode: the tracked + // JSON model is what the app's SET_SIZE_LIMIT was about (its bound + // tables live there under http>), and the OData default model kept + // getting it as before + applyStoredSizeLimit("MAIN", oViewModel); + if (switchPath) applyStoredSizeLimit("MAIN", oModel); const oView = await XMLView.create({ definition: xml, @@ -307,7 +314,15 @@ sap.ui.define( // build may still be awaiting, which would let that stale build // slip past displayView's "a newer view took the slot" guard and // then crash THIS build on a duplicate id. + // the previous MAIN's framework-created OData default model does + // not die with the view (a model is no aggregation): without this + // every switch-mode rebuild leaked a full OData client - its + // $metadata request, caches and queues included. Only the model + // the framework itself created is destroyed (see the marker in + // displayView); dependent slots are already down at this point. + const oldMainDefault = ViewSlots.getView("MAIN")?.getModel?.(); ViewSlots.destroy("MAIN"); + if (oldMainDefault?._z2ui5OwnedOData) oldMainDefault.destroy(); // A new MAIN view means a new screen, so the two STANDALONE slots // go with it. They live outside the MAIN control tree and would // otherwise float on top of a page they no longer belong to - a @@ -384,7 +399,14 @@ sap.ui.define( // (destroying an empty slot is a no-op). MAIN tears down inside its // serialized build chain (see displayMain) - its slot may still be // claimed by an older awaiting build. - if (slotKey === "MAIN") return displayMain(xml, mOptions, seq); + if (slotKey === "MAIN") { + // remembered per display so a NON-roundtrip re-display of the same + // slot (devtools LiveEdit) can reuse them: a switch-mode MAIN + // re-displayed with empty options came back without its OData + // default model and looked broken in the preview + AppState.state.lastMainDisplayOptions = mOptions || {}; + return displayMain(xml, mOptions, seq); + } ViewSlots.destroy(slotKey); if (slotKey === "POPUP") return displayFragment(xml, seq); if (slotKey === "POPOVER") { diff --git a/run/input/core/app/z2ui5/webapp/core/actions/Variants.js b/run/input/core/app/z2ui5/webapp/core/actions/Variants.js index df6fae5..f2a6e43 100644 --- a/run/input/core/app/z2ui5/webapp/core/actions/Variants.js +++ b/run/input/core/app/z2ui5/webapp/core/actions/Variants.js @@ -74,10 +74,32 @@ sap.ui.define(["z2ui5/core/Lib", "z2ui5/core/ViewSlots"], (Lib, ViewSlots) => { // leave the initialise call to the smart control, which then finds the // anchor in place. Only when no control id was given does this wait for the // registration list and call initialise itself (nobody else will). + // One live wait chain per (svmId, controlId): the action is not marked + // one-shot, so a backend that repeats it per response used to start a NEW + // 5-second retry chain on every roundtrip - all of them polling the same + // ids, and after a rebuild resolving them in the NEW view and re-wiring + // there. The key clears when the chain reaches any terminal state, so a + // later re-issue (after a rebuild replaced the controls) starts fresh. + const activeInits = new Set(); + function evSmartVariantInit(oController, args) { const [, svmId, controlId] = args; + const key = `${svmId}|${controlId || ""}`; + if (activeInits.has(key)) return; + activeInits.add(key); + const finish = () => activeInits.delete(key); let tries = 0; const run = () => { + // The chain outlives the view it was started for: while it is still + // POLLING there is no control to check isDestroyed on, so an app switch + // or an FLP teardown left it running for the rest of its 5 seconds - + // and because ids repeat across views, it could then resolve and wire + // the NEXT app's controls. Every other timer-shaped handler checks the + // controller first (see ViewOps evStartTimer); this one now does too. + if (Lib.isDestroyed(oController)) { + finish(); + return; + } const oSVM = ViewSlots.resolveById(svmId); const control = controlId ? ViewSlots.resolveById(controlId) : null; if (!oSVM || (controlId && !control)) { @@ -89,12 +111,14 @@ sap.ui.define(["z2ui5/core/Lib", "z2ui5/core/ViewSlots"], (Lib, ViewSlots) => { Lib.logError( `SMART_VARIANT_INIT: '${controlId ? `${svmId}' / '${controlId}` : svmId}' not found`, ); + finish(); return; } if (Lib.isDestroyed(oSVM) || typeof oSVM.initialise !== "function") { Lib.logError( `SMART_VARIANT_INIT: no SmartVariantManagement for id '${svmId}'`, ); + finish(); return; } let target = control; @@ -112,13 +136,20 @@ sap.ui.define(["z2ui5/core/Lib", "z2ui5/core/ViewSlots"], (Lib, ViewSlots) => { Lib.logError( `SMART_VARIANT_INIT: no personalizable control registered at '${svmId}'`, ); + finish(); return; } target = ViewSlots.resolveById(registered[0].getControl()); - if (!target) return; + if (!target) { + finish(); + return; + } } anchorPersoControl(oSVM, target); ensureInitialised(oSVM, target, 0); + // terminal for THIS chain: ensureInitialised has its own bounded + // retries and its own idempotence guards (wrapper.bInitialized) + finish(); }; run(); @@ -238,8 +269,21 @@ sap.ui.define(["z2ui5/core/Lib", "z2ui5/core/ViewSlots"], (Lib, ViewSlots) => { function evFilterBarVariantInit(oController, args) { const [, svmId, filterBarId] = args; + // Same two guards as evSmartVariantInit above, and for the same reasons - + // this handler has the identical poll-and-retry shape and had neither. + // FILTER_BAR_WIRED is not a substitute for the dedup: it is set only once + // BOTH controls resolve, so while the view is still building every + // re-issued action stacked another concurrent 5-second chain. + const key = `${svmId}|${filterBarId || ""}`; + if (activeInits.has(key)) return; + activeInits.add(key); + const finish = () => activeInits.delete(key); let tries = 0; const run = () => { + if (Lib.isDestroyed(oController)) { + finish(); + return; + } const oSVM = ViewSlots.resolveById(svmId); const oFilterBar = ViewSlots.resolveById(filterBarId); if (!oSVM || !oFilterBar) { @@ -251,6 +295,7 @@ sap.ui.define(["z2ui5/core/Lib", "z2ui5/core/ViewSlots"], (Lib, ViewSlots) => { Lib.logError( `FILTER_BAR_VARIANT_INIT: '${svmId}' / '${filterBarId}' not found`, ); + finish(); return; } if ( @@ -260,16 +305,25 @@ sap.ui.define(["z2ui5/core/Lib", "z2ui5/core/ViewSlots"], (Lib, ViewSlots) => { Lib.logError( `FILTER_BAR_VARIANT_INIT: no SmartVariantManagement for id '${svmId}'`, ); + finish(); return; } if (typeof oFilterBar.registerFetchData !== "function") { Lib.logError( `FILTER_BAR_VARIANT_INIT: no FilterBar for id '${filterBarId}'`, ); + finish(); + return; + } + if (oFilterBar[FILTER_BAR_WIRED]) { + finish(); return; } - if (oFilterBar[FILTER_BAR_WIRED]) return; oFilterBar[FILTER_BAR_WIRED] = true; + // past this point the bar is marked wired, so a later re-issue returns + // at the check above - the key has done its job and is released here + // rather than inside the async withPersonalizableInfo callback below + finish(); registerFilterBarCallbacks(oFilterBar); attachFilterBarChange(oSVM, oFilterBar); diff --git a/run/input/core/app/z2ui5/webapp/core/actions/ViewOps.js b/run/input/core/app/z2ui5/webapp/core/actions/ViewOps.js index 825157a..03272f0 100644 --- a/run/input/core/app/z2ui5/webapp/core/actions/ViewOps.js +++ b/run/input/core/app/z2ui5/webapp/core/actions/ViewOps.js @@ -37,7 +37,14 @@ sap.ui.define( // resolve the model through MAIN for those slots and apply the effective // (largest) limit across them; popup/popover keep their own model/limit. const modelKey = Lib.isRootModelSlot(viewKey) ? "MAIN" : viewKey; - const model = ViewSlots.getView(modelKey)?.getModel(); + // the TRACKED framework model, not blindly the default one: in switch + // mode the default slot holds the ODATA model and the app's bound + // tables live in the JSON model under http> - setting the limit on + // the wrong one made SET_SIZE_LIMIT a silent no-op there + const view = ViewSlots.getView(modelKey); + const model = view + ? (ViewSlots.trackedModel(view) ?? view.getModel()) + : undefined; if (model) { const effective = Lib.effectiveSizeLimit( AppState.state.viewSizeLimits, @@ -58,7 +65,16 @@ sap.ui.define( }); const oView = ViewSlots.getView("MAIN"); if (oView) { - oView.setModel(oModel, args[2] || undefined); + const name = args[2] || undefined; + // a framework-created OData model already sitting in that slot is + // replaced - destroy it, or each SET_ODATA_MODEL re-issue leaks a + // client (same marker discipline as actions/Slots displayMain) + const previous = oView.getModel(name); + oModel._z2ui5OwnedOData = true; + oView.setModel(oModel, name); + if (previous?._z2ui5OwnedOData && previous !== oModel) { + previous.destroy(); + } } else { // No view to attach to - release the model instead of leaking it. oModel.destroy(); @@ -292,9 +308,18 @@ sap.ui.define( function evWizardSetNextStep(oController, args) { try { - const wiz = ViewSlots.byId("MAIN", args[1]); - const step = ViewSlots.byId("MAIN", args[2]); - const nextStep = ViewSlots.byId("MAIN", args[3]); + // resolveById, not byId("MAIN", ...) - the rule this file states for + // the three handlers above holds here too: a Wizard inside a popup, + // popover or nested view is not in the MAIN slot, and the lookup + // silently found nothing there + const wiz = ViewSlots.resolveById(args[1]); + const step = ViewSlots.resolveById(args[2]); + const nextStep = ViewSlots.resolveById(args[3]); + if (!wiz || !step) { + Lib.logError( + `WIZARD_SET_NEXT_STEP: '${args[1]}' / '${args[2]}' not found`, + ); + } if (wiz && step) wiz.discardProgress(step); if (step && nextStep) step.setNextStep(nextStep); } catch (e) { diff --git a/run/input/core/app/z2ui5/webapp/devtools/Console.js b/run/input/core/app/z2ui5/webapp/devtools/Console.js index e6f6443..106376c 100644 --- a/run/input/core/app/z2ui5/webapp/devtools/Console.js +++ b/run/input/core/app/z2ui5/webapp/devtools/Console.js @@ -193,12 +193,24 @@ sap.ui.define([], () => { if ((depth || 0) >= MAX_DEPTH) return "[...]"; try { // A plain stringify covers arrays and objects; the replacer keeps a - // circular graph (a UI5 control reaches its parent) from throwing. + // circular graph (a UI5 control reaches its parent) from throwing - + // and it is ALSO where the depth cap has to live: stringify walks the + // graph itself, so the `depth` parameter above never counted anything + // and MAX_DEPTH was dead code while a console.log(oModel.getData()) + // serialized a multi-MB model in full before the 2000-char cut. The + // parent map answers "how deep is this node" without a second walk. const seen = new WeakSet(); - return JSON.stringify(value, (key, val) => { + const nodeDepth = new WeakMap(); + return JSON.stringify(value, function replace(key, val) { if (typeof val === "object" && val !== null) { if (seen.has(val)) return "[Circular]"; + const parent = + typeof this === "object" && this !== null + ? nodeDepth.get(this) || 0 + : 0; + if (parent >= MAX_DEPTH) return "[...]"; seen.add(val); + nodeDepth.set(val, parent + 1); } if (isErrorLike(val)) return val.stack || String(val); return val; diff --git a/run/input/core/app/z2ui5/webapp/devtools/DevTools.js b/run/input/core/app/z2ui5/webapp/devtools/DevTools.js index 3fdaaaa..e5adb37 100644 --- a/run/input/core/app/z2ui5/webapp/devtools/DevTools.js +++ b/run/input/core/app/z2ui5/webapp/devtools/DevTools.js @@ -19,15 +19,47 @@ // into - the overlay hides its Details button when nothing registered, // so removing this folder degrades the framework gracefully instead of // breaking it. +// +// LAZY here means the DIALOG CONTROL, not the modules. The dependencies +// below are hard `sap.ui.define` deps on purpose, and moving them behind +// `sap.ui.require([...], cb)` would not make the cold load smaller - it +// would break the tools on every ICF deployment. Three separate reasons, +// in the order they bite: +// +// 1. There is no second delivery path. On an ABAP system every frontend +// file arrives in ONE `sap.ui.require.preload` block inside the GET +// response (`z2ui5_cl_ui5f_preload`, generated from this folder), and +// the bootstrap sets `resourceroots {"z2ui5": "./"}` - the ICF node +// itself. A module dropped from that block is then fetched from the +// node, which answers every GET with the shell page: the loader gets +// `text/html` where it wanted a module, the define never runs and the +// require callback never fires. The tools would simply not open, with +// nothing naming the cause. That frontend files are NOT served as ICF +// resources at their raw URLs is AGENTS.md rule 18, and it is what +// makes lazy loading a delivery question rather than a loader one. +// 2. Requiring lazily WITHOUT dropping them from the preload saves +// nothing that is being paid - the bytes have already travelled, and +// only the factory execution moves. +// 3. Two of the three deps have to be eager anyway, and install() says +// why: a roundtrip history and a console capture are worth something +// only if they were collected BEFORE the problem, so they cannot wait +// for the first Ctrl+F12. +// +// Measured 2026-08-28: devtools/ is 32.7% of the preload's bytes, and at +// best 23.2% of it could ever be deferred (everything except Console, +// Recorder and this file). Making that real needs an on-demand delivery +// path for a module the page did not receive - a design change to the +// handler, not an edit here. sap.ui.define( [ "z2ui5/core/AppState", "z2ui5/core/Lib", "z2ui5/devtools/Console", "z2ui5/devtools/DeveloperTools", + "z2ui5/devtools/Picker", "z2ui5/devtools/Recorder", ], - (AppState, Lib, Console, DeveloperTools, Recorder) => { + (AppState, Lib, Console, DeveloperTools, Picker, Recorder) => { "use strict"; // Query parameter that opens the developer tools on page load, so a @@ -162,6 +194,12 @@ sap.ui.define( publish(null); Console.uninstall(); Recorder.uninstall(); + // A pick still running at teardown left its three capture listeners + // (mousemove/click/keydown) on document, and the click one calls + // preventDefault + stopPropagation - the NEXT app was then dead for + // exactly one click, with nothing naming the cause. Idempotent when + // no pick is active. + Picker.stop(); } return { diff --git a/run/input/core/app/z2ui5/webapp/devtools/DeveloperTools.js b/run/input/core/app/z2ui5/webapp/devtools/DeveloperTools.js index 5b4b4bc..f1a2d37 100644 --- a/run/input/core/app/z2ui5/webapp/devtools/DeveloperTools.js +++ b/run/input/core/app/z2ui5/webapp/devtools/DeveloperTools.js @@ -350,7 +350,11 @@ sap.ui.define( }, async onExport() { - Report.openDialog(AbapSource.appName(), await AbapSource.fetchSource()); + // the await is a network fetch to the ADT endpoint, so the dialog can + // be gone by the time it resolves - same guard its two siblings carry + const source = await AbapSource.fetchSource(); + if (Lib.isDestroyed(this)) return; + Report.openDialog(AbapSource.appName(), source); }, // Put what is shown on the clipboard. A CodeEditor has no select-all @@ -645,7 +649,7 @@ sap.ui.define( // The control itself renders nothing - it just provides the dialog // API. - renderer: { apiVersion: 2, render() {} }, + renderer: Lib.EMPTY_RENDERER, }); // The lifecycle around this control - creation, the Ctrl+F12 diff --git a/run/input/core/app/z2ui5/webapp/devtools/Inspect.js b/run/input/core/app/z2ui5/webapp/devtools/Inspect.js index 77d0b60..38a926a 100644 --- a/run/input/core/app/z2ui5/webapp/devtools/Inspect.js +++ b/run/input/core/app/z2ui5/webapp/devtools/Inspect.js @@ -157,7 +157,11 @@ sap.ui.define( } function modelAttributeCount(slotKey) { - const data = ViewSlots.getView(slotKey)?.getModel?.()?.getData?.(); + // the TRACKED framework model - in switch mode the default model is + // the app's OData client and this read came back empty + const data = ViewSlots.trackedModel( + ViewSlots.getView(slotKey), + )?.getData?.(); if (!data) return 0; return Object.keys(data).length; } @@ -697,7 +701,8 @@ sap.ui.define( function formatSlotBindings(slotKey) { const view = ViewSlots.getView(slotKey); if (!view) return []; - const model = view.getModel?.(); + // tracked resolver - see modelAttributeCount + const model = ViewSlots.trackedModel(view); const data = model?.getData?.(); if (!data) return []; const out = [section(`Slot ${slotKey}`)]; diff --git a/run/input/core/app/z2ui5/webapp/devtools/LiveEdit.js b/run/input/core/app/z2ui5/webapp/devtools/LiveEdit.js index 5606345..16eddec 100644 --- a/run/input/core/app/z2ui5/webapp/devtools/LiveEdit.js +++ b/run/input/core/app/z2ui5/webapp/devtools/LiveEdit.js @@ -65,8 +65,13 @@ sap.ui.define( try { // seq undefined: this display belongs to no roundtrip, so the // superseded-request guard must not discard it (Slots.isSuperseded - // treats undefined as "not superseded"). - await Slots.action("display", slotKey, xml, {}, undefined); + // treats undefined as "not superseded"). MAIN reuses the options of + // its last real display (switch-mode OData default model included) - + // an empty {} stripped them and broke the preview of exactly those + // apps. + const options = + slotKey === "MAIN" ? AppState.state.lastMainDisplayOptions || {} : {}; + await Slots.action("display", slotKey, xml, options, undefined); } catch (e) { Lib.logError("DevTools LiveEdit: applying the edited XML failed", e); return `Could not build the view: ${e?.message || e}`; diff --git a/run/input/core/app/z2ui5/webapp/devtools/Recorder.js b/run/input/core/app/z2ui5/webapp/devtools/Recorder.js index 74a1a41..12778cf 100644 --- a/run/input/core/app/z2ui5/webapp/devtools/Recorder.js +++ b/run/input/core/app/z2ui5/webapp/devtools/Recorder.js @@ -176,7 +176,16 @@ sap.ui.define(["z2ui5/core/AppState", "z2ui5/core/Lib"], (AppState, Lib) => { } catch { return; } - for (const entry of entries) acceptEntry(entry); + // backwards, stopping at the watermark: getEntriesByName returns the + // browser's WHOLE buffer for this url (chronological), and after N + // roundtrips the loop was N accept calls per roundtrip for at most a + // handful of new entries at the tail + const fresh = []; + for (let i = entries.length - 1; i >= 0; i -= 1) { + if (entries[i].startTime <= lastEntryStart) break; + fresh.push(entries[i]); + } + for (let i = fresh.length - 1; i >= 0; i -= 1) acceptEntry(fresh[i]); } // Take the network observation belonging to a render that happened at @@ -323,14 +332,18 @@ sap.ui.define(["z2ui5/core/AppState", "z2ui5/core/Lib"], (AppState, Lib) => { payloadBytes = 0; } - // Serialized size of the request body. This is the one number the - // recorder cannot get for free: Resource Timing exposes no request body - // size, so the body is serialized a second time here (Server.readHttp - // does the first one for the actual send). It is a DELTA - only the model - // paths the user edited travel - so the common case is a few hundred - // bytes. Returns null if it cannot be serialized. + // Serialized size of the request body. Server.readHttp already computed + // it for the actual send and parks the NUMBER on shared state + // (lastRequestBytes) - reading it is free. The stringify below is only + // the fallback for a body that never went through readHttp: the body is + // usually a small delta, but buildDeltaFromPaths falls back to a WHOLE + // attribute for non-cell paths, and re-serializing a multi-MB table once + // per roundtrip in the render phase - with payload recording off - was + // the recorder's one measurable standing cost. function measureRequest(oBody) { if (!oBody) return null; + const known = AppState.state.lastRequestBytes; + if (typeof known === "number") return known; try { return JSON.stringify({ value: oBody }).length; } catch { diff --git a/run/input/core/app/z2ui5/webapp/manifest.json b/run/input/core/app/z2ui5/webapp/manifest.json index b3b225e..d60ab42 100644 --- a/run/input/core/app/z2ui5/webapp/manifest.json +++ b/run/input/core/app/z2ui5/webapp/manifest.json @@ -8,7 +8,6 @@ }, "title": "abap2UI5", "description": "Create UI5 apps purely in ABAP", - "resources": "resources.json", "sourceTemplate": { "id": "@sap/generator-fiori:basic", "version": "1.15.0", diff --git a/run/input/core/package-lock.json b/run/input/core/package-lock.json index 8a5ca17..e218e31 100644 --- a/run/input/core/package-lock.json +++ b/run/input/core/package-lock.json @@ -8,5624 +8,17 @@ "name": "abap2UI5", "version": "1.0.0", "license": "MIT", - "dependencies": { - "openui5-dist": "1.113.0" - }, "engines": { "node": ">=22" - } - }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "license": "MIT" - }, - "node_modules/@simple-git/args-pathspec": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz", - "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==", - "license": "MIT" - }, - "node_modules/@simple-git/argv-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz", - "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==", - "license": "MIT", - "dependencies": { - "@simple-git/args-pathspec": "^1.0.3" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "license": "BSD-3-Clause" - }, - "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "license": "MIT" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "license": "BSD-2-Clause" - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT" - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "license": "MIT" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "license": "MIT", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "deprecated": "Use your platform's native DOMException instead", - "license": "MIT", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "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==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.5.tgz", - "integrity": "sha512-j23EibVLnp4zNXGW7LjryXYa2X6U/M96yoOX+ybZxwkYajdxRNEqYY3zhh7y0i6kfISKS2jr+EJq1YTUDEv5+w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "license": "MIT" - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "license": "MIT", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" }, "peerDependencies": { - "canvas": "^2.5.0" + "openui5-dist": "1.113.0" }, "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/npm": { - "version": "6.14.18", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.18.tgz", - "integrity": "sha512-p3SjqSchSuNQUqbJBgwdv0L3O6bKkaSfQrQzJsskNpNKLg0g37c5xTXFV0SqTlX9GWvoGxBELVJMRWq0J8oaLA==", - "bundleDependencies": [ - "abbrev", - "ansicolors", - "ansistyles", - "aproba", - "archy", - "bin-links", - "bluebird", - "byte-size", - "cacache", - "call-limit", - "chownr", - "ci-info", - "cli-columns", - "cli-table3", - "cmd-shim", - "columnify", - "config-chain", - "debuglog", - "detect-indent", - "detect-newline", - "dezalgo", - "editor", - "figgy-pudding", - "find-npm-prefix", - "fs-vacuum", - "fs-write-stream-atomic", - "gentle-fs", - "glob", - "graceful-fs", - "has-unicode", - "hosted-git-info", - "iferr", - "imurmurhash", - "infer-owner", - "inflight", - "inherits", - "ini", - "init-package-json", - "is-cidr", - "json-parse-better-errors", - "JSONStream", - "lazy-property", - "libcipm", - "libnpm", - "libnpmaccess", - "libnpmhook", - "libnpmorg", - "libnpmsearch", - "libnpmteam", - "libnpx", - "lock-verify", - "lockfile", - "lodash._baseindexof", - "lodash._baseuniq", - "lodash._bindcallback", - "lodash._cacheindexof", - "lodash._createcache", - "lodash._getnative", - "lodash.clonedeep", - "lodash.restparam", - "lodash.union", - "lodash.uniq", - "lodash.without", - "lru-cache", - "meant", - "mississippi", - "mkdirp", - "move-concurrently", - "node-gyp", - "nopt", - "normalize-package-data", - "npm-audit-report", - "npm-cache-filename", - "npm-install-checks", - "npm-lifecycle", - "npm-package-arg", - "npm-packlist", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "once", - "opener", - "osenv", - "pacote", - "path-is-inside", - "promise-inflight", - "qrcode-terminal", - "query-string", - "qw", - "read-cmd-shim", - "read-installed", - "read-package-json", - "read-package-tree", - "read", - "readable-stream", - "readdir-scoped-modules", - "request", - "retry", - "rimraf", - "safe-buffer", - "semver", - "sha", - "slide", - "sorted-object", - "sorted-union-stream", - "ssri", - "stringify-package", - "tar", - "text-table", - "tiny-relative-date", - "uid-number", - "umask", - "unique-filename", - "unpipe", - "update-notifier", - "uuid", - "validate-npm-package-license", - "validate-npm-package-name", - "which", - "worker-farm", - "write-file-atomic" - ], - "license": "Artistic-2.0", - "dependencies": { - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "^2.0.0", - "archy": "~1.0.0", - "bin-links": "^1.1.8", - "bluebird": "^3.7.2", - "byte-size": "^5.0.1", - "cacache": "^12.0.4", - "call-limit": "^1.1.1", - "chownr": "^1.1.4", - "ci-info": "^2.0.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.5.1", - "cmd-shim": "^3.0.3", - "columnify": "~1.5.4", - "config-chain": "^1.1.13", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "^1.0.4", - "editor": "~1.0.0", - "figgy-pudding": "^3.5.2", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.3.1", - "glob": "^7.2.3", - "graceful-fs": "^4.2.10", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.8.9", - "iferr": "^1.0.2", - "imurmurhash": "*", - "infer-owner": "^1.0.4", - "inflight": "~1.0.6", - "inherits": "^2.0.4", - "ini": "^1.3.8", - "init-package-json": "^1.10.3", - "is-cidr": "^3.1.1", - "json-parse-better-errors": "^1.0.2", - "JSONStream": "^1.3.5", - "lazy-property": "~1.0.0", - "libcipm": "^4.0.8", - "libnpm": "^3.0.1", - "libnpmaccess": "^3.0.2", - "libnpmhook": "^5.0.3", - "libnpmorg": "^1.0.1", - "libnpmsearch": "^2.0.2", - "libnpmteam": "^1.0.2", - "libnpx": "^10.2.4", - "lock-verify": "^2.2.2", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^5.1.1", - "meant": "^1.0.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.6", - "move-concurrently": "^1.0.1", - "node-gyp": "^5.1.1", - "nopt": "^4.0.3", - "normalize-package-data": "^2.5.0", - "npm-audit-report": "^1.3.3", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "^3.0.2", - "npm-lifecycle": "^3.1.5", - "npm-package-arg": "^6.1.1", - "npm-packlist": "^1.4.8", - "npm-pick-manifest": "^3.0.2", - "npm-profile": "^4.0.4", - "npm-registry-fetch": "^4.0.7", - "npm-user-validate": "^1.0.1", - "npmlog": "~4.1.2", - "once": "~1.4.0", - "opener": "^1.5.2", - "osenv": "^0.1.5", - "pacote": "^9.5.12", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", - "qrcode-terminal": "^0.12.0", - "query-string": "^6.14.1", - "qw": "^1.0.2", - "read": "~1.0.7", - "read-cmd-shim": "^1.0.5", - "read-installed": "~4.0.3", - "read-package-json": "^2.1.2", - "read-package-tree": "^5.3.1", - "readable-stream": "^3.6.0", - "readdir-scoped-modules": "^1.1.0", - "request": "^2.88.2", - "retry": "^0.12.0", - "rimraf": "^2.7.1", - "safe-buffer": "^5.2.1", - "semver": "^5.7.1", - "sha": "^3.0.0", - "slide": "~1.1.6", - "sorted-object": "~2.0.1", - "sorted-union-stream": "~2.1.3", - "ssri": "^6.0.2", - "stringify-package": "^1.0.1", - "tar": "^4.4.19", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "^1.1.1", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.4.0", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^1.3.1", - "worker-farm": "^1.7.0", - "write-file-atomic": "^2.4.3" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "6 >=6.2.0 || 8 || >=9.3.0" - } - }, - "node_modules/npm/node_modules/@iarna/cli": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.2", - "signal-exit": "^3.0.2" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/agent-base": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "3.5.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/npm/node_modules/ansi-align": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^2.0.0" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "3.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/ansicolors": { - "version": "0.3.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ansistyles": { - "version": "0.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/npm/node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/are-we-there-yet/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/asn1": { - "version": "0.2.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/npm/node_modules/assert-plus": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/asynckit": { - "version": "0.4.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/aws-sign2": { - "version": "0.7.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/aws4": { - "version": "1.11.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/npm/node_modules/bin-links": { - "version": "1.1.8", - "inBundle": true, - "license": "Artistic-2.0", - "dependencies": { - "bluebird": "^3.5.3", - "cmd-shim": "^3.0.0", - "gentle-fs": "^2.3.0", - "graceful-fs": "^4.1.15", - "npm-normalize-package-bin": "^1.0.0", - "write-file-atomic": "^2.3.0" - } - }, - "node_modules/npm/node_modules/bluebird": { - "version": "3.7.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/boxen": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/buffer-from": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/builtins": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/byline": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/byte-size": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "12.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/npm/node_modules/call-limit": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/camelcase": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/capture-stack-trace": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/caseless": { - "version": "0.12.0", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/chalk": { - "version": "2.4.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ci-info": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "2.0.10", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/cli-boxes": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "3.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.5.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/npm/node_modules/cliui": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/npm/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" - } - }, - "node_modules/npm/node_modules/code-point-at": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "1.9.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.1.1" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/colors": { - "version": "1.3.3", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.5.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "node_modules/npm/node_modules/combined-stream": { - "version": "1.0.8", - "inBundle": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/npm/node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/concat-stream/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/concat-stream/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/config-chain": { - "version": "1.1.13", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/npm/node_modules/configstore": { - "version": "3.1.5", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/copy-concurrently": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/npm/node_modules/copy-concurrently/node_modules/aproba": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/copy-concurrently/node_modules/iferr": { - "version": "0.1.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/core-util-is": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/create-error-class": { - "version": "3.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "capture-stack-trace": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "5.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/lru-cache": { - "version": "4.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/yallist": { - "version": "2.1.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/crypto-random-string": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/cyclist": { - "version": "0.2.2", - "inBundle": true - }, - "node_modules/npm/node_modules/dashdash": { - "version": "1.14.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/decamelize": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/decode-uri-component": { - "version": "0.2.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/npm/node_modules/deep-extend": { - "version": "0.6.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/define-properties": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/delayed-stream": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/detect-indent": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/detect-newline": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/dot-prop": { - "version": "4.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/dotenv": { - "version": "5.0.1", - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.6.0" - } - }, - "node_modules/npm/node_modules/duplexer3": { - "version": "0.1.4", - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/duplexify": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/npm/node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/duplexify/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/duplexify/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ecc-jsbn": { - "version": "0.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/npm/node_modules/editor": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "7.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.12", - "inBundle": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "~0.4.13" - } - }, - "node_modules/npm/node_modules/end-of-stream": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/errno": { - "version": "0.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/npm/node_modules/es-abstract": { - "version": "1.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/es-to-primitive": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/es6-promise": { - "version": "4.2.8", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/es6-promisify": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/npm/node_modules/escape-string-regexp": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/npm/node_modules/execa": { - "version": "0.7.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/execa/node_modules/get-stream": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/extend": { - "version": "3.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/extsprintf": { - "version": "1.3.0", - "engines": [ - "node >=0.6.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/figgy-pudding": { - "version": "3.5.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/filter-obj": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/find-npm-prefix": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/flush-write-stream": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "node_modules/npm/node_modules/flush-write-stream/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/flush-write-stream/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/flush-write-stream/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/flush-write-stream/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/forever-agent": { - "version": "0.6.1", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/form-data": { - "version": "2.3.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/npm/node_modules/from2": { - "version": "2.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/npm/node_modules/from2/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/from2/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/from2/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "1.2.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/npm/node_modules/fs-minipass/node_modules/minipass": { - "version": "2.9.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/npm/node_modules/fs-vacuum": { - "version": "1.2.10", - "inBundle": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" - } - }, - "node_modules/npm/node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "inBundle": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/iferr": { - "version": "0.1.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/fs-write-stream-atomic/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "2.7.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/npm/node_modules/gauge/node_modules/aproba": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/genfun": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gentle-fs": { - "version": "2.3.1", - "inBundle": true, - "license": "Artistic-2.0", - "dependencies": { - "aproba": "^1.1.2", - "chownr": "^1.1.2", - "cmd-shim": "^3.0.3", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "infer-owner": "^1.0.4", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" - } - }, - "node_modules/npm/node_modules/gentle-fs/node_modules/aproba": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/gentle-fs/node_modules/iferr": { - "version": "0.1.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/get-caller-file": { - "version": "2.0.5", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/npm/node_modules/get-stream": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/getpass": { - "version": "0.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/global-dirs": { - "version": "0.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/got": { - "version": "6.7.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/got/node_modules/get-stream": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/har-schema": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/har-validator": { - "version": "5.1.5", - "deprecated": "this library is no longer supported", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/npm/node_modules/har-validator/node_modules/fast-deep-equal": { - "version": "3.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/has-symbols": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "2.8.9", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "3.8.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "4", - "debug": "3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/npm/node_modules/http-signature": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "2.2.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.4.23", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/iferr": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/npm/node_modules/import-lazy": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "1.3.8", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "1.10.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/is-callable": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/is-ci": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ci-info": "^1.5.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/npm/node_modules/is-ci/node_modules/ci-info": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^2.0.10" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/is-date-object": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/is-installed-globally": { - "version": "0.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/is-npm": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/is-obj": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/is-path-inside": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/is-redirect": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/is-regex": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/is-retry-allowed": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/is-stream": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/is-symbol": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/is-typedarray": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isarray": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/isstream": { - "version": "0.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/jsbn": { - "version": "0.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-parse-better-errors": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-schema": { - "version": "0.4.0", - "inBundle": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/npm/node_modules/json-stringify-safe": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/JSONStream": { - "version": "1.3.5", - "inBundle": true, - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/jsprim": { - "version": "1.4.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/npm/node_modules/latest-version": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "package-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/lazy-property": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libcipm": { - "version": "4.0.8", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "ini": "^1.3.5", - "lock-verify": "^2.1.0", - "mkdirp": "^0.5.1", - "npm-lifecycle": "^3.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "pacote": "^9.1.0", - "read-package-json": "^2.0.13", - "rimraf": "^2.6.2", - "worker-farm": "^1.6.0" - } - }, - "node_modules/npm/node_modules/libnpm": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.3", - "find-npm-prefix": "^1.0.2", - "libnpmaccess": "^3.0.2", - "libnpmconfig": "^1.2.1", - "libnpmhook": "^5.0.3", - "libnpmorg": "^1.0.1", - "libnpmpublish": "^1.1.2", - "libnpmsearch": "^2.0.2", - "libnpmteam": "^1.0.2", - "lock-verify": "^2.0.2", - "npm-lifecycle": "^3.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "npm-profile": "^4.0.2", - "npm-registry-fetch": "^4.0.0", - "npmlog": "^4.1.2", - "pacote": "^9.5.3", - "read-package-json": "^2.0.13", - "stringify-package": "^1.0.0" - } - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "node_modules/npm/node_modules/libnpmconfig": { - "version": "1.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "figgy-pudding": "^3.5.1", - "find-up": "^3.0.0", - "ini": "^1.3.5" - } - }, - "node_modules/npm/node_modules/libnpmconfig/node_modules/find-up": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/libnpmconfig/node_modules/locate-path": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/libnpmconfig/node_modules/p-limit": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/libnpmconfig/node_modules/p-locate": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/libnpmconfig/node_modules/p-try": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "5.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "1.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^4.0.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" - } - }, - "node_modules/npm/node_modules/libnpx": { - "version": "10.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "dotenv": "^5.0.1", - "npm-package-arg": "^6.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.0", - "update-notifier": "^2.3.0", - "which": "^1.3.0", - "y18n": "^4.0.0", - "yargs": "^14.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/lock-verify": { - "version": "2.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@iarna/cli": "^2.1.0", - "npm-package-arg": "^6.1.0", - "semver": "^5.4.1" - }, - "bin": { - "lock-verify": "cli.js" - } - }, - "node_modules/npm/node_modules/lockfile": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" - } - }, - "node_modules/npm/node_modules/lodash._baseindexof": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash._baseuniq": { - "version": "4.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "node_modules/npm/node_modules/lodash._bindcallback": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash._cacheindexof": { - "version": "3.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash._createcache": { - "version": "3.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "lodash._getnative": "^3.0.0" - } - }, - "node_modules/npm/node_modules/lodash._createset": { - "version": "4.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash._getnative": { - "version": "3.9.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash._root": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash.clonedeep": { - "version": "4.5.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash.restparam": { - "version": "3.6.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash.union": { - "version": "4.6.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash.uniq": { - "version": "4.5.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lodash.without": { - "version": "4.4.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/lowercase-keys": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "5.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/npm/node_modules/make-dir": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - } - }, - "node_modules/npm/node_modules/meant": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mime-db": { - "version": "1.35.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/mime-types": { - "version": "2.1.19", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mime-db": "~1.35.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/minimist": { - "version": "1.2.6", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/minizlib": { - "version": "1.3.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "2.9.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/npm/node_modules/mississippi": { - "version": "3.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "0.5.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/npm/node_modules/move-concurrently": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/npm/node_modules/move-concurrently/node_modules/aproba": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.7", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-fetch-npm": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "5.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "4.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "2.5.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/npm/node_modules/normalize-package-data/node_modules/resolve": { - "version": "1.10.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-parse": "^1.0.6" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "1.3.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/npm-cache-filename": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "3.0.2", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^2.3.0 || 3.x || 4 || 5" - } - }, - "node_modules/npm/node_modules/npm-lifecycle": { - "version": "3.1.5", - "inBundle": true, - "license": "Artistic-2.0", - "dependencies": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" - } - }, - "node_modules/npm/node_modules/npm-logical-tree": { - "version": "1.2.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "6.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "1.4.8", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.1.2 || 2", - "figgy-pudding": "^3.4.1", - "npm-registry-fetch": "^4.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "4.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "JSONStream": "^1.3.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/npm-run-path": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/npmlog": { - "version": "4.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/npm/node_modules/number-is-nan": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/oauth-sign": { - "version": "0.9.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/object-assign": { - "version": "4.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/object-keys": { - "version": "1.0.12", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/object.getownpropertydescriptors": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/os-homedir": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/os-tmpdir": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/osenv": { - "version": "0.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/npm/node_modules/p-finally": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/package-json": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "9.5.12", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - } - }, - "node_modules/npm/node_modules/pacote/node_modules/minipass": { - "version": "2.9.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/npm/node_modules/parallel-transform": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/npm/node_modules/parallel-transform/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/parallel-transform/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/parallel-transform/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/parallel-transform/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/path-exists": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/path-is-inside": { - "version": "1.0.2", - "inBundle": true, - "license": "(WTFPL OR MIT)" - }, - "node_modules/npm/node_modules/path-key": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/path-parse": { - "version": "1.0.7", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/performance-now": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/pify": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/prepend-http": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/process-nextick-args": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/npm/node_modules/promise-retry/node_modules/retry": { - "version": "0.10.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/proto-list": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/protoduck": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "genfun": "^5.0.0" - } - }, - "node_modules/npm/node_modules/prr": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/pseudomap": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/psl": { - "version": "1.9.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/pump": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/npm/node_modules/pumpify": { - "version": "1.5.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/npm/node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/qs": { - "version": "6.5.3", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/npm/node_modules/query-string": { - "version": "6.14.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/qw": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/rc": { - "version": "1.2.8", - "inBundle": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2" - } - }, - "node_modules/npm/node_modules/read-installed": { - "version": "4.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.2" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "2.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "node_modules/npm/node_modules/read-package-tree": { - "version": "5.3.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/registry-auth-token": { - "version": "3.4.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/npm/node_modules/registry-url": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/request": { - "version": "2.88.2", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/require-directory": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/require-main-filename": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/resolve-from": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "2.7.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/npm/node_modules/run-queue": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.1.1" - } - }, - "node_modules/npm/node_modules/run-queue/node_modules/aproba": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/semver": { - "version": "5.7.1", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm/node_modules/semver-diff": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^5.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/sha": { - "version": "3.0.0", - "inBundle": true, - "license": "(BSD-2-Clause OR MIT)", - "dependencies": { - "graceful-fs": "^4.1.2" - } - }, - "node_modules/npm/node_modules/shebang-command": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/slide": { - "version": "1.1.6", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.3.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - }, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "4.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "4.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/npm/node_modules/sorted-object": { - "version": "2.0.1", - "inBundle": true, - "license": "(WTFPL OR MIT)" - }, - "node_modules/npm/node_modules/sorted-union-stream": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" - } - }, - "node_modules/npm/node_modules/sorted-union-stream/node_modules/from2": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" - } - }, - "node_modules/npm/node_modules/sorted-union-stream/node_modules/isarray": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/sorted-union-stream/node_modules/readable-stream": { - "version": "1.1.14", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/npm/node_modules/sorted-union-stream/node_modules/string_decoder": { - "version": "0.10.31", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.0.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.1.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.5", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/split-on-first": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/sshpk": { - "version": "1.17.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ssri": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/npm/node_modules/stream-each": { - "version": "1.2.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/npm/node_modules/stream-iterate": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" - } - }, - "node_modules/npm/node_modules/stream-iterate/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/stream-iterate/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/stream-iterate/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/stream-iterate/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/stream-shift": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/strict-uri-encode": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/string-width": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/stringify-package": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/strip-eof": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/strip-json-comments": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "5.4.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "4.4.19", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "2.9.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/npm/node_modules/tar/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tar/node_modules/yallist": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/term-size": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "execa": "^0.7.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/through": { - "version": "2.3.8", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/through2": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "node_modules/npm/node_modules/through2/node_modules/readable-stream": { - "version": "2.3.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/npm/node_modules/through2/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/through2/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/timed-out": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tough-cookie": { - "version": "2.5.0", - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/tough-cookie/node_modules/punycode": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/tunnel-agent": { - "version": "0.6.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/tweetnacl": { - "version": "0.14.5", - "inBundle": true, - "license": "Unlicense" - }, - "node_modules/npm/node_modules/typedarray": { - "version": "0.0.6", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/uid-number": { - "version": "0.0.6", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/umask": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/npm/node_modules/unique-string": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "crypto-random-string": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/unpipe": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/unzip-response": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/update-notifier": { - "version": "2.5.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/uri-js": { - "version": "4.4.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/npm/node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/url-parse-lax": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/util-extend": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/util-promisify": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "node_modules/npm/node_modules/uuid": { - "version": "3.4.0", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "inBundle": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/npm/node_modules/verror": { - "version": "1.10.0", - "engines": [ - "node >=0.6.0" - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "1.3.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/npm/node_modules/which-module": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2" - } - }, - "node_modules/npm/node_modules/wide-align/node_modules/string-width": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/widest-line": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/worker-farm": { - "version": "1.7.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "5.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "2.4.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/npm/node_modules/xdg-basedir": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/xtend": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/npm/node_modules/y18n": { - "version": "4.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/yallist": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/yargs": { - "version": "14.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "node_modules/npm/node_modules/yargs-parser": { - "version": "15.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/npm/node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/p-try": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nwsapi": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.24.tgz", - "integrity": "sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==", - "license": "MIT" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/openui5-dist": { - "version": "1.113.0", - "resolved": "https://registry.npmjs.org/openui5-dist/-/openui5-dist-1.113.0.tgz", - "integrity": "sha512-H6XXTtJIaqXWLGKkyiRtVNjz3QYV36igEAtOg7Breo4+cbdFnSawUqgFM8JxeX/6IVTVDibILXOT6nqhshK9JQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "Apache-2.0", - "dependencies": { - "jsdom": "^16.5.0", - "lodash": "^4.17.15", - "npm": "^6.13.6", - "request": "^2.88.0", - "semver": "^6.3.0", - "simple-git": "^3.3.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", - "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/simple-git": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz", - "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==", - "license": "MIT", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "@simple-git/args-pathspec": "^1.0.3", - "@simple-git/argv-parser": "^1.1.0", - "debug": "^4.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "license": "Unlicense" - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "license": "MIT", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "license": "MIT", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ws": { - "version": "7.5.11", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", - "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "openui5-dist": { "optional": true } } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "license": "Apache-2.0" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "license": "MIT" } } } diff --git a/run/input/core/package.json b/run/input/core/package.json index 3565d8a..ba82880 100644 --- a/run/input/core/package.json +++ b/run/input/core/package.json @@ -53,8 +53,13 @@ "./z2ui5_port": "./srv/z2ui5/z2ui5_port.js", "./register-apps": "./srv/z2ui5/register-apps.js" }, - "dependencies": { + "peerDependencies": { "openui5-dist": "1.113.0" }, + "peerDependenciesMeta": { + "openui5-dist": { + "optional": true + } + }, "types": "./types/index.d.ts" } diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_000.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_000.js index e276b1b..c0af3cc 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_000.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_000.js @@ -239,7 +239,7 @@ class z2ui5_cl_smp_app_000 extends z2ui5_if_app { open_url({ href } = {}) { let result = ``; - result = this.client.follow_up_action(z2ui5_if_client.cs_event.urlhelper, [`REDIRECT`, `{ URL: '${href}', NEW_WINDOW: true }`]); + result = this.client.follow_up_action_result(z2ui5_if_client.cs_event.urlhelper, [`REDIRECT`, `{ URL: '${href}', NEW_WINDOW: true }`]); return result; } @@ -267,7 +267,7 @@ class z2ui5_cl_smp_app_000 extends z2ui5_if_app { get_catalog() { let result = []; let sy_datum = ""; - result = z2ui5_cl_util.abap_tab_assign(result, [{ group: `samples`, header: `Basics I`, sub: `Hello World, the Smallest App`, keywords: `hello world smallest first app minimal start here template`, path: `src/01`, app: `z2ui5_cl_smp_app_493` }, { group: `samples`, header: `Basics II`, sub: `Data Binding: Input and Button`, keywords: `binding _bind model attribute value input button serialize`, path: `src/01`, app: `z2ui5_cl_smp_app_494` }, { group: `samples`, header: `Basics III`, sub: `Lifecycle: Init, Event, Navigated`, keywords: `lifecycle roundtrip main dispatcher state serialize check_on_init check_on_event check_on_navigated`, path: `src/01`, app: `z2ui5_cl_smp_app_495` }, { group: `samples`, header: `Basics IV`, sub: `Events, Views and Roundtrips`, keywords: `roundtrip restart second view uncaught error controller basics`, path: `src/01`, app: `z2ui5_cl_smp_app_004` }, { group: `samples`, header: `Basics V`, sub: `The Developer Tools (Ctrl+F12)`, keywords: `developer tools devtools ctrl f12 debug inspect payload previous request response view xml view model source code log error adt export`, path: `src/01`, app: `z2ui5_cl_smp_app_496` }, { group: `samples`, header: `Binding`, sub: `Currency Amounts (sap.ui.model.type.Currency)`, keywords: `amount decimals leading zeros number format`, path: `src/01`, app: `z2ui5_cl_smp_app_067` }, { group: `samples`, header: `Binding`, sub: `Dynamic Table Typed at Runtime (RTTI)`, keywords: `generic data reference create data ddic dynamic itab`, path: `src/01`, app: `z2ui5_cl_smp_app_061` }, { group: `samples`, header: `Binding`, sub: `Expression Binding, Types and Composite Parts`, keywords: `formatter parts conditional regexp visible enabled syntax`, path: `src/01`, app: `z2ui5_cl_smp_app_027` }, { group: `samples`, header: `Binding`, sub: `Model setSizeLimit for Large Tables (A)`, keywords: `combobox jsonmodel size limit large itab 100 entries`, path: `src/01`, app: `z2ui5_cl_smp_app_071` }, { group: `samples`, header: `Binding`, sub: `Single Table Cell (tab_index)`, keywords: `cell input internal table row field level`, path: `src/01`, app: `z2ui5_cl_smp_app_144` }, { group: `samples`, header: `Binding`, sub: `Structure Fields and INCLUDEs`, keywords: `structure component include flat form level`, path: `src/01`, app: `z2ui5_cl_smp_app_166` }, { group: `samples`, header: `Binding`, sub: `Types for Integer, Decimal, Date and Time`, keywords: `type conversion sum amount number field`, path: `src/01`, app: `z2ui5_cl_smp_app_047` }, { group: `samples`, header: `Browser`, sub: `Copy to Clipboard (A)`, keywords: `clipboard paste copy text area`, path: `src/01`, app: `z2ui5_cl_smp_app_325` }, { group: `samples`, header: `Browser`, sub: `Local and Session Storage (A,C)`, keywords: `localstorage sessionstorage persist store_data offline`, path: `src/01`, app: `z2ui5_cl_smp_app_327` }, { group: `samples`, header: `Browser`, sub: `Logout from the Client (A)`, keywords: `logoff signout icf session end fiori launchpad`, path: `src/01`, app: `z2ui5_cl_smp_app_361` }, { group: `samples`, header: `Browser`, sub: `Open a URL in a New Tab (A)`, keywords: `url window open_new_tab link target`, path: `src/01`, app: `z2ui5_cl_smp_app_073` }, { group: `samples`, header: `Browser`, sub: `Open Mail, Phone and SMS Links (A)`, keywords: `mailto tel sms urlhelper redirect native link`, path: `src/01`, app: `z2ui5_cl_smp_app_316` }, { group: `samples`, header: `Browser`, sub: `Reload the Page (A)`, keywords: `reload refresh restart location_reload url`, path: `src/01`, app: `z2ui5_cl_smp_app_492` }, { group: `samples`, header: `Browser`, sub: `Set the Tab Favicon (A)`, keywords: `favicon icon tab image data uri`, path: `src/01`, app: `z2ui5_cl_smp_app_491` }, { group: `samples`, header: `Browser`, sub: `Set the Tab Title (A)`, keywords: `document.title tab caption headline set_title`, path: `src/01`, app: `z2ui5_cl_smp_app_125` }, { group: `samples`, header: `Browser`, sub: `Soft Keyboard Mode on Mobile (A)`, keywords: `mobile numeric keypad keyboard_set_mode phone input`, path: `src/01`, app: `z2ui5_cl_smp_app_352` }, { group: `samples`, header: `Control Behaviour`, sub: `Expand a Panel by ID (setExpanded) (A)`, keywords: `panel collapse expand setexpanded control_by_id whitelisted`, path: `src/01`, app: `z2ui5_cl_smp_app_448` }, { group: `samples`, header: `Control Behaviour`, sub: `MultiInput with Tokens (C)`, keywords: `multiinput token tokens suggestion custom control`, path: `src/01`, app: `z2ui5_cl_smp_app_078` }, { group: `samples`, header: `Control Behaviour`, sub: `Open the PDF Viewer by ID (A)`, keywords: `pdfviewer pdf document viewer popup control_by_id whitelisted`, path: `src/01`, app: `z2ui5_cl_smp_app_449` }, { group: `samples`, header: `Control Behaviour`, sub: `Switch NavContainer Page by ID (A)`, keywords: `navcontainer icontabbar icontabheader page switch control_by_id whitelisted`, path: `src/01`, app: `z2ui5_cl_smp_app_088` }, { group: `samples`, header: `Control Behaviour`, sub: `Wizard with Steps (A)`, keywords: `wizard step branching discardprogress setnextstep control_by_id`, path: `src/01`, app: `z2ui5_cl_smp_app_202` }, { group: `samples`, header: `CSS`, sub: `Color Table Cells from the Backend`, keywords: `color background conditional formatting style data attribute`, path: `src/01`, app: `z2ui5_cl_smp_app_305` }, { group: `samples`, header: `CSS`, sub: `FlexBox Layouts with Custom Classes`, keywords: `flexbox layout responsive navigation tile panel`, path: `src/01`, app: `z2ui5_cl_smp_app_255` }, { group: `samples`, header: `CSS`, sub: `Ship Your Own CSS with the View`, keywords: `style stylesheet inline html class own design`, path: `src/01`, app: `z2ui5_cl_smp_app_050` }, { group: `samples`, header: `Device`, sub: `Camera, Take Photos (C)`, keywords: `camera photo picture webcam capture facing mode`, path: `src/01`, app: `z2ui5_cl_smp_app_306` }, { group: `samples`, header: `Device`, sub: `Device Model: Phone, Tablet, Desktop (A)`, keywords: `sap.ui.device responsive orientation resize media model`, path: `src/01`, app: `z2ui5_cl_smp_app_445` }, { group: `samples`, header: `Device`, sub: `Frontend Info: UI5 Version, Theme, OS, Browser`, keywords: `client info ui5 version theme os user agent device`, path: `src/01`, app: `z2ui5_cl_smp_app_122` }, { group: `samples`, header: `Device`, sub: `Geolocation from the Browser (C)`, keywords: `gps position latitude longitude altitude location`, path: `src/01`, app: `z2ui5_cl_smp_app_120` }, { group: `samples`, header: `Event`, sub: `Control Objects in t_arg (FacetFilter)`, keywords: `facetfilter filter object marshalling selected items`, path: `src/01`, app: `z2ui5_cl_smp_app_197` }, { group: `samples`, header: `Event`, sub: `Extra Arguments with t_arg`, keywords: `argument parameter payload event data fixed value`, path: `src/01`, app: `z2ui5_cl_smp_app_167` }, { group: `samples`, header: `Event`, sub: `Keyboard Shortcuts, Ctrl+S (A)`, keywords: `shortcut hotkey ctrl key combination keyboard_shortcut`, path: `src/01`, app: `z2ui5_cl_smp_app_471` }, { group: `samples`, header: `Event`, sub: `Link with preventDefault (A)`, keywords: `link href default action check_prevent_default`, path: `src/01`, app: `z2ui5_cl_smp_app_472` }, { group: `samples`, header: `File`, sub: `Download to the Browser (A)`, keywords: `export save base64 attachment xstring document`, path: `src/01`, app: `z2ui5_cl_smp_app_186` }, { group: `samples`, header: `File`, sub: `Upload to the Backend (C)`, keywords: `fileuploader base64 attachment import picture document`, path: `src/01`, app: `z2ui5_cl_smp_app_074` }, { group: `samples`, header: `Focus`, sub: `Focus a Table Cell by Column and Row (A)`, keywords: `table cell column row aggregation set_focus`, path: `src/01`, app: `z2ui5_cl_smp_app_421` }, { group: `samples`, header: `Focus`, sub: `Jump to the Next Input on Enter (A)`, keywords: `cursor enter tab next field form set_focus`, path: `src/01`, app: `z2ui5_cl_smp_app_189` }, { group: `samples`, header: `Focus`, sub: `Set Focus and Select Text in an Input (A)`, keywords: `cursor set_focus selection position textfield`, path: `src/01`, app: `z2ui5_cl_smp_app_133` }, { group: `samples`, header: `Formatter`, sub: `ABAP Date and Time Strings (DATS/TIMS)`, keywords: `dats tims conversion initial date 00000000 sy-datum`, path: `src/01`, app: `z2ui5_cl_smp_app_450` }, { group: `samples`, header: `Formatter`, sub: `Date Object for the DatePicker`, keywords: `datepicker datevalue javascript date object iso`, path: `src/01`, app: `z2ui5_cl_smp_app_457` }, { group: `samples`, header: `Formatter`, sub: `Date Objects for the PlanningCalendar`, keywords: `planningcalendar appointment javascript date object iso`, path: `src/01`, app: `z2ui5_cl_smp_app_456` }, { group: `samples`, header: `Formatter`, sub: `Inline Icons in a Text`, keywords: `icon glyph placeholder text status expandinlineicons`, path: `src/01`, app: `z2ui5_cl_smp_app_466` }, { group: `samples`, header: `Formatter`, sub: `When Not to Use One: Compute in ABAP`, keywords: `no formatter computed backend thin frontend prepare`, path: `src/01`, app: `z2ui5_cl_smp_app_453` }, { group: `samples`, header: `Grid Table`, sub: `Events on Cell Level`, keywords: `cell enter row index event grid alv`, path: `src/01`, app: `z2ui5_cl_smp_app_160` }, { group: `samples`, header: `Grid Table`, sub: `Full Example with sap.ui.table`, keywords: `grid alv dynamicpage column row action currency search sort filter`, path: `src/01`, app: `z2ui5_cl_smp_app_070` }, { group: `samples`, header: `Grid Table`, sub: `Keep Column Filters on Refresh (C)`, keywords: `column filter reset refresh uitableext grid alv`, path: `src/01`, app: `z2ui5_cl_smp_app_143` }, { group: `samples`, header: `List`, sub: `Filter and Sort the Binding from ABAP (A)`, keywords: `binding_call getbinding sorter filter follow_up_action`, path: `src/01`, app: `z2ui5_cl_smp_app_454` }, { group: `samples`, header: `List`, sub: `Live Filter on the Client, No Roundtrip (A)`, keywords: `binding_call live search client side no roundtrip filter`, path: `src/01`, app: `z2ui5_cl_smp_app_455` }, { group: `samples`, header: `List`, sub: `StandardListItem, Highlight and Events`, keywords: `sap.m.list standardlistitem highlight infostate press selection`, path: `src/01`, app: `z2ui5_cl_smp_app_048` }, { group: `samples`, header: `Menu`, sub: `Full Path of the Selected Item (A)`, keywords: `menuitem nested submenu textpath controller path`, path: `src/01`, app: `z2ui5_cl_smp_app_473` }, { group: `samples`, header: `Menu`, sub: `Menu Button with core:require`, keywords: `menubutton menuitem popover messagetoast require module`, path: `src/01`, app: `z2ui5_cl_smp_app_163` }, { group: `samples`, header: `Message`, sub: `Message Model and MessageManager (C)`, keywords: `messagemanager validation target field state central model`, path: `src/01`, app: `z2ui5_cl_smp_app_467` }, { group: `samples`, header: `Message`, sub: `MessageBox from SY, BAPIRET2 or Exception`, keywords: `t100 message class number exception cx_root error abend`, path: `src/01`, app: `z2ui5_cl_smp_app_008` }, { group: `samples`, header: `Message`, sub: `MessageBox, Types and Custom Actions`, keywords: `confirm warning error success information dialog action`, path: `src/01`, app: `z2ui5_cl_smp_app_382` }, { group: `samples`, header: `Message`, sub: `MessagePopover URL Policy (A)`, keywords: `url policy link security validator relative allow deny`, path: `src/01`, app: `z2ui5_cl_smp_app_474` }, { group: `samples`, header: `Message`, sub: `MessageToast, Text and Duration`, keywords: `toast notification duration position animation`, path: `src/01`, app: `z2ui5_cl_smp_app_381` }, { group: `samples`, header: `Message`, sub: `MessageView and MessagePopover (A)`, keywords: `messagepopover messageitem dialog grouped message list`, path: `src/01`, app: `z2ui5_cl_smp_app_452` }, { group: `samples`, header: `Navigation`, sub: `Call and Leave Apps (nav_app_call)`, keywords: `nav_app_call nav_app_leave sub app stack call back`, path: `src/01`, app: `z2ui5_cl_smp_app_024` }, { group: `samples`, header: `Navigation`, sub: `Data Loss Protection on Leaving (A,C)`, keywords: `dirty unsaved changes leave confirmation warning`, path: `src/01`, app: `z2ui5_cl_smp_app_279` }, { group: `samples`, header: `Navigation`, sub: `Return Data and Events to the Caller`, keywords: `r_data result get_app_prev return event payload`, path: `src/01`, app: `z2ui5_cl_smp_app_488` }, { group: `samples`, header: `Navigation`, sub: `Uncaught Error and Error Popup`, keywords: `exception dump error handling debugtool restart retry`, path: `src/01`, app: `z2ui5_cl_smp_app_464` }, { group: `samples`, header: `Nested View`, sub: `Basic Example (nest_view_display)`, keywords: `nest_view_display rerender model refresh sub view`, path: `src/01`, app: `z2ui5_cl_smp_app_065` }, { group: `samples`, header: `Nested View`, sub: `Embed Another App's View`, keywords: `sub app class embed instantiate another app rtti`, path: `src/01`, app: `z2ui5_cl_smp_app_104` }, { group: `samples`, header: `Nested View`, sub: `Master-Detail with FlexibleColumnLayout`, keywords: `fcl master detail list report two column split`, path: `src/01`, app: `z2ui5_cl_smp_app_097` }, { group: `samples`, header: `Nested View`, sub: `Three Columns with FlexibleColumnLayout`, keywords: `fcl three column detail detail deep navigation`, path: `src/01`, app: `z2ui5_cl_smp_app_098` }, { group: `samples`, header: `Popover`, sub: `Basic Example with Placement`, keywords: `placement anchor button confirm cancel popover_display`, path: `src/01`, app: `z2ui5_cl_smp_app_026` }, { group: `samples`, header: `Popover`, sub: `Open from a Table Row`, keywords: `list report dynamicpage row link details table`, path: `src/01`, app: `z2ui5_cl_smp_app_052` }, { group: `samples`, header: `Popover`, sub: `Open Together with the View Build`, keywords: `initial render one roundtrip anchor button`, path: `src/01`, app: `z2ui5_cl_smp_app_490` }, { group: `samples`, header: `Popover`, sub: `QuickView Contact Card`, keywords: `quickview contact card links grouped fields`, path: `src/01`, app: `z2ui5_cl_smp_app_109` }, { group: `samples`, header: `Popover`, sub: `Select from a List`, keywords: `list selection placement anchor`, path: `src/01`, app: `z2ui5_cl_smp_app_081` }, { group: `samples`, header: `Popover`, sub: `Toggle by ID (toggleBy) (A)`, keywords: `toggleby open close control_by_id whitelisted`, path: `src/01`, app: `z2ui5_cl_smp_app_465` }, { group: `samples`, header: `Popup`, sub: `Dialog inside a Dialog`, keywords: `nested stack popup in popup second dialog`, path: `src/01`, app: `z2ui5_cl_smp_app_161` }, { group: `samples`, header: `Popup`, sub: `Element Binding to the Selected Row (A)`, keywords: `element binding relative path aggregation dialog row`, path: `src/01`, app: `z2ui5_cl_smp_app_470` }, { group: `samples`, header: `Popup`, sub: `Navigate between Dialogs (NavContainer) (A)`, keywords: `navcontainer dialog pages back forward`, path: `src/01`, app: `z2ui5_cl_smp_app_170` }, { group: `samples`, header: `Popup`, sub: `Value Help: Suggestions and F4 Dialog`, keywords: `f4 search help suggestion input dialog select`, path: `src/01`, app: `z2ui5_cl_smp_app_009` }, { group: `samples`, header: `Popup`, sub: `Ways to Open a Dialog (A)`, keywords: `dialog sub app destroy rerender background view`, path: `src/01`, app: `z2ui5_cl_smp_app_012` }, { group: `samples`, header: `Scroll`, sub: `Scroll a Control into View (A)`, keywords: `scroll_into_view control id validation jump`, path: `src/01`, app: `z2ui5_cl_smp_app_363` }, { group: `samples`, header: `Scroll`, sub: `Scroll to a Pixel Position (A)`, keywords: `position pixel scroll_to restore refresh toolbar`, path: `src/01`, app: `z2ui5_cl_smp_app_362` }, { group: `samples`, header: `Table`, sub: `Drag and Drop Rows (A)`, keywords: `dnd dragdropinfo reorder rows move`, path: `src/01`, app: `z2ui5_cl_smp_app_459` }, { group: `samples`, header: `Table`, sub: `Editable Cells, Add and Delete Rows`, keywords: `edit input add row delete multiselect toolbar`, path: `src/01`, app: `z2ui5_cl_smp_app_011` }, { group: `samples`, header: `Table`, sub: `Filter Rows in the Backend`, keywords: `filter server side form growing where`, path: `src/01`, app: `z2ui5_cl_smp_app_045` }, { group: `samples`, header: `Table`, sub: `Large Table with Growing and ScrollContainer`, keywords: `growing 10000 rows sticky toolbar sort performance`, path: `src/01`, app: `z2ui5_cl_smp_app_006` }, { group: `samples`, header: `Table`, sub: `Live Search with Parallel Requests`, keywords: `live search parallel requests busy queue typing`, path: `src/01`, app: `z2ui5_cl_smp_app_059` }, { group: `samples`, header: `Table`, sub: `Search in the Backend (SearchField)`, keywords: `search go enter server side where`, path: `src/01`, app: `z2ui5_cl_smp_app_053` }, { group: `samples`, header: `Table`, sub: `Selection Modes: Single and Multi Select`, keywords: `selectionmode none single multi segmentedbutton checkbox`, path: `src/01`, app: `z2ui5_cl_smp_app_019` }, { group: `samples`, header: `Templating`, sub: `Build Columns Dynamically (template:repeat)`, keywords: `template repeat runtime generated columns if then else`, path: `src/01`, app: `z2ui5_cl_smp_app_173` }, { group: `samples`, header: `Templating`, sub: `Dynamic Content in a Nested View`, keywords: `template repeat runtime generated nested nest_view_display`, path: `src/01`, app: `z2ui5_cl_smp_app_176` }, { group: `samples`, header: `Timer`, sub: `Progress Indicator during a Backend Call (A)`, keywords: `progressindicator busy wait long running backend`, path: `src/01`, app: `z2ui5_cl_smp_app_064` }, { group: `samples`, header: `Timer`, sub: `Refresh the View Every n Seconds (A)`, keywords: `interval polling auto refresh follow_up_action seconds`, path: `src/01`, app: `z2ui5_cl_smp_app_028` }, { group: `samples`, header: `Tree`, sub: `Drag and Drop Nodes (A,C)`, keywords: `dnd move node hierarchy binding context`, path: `src/01`, app: `z2ui5_cl_smp_app_461` }, { group: `samples`, header: `Tree`, sub: `Editable Nodes with CustomTreeItem (C)`, keywords: `customtreeitem rename input binding write back`, path: `src/01`, app: `z2ui5_cl_smp_app_463` }, { group: `samples`, header: `Tree`, sub: `Inside a Dialog (C)`, keywords: `popup expand state hierarchy nodes`, path: `src/01`, app: `z2ui5_cl_smp_app_462` }, { group: `samples`, header: `Tree`, sub: `Nested ABAP Table in a sap.m.Tree`, keywords: `hierarchy nodes nested json items`, path: `src/01`, app: `z2ui5_cl_smp_app_460` }]); + result = z2ui5_cl_util.abap_tab_assign(result, [{ group: `samples`, header: `Basics I`, sub: `Hello World, the Smallest App`, keywords: `hello world smallest first app minimal start here template`, path: `src/01`, app: `z2ui5_cl_smp_app_493` }, { group: `samples`, header: `Basics II`, sub: `Data Binding: Input and Button`, keywords: `binding _bind model attribute value input button serialize`, path: `src/01`, app: `z2ui5_cl_smp_app_494` }, { group: `samples`, header: `Basics III`, sub: `Lifecycle: Init, Event, Navigated`, keywords: `lifecycle roundtrip main dispatcher state serialize check_on_init check_on_event check_on_navigated`, path: `src/01`, app: `z2ui5_cl_smp_app_495` }, { group: `samples`, header: `Basics IV`, sub: `Events, Views and Roundtrips`, keywords: `roundtrip restart second view uncaught error controller basics`, path: `src/01`, app: `z2ui5_cl_smp_app_004` }, { group: `samples`, header: `Basics V`, sub: `The Developer Tools (Ctrl+F12)`, keywords: `developer tools devtools ctrl f12 debug inspect payload previous request response view xml view model source code log error adt export`, path: `src/01`, app: `z2ui5_cl_smp_app_496` }, { group: `samples`, header: `Binding`, sub: `A View Built From RTTI, No Field Named`, keywords: `rtti generic view runtime columns get_components describe_by_data no field name itab structure column cell binding`, path: `src/01`, app: `z2ui5_cl_smp_app_497` }, { group: `samples`, header: `Binding`, sub: `Currency Amounts (sap.ui.model.type.Currency)`, keywords: `amount decimals leading zeros number format`, path: `src/01`, app: `z2ui5_cl_smp_app_067` }, { group: `samples`, header: `Binding`, sub: `Dynamic Table Typed at Runtime (RTTI)`, keywords: `generic data reference create data ddic dynamic itab`, path: `src/01`, app: `z2ui5_cl_smp_app_061` }, { group: `samples`, header: `Binding`, sub: `Expression Binding, Types and Composite Parts`, keywords: `formatter parts conditional regexp visible enabled syntax`, path: `src/01`, app: `z2ui5_cl_smp_app_027` }, { group: `samples`, header: `Binding`, sub: `Model setSizeLimit for Large Tables (A)`, keywords: `combobox jsonmodel size limit large itab 100 entries`, path: `src/01`, app: `z2ui5_cl_smp_app_071` }, { group: `samples`, header: `Binding`, sub: `Single Table Cell (tab_index)`, keywords: `cell input internal table row field level`, path: `src/01`, app: `z2ui5_cl_smp_app_144` }, { group: `samples`, header: `Binding`, sub: `Structure Fields and INCLUDEs`, keywords: `structure component include flat form level`, path: `src/01`, app: `z2ui5_cl_smp_app_166` }, { group: `samples`, header: `Binding`, sub: `Types for Integer, Decimal, Date and Time`, keywords: `type conversion sum amount number field`, path: `src/01`, app: `z2ui5_cl_smp_app_047` }, { group: `samples`, header: `Browser`, sub: `Copy to Clipboard (A)`, keywords: `clipboard paste copy text area`, path: `src/01`, app: `z2ui5_cl_smp_app_325` }, { group: `samples`, header: `Browser`, sub: `Local and Session Storage (A,C)`, keywords: `localstorage sessionstorage persist store_data offline`, path: `src/01`, app: `z2ui5_cl_smp_app_327` }, { group: `samples`, header: `Browser`, sub: `Logout from the Client (A)`, keywords: `logoff signout icf session end fiori launchpad`, path: `src/01`, app: `z2ui5_cl_smp_app_361` }, { group: `samples`, header: `Browser`, sub: `Open a URL in a New Tab (A)`, keywords: `url window open_new_tab link target`, path: `src/01`, app: `z2ui5_cl_smp_app_073` }, { group: `samples`, header: `Browser`, sub: `Open Mail, Phone and SMS Links (A)`, keywords: `mailto tel sms urlhelper redirect native link`, path: `src/01`, app: `z2ui5_cl_smp_app_316` }, { group: `samples`, header: `Browser`, sub: `Reload the Page (A)`, keywords: `reload refresh restart location_reload url`, path: `src/01`, app: `z2ui5_cl_smp_app_492` }, { group: `samples`, header: `Browser`, sub: `Set the Tab Favicon (A)`, keywords: `favicon icon tab image data uri`, path: `src/01`, app: `z2ui5_cl_smp_app_491` }, { group: `samples`, header: `Browser`, sub: `Set the Tab Title (A)`, keywords: `document.title tab caption headline set_title`, path: `src/01`, app: `z2ui5_cl_smp_app_125` }, { group: `samples`, header: `Browser`, sub: `Soft Keyboard Mode on Mobile (A)`, keywords: `mobile numeric keypad keyboard_set_mode phone input`, path: `src/01`, app: `z2ui5_cl_smp_app_352` }, { group: `samples`, header: `Control Behaviour`, sub: `Expand a Panel by ID (setExpanded) (A)`, keywords: `panel collapse expand setexpanded control_by_id whitelisted`, path: `src/01`, app: `z2ui5_cl_smp_app_448` }, { group: `samples`, header: `Control Behaviour`, sub: `MultiInput with Tokens (C)`, keywords: `multiinput token tokens suggestion custom control`, path: `src/01`, app: `z2ui5_cl_smp_app_078` }, { group: `samples`, header: `Control Behaviour`, sub: `Open the PDF Viewer by ID (A)`, keywords: `pdfviewer pdf document viewer popup control_by_id whitelisted`, path: `src/01`, app: `z2ui5_cl_smp_app_449` }, { group: `samples`, header: `Control Behaviour`, sub: `Switch NavContainer Page by ID (A)`, keywords: `navcontainer icontabbar icontabheader page switch control_by_id whitelisted`, path: `src/01`, app: `z2ui5_cl_smp_app_088` }, { group: `samples`, header: `Control Behaviour`, sub: `Wizard with Steps (A)`, keywords: `wizard step branching discardprogress setnextstep control_by_id`, path: `src/01`, app: `z2ui5_cl_smp_app_202` }, { group: `samples`, header: `CSS`, sub: `Color Table Cells from the Backend`, keywords: `color background conditional formatting style data attribute`, path: `src/01`, app: `z2ui5_cl_smp_app_305` }, { group: `samples`, header: `CSS`, sub: `FlexBox Layouts with Custom Classes`, keywords: `flexbox layout responsive navigation tile panel`, path: `src/01`, app: `z2ui5_cl_smp_app_255` }, { group: `samples`, header: `CSS`, sub: `Ship Your Own CSS with the View`, keywords: `style stylesheet inline html class own design`, path: `src/01`, app: `z2ui5_cl_smp_app_050` }, { group: `samples`, header: `Device`, sub: `Camera, Take Photos (C)`, keywords: `camera photo picture webcam capture facing mode`, path: `src/01`, app: `z2ui5_cl_smp_app_306` }, { group: `samples`, header: `Device`, sub: `Device Model: Phone, Tablet, Desktop (A)`, keywords: `sap.ui.device responsive orientation resize media model`, path: `src/01`, app: `z2ui5_cl_smp_app_445` }, { group: `samples`, header: `Device`, sub: `Frontend Info: UI5 Version, Theme, OS, Browser`, keywords: `client info ui5 version theme os user agent device`, path: `src/01`, app: `z2ui5_cl_smp_app_122` }, { group: `samples`, header: `Device`, sub: `Geolocation from the Browser (C)`, keywords: `gps position latitude longitude altitude location`, path: `src/01`, app: `z2ui5_cl_smp_app_120` }, { group: `samples`, header: `Event`, sub: `Control Objects in t_arg (FacetFilter)`, keywords: `facetfilter filter object marshalling selected items`, path: `src/01`, app: `z2ui5_cl_smp_app_197` }, { group: `samples`, header: `Event`, sub: `Extra Arguments with t_arg`, keywords: `argument parameter payload event data fixed value`, path: `src/01`, app: `z2ui5_cl_smp_app_167` }, { group: `samples`, header: `Event`, sub: `Keyboard Shortcuts, Ctrl+S (A)`, keywords: `shortcut hotkey ctrl key combination keyboard_shortcut`, path: `src/01`, app: `z2ui5_cl_smp_app_471` }, { group: `samples`, header: `Event`, sub: `Link with preventDefault (A)`, keywords: `link href default action check_prevent_default`, path: `src/01`, app: `z2ui5_cl_smp_app_472` }, { group: `samples`, header: `File`, sub: `Download to the Browser (A)`, keywords: `export save base64 attachment xstring document`, path: `src/01`, app: `z2ui5_cl_smp_app_186` }, { group: `samples`, header: `File`, sub: `Upload to the Backend (C)`, keywords: `fileuploader base64 attachment import picture document`, path: `src/01`, app: `z2ui5_cl_smp_app_074` }, { group: `samples`, header: `Focus`, sub: `Focus a Table Cell by Column and Row (A)`, keywords: `table cell column row aggregation set_focus`, path: `src/01`, app: `z2ui5_cl_smp_app_421` }, { group: `samples`, header: `Focus`, sub: `Jump to the Next Input on Enter (A)`, keywords: `cursor enter tab next field form set_focus`, path: `src/01`, app: `z2ui5_cl_smp_app_189` }, { group: `samples`, header: `Focus`, sub: `Set Focus and Select Text in an Input (A)`, keywords: `cursor set_focus selection position textfield`, path: `src/01`, app: `z2ui5_cl_smp_app_133` }, { group: `samples`, header: `Formatter`, sub: `ABAP Date and Time Strings (DATS/TIMS)`, keywords: `dats tims conversion initial date 00000000 sy-datum`, path: `src/01`, app: `z2ui5_cl_smp_app_450` }, { group: `samples`, header: `Formatter`, sub: `Date Object for the DatePicker`, keywords: `datepicker datevalue javascript date object iso`, path: `src/01`, app: `z2ui5_cl_smp_app_457` }, { group: `samples`, header: `Formatter`, sub: `Date Objects for the PlanningCalendar`, keywords: `planningcalendar appointment javascript date object iso`, path: `src/01`, app: `z2ui5_cl_smp_app_456` }, { group: `samples`, header: `Formatter`, sub: `Inline Icons in a Text`, keywords: `icon glyph placeholder text status expandinlineicons`, path: `src/01`, app: `z2ui5_cl_smp_app_466` }, { group: `samples`, header: `Formatter`, sub: `When Not to Use One: Compute in ABAP`, keywords: `no formatter computed backend thin frontend prepare`, path: `src/01`, app: `z2ui5_cl_smp_app_453` }, { group: `samples`, header: `Grid Table`, sub: `Events on Cell Level`, keywords: `cell enter row index event grid alv`, path: `src/01`, app: `z2ui5_cl_smp_app_160` }, { group: `samples`, header: `Grid Table`, sub: `Full Example with sap.ui.table`, keywords: `grid alv dynamicpage column row action currency search sort filter`, path: `src/01`, app: `z2ui5_cl_smp_app_070` }, { group: `samples`, header: `Grid Table`, sub: `Keep Column Filters on Refresh (C)`, keywords: `column filter reset refresh uitableext grid alv`, path: `src/01`, app: `z2ui5_cl_smp_app_143` }, { group: `samples`, header: `List`, sub: `Filter and Sort the Binding from ABAP (A)`, keywords: `binding_call getbinding sorter filter follow_up_action`, path: `src/01`, app: `z2ui5_cl_smp_app_454` }, { group: `samples`, header: `List`, sub: `Live Filter on the Client, No Roundtrip (A)`, keywords: `binding_call live search client side no roundtrip filter`, path: `src/01`, app: `z2ui5_cl_smp_app_455` }, { group: `samples`, header: `List`, sub: `StandardListItem, Highlight and Events`, keywords: `sap.m.list standardlistitem highlight infostate press selection`, path: `src/01`, app: `z2ui5_cl_smp_app_048` }, { group: `samples`, header: `Menu`, sub: `Full Path of the Selected Item (A)`, keywords: `menuitem nested submenu textpath controller path`, path: `src/01`, app: `z2ui5_cl_smp_app_473` }, { group: `samples`, header: `Menu`, sub: `Menu Button with core:require`, keywords: `menubutton menuitem popover messagetoast require module`, path: `src/01`, app: `z2ui5_cl_smp_app_163` }, { group: `samples`, header: `Message`, sub: `Message Model and MessageManager (C)`, keywords: `messagemanager validation target field state central model`, path: `src/01`, app: `z2ui5_cl_smp_app_467` }, { group: `samples`, header: `Message`, sub: `MessageBox from SY, BAPIRET2 or Exception`, keywords: `t100 message class number exception cx_root error abend`, path: `src/01`, app: `z2ui5_cl_smp_app_008` }, { group: `samples`, header: `Message`, sub: `MessageBox, Types and Custom Actions`, keywords: `confirm warning error success information dialog action`, path: `src/01`, app: `z2ui5_cl_smp_app_382` }, { group: `samples`, header: `Message`, sub: `MessagePopover URL Policy (A)`, keywords: `url policy link security validator relative allow deny`, path: `src/01`, app: `z2ui5_cl_smp_app_474` }, { group: `samples`, header: `Message`, sub: `MessageToast, Text and Duration`, keywords: `toast notification duration position animation`, path: `src/01`, app: `z2ui5_cl_smp_app_381` }, { group: `samples`, header: `Message`, sub: `MessageView and MessagePopover (A)`, keywords: `messagepopover messageitem dialog grouped message list`, path: `src/01`, app: `z2ui5_cl_smp_app_452` }, { group: `samples`, header: `Navigation`, sub: `Call and Leave Apps (nav_app_call)`, keywords: `nav_app_call nav_app_leave sub app stack call back`, path: `src/01`, app: `z2ui5_cl_smp_app_024` }, { group: `samples`, header: `Navigation`, sub: `Data Loss Protection on Leaving (A,C)`, keywords: `dirty unsaved changes leave confirmation warning`, path: `src/01`, app: `z2ui5_cl_smp_app_279` }, { group: `samples`, header: `Navigation`, sub: `Return Data and Events to the Caller`, keywords: `r_data result get_app_prev return event payload`, path: `src/01`, app: `z2ui5_cl_smp_app_488` }, { group: `samples`, header: `Navigation`, sub: `Uncaught Error and Error Popup`, keywords: `exception dump error handling debugtool restart retry`, path: `src/01`, app: `z2ui5_cl_smp_app_464` }, { group: `samples`, header: `Nested View`, sub: `Basic Example (nest_view_display)`, keywords: `nest_view_display rerender model refresh sub view`, path: `src/01`, app: `z2ui5_cl_smp_app_065` }, { group: `samples`, header: `Nested View`, sub: `Embed Another App's View`, keywords: `sub app class embed instantiate another app rtti`, path: `src/01`, app: `z2ui5_cl_smp_app_104` }, { group: `samples`, header: `Nested View`, sub: `Master-Detail with FlexibleColumnLayout`, keywords: `fcl master detail list report two column split`, path: `src/01`, app: `z2ui5_cl_smp_app_097` }, { group: `samples`, header: `Nested View`, sub: `Three Columns with FlexibleColumnLayout`, keywords: `fcl three column detail detail deep navigation`, path: `src/01`, app: `z2ui5_cl_smp_app_098` }, { group: `samples`, header: `Popover`, sub: `Basic Example with Placement`, keywords: `placement anchor button confirm cancel popover_display`, path: `src/01`, app: `z2ui5_cl_smp_app_026` }, { group: `samples`, header: `Popover`, sub: `Open from a Table Row`, keywords: `list report dynamicpage row link details table`, path: `src/01`, app: `z2ui5_cl_smp_app_052` }, { group: `samples`, header: `Popover`, sub: `Open Together with the View Build`, keywords: `initial render one roundtrip anchor button`, path: `src/01`, app: `z2ui5_cl_smp_app_490` }, { group: `samples`, header: `Popover`, sub: `QuickView Contact Card`, keywords: `quickview contact card links grouped fields`, path: `src/01`, app: `z2ui5_cl_smp_app_109` }, { group: `samples`, header: `Popover`, sub: `Select from a List`, keywords: `list selection placement anchor`, path: `src/01`, app: `z2ui5_cl_smp_app_081` }, { group: `samples`, header: `Popover`, sub: `Toggle by ID (toggleBy) (A)`, keywords: `toggleby open close control_by_id whitelisted`, path: `src/01`, app: `z2ui5_cl_smp_app_465` }, { group: `samples`, header: `Popup`, sub: `Dialog inside a Dialog`, keywords: `nested stack popup in popup second dialog`, path: `src/01`, app: `z2ui5_cl_smp_app_161` }, { group: `samples`, header: `Popup`, sub: `Element Binding to the Selected Row (A)`, keywords: `element binding relative path aggregation dialog row`, path: `src/01`, app: `z2ui5_cl_smp_app_470` }, { group: `samples`, header: `Popup`, sub: `Navigate between Dialogs (NavContainer) (A)`, keywords: `navcontainer dialog pages back forward`, path: `src/01`, app: `z2ui5_cl_smp_app_170` }, { group: `samples`, header: `Popup`, sub: `Value Help: Suggestions and F4 Dialog`, keywords: `f4 search help suggestion input dialog select`, path: `src/01`, app: `z2ui5_cl_smp_app_009` }, { group: `samples`, header: `Popup`, sub: `Ways to Open a Dialog (A)`, keywords: `dialog sub app destroy rerender background view`, path: `src/01`, app: `z2ui5_cl_smp_app_012` }, { group: `samples`, header: `Scroll`, sub: `Scroll a Control into View (A)`, keywords: `scroll_into_view control id validation jump`, path: `src/01`, app: `z2ui5_cl_smp_app_363` }, { group: `samples`, header: `Scroll`, sub: `Scroll to a Pixel Position (A)`, keywords: `position pixel scroll_to restore refresh toolbar`, path: `src/01`, app: `z2ui5_cl_smp_app_362` }, { group: `samples`, header: `Table`, sub: `Drag and Drop Rows (A)`, keywords: `dnd dragdropinfo reorder rows move`, path: `src/01`, app: `z2ui5_cl_smp_app_459` }, { group: `samples`, header: `Table`, sub: `Editable Cells, Add and Delete Rows`, keywords: `edit input add row delete multiselect toolbar`, path: `src/01`, app: `z2ui5_cl_smp_app_011` }, { group: `samples`, header: `Table`, sub: `Filter Rows in the Backend`, keywords: `filter server side form growing where`, path: `src/01`, app: `z2ui5_cl_smp_app_045` }, { group: `samples`, header: `Table`, sub: `Large Table with Growing and ScrollContainer`, keywords: `growing 10000 rows sticky toolbar sort performance`, path: `src/01`, app: `z2ui5_cl_smp_app_006` }, { group: `samples`, header: `Table`, sub: `Live Search with Parallel Requests`, keywords: `live search parallel requests busy queue typing`, path: `src/01`, app: `z2ui5_cl_smp_app_059` }, { group: `samples`, header: `Table`, sub: `Search in the Backend (SearchField)`, keywords: `search go enter server side where`, path: `src/01`, app: `z2ui5_cl_smp_app_053` }, { group: `samples`, header: `Table`, sub: `Selection Modes: Single and Multi Select`, keywords: `selectionmode none single multi segmentedbutton checkbox`, path: `src/01`, app: `z2ui5_cl_smp_app_019` }, { group: `samples`, header: `Templating`, sub: `Build Columns Dynamically (template:repeat)`, keywords: `template repeat runtime generated columns if then else`, path: `src/01`, app: `z2ui5_cl_smp_app_173` }, { group: `samples`, header: `Templating`, sub: `Dynamic Content in a Nested View`, keywords: `template repeat runtime generated nested nest_view_display`, path: `src/01`, app: `z2ui5_cl_smp_app_176` }, { group: `samples`, header: `Timer`, sub: `Progress Indicator during a Backend Call (A)`, keywords: `progressindicator busy wait long running backend`, path: `src/01`, app: `z2ui5_cl_smp_app_064` }, { group: `samples`, header: `Timer`, sub: `Refresh the View Every n Seconds (A)`, keywords: `interval polling auto refresh follow_up_action seconds`, path: `src/01`, app: `z2ui5_cl_smp_app_028` }, { group: `samples`, header: `Tree`, sub: `Drag and Drop Nodes (A,C)`, keywords: `dnd move node hierarchy binding context`, path: `src/01`, app: `z2ui5_cl_smp_app_461` }, { group: `samples`, header: `Tree`, sub: `Editable Nodes with CustomTreeItem (C)`, keywords: `customtreeitem rename input binding write back`, path: `src/01`, app: `z2ui5_cl_smp_app_463` }, { group: `samples`, header: `Tree`, sub: `Inside a Dialog (C)`, keywords: `popup expand state hierarchy nodes`, path: `src/01`, app: `z2ui5_cl_smp_app_462` }, { group: `samples`, header: `Tree`, sub: `Nested ABAP Table in a sap.m.Tree`, keywords: `hierarchy nodes nested json items`, path: `src/01`, app: `z2ui5_cl_smp_app_460` }]); return result; } diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_008.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_008.js index ca117db..aedb425 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_008.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_008.js @@ -5,9 +5,7 @@ class z2ui5_cl_smp_app_008 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else if (client.check_on_event()) { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_012.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_012.js index f3e3d1f..4929bd5 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_012.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_012.js @@ -156,7 +156,7 @@ class z2ui5_cl_smp_app_012 extends z2ui5_if_app { .end() .ele(`buttons`) .tag(`Button`) - .a({ n: `press`, v: this.client.follow_up_action(this.client.cs_event.popup_close) }) + .a({ n: `press`, v: this.client.follow_up_action_result(this.client.cs_event.popup_close) }) .a({ n: `text`, v: `close` }) .a({ n: `type`, v: `Emphasized` }); this.client.popup_display(popup.stringify()); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_061.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_061.js index 5676764..6c4abf7 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_061.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_061.js @@ -56,7 +56,6 @@ class z2ui5_cl_smp_app_061 extends z2ui5_if_app { .end(); tab.ele(`items`) .ele(`ColumnListItem`) - .a({ n: `selected`, v: `{SELKZ}` }) .ele(`cells`) .tag(`Input`) .a({ n: `value`, v: `{ID}` }) diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_073.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_073.js index 349e6e2..f1e342f 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_073.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_073.js @@ -34,9 +34,7 @@ class z2ui5_cl_smp_app_073 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } if (client.get_event() === `BUTTON_OPEN_NEW_TAB`) { diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_088.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_088.js index 3d0464b..af6130e 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_088.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_088.js @@ -43,7 +43,7 @@ class z2ui5_cl_smp_app_088 extends z2ui5_if_app { .a({ n: `class`, v: `sapUiSmallMargin` }); page.ele(`IconTabHeader`) .a({ n: `selectedKey`, v: this.client._bind(this.mv_selected_key) }) - .a({ n: `select`, v: this.client.follow_up_action(this.client.cs_event.control_by_id, [`NavCon`, `to`, `\${$parameters>/key}`]) }) + .a({ n: `select`, v: this.client.follow_up_action_result(this.client.cs_event.control_by_id, [`NavCon`, `to`, `\${$parameters>/key}`]) }) .a({ n: `mode`, v: `Inline` }) .ele(`items`) .ele(`IconTabFilter`) diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_163.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_163.js index b7b002c..9346edd 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_163.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_163.js @@ -73,9 +73,7 @@ class z2ui5_cl_smp_app_163 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_170.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_170.js index 6feace9..79f4d18 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_170.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_170.js @@ -14,7 +14,7 @@ class z2ui5_cl_smp_app_170 extends z2ui5_if_app { .a({ n: `afterClose`, v: this.client._event(`BTN_OK_1ND`) }) .ele(`content`); dialog.ele(`IconTabBar`) - .a({ n: `select`, v: this.client.follow_up_action(this.client.cs_event.control_by_id, [`NavCon`, `to`, `\${$parameters>/selectedKey}`], this.client.cs_view.popup) }) + .a({ n: `select`, v: this.client.follow_up_action_result(this.client.cs_event.control_by_id, [`NavCon`, `to`, `\${$parameters>/selectedKey}`], this.client.cs_view.popup) }) .a({ n: `expandable`, b: false }) .a({ n: `expanded`, b: true }) .a({ n: `headerMode`, v: `Inline` }) diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_279.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_279.js index 54ef713..14fdca5 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_279.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_279.js @@ -7,9 +7,7 @@ class z2ui5_cl_smp_app_279 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else if (client.check_on_event()) { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_316.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_316.js index 8f24cfe..ddd83b4 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_316.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_316.js @@ -66,7 +66,7 @@ class z2ui5_cl_smp_app_316 extends z2ui5_if_app { .a({ n: `growing`, b: true }) .a({ n: `growingMaxLines`, v: `7` }); email_form.tag(`Button`) - .a({ n: `press`, v: client.follow_up_action(client.cs_event.urlhelper, [`TRIGGER_EMAIL`, `$${client._bind(this.email)}`]) }) + .a({ n: `press`, v: client.follow_up_action_result(client.cs_event.urlhelper, [`TRIGGER_EMAIL`, `$${client._bind(this.email)}`]) }) .a({ n: `text`, v: `Trigger Email` }); const telephone_form = layout.ele({ n: `SimpleForm`, ns: `form` }).a({ n: `title`, v: `Trigger Telephone` }); telephone_form.tag(`Label`).a({ n: `text`, v: `Telephone` }).a({ n: `labelFor`, v: `inputTel` }); @@ -77,7 +77,7 @@ class z2ui5_cl_smp_app_316 extends z2ui5_if_app { .a({ n: `value`, v: client._bind(this.phone) }) .a({ n: `class`, v: `sapUiSmallMarginBottom` }); telephone_form.tag(`Button`) - .a({ n: `press`, v: client.follow_up_action(client.cs_event.urlhelper, [`TRIGGER_TEL`, `$${client._bind(this.phone)}`]) }) + .a({ n: `press`, v: client.follow_up_action_result(client.cs_event.urlhelper, [`TRIGGER_TEL`, `$${client._bind(this.phone)}`]) }) .a({ n: `text`, v: `Trigger Telephone` }); const mobile_form = layout.ele({ n: `SimpleForm`, ns: `form` }).a({ n: `title`, v: `Trigger SMS` }); mobile_form.tag(`Label`).a({ n: `text`, v: `Number` }).a({ n: `labelFor`, v: `inputNumber` }); @@ -88,7 +88,7 @@ class z2ui5_cl_smp_app_316 extends z2ui5_if_app { .a({ n: `value`, v: client._bind(this.mobile) }) .a({ n: `class`, v: `sapUiSmallMarginBottom` }); mobile_form.tag(`Button`) - .a({ n: `press`, v: client.follow_up_action(client.cs_event.urlhelper, [`TRIGGER_SMS`, `$${client._bind(this.mobile)}`]) }) + .a({ n: `press`, v: client.follow_up_action_result(client.cs_event.urlhelper, [`TRIGGER_SMS`, `$${client._bind(this.mobile)}`]) }) .a({ n: `text`, v: `Trigger SMS` }); const url_form = layout.ele({ n: `SimpleForm`, ns: `form` }).a({ n: `title`, v: `Redirect` }); url_form.tag(`Label`).a({ n: `text`, v: `URL` }).a({ n: `labelFor`, v: `inputUrl` }); @@ -99,7 +99,7 @@ class z2ui5_cl_smp_app_316 extends z2ui5_if_app { .a({ n: `value`, v: client._bind(this.url.url, { name: `url-url` }) }) .a({ n: `class`, v: `sapUiSmallMarginBottom` }); url_form.tag(`Button`) - .a({ n: `press`, v: client.follow_up_action(client.cs_event.urlhelper, [`REDIRECT`, `$${client._bind(this.url)}`]) }) + .a({ n: `press`, v: client.follow_up_action_result(client.cs_event.urlhelper, [`REDIRECT`, `$${client._bind(this.url)}`]) }) .a({ n: `text`, v: `Redirect` }); client.view_display(page.stringify()); client.follow_up_action(z2ui5_if_client.cs_event.set_title, [`URL Helper Sample`]); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_327.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_327.js index ca791d9..abcf37d 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_327.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_327.js @@ -101,7 +101,7 @@ class z2ui5_cl_smp_app_327 extends z2ui5_if_app { .tag(`Label`) .a({ n: `text`, v: `` }) .tag(`Button`) - .a({ n: `press`, v: this.client.follow_up_action(z2ui5_if_client.cs_event.store_data, [`$${this.client._bind(this.s_storage)}`]) }) + .a({ n: `press`, v: this.client.follow_up_action_result(z2ui5_if_client.cs_event.store_data, [`$${this.client._bind(this.s_storage)}`]) }) .a({ n: `text`, v: `store` }) .tag(`Button`) .a({ n: `press`, v: this.client._event(`GET_STORED_VALUE`) }) diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_361.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_361.js index 8349ed2..9e7e9a5 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_361.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_361.js @@ -23,7 +23,7 @@ class z2ui5_cl_smp_app_361 extends z2ui5_if_app { .a({ n: `showIcon`, b: true }) .a({ n: `class`, v: `sapUiMediumMargin` }) .tag(`Button`) - .a({ n: `press`, v: client.follow_up_action(client.cs_event.system_logout) }) + .a({ n: `press`, v: client.follow_up_action_result(client.cs_event.system_logout) }) .a({ n: `text`, v: `Logout (client)` }) .a({ n: `icon`, v: `sap-icon://log` }) .a({ n: `type`, v: `Reject` }) @@ -34,7 +34,7 @@ class z2ui5_cl_smp_app_361 extends z2ui5_if_app { .a({ n: `showIcon`, b: true }) .a({ n: `class`, v: `sapUiMediumMargin` }) .tag(`Button`) - .a({ n: `press`, v: client.follow_up_action(client.cs_event.system_logout, [`/sap/public/bc/icf/logoff?redirecturl=www.google.com`]) }) + .a({ n: `press`, v: client.follow_up_action_result(client.cs_event.system_logout, [`/sap/public/bc/icf/logoff?redirecturl=www.google.com`]) }) .a({ n: `text`, v: `Logout (client, with redirect)` }) .a({ n: `icon`, v: `sap-icon://log` }) .a({ n: `type`, v: `Reject` }) diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_363.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_363.js index a7f6f9d..89e72a5 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_363.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_363.js @@ -8,9 +8,7 @@ class z2ui5_cl_smp_app_363 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else if (client.check_on_event()) { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_445.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_445.js index 3aa74ea..a2841ff 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_445.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_445.js @@ -5,9 +5,7 @@ class z2ui5_cl_smp_app_445 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else if (client.check_on_event()) { this.on_event(); @@ -119,7 +117,7 @@ class z2ui5_cl_smp_app_445 extends z2ui5_if_app { this.device_form({ parent: dialog.ele(`content`) }); dialog.ele(`buttons`) .tag(`Button`) - .a({ n: `press`, v: this.client.follow_up_action(this.client.cs_event.popup_close) }) + .a({ n: `press`, v: this.client.follow_up_action_result(this.client.cs_event.popup_close) }) .a({ n: `text`, v: `Close` }) .a({ n: `type`, v: `Emphasized` }); this.client.popup_display(popup.stringify()); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_448.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_448.js index 2da863f..41cd3f3 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_448.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_448.js @@ -6,9 +6,7 @@ class z2ui5_cl_smp_app_448 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_449.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_449.js index b76db5c..4dbfb70 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_449.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_449.js @@ -5,9 +5,7 @@ class z2ui5_cl_smp_app_449 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_452.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_452.js index 61631a4..1c36c52 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_452.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_452.js @@ -98,7 +98,7 @@ class z2ui5_cl_smp_app_452 extends z2ui5_if_app { .a({ n: `contentWidth`, v: `50%` }) .a({ n: `contentHeight`, v: `50%` }) .a({ n: `verticalScrolling`, b: false }) - .a({ n: `afterClose`, v: this.client.follow_up_action(this.client.cs_event.popup_close) }); + .a({ n: `afterClose`, v: this.client.follow_up_action_result(this.client.cs_event.popup_close) }); dialog.ele(`MessageView`) .a({ n: `items`, v: this.client._bind(this.t_msg) }) .a({ n: `groupItems`, b: true }) @@ -114,7 +114,7 @@ class z2ui5_cl_smp_app_452 extends z2ui5_if_app { .a({ n: `href`, v: `http://sap.com` }); dialog.ele(`endButton`) .tag(`Button`) - .a({ n: `press`, v: this.client.follow_up_action(this.client.cs_event.popup_close) }) + .a({ n: `press`, v: this.client.follow_up_action_result(this.client.cs_event.popup_close) }) .a({ n: `text`, v: `Close` }); this.client.popup_display(popup.stringify()); } diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_455.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_455.js index 983b421..09d61eb 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_455.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_455.js @@ -37,7 +37,7 @@ class z2ui5_cl_smp_app_455 extends z2ui5_if_app { .tag(`SearchField`) .a({ n: `width`, v: `30%` }) .a({ n: `placeholder`, v: `Search products` }) - .a({ n: `liveChange`, v: this.client.follow_up_action(z2ui5_if_client.cs_event.binding_call, [`productList`, `items`, `filter`, `NAME`, `Contains`, `\${$parameters>/newValue}`]) }); + .a({ n: `liveChange`, v: this.client.follow_up_action_result(z2ui5_if_client.cs_event.binding_call, [`productList`, `items`, `filter`, `NAME`, `Contains`, `\${$parameters>/newValue}`]) }); page.ele(`List`) .a({ n: `headerText`, v: `Products` }) .a({ n: `items`, v: this.client._bind(this.t_products) }) diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_464.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_464.js index 1be9efe..9396c07 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_464.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_464.js @@ -5,7 +5,7 @@ class z2ui5_cl_smp_app_464 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init() || client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_465.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_465.js index 8c2dacb..ec4990c 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_465.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_465.js @@ -5,9 +5,7 @@ class z2ui5_cl_smp_app_465 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_469.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_469.js index c82b13f..9eb38ed 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_469.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_469.js @@ -5,9 +5,7 @@ class z2ui5_cl_smp_app_469 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } } diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_470.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_470.js index 1d74db5..aaf33cc 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_470.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_470.js @@ -90,7 +90,7 @@ class z2ui5_cl_smp_app_470 extends z2ui5_if_app { .a({ n: `info`, v: `{QTY} {UNIT}` }); dialog.ele(`buttons`) .tag(`Button`) - .a({ n: `press`, v: this.client.follow_up_action(this.client.cs_event.popup_close) }) + .a({ n: `press`, v: this.client.follow_up_action_result(this.client.cs_event.popup_close) }) .a({ n: `text`, v: `Close` }) .a({ n: `type`, v: `Emphasized` }); this.client.popup_display(popup.stringify()); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_473.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_473.js index 6c5577d..6668183 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_473.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_473.js @@ -5,9 +5,7 @@ class z2ui5_cl_smp_app_473 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } } @@ -30,7 +28,7 @@ class z2ui5_cl_smp_app_473 extends z2ui5_if_app { .a({ n: `type`, v: `Information` }) .a({ n: `showIcon`, b: true }) .a({ n: `class`, v: `sapUiSmallMargin` }); - const menu_selected = this.client.follow_up_action(z2ui5_if_client.cs_event.control_global, [`MESSAGE_TOAST`, `show`, `Action triggered on item: {0}`, `$controller.textPath(\${$parameters>/item})`]); + const menu_selected = this.client.follow_up_action_result(z2ui5_if_client.cs_event.control_global, [`MESSAGE_TOAST`, `show`, `Action triggered on item: {0}`, `$controller.textPath(\${$parameters>/item})`]); const menu = page.ele(`HBox`) .a({ n: `class`, v: `sapUiSmallMargin` }) .ele(`MenuButton`) diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_474.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_474.js index 44ccc3e..1fdbadf 100644 --- a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_474.js +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_474.js @@ -5,9 +5,7 @@ class z2ui5_cl_smp_app_474 extends z2ui5_if_app { async main(client) { this.client = client; - if (client.check_on_init()) { - this.view_display(); - } else if (client.check_on_navigated()) { + if (client.check_on_navigated()) { this.view_display(); } else if (client.check_on_event()) { this.on_event(); diff --git a/run/input/core/srv/app/samples/z2ui5_cl_smp_app_497.js b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_497.js new file mode 100644 index 0000000..8b21e7e --- /dev/null +++ b/run/input/core/srv/app/samples/z2ui5_cl_smp_app_497.js @@ -0,0 +1,68 @@ +const z2ui5_if_app = require("abap2UI5/z2ui5_if_app"); + +class z2ui5_cl_smp_app_497 extends z2ui5_if_app { + rows = []; + client = null; + + async main(client) { + this.client = client; + if (client.check_on_init()) { + this.model_init(); + this.set_view(); + } else if (client.check_on_navigated()) { + this.set_view(); + } + } + + set_view() { + const view = z2ui5_cl_ui5_view_builder.factory() + .ele({ n: `View`, ns: `mvc` }) + .a({ n: `displayBlock`, v: `true` }) + .a({ n: `height`, v: `100%` }) + .a({ n: `xmlns`, v: `sap.m` }) + .a({ n: `xmlns:mvc`, v: `sap.ui.core.mvc` }); + const page = view.ele(`Shell`) + .ele(`Page`) + .a({ n: `title`, v: `abap2UI5 - Binding - A View Built From RTTI` }) + .a({ n: `showNavButton`, b: this.client.check_app_prev_stack() }) + .a({ n: `navButtonPress`, v: this.client._event_nav_app_leave() }); + page.tag(`MessageStrip`) + .a({ n: `text`, v: `Not one field name appears in the view code. RTTI reads the ` + `components of the internal table, and every column header and ` + `cell binding below is derived from them.` }) + .a({ n: `type`, v: `Information` }) + .a({ n: `showIcon`, b: true }) + .a({ n: `class`, v: `sapUiSmallMargin` }); + this.render_any({ parent: page, tab: this.rows }); + this.client.view_display(view.stringify()); + } + + render_any({ parent, tab } = {}) { + let sy_tabix = 0; + const comps = ((cl_abap_typedescr.describe_by_data(tab)).get_table_line_type()).get_components(); + const ui_table = parent.ele(`Table`) + .a({ n: `items`, v: this.client._bind(tab) }) + .a({ n: `headerText`, v: `${tab.length} rows, ${comps.length} columns` }); + const columns = ui_table.ele(`columns`); + sy_tabix = 0; + for (const comp of comps) { + sy_tabix++; + columns.ele(`Column`).ele(`header`).tag(`Text`).a({ n: `text`, v: comp.name }); + } + const cells = ui_table.ele(`items`).ele(`ColumnListItem`).ele(`cells`); + sy_tabix = 0; + for (const comp of comps) { + sy_tabix++; + cells.tag(`Text`).a({ n: `text`, v: `{${comp.name}}` }); + } + } + + model_init() { + this.rows = z2ui5_cl_util.abap_tab_assign(this.rows, [{ carrid: `LH`, connid: `0400`, fldate: `20260825`, price: `899.00`, currency: `EUR` }, { carrid: `LH`, connid: `0402`, fldate: `20260826`, price: `915.00`, currency: `EUR` }, { carrid: `AA`, connid: `0017`, fldate: `20260827`, price: `422.50`, currency: `USD` }, { carrid: `UA`, connid: `0941`, fldate: `20260828`, price: `780.00`, currency: `USD` }]); + } +} + +module.exports = z2ui5_cl_smp_app_497; + +const cl_abap_typedescr = require("abap2UI5/cl_abap_typedescr"); +const z2ui5_cl_ui5_view_builder = require("abap2UI5/z2ui5_cl_ui5_view_builder"); +const z2ui5_cl_util = require("abap2UI5/z2ui5_cl_util"); + diff --git a/run/input/core/srv/z2ui5/00/00/abap_rtti.js b/run/input/core/srv/z2ui5/00/00/abap_rtti.js index e4a4147..902b5e7 100644 --- a/run/input/core/srv/z2ui5/00/00/abap_rtti.js +++ b/run/input/core/srv/z2ui5/00/00/abap_rtti.js @@ -118,7 +118,13 @@ function describe(val) { return makeElem(TYPEKIND.date, "\\TYPE=D", 8); } if (typeof val === "object" && (val.constructor === Object || !val.constructor)) { - const components = Object.entries(val).map(([name, v]) => ({ name, type: describe(v) })); + // ABAP RTTI reports component names in UPPER CASE, and transpiled code + // reads them as such — `CASE ls_attri->name. WHEN 'PREVIOUS'.` — or hands + // them straight to the user, which is what msg_get_rap_flatten does: + // reporting the JS key verbatim produced `product_uuid=ABC-1` where the + // RAP key is PRODUCT_UUID. Lookups are unaffected: the ASSIGN COMPONENT + // accessor the transpiler emits lower-cases the name before resolving it. + const components = Object.entries(val).map(([name, v]) => ({ name: name.toUpperCase(), type: describe(v) })); return makeStruct(components); } if (typeof val === "function") { @@ -128,7 +134,8 @@ function describe(val) { }); } // class instance - const attributes = Object.getOwnPropertyNames(val).map((name) => ({ name, type_kind: describe(val[name]).type_kind })); + // …same for a class instance's attributes (see the struct branch above) + const attributes = Object.getOwnPropertyNames(val).map((name) => ({ name: name.toUpperCase(), type_kind: describe(val[name]).type_kind })); const proto = Object.getPrototypeOf(val) || {}; const methods = Object.getOwnPropertyNames(proto) .filter((m) => m !== "constructor" && typeof proto[m] === "function") diff --git a/run/input/core/srv/z2ui5/00/00/cl_abap_classdescr.js b/run/input/core/srv/z2ui5/00/00/cl_abap_classdescr.js index 8e9e6fc..750f7f8 100644 --- a/run/input/core/srv/z2ui5/00/00/cl_abap_classdescr.js +++ b/run/input/core/srv/z2ui5/00/00/cl_abap_classdescr.js @@ -2,6 +2,22 @@ "use strict"; const cl_abap_objectdescr = require("./cl_abap_objectdescr"); -class cl_abap_classdescr extends cl_abap_objectdescr {} +class cl_abap_classdescr extends cl_abap_objectdescr { + /** + * get_class_name( val ) — the absolute name of the object's class, + * `\CLASS=Z2UI5_CL_FOO`. Callers strip the prefix (see + * z2ui5_cl_ui5_util_context=>rtti_get_classname), so the prefix has to be + * there: it is what the kernel returns, and the substring_after( ) that + * follows answers empty without it. + * + * Unbound answers empty rather than throwing — the ABAP callers ask this + * while rendering an error or a response header, where a half-built object + * graph is normal, and they guard on IS NOT BOUND for exactly that reason. + */ + static get_class_name(val) { + if (val === null || val === undefined) return ``; + return cl_abap_objectdescr.describe_by_object_ref(val)?.absolute_name ?? ``; + } +} module.exports = cl_abap_classdescr; diff --git a/run/input/core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_context.js b/run/input/core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_context.js index 136df0d..9ac9bd9 100644 --- a/run/input/core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_context.js +++ b/run/input/core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_context.js @@ -14,6 +14,7 @@ class z2ui5_cl_ui5_util_context { static cv_objectdescr_public = ``; static mt_bool_cache = []; static mt_attri_cache = []; + static gt_class_exists = []; static gv_check_cloud = false; static gv_check_cloud_cached = false; static gv_uuid_failed = false; @@ -284,6 +285,19 @@ class z2ui5_cl_ui5_util_context { static rtti_check_class_exists({ val } = {}) { let result = false; let sy_subrc = 0; + let lv_name = ``; + lv_name = val.toUpperCase(); + let lr_hit = {}; + { + const _t = z2ui5_cl_ui5_util_context.gt_class_exists; + const _i = _t.findIndex((_r) => _r.name === lv_name); + sy_subrc = _i >= 0 && _i < _t.length ? 0 : 4; + if (sy_subrc === 0) lr_hit = _t[_i]; + } + if (sy_subrc === 0) { + result = z2ui5_cl_util.abap_tab_assign(result, z2ui5_cl_util.abap_copy(lr_hit.exists)); + return result; + } try { // TODO(abap2js): cl_abap_classdescr=>describe_by_name( EXPORTING p_name = val EXCEPTIONS type_not_found = 1 ). if (sy_subrc === 0) { @@ -291,17 +305,16 @@ class z2ui5_cl_ui5_util_context { } } catch (error) { } + z2ui5_cl_ui5_util_context.gt_class_exists.push(z2ui5_cl_util.abap_copy({ name: lv_name, exists: result })); return result; } static rtti_check_ref_data({ val } = {}) { let result = false; let lo_typdescr; - let lo_ref; try { lo_typdescr = cl_abap_typedescr.describe_by_data(val); - lo_ref = (lo_typdescr); - result = true; + result = (lo_typdescr.kind === cl_abap_typedescr.kind_ref); } catch (error) { } return result; @@ -323,7 +336,7 @@ class z2ui5_cl_ui5_util_context { return result; } - static rtti_get_t_attri_by_include() { + static rtti_get_t_attri_by_include({ depth = 0 } = {}) { let result = []; let sy_subrc = 0; // TODO(abap2js): cl_abap_typedescr=>describe_by_name( EXPORTING p_name = type->absolute_name RECEIVING p_descr_ref = DATA(type_desc) EXCEPTIONS type_not_found = 1 ). @@ -332,19 +345,22 @@ class z2ui5_cl_ui5_util_context { } const sdescr = (type_desc); const comps = sdescr.get_components(); - result = z2ui5_cl_ui5_util_context.expand_components({ val: comps }); + result = z2ui5_cl_ui5_util_context.expand_components({ val: comps, depth }); return result; } - static expand_components({ val } = {}) { + static expand_components({ val, depth = 0 } = {}) { let result = []; let sy_tabix = 0; let lt_incl; + if (depth > 16) { + throw new z2ui5_cx_ui5_util_error({ val: `RTTI_INCLUDE_RECURSION - include expansion exceeded 16 levels (cyclic include?)` }); + } sy_tabix = 0; for (const lr_comp of val) { sy_tabix++; if ((lr_comp.as_include === true || lr_comp.as_include === `X`)) { - lt_incl = z2ui5_cl_ui5_util_context.rtti_get_t_attri_by_include(lr_comp.type); + lt_incl = z2ui5_cl_ui5_util_context.rtti_get_t_attri_by_include({ type: lr_comp.type, depth: depth + 1 }); result.push(...lt_incl); } else { result.push(z2ui5_cl_util.abap_copy(lr_comp)); @@ -431,7 +447,7 @@ class z2ui5_cl_ui5_util_context { fs_unassign = val; _fs$fs_unassign = null; sy_subrc = 0; - if (sy_subrc !== 0) { + if (fs_unassign == null) { return result; } result = z2ui5_cl_util.abap_tab_assign(result, z2ui5_cl_util.abap_copy(fs_unassign)); @@ -446,7 +462,7 @@ class z2ui5_cl_ui5_util_context { fs_unassign = val; _fs$fs_unassign = null; sy_subrc = 0; - if (sy_subrc !== 0) { + if (fs_unassign == null) { return result; } result = z2ui5_cl_util.abap_tab_assign(result, z2ui5_cl_util.abap_copy(fs_unassign)); @@ -656,6 +672,7 @@ class z2ui5_cl_ui5_util_context { static error_get_source_position({ val } = {}) { let result = ``; + let sy_saprl = "OPEN"; let lv_program = ``; let lv_include = ``; let lv_line = 0; @@ -1009,17 +1026,17 @@ class z2ui5_cl_ui5_util_context { return result; } - static rtti_get_classes_impl_intf({ val } = {}) { + static rtti_get_classes_impl_intf({ val, read_description = false } = {}) { let result = []; if (z2ui5_cl_ui5_util_context.check_abap_cloud()) { - result = z2ui5_cl_ui5_util_context.rtti_get_classes_intf_cloud({ val: val }); + result = z2ui5_cl_ui5_util_context.rtti_get_classes_intf_cloud({ val, read_description }); } else { - result = z2ui5_cl_ui5_util_context.rtti_get_classes_intf_std({ val: val }); + result = z2ui5_cl_ui5_util_context.rtti_get_classes_intf_std({ val, read_description }); } return result; } - static rtti_get_classes_intf_cloud({ val } = {}) { + static rtti_get_classes_intf_cloud({ val, read_description = false } = {}) { let result = []; let sy_tabix = 0; let sy_subrc = 0; @@ -1061,14 +1078,20 @@ class z2ui5_cl_ui5_util_context { sy_tabix = 0; for (const implementation_name of lt_implementation_names) { sy_tabix++; + ls_class = { classname: ``, description: `` }; ls_class.classname = z2ui5_cl_util.abap_tab_assign(ls_class.classname, z2ui5_cl_util.abap_copy(implementation_name)); - ls_class.description = z2ui5_cl_ui5_util_context.rtti_get_class_descr_on_cloud({ classname: implementation_name }); + if ((read_description === true || read_description === `X`)) { + try { + ls_class.description = z2ui5_cl_ui5_util_context.rtti_get_class_descr_on_cloud({ classname: implementation_name }); + } catch (error) { + } + } result.push(z2ui5_cl_util.abap_copy(ls_class)); } return result; } - static rtti_get_classes_intf_std({ val } = {}) { + static rtti_get_classes_intf_std({ val, read_description = false } = {}) { let result = []; let sy_tabix = 0; let sy_subrc = 0; @@ -1098,21 +1121,22 @@ class z2ui5_cl_ui5_util_context { sy_tabix = 0; for (const lr_impl of lt_impl) { sy_tabix++; - fs_class = null; - if (_fs$fs_class) _fs$fs_class.o[_fs$fs_class.k] = fs_class; - ls_clskey.clsname = z2ui5_cl_util.abap_tab_assign(ls_clskey.clsname, z2ui5_cl_util.abap_copy(lr_impl.clsname)); - lv_fm = `SEO_CLASS_READ`; - // TODO(abap2js): CALL FUNCTION lv_fm EXPORTING clskey = ls_clskey IMPORTING class = EXCEPTIONS error_message = 1 OTHERS = 2. - if (sy_subrc !== 0) { - throw new z2ui5_cx_ui5_util_error(); - } - _fs$fs_description = ((_o, _c) => { if (_o == null) return null; const _k = typeof _c === "number" ? Object.keys(_o)[_c - 1] : String(_c).toLowerCase(); return _k != null && _k in _o ? { o: _o, k: _k } : null; })(fs_class, `DESCRIPT`); - fs_description = _fs$fs_description ? _fs$fs_description.o[_fs$fs_description.k] : null; - sy_subrc = _fs$fs_description ? 0 : 4; - if (!(sy_subrc === 0)) throw new Error(`ASSERT failed`); ls_class = { classname: ``, description: `` }; ls_class.classname = z2ui5_cl_util.abap_tab_assign(ls_class.classname, z2ui5_cl_util.abap_copy(lr_impl.clsname)); - ls_class.description = z2ui5_cl_util.abap_tab_assign(ls_class.description, z2ui5_cl_util.abap_copy(fs_description)); + if ((read_description === true || read_description === `X`)) { + fs_class = null; + if (_fs$fs_class) _fs$fs_class.o[_fs$fs_class.k] = fs_class; + ls_clskey.clsname = z2ui5_cl_util.abap_tab_assign(ls_clskey.clsname, z2ui5_cl_util.abap_copy(lr_impl.clsname)); + lv_fm = `SEO_CLASS_READ`; + // TODO(abap2js): CALL FUNCTION lv_fm EXPORTING clskey = ls_clskey IMPORTING class = EXCEPTIONS error_message = 1 OTHERS = 2. + if (sy_subrc === 0) { + _fs$fs_description = ((_o, _c) => { if (_o == null) return null; const _k = typeof _c === "number" ? Object.keys(_o)[_c - 1] : String(_c).toLowerCase(); return _k != null && _k in _o ? { o: _o, k: _k } : null; })(fs_class, `DESCRIPT`); + fs_description = _fs$fs_description ? _fs$fs_description.o[_fs$fs_description.k] : null; + sy_subrc = _fs$fs_description ? 0 : 4; + if (!(sy_subrc === 0)) throw new Error(`ASSERT failed`); + ls_class.description = z2ui5_cl_util.abap_tab_assign(ls_class.description, z2ui5_cl_util.abap_copy(fs_description)); + } + } result.push(z2ui5_cl_util.abap_copy(ls_class)); } return result; @@ -1665,13 +1689,16 @@ class z2ui5_cl_ui5_util_context { let lv_text; messages = null; is_row = false; - const lt_meta = z2ui5_cl_ui5_util_context.msg_get_rap_meta({ val: val }); + let lv_meta_built = false; + let lt_meta = []; _fs$fs_msg = ((_o, _c) => { if (_o == null) return null; const _k = typeof _c === "number" ? Object.keys(_o)[_c - 1] : String(_c).toLowerCase(); return _k != null && _k in _o ? { o: _o, k: _k } : null; })(val, `%MSG`); fs_msg = _fs$fs_msg ? _fs$fs_msg.o[_fs$fs_msg.k] : null; sy_subrc = _fs$fs_msg ? 0 : 4; if (sy_subrc === 0) { is_row = true; if (!z2ui5_cl_util.abap_is_initial(fs_msg)) { + lt_meta = z2ui5_cl_ui5_util_context.msg_get_rap_meta({ val: val }); + lv_meta_built = true; try { lt_one = z2ui5_cl_ui5_util_context.msg_get_t({ val: fs_msg }); sy_tabix = 0; @@ -1693,6 +1720,9 @@ class z2ui5_cl_ui5_util_context { fs_cause = _fs$fs_cause ? _fs$fs_cause.o[_fs$fs_cause.k] : null; sy_subrc = _fs$fs_cause ? 0 : 4; if (sy_subrc === 0) { + if (!(lv_meta_built === true || lv_meta_built === `X`)) { + lt_meta = z2ui5_cl_ui5_util_context.msg_get_rap_meta({ val: val }); + } let lv_cause = 0; lv_cause = z2ui5_cl_util.abap_tab_assign(lv_cause, z2ui5_cl_util.abap_copy(fs_cause)); lv_text = z2ui5_cl_ui5_util_context.msg_get_rap_fail_text({ cause: lv_cause }); diff --git a/run/input/core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_http.js b/run/input/core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_http.js index 3d6cd67..6791142 100644 --- a/run/input/core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_http.js +++ b/run/input/core/srv/z2ui5/00/03/z2ui5_cl_ui5_util_http.js @@ -151,6 +151,20 @@ class z2ui5_cl_ui5_util_http { } } catch (_caught1) { x = _caught1; + if (lo_client != null) { + try { + { + const _dynr = (lo_client); + const _dynm = _dynr ? _dynr[String(`CLOSE`).toLowerCase()] : undefined; + sy_subrc = typeof _dynm === "function" ? 0 : 4; + if (typeof _dynm === "function") { + const _dynargs = { }; + const _dynret = _dynm.call(_dynr, _dynargs); + } + } + } catch (error) { + } + } throw new z2ui5_cx_ui5_util_error({ val: x }); } return result; @@ -431,7 +445,7 @@ class z2ui5_cl_ui5_util_http { result.body = this.get_cdata(); result.method = this.get_method(); result.path = this.get_header_field({ val: `~path` }); - result.t_params = z2ui5_cl_ui5_util_context.url_param_get_tab(this.get_header_field({ val: `~request_uri` })); + result.t_params = z2ui5_cl_ui5_util_context.url_param_get_tab({ val: this.get_header_field({ val: `~request_uri` }) }); return result; } } diff --git a/run/input/core/srv/z2ui5/00/03/z2ui5_cx_ui5_util_error.js b/run/input/core/srv/z2ui5/00/03/z2ui5_cx_ui5_util_error.js index 9062157..d7cdde3 100644 --- a/run/input/core/srv/z2ui5/00/03/z2ui5_cx_ui5_util_error.js +++ b/run/input/core/srv/z2ui5/00/03/z2ui5_cx_ui5_util_error.js @@ -11,13 +11,14 @@ class z2ui5_cx_ui5_util_error extends cx_no_check { try { lo_root = z2ui5_cl_util.abap_cast(val); } catch (error) { - lv_text = z2ui5_cl_util.abap_tab_assign(lv_text, z2ui5_cl_util.abap_copy(val)); + if ((z2ui5_cl_ui5_util_context.rtti_check_printable({ val: val }) === true || z2ui5_cl_ui5_util_context.rtti_check_printable({ val: val }) === `X`)) { + lv_text = z2ui5_cl_util.abap_tab_assign(lv_text, z2ui5_cl_util.abap_copy(val)); + } } super({ previous: (previous != null ? previous : lo_root) }); this.textid = null; this.ms_error.x_root = lo_root; this.ms_error.text = z2ui5_cl_util.abap_tab_assign(this.ms_error.text, z2ui5_cl_util.abap_copy(lv_text)); - this.ms_error.uuid = z2ui5_cl_ui5_util_context.uuid_get_c32(); } get_text_own() { @@ -94,12 +95,12 @@ class z2ui5_cx_ui5_util_error extends cx_no_check { let sy_tabix = 0; let lx_own; const lv_nl = z2ui5_cl_util.abap_copy(z2ui5_cl_ui5_util_context.cv_char_util_newline); - result = `[${index}] ${z2ui5_cl_ui5_util_context.rtti_get_classname_by_ref(val)}`; + result = `[${index}] ${z2ui5_cl_ui5_util_context.rtti_get_classname_by_ref({ val: val })}`; const lv_text = z2ui5_cx_ui5_util_error.get_text_own_by_x({ val: val }); if (!z2ui5_cl_util.abap_is_initial(lv_text)) { result = result + lv_nl + ` text : ${lv_text}`; } - const lv_position = z2ui5_cl_ui5_util_context.error_get_source_position(val); + const lv_position = z2ui5_cl_ui5_util_context.error_get_source_position({ val: val }); if (!z2ui5_cl_util.abap_is_initial(lv_position)) { result = result + lv_nl + ` position : ${lv_position}`; } @@ -108,10 +109,13 @@ class z2ui5_cx_ui5_util_error extends cx_no_check { } try { lx_own = (val); + if (z2ui5_cl_util.abap_is_initial(lx_own.ms_error.uuid)) { + lx_own.ms_error.uuid = z2ui5_cl_ui5_util_context.uuid_get_c32(); + } result = result + lv_nl + ` id : ${lx_own.ms_error.uuid}`; } catch (error) { } - const lt_attri = z2ui5_cl_ui5_util_context.error_get_attributes(val); + const lt_attri = z2ui5_cl_ui5_util_context.error_get_attributes({ val: val }); sy_tabix = 0; for (const lr_attri of lt_attri) { sy_tabix++; @@ -125,12 +129,12 @@ class z2ui5_cx_ui5_util_error extends cx_no_check { let sy_sysid = ""; let sy_uname = ""; let sy_mandt = "000"; - let sy_langu = "E"; let sy_datum = ""; let sy_uzeit = ""; let sy_host = ""; + let sy_saprl = "OPEN"; const lv_nl = z2ui5_cl_util.abap_copy(z2ui5_cl_ui5_util_context.cv_char_util_newline); - result = `--- context ---` + lv_nl + ` system : ${sy_sysid} / client ${sy_mandt} / host ${sy_host} / release ${sy_saprl}` + lv_nl + ` user : ${sy_uname} / language ${sy_langu}` + lv_nl + ` time : ${sy_datum} ${sy_uzeit}`; + result = `--- context ---` + lv_nl + ` system : ${sy_sysid} / release ${sy_saprl}` + lv_nl + ` time : ${sy_datum} ${sy_uzeit}`; return result; } } diff --git a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_action.js b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_action.js index ba7100c..8a06748 100644 --- a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_action.js +++ b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_action.js @@ -118,7 +118,9 @@ class z2ui5_cl_ui5_action { result.ms_actual.view = req?.s_front?.view || ``; if (req?.o_model && typeof req.o_model.is_empty === `function` && req.o_model.is_empty() !== true) { - result.mo_app.model_json_parse(req?.s_front?.view || ``, req.o_model); + // the cells the delta could not apply travel with the roundtrip, so + // the app can name the field that was refused (client->get()-t_model_skipped) + result.ms_actual.t_model_skipped = result.mo_app.model_json_parse(req?.s_front?.view || ``, req.o_model) || []; } result.ms_actual.event = req?.s_front?.event || ``; diff --git a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_app_cont.js b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_app_cont.js index 596bb2c..317bfe3 100644 --- a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_app_cont.js +++ b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_app_cont.js @@ -63,9 +63,26 @@ class z2ui5_cl_ui5_app_cont { return model.main_json_stringify_instance(); } + /** + * Apply the incoming model delta and RETURN the cells it could not apply + * ({name, row, field} each). The trace has to travel back with the result: + * the model instance is created here and dropped on the next line, so a + * refused cell recorded on it is otherwise unreachable — which is how a + * typed price could vanish while the browser went on showing it. + */ model_json_parse(iv_view, io_model) { + // Upstream's signature is model_json_parse( io_model ) — one importing + // parameter. This port carries an extra leading `view`, which the + // framework passes and nothing else knows about, so a caller written + // against the ABAP signature handed the model in as `view` and the delta + // was silently never applied. Accept both shapes. + if (io_model === undefined) { + io_model = iv_view; + iv_view = ``; + } const model = this._create_model(); model.main_json_to_attri_instance(iv_view, io_model); + return model.mt_skipped || []; } /** diff --git a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_client.js b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_client.js index fb596ba..5e512fa 100644 --- a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_client.js +++ b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_client.js @@ -421,6 +421,33 @@ class z2ui5_cl_ui5_client { this._follow_up_actions.push(js); } + /** + * The `result IS SUPPLIED` branch of abap follow_up_action — the SAME wire + * string the statement form would queue, rendered and handed back instead. + * + * Upstream is one method with two behaviours: + * + * IF result IS SUPPLIED. + * result = mo_srv_event->get_event_client( … ). " queue NOTHING + * RETURN. + * ENDIF. + * … queue … + * + * JS cannot see whether a caller consumes a return value, so this is split + * in two and the transpiler picks: an assignment RHS becomes this method + * (RESULT_SUPPLIED_FORMS in scripts/abap2js.js), a bare call stays + * follow_up_action. Merging them would queue the action of every consumed + * call too — sample 000 builds a `press` attribute this way, and the + * REDIRECT it renders would fire as the gallery loads. + */ + follow_up_action_result(val, t_arg, view) { + if (val !== null && typeof val === `object` && `val` in val) ({ val, t_arg, view } = val); + if (this.mo_action) { + return this.mo_srv_event.get_event_client({ val: val ?? ``, view, t_arg: t_arg ?? [] }); + } + return z2ui5_cl_ui5_srv_event.get_event_client(val ?? ``, t_arg ?? []); + } + /** * Mirrors abap `client->action->gen( val = t_arg = [...] )` — * generates the `.eF([...])` follow-up action for a frontend event. @@ -715,6 +742,11 @@ class z2ui5_cl_ui5_client { CHECK_LEAVE: this._navStack.length > 0, }, R_EVENT_DATA: sFront.R_EVENT_DATA || null, + // Cells this roundtrip's delta refused — {name, row, field} each, filled + // by z2ui5_cl_ui5_srv_model.delta_apply_field. Reading it pushes no + // model, so the browser goes on showing the refused text until the app + // writes something; that is the point, the app decides what to say. + T_MODEL_SKIPPED: this.mo_action?.ms_actual?.t_model_skipped || [], }; } diff --git a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_frontend.js b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_frontend.js index 98209a1..e81641a 100644 --- a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_frontend.js +++ b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_frontend.js @@ -27,7 +27,7 @@ class z2ui5_cl_ui5_frontend { } } catch (_caught1) { lx_json = _caught1; - throw new z2ui5_cx_ui5_util_error({ val: `ACTION_BUILD_FAILED - ${lx_json.get_text()}` }); + throw new z2ui5_cx_ui5_util_error({ val: `ACTION_BUILD_FAILED`, previous: lx_json }); } return result; } @@ -63,16 +63,11 @@ class z2ui5_cl_ui5_frontend { this.slot_reset({ slot: slot }); try { li_opt = (z2ui5_cl_ajson.create_empty()); - this.set_opt_string({ json: li_opt, name: `id`, val: id }); - this.set_opt_string({ json: li_opt, name: `methodInsert`, val: method_insert }); - this.set_opt_string({ json: li_opt, name: `methodDestroy`, val: method_destroy }); - this.set_opt_string({ json: li_opt, name: `openById`, val: open_by_id }); - this.set_opt_string({ json: li_opt, name: `switchDefaultModelPath`, val: switch_default_model_path }); - this.set_opt_string({ json: li_opt, name: `switchDefaultModelAnnoUri`, val: switch_default_model_anno_uri }); + this.set_opt_strings({ json: li_opt, opt: [{ name: `id`, val: id }, { name: `methodInsert`, val: method_insert }, { name: `methodDestroy`, val: method_destroy }, { name: `openById`, val: open_by_id }, { name: `switchDefaultModelPath`, val: switch_default_model_path }, { name: `switchDefaultModelAnnoUri`, val: switch_default_model_anno_uri }] }); this.mo_action.ms_next.t_action_front.push(z2ui5_cl_util.abap_copy({ slot: slot, method: z2ui5_if_ui5_types.cs_slot_action.display, xml: xml, options: li_opt })); } catch (_caught1) { lx_json = _caught1; - throw new z2ui5_cx_ui5_util_error({ val: `SLOT_DISPLAY_OPTIONS_INVALID - ${lx_json.get_text()}` }); + throw new z2ui5_cx_ui5_util_error({ val: `SLOT_DISPLAY_OPTIONS_INVALID`, previous: lx_json }); } } @@ -109,17 +104,14 @@ class z2ui5_cl_ui5_frontend { li_opt = (z2ui5_cl_ajson.create_empty()); this.set_opt_bool({ json: li_opt, name: `setAppStateActive`, val: ls_nav.set_app_state_active }); this.set_opt_bool({ json: li_opt, name: `checkNavAppCall`, val: ls_nav.check_nav_app_call }); - this.set_opt_string({ json: li_opt, name: `setPushState`, val: ls_nav.set_push_state }); - this.set_opt_string({ json: li_opt, name: `setNavRouting`, val: ls_nav.set_nav_routing }); - this.set_opt_string({ json: li_opt, name: `navAppCallPrevApp`, val: ls_nav.nav_app_call_prev_app }); - this.set_opt_string({ json: li_opt, name: `navAppCallPrevId`, val: ls_nav.nav_app_call_prev_id }); + this.set_opt_strings({ json: li_opt, opt: [{ name: `setPushState`, val: ls_nav.set_push_state }, { name: `setNavRouting`, val: ls_nav.set_nav_routing }, { name: `navAppCallPrevApp`, val: ls_nav.nav_app_call_prev_app }, { name: `navAppCallPrevId`, val: ls_nav.nav_app_call_prev_id }] }); if ((li_opt.is_empty() === true || li_opt.is_empty() === `X`)) { return; } this.queue_system({ t_arg: [`ROUTER`, `sync`], opt: li_opt }); } catch (_caught1) { lx_json = _caught1; - throw new z2ui5_cx_ui5_util_error({ val: `NAV_OPTIONS_INVALID - ${lx_json.get_text()}` }); + throw new z2ui5_cx_ui5_util_error({ val: `NAV_OPTIONS_INVALID`, previous: lx_json }); } } @@ -130,21 +122,13 @@ class z2ui5_cl_ui5_frontend { li_opt = (z2ui5_cl_ajson.create_empty()); this.set_opt_int({ json: li_opt, name: `duration`, val: duration }); this.set_opt_int({ json: li_opt, name: `animationDuration`, val: animationduration }); - this.set_opt_string({ json: li_opt, name: `width`, val: width }); - this.set_opt_string({ json: li_opt, name: `my`, val: my }); - this.set_opt_string({ json: li_opt, name: `at`, val: at }); - this.set_opt_string({ json: li_opt, name: `of`, val: of }); - this.set_opt_string({ json: li_opt, name: `offset`, val: offset }); - this.set_opt_string({ json: li_opt, name: `collision`, val: collision }); - this.set_opt_string({ json: li_opt, name: `onClose`, val: onclose }); - this.set_opt_string({ json: li_opt, name: `animationTimingFunction`, val: animationtimingfunction }); - this.set_opt_string({ json: li_opt, name: `class`, val: class_ }); + this.set_opt_strings({ json: li_opt, opt: [{ name: `width`, val: width }, { name: `my`, val: my }, { name: `at`, val: at }, { name: `of`, val: of }, { name: `offset`, val: offset }, { name: `collision`, val: collision }, { name: `onClose`, val: onclose }, { name: `animationTimingFunction`, val: animationtimingfunction }, { name: `class`, val: class_ }] }); this.set_opt_bool({ json: li_opt, name: `autoClose`, val: autoclose, default_val: true }); this.set_opt_bool({ json: li_opt, name: `closeOnBrowserNavigation`, val: closeonbrowsernavigation, default_val: true }); this.queue_app({ t_arg: [`MESSAGE_TOAST`, `show`, (text)], opt: li_opt }); } catch (_caught1) { lx_json = _caught1; - throw new z2ui5_cx_ui5_util_error({ val: `MESSAGE_TOAST_OPTIONS_INVALID - ${lx_json.get_text()}` }); + throw new z2ui5_cx_ui5_util_error({ val: `MESSAGE_TOAST_OPTIONS_INVALID`, previous: lx_json }); } } @@ -158,15 +142,7 @@ class z2ui5_cl_ui5_frontend { } try { li_opt = (z2ui5_cl_ajson.create_empty()); - this.set_opt_string({ json: li_opt, name: `title`, val: ls_msg.title }); - this.set_opt_string({ json: li_opt, name: `styleClass`, val: styleclass }); - this.set_opt_string({ json: li_opt, name: `onClose`, val: onclose }); - this.set_opt_string({ json: li_opt, name: `emphasizedAction`, val: emphasizedaction }); - this.set_opt_string({ json: li_opt, name: `initialFocus`, val: initialfocus }); - this.set_opt_string({ json: li_opt, name: `textDirection`, val: textdirection }); - this.set_opt_string({ json: li_opt, name: `details`, val: ls_msg.details }); - this.set_opt_string({ json: li_opt, name: `dependentOn`, val: dependenton }); - this.set_opt_string({ json: li_opt, name: `contentWidth`, val: contentwidth }); + this.set_opt_strings({ json: li_opt, opt: [{ name: `title`, val: ls_msg.title }, { name: `styleClass`, val: styleclass }, { name: `onClose`, val: onclose }, { name: `emphasizedAction`, val: emphasizedaction }, { name: `initialFocus`, val: initialfocus }, { name: `textDirection`, val: textdirection }, { name: `details`, val: ls_msg.details }, { name: `dependentOn`, val: dependenton }, { name: `contentWidth`, val: contentwidth }] }); if (icon !== `NONE`) { this.set_opt_string({ json: li_opt, name: `icon`, val: icon }); } @@ -182,7 +158,7 @@ class z2ui5_cl_ui5_frontend { this.queue_app({ t_arg: [`MESSAGE_BOX`, ls_msg.type, ls_msg.text], opt: li_opt }); } catch (_caught1) { lx_json = _caught1; - throw new z2ui5_cx_ui5_util_error({ val: `MESSAGE_BOX_OPTIONS_INVALID - ${lx_json.get_text()}` }); + throw new z2ui5_cx_ui5_util_error({ val: `MESSAGE_BOX_OPTIONS_INVALID`, previous: lx_json }); } } @@ -191,8 +167,8 @@ class z2ui5_cl_ui5_frontend { if (z2ui5_cl_util.abap_is_initial(z2ui5_cl_ui5_frontend.ct_box_type)) { z2ui5_cl_ui5_frontend.ct_box_type = z2ui5_cl_util.abap_tab_assign(z2ui5_cl_ui5_frontend.ct_box_type, [`show`, `alert`, `confirm`, `information`, `warning`, `error`, `success`]); } - if (!(z2ui5_cl_ui5_util_context.rtti_check_clike(text) === true || z2ui5_cl_ui5_util_context.rtti_check_clike(text) === `X`)) { - result = z2ui5_cl_ui5_util_context.ui5_msg_box_format(text); + if (!(z2ui5_cl_ui5_util_context.rtti_check_clike({ val: text }) === true || z2ui5_cl_ui5_util_context.rtti_check_clike({ val: text }) === `X`)) { + result = z2ui5_cl_ui5_util_context.ui5_msg_box_format({ val: text }); if ((result.skip === true || result.skip === `X`)) { return result; } @@ -221,6 +197,15 @@ class z2ui5_cl_ui5_frontend { } } + set_opt_strings({ json, opt } = {}) { + let sy_tabix = 0; + sy_tabix = 0; + for (const ls_opt of opt) { + sy_tabix++; + this.set_opt_string({ json, name: ls_opt.name, val: ls_opt.val }); + } + } + set_opt_int({ json, name, val } = {}) { const lv_val = (val).trim(); if (!z2ui5_cl_util.abap_is_initial(lv_val) && [...String(lv_val)].every(($c) => String(`0123456789`).includes($c))) { diff --git a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_srv_model.js b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_srv_model.js index 568408c..126f4eb 100644 --- a/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_srv_model.js +++ b/run/input/core/srv/z2ui5/01/02/z2ui5_cl_ui5_srv_model.js @@ -51,6 +51,16 @@ const MAX_DISSOLVE_DEPTH = 5; const TK = { table: `h`, dref: `l`, oref: `r`, struct1: `u`, struct2: `v` }; const KD = { elem: `E`, struct: `S`, table: `T`, ref: `R`, class: `C` }; +/** Text that converts losslessly into a numeric ABAP component. Deliberately + * stricter than Number(): an empty string is NOT numeric text (ABAP reads it + * as 0 and the caller keeps that path), and `1,250.00` is not either — a + * thousands separator is exactly the input the skip trace exists for. */ +function isNumericText(v) { + if (typeof v === `number`) return Number.isFinite(v); + if (typeof v !== `string` || v.trim() === ``) return false; + return !Number.isNaN(Number(v)); +} + /** plain data object (struct/table) — never a class instance */ function isPlainData(v) { if (Array.isArray(v)) return true; @@ -218,6 +228,13 @@ class z2ui5_cl_ui5_srv_model { : Array.isArray(attri) ? { value: attri } : { value: [] }; this.mo_app = app; + // Cells this roundtrip's delta could not apply — {name, row, field} each, + // read back by the handler and handed to the app as + // client->get()-t_model_skipped. A refused cell used to vanish without a + // word: the old value stayed in the model while the browser went on + // showing what the user typed, and nothing could tell the app which field + // was refused. See _delta_apply_field. + this.mt_skipped = []; } // ----- path resolution ----- @@ -706,7 +723,7 @@ class z2ui5_cl_ui5_srv_model { if (!Array.isArray(tab)) return; if (io_val_front && typeof io_val_front.slice === `function` && Array.isArray(io_val_front.mt_json_tree)) { - this._delta_apply_nodes(io_val_front.slice(`/__delta`), tab); + this._delta_apply_nodes(io_val_front.slice(`/__delta`), tab, iv_name); return; } @@ -715,8 +732,11 @@ class z2ui5_cl_ui5_srv_model { z2ui5_cl_ui5_srv_model._apply_table_delta(tab, delta); } - /** abap delta_apply_nodes — recursive ajson delta walk. */ - _delta_apply_nodes(io_delta, ct_tab) { + /** abap delta_apply_nodes — recursive ajson delta walk. `iv_table` is the + * bound attribute the rows belong to, spelled as the app declared it + * (`MT_PRODUCTS`, or parent-first `MT_TREE-NODES` for a nested table); it + * is only carried so a refused cell can name itself in mt_skipped. */ + _delta_apply_nodes(io_delta, ct_tab, iv_table = ``) { for (const idxStr of io_delta.members(`/`)) { // the delta key is a client-supplied row index; a garbled // (non-numeric) key must skip that row, not abort the request @@ -729,7 +749,9 @@ class z2ui5_cl_ui5_srv_model { for (const fld of lo_row.members(`/`)) { const key = z2ui5_cl_ui5_srv_model._match_key(row, fld); if (key === undefined) continue; - this._delta_apply_field(lo_row, `/${fld}`, row, key); + // the trace entry for this cell, resolved once: ABAP-side names and a + // 1-based row, so the handler has nothing left to derive + this._delta_apply_field(lo_row, `/${fld}`, row, key, { name: iv_table, row: idx + 1, field: fld }); } } } @@ -737,9 +759,13 @@ class z2ui5_cl_ui5_srv_model { /** * abap delta_apply_field — apply one delta field value into the referenced * row component. A single malformed cell (e.g. text into a numeric target) - * is skipped here so it cannot abort the whole model batch. + * is skipped here so it cannot abort the whole model batch — and the skip + * is RECORDED in mt_skipped (`is_cell`, resolved by the caller), because a + * cell that vanishes without a word is what made a typed price disappear + * while the browser kept showing it. */ - _delta_apply_field(lo_row, p, row, key) { + _delta_apply_field(lo_row, p, row, key, is_cell = null) { + const refuse = () => { if (is_cell) this.mt_skipped.push(is_cell); }; try { const nodeType = lo_row.get_node_type(p); @@ -750,7 +776,11 @@ class z2ui5_cl_ui5_srv_model { // component shipped as a whole value const lo_sub = lo_row.slice(p); if (lo_sub.exists(`/__delta`) === true) { - if (Array.isArray(row[key])) this._delta_apply_nodes(lo_sub.slice(`/__delta`), row[key]); + // a nested row cell traces under the path to its OWN table, + // parent first — MT_TREE-NODES, not MT_TREE + if (Array.isArray(row[key])) { + this._delta_apply_nodes(lo_sub.slice(`/__delta`), row[key], is_cell ? `${is_cell.name}-${is_cell.field}` : ``); + } } else { const args = { iv_corresponding: true, ev_container: row[key] }; lo_sub.to_abap(args); @@ -764,18 +794,27 @@ class z2ui5_cl_ui5_srv_model { } else { // numbers go through the raw string — lossless into the target type const s = lo_row.get_string(p); + // A numeric TARGET is one that currently holds a number. ABAP checks + // the declared component type instead, which JS does not carry: a row + // is a plain object and `price` (TYPE p) is indistinguishable from + // `col2` (TYPE string) once both hold the text `'2'`. Guessing from + // the text — "looks numeric, so the component must be numeric" — + // refuses `Y` into a string column that happens to hold `2`, which is + // ordinary, correct input. So the narrow, type-honest rule stands and + // two upstream tests stay baselined; see the js-limit entries for + // ltcl_test_delta_apply. if (typeof row[key] === `number`) { - const n = Number(s); // text sent into a numeric target — skip just this cell - if (Number.isNaN(n)) return; - row[key] = n; + if (!isNumericText(s)) { refuse(); return; } + row[key] = Number(s); } else { row[key] = s; } } } catch { // a single malformed cell must not discard every other edit in this - // batch — skip just it + // batch — skip just it, and say so + refuse(); } } diff --git a/run/input/core/srv/z2ui5/01/02/z2ui5_if_ui5_types.js b/run/input/core/srv/z2ui5/01/02/z2ui5_if_ui5_types.js index 5a76b83..05b854a 100644 --- a/run/input/core/srv/z2ui5/01/02/z2ui5_if_ui5_types.js +++ b/run/input/core/srv/z2ui5/01/02/z2ui5_if_ui5_types.js @@ -93,6 +93,10 @@ const z2ui5_if_ui5_types = Object.freeze({ s_draft: z2ui5_if_ui5_types.ty_s_draft(), s_config: { origin: ``, pathname: ``, search: `` }, r_data: null, + // cells the incoming delta could not apply — see + // z2ui5_cl_ui5_srv_model.mt_skipped; belongs to THIS roundtrip and is + // rebuilt on the next one + t_model_skipped: [], }; }, diff --git a/run/input/core/srv/z2ui5/01/03/z2ui5_cl_ui5f_abapsrc_js.js b/run/input/core/srv/z2ui5/01/03/z2ui5_cl_ui5f_abapsrc_js.js index f55dcaa..a339ab1 100644 --- a/run/input/core/srv/z2ui5/01/03/z2ui5_cl_ui5f_abapsrc_js.js +++ b/run/input/core/srv/z2ui5/01/03/z2ui5_cl_ui5f_abapsrc_js.js @@ -2,45 +2,23 @@ class z2ui5_cl_ui5f_abapsrc_js { static get() { let result = ``; - result = `// The running app's ABAP class, reached from the browser.` + ` -` + `//` + ` -` + `// Split out of devtools/DeveloperTools.js: fetching the class source,` + ` -` + `// building the ADT deep link and framing the ADT endpoint are one` + ` -` + `// subject, and none of it needs the dialog. The source cache lives here` + ` -` + `// too - three callers want the same class text (the ABAP Source tab, the` + ` -` + `// ADT jump's line lookup and the export), and fetching it three times` + ` -` + `// would be three requests for one answer.` + ` -` + `sap.ui.define(` + ` + result = `sap.ui.define(` + ` ` + ` ["z2ui5/core/AppState", "z2ui5/devtools/Inspect"],` + ` ` + ` (AppState, Inspect) => {` + ` ` + ` "use strict";` + ` ` + `` + ` -` + ` // { app, source } of the last fetch - the class name is part of it` + ` -` + ` // because a navigation swaps the app under the tools and the cached` + ` -` + ` // source would otherwise be attributed to the new one.` + ` ` + ` let cache = null;` + ` ` + `` + ` -` + ` // The class name of the running app, as the backend reported it in` + ` -` + ` // the last response. Empty before the first response arrived.` + ` ` + ` function appName() {` + ` ` + ` return AppState.state.responseData?.S_FRONT?.APP || "";` + ` ` + ` }` + ` ` + `` + ` -` + ` // The ADT REST endpoint that renders the running app's ABAP class` + ` -` + ` // source. Empty when the app class name is unknown (no response yet).` + ` ` + ` function sourceUrl() {` + ` ` + ` const name = appName();` + ` ` + ` if (!name) return "";` + ` ` + ` return \`\${window.location.origin}/sap/bc/adt/oo/classes/\${encodeURIComponent(name)}/source/main\`;` + ` ` + ` }` + ` ` + `` + ` -` + ` // The ADT url, deep-linked at the handler of the event the last` + ` -` + ` // roundtrip carried when that is possible: the ADT source endpoint` + ` -` + ` // honours a "#start=," anchor, and the event name is a` + ` -` + ` // literal in the class that handles it. Needs the source in the cache` + ` -` + ` // (the ABAP Source tab warms it); without it, or when the name is not` + ` -` + ` // found, the plain class url is returned - the jump is a shortcut,` + ` -` + ` // never a precondition.` + ` ` + ` function adtUrl() {` + ` ` + ` const url = sourceUrl();` + ` ` + ` if (!url) return "";` + ` @@ -50,36 +28,18 @@ class z2ui5_cl_ui5f_abapsrc_js { ` + ` return lineNumber ? \`\${url}#start=\${lineNumber},1\` : url;` + ` ` + ` }` + ` ` + `` + ` -` + ` // Open the ABAP class source as a top-level document in a new browser` + ` -` + ` // tab. The ADT REST endpoint renders it with syntax highlighting and` + ` -` + ` // its own "Open in ABAP Development Tools" link; opening it top-level` + ` -` + ` // is what lets that link's adt:// navigation reach the desktop ADT.` + ` -` + ` // From inside the inline iframe the jump never worked - browsers` + ` -` + ` // suppress a custom-scheme navigation started in a subframe, and some` + ` -` + ` // systems block framing the ADT endpoint entirely (X-Frame-Options),` + ` -` + ` // so the preview is just blank there. noopener keeps the new tab from` + ` -` + ` // reaching back into window.opener.` + ` ` + ` function openInAdt() {` + ` -` + ` // Stays synchronous: a window.open after an await is treated as an` + ` -` + ` // unrequested popup and blocked.` + ` ` + ` const url = adtUrl();` + ` ` + ` if (!url) return;` + ` ` + ` window.open(url, "_blank", "noopener,noreferrer");` + ` ` + ` }` + ` ` + `` + ` -` + ` // The iframe markup for the inline preview, or "" when the class is` + ` -` + ` // unknown.` + ` ` + ` function iframeHtml() {` + ` ` + ` const url = sourceUrl();` + ` ` + ` if (!url) return "";` + ` ` + ` return \`