diff --git a/Dockerfile b/Dockerfile index 46ee602..b57120e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,11 +16,14 @@ COPY . . # that directory in a BuildKit cache avoids downloading ~300 MB after every # source-only redeploy, while Vite still copies the assets into dist/imgly. RUN --mount=type=cache,id=plimi-imgly-assets,target=/app/public/imgly,sharing=locked \ - pnpm build + pnpm build && mv /app/dist/imgly /app/imgly-dist FROM nginx:1.27-alpine AS runtime COPY nginx.conf /etc/nginx/conf.d/default.conf COPY docker/40-generate-runtime-config.sh /docker-entrypoint.d/40-generate-runtime-config.sh +# Keep the large, versioned model files in a stable layer. App-only changes can +# then reuse this layer instead of exporting the full model bundle each time. +COPY --from=build /app/imgly-dist /usr/share/nginx/html/imgly COPY --from=build /app/dist /usr/share/nginx/html RUN chmod +x /docker-entrypoint.d/40-generate-runtime-config.sh EXPOSE 80 diff --git a/package.json b/package.json index efe03fc..8c28b69 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "predev": "node scripts/fetch-imgly-assets.mjs", "dev": "vite --host", "prebuild": "node scripts/fetch-imgly-assets.mjs", - "build": "tsc -b && vite build", + "build": "node scripts/build.mjs", "preview": "vite preview", "test": "vitest", "test:e2e": "playwright test", @@ -46,4 +46,4 @@ "vite": "^8.0.12", "vitest": "^4.1.6" } -} \ No newline at end of file +} diff --git a/scripts/build.mjs b/scripts/build.mjs new file mode 100644 index 0000000..56a154e --- /dev/null +++ b/scripts/build.mjs @@ -0,0 +1,32 @@ +import { spawn } from "node:child_process"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); + +function run(script, args) { + const child = spawn(process.execPath, [path.join(root, script), ...args], { + cwd: root, + stdio: "inherit", + }); + + return new Promise((resolve, reject) => { + child.once("error", reject); + child.once("exit", (code, signal) => { + if (signal) { + reject(new Error(`${script} terminated by ${signal}`)); + return; + } + resolve(code ?? 1); + }); + }); +} + +const [typecheckStatus, viteStatus] = await Promise.all([ + run("node_modules/typescript/bin/tsc", ["-b"]), + run("node_modules/vite/bin/vite.js", ["build"]), +]); + +if (typecheckStatus !== 0 || viteStatus !== 0) { + process.exitCode = 1; +}