From 1f5ae23161b5620c460bd74544d51bcbd57297f6 Mon Sep 17 00:00:00 2001 From: panish16 Date: Mon, 3 Aug 2026 11:53:08 -0700 Subject: [PATCH 01/10] chore: upgrade pnpm to v11.9.0 across all STRR apps Pin pnpm_version to 11.9.0 in CI workflows, set packageManager field via corepack, and add pnpm-workspace.yaml with allowBuilds for native deps (@parcel/watcher, esbuild, sharp, unrs-resolver) required under pnpm 11's stricter build-script gating. --- .github/workflows/strr-base-web-ci.yaml | 1 + .github/workflows/strr-examiner-ui-ci.yaml | 2 +- .github/workflows/strr-host-pm-ui-ci.yaml | 2 +- .github/workflows/strr-platform-ui-ci.yaml | 2 +- .github/workflows/strr-strata-ui-ci.yaml | 2 +- strr-base-web/package.json | 3 ++- strr-base-web/pnpm-workspace.yaml | 6 ++++++ strr-examiner-web/package.json | 3 ++- strr-examiner-web/pnpm-workspace.yaml | 6 ++++++ strr-host-pm-web/package.json | 2 +- strr-host-pm-web/pnpm-workspace.yaml | 6 ++++++ strr-platform-web/package.json | 3 ++- strr-platform-web/pnpm-workspace.yaml | 6 ++++++ strr-strata-web/package.json | 3 ++- strr-strata-web/pnpm-workspace.yaml | 6 ++++++ 15 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 strr-base-web/pnpm-workspace.yaml create mode 100644 strr-examiner-web/pnpm-workspace.yaml create mode 100644 strr-host-pm-web/pnpm-workspace.yaml create mode 100644 strr-platform-web/pnpm-workspace.yaml create mode 100644 strr-strata-web/pnpm-workspace.yaml diff --git a/.github/workflows/strr-base-web-ci.yaml b/.github/workflows/strr-base-web-ci.yaml index 6c5bf5397..22a414051 100644 --- a/.github/workflows/strr-base-web-ci.yaml +++ b/.github/workflows/strr-base-web-ci.yaml @@ -18,4 +18,5 @@ jobs: app_name: "strr-base-web-ui" working_directory: "./strr-base-web" codecov_flag: "strrbasewebui" + pnpm_version: 11.9.0 node_version: 24 diff --git a/.github/workflows/strr-examiner-ui-ci.yaml b/.github/workflows/strr-examiner-ui-ci.yaml index d174d8ad9..a68997770 100644 --- a/.github/workflows/strr-examiner-ui-ci.yaml +++ b/.github/workflows/strr-examiner-ui-ci.yaml @@ -19,4 +19,4 @@ jobs: working_directory: "./strr-examiner-web" codecov_flag: "strrexaminerui" node_version: 24 - pnpm_version: 10.0.0 + pnpm_version: 11.9.0 diff --git a/.github/workflows/strr-host-pm-ui-ci.yaml b/.github/workflows/strr-host-pm-ui-ci.yaml index 1165b406a..01749eb72 100644 --- a/.github/workflows/strr-host-pm-ui-ci.yaml +++ b/.github/workflows/strr-host-pm-ui-ci.yaml @@ -19,4 +19,4 @@ jobs: working_directory: "./strr-host-pm-web" codecov_flag: "strrhostpmui" node_version: 24 - pnpm_version: 10.0.0 + pnpm_version: 11.9.0 diff --git a/.github/workflows/strr-platform-ui-ci.yaml b/.github/workflows/strr-platform-ui-ci.yaml index 200cca511..7a3a7a2fd 100644 --- a/.github/workflows/strr-platform-ui-ci.yaml +++ b/.github/workflows/strr-platform-ui-ci.yaml @@ -19,4 +19,4 @@ jobs: working_directory: "./strr-platform-web" codecov_flag: "strrplatformui" node_version: 24 - pnpm_version: 10.0.0 + pnpm_version: 11.9.0 diff --git a/.github/workflows/strr-strata-ui-ci.yaml b/.github/workflows/strr-strata-ui-ci.yaml index 760d54deb..5b09e469f 100644 --- a/.github/workflows/strr-strata-ui-ci.yaml +++ b/.github/workflows/strr-strata-ui-ci.yaml @@ -19,4 +19,4 @@ jobs: working_directory: "./strr-strata-web" codecov_flag: "strrstrataui" node_version: 24 - pnpm_version: 10.0.0 + pnpm_version: 11.9.0 diff --git a/strr-base-web/package.json b/strr-base-web/package.json index 44a274580..101b13b53 100644 --- a/strr-base-web/package.json +++ b/strr-base-web/package.json @@ -53,5 +53,6 @@ "luxon": "^3.5.0", "nuxt-gtag": "^3.0.3", "vue-country-flag-next": "^2.3.2" - } + }, + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/strr-base-web/pnpm-workspace.yaml b/strr-base-web/pnpm-workspace.yaml new file mode 100644 index 000000000..19dcc72cc --- /dev/null +++ b/strr-base-web/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: [] +allowBuilds: + '@parcel/watcher': true + esbuild: true + sharp: true + unrs-resolver: true diff --git a/strr-examiner-web/package.json b/strr-examiner-web/package.json index 09bf8eb34..fbdd60c08 100644 --- a/strr-examiner-web/package.json +++ b/strr-examiner-web/package.json @@ -53,5 +53,6 @@ "nuxt": "3.15.4", "uuid": "^11.1.0", "v-calendar": "^3.1.2" - } + }, + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/strr-examiner-web/pnpm-workspace.yaml b/strr-examiner-web/pnpm-workspace.yaml new file mode 100644 index 000000000..19dcc72cc --- /dev/null +++ b/strr-examiner-web/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: [] +allowBuilds: + '@parcel/watcher': true + esbuild: true + sharp: true + unrs-resolver: true diff --git a/strr-host-pm-web/package.json b/strr-host-pm-web/package.json index ebb2dc66d..564dc60b8 100644 --- a/strr-host-pm-web/package.json +++ b/strr-host-pm-web/package.json @@ -56,5 +56,5 @@ "uuid": "^11.1.0", "vue-country-flag-next": "^2.3.2" }, - "packageManager": "pnpm@10.21.0+sha1.a2cb35d3f07a58fecfe050af9277c5dc43a1b2e7" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/strr-host-pm-web/pnpm-workspace.yaml b/strr-host-pm-web/pnpm-workspace.yaml new file mode 100644 index 000000000..19dcc72cc --- /dev/null +++ b/strr-host-pm-web/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: [] +allowBuilds: + '@parcel/watcher': true + esbuild: true + sharp: true + unrs-resolver: true diff --git a/strr-platform-web/package.json b/strr-platform-web/package.json index 085d210ee..a4be4be6e 100644 --- a/strr-platform-web/package.json +++ b/strr-platform-web/package.json @@ -50,5 +50,6 @@ "country-codes-list": "^2.0.0", "nuxt": "3.15.4", "vue-country-flag-next": "^2.3.2" - } + }, + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/strr-platform-web/pnpm-workspace.yaml b/strr-platform-web/pnpm-workspace.yaml new file mode 100644 index 000000000..19dcc72cc --- /dev/null +++ b/strr-platform-web/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: [] +allowBuilds: + '@parcel/watcher': true + esbuild: true + sharp: true + unrs-resolver: true diff --git a/strr-strata-web/package.json b/strr-strata-web/package.json index adbddcf5a..afc8da09e 100644 --- a/strr-strata-web/package.json +++ b/strr-strata-web/package.json @@ -51,5 +51,6 @@ "nuxt": "3.15.4", "vue-country-flag-next": "^2.3.2", "vue-router": "^4.6.4" - } + }, + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/strr-strata-web/pnpm-workspace.yaml b/strr-strata-web/pnpm-workspace.yaml new file mode 100644 index 000000000..19dcc72cc --- /dev/null +++ b/strr-strata-web/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: [] +allowBuilds: + '@parcel/watcher': true + esbuild: true + sharp: true + unrs-resolver: true From ca08de705b0903e9555ff7fa352d9eb492228bdc Mon Sep 17 00:00:00 2001 From: panish16 Date: Mon, 3 Aug 2026 12:25:11 -0700 Subject: [PATCH 02/10] fix: declare tailwindcss as explicit devDependency in downstream apps pnpm 11's stricter hoisting no longer resolves tailwindcss transitively for eslint-plugin-tailwindcss in examiner/host-pm/platform/strata, crashing eslint entirely (Could not find tailwindcss). It was already present in each lockfile as a transitive dep; declaring it directly fixes resolution without changing the resolved version (3.4.19). --- strr-examiner-web/package.json | 1 + strr-examiner-web/pnpm-lock.yaml | 3 + strr-host-pm-web/package.json | 1 + strr-host-pm-web/pnpm-lock.yaml | 64 ++++++++++ strr-platform-web/package.json | 1 + strr-platform-web/pnpm-lock.yaml | 50 +++++++- strr-strata-web/package.json | 1 + strr-strata-web/pnpm-lock.yaml | 204 +++++++++++++++++++++++-------- 8 files changed, 276 insertions(+), 49 deletions(-) diff --git a/strr-examiner-web/package.json b/strr-examiner-web/package.json index fbdd60c08..a931ad001 100644 --- a/strr-examiner-web/package.json +++ b/strr-examiner-web/package.json @@ -44,6 +44,7 @@ "otplib": "^12.0.1", "playwright-core": "^1.57.0", "sass": "^1.77.6", + "tailwindcss": "^3.4.19", "typescript": "^5.9.3", "vitest": "3.2.4" }, diff --git a/strr-examiner-web/pnpm-lock.yaml b/strr-examiner-web/pnpm-lock.yaml index ae9f8389d..2ec7db5e2 100644 --- a/strr-examiner-web/pnpm-lock.yaml +++ b/strr-examiner-web/pnpm-lock.yaml @@ -84,6 +84,9 @@ importers: sass: specifier: ^1.77.6 version: 1.100.0 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 diff --git a/strr-host-pm-web/package.json b/strr-host-pm-web/package.json index 564dc60b8..8cf4ad729 100644 --- a/strr-host-pm-web/package.json +++ b/strr-host-pm-web/package.json @@ -44,6 +44,7 @@ "otpauth": "^9.4.1", "playwright-core": "^1.55.0", "sass": "^1.90.0", + "tailwindcss": "^3.4.19", "typescript": "^5.9.2", "vitest": "^3.2.4", "vue-tsc": "^3.3.8" diff --git a/strr-host-pm-web/pnpm-lock.yaml b/strr-host-pm-web/pnpm-lock.yaml index abca85c0e..2e064a5c7 100644 --- a/strr-host-pm-web/pnpm-lock.yaml +++ b/strr-host-pm-web/pnpm-lock.yaml @@ -90,6 +90,9 @@ importers: sass: specifier: ^1.90.0 version: 1.100.0 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19(yaml@2.9.0) typescript: specifier: ^5.9.2 version: 5.9.3 @@ -1100,89 +1103,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1593,48 +1612,56 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.128.0': resolution: {integrity: sha512-M7iwBGmYJTx+pKOYFjI0buop4gJvlmcVzFGaXPt21DKpQkbQZG1f63Yg7LloIYT/t9yLxCw0Lhfx/RFlAlMSjA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.128.0': resolution: {integrity: sha512-21LGNIZb1Pcfk5/EGsqabrxv4yqQOWis1407JJrClS7XpFCrbvr74YAB1V+m54cYbwvO6UWwQqS4WecxiyfCRg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.128.0': resolution: {integrity: sha512-gyHjOTFpg9bTTYjxPmQirvufb89+VdZwVfcMtAUyPr6F5H8ZswvCQshK4qOW+Q+2Xyb33hduRgY/eFHJQjU/vQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.128.0': resolution: {integrity: sha512-X6Q2oKUrP5GyDd2xniuEBLk6aFQCZ97W2+aVXGgJXdjx5t4/oFuA9ri0wLOUrBIX+qdSuK581snMBio4z910eA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.128.0': resolution: {integrity: sha512-BdzTmqxfxoYkpgokoLaSnOX6T+R3/goL42klre2tnG+kHbG2TXS0VN+P5BPofH1axdKOHy5ei4ENZrjmCOt2lA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.128.0': resolution: {integrity: sha512-OO1nW2Q7sSYYvJZpDHdvyFSdRaVcQqRijZSSmWVMqFxPYy8cEF45zJ9fcdIYuzIT3jYq6YRhEFm/VMWNWhE22Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.128.0': resolution: {integrity: sha512-4NehAe404MRdoZVS9DW8C5XbJwbXIc/KfVlYdpi5vE4081zc9Y0YzKVqyOYj/Puye7/Do+ohaONBFWlEHYl9hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.128.0': resolution: {integrity: sha512-kVbqgW9xLL8bh8oc7aYOJilRKXE5G33+tE0jan+duo/9OriaFRpijcCwT2waWs2oqYROYq0GlE7/p3ywoshVeg==} @@ -1715,48 +1742,56 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-arm64-musl@0.128.0': resolution: {integrity: sha512-dPSjyd0gQ9dE3mpdJi0BHNJaqQz4V7mVW6Fbs6jRSiGnrxwGfXdMJFInXoJ49B3k5Zhfa9Is9Ixp6St7c6ouCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-ppc64-gnu@0.128.0': resolution: {integrity: sha512-YNa9XAotPKvAXFJrHC7kBsHMVg0HOB4vRiKuYUjzFsfLkxTbuztKHTKG/gW5kjp7dBw+TNFofTaVCVZgOnHXPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-riscv64-gnu@0.128.0': resolution: {integrity: sha512-jjSiG9H8ya/U3igW5DdIBFIDwhffF7Vbc7th2tcHV73eg0DQz75n36a9RmQ1/0aS9vknUuNtY6SODr8/gmuzsQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-riscv64-musl@0.128.0': resolution: {integrity: sha512-FVUr/XNT7BfQA4XVMel/HTCJi5mQyEitslgX42ztYPnCFMRFG1sQQKgnlLJdl7qifuyxpvKLR1f7h7HEuwWw1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-s390x-gnu@0.128.0': resolution: {integrity: sha512-caJnVw5PG8v339zAyHgA7p34xXa3A4Kc9VyrDgsT1znr51qacaUv4BRlgRi0qkqxRWXYNVFfsbU2g0t1qS7E9w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-gnu@0.128.0': resolution: {integrity: sha512-zkQKjsHEUX3ckQBcZTtHE/7pgFMkWQp6y/4t7N8eT3j8wnoL+vapv7l4ISjgx1/EePRJN1HErYXmriz7tPVKRg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-musl@0.128.0': resolution: {integrity: sha512-NjYtwl9ijp34iisHxYBvE7nii1Ac0QPP3doHv8MQHhDA3zjUcDCROuBNybfaEYCxnJ1aF+cAPqsyeopnAGsyuQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-transform/binding-openharmony-arm64@0.128.0': resolution: {integrity: sha512-itsi0tVkVdrYphSppdFChLq9tD0pvbRRS3EV8NQYKZ/NWHMoxzjlf9TFA/ZZYV113juYo1Dq3glVX48knhBeFQ==} @@ -1816,36 +1851,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.5.6': resolution: {integrity: sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==} @@ -2035,66 +2076,79 @@ packages: resolution: {integrity: sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.4': resolution: {integrity: sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.4': resolution: {integrity: sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.4': resolution: {integrity: sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.4': resolution: {integrity: sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.4': resolution: {integrity: sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.4': resolution: {integrity: sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.4': resolution: {integrity: sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.4': resolution: {integrity: sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.4': resolution: {integrity: sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.4': resolution: {integrity: sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.4': resolution: {integrity: sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.4': resolution: {integrity: sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.60.4': resolution: {integrity: sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==} @@ -2430,51 +2484,61 @@ packages: resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.12.2': resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} cpu: [loong64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-loong64-musl@1.12.2': resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} cpu: [loong64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.12.2': resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.12.2': resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-openharmony-arm64@1.12.2': resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} diff --git a/strr-platform-web/package.json b/strr-platform-web/package.json index a4be4be6e..9f99dbe73 100644 --- a/strr-platform-web/package.json +++ b/strr-platform-web/package.json @@ -41,6 +41,7 @@ "happy-dom": "^20.0.11", "playwright-core": "^1.49.1", "sass": "^1.77.6", + "tailwindcss": "^3.4.19", "typescript": "^5.5.3", "vitest": "3.2.4", "otpauth": "^9.3.6" diff --git a/strr-platform-web/pnpm-lock.yaml b/strr-platform-web/pnpm-lock.yaml index 9b3a6e055..4daf0f199 100644 --- a/strr-platform-web/pnpm-lock.yaml +++ b/strr-platform-web/pnpm-lock.yaml @@ -81,6 +81,9 @@ importers: sass: specifier: ^1.77.6 version: 1.97.1 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19(yaml@2.8.2) typescript: specifier: ^5.5.3 version: 5.9.3 @@ -1224,36 +1227,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.95.0': resolution: {integrity: sha512-Pvi1lGe/G+mJZ3hUojMP/aAHAzHA25AEtVr8/iuz7UV72t/15NOgJYr9kELMUMNjPqpr3vKUgXTFmTtAxp11Qw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-riscv64-gnu@0.95.0': resolution: {integrity: sha512-pUEVHIOVNDfhk4sTlLhn6mrNENhE4/dAwemxIfqpcSyBlYG0xYZND1F3jjR2yWY6DakXZ6VSuDbtiv1LPNlOLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-s390x-gnu@0.95.0': resolution: {integrity: sha512-5+olaepHTE3J/+w7g0tr3nocvv5BKilAJnzj4L8tWBCLEZbL6olJcGVoldUO+3cgg1SO1xJywP5BuLhT0mDUDw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.95.0': resolution: {integrity: sha512-8huzHlK/N98wrnYKxIcYsK8ZGBWomQchu/Mzi6m+CtbhjWOv9DmK0jQ2fUWImtluQVpTwS0uZT06d3g7XIkJrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.95.0': resolution: {integrity: sha512-bWnrLfGDcx/fab0+UQnFbVFbiykof/btImbYf+cI2pU/1Egb2x+OKSmM5Qt0nEUiIpM5fgJmYXxTopybSZOKYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-parser/binding-wasm32-wasi@0.95.0': resolution: {integrity: sha512-0JLyqkZu1HnQIZ4e5LBGOtzqua1QwFEUOoMSycdoerXqayd4LK2b7WMfAx8eCIf+jGm1Uj6f3R00nlsx8g1faQ==} @@ -1316,36 +1325,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-arm64-musl@0.95.0': resolution: {integrity: sha512-GL0ffCPW8JlFI0/jeSgCY665yDdojHxA0pbYG+k8oEHOWCYZUZK9AXL+r0oerNEWYJ8CRB+L5Yq87ZtU/YUitw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-riscv64-gnu@0.95.0': resolution: {integrity: sha512-tbH7LaClSmN3YFVo1UjMSe7D6gkb5f+CMIbj9i873UUZomVRmAjC4ygioObfzM+sj/tX0WoTXx5L1YOfQkHL6Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-s390x-gnu@0.95.0': resolution: {integrity: sha512-8jMqiURWa0iTiPMg7BWaln89VdhhWzNlPyKM90NaFVVhBIKCr2UEhrQWdpBw/E9C8uWf/4VabBEhfPMK+0yS4w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-gnu@0.95.0': resolution: {integrity: sha512-D5ULJ2uWipsTgfvHIvqmnGkCtB3Fyt2ZN7APRjVO+wLr+HtmnaWddKsLdrRWX/m/6nQ2xQdoQekdJrokYK9LtQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-musl@0.95.0': resolution: {integrity: sha512-DmCGU+FzRezES5wVAGVimZGzYIjMOapXbWpxuz8M8p3nMrfdBEQ5/tpwBp2vRlIohhABy4vhHJByl4c64ENCGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-transform/binding-wasm32-wasi@0.95.0': resolution: {integrity: sha512-tSo1EU4Whd1gXyae7cwSDouhppkuz6Jkd5LY8Uch9VKsHVSRhDLDW19Mq6VSwtyPxDPTJnJ2jYJWm+n8SYXiXQ==} @@ -1393,36 +1408,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.5.1': resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} @@ -1608,56 +1629,67 @@ packages: resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.54.0': resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.54.0': resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.54.0': resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.54.0': resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.54.0': resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.54.0': resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.54.0': resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.54.0': resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.54.0': resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.54.0': resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.54.0': resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} @@ -1927,6 +1959,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unhead/dom@1.11.20': resolution: {integrity: sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==} @@ -1984,41 +2017,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -3688,11 +3729,12 @@ packages: glob@10.5.0: resolution: {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 hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} @@ -5138,6 +5180,7 @@ packages: prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true prelude-ls@1.2.1: @@ -5724,10 +5767,12 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar 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 tar@7.5.2: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} + deprecated: Old versions of tar 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 terser-webpack-plugin@5.3.16: resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} @@ -5974,6 +6019,7 @@ packages: unplugin-vue-router@0.11.2: resolution: {integrity: sha512-X8BbQ3BNnMqaCYeMj80jtz5jC4AB0jcpdmECIYey9qKm6jy/upaPZ/WzfuT+iTGRiQAY4WemHueXxuzH127oOg==} + deprecated: 'Merged into vuejs/router. Migrate: https://router.vuejs.org/guide/migration/v4-to-v5.html' peerDependencies: vue-router: ^4.4.0 peerDependenciesMeta: @@ -5982,6 +6028,7 @@ packages: unplugin-vue-router@0.16.2: resolution: {integrity: sha512-lE6ZjnHaXfS2vFI/PSEwdKcdOo5RwAbCKUnPBIN9YwLgSWas3x+qivzQvJa/uxhKzJldE6WK43aDKjGj9Rij9w==} + deprecated: 'Merged into vuejs/router. Migrate: https://router.vuejs.org/guide/migration/v4-to-v5.html' peerDependencies: '@vue/compiler-sfc': ^3.5.17 vue-router: ^4.6.0 @@ -6098,6 +6145,7 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + 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). hasBin: true validate-npm-package-license@3.0.4: diff --git a/strr-strata-web/package.json b/strr-strata-web/package.json index afc8da09e..5e230f3e3 100644 --- a/strr-strata-web/package.json +++ b/strr-strata-web/package.json @@ -42,6 +42,7 @@ "otpauth": "^9.3.6", "playwright-core": "^1.49.1", "sass": "^1.97.0", + "tailwindcss": "^3.4.19", "typescript": "^5.9.3", "vitest": "3.2.4" }, diff --git a/strr-strata-web/pnpm-lock.yaml b/strr-strata-web/pnpm-lock.yaml index 0be5ff13e..19f23e4a8 100644 --- a/strr-strata-web/pnpm-lock.yaml +++ b/strr-strata-web/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: dependencies: '@daxiom/nuxt-core-layer-test': specifier: ^0.0.29 - version: 0.0.29(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@nuxt/kit@3.15.4(magicast@0.3.5))(@vue/compiler-dom@3.5.31)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3))(rollup@4.60.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3) + version: 0.0.29(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@nuxt/kit@3.15.4(magicast@0.5.2))(@vue/compiler-dom@3.5.31)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3))(rollup@4.60.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3) country-codes-list: specifier: ^2.0.0 version: 2.0.0 nuxt: specifier: 3.15.4 - version: 3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3) + version: 3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3) vue-country-flag-next: specifier: ^2.3.2 version: 2.3.2(vue@3.5.31(typescript@5.9.3)) @@ -35,16 +35,16 @@ importers: version: 3.2.4(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) '@nuxt/image': specifier: ^2.0.0 - version: 2.0.0(db0@0.3.4)(ioredis@5.10.1)(magicast@0.3.5)(srvx@0.11.14) + version: 2.0.0(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.2)(srvx@0.11.14) '@nuxt/test-utils': specifier: 3.21.0 - version: 3.21.0(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.3.5)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)) + version: 3.21.0(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.5.2)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)) '@nuxtjs/eslint-config-typescript': specifier: ^12.1.0 version: 12.1.0(eslint@8.57.1)(typescript@5.9.3) '@nuxtjs/eslint-module': specifier: ^4.1.0 - version: 4.1.0(eslint@8.57.1)(magicast@0.3.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(webpack@5.105.4) + version: 4.1.0(eslint@8.57.1)(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(webpack@5.105.4) '@pinia/testing': specifier: ^1.0.3 version: 1.0.3(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))) @@ -84,6 +84,9 @@ importers: sass: specifier: ^1.97.0 version: 1.98.0 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19(yaml@2.8.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -912,89 +915,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1405,48 +1424,56 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.112.0': resolution: {integrity: sha512-3R0iqjM3xYOZCnwgcxOQXH7hrz64/USDIuLbNTM1kZqQzRqaR4w7SwoWKU934zABo8d0op2oSwOp+CV3hZnM7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.112.0': resolution: {integrity: sha512-lAQf8PQxfgy7h0bmcfSVE3hg3qMueshPYULFsCrHM+8KefGZ9W+ZMvRyU33gLrB4w1O3Fz1orR0hmKMCRxXNrQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.112.0': resolution: {integrity: sha512-2QlvQBUhHuAE3ezD4X3CAEKMXdfgInggQ5Bj/7gb5NcYP3GyfLTj7c+mMu+BRwfC9B3AXBNyqHWbqEuuUvZyRQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.112.0': resolution: {integrity: sha512-v06iu0osHszgqJ1dLQRb6leWFU1sjG/UQk4MoVBtE6ZPewgfTkby6G9II1SpEAf2onnAuQceVYxQH9iuU3NJqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.112.0': resolution: {integrity: sha512-+5HhNHtxsdcd7+ljXFnn9FOoCNXJX3UPgIfIE6vdwS1HqdGNH6eAcVobuqGOp54l8pvcxDQA6F4cPswCgLrQfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.112.0': resolution: {integrity: sha512-jKwO7ZLNkjxwg7FoCLw+fJszooL9yXRZsDN0AQ1AQUTWq1l8GH/2e44k68N3fcP19jl8O8jGpqLAZcQTYk6skA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.112.0': resolution: {integrity: sha512-TYqnuKV/p3eOc+N61E0961nA7DC+gaCeJ3+V2LcjJdTwFMdikqWL6uVk1jlrpUCBrozHDATVUKDZYH7r4FQYjQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.112.0': resolution: {integrity: sha512-ZhrVmWFifVEFQX4XPwLoVFDHw9tAWH9p9vHsHFH+5uCKdfVR+jje4WxVo6YrokWCboGckoOzHq5KKMOcPZfkRg==} @@ -1527,48 +1554,56 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-arm64-musl@0.112.0': resolution: {integrity: sha512-Lg6VOuSd3oXv7J0eGywgqh/086h+qQzIBOD+47pYKMTTJcbDe+f3h/RgGoMKJE5HhiwT5sH1aGEJfIfaYUiVSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-ppc64-gnu@0.112.0': resolution: {integrity: sha512-PXzmj82o1moA4IGphYImTRgc2youTi4VRfyFX3CHwLjxPcQ5JtcsgbDt4QUdOzXZ+zC07s5jf2ZzhRapEOlj2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-riscv64-gnu@0.112.0': resolution: {integrity: sha512-vhJsMsVH/6xwa3bt1LGts33FXUkGjaEGDwsRyp4lIfOjSfQVWMtCmWMFNaA0dW9FVWdD2Gt2fSFBSZ+azDxlpg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-riscv64-musl@0.112.0': resolution: {integrity: sha512-cXWFb7z+2IjFUEcXtRwluq9oEG5qnyFCjiu3SWrgYNcWwPdHusv3I/7K5/CTbbi4StoZ5txbi7/iSfDHNyWuRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-s390x-gnu@0.112.0': resolution: {integrity: sha512-eEFu4SRqJTJ20/88KRWmp+jpHKAw0Y1DsnSgpEeXyBIIcsOaLIUMU/TfYWUmqRbvbMV9rmOmI3kp5xWYUq6kSQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-gnu@0.112.0': resolution: {integrity: sha512-ST1MDT+TlOyZ1c5btrGinRSUW2Jf4Pa+0gdKwsyjDSOC3dxy2ZNkN3mosTf4ywc3J+mxfYKqtjs7zSwHz03ILA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-musl@0.112.0': resolution: {integrity: sha512-ISQoA3pD4cyTGpf9sXXeerH6pL2L6EIpdy6oAy2ttkswyVFDyQNVOVIGIdLZDgbpmqGljxZnWqt/J/N68pQaig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-transform/binding-openharmony-arm64@0.112.0': resolution: {integrity: sha512-UOGVrGIv7yLJovyEXEyUTADuLq98vd/cbMHFLJweRXD+11I8Tn4jASi4WzdsN8C3BVYGRHrXH2NlSBmhz33a4g==} @@ -1628,36 +1663,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.5.6': resolution: {integrity: sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA==} @@ -1843,66 +1884,79 @@ packages: resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.1': resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.1': resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.1': resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.1': resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.1': resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.1': resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.1': resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.1': resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.1': resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.1': resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.1': resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.1': resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.60.1': resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} @@ -2169,6 +2223,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unhead/dom@1.11.20': resolution: {integrity: sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==} @@ -2226,41 +2281,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -6313,6 +6376,7 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + 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). hasBin: true validate-npm-package-license@3.0.4: @@ -7086,20 +7150,20 @@ snapshots: dependencies: postcss-selector-parser: 7.1.1 - '@daxiom/nuxt-core-layer-test@0.0.29(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@nuxt/kit@3.15.4(magicast@0.3.5))(@vue/compiler-dom@3.5.31)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3))(rollup@4.60.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3)': + '@daxiom/nuxt-core-layer-test@0.0.29(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@nuxt/kit@3.15.4(magicast@0.5.2))(@vue/compiler-dom@3.5.31)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3))(rollup@4.60.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3)': dependencies: '@iconify-json/mdi': 1.2.3 '@nuxt/ui': 2.22.3(magicast@0.3.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3)(zod@3.25.76) - '@nuxtjs/i18n': 10.2.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@vue/compiler-dom@3.5.31)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)))(rollup@4.60.1)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)) - '@pinia/nuxt': 0.11.3(magicast@0.3.5)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))) - '@vueuse/nuxt': 13.9.0(magicast@0.3.5)(nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) + '@nuxtjs/i18n': 10.2.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@vue/compiler-dom@3.5.31)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)))(rollup@4.60.1)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)) + '@pinia/nuxt': 0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))) + '@vueuse/nuxt': 13.9.0(magicast@0.5.2)(nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) dompurify: 3.3.3 jsdom: 26.1.0 keycloak-js: 26.2.3 launchdarkly-vue-client-sdk: 2.5.0(vue@3.5.31(typescript@5.9.3)) maska: 3.2.0 pinia: 3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)) - pinia-plugin-persistedstate: 4.7.1(@nuxt/kit@3.15.4(magicast@0.3.5))(@pinia/nuxt@0.11.3(magicast@0.3.5)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))))(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))) + pinia-plugin-persistedstate: 4.7.1(@nuxt/kit@3.15.4(magicast@0.5.2))(@pinia/nuxt@0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))))(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -7830,9 +7894,9 @@ snapshots: - magicast - supports-color - '@nuxt/devtools-kit@2.7.0(magicast@0.3.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))': + '@nuxt/devtools-kit@2.7.0(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))': dependencies: - '@nuxt/kit': 3.21.2(magicast@0.3.5) + '@nuxt/kit': 3.21.2(magicast@0.5.2) execa: 8.0.1 vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3) transitivePeerDependencies: @@ -7958,14 +8022,14 @@ snapshots: - utf-8-validate - vue - '@nuxt/icon@1.15.0(magicast@0.3.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))': + '@nuxt/icon@1.15.0(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))': dependencies: '@iconify/collections': 1.0.668 '@iconify/types': 2.0.0 '@iconify/utils': 2.3.0 '@iconify/vue': 5.0.0(vue@3.5.31(typescript@5.9.3)) - '@nuxt/devtools-kit': 2.7.0(magicast@0.3.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)) - '@nuxt/kit': 3.21.2(magicast@0.3.5) + '@nuxt/devtools-kit': 2.7.0(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)) + '@nuxt/kit': 3.21.2(magicast@0.5.2) consola: 3.4.2 local-pkg: 1.1.2 mlly: 1.8.2 @@ -7980,9 +8044,9 @@ snapshots: - vite - vue - '@nuxt/image@2.0.0(db0@0.3.4)(ioredis@5.10.1)(magicast@0.3.5)(srvx@0.11.14)': + '@nuxt/image@2.0.0(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.2)(srvx@0.11.14)': dependencies: - '@nuxt/kit': 4.4.2(magicast@0.3.5) + '@nuxt/kit': 4.4.2(magicast@0.5.2) consola: 3.4.2 defu: 6.1.6 h3: 1.15.11 @@ -8043,6 +8107,32 @@ snapshots: - magicast - supports-color + '@nuxt/kit@3.15.4(magicast@0.5.2)': + dependencies: + c12: 2.0.4(magicast@0.5.2) + consola: 3.4.2 + defu: 6.1.6 + destr: 2.0.5 + globby: 14.1.0 + ignore: 7.0.5 + jiti: 2.6.1 + klona: 2.0.6 + knitwork: 1.3.0 + mlly: 1.8.2 + ohash: 1.1.6 + pathe: 2.0.3 + pkg-types: 1.3.1 + scule: 1.3.0 + semver: 7.7.4 + std-env: 3.10.0 + ufo: 1.6.3 + unctx: 2.5.0 + unimport: 4.2.0 + untyped: 1.5.2 + transitivePeerDependencies: + - magicast + - supports-color + '@nuxt/kit@3.21.2(magicast@0.3.5)': dependencies: c12: 3.3.4(magicast@0.3.5) @@ -8069,9 +8159,9 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/kit@4.4.2(magicast@0.3.5)': + '@nuxt/kit@3.21.2(magicast@0.5.2)': dependencies: - c12: 3.3.4(magicast@0.3.5) + c12: 3.3.4(magicast@0.5.2) consola: 3.4.2 defu: 6.1.6 destr: 2.0.5 @@ -8080,6 +8170,7 @@ snapshots: ignore: 7.0.5 jiti: 2.6.1 klona: 2.0.6 + knitwork: 1.3.0 mlly: 1.8.2 ohash: 2.0.11 pathe: 2.0.3 @@ -8128,14 +8219,14 @@ snapshots: '@nuxt/telemetry@2.8.0(@nuxt/kit@3.15.4(magicast@0.3.5))': dependencies: - '@nuxt/kit': 3.15.4(magicast@0.3.5) + '@nuxt/kit': 3.15.4(magicast@0.5.2) citty: 0.2.2 consola: 3.4.2 ofetch: 2.0.0-alpha.3 rc9: 3.0.1 std-env: 4.0.0 - '@nuxt/test-utils@3.21.0(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.3.5)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))': + '@nuxt/test-utils@3.21.0(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.5.2)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))': dependencies: '@nuxt/kit': 3.21.2(magicast@0.3.5) c12: 3.3.4(magicast@0.3.5) @@ -8160,7 +8251,7 @@ snapshots: tinyexec: 1.0.4 ufo: 1.6.3 unplugin: 2.3.11 - vitest-environment-nuxt: 1.0.1(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.3.5)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)) + vitest-environment-nuxt: 1.0.1(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.5.2)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)) vue: 3.5.31(typescript@5.9.3) optionalDependencies: '@playwright/test': 1.59.1 @@ -8179,9 +8270,9 @@ snapshots: '@headlessui/tailwindcss': 0.2.2(tailwindcss@3.4.19(yaml@2.8.3)) '@headlessui/vue': 1.7.23(vue@3.5.31(typescript@5.9.3)) '@iconify-json/heroicons': 1.2.3 - '@nuxt/icon': 1.15.0(magicast@0.3.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) - '@nuxt/kit': 4.4.2(magicast@0.3.5) - '@nuxtjs/color-mode': 3.5.2(magicast@0.3.5) + '@nuxt/icon': 1.15.0(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) + '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxtjs/color-mode': 3.5.2(magicast@0.5.2) '@nuxtjs/tailwindcss': 6.14.0(magicast@0.3.5)(yaml@2.8.3) '@popperjs/core': 2.11.8 '@standard-schema/spec': 1.1.0 @@ -8220,9 +8311,9 @@ snapshots: - vue - yaml - '@nuxt/vite-builder@3.15.4(@types/node@25.5.0)(eslint@8.57.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(terser@5.46.1)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3)': + '@nuxt/vite-builder@3.15.4(@types/node@25.5.0)(eslint@8.57.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(terser@5.46.1)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3)': dependencies: - '@nuxt/kit': 3.15.4(magicast@0.3.5) + '@nuxt/kit': 3.15.4(magicast@0.5.2) '@rollup/plugin-replace': 6.0.3(rollup@4.60.1) '@vitejs/plugin-vue': 5.2.4(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.4.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) @@ -8279,9 +8370,9 @@ snapshots: - vue-tsc - yaml - '@nuxtjs/color-mode@3.5.2(magicast@0.3.5)': + '@nuxtjs/color-mode@3.5.2(magicast@0.5.2)': dependencies: - '@nuxt/kit': 3.21.2(magicast@0.3.5) + '@nuxt/kit': 3.21.2(magicast@0.5.2) pathe: 1.1.2 pkg-types: 1.3.1 semver: 7.7.4 @@ -8320,9 +8411,9 @@ snapshots: - eslint-import-resolver-webpack - supports-color - '@nuxtjs/eslint-module@4.1.0(eslint@8.57.1)(magicast@0.3.5)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(webpack@5.105.4)': + '@nuxtjs/eslint-module@4.1.0(eslint@8.57.1)(magicast@0.5.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(webpack@5.105.4)': dependencies: - '@nuxt/kit': 3.21.2(magicast@0.3.5) + '@nuxt/kit': 3.21.2(magicast@0.5.2) chokidar: 3.6.0 eslint: 8.57.1 eslint-webpack-plugin: 4.2.0(eslint@8.57.1)(webpack@5.105.4) @@ -8333,7 +8424,7 @@ snapshots: - vite - webpack - '@nuxtjs/i18n@10.2.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@vue/compiler-dom@3.5.31)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)))(rollup@4.60.1)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))': + '@nuxtjs/i18n@10.2.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@vue/compiler-dom@3.5.31)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)))(rollup@4.60.1)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))': dependencies: '@intlify/core': 11.3.0 '@intlify/h3': 0.7.4 @@ -8341,7 +8432,7 @@ snapshots: '@intlify/unplugin-vue-i18n': 11.0.7(@vue/compiler-dom@3.5.31)(eslint@8.57.1)(rollup@4.60.1)(typescript@5.9.3)(vue-i18n@11.3.0(vue@3.5.31(typescript@5.9.3)))(vue@3.5.31(typescript@5.9.3)) '@intlify/utils': 0.14.1 '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.60.1) - '@nuxt/kit': 4.4.2(magicast@0.3.5) + '@nuxt/kit': 4.4.2(magicast@0.5.2) '@rollup/plugin-yaml': 4.1.2(rollup@4.60.1) '@vue/compiler-sfc': 3.5.31 defu: 6.1.6 @@ -8397,7 +8488,7 @@ snapshots: '@nuxtjs/tailwindcss@6.14.0(magicast@0.3.5)(yaml@2.8.3)': dependencies: - '@nuxt/kit': 3.21.2(magicast@0.3.5) + '@nuxt/kit': 3.21.2(magicast@0.5.2) autoprefixer: 10.4.27(postcss@8.5.8) c12: 3.3.4(magicast@0.3.5) consola: 3.4.2 @@ -8618,9 +8709,9 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.6 '@parcel/watcher-win32-x64': 2.5.6 - '@pinia/nuxt@0.11.3(magicast@0.3.5)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)))': + '@pinia/nuxt@0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)))': dependencies: - '@nuxt/kit': 4.4.2(magicast@0.3.5) + '@nuxt/kit': 4.4.2(magicast@0.5.2) pinia: 3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)) transitivePeerDependencies: - magicast @@ -9453,13 +9544,13 @@ snapshots: '@vueuse/metadata@13.9.0': {} - '@vueuse/nuxt@13.9.0(magicast@0.3.5)(nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))': + '@vueuse/nuxt@13.9.0(magicast@0.5.2)(nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3))': dependencies: - '@nuxt/kit': 3.21.2(magicast@0.3.5) + '@nuxt/kit': 3.21.2(magicast@0.5.2) '@vueuse/core': 13.9.0(vue@3.5.31(typescript@5.9.3)) '@vueuse/metadata': 13.9.0 local-pkg: 1.1.2 - nuxt: 3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3) + nuxt: 3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3) vue: 3.5.31(typescript@5.9.3) transitivePeerDependencies: - magicast @@ -9879,6 +9970,23 @@ snapshots: optionalDependencies: magicast: 0.3.5 + c12@2.0.4(magicast@0.5.2): + dependencies: + chokidar: 4.0.3 + confbox: 0.1.8 + defu: 6.1.6 + dotenv: 16.6.1 + giget: 1.2.5 + jiti: 2.6.1 + mlly: 1.8.2 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 1.3.1 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.5.2 + c12@3.3.4(magicast@0.3.5): dependencies: chokidar: 5.0.0 @@ -12226,15 +12334,15 @@ snapshots: nuxt-define@1.0.0: {} - nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3): + nuxt@3.15.4(@parcel/watcher@2.5.6)(@types/node@25.5.0)(cac@6.7.14)(db0@0.3.4)(eslint@8.57.1)(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(srvx@0.11.14)(terser@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(yaml@2.8.3): dependencies: '@nuxt/cli': 3.34.0(@nuxt/schema@3.15.4)(cac@6.7.14)(magicast@0.3.5) '@nuxt/devalue': 2.0.2 '@nuxt/devtools': 1.7.0(rollup@4.60.1)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.31(typescript@5.9.3)) - '@nuxt/kit': 3.15.4(magicast@0.3.5) + '@nuxt/kit': 3.15.4(magicast@0.5.2) '@nuxt/schema': 3.15.4 '@nuxt/telemetry': 2.8.0(@nuxt/kit@3.15.4(magicast@0.3.5)) - '@nuxt/vite-builder': 3.15.4(@types/node@25.5.0)(eslint@8.57.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(terser@5.46.1)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3) + '@nuxt/vite-builder': 3.15.4(@types/node@25.5.0)(eslint@8.57.1)(magicast@0.5.2)(optionator@0.9.4)(rollup@4.60.1)(sass@1.98.0)(terser@5.46.1)(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))(yaml@2.8.3) '@unhead/dom': 1.11.20 '@unhead/shared': 1.11.20 '@unhead/ssr': 1.11.20 @@ -12646,12 +12754,12 @@ snapshots: pify@2.3.0: {} - pinia-plugin-persistedstate@4.7.1(@nuxt/kit@3.15.4(magicast@0.3.5))(@pinia/nuxt@0.11.3(magicast@0.3.5)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))))(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))): + pinia-plugin-persistedstate@4.7.1(@nuxt/kit@3.15.4(magicast@0.5.2))(@pinia/nuxt@0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))))(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))): dependencies: defu: 6.1.6 optionalDependencies: - '@nuxt/kit': 3.15.4(magicast@0.3.5) - '@pinia/nuxt': 0.11.3(magicast@0.3.5)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))) + '@nuxt/kit': 3.15.4(magicast@0.5.2) + '@pinia/nuxt': 0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3))) pinia: 3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)) pinia@3.0.4(typescript@5.9.3)(vue@3.5.31(typescript@5.9.3)): @@ -14101,7 +14209,7 @@ snapshots: sirv: 3.0.2 vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3) optionalDependencies: - '@nuxt/kit': 3.15.4(magicast@0.3.5) + '@nuxt/kit': 3.15.4(magicast@0.5.2) transitivePeerDependencies: - rollup - supports-color @@ -14180,9 +14288,9 @@ snapshots: terser: 5.46.1 yaml: 2.8.3 - vitest-environment-nuxt@1.0.1(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.3.5)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)): + vitest-environment-nuxt@1.0.1(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.5.2)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)): dependencies: - '@nuxt/test-utils': 3.21.0(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.3.5)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)) + '@nuxt/test-utils': 3.21.0(@playwright/test@1.59.1)(@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.31)(vue@3.5.31(typescript@5.9.3)))(@vue/test-utils@2.4.6)(happy-dom@20.8.9)(jsdom@26.1.0)(magicast@0.5.2)(playwright-core@1.59.1)(typescript@5.9.3)(vitest@3.2.4(@types/node@25.5.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@26.1.0)(sass@1.98.0)(terser@5.46.1)(yaml@2.8.3)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' From 397c39dfd8eeb84088213ce30b446d67d862d979 Mon Sep 17 00:00:00 2001 From: panish16 Date: Mon, 3 Aug 2026 12:40:20 -0700 Subject: [PATCH 03/10] fix: switch strr-base-web layer extends to local relative path The git-hosted layer reference (github:bcgov/STRR/strr-base-web) is cloned by giget into an isolated node_modules/.c12/ tree with no node_modules of its own, so its tsconfig.json (and anything depending on generated .nuxt/tsconfig.json) can't resolve under pnpm 11's resolution behavior. This broke nuxt prepare for all 4 downstream apps, which in turn broke both eslint's typescript/import resolvers (200+ spurious lint errors) and the Nuxt build itself. Switching to a local relative-path extends avoids the git-clone isolation entirely. Since the sibling app's own .nuxt/tsconfig.json may not exist in a fresh checkout (CI only runs each app's own nuxt prepare), each consuming app eagerly installs and prepares strr-base-web if missing, before Nuxt evaluates its config. --- strr-examiner-web/nuxt.config.ts | 22 ++++++++++++++++++++-- strr-host-pm-web/nuxt.config.ts | 22 ++++++++++++++++++++-- strr-platform-web/nuxt.config.ts | 22 ++++++++++++++++++++-- strr-strata-web/nuxt.config.ts | 22 ++++++++++++++++++++-- 4 files changed, 80 insertions(+), 8 deletions(-) diff --git a/strr-examiner-web/nuxt.config.ts b/strr-examiner-web/nuxt.config.ts index a50c8adb5..ed04eabc2 100644 --- a/strr-examiner-web/nuxt.config.ts +++ b/strr-examiner-web/nuxt.config.ts @@ -1,3 +1,22 @@ +import { existsSync } from 'node:fs' +import { execSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' +import { dirname, resolve } from 'node:path' + +// strr-base-web is extended as a local sibling layer (not a published package), +// so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout +// (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails +// to resolve strr-base-web/tsconfig.json's "extends" while evaluating its +// tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +const __dirname = dirname(fileURLToPath(import.meta.url)) +const baseWebDir = resolve(__dirname, '../strr-base-web') +if (!existsSync(resolve(baseWebDir, 'node_modules'))) { + execSync('npx --yes pnpm install --ignore-scripts', { cwd: baseWebDir, stdio: 'inherit' }) +} +if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { + execSync('npx --yes nuxi prepare', { cwd: baseWebDir, stdio: 'inherit' }) +} + // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ devtools: { enabled: false }, @@ -35,8 +54,7 @@ export default defineNuxtConfig({ }, extends: [ - ['github:bcgov/STRR/strr-base-web', { install: true }] - // '../strr-base-web' // dev only + '../strr-base-web' ], imports: { diff --git a/strr-host-pm-web/nuxt.config.ts b/strr-host-pm-web/nuxt.config.ts index 874a8c395..7ff7f905a 100644 --- a/strr-host-pm-web/nuxt.config.ts +++ b/strr-host-pm-web/nuxt.config.ts @@ -1,3 +1,22 @@ +import { existsSync } from 'node:fs' +import { execSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' +import { dirname, resolve } from 'node:path' + +// strr-base-web is extended as a local sibling layer (not a published package), +// so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout +// (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails +// to resolve strr-base-web/tsconfig.json's "extends" while evaluating its +// tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +const __dirname = dirname(fileURLToPath(import.meta.url)) +const baseWebDir = resolve(__dirname, '../strr-base-web') +if (!existsSync(resolve(baseWebDir, 'node_modules'))) { + execSync('npx --yes pnpm install --ignore-scripts', { cwd: baseWebDir, stdio: 'inherit' }) +} +if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { + execSync('npx --yes nuxi prepare', { cwd: baseWebDir, stdio: 'inherit' }) +} + // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ devtools: { enabled: false }, @@ -35,8 +54,7 @@ export default defineNuxtConfig({ }, extends: [ - ['github:bcgov/STRR/strr-base-web', { install: true }], - // '../strr-base-web', // dev only + '../strr-base-web', '@daxiom/nuxt-core-layer-test' // extend again, this prevents the payApi plugin error ], diff --git a/strr-platform-web/nuxt.config.ts b/strr-platform-web/nuxt.config.ts index 294538f04..e482928ec 100644 --- a/strr-platform-web/nuxt.config.ts +++ b/strr-platform-web/nuxt.config.ts @@ -1,3 +1,22 @@ +import { existsSync } from 'node:fs' +import { execSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' +import { dirname, resolve } from 'node:path' + +// strr-base-web is extended as a local sibling layer (not a published package), +// so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout +// (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails +// to resolve strr-base-web/tsconfig.json's "extends" while evaluating its +// tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +const __dirname = dirname(fileURLToPath(import.meta.url)) +const baseWebDir = resolve(__dirname, '../strr-base-web') +if (!existsSync(resolve(baseWebDir, 'node_modules'))) { + execSync('npx --yes pnpm install --ignore-scripts', { cwd: baseWebDir, stdio: 'inherit' }) +} +if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { + execSync('npx --yes nuxi prepare', { cwd: baseWebDir, stdio: 'inherit' }) +} + // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ devtools: { enabled: false }, @@ -20,8 +39,7 @@ export default defineNuxtConfig({ ], extends: [ - ['github:bcgov/STRR/strr-base-web', { install: true }], - // '../strr-base-web', // dev only + '../strr-base-web', '@daxiom/nuxt-core-layer-test' // extend again, this prevents the payApi plugin error ], diff --git a/strr-strata-web/nuxt.config.ts b/strr-strata-web/nuxt.config.ts index 51a868360..12fc26500 100644 --- a/strr-strata-web/nuxt.config.ts +++ b/strr-strata-web/nuxt.config.ts @@ -1,3 +1,22 @@ +import { existsSync } from 'node:fs' +import { execSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' +import { dirname, resolve } from 'node:path' + +// strr-base-web is extended as a local sibling layer (not a published package), +// so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout +// (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails +// to resolve strr-base-web/tsconfig.json's "extends" while evaluating its +// tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +const __dirname = dirname(fileURLToPath(import.meta.url)) +const baseWebDir = resolve(__dirname, '../strr-base-web') +if (!existsSync(resolve(baseWebDir, 'node_modules'))) { + execSync('npx --yes pnpm install --ignore-scripts', { cwd: baseWebDir, stdio: 'inherit' }) +} +if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { + execSync('npx --yes nuxi prepare', { cwd: baseWebDir, stdio: 'inherit' }) +} + // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ devtools: { enabled: false }, @@ -35,8 +54,7 @@ export default defineNuxtConfig({ }, extends: [ - ['github:bcgov/STRR/strr-base-web', { install: true }], - // '../strr-base-web', // dev only + '../strr-base-web', '@daxiom/nuxt-core-layer-test' // extend again, this prevents the payApi plugin error ], From de0c811a77dc7d71c770924d7e5ce0d765b6b879 Mon Sep 17 00:00:00 2001 From: panish16 Date: Mon, 3 Aug 2026 12:44:36 -0700 Subject: [PATCH 04/10] fix: pin CD deploy pipelines to pnpm 11.9.0 All 4 STRR frontend CD files (examiner/host-pm/platform/strata) were still hardcoded to pnpm_version: 10.0.0, unrelated to and never touched by the pnpm-v11 CI migration on this branch. --- .github/workflows/strr-examiner-ui-cd.yaml | 2 +- .github/workflows/strr-host-pm-ui-cd.yaml | 2 +- .github/workflows/strr-platform-ui-cd.yaml | 2 +- .github/workflows/strr-strata-ui-cd.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/strr-examiner-ui-cd.yaml b/.github/workflows/strr-examiner-ui-cd.yaml index 50929e8ab..829568bd4 100644 --- a/.github/workflows/strr-examiner-ui-cd.yaml +++ b/.github/workflows/strr-examiner-ui-cd.yaml @@ -37,7 +37,7 @@ jobs: app_name: "strr-examiner-ui" working_directory: "./strr-examiner-web" node_version: 24 - pnpm_version: 10.0.0 + pnpm_version: 11.9.0 redeploy: ${{ inputs.redeploy }} secrets: WORKLOAD_IDENTIFY_POOLS_PROVIDER: ${{ secrets.WORKLOAD_IDENTIFY_POOLS_PROVIDER }} diff --git a/.github/workflows/strr-host-pm-ui-cd.yaml b/.github/workflows/strr-host-pm-ui-cd.yaml index ae5877304..8e3940c4f 100644 --- a/.github/workflows/strr-host-pm-ui-cd.yaml +++ b/.github/workflows/strr-host-pm-ui-cd.yaml @@ -37,7 +37,7 @@ jobs: app_name: "strr-hosts" working_directory: "./strr-host-pm-web" node_version: 24 - pnpm_version: 10.0.0 + pnpm_version: 11.9.0 redeploy: ${{ inputs.redeploy }} secrets: WORKLOAD_IDENTIFY_POOLS_PROVIDER: ${{ secrets.WORKLOAD_IDENTIFY_POOLS_PROVIDER }} diff --git a/.github/workflows/strr-platform-ui-cd.yaml b/.github/workflows/strr-platform-ui-cd.yaml index c556ff89d..28cbfafdc 100644 --- a/.github/workflows/strr-platform-ui-cd.yaml +++ b/.github/workflows/strr-platform-ui-cd.yaml @@ -37,7 +37,7 @@ jobs: app_name: "strr-platform-ui" working_directory: "./strr-platform-web" node_version: 24 - pnpm_version: 10.0.0 + pnpm_version: 11.9.0 redeploy: ${{ inputs.redeploy }} secrets: WORKLOAD_IDENTIFY_POOLS_PROVIDER: ${{ secrets.WORKLOAD_IDENTIFY_POOLS_PROVIDER }} diff --git a/.github/workflows/strr-strata-ui-cd.yaml b/.github/workflows/strr-strata-ui-cd.yaml index 87a6a56fd..444dc82f5 100644 --- a/.github/workflows/strr-strata-ui-cd.yaml +++ b/.github/workflows/strr-strata-ui-cd.yaml @@ -37,7 +37,7 @@ jobs: app_name: "strr-strata-hotel-ui" working_directory: "./strr-strata-web" node_version: 24 - pnpm_version: 10.0.0 + pnpm_version: 11.9.0 redeploy: ${{ inputs.redeploy }} secrets: WORKLOAD_IDENTIFY_POOLS_PROVIDER: ${{ secrets.WORKLOAD_IDENTIFY_POOLS_PROVIDER }} From ed1e8d905ebdbb83ad56f79685d6d10ab004c5ca Mon Sep 17 00:00:00 2001 From: anish16patel Date: Wed, 26 Aug 2026 17:41:10 -0700 Subject: [PATCH 05/10] fix(strr-base-web): declare tailwindcss as a direct dependency Picker.vue uses raw @use 'tailwindcss/base'/'components'/'utilities' imports, but strr-base-web never declared tailwindcss itself as a dependency - it only worked by relying on hoisting from whichever app extended the layer. Under pnpm v11's stricter per-package node_modules, that resolution fails, breaking strr-host-pm-web's build/tests since it's the only app that actually renders ConnectFormDateInput. --- strr-base-web/package.json | 1 + strr-base-web/pnpm-lock.yaml | 148 ++++++++++++++++++++++++----------- 2 files changed, 105 insertions(+), 44 deletions(-) diff --git a/strr-base-web/package.json b/strr-base-web/package.json index 101b13b53..15d474c54 100644 --- a/strr-base-web/package.json +++ b/strr-base-web/package.json @@ -42,6 +42,7 @@ "nuxt": "4.5.2", "playwright-core": "^1.57.0", "sass": "^1.77.6", + "tailwindcss": "^3.4.19", "typescript": "^5.9.3", "vitest": "4.1.11" }, diff --git a/strr-base-web/pnpm-lock.yaml b/strr-base-web/pnpm-lock.yaml index f1ea57f2c..4406a76a7 100644 --- a/strr-base-web/pnpm-lock.yaml +++ b/strr-base-web/pnpm-lock.yaml @@ -90,6 +90,9 @@ importers: sass: specifier: ^1.77.6 version: 1.97.1 + tailwindcss: + specifier: ^3.4.19 + version: 3.4.19(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -792,89 +795,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1030,6 +1049,7 @@ packages: engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] + libc: [glibc] '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1288,36 +1308,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.95.0': resolution: {integrity: sha512-Pvi1lGe/G+mJZ3hUojMP/aAHAzHA25AEtVr8/iuz7UV72t/15NOgJYr9kELMUMNjPqpr3vKUgXTFmTtAxp11Qw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-riscv64-gnu@0.95.0': resolution: {integrity: sha512-pUEVHIOVNDfhk4sTlLhn6mrNENhE4/dAwemxIfqpcSyBlYG0xYZND1F3jjR2yWY6DakXZ6VSuDbtiv1LPNlOLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-s390x-gnu@0.95.0': resolution: {integrity: sha512-5+olaepHTE3J/+w7g0tr3nocvv5BKilAJnzj4L8tWBCLEZbL6olJcGVoldUO+3cgg1SO1xJywP5BuLhT0mDUDw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.95.0': resolution: {integrity: sha512-8huzHlK/N98wrnYKxIcYsK8ZGBWomQchu/Mzi6m+CtbhjWOv9DmK0jQ2fUWImtluQVpTwS0uZT06d3g7XIkJrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.95.0': resolution: {integrity: sha512-bWnrLfGDcx/fab0+UQnFbVFbiykof/btImbYf+cI2pU/1Egb2x+OKSmM5Qt0nEUiIpM5fgJmYXxTopybSZOKYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-parser/binding-wasm32-wasi@0.95.0': resolution: {integrity: sha512-0JLyqkZu1HnQIZ4e5LBGOtzqua1QwFEUOoMSycdoerXqayd4LK2b7WMfAx8eCIf+jGm1Uj6f3R00nlsx8g1faQ==} @@ -1383,36 +1409,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-arm64-musl@0.95.0': resolution: {integrity: sha512-GL0ffCPW8JlFI0/jeSgCY665yDdojHxA0pbYG+k8oEHOWCYZUZK9AXL+r0oerNEWYJ8CRB+L5Yq87ZtU/YUitw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-riscv64-gnu@0.95.0': resolution: {integrity: sha512-tbH7LaClSmN3YFVo1UjMSe7D6gkb5f+CMIbj9i873UUZomVRmAjC4ygioObfzM+sj/tX0WoTXx5L1YOfQkHL6Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-s390x-gnu@0.95.0': resolution: {integrity: sha512-8jMqiURWa0iTiPMg7BWaln89VdhhWzNlPyKM90NaFVVhBIKCr2UEhrQWdpBw/E9C8uWf/4VabBEhfPMK+0yS4w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-gnu@0.95.0': resolution: {integrity: sha512-D5ULJ2uWipsTgfvHIvqmnGkCtB3Fyt2ZN7APRjVO+wLr+HtmnaWddKsLdrRWX/m/6nQ2xQdoQekdJrokYK9LtQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-musl@0.95.0': resolution: {integrity: sha512-DmCGU+FzRezES5wVAGVimZGzYIjMOapXbWpxuz8M8p3nMrfdBEQ5/tpwBp2vRlIohhABy4vhHJByl4c64ENCGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-transform/binding-wasm32-wasi@0.95.0': resolution: {integrity: sha512-tSo1EU4Whd1gXyae7cwSDouhppkuz6Jkd5LY8Uch9VKsHVSRhDLDW19Mq6VSwtyPxDPTJnJ2jYJWm+n8SYXiXQ==} @@ -1460,36 +1492,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.5.1': resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} @@ -1600,36 +1638,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.2.5': resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.2.5': resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.2.5': resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.2.5': resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.2.5': resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.2.5': resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} @@ -1771,66 +1815,79 @@ packages: resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.62.4': resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.62.4': resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.62.4': resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.62.4': resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.62.4': resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.62.4': resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.62.4': resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.62.4': resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.62.4': resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.62.4': resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.62.4': resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.62.4': resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.62.4': resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} @@ -2191,41 +2248,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -4490,24 +4555,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.33.0: resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.33.0: resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.33.0: resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.33.0: resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} @@ -5367,10 +5436,6 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} - postcss-selector-parser@7.1.5: resolution: {integrity: sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==} engines: {node: '>=4'} @@ -7198,13 +7263,13 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.1)': + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.5)': dependencies: - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.5 - '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.1)': + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.5)': dependencies: - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.5 '@daxiom/nuxt-core-layer-test@0.0.29(6978517269e4075db9ad5d5cb4ec080f)': dependencies: @@ -8538,7 +8603,7 @@ snapshots: '@nuxtjs/tailwindcss@6.14.0(magicast@0.5.4)(yaml@2.9.0)': dependencies: '@nuxt/kit': 3.20.2(magicast@0.5.4) - autoprefixer: 10.4.23(postcss@8.5.6) + autoprefixer: 10.4.23(postcss@8.5.26) c12: 3.3.3(magicast@0.5.4) consola: 3.4.2 defu: 6.1.4 @@ -8547,8 +8612,8 @@ snapshots: ohash: 2.0.11 pathe: 2.0.3 pkg-types: 2.3.0 - postcss: 8.5.6 - postcss-nesting: 13.0.2(postcss@8.5.6) + postcss: 8.5.26 + postcss-nesting: 13.0.2(postcss@8.5.26) tailwind-config-viewer: 2.0.4(tailwindcss@3.4.19(yaml@2.9.0)) tailwindcss: 3.4.19(yaml@2.9.0) ufo: 1.6.1 @@ -8884,7 +8949,7 @@ snapshots: dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.5 optionalDependencies: rollup: 4.62.4 @@ -9532,7 +9597,7 @@ snapshots: '@vue/shared': 3.5.26 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.6 + postcss: 8.5.26 source-map-js: 1.2.1 '@vue/compiler-sfc@3.5.41': @@ -9604,7 +9669,7 @@ snapshots: alien-signals: 3.1.2 muggle-string: 0.4.1 path-browserify: 1.0.1 - picomatch: 4.0.3 + picomatch: 4.0.5 '@vue/reactivity@3.5.41': dependencies: @@ -9951,13 +10016,13 @@ snapshots: at-least-node@1.0.0: {} - autoprefixer@10.4.23(postcss@8.5.6): + autoprefixer@10.4.23(postcss@8.5.26): dependencies: browserslist: 4.28.1 caniuse-lite: 1.0.30001762 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.26 postcss-value-parser: 4.2.0 autoprefixer@10.5.4(postcss@8.5.26): @@ -10061,7 +10126,7 @@ snapshots: dotenv: 17.2.3 exsolve: 1.0.8 giget: 2.0.0 - jiti: 2.6.1 + jiti: 2.7.0 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 2.0.0 @@ -12046,7 +12111,7 @@ snapshots: get-port-please: 3.2.0 h3: 1.15.4 http-shutdown: 1.2.2 - jiti: 2.6.1 + jiti: 2.7.0 mlly: 1.8.0 node-forge: 1.3.3 pathe: 1.1.2 @@ -12873,7 +12938,7 @@ snapshots: postcss-calc@10.1.1(postcss@8.5.26): dependencies: postcss: 8.5.26 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.5 postcss-value-parser: 4.2.0 postcss-colormin@8.0.4(postcss@8.5.26): @@ -12907,24 +12972,24 @@ snapshots: dependencies: postcss: 8.5.26 - postcss-import@15.1.0(postcss@8.5.6): + postcss-import@15.1.0(postcss@8.5.26): dependencies: - postcss: 8.5.6 + postcss: 8.5.26 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.11 - postcss-js@4.1.0(postcss@8.5.6): + postcss-js@4.1.0(postcss@8.5.26): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.6 + postcss: 8.5.26 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.9.0): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.26)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 - postcss: 8.5.6 + postcss: 8.5.26 yaml: 2.9.0 postcss-merge-longhand@8.0.4(postcss@8.5.26): @@ -12968,17 +13033,17 @@ snapshots: postcss: 8.5.26 postcss-selector-parser: 7.1.5 - postcss-nested@6.2.0(postcss@8.5.6): + postcss-nested@6.2.0(postcss@8.5.26): dependencies: - postcss: 8.5.6 + postcss: 8.5.26 postcss-selector-parser: 6.1.2 - postcss-nesting@13.0.2(postcss@8.5.6): + postcss-nesting@13.0.2(postcss@8.5.26): dependencies: - '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.1) - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.5) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.5) + postcss: 8.5.26 + postcss-selector-parser: 7.1.5 postcss-normalize-charset@8.0.4(postcss@8.5.26): dependencies: @@ -13052,11 +13117,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-selector-parser@7.1.5: dependencies: cssesc: 3.0.0 @@ -13710,7 +13770,7 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 superjson@2.2.6: @@ -13789,11 +13849,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.6 - postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.9.0) - postcss-nested: 6.2.0(postcss@8.5.6) + postcss: 8.5.26 + postcss-import: 15.1.0(postcss@8.5.26) + postcss-js: 4.1.0(postcss@8.5.26) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.26)(yaml@2.9.0) + postcss-nested: 6.2.0(postcss@8.5.26) postcss-selector-parser: 6.1.2 resolve: 1.22.11 sucrase: 3.35.1 @@ -14073,7 +14133,7 @@ snapshots: unplugin-utils@0.3.1: dependencies: pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.5 unplugin-utils@0.3.2: dependencies: From 0b66f5be6494b5c802219377874a7d3b3a0fbae2 Mon Sep 17 00:00:00 2001 From: anish16patel Date: Thu, 27 Aug 2026 13:24:18 -0700 Subject: [PATCH 06/10] test(strr-host-pm-web): fix i18n mock gap in connect-fee-info-amount spec ConnectFeeInfo.* strings live only in strr-base-web's own locale file. Under mountSuspended, the real @nuxtjs/i18n module doesn't merge that layer's locale file in, so the component's auto-imported useI18n() resolved against messages missing those keys - independent of the test's own baseEnI18n mock, which was only ever used to compute the expected assertion values, not to back the rendered component. Stub useI18n via mockNuxtImport (already used elsewhere in this test suite for other auto-imports) so the component resolves against the same baseEnI18n messages the assertions are built from. --- .../tests/unit/connect-fee-info-amount.spec.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/strr-host-pm-web/tests/unit/connect-fee-info-amount.spec.ts b/strr-host-pm-web/tests/unit/connect-fee-info-amount.spec.ts index c1abb8332..bdd80572f 100644 --- a/strr-host-pm-web/tests/unit/connect-fee-info-amount.spec.ts +++ b/strr-host-pm-web/tests/unit/connect-fee-info-amount.spec.ts @@ -1,4 +1,4 @@ -import { mountSuspended } from '@nuxt/test-utils/runtime' +import { mountSuspended, mockNuxtImport } from '@nuxt/test-utils/runtime' import { describe, it, expect, beforeEach } from 'vitest' import { baseEnI18n } from '../mocks/i18n' import { ConnectFeeInfoAmount } from '#components' @@ -6,6 +6,12 @@ import { FeeInfo } from '#imports' const $t = baseEnI18n.global.t +// ConnectFeeInfo.* strings live only in strr-base-web's own locale file, which +// the real i18n module doesn't merge in under mountSuspended - stub the +// auto-imported useI18n so the component resolves against the same messages +// this test asserts against. +mockNuxtImport('useI18n', () => () => ({ t: $t })) + const mockFeeItem: ConnectFeeItem = { filingTypeCode: 'STRR', filingType: 'strr', From 15e9e1b5bcc943eec24bc0db3fa4e2406552aaed Mon Sep 17 00:00:00 2001 From: anish16patel Date: Thu, 27 Aug 2026 14:09:44 -0700 Subject: [PATCH 07/10] fix: avoid PATH-dependent exec calls in the eager strr-base-web prepare shim Sonar flagged execSync('npx --yes pnpm install ...')/('npx --yes nuxi prepare ...') in all 4 apps' nuxt.config.ts (typescript:S4036 - PATH search for the executed command). Replace with pre-resolved absolute paths: corepack (bundled next to the running node binary, so still honours strr-base-web's own pinned packageManager version the same way npx did) for the install step, and nuxt's own package.json 'bin' field (the same lookup pnpm's own generated shim uses, since nuxt's 'exports' map doesn't expose './bin/nuxt.mjs' for require.resolve) for the prepare step. Verified locally via a simulated fresh checkout (node_modules/.nuxt deleted) that both steps still run and the build completes. --- strr-examiner-web/nuxt.config.ts | 27 +++++++++++++++++++++++---- strr-host-pm-web/nuxt.config.ts | 27 +++++++++++++++++++++++---- strr-platform-web/nuxt.config.ts | 27 +++++++++++++++++++++++---- strr-strata-web/nuxt.config.ts | 27 +++++++++++++++++++++++---- 4 files changed, 92 insertions(+), 16 deletions(-) diff --git a/strr-examiner-web/nuxt.config.ts b/strr-examiner-web/nuxt.config.ts index ed04eabc2..e718a80a5 100644 --- a/strr-examiner-web/nuxt.config.ts +++ b/strr-examiner-web/nuxt.config.ts @@ -1,20 +1,39 @@ -import { existsSync } from 'node:fs' -import { execSync } from 'node:child_process' +import { existsSync, readFileSync } from 'node:fs' +import { execSync, execFileSync } from 'node:child_process' import { fileURLToPath } from 'node:url' import { dirname, resolve } from 'node:path' +import { createRequire } from 'node:module' // strr-base-web is extended as a local sibling layer (not a published package), // so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +// +// Both steps below invoke exact, pre-resolved absolute paths rather than +// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never +// depends on PATH (SonarCloud typescript:S4036). const __dirname = dirname(fileURLToPath(import.meta.url)) const baseWebDir = resolve(__dirname, '../strr-base-web') if (!existsSync(resolve(baseWebDir, 'node_modules'))) { - execSync('npx --yes pnpm install --ignore-scripts', { cwd: baseWebDir, stdio: 'inherit' }) + // corepack ships in the same directory as the running node binary itself, so + // this resolves it without any PATH search, while still going through corepack + // (rather than a fixed pnpm binary) so it honours baseWebDir's own pinned + // packageManager version, same as the original `npx pnpm` invocation did. + const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') + // execSync (not execFileSync) here since corepack.cmd is a batch file that + // needs shell interpretation to run on Windows; the command name itself is + // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. + execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) } if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { - execSync('npx --yes nuxi prepare', { cwd: baseWebDir, stdio: 'inherit' }) + // nuxt's own "bin" field (which its package.json "exports" map deliberately + // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds + // this same file - read it the same way instead of guessing the path. + const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) + const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) + const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) + execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) } // https://nuxt.com/docs/api/configuration/nuxt-config diff --git a/strr-host-pm-web/nuxt.config.ts b/strr-host-pm-web/nuxt.config.ts index 7ff7f905a..d273026f0 100644 --- a/strr-host-pm-web/nuxt.config.ts +++ b/strr-host-pm-web/nuxt.config.ts @@ -1,20 +1,39 @@ -import { existsSync } from 'node:fs' -import { execSync } from 'node:child_process' +import { existsSync, readFileSync } from 'node:fs' +import { execSync, execFileSync } from 'node:child_process' import { fileURLToPath } from 'node:url' import { dirname, resolve } from 'node:path' +import { createRequire } from 'node:module' // strr-base-web is extended as a local sibling layer (not a published package), // so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +// +// Both steps below invoke exact, pre-resolved absolute paths rather than +// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never +// depends on PATH (SonarCloud typescript:S4036). const __dirname = dirname(fileURLToPath(import.meta.url)) const baseWebDir = resolve(__dirname, '../strr-base-web') if (!existsSync(resolve(baseWebDir, 'node_modules'))) { - execSync('npx --yes pnpm install --ignore-scripts', { cwd: baseWebDir, stdio: 'inherit' }) + // corepack ships in the same directory as the running node binary itself, so + // this resolves it without any PATH search, while still going through corepack + // (rather than a fixed pnpm binary) so it honours baseWebDir's own pinned + // packageManager version, same as the original `npx pnpm` invocation did. + const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') + // execSync (not execFileSync) here since corepack.cmd is a batch file that + // needs shell interpretation to run on Windows; the command name itself is + // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. + execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) } if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { - execSync('npx --yes nuxi prepare', { cwd: baseWebDir, stdio: 'inherit' }) + // nuxt's own "bin" field (which its package.json "exports" map deliberately + // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds + // this same file - read it the same way instead of guessing the path. + const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) + const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) + const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) + execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) } // https://nuxt.com/docs/api/configuration/nuxt-config diff --git a/strr-platform-web/nuxt.config.ts b/strr-platform-web/nuxt.config.ts index e482928ec..dcdd56702 100644 --- a/strr-platform-web/nuxt.config.ts +++ b/strr-platform-web/nuxt.config.ts @@ -1,20 +1,39 @@ -import { existsSync } from 'node:fs' -import { execSync } from 'node:child_process' +import { existsSync, readFileSync } from 'node:fs' +import { execSync, execFileSync } from 'node:child_process' import { fileURLToPath } from 'node:url' import { dirname, resolve } from 'node:path' +import { createRequire } from 'node:module' // strr-base-web is extended as a local sibling layer (not a published package), // so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +// +// Both steps below invoke exact, pre-resolved absolute paths rather than +// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never +// depends on PATH (SonarCloud typescript:S4036). const __dirname = dirname(fileURLToPath(import.meta.url)) const baseWebDir = resolve(__dirname, '../strr-base-web') if (!existsSync(resolve(baseWebDir, 'node_modules'))) { - execSync('npx --yes pnpm install --ignore-scripts', { cwd: baseWebDir, stdio: 'inherit' }) + // corepack ships in the same directory as the running node binary itself, so + // this resolves it without any PATH search, while still going through corepack + // (rather than a fixed pnpm binary) so it honours baseWebDir's own pinned + // packageManager version, same as the original `npx pnpm` invocation did. + const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') + // execSync (not execFileSync) here since corepack.cmd is a batch file that + // needs shell interpretation to run on Windows; the command name itself is + // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. + execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) } if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { - execSync('npx --yes nuxi prepare', { cwd: baseWebDir, stdio: 'inherit' }) + // nuxt's own "bin" field (which its package.json "exports" map deliberately + // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds + // this same file - read it the same way instead of guessing the path. + const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) + const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) + const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) + execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) } // https://nuxt.com/docs/api/configuration/nuxt-config diff --git a/strr-strata-web/nuxt.config.ts b/strr-strata-web/nuxt.config.ts index 12fc26500..43684aba8 100644 --- a/strr-strata-web/nuxt.config.ts +++ b/strr-strata-web/nuxt.config.ts @@ -1,20 +1,39 @@ -import { existsSync } from 'node:fs' -import { execSync } from 'node:child_process' +import { existsSync, readFileSync } from 'node:fs' +import { execSync, execFileSync } from 'node:child_process' import { fileURLToPath } from 'node:url' import { dirname, resolve } from 'node:path' +import { createRequire } from 'node:module' // strr-base-web is extended as a local sibling layer (not a published package), // so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +// +// Both steps below invoke exact, pre-resolved absolute paths rather than +// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never +// depends on PATH (SonarCloud typescript:S4036). const __dirname = dirname(fileURLToPath(import.meta.url)) const baseWebDir = resolve(__dirname, '../strr-base-web') if (!existsSync(resolve(baseWebDir, 'node_modules'))) { - execSync('npx --yes pnpm install --ignore-scripts', { cwd: baseWebDir, stdio: 'inherit' }) + // corepack ships in the same directory as the running node binary itself, so + // this resolves it without any PATH search, while still going through corepack + // (rather than a fixed pnpm binary) so it honours baseWebDir's own pinned + // packageManager version, same as the original `npx pnpm` invocation did. + const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') + // execSync (not execFileSync) here since corepack.cmd is a batch file that + // needs shell interpretation to run on Windows; the command name itself is + // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. + execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) } if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { - execSync('npx --yes nuxi prepare', { cwd: baseWebDir, stdio: 'inherit' }) + // nuxt's own "bin" field (which its package.json "exports" map deliberately + // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds + // this same file - read it the same way instead of guessing the path. + const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) + const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) + const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) + execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) } // https://nuxt.com/docs/api/configuration/nuxt-config From 6c733444cdae3b323e513505b2114a5c9e8fa61e Mon Sep 17 00:00:00 2001 From: anish16patel Date: Thu, 27 Aug 2026 14:29:33 -0700 Subject: [PATCH 08/10] refactor: dedupe the strr-base-web eager-prepare shim into one shared module The PATH-avoidance fix from the previous commit was correct but duplicated the same ~27 lines across all 4 apps' nuxt.config.ts, which pushed SonarCloud's New Code duplication gate from 7.2% to 15.6%. Move the logic into strr-base-web/prepare.mjs (a plain module with no external deps of its own, safe to import even before strr-base-web's own node_modules exists) and have each app just call ensureStrrBaseWebPrepared(). Verified locally via a simulated fresh checkout that both the prepare step and the full build still succeed. --- strr-base-web/prepare.mjs | 43 ++++++++++++++++++++++++++++++++ strr-examiner-web/nuxt.config.ts | 33 ++---------------------- strr-host-pm-web/nuxt.config.ts | 33 ++---------------------- strr-platform-web/nuxt.config.ts | 33 ++---------------------- strr-strata-web/nuxt.config.ts | 33 ++---------------------- 5 files changed, 51 insertions(+), 124 deletions(-) create mode 100644 strr-base-web/prepare.mjs diff --git a/strr-base-web/prepare.mjs b/strr-base-web/prepare.mjs new file mode 100644 index 000000000..1bfedd6c3 --- /dev/null +++ b/strr-base-web/prepare.mjs @@ -0,0 +1,43 @@ +import { existsSync, readFileSync } from 'node:fs' +import { execSync, execFileSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' +import { dirname, resolve } from 'node:path' +import { createRequire } from 'node:module' + +// strr-base-web is extended as a local sibling layer (not a published package) by +// strr-examiner-web, strr-host-pm-web, strr-platform-web and strr-strata-web, so +// its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout +// (e.g. CI, where only one app's own `nuxt prepare` runs). Without it, jiti fails +// to resolve strr-base-web/tsconfig.json's "extends" while evaluating its +// tailwind.config.ts, breaking the whole build. Each consuming app's nuxt.config.ts +// calls ensureStrrBaseWebPrepared() to prepare it eagerly if missing - kept here, +// as a single shared module with no external dependencies of its own (safe to +// import even before this package's own node_modules exists), rather than +// duplicated in each app's own config. +// +// Both steps below invoke exact, pre-resolved absolute paths rather than +// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never +// depends on PATH (SonarCloud typescript:S4036). +export function ensureStrrBaseWebPrepared () { + const baseWebDir = dirname(fileURLToPath(import.meta.url)) + if (!existsSync(resolve(baseWebDir, 'node_modules'))) { + // corepack ships in the same directory as the running node binary itself, so + // this resolves it without any PATH search, while still going through corepack + // (rather than a fixed pnpm binary) so it honours this package's own pinned + // packageManager version, same as the original `npx pnpm` invocation did. + const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') + // execSync (not execFileSync) here since corepack.cmd is a batch file that + // needs shell interpretation to run on Windows; the command name itself is + // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. + execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) + } + if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { + // nuxt's own "bin" field (which its package.json "exports" map deliberately + // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds + // this same file - read it the same way instead of guessing the path. + const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) + const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) + const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) + execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) + } +} diff --git a/strr-examiner-web/nuxt.config.ts b/strr-examiner-web/nuxt.config.ts index e718a80a5..1fbabf999 100644 --- a/strr-examiner-web/nuxt.config.ts +++ b/strr-examiner-web/nuxt.config.ts @@ -1,40 +1,11 @@ -import { existsSync, readFileSync } from 'node:fs' -import { execSync, execFileSync } from 'node:child_process' -import { fileURLToPath } from 'node:url' -import { dirname, resolve } from 'node:path' -import { createRequire } from 'node:module' +import { ensureStrrBaseWebPrepared } from '../strr-base-web/prepare.mjs' // strr-base-web is extended as a local sibling layer (not a published package), // so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. -// -// Both steps below invoke exact, pre-resolved absolute paths rather than -// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never -// depends on PATH (SonarCloud typescript:S4036). -const __dirname = dirname(fileURLToPath(import.meta.url)) -const baseWebDir = resolve(__dirname, '../strr-base-web') -if (!existsSync(resolve(baseWebDir, 'node_modules'))) { - // corepack ships in the same directory as the running node binary itself, so - // this resolves it without any PATH search, while still going through corepack - // (rather than a fixed pnpm binary) so it honours baseWebDir's own pinned - // packageManager version, same as the original `npx pnpm` invocation did. - const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') - // execSync (not execFileSync) here since corepack.cmd is a batch file that - // needs shell interpretation to run on Windows; the command name itself is - // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. - execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) -} -if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { - // nuxt's own "bin" field (which its package.json "exports" map deliberately - // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds - // this same file - read it the same way instead of guessing the path. - const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) - const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) - const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) - execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) -} +ensureStrrBaseWebPrepared() // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ diff --git a/strr-host-pm-web/nuxt.config.ts b/strr-host-pm-web/nuxt.config.ts index d273026f0..13b211add 100644 --- a/strr-host-pm-web/nuxt.config.ts +++ b/strr-host-pm-web/nuxt.config.ts @@ -1,40 +1,11 @@ -import { existsSync, readFileSync } from 'node:fs' -import { execSync, execFileSync } from 'node:child_process' -import { fileURLToPath } from 'node:url' -import { dirname, resolve } from 'node:path' -import { createRequire } from 'node:module' +import { ensureStrrBaseWebPrepared } from '../strr-base-web/prepare.mjs' // strr-base-web is extended as a local sibling layer (not a published package), // so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. -// -// Both steps below invoke exact, pre-resolved absolute paths rather than -// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never -// depends on PATH (SonarCloud typescript:S4036). -const __dirname = dirname(fileURLToPath(import.meta.url)) -const baseWebDir = resolve(__dirname, '../strr-base-web') -if (!existsSync(resolve(baseWebDir, 'node_modules'))) { - // corepack ships in the same directory as the running node binary itself, so - // this resolves it without any PATH search, while still going through corepack - // (rather than a fixed pnpm binary) so it honours baseWebDir's own pinned - // packageManager version, same as the original `npx pnpm` invocation did. - const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') - // execSync (not execFileSync) here since corepack.cmd is a batch file that - // needs shell interpretation to run on Windows; the command name itself is - // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. - execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) -} -if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { - // nuxt's own "bin" field (which its package.json "exports" map deliberately - // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds - // this same file - read it the same way instead of guessing the path. - const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) - const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) - const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) - execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) -} +ensureStrrBaseWebPrepared() // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ diff --git a/strr-platform-web/nuxt.config.ts b/strr-platform-web/nuxt.config.ts index dcdd56702..1029009f9 100644 --- a/strr-platform-web/nuxt.config.ts +++ b/strr-platform-web/nuxt.config.ts @@ -1,40 +1,11 @@ -import { existsSync, readFileSync } from 'node:fs' -import { execSync, execFileSync } from 'node:child_process' -import { fileURLToPath } from 'node:url' -import { dirname, resolve } from 'node:path' -import { createRequire } from 'node:module' +import { ensureStrrBaseWebPrepared } from '../strr-base-web/prepare.mjs' // strr-base-web is extended as a local sibling layer (not a published package), // so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. -// -// Both steps below invoke exact, pre-resolved absolute paths rather than -// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never -// depends on PATH (SonarCloud typescript:S4036). -const __dirname = dirname(fileURLToPath(import.meta.url)) -const baseWebDir = resolve(__dirname, '../strr-base-web') -if (!existsSync(resolve(baseWebDir, 'node_modules'))) { - // corepack ships in the same directory as the running node binary itself, so - // this resolves it without any PATH search, while still going through corepack - // (rather than a fixed pnpm binary) so it honours baseWebDir's own pinned - // packageManager version, same as the original `npx pnpm` invocation did. - const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') - // execSync (not execFileSync) here since corepack.cmd is a batch file that - // needs shell interpretation to run on Windows; the command name itself is - // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. - execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) -} -if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { - // nuxt's own "bin" field (which its package.json "exports" map deliberately - // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds - // this same file - read it the same way instead of guessing the path. - const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) - const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) - const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) - execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) -} +ensureStrrBaseWebPrepared() // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ diff --git a/strr-strata-web/nuxt.config.ts b/strr-strata-web/nuxt.config.ts index 43684aba8..a615df253 100644 --- a/strr-strata-web/nuxt.config.ts +++ b/strr-strata-web/nuxt.config.ts @@ -1,40 +1,11 @@ -import { existsSync, readFileSync } from 'node:fs' -import { execSync, execFileSync } from 'node:child_process' -import { fileURLToPath } from 'node:url' -import { dirname, resolve } from 'node:path' -import { createRequire } from 'node:module' +import { ensureStrrBaseWebPrepared } from '../strr-base-web/prepare.mjs' // strr-base-web is extended as a local sibling layer (not a published package), // so its own generated .nuxt/tsconfig.json may not exist yet in a fresh checkout // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. -// -// Both steps below invoke exact, pre-resolved absolute paths rather than -// shelling out to `npx pnpm`/`npx nuxi` by bare name, so resolution never -// depends on PATH (SonarCloud typescript:S4036). -const __dirname = dirname(fileURLToPath(import.meta.url)) -const baseWebDir = resolve(__dirname, '../strr-base-web') -if (!existsSync(resolve(baseWebDir, 'node_modules'))) { - // corepack ships in the same directory as the running node binary itself, so - // this resolves it without any PATH search, while still going through corepack - // (rather than a fixed pnpm binary) so it honours baseWebDir's own pinned - // packageManager version, same as the original `npx pnpm` invocation did. - const corepackBin = resolve(dirname(process.execPath), process.platform === 'win32' ? 'corepack.cmd' : 'corepack') - // execSync (not execFileSync) here since corepack.cmd is a batch file that - // needs shell interpretation to run on Windows; the command name itself is - // still an absolute, quoted path rather than a bare "npx"/"pnpm" lookup. - execSync(`"${corepackBin}" pnpm install --ignore-scripts`, { cwd: baseWebDir, stdio: 'inherit' }) -} -if (!existsSync(resolve(baseWebDir, '.nuxt/tsconfig.json'))) { - // nuxt's own "bin" field (which its package.json "exports" map deliberately - // doesn't expose as an importable subpath) is how pnpm's own nuxi shim finds - // this same file - read it the same way instead of guessing the path. - const nuxtPkgPath = createRequire(import.meta.url).resolve('nuxt/package.json', { paths: [baseWebDir] }) - const nuxtPkg = JSON.parse(readFileSync(nuxtPkgPath, 'utf-8')) - const nuxtBin = resolve(dirname(nuxtPkgPath), nuxtPkg.bin.nuxi) - execFileSync(process.execPath, [nuxtBin, 'prepare'], { cwd: baseWebDir, stdio: 'inherit' }) -} +ensureStrrBaseWebPrepared() // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ From ff45ad45c9e8acf7941b6fb85ba75b0d9268be20 Mon Sep 17 00:00:00 2001 From: anish16patel Date: Mon, 31 Aug 2026 16:54:33 -0700 Subject: [PATCH 09/10] fix: fetch strr-base-web from GitHub in the CD deploy pipeline when absent The official CD deploy pipeline's Docker build context is scoped to each app's own directory only (bcgov/bcregistry-sre's Dockerfile-build does `COPY . /app` from whatever `gcloud builds submit` was invoked with, which frontend-cd.yaml scopes to just working_directory) - strr-base-web is never uploaded alongside it there, unlike CI/local dev/the Cloud Build PR-preview channel, which all have the full repo checked out. Confirmed live: a real deploy attempt failed with `Cannot find module '../strr-base-web/prepare.mjs'` since the whole directory doesn't exist in that build context, not just its node_modules. Add ensure-strr-base-web.mjs, a preinstall script (runs before pnpm even resolves dependencies) that clones strr-base-web fresh from GitHub main when the sibling directory is missing outright - matching what the old git-hosted `extends` layer reference used to do at build time regardless of local checkout contents, before an earlier commit on this branch switched to a local relative path to fix pnpm 11's resolution of that reference. This can't live inside nuxt.config.ts itself: jiti (its loader) resolves import()s ahead of the file's own runtime code executing, so a dynamic import can't depend on a clone step run a few lines above it in the same file - confirmed by testing an in-config version first, which failed identically even with the file already cloned to disk by that point. It's necessarily identical across all 4 apps (each one's CD build context is a fully isolated Docker build containing only that app's own directory, so unlike its normal-case counterpart strr-base-web/prepare.mjs, there's nothing to import it from) - excluded from SonarCloud's copy-paste detection accordingly, following the same sonar.cpd.exclusions pattern already used for test files. Verified locally: the preinstall script correctly clones and the subsequent nuxt prepare + build succeed when strr-base-web is deleted first (simulating the CD pipeline's actual build context), and nothing regresses in the normal case where it's already present. Known limitation: this fetches whatever's on bcgov/STRR's main, not this PR's own branch - correct for real dev/test/prod deploys once this merges (main will have the matching strr-base-web changes by then), but a manual pre-merge validation deploy of this branch alone (e.g. jimmy's feature-pnpm-v11-validate push) would still get a stale strr-base-web missing this PR's own fixes to it. --- .sonarcloud.properties | 8 ++++- strr-examiner-web/ensure-strr-base-web.mjs | 39 ++++++++++++++++++++++ strr-examiner-web/nuxt.config.ts | 9 +++++ strr-examiner-web/package.json | 1 + strr-host-pm-web/ensure-strr-base-web.mjs | 39 ++++++++++++++++++++++ strr-host-pm-web/nuxt.config.ts | 9 +++++ strr-host-pm-web/package.json | 1 + strr-platform-web/ensure-strr-base-web.mjs | 39 ++++++++++++++++++++++ strr-platform-web/nuxt.config.ts | 9 +++++ strr-platform-web/package.json | 1 + strr-strata-web/ensure-strr-base-web.mjs | 39 ++++++++++++++++++++++ strr-strata-web/nuxt.config.ts | 9 +++++ strr-strata-web/package.json | 1 + 13 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 strr-examiner-web/ensure-strr-base-web.mjs create mode 100644 strr-host-pm-web/ensure-strr-base-web.mjs create mode 100644 strr-platform-web/ensure-strr-base-web.mjs create mode 100644 strr-strata-web/ensure-strr-base-web.mjs diff --git a/.sonarcloud.properties b/.sonarcloud.properties index 26d11c136..dbb2523b6 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -15,4 +15,10 @@ sonar.exclusions=strr-api/migrations/**/*,strr-api/devops/**/*,strr-api/tests/** sonar.sourceEncoding=UTF-8 # Exclusions for copy-paste detection -sonar.cpd.exclusions=strr-host-pm-web/tests/**, strr-host-pm-web/vitest.config.ts, strr-examiner-web/tests/** +# */ensure-strr-base-web.mjs is necessarily identical across the 4 STRR apps +# it appears in: each app's CD deploy build context is a fully isolated Docker +# build containing only that app's own directory, so this fallback (fetching +# the shared strr-base-web layer from GitHub when it's not there at all) can't +# be extracted into a shared module the way its normal-case counterpart, +# strr-base-web/prepare.mjs, is - there's nothing to import it from. +sonar.cpd.exclusions=strr-host-pm-web/tests/**, strr-host-pm-web/vitest.config.ts, strr-examiner-web/tests/**, */ensure-strr-base-web.mjs diff --git a/strr-examiner-web/ensure-strr-base-web.mjs b/strr-examiner-web/ensure-strr-base-web.mjs new file mode 100644 index 000000000..ceb04fd3c --- /dev/null +++ b/strr-examiner-web/ensure-strr-base-web.mjs @@ -0,0 +1,39 @@ +import { existsSync, cpSync, rmSync } from 'node:fs' +import { execFileSync } from 'node:child_process' +import { delimiter, dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +// strr-base-web is extended as a local sibling layer (not a published package) - +// see nuxt.config.ts for why. The official CD deploy pipeline's Docker build +// context is scoped to this app's own directory only (bcgov/bcregistry-sre's +// Dockerfile-build does `COPY . /app` from whatever `gcloud builds submit` was +// invoked with, which frontend-cd.yaml scopes to just this app's +// working_directory) - strr-base-web is never uploaded alongside it there, by +// design. CI/local dev/the Cloud Build PR-preview channel all have the full +// repo checked out, so this is CD-pipeline-specific: clone strr-base-web fresh +// from main when it's not there at all, matching what the old git-hosted +// `extends` layer reference used to do at build time regardless of local +// checkout contents. +// +// This has to run as a standalone `preinstall` script (before pnpm even +// resolves dependencies, well before nuxt.config.ts is loaded via +// `postinstall: nuxt prepare`) rather than inside nuxt.config.ts itself: jiti +// (nuxt.config.ts's loader) resolves import()s ahead of that file's own +// runtime code executing, so a dynamic import there can't depend on a clone +// step run earlier in the same file. +const baseWebDir = resolve(dirname(fileURLToPath(import.meta.url)), '../strr-base-web') + +if (!existsSync(baseWebDir)) { + // Resolve git's absolute path ourselves (rather than letting execFileSync's + // OS-level PATH search find it) so this doesn't trip SonarCloud typescript:S4036. + const gitBin = (process.env.PATH || '').split(delimiter) + .map(dir => join(dir, process.platform === 'win32' ? 'git.exe' : 'git')) + .find(existsSync) + if (!gitBin) { + throw new Error('git not found on PATH - required to fetch strr-base-web for this build context') + } + const cloneDir = resolve(baseWebDir, '..', '.strr-clone') + execFileSync(gitBin, ['clone', '--depth', '1', 'https://github.com/bcgov/STRR.git', cloneDir], { stdio: 'inherit' }) + cpSync(resolve(cloneDir, 'strr-base-web'), baseWebDir, { recursive: true }) + rmSync(cloneDir, { recursive: true, force: true }) +} diff --git a/strr-examiner-web/nuxt.config.ts b/strr-examiner-web/nuxt.config.ts index 1fbabf999..244080cc9 100644 --- a/strr-examiner-web/nuxt.config.ts +++ b/strr-examiner-web/nuxt.config.ts @@ -5,6 +5,15 @@ import { ensureStrrBaseWebPrepared } from '../strr-base-web/prepare.mjs' // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +// +// strr-base-web itself is guaranteed to exist by this point: the official CD +// deploy pipeline's Docker build context is scoped to this app's own directory +// only, so a `preinstall` script (ensure-strr-base-web.mjs, run before pnpm +// even resolves dependencies, well before this file is loaded) clones it fresh +// from GitHub there if it's missing outright - see that file for why this +// can't live here instead (jiti pre-resolves import()s before any of this +// file's own runtime code executes, so a dynamic import can't depend on a +// clone step that only just ran a few lines above it). ensureStrrBaseWebPrepared() // https://nuxt.com/docs/api/configuration/nuxt-config diff --git a/strr-examiner-web/package.json b/strr-examiner-web/package.json index a931ad001..e3fb7dff6 100644 --- a/strr-examiner-web/package.json +++ b/strr-examiner-web/package.json @@ -12,6 +12,7 @@ "dev": "nuxt dev --port 3000", "generate": "nuxt generate", "preview": "nuxt preview", + "preinstall": "node ensure-strr-base-web.mjs", "postinstall": "nuxt prepare", "lint": "eslint --ext .ts,.vue app tests --ignore-path .gitignore", "lint:fix": "pnpm lint --fix", diff --git a/strr-host-pm-web/ensure-strr-base-web.mjs b/strr-host-pm-web/ensure-strr-base-web.mjs new file mode 100644 index 000000000..ceb04fd3c --- /dev/null +++ b/strr-host-pm-web/ensure-strr-base-web.mjs @@ -0,0 +1,39 @@ +import { existsSync, cpSync, rmSync } from 'node:fs' +import { execFileSync } from 'node:child_process' +import { delimiter, dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +// strr-base-web is extended as a local sibling layer (not a published package) - +// see nuxt.config.ts for why. The official CD deploy pipeline's Docker build +// context is scoped to this app's own directory only (bcgov/bcregistry-sre's +// Dockerfile-build does `COPY . /app` from whatever `gcloud builds submit` was +// invoked with, which frontend-cd.yaml scopes to just this app's +// working_directory) - strr-base-web is never uploaded alongside it there, by +// design. CI/local dev/the Cloud Build PR-preview channel all have the full +// repo checked out, so this is CD-pipeline-specific: clone strr-base-web fresh +// from main when it's not there at all, matching what the old git-hosted +// `extends` layer reference used to do at build time regardless of local +// checkout contents. +// +// This has to run as a standalone `preinstall` script (before pnpm even +// resolves dependencies, well before nuxt.config.ts is loaded via +// `postinstall: nuxt prepare`) rather than inside nuxt.config.ts itself: jiti +// (nuxt.config.ts's loader) resolves import()s ahead of that file's own +// runtime code executing, so a dynamic import there can't depend on a clone +// step run earlier in the same file. +const baseWebDir = resolve(dirname(fileURLToPath(import.meta.url)), '../strr-base-web') + +if (!existsSync(baseWebDir)) { + // Resolve git's absolute path ourselves (rather than letting execFileSync's + // OS-level PATH search find it) so this doesn't trip SonarCloud typescript:S4036. + const gitBin = (process.env.PATH || '').split(delimiter) + .map(dir => join(dir, process.platform === 'win32' ? 'git.exe' : 'git')) + .find(existsSync) + if (!gitBin) { + throw new Error('git not found on PATH - required to fetch strr-base-web for this build context') + } + const cloneDir = resolve(baseWebDir, '..', '.strr-clone') + execFileSync(gitBin, ['clone', '--depth', '1', 'https://github.com/bcgov/STRR.git', cloneDir], { stdio: 'inherit' }) + cpSync(resolve(cloneDir, 'strr-base-web'), baseWebDir, { recursive: true }) + rmSync(cloneDir, { recursive: true, force: true }) +} diff --git a/strr-host-pm-web/nuxt.config.ts b/strr-host-pm-web/nuxt.config.ts index 13b211add..733710c1f 100644 --- a/strr-host-pm-web/nuxt.config.ts +++ b/strr-host-pm-web/nuxt.config.ts @@ -5,6 +5,15 @@ import { ensureStrrBaseWebPrepared } from '../strr-base-web/prepare.mjs' // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +// +// strr-base-web itself is guaranteed to exist by this point: the official CD +// deploy pipeline's Docker build context is scoped to this app's own directory +// only, so a `preinstall` script (ensure-strr-base-web.mjs, run before pnpm +// even resolves dependencies, well before this file is loaded) clones it fresh +// from GitHub there if it's missing outright - see that file for why this +// can't live here instead (jiti pre-resolves import()s before any of this +// file's own runtime code executes, so a dynamic import can't depend on a +// clone step that only just ran a few lines above it). ensureStrrBaseWebPrepared() // https://nuxt.com/docs/api/configuration/nuxt-config diff --git a/strr-host-pm-web/package.json b/strr-host-pm-web/package.json index 8cf4ad729..4ed91d5bd 100644 --- a/strr-host-pm-web/package.json +++ b/strr-host-pm-web/package.json @@ -12,6 +12,7 @@ "dev": "nuxt dev --port 3000", "generate": "nuxt generate", "preview": "nuxt preview", + "preinstall": "node ensure-strr-base-web.mjs", "postinstall": "nuxt prepare", "lint": "eslint --ext .ts,.vue app tests --ignore-path .gitignore", "lint:fix": "pnpm lint --fix", diff --git a/strr-platform-web/ensure-strr-base-web.mjs b/strr-platform-web/ensure-strr-base-web.mjs new file mode 100644 index 000000000..ceb04fd3c --- /dev/null +++ b/strr-platform-web/ensure-strr-base-web.mjs @@ -0,0 +1,39 @@ +import { existsSync, cpSync, rmSync } from 'node:fs' +import { execFileSync } from 'node:child_process' +import { delimiter, dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +// strr-base-web is extended as a local sibling layer (not a published package) - +// see nuxt.config.ts for why. The official CD deploy pipeline's Docker build +// context is scoped to this app's own directory only (bcgov/bcregistry-sre's +// Dockerfile-build does `COPY . /app` from whatever `gcloud builds submit` was +// invoked with, which frontend-cd.yaml scopes to just this app's +// working_directory) - strr-base-web is never uploaded alongside it there, by +// design. CI/local dev/the Cloud Build PR-preview channel all have the full +// repo checked out, so this is CD-pipeline-specific: clone strr-base-web fresh +// from main when it's not there at all, matching what the old git-hosted +// `extends` layer reference used to do at build time regardless of local +// checkout contents. +// +// This has to run as a standalone `preinstall` script (before pnpm even +// resolves dependencies, well before nuxt.config.ts is loaded via +// `postinstall: nuxt prepare`) rather than inside nuxt.config.ts itself: jiti +// (nuxt.config.ts's loader) resolves import()s ahead of that file's own +// runtime code executing, so a dynamic import there can't depend on a clone +// step run earlier in the same file. +const baseWebDir = resolve(dirname(fileURLToPath(import.meta.url)), '../strr-base-web') + +if (!existsSync(baseWebDir)) { + // Resolve git's absolute path ourselves (rather than letting execFileSync's + // OS-level PATH search find it) so this doesn't trip SonarCloud typescript:S4036. + const gitBin = (process.env.PATH || '').split(delimiter) + .map(dir => join(dir, process.platform === 'win32' ? 'git.exe' : 'git')) + .find(existsSync) + if (!gitBin) { + throw new Error('git not found on PATH - required to fetch strr-base-web for this build context') + } + const cloneDir = resolve(baseWebDir, '..', '.strr-clone') + execFileSync(gitBin, ['clone', '--depth', '1', 'https://github.com/bcgov/STRR.git', cloneDir], { stdio: 'inherit' }) + cpSync(resolve(cloneDir, 'strr-base-web'), baseWebDir, { recursive: true }) + rmSync(cloneDir, { recursive: true, force: true }) +} diff --git a/strr-platform-web/nuxt.config.ts b/strr-platform-web/nuxt.config.ts index 1029009f9..388d8b1b0 100644 --- a/strr-platform-web/nuxt.config.ts +++ b/strr-platform-web/nuxt.config.ts @@ -5,6 +5,15 @@ import { ensureStrrBaseWebPrepared } from '../strr-base-web/prepare.mjs' // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +// +// strr-base-web itself is guaranteed to exist by this point: the official CD +// deploy pipeline's Docker build context is scoped to this app's own directory +// only, so a `preinstall` script (ensure-strr-base-web.mjs, run before pnpm +// even resolves dependencies, well before this file is loaded) clones it fresh +// from GitHub there if it's missing outright - see that file for why this +// can't live here instead (jiti pre-resolves import()s before any of this +// file's own runtime code executes, so a dynamic import can't depend on a +// clone step that only just ran a few lines above it). ensureStrrBaseWebPrepared() // https://nuxt.com/docs/api/configuration/nuxt-config diff --git a/strr-platform-web/package.json b/strr-platform-web/package.json index 9f99dbe73..c051b6643 100644 --- a/strr-platform-web/package.json +++ b/strr-platform-web/package.json @@ -12,6 +12,7 @@ "dev": "nuxt dev --port 3000", "generate": "nuxt generate", "preview": "nuxt preview", + "preinstall": "node ensure-strr-base-web.mjs", "postinstall": "nuxt prepare", "lint": "eslint --ext .ts,.vue app tests --ignore-path .gitignore", "lint:fix": "pnpm lint --fix", diff --git a/strr-strata-web/ensure-strr-base-web.mjs b/strr-strata-web/ensure-strr-base-web.mjs new file mode 100644 index 000000000..ceb04fd3c --- /dev/null +++ b/strr-strata-web/ensure-strr-base-web.mjs @@ -0,0 +1,39 @@ +import { existsSync, cpSync, rmSync } from 'node:fs' +import { execFileSync } from 'node:child_process' +import { delimiter, dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +// strr-base-web is extended as a local sibling layer (not a published package) - +// see nuxt.config.ts for why. The official CD deploy pipeline's Docker build +// context is scoped to this app's own directory only (bcgov/bcregistry-sre's +// Dockerfile-build does `COPY . /app` from whatever `gcloud builds submit` was +// invoked with, which frontend-cd.yaml scopes to just this app's +// working_directory) - strr-base-web is never uploaded alongside it there, by +// design. CI/local dev/the Cloud Build PR-preview channel all have the full +// repo checked out, so this is CD-pipeline-specific: clone strr-base-web fresh +// from main when it's not there at all, matching what the old git-hosted +// `extends` layer reference used to do at build time regardless of local +// checkout contents. +// +// This has to run as a standalone `preinstall` script (before pnpm even +// resolves dependencies, well before nuxt.config.ts is loaded via +// `postinstall: nuxt prepare`) rather than inside nuxt.config.ts itself: jiti +// (nuxt.config.ts's loader) resolves import()s ahead of that file's own +// runtime code executing, so a dynamic import there can't depend on a clone +// step run earlier in the same file. +const baseWebDir = resolve(dirname(fileURLToPath(import.meta.url)), '../strr-base-web') + +if (!existsSync(baseWebDir)) { + // Resolve git's absolute path ourselves (rather than letting execFileSync's + // OS-level PATH search find it) so this doesn't trip SonarCloud typescript:S4036. + const gitBin = (process.env.PATH || '').split(delimiter) + .map(dir => join(dir, process.platform === 'win32' ? 'git.exe' : 'git')) + .find(existsSync) + if (!gitBin) { + throw new Error('git not found on PATH - required to fetch strr-base-web for this build context') + } + const cloneDir = resolve(baseWebDir, '..', '.strr-clone') + execFileSync(gitBin, ['clone', '--depth', '1', 'https://github.com/bcgov/STRR.git', cloneDir], { stdio: 'inherit' }) + cpSync(resolve(cloneDir, 'strr-base-web'), baseWebDir, { recursive: true }) + rmSync(cloneDir, { recursive: true, force: true }) +} diff --git a/strr-strata-web/nuxt.config.ts b/strr-strata-web/nuxt.config.ts index a615df253..66ed4022d 100644 --- a/strr-strata-web/nuxt.config.ts +++ b/strr-strata-web/nuxt.config.ts @@ -5,6 +5,15 @@ import { ensureStrrBaseWebPrepared } from '../strr-base-web/prepare.mjs' // (e.g. CI, where only this app's own `nuxt prepare` runs). Without it, jiti fails // to resolve strr-base-web/tsconfig.json's "extends" while evaluating its // tailwind.config.ts, breaking the whole build. Prepare it eagerly if missing. +// +// strr-base-web itself is guaranteed to exist by this point: the official CD +// deploy pipeline's Docker build context is scoped to this app's own directory +// only, so a `preinstall` script (ensure-strr-base-web.mjs, run before pnpm +// even resolves dependencies, well before this file is loaded) clones it fresh +// from GitHub there if it's missing outright - see that file for why this +// can't live here instead (jiti pre-resolves import()s before any of this +// file's own runtime code executes, so a dynamic import can't depend on a +// clone step that only just ran a few lines above it). ensureStrrBaseWebPrepared() // https://nuxt.com/docs/api/configuration/nuxt-config diff --git a/strr-strata-web/package.json b/strr-strata-web/package.json index 5e230f3e3..85116e5ed 100644 --- a/strr-strata-web/package.json +++ b/strr-strata-web/package.json @@ -12,6 +12,7 @@ "dev": "nuxt dev --port 3000", "generate": "nuxt generate", "preview": "nuxt preview", + "preinstall": "node ensure-strr-base-web.mjs", "postinstall": "nuxt prepare", "lint": "eslint --ext .ts,.vue app tests --ignore-path .gitignore", "lint:fix": "pnpm lint --fix", From 4f7f249147601a8048e00c09f19dbcd8223507f5 Mon Sep 17 00:00:00 2001 From: anish16patel Date: Mon, 31 Aug 2026 19:21:31 -0700 Subject: [PATCH 10/10] fix: fetch strr-base-web via GitHub tarball instead of git clone jimmy's real deploy attempt (via feature-pnpm-v11-validate on bcgov/STRR) confirmed the preinstall script itself now runs correctly, but failed with 'git not found on PATH' - the actual CD build image (an Alpine-based firebase-repo image) doesn't have git installed at all, unlike this branch's own local testing environment. Replace the git clone with a plain HTTPS fetch of GitHub's codeload tarball (https://codeload.github.com/bcgov/STRR/tar.gz/refs/heads/main) plus a small hand-rolled tar reader (ustar headers + pax extended headers for long paths, same format git archive/GitHub both produce) using only Node builtins (fetch, zlib, fs) - no external binary dependency at all, so it works regardless of what's installed in whatever build image this runs in, and there's no PATH-dependent command to trip SonarCloud typescript:S4036 in the first place. Verified locally against the real bcgov/STRR tarball (extracted content is byte-identical to a real git checkout, modulo line-ending normalization from this Windows dev environment) and, pointed temporarily at this branch's own fork/ref to include its otherwise main-only-missing prepare.mjs, confirmed the full nuxt prepare + build succeeds end-to-end. --- strr-examiner-web/ensure-strr-base-web.mjs | 72 +++++++++++++++++----- strr-host-pm-web/ensure-strr-base-web.mjs | 72 +++++++++++++++++----- strr-platform-web/ensure-strr-base-web.mjs | 72 +++++++++++++++++----- strr-strata-web/ensure-strr-base-web.mjs | 72 +++++++++++++++++----- 4 files changed, 224 insertions(+), 64 deletions(-) diff --git a/strr-examiner-web/ensure-strr-base-web.mjs b/strr-examiner-web/ensure-strr-base-web.mjs index ceb04fd3c..de15618df 100644 --- a/strr-examiner-web/ensure-strr-base-web.mjs +++ b/strr-examiner-web/ensure-strr-base-web.mjs @@ -1,6 +1,6 @@ -import { existsSync, cpSync, rmSync } from 'node:fs' -import { execFileSync } from 'node:child_process' -import { delimiter, dirname, join, resolve } from 'node:path' +import { existsSync, mkdirSync, writeFileSync } from 'node:fs' +import { gunzipSync } from 'node:zlib' +import { dirname, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' // strr-base-web is extended as a local sibling layer (not a published package) - @@ -10,7 +10,7 @@ import { fileURLToPath } from 'node:url' // invoked with, which frontend-cd.yaml scopes to just this app's // working_directory) - strr-base-web is never uploaded alongside it there, by // design. CI/local dev/the Cloud Build PR-preview channel all have the full -// repo checked out, so this is CD-pipeline-specific: clone strr-base-web fresh +// repo checked out, so this is CD-pipeline-specific: fetch strr-base-web fresh // from main when it's not there at all, matching what the old git-hosted // `extends` layer reference used to do at build time regardless of local // checkout contents. @@ -19,21 +19,61 @@ import { fileURLToPath } from 'node:url' // resolves dependencies, well before nuxt.config.ts is loaded via // `postinstall: nuxt prepare`) rather than inside nuxt.config.ts itself: jiti // (nuxt.config.ts's loader) resolves import()s ahead of that file's own -// runtime code executing, so a dynamic import there can't depend on a clone +// runtime code executing, so a dynamic import there can't depend on a fetch // step run earlier in the same file. +// +// Fetches and extracts GitHub's tarball using only Node builtins (fetch, +// zlib, fs) rather than shelling out to `git`/`tar`/`curl`: the actual build +// image this runs in (an Alpine-based firebase-repo image) doesn't have git +// installed at all, and a bare `execSync('git ...')`/('tar ...') call would +// also trip SonarCloud typescript:S4036 (PATH-dependent command resolution). const baseWebDir = resolve(dirname(fileURLToPath(import.meta.url)), '../strr-base-web') if (!existsSync(baseWebDir)) { - // Resolve git's absolute path ourselves (rather than letting execFileSync's - // OS-level PATH search find it) so this doesn't trip SonarCloud typescript:S4036. - const gitBin = (process.env.PATH || '').split(delimiter) - .map(dir => join(dir, process.platform === 'win32' ? 'git.exe' : 'git')) - .find(existsSync) - if (!gitBin) { - throw new Error('git not found on PATH - required to fetch strr-base-web for this build context') + const res = await fetch('https://codeload.github.com/bcgov/STRR/tar.gz/refs/heads/main') + if (!res.ok) { + throw new Error(`Failed to fetch strr-base-web tarball: ${res.status} ${res.statusText}`) + } + const tar = gunzipSync(Buffer.from(await res.arrayBuffer())) + + // Minimal POSIX tar reader: just enough to pull out the strr-base-web/ + // subtree from a GitHub codeload archive (ustar headers + pax extended + // headers for long paths, which is what git archive/GitHub both produce). + let offset = 0 + let longPath = null + while (offset + 512 <= tar.length) { + const header = tar.subarray(offset, offset + 512) + if (header.every(byte => byte === 0)) { + break + } + const readField = (start, length) => header.subarray(start, start + length).toString('utf-8').replace(/\0.*$/s, '').trim() + const name = longPath ?? readField(0, 100) + const size = parseInt(readField(124, 12) || '0', 8) + const typeflag = String.fromCharCode(header[156]) + const contentStart = offset + 512 + const paddedSize = Math.ceil(size / 512) * 512 + longPath = null + + if (typeflag === 'x') { + // pax extended header: lines like " path=\n" + const pax = tar.subarray(contentStart, contentStart + size).toString('utf-8') + const match = pax.match(/\d+ path=([^\n]+)\n/) + if (match) { + longPath = match[1] + } + } else if ((typeflag === '0' || typeflag === '\0') && name.includes('/strr-base-web/')) { + const relativePath = name.slice(name.indexOf('/strr-base-web/') + '/strr-base-web/'.length) + if (relativePath) { + const destPath = join(baseWebDir, relativePath) + mkdirSync(dirname(destPath), { recursive: true }) + writeFileSync(destPath, tar.subarray(contentStart, contentStart + size)) + } + } + + offset = contentStart + paddedSize + } + + if (!existsSync(baseWebDir)) { + throw new Error('strr-base-web not found in the fetched bcgov/STRR tarball') } - const cloneDir = resolve(baseWebDir, '..', '.strr-clone') - execFileSync(gitBin, ['clone', '--depth', '1', 'https://github.com/bcgov/STRR.git', cloneDir], { stdio: 'inherit' }) - cpSync(resolve(cloneDir, 'strr-base-web'), baseWebDir, { recursive: true }) - rmSync(cloneDir, { recursive: true, force: true }) } diff --git a/strr-host-pm-web/ensure-strr-base-web.mjs b/strr-host-pm-web/ensure-strr-base-web.mjs index ceb04fd3c..de15618df 100644 --- a/strr-host-pm-web/ensure-strr-base-web.mjs +++ b/strr-host-pm-web/ensure-strr-base-web.mjs @@ -1,6 +1,6 @@ -import { existsSync, cpSync, rmSync } from 'node:fs' -import { execFileSync } from 'node:child_process' -import { delimiter, dirname, join, resolve } from 'node:path' +import { existsSync, mkdirSync, writeFileSync } from 'node:fs' +import { gunzipSync } from 'node:zlib' +import { dirname, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' // strr-base-web is extended as a local sibling layer (not a published package) - @@ -10,7 +10,7 @@ import { fileURLToPath } from 'node:url' // invoked with, which frontend-cd.yaml scopes to just this app's // working_directory) - strr-base-web is never uploaded alongside it there, by // design. CI/local dev/the Cloud Build PR-preview channel all have the full -// repo checked out, so this is CD-pipeline-specific: clone strr-base-web fresh +// repo checked out, so this is CD-pipeline-specific: fetch strr-base-web fresh // from main when it's not there at all, matching what the old git-hosted // `extends` layer reference used to do at build time regardless of local // checkout contents. @@ -19,21 +19,61 @@ import { fileURLToPath } from 'node:url' // resolves dependencies, well before nuxt.config.ts is loaded via // `postinstall: nuxt prepare`) rather than inside nuxt.config.ts itself: jiti // (nuxt.config.ts's loader) resolves import()s ahead of that file's own -// runtime code executing, so a dynamic import there can't depend on a clone +// runtime code executing, so a dynamic import there can't depend on a fetch // step run earlier in the same file. +// +// Fetches and extracts GitHub's tarball using only Node builtins (fetch, +// zlib, fs) rather than shelling out to `git`/`tar`/`curl`: the actual build +// image this runs in (an Alpine-based firebase-repo image) doesn't have git +// installed at all, and a bare `execSync('git ...')`/('tar ...') call would +// also trip SonarCloud typescript:S4036 (PATH-dependent command resolution). const baseWebDir = resolve(dirname(fileURLToPath(import.meta.url)), '../strr-base-web') if (!existsSync(baseWebDir)) { - // Resolve git's absolute path ourselves (rather than letting execFileSync's - // OS-level PATH search find it) so this doesn't trip SonarCloud typescript:S4036. - const gitBin = (process.env.PATH || '').split(delimiter) - .map(dir => join(dir, process.platform === 'win32' ? 'git.exe' : 'git')) - .find(existsSync) - if (!gitBin) { - throw new Error('git not found on PATH - required to fetch strr-base-web for this build context') + const res = await fetch('https://codeload.github.com/bcgov/STRR/tar.gz/refs/heads/main') + if (!res.ok) { + throw new Error(`Failed to fetch strr-base-web tarball: ${res.status} ${res.statusText}`) + } + const tar = gunzipSync(Buffer.from(await res.arrayBuffer())) + + // Minimal POSIX tar reader: just enough to pull out the strr-base-web/ + // subtree from a GitHub codeload archive (ustar headers + pax extended + // headers for long paths, which is what git archive/GitHub both produce). + let offset = 0 + let longPath = null + while (offset + 512 <= tar.length) { + const header = tar.subarray(offset, offset + 512) + if (header.every(byte => byte === 0)) { + break + } + const readField = (start, length) => header.subarray(start, start + length).toString('utf-8').replace(/\0.*$/s, '').trim() + const name = longPath ?? readField(0, 100) + const size = parseInt(readField(124, 12) || '0', 8) + const typeflag = String.fromCharCode(header[156]) + const contentStart = offset + 512 + const paddedSize = Math.ceil(size / 512) * 512 + longPath = null + + if (typeflag === 'x') { + // pax extended header: lines like " path=\n" + const pax = tar.subarray(contentStart, contentStart + size).toString('utf-8') + const match = pax.match(/\d+ path=([^\n]+)\n/) + if (match) { + longPath = match[1] + } + } else if ((typeflag === '0' || typeflag === '\0') && name.includes('/strr-base-web/')) { + const relativePath = name.slice(name.indexOf('/strr-base-web/') + '/strr-base-web/'.length) + if (relativePath) { + const destPath = join(baseWebDir, relativePath) + mkdirSync(dirname(destPath), { recursive: true }) + writeFileSync(destPath, tar.subarray(contentStart, contentStart + size)) + } + } + + offset = contentStart + paddedSize + } + + if (!existsSync(baseWebDir)) { + throw new Error('strr-base-web not found in the fetched bcgov/STRR tarball') } - const cloneDir = resolve(baseWebDir, '..', '.strr-clone') - execFileSync(gitBin, ['clone', '--depth', '1', 'https://github.com/bcgov/STRR.git', cloneDir], { stdio: 'inherit' }) - cpSync(resolve(cloneDir, 'strr-base-web'), baseWebDir, { recursive: true }) - rmSync(cloneDir, { recursive: true, force: true }) } diff --git a/strr-platform-web/ensure-strr-base-web.mjs b/strr-platform-web/ensure-strr-base-web.mjs index ceb04fd3c..de15618df 100644 --- a/strr-platform-web/ensure-strr-base-web.mjs +++ b/strr-platform-web/ensure-strr-base-web.mjs @@ -1,6 +1,6 @@ -import { existsSync, cpSync, rmSync } from 'node:fs' -import { execFileSync } from 'node:child_process' -import { delimiter, dirname, join, resolve } from 'node:path' +import { existsSync, mkdirSync, writeFileSync } from 'node:fs' +import { gunzipSync } from 'node:zlib' +import { dirname, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' // strr-base-web is extended as a local sibling layer (not a published package) - @@ -10,7 +10,7 @@ import { fileURLToPath } from 'node:url' // invoked with, which frontend-cd.yaml scopes to just this app's // working_directory) - strr-base-web is never uploaded alongside it there, by // design. CI/local dev/the Cloud Build PR-preview channel all have the full -// repo checked out, so this is CD-pipeline-specific: clone strr-base-web fresh +// repo checked out, so this is CD-pipeline-specific: fetch strr-base-web fresh // from main when it's not there at all, matching what the old git-hosted // `extends` layer reference used to do at build time regardless of local // checkout contents. @@ -19,21 +19,61 @@ import { fileURLToPath } from 'node:url' // resolves dependencies, well before nuxt.config.ts is loaded via // `postinstall: nuxt prepare`) rather than inside nuxt.config.ts itself: jiti // (nuxt.config.ts's loader) resolves import()s ahead of that file's own -// runtime code executing, so a dynamic import there can't depend on a clone +// runtime code executing, so a dynamic import there can't depend on a fetch // step run earlier in the same file. +// +// Fetches and extracts GitHub's tarball using only Node builtins (fetch, +// zlib, fs) rather than shelling out to `git`/`tar`/`curl`: the actual build +// image this runs in (an Alpine-based firebase-repo image) doesn't have git +// installed at all, and a bare `execSync('git ...')`/('tar ...') call would +// also trip SonarCloud typescript:S4036 (PATH-dependent command resolution). const baseWebDir = resolve(dirname(fileURLToPath(import.meta.url)), '../strr-base-web') if (!existsSync(baseWebDir)) { - // Resolve git's absolute path ourselves (rather than letting execFileSync's - // OS-level PATH search find it) so this doesn't trip SonarCloud typescript:S4036. - const gitBin = (process.env.PATH || '').split(delimiter) - .map(dir => join(dir, process.platform === 'win32' ? 'git.exe' : 'git')) - .find(existsSync) - if (!gitBin) { - throw new Error('git not found on PATH - required to fetch strr-base-web for this build context') + const res = await fetch('https://codeload.github.com/bcgov/STRR/tar.gz/refs/heads/main') + if (!res.ok) { + throw new Error(`Failed to fetch strr-base-web tarball: ${res.status} ${res.statusText}`) + } + const tar = gunzipSync(Buffer.from(await res.arrayBuffer())) + + // Minimal POSIX tar reader: just enough to pull out the strr-base-web/ + // subtree from a GitHub codeload archive (ustar headers + pax extended + // headers for long paths, which is what git archive/GitHub both produce). + let offset = 0 + let longPath = null + while (offset + 512 <= tar.length) { + const header = tar.subarray(offset, offset + 512) + if (header.every(byte => byte === 0)) { + break + } + const readField = (start, length) => header.subarray(start, start + length).toString('utf-8').replace(/\0.*$/s, '').trim() + const name = longPath ?? readField(0, 100) + const size = parseInt(readField(124, 12) || '0', 8) + const typeflag = String.fromCharCode(header[156]) + const contentStart = offset + 512 + const paddedSize = Math.ceil(size / 512) * 512 + longPath = null + + if (typeflag === 'x') { + // pax extended header: lines like " path=\n" + const pax = tar.subarray(contentStart, contentStart + size).toString('utf-8') + const match = pax.match(/\d+ path=([^\n]+)\n/) + if (match) { + longPath = match[1] + } + } else if ((typeflag === '0' || typeflag === '\0') && name.includes('/strr-base-web/')) { + const relativePath = name.slice(name.indexOf('/strr-base-web/') + '/strr-base-web/'.length) + if (relativePath) { + const destPath = join(baseWebDir, relativePath) + mkdirSync(dirname(destPath), { recursive: true }) + writeFileSync(destPath, tar.subarray(contentStart, contentStart + size)) + } + } + + offset = contentStart + paddedSize + } + + if (!existsSync(baseWebDir)) { + throw new Error('strr-base-web not found in the fetched bcgov/STRR tarball') } - const cloneDir = resolve(baseWebDir, '..', '.strr-clone') - execFileSync(gitBin, ['clone', '--depth', '1', 'https://github.com/bcgov/STRR.git', cloneDir], { stdio: 'inherit' }) - cpSync(resolve(cloneDir, 'strr-base-web'), baseWebDir, { recursive: true }) - rmSync(cloneDir, { recursive: true, force: true }) } diff --git a/strr-strata-web/ensure-strr-base-web.mjs b/strr-strata-web/ensure-strr-base-web.mjs index ceb04fd3c..de15618df 100644 --- a/strr-strata-web/ensure-strr-base-web.mjs +++ b/strr-strata-web/ensure-strr-base-web.mjs @@ -1,6 +1,6 @@ -import { existsSync, cpSync, rmSync } from 'node:fs' -import { execFileSync } from 'node:child_process' -import { delimiter, dirname, join, resolve } from 'node:path' +import { existsSync, mkdirSync, writeFileSync } from 'node:fs' +import { gunzipSync } from 'node:zlib' +import { dirname, join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' // strr-base-web is extended as a local sibling layer (not a published package) - @@ -10,7 +10,7 @@ import { fileURLToPath } from 'node:url' // invoked with, which frontend-cd.yaml scopes to just this app's // working_directory) - strr-base-web is never uploaded alongside it there, by // design. CI/local dev/the Cloud Build PR-preview channel all have the full -// repo checked out, so this is CD-pipeline-specific: clone strr-base-web fresh +// repo checked out, so this is CD-pipeline-specific: fetch strr-base-web fresh // from main when it's not there at all, matching what the old git-hosted // `extends` layer reference used to do at build time regardless of local // checkout contents. @@ -19,21 +19,61 @@ import { fileURLToPath } from 'node:url' // resolves dependencies, well before nuxt.config.ts is loaded via // `postinstall: nuxt prepare`) rather than inside nuxt.config.ts itself: jiti // (nuxt.config.ts's loader) resolves import()s ahead of that file's own -// runtime code executing, so a dynamic import there can't depend on a clone +// runtime code executing, so a dynamic import there can't depend on a fetch // step run earlier in the same file. +// +// Fetches and extracts GitHub's tarball using only Node builtins (fetch, +// zlib, fs) rather than shelling out to `git`/`tar`/`curl`: the actual build +// image this runs in (an Alpine-based firebase-repo image) doesn't have git +// installed at all, and a bare `execSync('git ...')`/('tar ...') call would +// also trip SonarCloud typescript:S4036 (PATH-dependent command resolution). const baseWebDir = resolve(dirname(fileURLToPath(import.meta.url)), '../strr-base-web') if (!existsSync(baseWebDir)) { - // Resolve git's absolute path ourselves (rather than letting execFileSync's - // OS-level PATH search find it) so this doesn't trip SonarCloud typescript:S4036. - const gitBin = (process.env.PATH || '').split(delimiter) - .map(dir => join(dir, process.platform === 'win32' ? 'git.exe' : 'git')) - .find(existsSync) - if (!gitBin) { - throw new Error('git not found on PATH - required to fetch strr-base-web for this build context') + const res = await fetch('https://codeload.github.com/bcgov/STRR/tar.gz/refs/heads/main') + if (!res.ok) { + throw new Error(`Failed to fetch strr-base-web tarball: ${res.status} ${res.statusText}`) + } + const tar = gunzipSync(Buffer.from(await res.arrayBuffer())) + + // Minimal POSIX tar reader: just enough to pull out the strr-base-web/ + // subtree from a GitHub codeload archive (ustar headers + pax extended + // headers for long paths, which is what git archive/GitHub both produce). + let offset = 0 + let longPath = null + while (offset + 512 <= tar.length) { + const header = tar.subarray(offset, offset + 512) + if (header.every(byte => byte === 0)) { + break + } + const readField = (start, length) => header.subarray(start, start + length).toString('utf-8').replace(/\0.*$/s, '').trim() + const name = longPath ?? readField(0, 100) + const size = parseInt(readField(124, 12) || '0', 8) + const typeflag = String.fromCharCode(header[156]) + const contentStart = offset + 512 + const paddedSize = Math.ceil(size / 512) * 512 + longPath = null + + if (typeflag === 'x') { + // pax extended header: lines like " path=\n" + const pax = tar.subarray(contentStart, contentStart + size).toString('utf-8') + const match = pax.match(/\d+ path=([^\n]+)\n/) + if (match) { + longPath = match[1] + } + } else if ((typeflag === '0' || typeflag === '\0') && name.includes('/strr-base-web/')) { + const relativePath = name.slice(name.indexOf('/strr-base-web/') + '/strr-base-web/'.length) + if (relativePath) { + const destPath = join(baseWebDir, relativePath) + mkdirSync(dirname(destPath), { recursive: true }) + writeFileSync(destPath, tar.subarray(contentStart, contentStart + size)) + } + } + + offset = contentStart + paddedSize + } + + if (!existsSync(baseWebDir)) { + throw new Error('strr-base-web not found in the fetched bcgov/STRR tarball') } - const cloneDir = resolve(baseWebDir, '..', '.strr-clone') - execFileSync(gitBin, ['clone', '--depth', '1', 'https://github.com/bcgov/STRR.git', cloneDir], { stdio: 'inherit' }) - cpSync(resolve(cloneDir, 'strr-base-web'), baseWebDir, { recursive: true }) - rmSync(cloneDir, { recursive: true, force: true }) }