diff --git a/README.md b/README.md index 2164241..365ed23 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,19 @@ Rules of thumb: - texts live in `locales/*.yml` and are used through `$t('key')`, never hardcoded. - add a shadcn-vue component with `npx shadcn-vue@latest add `. +### After touching the dependencies + +The image builds with the npm of `node:22-slim` (npm 10). npm 12 writes lockfiles +that omit `"optional": true` on the platform-specific packages (`@esbuild/*`, +`@rollup/rollup-*`); npm 10 then reads them as required and `npm ci` dies with +`EBADPLATFORM` on a package meant for another architecture — in the image only, +never locally. So regenerate the lockfile with the older resolver: + +```bash +npx npm@10 install --package-lock-only +npx npm@10 ci # reproduces exactly what the image does +``` + ## Deployment One image holds everything: the binary, the built frontend, the migrations and a diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8686c12..b961f89 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -583,11 +583,12 @@ "cpu": [ "ppc64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "aix" ], + "peer": true, "engines": { "node": ">=18" } @@ -599,11 +600,12 @@ "cpu": [ "arm" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -615,11 +617,12 @@ "cpu": [ "arm64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -631,11 +634,12 @@ "cpu": [ "x64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } @@ -647,11 +651,12 @@ "cpu": [ "arm64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } @@ -663,11 +668,12 @@ "cpu": [ "x64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } @@ -679,11 +685,12 @@ "cpu": [ "arm64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -695,11 +702,12 @@ "cpu": [ "x64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -711,11 +719,12 @@ "cpu": [ "arm" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -727,11 +736,12 @@ "cpu": [ "arm64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -743,11 +753,12 @@ "cpu": [ "ia32" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -759,11 +770,12 @@ "cpu": [ "loong64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -775,11 +787,12 @@ "cpu": [ "mips64el" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -791,11 +804,12 @@ "cpu": [ "ppc64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -807,11 +821,12 @@ "cpu": [ "riscv64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -823,11 +838,12 @@ "cpu": [ "s390x" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -839,11 +855,12 @@ "cpu": [ "x64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } @@ -855,11 +872,12 @@ "cpu": [ "arm64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -871,11 +889,12 @@ "cpu": [ "x64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -887,11 +906,12 @@ "cpu": [ "arm64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -903,11 +923,12 @@ "cpu": [ "x64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } @@ -919,11 +940,12 @@ "cpu": [ "arm64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "openharmony" ], + "peer": true, "engines": { "node": ">=18" } @@ -935,11 +957,12 @@ "cpu": [ "x64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=18" } @@ -951,11 +974,12 @@ "cpu": [ "arm64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -967,11 +991,12 @@ "cpu": [ "ia32" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -983,11 +1008,12 @@ "cpu": [ "x64" ], - "extraneous": true, "license": "MIT", + "optional": true, "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -2265,9 +2291,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2284,9 +2307,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2303,9 +2323,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2322,9 +2339,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2341,9 +2355,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2360,9 +2371,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2622,9 +2630,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2641,9 +2646,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2660,9 +2662,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2679,9 +2678,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2720,6 +2716,66 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", @@ -3730,9 +3786,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.6.tgz", - "integrity": "sha512-69D/imtToCsIcAl8WBS2YaRwA4jO/j0HhU+hELqMEu9f54MoUtI6+XH5mrKU8rEFNEk/Ui1I2MK4/JkWacclGw==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.7.tgz", + "integrity": "sha512-APw5YuIQAg6L9w4sHDI6j26DGFJI6RpYOhnkMPdC9lWbkKvsyPHzDsve1yd73lk21yz7Y09Kci8B2Pp9FonzWA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4081,9 +4137,10 @@ "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "extraneous": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -5113,9 +5170,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5136,9 +5190,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5159,9 +5210,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5182,9 +5230,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [