From d68531b783f5736b0b1a81453353756afc998870 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 22 Sep 2026 10:22:31 +0200 Subject: [PATCH] :arrow_up: Update devenv dependencies (#11790) * :arrow_up: Update devenv dependencies Update Node.js, OpenCode, clj-kondo, Babashka, Pixi, GitHub CLI, uv, and Serena to their current stable releases. AI-assisted-by: gpt-5.6-sol * :arrow_up: Update devenv to Java 27 Use Zulu JDK 27 in the development image for compatibility testing. Update the official checksums for both supported architectures. AI-assisted-by: gpt-5.6-sol * :whale: Replace MinIO with RustFS in devenv Run RustFS as the development S3 service and wait for its health check. Install a pinned AWS CLI with checksums and use it to create the bucket idempotently from each backend entry point. Keep the old MinIO volume untouched and use a new RustFS volume. AI-assisted-by: gpt-5.6-sol * :whale: Replace MailCatcher with persistent Mailpit Run Mailpit as the devenv SMTP sink while preserving mailer:1025 and the localhost:1080 UI. Store its SQLite inbox in a named volume and wait for the readiness endpoint before starting runtime containers. Bind the web UI to loopback so development emails stay local. AI-assisted-by: gpt-5.6-sol * :arrow_up: Update Node.js to 24.21.0 Align the host NVM version with the Node.js version used by devenv. AI-assisted-by: gpt-5.6-sol * :arrow_up: Update devenv to PostgreSQL 18.6 Run PostgreSQL 18 with its versioned volume layout and a TCP readiness check that ignores the temporary initialization server. Install the matching client, create penpot_nexus, and preserve the old PostgreSQL 16 volume for rollback or logical migration. AI-assisted-by: gpt-5.6-sol * :whale: Expose RustFS ports in devenv Publish the RustFS S3 API and management console on localhost port 9000 and 9001. Keep both bindings on loopback so object storage is not exposed to the local network. AI-assisted-by: gpt-5.6-sol * :whale: Install standalone pnpm in devenv Install pnpm 12.5.0 from architecture-specific release archives and verify their published checksums. Remove the Corepack setup while allowing pnpm to honor the project packageManager pins. AI-assisted-by: gpt-5.6-sol * :fire: Remove corepack, use system pnpm everywhere Corepack is gone from Node 25+, so every `corepack enable` call fails. pnpm now ships as a system binary (devenv, CI runners and Docker images install it directly) and auto-downloads the version pinned in `packageManager` on mismatch. Scripts, workflows and Dockerfiles call `pnpm` straight away; the three deploy workflows use a single `pnpm/setup@v2` step; and the new `scripts/sync-pnpm-version` stamps all 35 `packageManager` fields from the system pnpm, replacing the `corepack use` sweep. AI-assisted-by: muse-spark-1.3-contributor * :bug: Fix exporter watch missing render-wasm build step The exporter watch compiled CLJS requiring the generated src/app/wasm/shared.js, which only render-wasm/build export produces. Without it shadow-cljs failed with a cryptic missing ./shared.js dependency. Run build:wasm before watching, as the frontend watch:app and exporter scripts/build already do. AI-assisted-by: muse-spark-1.3-contributor * :wrench: Add opencode V2 support and adapt plugins Register the penpot tools for both opencode V1 (server()) and V2 (setup() with JSON Schema inputs) from a single dependency-free plugin file, sharing the psql and paren-repair runners between both paths. Install the opencode2 binary side-by-side with V1 in the devenv image and document the dual registration in the paren-repair and psql memories. AI-assisted-by: muse-spark-1.3-contributor * :arrow_up: Update pnpm and opencode --- .github/workflows/plugins-deploy-api-doc.yml | 15 +- .github/workflows/plugins-deploy-package.yml | 15 +- .../workflows/plugins-deploy-styles-doc.yml | 15 +- .github/workflows/tests-common.yml | 2 - .github/workflows/tests-composable-suite.yml | 2 - .github/workflows/tests-exporter.yml | 2 - .github/workflows/tests-frontend.yml | 2 - .github/workflows/tests-integration.yml | 4 - .github/workflows/tests-library.yml | 2 - .github/workflows/tests-plugin-api-suite.yml | 4 - .github/workflows/tests-plugins.yml | 2 - .nvmrc | 2 +- .opencode/plugins/penpot.js | 421 ++++++++---------- .../auth-permissions-product-domains.md | 4 +- .serena/memories/critical-info.md | 4 +- .serena/memories/devenv/core.md | 14 +- .serena/memories/prod-infra/core.md | 2 +- .serena/memories/scripts/paren-repair.md | 7 +- .serena/memories/scripts/psql.md | 4 +- .serena/memories/workflow/updating-pnpm.md | 61 ++- backend/package.json | 2 +- backend/pnpm-lock.yaml | 131 ++++-- backend/scripts/_env | 28 +- backend/scripts/repl | 4 +- backend/scripts/run | 3 + backend/scripts/start-dev | 4 +- common/package.json | 2 +- common/pnpm-lock.yaml | 131 ++++-- common/scripts/test | 2 - docker/devenv/Dockerfile | 91 +++- docker/devenv/defaults.env | 15 +- docker/devenv/docker-compose.infra.yml | 81 ++-- docker/devenv/docker-compose.main.yml | 2 + docker/devenv/files/postgresql_init.sql | 2 +- docker/images/Dockerfile.exporter | 32 +- docker/images/Dockerfile.mcp | 30 ++ docker/images/Dockerfile.media-processor | 13 +- docs/README.md | 1 - docs/package.json | 2 +- docs/pnpm-lock.yaml | 131 ++++-- docs/scripts/build | 3 - docs/technical-guide/developer/devenv.md | 46 +- docs/technical-guide/developer/frontend.md | 2 +- exporter/package.json | 5 +- exporter/pnpm-lock.yaml | 131 ++++-- exporter/scripts/build | 5 +- exporter/scripts/setup | 2 - exporter/scripts/test | 2 - frontend/package.json | 2 +- frontend/packages/draft-js/package.json | 2 +- frontend/packages/mousetrap/package.json | 2 +- frontend/packages/tokenscript/package.json | 2 +- frontend/packages/ui/package.json | 2 +- frontend/pnpm-lock.yaml | 131 ++++-- frontend/scripts/build | 3 - frontend/scripts/build-storybook | 2 - frontend/scripts/setup | 2 - frontend/scripts/test | 2 - frontend/scripts/watch | 2 - frontend/text-editor/package.json | 2 +- library/package.json | 2 +- library/pnpm-lock.yaml | 131 ++++-- library/scripts/test | 2 - manage.sh | 17 +- mcp/README.md | 2 +- mcp/package.json | 2 +- mcp/packages/common/package.json | 2 +- mcp/packages/plugin/package.json | 2 +- mcp/packages/server/package.json | 2 +- mcp/pnpm-lock.yaml | 131 ++++-- mcp/scripts/build | 6 +- mcp/scripts/setup | 2 - media-processor/package.json | 2 +- media-processor/pnpm-lock.yaml | 131 ++++-- media-processor/scripts/setup | 2 - package.json | 2 +- .../apps/colors-to-tokens-plugin/package.json | 2 +- .../apps/composable-test-suite/package.json | 2 +- plugins/apps/contrast-plugin/package.json | 2 +- .../apps/create-palette-plugin/package.json | 2 +- plugins/apps/e2e/package.json | 2 +- plugins/apps/example-styles/package.json | 2 +- plugins/apps/icons-plugin/package.json | 2 +- plugins/apps/lorem-ipsum-plugin/package.json | 2 +- .../apps/plugin-api-test-suite/package.json | 2 +- plugins/apps/poc-state-plugin/package.json | 2 +- plugins/apps/poc-tokens-plugin/package.json | 2 +- .../apps/rename-layers-plugin/package.json | 2 +- plugins/apps/table-plugin/package.json | 2 +- plugins/libs/plugin-types/package.json | 2 +- plugins/libs/plugins-runtime/package.json | 2 +- plugins/libs/plugins-styles/package.json | 2 +- plugins/package.json | 2 +- plugins/pnpm-lock.yaml | 131 ++++-- pnpm-lock.yaml | 131 ++++-- render-wasm/_build_env | 2 - render-wasm/package.json | 2 +- render-wasm/pnpm-lock.yaml | 131 ++++-- scripts/sync-pnpm-version | 185 ++++++++ scripts/test_sync_pnpm_version.py | 152 +++++++ 100 files changed, 1935 insertions(+), 912 deletions(-) create mode 100755 scripts/sync-pnpm-version create mode 100644 scripts/test_sync_pnpm_version.py diff --git a/.github/workflows/plugins-deploy-api-doc.yml b/.github/workflows/plugins-deploy-api-doc.yml index 7208646c1a..4657740a58 100644 --- a/.github/workflows/plugins-deploy-api-doc.yml +++ b/.github/workflows/plugins-deploy-api-doc.yml @@ -43,17 +43,12 @@ jobs: ref: ${{ steps.vars.outputs.gh_ref }} # START: Setup Node and PNPM enabling cache - - name: Setup Node.js - uses: actions/setup-node@v6 + - name: Setup pnpm + Node.js + uses: pnpm/setup@v2 with: - node-version-file: .nvmrc - - - name: Enable PNPM - working-directory: ./plugins - shell: bash - run: | - corepack enable; - corepack install; + working-directory: plugins + runtime: node@24.21.0 + install: false - name: Get pnpm store path id: pnpm-store diff --git a/.github/workflows/plugins-deploy-package.yml b/.github/workflows/plugins-deploy-package.yml index 2666957893..cb6cbc704c 100644 --- a/.github/workflows/plugins-deploy-package.yml +++ b/.github/workflows/plugins-deploy-package.yml @@ -43,17 +43,12 @@ jobs: ref: ${{ inputs.gh_ref }} # START: Setup Node and PNPM enabling cache - - name: Setup Node.js - uses: actions/setup-node@v6 + - name: Setup pnpm + Node.js + uses: pnpm/setup@v2 with: - node-version-file: .nvmrc - - - name: Enable PNPM - working-directory: ./plugins - shell: bash - run: | - corepack enable; - corepack install; + working-directory: plugins + runtime: node@24.21.0 + install: false - name: Get pnpm store path id: pnpm-store diff --git a/.github/workflows/plugins-deploy-styles-doc.yml b/.github/workflows/plugins-deploy-styles-doc.yml index 29d2ac4fea..53a379b854 100644 --- a/.github/workflows/plugins-deploy-styles-doc.yml +++ b/.github/workflows/plugins-deploy-styles-doc.yml @@ -41,17 +41,12 @@ jobs: ref: ${{ steps.vars.outputs.gh_ref }} # START: Setup Node and PNPM enabling cache - - name: Setup Node.js - uses: actions/setup-node@v6 + - name: Setup pnpm + Node.js + uses: pnpm/setup@v2 with: - node-version-file: .nvmrc - - - name: Enable PNPM - working-directory: ./plugins - shell: bash - run: | - corepack enable; - corepack install; + working-directory: plugins + runtime: node@24.21.0 + install: false - name: Get pnpm store path id: pnpm-store diff --git a/.github/workflows/tests-common.yml b/.github/workflows/tests-common.yml index 3164fe5089..e513efc54f 100644 --- a/.github/workflows/tests-common.yml +++ b/.github/workflows/tests-common.yml @@ -44,8 +44,6 @@ jobs: - name: Lint working-directory: ./common run: | - corepack enable; - corepack install; pnpm install; pnpm run check-fmt:clj pnpm run check-fmt:js diff --git a/.github/workflows/tests-composable-suite.yml b/.github/workflows/tests-composable-suite.yml index 3b1d68be21..2ebea5ab59 100644 --- a/.github/workflows/tests-composable-suite.yml +++ b/.github/workflows/tests-composable-suite.yml @@ -56,8 +56,6 @@ jobs: - name: Install deps working-directory: ./plugins run: | - corepack enable; - corepack install; pnpm install; - name: Install Playwright Chromium diff --git a/.github/workflows/tests-exporter.yml b/.github/workflows/tests-exporter.yml index ed5c17883a..0c8317499c 100644 --- a/.github/workflows/tests-exporter.yml +++ b/.github/workflows/tests-exporter.yml @@ -46,8 +46,6 @@ jobs: - name: Lint working-directory: ./exporter run: | - corepack enable; - corepack install; pnpm install; pnpm run check-fmt:clj pnpm run lint:clj diff --git a/.github/workflows/tests-frontend.yml b/.github/workflows/tests-frontend.yml index 58ba335e38..f08f34054d 100644 --- a/.github/workflows/tests-frontend.yml +++ b/.github/workflows/tests-frontend.yml @@ -48,8 +48,6 @@ jobs: - name: Lint working-directory: ./frontend run: | - corepack enable; - corepack install; pnpm install; pnpm run check-fmt:js pnpm run check-fmt:clj diff --git a/.github/workflows/tests-integration.yml b/.github/workflows/tests-integration.yml index 5c2a4bcc98..59aa8182f4 100644 --- a/.github/workflows/tests-integration.yml +++ b/.github/workflows/tests-integration.yml @@ -135,8 +135,6 @@ jobs: - name: Install deps working-directory: ./frontend run: | - corepack enable; - corepack install; pnpm install --frozen-lockfile; # No-op once the shared volume is warm; keeps the first run working. @@ -200,8 +198,6 @@ jobs: - name: Install deps working-directory: ./frontend run: | - corepack enable; - corepack install; pnpm install --frozen-lockfile; - name: Download blob reports diff --git a/.github/workflows/tests-library.yml b/.github/workflows/tests-library.yml index a5b565a892..84ab5c9dc9 100644 --- a/.github/workflows/tests-library.yml +++ b/.github/workflows/tests-library.yml @@ -46,8 +46,6 @@ jobs: - name: Lint working-directory: ./library run: | - corepack enable; - corepack install; pnpm install; pnpm run check-fmt pnpm run lint diff --git a/.github/workflows/tests-plugin-api-suite.yml b/.github/workflows/tests-plugin-api-suite.yml index de6e2080bb..0bc070ae30 100644 --- a/.github/workflows/tests-plugin-api-suite.yml +++ b/.github/workflows/tests-plugin-api-suite.yml @@ -71,8 +71,6 @@ jobs: - name: Install deps working-directory: ./plugins run: | - corepack enable; - corepack install; pnpm install; - name: Install Playwright Chromium @@ -115,8 +113,6 @@ jobs: # - name: Install deps # working-directory: ./plugins # run: | - # corepack enable; - # corepack install; # pnpm install; # # - name: Install Playwright Chromium diff --git a/.github/workflows/tests-plugins.yml b/.github/workflows/tests-plugins.yml index b1bbdd0992..9f6c461da2 100644 --- a/.github/workflows/tests-plugins.yml +++ b/.github/workflows/tests-plugins.yml @@ -44,8 +44,6 @@ jobs: working-directory: ./plugins shell: bash run: | - corepack enable; - corepack install; pnpm install -r; - name: Run Lint diff --git a/.nvmrc b/.nvmrc index 3648bfc346..166aae1151 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v24.19.0 +v24.21.0 diff --git a/.opencode/plugins/penpot.js b/.opencode/plugins/penpot.js index 5f0fbba554..c231907396 100644 --- a/.opencode/plugins/penpot.js +++ b/.opencode/plugins/penpot.js @@ -1,7 +1,113 @@ +// Penpot opencode plugin: custom tools for Penpot development. +// +// Dual V1 + V2 implementation from a single file: +// - OpenCode V1 (>= 1.18.29) calls the default export's `server()` and uses +// the returned `tool` map (built with the `tool()` helper from +// `@opencode-ai/plugin`). +// - OpenCode V2 reads the default export's `id` and `setup()` and ignores +// `server()`. Tools are registered via `ctx.tool.transform()` with JSON +// Schema inputs, and `execute` returns `{ content }`. +// See https://opencode.ai/v2/docs/build/plugins/migrate-v1 +// +// NOTE: the V2 side intentionally does NOT +// `import { Plugin } from "@opencode/plugin"`. At runtime `Plugin.define` is +// the identity function, so a plain `{ id, setup }` object is equivalent, and +// skipping the import keeps this plugin dependency-free +// (`.opencode/package.json` is gitignored, so a new dependency declared there +// would not travel with this file). + import { tool } from "@opencode-ai/plugin" import path from "path" import { spawn } from "child_process" +function runCommand(command, args, options = {}) { + const { + cwd, + env, + stdin, + closeStdin = false, + successMessage = "Command executed successfully", + } = options + + return new Promise((resolve) => { + let stdout = "" + let stderr = "" + + const proc = spawn(command, args, { cwd, env }) + + proc.stdout.on("data", (data) => { + stdout += data.toString() + }) + + proc.stderr.on("data", (data) => { + stderr += data.toString() + }) + + proc.on("error", (error) => { + resolve(`Error: ${error.message}`) + }) + + proc.on("close", (exitCode) => { + const output = + exitCode === 0 + ? stdout.trim() || successMessage + : `Error (exit ${exitCode}): ${ + (stderr || stdout).trim() || "No error output" + }` + resolve(output) + }) + + // Close stdin so the child cannot wait on it indefinitely. `psql -c` + // never reads stdin, so only the paren-repair pipe mode needs this, but + // closing it unconditionally is harmless there. + if (stdin !== undefined) { + proc.stdin.end(stdin) + } else if (closeStdin) { + proc.stdin.end() + } + }) +} + +function executePsql(sql, useTestDb, cwd) { + const host = process.env.PENPOT_DB_HOST || "postgres" + const user = process.env.PENPOT_DB_USER || "penpot" + const db = useTestDb + ? "penpot_test" + : process.env.PENPOT_DB_NAME || "penpot" + const password = process.env.PENPOT_DB_PASSWORD || "penpot" + + const psqlArgs = ["-h", host, "-U", user, "-d", db, "-c", sql] + + return runCommand("psql", psqlArgs, { + cwd, + env: { ...process.env, PGPASSWORD: password }, + successMessage: "Query executed successfully", + }) +} + +function executeParenRepair({ files, code }, directory) { + const script = path.join(directory, "scripts/paren-repair") + + const fileList = files + ? files + .split(",") + .map((file) => file.trim()) + .filter(Boolean) + : [] + + const childArgs = + fileList.length > 0 ? [script, ...fileList] : [script] + + return runCommand("bb", childArgs, { + cwd: directory, + stdin: code, + closeStdin: true, + successMessage: "No changes needed", + }) +} + +// --- V1 tool definitions (OpenCode V1 calls `server()` below) --- + const penpotPsqlTool = tool({ description: "Execute a SQL command against the Penpot database. Uses the defaults from scripts/psql.", @@ -18,46 +124,7 @@ const penpotPsqlTool = tool({ }, async execute(args, context) { - const host = process.env.PENPOT_DB_HOST || "postgres" - const user = process.env.PENPOT_DB_USER || "penpot" - const db = args.test - ? "penpot_test" - : process.env.PENPOT_DB_NAME || "penpot" - const password = process.env.PENPOT_DB_PASSWORD || "penpot" - - const psqlArgs = ["-h", host, "-U", user, "-d", db, "-c", args.sql] - - return new Promise((resolve) => { - let stdout = "" - let stderr = "" - - const proc = spawn("psql", psqlArgs, { - cwd: context.worktree, - env: { ...process.env, PGPASSWORD: password }, - }) - - proc.stdout.on("data", (data) => { - stdout += data.toString() - }) - - proc.stderr.on("data", (data) => { - stderr += data.toString() - }) - - proc.on("error", (error) => { - resolve(`Error: ${error.message}`) - }) - - proc.on("close", (exitCode) => { - const output = - exitCode === 0 - ? stdout.trim() || "Query executed successfully" - : `Error (exit ${exitCode}): ${ - (stderr || stdout).trim() || "No error output" - }` - resolve(output) - }) - }) + return executePsql(args.sql, args.test === true, context.worktree) }, }) @@ -82,69 +149,11 @@ const parenRepairTool = tool({ }, async execute(args, context) { - const script = path.join(context.worktree, "scripts/paren-repair") - - const files = args.files - ? args.files - .split(",") - .map((file) => file.trim()) - .filter(Boolean) - : [] - - const paramInfo = - files.length > 0 - ? `files=[${files.join(", ")}]` - : args.code !== undefined - ? `code=(${args.code.length} chars)` - : "none" - - return new Promise((resolve) => { - const childArgs = - files.length > 0 - ? [script, ...files] - : [script] - - const proc = spawn("bb", childArgs, { - cwd: context.worktree, - }) - - let stdout = "" - let stderr = "" - - proc.stdout.on("data", (data) => { - stdout += data.toString() - }) - - proc.stderr.on("data", (data) => { - stderr += data.toString() - }) - - proc.on("error", (error) => { - resolve(`Error: ${error.message}`) - }) - - proc.on("close", (exitCode) => { - const output = - exitCode === 0 - ? stdout.trim() || "No changes needed" - : `Error (exit ${exitCode}): ${ - (stderr || stdout).trim() || "No error output" - }` - - resolve(output) - }) - - // Close stdin in all cases so the process cannot wait indefinitely. - if (args.code !== undefined) { - proc.stdin.end(args.code) - } else { - proc.stdin.end() - } - }) + return executeParenRepair(args, context.worktree) }, }) -export default async function plugin() { +async function server() { return { tool: { "paren-repair": parenRepairTool, @@ -153,147 +162,83 @@ export default async function plugin() { } } +// --- V2 setup (OpenCode V2 calls `setup()` and ignores `server()`) --- +const penpotPsqlInputSchema = { + type: "object", + properties: { + sql: { + type: "string", + description: "SQL command to execute", + }, + test: { + type: "boolean", + description: "Use the penpot_test database", + }, + }, + required: ["sql"], + additionalProperties: false, +} +const parenRepairInputSchema = { + type: "object", + properties: { + // A string is used instead of an array so OpenCode displays it + // in the generic tool invocation. + files: { + type: "string", + description: + "Comma-separated file paths to fix, for example: frontend/src/app/config.cljs, backend/src/core.clj", + }, + code: { + type: "string", + description: "Code string to fix via stdin", + }, + }, + additionalProperties: false, +} +async function setup(ctx) { + // Plugin instance location. This is not the location of every session the + // tools may run for, but it is the closest V2 equivalent of the V1 + // per-execution `context.worktree` (the repo checkout the plugin loaded + // from), which is what both tools need as cwd / script base. + const directory = + ctx.location.directory ?? ctx.location.project?.canonical + // Keep this callback synchronous: transforms are replayable state edits. + // The async work happens later, inside each tool's `execute`. + await ctx.tool.transform((editor) => { + editor.add({ + name: "penpot-psql", + description: + "Execute a SQL command against the Penpot database. Uses the defaults from scripts/psql.", + input: penpotPsqlInputSchema, + async execute(input) { + const content = await executePsql( + input.sql, + input.test === true, + directory, + ) + return { content } + }, + }) + editor.add({ + name: "paren-repair", + description: + "Fix mismatched parentheses/braces in Clojure files (.clj, .cljs, .cljc) then reformat with cljfmt.", + input: parenRepairInputSchema, + async execute(input) { + const content = await executeParenRepair(input, directory) + return { content } + }, + }) + }) +} - - - - -// import { tool } from "@opencode-ai/plugin" -// import path from "path" -// import { spawn } from "child_process" - -// function formatFiles(files) { -// if (files.length === 0) return "stdin" - -// // Keep the visible tool title reasonably short. -// if (files.length <= 3) return files.join(", ") - -// return `${files.slice(0, 3).join(", ")} (+${files.length - 3} more)` -// } - -// const parenRepairTool = tool({ -// description: -// "Fix mismatched parentheses/braces in Clojure files, then reformat with cljfmt.", - -// args: { -// files: tool.schema -// .array(tool.schema.string()) -// .describe("Array of file paths to fix") -// .optional(), - -// code: tool.schema -// .string() -// .describe("Code string to fix via stdin") -// .optional(), -// }, - -// async execute(args, context) { -// const script = path.join(context.worktree, "scripts/paren-repair") - -// const files = (args.files ?? []).map((file) => { -// const absolute = path.isAbsolute(file) -// ? file -// : path.resolve(context.worktree, file) - -// return path.relative(context.worktree, absolute) -// }) - -// const targetSummary = -// files.length > 0 -// ? formatFiles(files) -// : args.code !== undefined -// ? `stdin (${args.code.length} chars)` -// : "no input" - -// // This updates the tool-call title immediately, while it is running. -// await context.metadata({ -// title: `Paren repair: ${targetSummary}`, -// metadata: { -// files, -// codeChars: args.code?.length, -// }, -// }) - -// const childArgs = -// args.files && args.files.length > 0 -// ? [script, ...args.files] -// : [script] - -// return new Promise((resolve) => { -// const proc = spawn("bb", childArgs, { -// cwd: context.worktree, -// }) - -// let stdout = "" -// let stderr = "" - -// if (args.code !== undefined) { -// proc.stdin.end(args.code) -// } - -// proc.stdout.on("data", (data) => { -// stdout += data.toString() -// }) - -// proc.stderr.on("data", (data) => { -// stderr += data.toString() -// }) - -// proc.on("close", (exitCode) => { -// const successful = exitCode === 0 - -// const commandOutput = successful -// ? stdout.trim() || "No changes needed" -// : `Error (exit ${exitCode}): ${(stderr || stdout).trim()}` - -// const parameterOutput = -// files.length > 0 -// ? `Files passed:\n${files.map((file) => `- ${file}`).join("\n")}` -// : args.code !== undefined -// ? `Input passed through stdin: ${args.code.length} characters` -// : "No files or stdin input were passed" - -// resolve({ -// title: `Paren repair: ${targetSummary}`, -// output: `${parameterOutput}\n\n${commandOutput}`, -// metadata: { -// files, -// codeChars: args.code?.length, -// exitCode, -// successful, -// }, -// }) -// }) - -// proc.on("error", (error) => { -// resolve({ -// title: `Paren repair failed: ${targetSummary}`, -// output: [ -// files.length > 0 -// ? `Files passed:\n${files.map((file) => `- ${file}`).join("\n")}` -// : `Input: ${targetSummary}`, -// `Failed to start bb: ${error.message}`, -// ].join("\n\n"), -// metadata: { -// files, -// codeChars: args.code?.length, -// successful: false, -// }, -// }) -// }) -// }) -// }, -// }) - -// export default async function plugin() { -// return { -// tool: { -// "paren-repair": parenRepairTool, -// }, -// } -// } +export default { + id: "penpot", + setup, + server, +} diff --git a/.serena/memories/backend/auth-permissions-product-domains.md b/.serena/memories/backend/auth-permissions-product-domains.md index dbce17a440..c3057118d5 100644 --- a/.serena/memories/backend/auth-permissions-product-domains.md +++ b/.serena/memories/backend/auth-permissions-product-domains.md @@ -23,7 +23,7 @@ - Team/project commands mix DB changes, email, message bus notifications, media/storage cleanup, feature flags, quotas, and audit metadata. Keep mutations transactional when the existing command does so. - Invitation flows validate muted/bounced emails before sending and use tokenized invitation state. Accepting an invitation is tied to the invited member identity, not just possession of a token. - Logical deletion is used for many product objects; prefer existing logical-deletion helpers over hard deletes unless the command already performs permanent cleanup. -- Bounced/spam-complaint emails can mute/block a profile for login/registration and email sending. Devenv MailCatcher is the normal local path for registration/email-flow testing. +- Bounced/spam-complaint emails can mute/block a profile for login/registration and email sending. Devenv Mailpit is the normal local path for registration/email-flow testing. ## Comments, webhooks, and audit @@ -37,4 +37,4 @@ - Enable LDAP login locally with frontend flag `enable-login-with-ldap`; the devenv includes a configured test LDAP service. - OIDC testing requires external provider app credentials plus matching backend/frontend config. - Backend domain tests usually live under `backend/test/backend_tests/rpc/commands/*_test.clj` or nearby backend test namespaces. Use focused `clojure -M:dev:test --focus ...` from `backend/` when possible. -- For auth/session or HTTP behavior, combine backend tests with the HTTP/session notes in `mem:backend/http-storage-filedata-subtleties` because RPC-level tests may not exercise cookie/header transforms. \ No newline at end of file +- For auth/session or HTTP behavior, combine backend tests with the HTTP/session notes in `mem:backend/http-storage-filedata-subtleties` because RPC-level tests may not exercise cookie/header transforms. diff --git a/.serena/memories/critical-info.md b/.serena/memories/critical-info.md index 892e5687f2..ce87caee30 100644 --- a/.serena/memories/critical-info.md +++ b/.serena/memories/critical-info.md @@ -18,7 +18,7 @@ You are working on the GitHub project `penpot/penpot`, a monorepo. - Before `gh issue create` → `mem:workflow/creating-issues` (title derivation, body template, labels, Issue Type) - Before `gh pr create` / `gh pr edit` → `mem:workflow/creating-prs` (title format, body structure, "Note:" line) - Before a repo-wide pnpm version update → `mem:workflow/updating-pnpm` (workspace - layout, `corepack use` sweep order, the stamp-missing-field and + layout, `scripts/sync-pnpm-version` flow, the stamp-missing-field and ignored-builds gotchas, verification steps) - **Never `git push`, force-push, or modify `git origin`** (or any other remote). The user pushes from their own shell; if a push is required, say so and wait. Never amend a commit that the user has already pushed unless explicitly asked. - **Never edit `CHANGES.md` by hand.** The changelog is generated from GitHub milestones during the release process; update it only via the `update-changelog` skill flow or on explicit user request. @@ -55,7 +55,7 @@ module. You can read it from `mem:/core` - `docker/` contains devenv related code, not needed unless specifically instructed. When working on devenv startup, compose layout, instance config (`defaults.env`), - tmux session lifecycle, MinIO provisioning, or anything in `manage.sh`'s + tmux session lifecycle, RustFS provisioning, or anything in `manage.sh`'s `*-devenv` commands, read `mem:devenv/core`. - `experiments/` contains standalone experimental HTML/JS/scripts; treat it as non-core unless the user explicitly asks about it. - `sample_media/` contains sample image/icon media and config used as fixtures/demo material; do not infer app behavior from it. diff --git a/.serena/memories/devenv/core.md b/.serena/memories/devenv/core.md index db46542c99..ddc83b1845 100644 --- a/.serena/memories/devenv/core.md +++ b/.serena/memories/devenv/core.md @@ -1,10 +1,10 @@ # Devenv startup and configuration -Compose-based dev environment under `docker/devenv/`, driven by `manage.sh`. Parallel instances share infra + Postgres + MinIO; each instance has its own `main` container, Valkey, source checkout, tmux session. +Compose-based dev environment under `docker/devenv/`, driven by `manage.sh`. Parallel instances share infra + Postgres + RustFS; each instance has its own `main` container, Valkey, source checkout, tmux session. ## Compose project layout -- `penpotdev-infra`: shared `postgres`, `minio`, `minio-setup`, `mailer`, `ldap`. File: `docker-compose.infra.yml`. +- `penpotdev-infra`: shared `postgres`, `rustfs`, `valkey`, `mailer`, `ldap`. File: `docker-compose.infra.yml`. - `penpotdev-wsN` (N=0,1,…): per-instance `main` + `redis` (Valkey). File: `docker-compose.main.yml`. ws0 (a.k.a. `main`) binds `$PWD`; ws1+ bind clones at `${PENPOT_WORKSPACES_DIR}/wsN/` (default `~/.penpot/penpot_workspaces/`), maintained by the developer. - Optional overlay `docker-compose.opencode.yml`: added by `instance-compose` as an extra `-f` only when `PENPOT_OPENCODE_CONFIG_DIR` is set (i.e. `run-devenv --opencode-config-dir DIR` ran in this process). Bind-mounts the host dir at `/home/penpot/.config/opencode` (`:z`). Flag-only, per-call; not read from ambient env. Parser `parse-opencode-config-dir` absolutizes (`~`, realpath) because compose resolves relative bind sources against the compose file's dir. Only instances brought up with the flag get the mount. - All projects join external network `penpot_shared`. Created idempotently by `ensure-devenv-network`, never removed by lifecycle commands. @@ -13,22 +13,22 @@ Compose-based dev environment under `docker/devenv/`, driven by `manage.sh`. Par - `docker/devenv/defaults.env`: ws0 baseline — container/volume names, runtime env, published host ports, tmux defaults. `manage.sh` aborts if unreadable. - For ws1+, `instance-env-overrides` computes the per-instance overrides (container/volume names, host ports offset `10000·N`, `PENPOT_PUBLIC_URI`, `PENPOT_REDIS_URI`, `PENPOT_BACKEND_WORKER=false`) and `instance-compose` injects them as env vars at compose time — never written to disk, recomputed each call so they can't drift. ws0 uses `defaults.env` as-is. -- `backend/scripts/_env`: backend-internal only — secret keys, `PENPOT_FLAGS` (with `enable-backend-worker` gated on `PENPOT_BACKEND_WORKER`), `JAVA_OPTS`, `setup_minio()`. Never duplicates `defaults.env`. +- `backend/scripts/_env`: backend-internal only — secret keys, `PENPOT_FLAGS` (with `enable-backend-worker` gated on `PENPOT_BACKEND_WORKER`), `JAVA_OPTS`, `setup_s3_bucket()`. Never duplicates `defaults.env`. - Compose files use pure `${VAR}` substitution; missing var = compose fails. ## Invariants - `infra-compose` / `instance-compose` wrap `docker compose` with `env -i`, then re-inject what compose needs. Stripping is required because `defaults.env` is sourced into manage.sh's shell at startup (stale values would leak); the ws1+ overrides are deliberately re-injected as shell env vars precisely because Compose gives shell precedence over `--env-file`, so they override the `defaults.env` baseline. -- Volume names pinned via `name:` (PENPOT_*_VOLUME), decoupled from the compose project name. ws1+ inject distinct per-instance volume names; ws0 keeps the historical `penpotdev_*` physical names so project renames never require data migration. +- Volume names pinned via `name:` (PENPOT_*_VOLUME), decoupled from the compose project name. Replacement services use new volumes and leave old volumes untouched. PostgreSQL 18 mounts `penpotdev_postgres_data_pg18` at `/var/lib/postgresql`; the old PG16 volume is not migrated automatically. - Network aliases (`- main`, `- redis`) are not declared in main.yml. Compose's auto-service-alias still registers `redis` on the shared network, so DNS for `redis` is non-deterministic with multiple instances. Backend uses `PENPOT_REDIS_URI=redis://penpot-devenv-wsN-valkey/0` (container_name) instead. -- No cross-project `depends_on`. `manage.sh ensure-infra-up` `docker wait`s on the `minio-setup` one-shot. +- No cross-project `depends_on`. `manage.sh ensure-infra-up` uses Compose `--wait`; PostgreSQL, RustFS, and Mailpit expose healthchecks. PostgreSQL checks TCP so its temporary init server cannot report ready. - `JAVA_OPTS` in `manage.sh` is shadowed inside the container by `_env`. The `-e JAVA_OPTS=...` flag only matters for processes that don't source `_env`. ## Worker policy Backend workers run only on ws0. `_env` gates `enable-backend-worker` on `PENPOT_BACKEND_WORKER`; ws1+ inject it as false. Workers are pure fire-and-forget: `wrk/submit!` inserts a row into the shared Postgres `task` table and returns; RPC handlers never wait on completion and workers never publish to msgbus. The reason for "ws0 only" is avoiding multi-instance worker races (cron dedup is best-effort across instances, `wrk/submit!` `dedupe` is racy across submitters); details in `mem:prod-infra/core`. -Each workspace is independent and can be started/stopped in any order. Shared infra (postgres, minio, etc.) is shut down only when no instances remain running. +Each workspace is independent and can be started/stopped in any order. Shared infra (Postgres, RustFS, etc.) is shut down only when no instances remain running. ## Port layout @@ -43,7 +43,7 @@ Container-internal ports fixed; host side offset `10000·N`. | 14181 | 24181 | … | 14281 | Serena MCP | | 14182 | 24182 | … | 24282 | Serena dashboard | -Everything else (frontend dev, backend API, exporter, storybook, REPLs, plugin dev, MCP inspector/WebSocket) is in-process or same-origin via Caddy/nginx. Infra publishes: mailer 1080, ldap 10389/10636 (singletons, not offset). +Everything else (frontend dev, backend API, exporter, storybook, REPLs, plugin dev, MCP inspector/WebSocket) is in-process or same-origin via Caddy/nginx. Infra publishes RustFS S3 API 9000, RustFS console 9001, and Mailpit UI 1080 on loopback; ldap 10389/10636 remains a singleton without offsets. Mailpit stores its SQLite database in `penpotdev_mailpit_data`. ## Tmux + MCP routing diff --git a/.serena/memories/prod-infra/core.md b/.serena/memories/prod-infra/core.md index 1ec5af0308..ee7dc542b0 100644 --- a/.serena/memories/prod-infra/core.md +++ b/.serena/memories/prod-infra/core.md @@ -6,7 +6,7 @@ Backend (`app.config`, `PENPOT_*` env vars) is parameterized; deployments choose - **PostgreSQL**: durable store. Profiles, teams, files, sessions, audit, `storage_object` metadata, the `task` queue, `scheduled_task` cron registry, migrations. File-data also lives here when the file-data backend is `legacy-db`/`db`. One shared DB across all backends. - **Redis (Valkey-compatible)**: per-backend message bus and cache. Concrete uses: msgbus Pub/Sub for collaborative-editing broadcasts and team/profile-org notifications fired by RPC handlers (`app.rpc.notifications`, `files_update`, `teams`, `websocket`); file-summary cache gated by `enable-redis-cache`; rate-limit counters; and the dispatcher→runner work hand-off list `penpot.worker.queue::`. `PENPOT_REDIS_URI`. -- **Object storage**: backends `:s3` and `:fs`. S3 in prod; devenv uses MinIO. Holds uploaded media, file-data when the file-data backend is `storage`, exports. Backend-side details (resolve, dedup, bucket set, object lifecycle, and file-data backends): `mem:backend/storage`. +- **Object storage**: backends `:s3` and `:fs`. S3 in prod; devenv uses RustFS. Holds uploaded media, file-data when the file-data backend is `storage`, exports. Backend-side details (resolve, dedup, bucket set, object lifecycle, and file-data backends): `mem:backend/storage`. - **SMTP mailer**: invitations, password resets, email verification (sent via the `:sendmail` worker task). - **LDAP** (optional auth provider): helpers in `app.auth.*`, gated by `enable-login-with-ldap`. diff --git a/.serena/memories/scripts/paren-repair.md b/.serena/memories/scripts/paren-repair.md index 234a4c8688..2774058fbc 100644 --- a/.serena/memories/scripts/paren-repair.md +++ b/.serena/memories/scripts/paren-repair.md @@ -29,9 +29,10 @@ bb scripts/paren-repair --help ## Native Tool Available (opencode) -A native opencode tool `paren-repair` is available at `.opencode/scripts/paren-repair.ts`. -The LLM can call it directly with: -- `files`: Array of file paths to fix +A native opencode tool `paren-repair` is available (defined in +`.opencode/plugins/penpot.js`, which registers it for both opencode V1 via +`server()` and opencode V2 via `setup()`). The LLM can call it directly with: +- `files`: comma-separated file paths to fix (a string, not an array) - `code`: Code string to fix via stdin Example usage by the LLM: diff --git a/.serena/memories/scripts/psql.md b/.serena/memories/scripts/psql.md index c969fd6742..68d7b66d0f 100644 --- a/.serena/memories/scripts/psql.md +++ b/.serena/memories/scripts/psql.md @@ -27,7 +27,9 @@ scripts/psql --host myhost --user myuser --db mydb ## Native Tool Available (opencode) -A native opencode tool `penpot-psql` is available. The LLM can call it directly +A native opencode tool `penpot-psql` is available (defined in +`.opencode/plugins/penpot.js`, which registers it for both opencode V1 via +`server()` and opencode V2 via `setup()`). The LLM can call it directly with: - `sql`: SQL command string to execute - `test`: Boolean flag to use the `penpot_test` database diff --git a/.serena/memories/workflow/updating-pnpm.md b/.serena/memories/workflow/updating-pnpm.md index 54a5bf26e3..1bb1596959 100644 --- a/.serena/memories/workflow/updating-pnpm.md +++ b/.serena/memories/workflow/updating-pnpm.md @@ -23,33 +23,46 @@ file (never pipe tool output through filters). - The store survives `node_modules` cleans. It is content-addressed and integrity-verified, so it cannot go stale; staleness lives in node_modules. Only `scripts/clean-node-modules --store` removes it. -- Every `package.json` (about 35 of them) must carry a `packageManager` field - with the identical `pnpm@+sha512.` value. Do not let them drift. -- CI pins no pnpm version; workflows rely on corepack reading - `packageManager`. Fixing the fields fixes CI. +- Every first-party `package.json` (35 files: workspace roots plus + members) must carry a `packageManager` field with the identical + `pnpm@+sha512.` value. Do not let them drift. + `external/` (vendored trees with their own lifecycles), `.opencode/`, + `.pnpm-store/`, `bundles/` and `docker/images/bundle-*` copies are + never stamped. +- pnpm is a system binary everywhere (devenv image, CI runners, Docker + images). Nothing may call corepack: it is gone from Node 25+. pnpm + auto-downloads the `packageManager` version on mismatch + (`pmOnFail: download`, the default), so drift self-heals; aligned pins + just skip the download. +- The pnpm version pin lives in three places that move together: + `PNPM_VERSION` (+ arch SHAs) in `docker/devenv/Dockerfile` and in + `docker/images/Dockerfile.{media-processor,exporter,mcp}`, and the + `packageManager` fields (stamped by the script below). The + `plugins-deploy-*` workflows need no pnpm pin: a single `pnpm/setup` + step (`working-directory: plugins`, `install: false`) reads it from + the manifest and installs the pinned Node via `runtime: node@`; + bump that pin together with `.nvmrc` on Node updates. ## Procedure -1. Resolve the target tag first and note the version. Example: - `npm view pnpm dist-tags --json` for `next-12` (latest 12.x). The tag - moves over time; always re-check. -2. List every directory with a `package.json`, excluding `node_modules` - (`fd -H -t f package.json -E node_modules`). This list is the work set; - do not maintain a hand-written list. -3. Run `corepack use pnpm@` in workspace roots first, then members. - `corepack use` stamps `packageManager` in the nearest package.json and - runs an install. Member runs repeat the workspace install; after the root - run they are quick no-ops. -4. If a run fails, fix the cause (see gotchas) and re-run that directory. +1. Resolve the target version first and note it. Example: + `pnpm view pnpm dist-tags --json` for `latest-12` (latest 12.x). The + tag moves over time; always re-check. +2. Bump `PNPM_VERSION` (+ arch SHAs) in `docker/devenv/Dockerfile` and in + `docker/images/Dockerfile.{media-processor,exporter,mcp}`. +3. From the repo root, on a host whose system pnpm is the target version + (rebuilt devenv), run `scripts/sync-pnpm-version`. It resolves the + integrity hash via `pnpm view` + node (no npm, no corepack, no + python3) and stamps the identical field into all 35 files, replacing + only the value line (each file keeps its own indent) and inserting + the key after `"name"`/`"version"` where missing. Explicit version + instead: `scripts/sync-pnpm-version `. +4. Run `scripts/sync-pnpm-version --install` (plain `pnpm install` in + each of the 11 workspace roots) to refresh lockfile metadata, then + fix any failing workspace (see gotchas) and re-run that directory. ## Gotchas -- `corepack use` only updates an existing `packageManager` field. If a - package.json lacks the field, corepack walks up to the nearest ancestor - that has one and stamps that file instead; the member stays unstamped. - After the sweep, assert every package.json carries the field. For a - missing one, insert the identical `pnpm@+sha512.` string, - then re-run `corepack use pnpm@` in that directory. - A workspace may fail with `ERR_PNPM_IGNORED_BUILDS`, and pnpm then writes a placeholder scaffold into its `pnpm-workspace.yaml`: `allowBuilds: esbuild: set this to true or false`. Current pnpm writes @@ -70,10 +83,12 @@ file (never pipe tool output through filters). ## Verification -- Every `packageManager` field is byte-identical (same version and hash). -- `pnpm --version` in each workspace prints the target version. +- `scripts/sync-pnpm-version --check` passes: every `packageManager` + field is byte-identical (same version and hash). - `pnpm install --frozen-lockfile` succeeds in each of the 11 workspaces. - `git diff` on lockfiles matches the expectations above. +- No `corepack` call remains in scripts, workflows, Dockerfiles or docs + (`rg corepack` shows only `CHANGES.md` history). ## Cleaning stale node_modules diff --git a/backend/package.json b/backend/package.json index f29469a28e..6b65767aec 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,7 +4,7 @@ "license": "MPL-2.0", "author": "Kaleidos INC Sucursal en España SL", "private": true, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "repository": { "type": "git", "url": "https://github.com/penpot/penpot" diff --git a/backend/pnpm-lock.yaml b/backend/pnpm-lock.yaml index dfe9e50563..ce36558530 100644 --- a/backend/pnpm-lock.yaml +++ b/backend/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/backend/scripts/_env b/backend/scripts/_env index 7bcd8f5ccb..3a90765589 100644 --- a/backend/scripts/_env +++ b/backend/scripts/_env @@ -91,15 +91,33 @@ export JAVA_OPTS="\ --enable-preview \ --enable-native-access=ALL-UNNAMED"; -function setup_minio() { +function setup_s3_bucket() { if [ "${PENPOT_OBJECTS_STORAGE_BACKEND}" != "s3" ]; then return 0 fi - # Shared MinIO user/policy provisioning is handled by docker-compose.infra.yml. - # Per process startup only ensures that the configured bucket exists. - mc alias set penpot-s3/ "${PENPOT_OBJECTS_STORAGE_S3_ENDPOINT}" minioadmin minioadmin -q - mc mb "penpot-s3/${PENPOT_OBJECTS_STORAGE_S3_BUCKET}" -p -q + local attempts=0 + local endpoint="${PENPOT_OBJECTS_STORAGE_S3_ENDPOINT}" + local bucket="${PENPOT_OBJECTS_STORAGE_S3_BUCKET}" + local region="${PENPOT_OBJECTS_STORAGE_S3_REGION}" + + until aws s3api head-bucket \ + --endpoint-url "$endpoint" \ + --region "$region" \ + --bucket "$bucket" >/dev/null 2>&1; do + if aws s3 mb "s3://${bucket}" \ + --endpoint-url "$endpoint" \ + --region "$region" >/dev/null 2>&1; then + return 0 + fi + + attempts=$((attempts + 1)) + if [ "$attempts" -ge 30 ]; then + echo "setup_s3_bucket: unable to create s3://${bucket} after ${attempts} attempts" >&2 + return 1 + fi + sleep 1 + done } diff --git a/backend/scripts/repl b/backend/scripts/repl index a2c179065e..291b0fe1c7 100755 --- a/backend/scripts/repl +++ b/backend/scripts/repl @@ -7,8 +7,8 @@ if [ -f $SCRIPT_DIR/_env.local ]; then source $SCRIPT_DIR/_env.local; fi -# Initialize MINIO config -setup_minio; +# Ensure the object storage bucket exists. +setup_s3_bucket; export JAVA_OPTS="$JAVA_OPTS -Dlog4j2.configurationFile=log4j2-devenv-repl.xml" export OPTIONS="-A:jmx-remote -A:dev" diff --git a/backend/scripts/run b/backend/scripts/run index 49b2bd4ba6..51ab6d6002 100755 --- a/backend/scripts/run +++ b/backend/scripts/run @@ -8,6 +8,9 @@ if [ -f $SCRIPT_DIR/_env.local ]; then source $SCRIPT_DIR/_env.local; fi +# Ensure the object storage bucket exists. +setup_s3_bucket; + export OPTIONS="-A:dev" entrypoint=${1:-app.main}; diff --git a/backend/scripts/start-dev b/backend/scripts/start-dev index d3389a0a6f..6376d69110 100755 --- a/backend/scripts/start-dev +++ b/backend/scripts/start-dev @@ -7,8 +7,8 @@ if [ -f $SCRIPT_DIR/_env.local ]; then source $SCRIPT_DIR/_env.local; fi -# Initialize MINIO config -setup_minio; +# Ensure the object storage bucket exists. +setup_s3_bucket; shift 1; set -ex diff --git a/common/package.json b/common/package.json index 4269da7ba6..c149915f43 100644 --- a/common/package.json +++ b/common/package.json @@ -4,7 +4,7 @@ "license": "MPL-2.0", "author": "Kaleidos INC Sucursal en España SL", "private": true, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "type": "module", "repository": { "type": "git", diff --git a/common/pnpm-lock.yaml b/common/pnpm-lock.yaml index ef70c46056..6026b397e6 100644 --- a/common/pnpm-lock.yaml +++ b/common/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/common/scripts/test b/common/scripts/test index ced37269e4..b22dbff38d 100755 --- a/common/scripts/test +++ b/common/scripts/test @@ -1,8 +1,6 @@ #!/usr/bin/env bash set -ex -corepack enable; -corepack install; pnpm install; pnpm run test; clojure -M:dev:test; diff --git a/docker/devenv/Dockerfile b/docker/devenv/Dockerfile index c2aa3c35e2..f28a277b07 100644 --- a/docker/devenv/Dockerfile +++ b/docker/devenv/Dockerfile @@ -66,7 +66,8 @@ RUN set -ex; \ FROM base AS setup-node -ENV NODE_VERSION=v24.20.0 \ +ENV NODE_VERSION=v24.21.0 \ + PNPM_VERSION=12.5.1 \ PATH=/opt/node/bin:$PATH RUN set -eux; \ @@ -75,10 +76,14 @@ RUN set -eux; \ aarch64|arm64) \ OPENSSL_ARCH='linux-aarch64'; \ BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-arm64.tar.gz"; \ + PNPM_ARCH='arm64'; \ + PNPM_SHA256='84e1290e82c800acd406b6db27e9650e15db3c2344d12162cc305ea1f942c6ff'; \ ;; \ amd64|x86_64) \ OPENSSL_ARCH='linux-x86_64'; \ BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.gz"; \ + PNPM_ARCH='x64'; \ + PNPM_SHA256='5a397dfb6b3d4b07d3d7769586aeb471048faf04299a492e2808b95a9a1c701f'; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ @@ -89,10 +94,14 @@ RUN set -eux; \ mkdir -p /opt/node; \ cd /opt/node; \ tar -xf /tmp/nodejs.tar.gz --strip-components=1; \ + PNPM_URL="https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-linux-${PNPM_ARCH}.tar.gz"; \ + curl -LfsSo /tmp/pnpm.tar.gz "${PNPM_URL}"; \ + echo "${PNPM_SHA256} */tmp/pnpm.tar.gz" | sha256sum -c -; \ + tar -xzf /tmp/pnpm.tar.gz -C /opt/node/bin pnpm; \ + chmod 755 /opt/node/bin/pnpm; \ chown -R root /opt/node; \ find /opt/node/include/node/openssl/archs -mindepth 1 -maxdepth 1 ! -name "$OPENSSL_ARCH" -exec rm -rf {} \; ; \ - corepack enable; \ - rm -rf /tmp/nodejs.tar.gz; + rm -f /tmp/nodejs.tar.gz /tmp/pnpm.tar.gz; ################################################################################ ## OPENCODE SETUP @@ -100,7 +109,7 @@ RUN set -eux; \ FROM base AS setup-opencode -ENV OPENCODE_VERSION=1.18.25 +ENV OPENCODE_VERSION=1.18.31 RUN set -ex; \ ARCH="$(dpkg --print-architecture)"; \ @@ -121,6 +130,37 @@ RUN set -ex; \ chmod +x /tmp/opencode/opencode; \ rm -f /tmp/opencode.tar.gz; +################################################################################ +## OPENCODE2 SETUP (V2, side-by-side with V1 `opencode`) +################################################################################ + +FROM base AS setup-opencode2 + +ENV OPENCODE2_VERSION=2.0.12 + +RUN set -eux; \ + ARCH="$(dpkg --print-architecture)"; \ + case "${ARCH}" in \ + aarch64|arm64) \ + BINARY_URL="https://registry.npmjs.org/@opencode/cli-linux-arm64/-/cli-linux-arm64-${OPENCODE2_VERSION}.tgz"; \ + ESUM='33f0dde9f0f055b6a3665d290371bcfc8c63daceade7a535c4b94d386f2bd917'; \ + ;; \ + amd64|x86_64) \ + BINARY_URL="https://registry.npmjs.org/@opencode/cli-linux-x64/-/cli-linux-x64-${OPENCODE2_VERSION}.tgz"; \ + ESUM='2a79beb2e24382cb2bdbb709237dbc22f498cf52a106d029a6a3a3243760c78b'; \ + ;; \ + *) \ + echo "Unsupported arch: ${ARCH}"; exit 1; \ + ;; \ + esac; \ + curl -LfsSo /tmp/opencode2.tgz "${BINARY_URL}"; \ + echo "${ESUM} */tmp/opencode2.tgz" | sha256sum -c -; \ + mkdir -p /tmp/opencode2; \ + tar -xzf /tmp/opencode2.tgz -C /tmp/opencode2 --strip-components=2 package/bin; \ + mv /tmp/opencode2/opencode /tmp/opencode2/opencode2; \ + chmod +x /tmp/opencode2/opencode2; \ + rm -f /tmp/opencode2.tgz; + ################################################################################ ## CADDYSERVER SETUP @@ -166,12 +206,12 @@ RUN set -eux; \ ARCH="$(dpkg --print-architecture)"; \ case "${ARCH}" in \ aarch64|arm64) \ - ESUM='5b222fce0b7076a10ac7ae3b1009a6c2caf4f35bc4e81de72010af6750c5e146'; \ - BINARY_URL='https://cdn.azul.com/zulu/bin/zulu26.32.13-ca-jdk26.0.2-linux_aarch64.tar.gz'; \ + ESUM='9fa5bf865783c43840101fcdc3a5222b60daf4fe11f26806247bf807c08aba38'; \ + BINARY_URL='https://cdn.azul.com/zulu/bin/zulu27.28.101-ca-jdk27.0.0-linux_aarch64.tar.gz'; \ ;; \ amd64|x86_64) \ - ESUM='4b7c114917aebd0fc6284fc7111245d7747a4d9603bd12d86b384b1abc9d575d'; \ - BINARY_URL='https://cdn.azul.com/zulu/bin/zulu26.32.13-ca-jdk26.0.2-linux_x64.tar.gz'; \ + ESUM='ccbc15c4edbedfdcc03c2d29a2aa2c6daf9e6ffb4cda7dd5ece0fcbb37350267'; \ + BINARY_URL='https://cdn.azul.com/zulu/bin/zulu27.28.101-ca-jdk27.0.0-linux_x64.tar.gz'; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ @@ -242,16 +282,17 @@ RUN set -eux; \ FROM base AS setup-utils -ENV CLJKONDO_VERSION=2026.07.24 \ - BABASHKA_VERSION=1.13.219 \ +ENV CLJKONDO_VERSION=2026.08.04 \ + BABASHKA_VERSION=1.13.223 \ CLJFMT_VERSION=0.16.5 \ - PIXI_VERSION=0.75.0 \ - GITHUB_CLI_VERSION=2.97.0 \ - UV_VERSION=0.12.1 \ + PIXI_VERSION=0.81.0 \ + GITHUB_CLI_VERSION=2.101.0 \ + AWS_CLI_VERSION=2.36.49 \ + UV_VERSION=0.12.17 \ UV_TOOL_DIR=/opt/uv/tools \ UV_TOOL_BIN_DIR=/opt/utils/bin \ UV_PYTHON_INSTALL_DIR=/opt/uv/python \ - SERENA_VERSION=1.6.1 + SERENA_VERSION=1.7.0 RUN set -ex; \ ARCH="$(dpkg --print-architecture)"; \ @@ -356,24 +397,30 @@ RUN set -ex; \ tar -xv --strip-components=1 -f /tmp/gh.tar.gz; \ rm -rf /tmp/gh.tar.gz; -# Install minio client +# Install AWS CLI RUN set -ex; \ ARCH="$(dpkg --print-architecture)"; \ case "${ARCH}" in \ aarch64|arm64) \ - BINARY_URL="https://dl.min.io/client/mc/release/linux-arm64/mc"; \ + BINARY_ARCH="aarch64"; \ + BINARY_SHA256="2dec26fdaff2f5e34961ea98f456297104f73d8409fc3599c8f2909c6e27a07e"; \ ;; \ amd64|x86_64) \ - BINARY_URL="https://dl.min.io/client/mc/release/linux-amd64/mc"; \ + BINARY_ARCH="x86_64"; \ + BINARY_SHA256="6b51b62d232217350e72d8f2493f47d3461239d011d1d5eef960dfcd8cb07069"; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ exit 1; \ ;; \ esac; \ - wget -O /tmp/mc ${BINARY_URL}; \ - mv /tmp/mc /opt/utils/bin/; \ - chmod +x /opt/utils/bin/mc; + BINARY_URL="https://awscli.amazonaws.com/awscli-exe-linux-${BINARY_ARCH}-${AWS_CLI_VERSION}.zip"; \ + curl -LfsSo /tmp/awscliv2.zip ${BINARY_URL}; \ + echo "${BINARY_SHA256} */tmp/awscliv2.zip" | sha256sum -c -; \ + cd /tmp; \ + unzip -q awscliv2.zip; \ + ./aws/install --install-dir /opt/utils/aws-cli --bin-dir /opt/utils/bin; \ + rm -rf /tmp/aws /tmp/awscliv2.zip; # Install uv RUN set -ex; \ @@ -503,7 +550,7 @@ RUN set -ex; \ curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc; \ echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt trixie-pgdg main" >> /etc/apt/sources.list.d/postgresql.list; \ apt-get -qq update; \ - apt-get -qqy install postgresql-client-16; \ + apt-get -qqy install postgresql-client-18; \ apt-get clean; \ rm -rf /var/lib/apt/lists/*; @@ -540,6 +587,7 @@ COPY --from=setup-rust /opt/rustup /opt/rustup COPY --from=setup-rust /opt/emsdk /opt/emsdk COPY --from=setup-caddy /usr/bin/caddy /usr/bin/caddy COPY --from=setup-opencode /tmp/opencode/opencode /opt/utils/bin/opencode +COPY --from=setup-opencode2 /tmp/opencode2/opencode2 /opt/utils/bin/opencode2 COPY files/nginx.conf /etc/nginx/nginx.conf COPY files/nginx-mime.types /etc/nginx/mime.types @@ -560,4 +608,3 @@ COPY files/init.sh /home/init.sh ENTRYPOINT ["/home/entrypoint.sh"] CMD ["/home/init.sh"] - diff --git a/docker/devenv/defaults.env b/docker/devenv/defaults.env index 41276dfe86..7f9c107494 100644 --- a/docker/devenv/defaults.env +++ b/docker/devenv/defaults.env @@ -10,11 +10,12 @@ # Container names and volume names. Volumes are pinned by explicit name # (rather than relying on COMPOSE_PROJECT_NAME prefixing) so the physical -# volumes survive project renames without a data migration. ws0 reuses the -# pre-Stage-2 physical volume names (penpotdev_*). +# volumes survive project renames. Replacement services use new volume names +# so data from the previous service remains available for rollback. PENPOT_MAIN_CONTAINER_NAME=penpot-devenv-ws0-main -PENPOT_POSTGRES_DATA_VOLUME=penpotdev_postgres_data_pg16 -PENPOT_MINIO_DATA_VOLUME=penpotdev_minio_data +PENPOT_POSTGRES_DATA_VOLUME=penpotdev_postgres_data_pg18 +PENPOT_RUSTFS_DATA_VOLUME=penpotdev_rustfs_data +PENPOT_MAILPIT_DATA_VOLUME=penpotdev_mailpit_data PENPOT_USER_DATA_VOLUME=penpotdev_user_data # Backend runtime config (passed to the container env block). Valkey is a @@ -28,12 +29,14 @@ PENPOT_DATABASE_PASSWORD=penpot PENPOT_DATABASE_MAX_POOL_SIZE=20 PENPOT_REDIS_URI=redis://valkey/0 -# Object storage (MinIO user/policy are provisioned by the infra compose file). +# Object storage (RustFS uses these credentials for its root S3 user). PENPOT_OBJECTS_STORAGE_BACKEND=s3 -PENPOT_OBJECTS_STORAGE_S3_ENDPOINT=http://minio:9000 +PENPOT_OBJECTS_STORAGE_S3_ENDPOINT=http://rustfs:9000 PENPOT_OBJECTS_STORAGE_S3_BUCKET=penpot +PENPOT_OBJECTS_STORAGE_S3_REGION=us-east-1 AWS_ACCESS_KEY_ID=penpot-devenv AWS_SECRET_ACCESS_KEY=penpot-devenv +AWS_DEFAULT_REGION=us-east-1 # Published host ports. Only ports that need to be reachable from outside the # container are exposed; everything else (frontend dev server, backend API, diff --git a/docker/devenv/docker-compose.infra.yml b/docker/devenv/docker-compose.infra.yml index c32c6a6163..6a876b36ad 100644 --- a/docker/devenv/docker-compose.infra.yml +++ b/docker/devenv/docker-compose.infra.yml @@ -4,53 +4,47 @@ networks: external: true volumes: - postgres_data_pg16: + postgres_data_pg18: name: ${PENPOT_POSTGRES_DATA_VOLUME} - minio_data: - name: ${PENPOT_MINIO_DATA_VOLUME} + rustfs_data: + name: ${PENPOT_RUSTFS_DATA_VOLUME} + mailpit_data: + name: ${PENPOT_MAILPIT_DATA_VOLUME} valkey_data: name: penpotdev_valkey_data services: - minio: - image: "minio/minio:RELEASE.2025-04-03T14-56-28Z" - command: minio server /mnt/data --console-address ":9001" + rustfs: + image: "rustfs/rustfs:1.0.0" + command: /data volumes: - - "minio_data:/mnt/data" + - "rustfs_data:/data" environment: - - MINIO_ROOT_USER=minioadmin - - MINIO_ROOT_PASSWORD=minioadmin + - RUSTFS_ACCESS_KEY=${AWS_ACCESS_KEY_ID} + - RUSTFS_SECRET_KEY=${AWS_SECRET_ACCESS_KEY} + - RUSTFS_ADDRESS=:9000 + - RUSTFS_CONSOLE_ADDRESS=:9001 + - RUSTFS_CONSOLE_ENABLE=true + + ports: + - "127.0.0.1:9000:9000" + - "127.0.0.1:9001:9001" + + healthcheck: + test: ["CMD", "curl", "--fail", "http://localhost:9000/health"] + interval: 1s + timeout: 5s + retries: 30 networks: default: aliases: - - minio - - minio-setup: - image: "minio/mc:latest" - depends_on: - - minio - entrypoint: ["/bin/sh", "-c"] - command: - - | - attempts=0 - until mc alias set penpot-s3 http://minio:9000 minioadmin minioadmin -q; do - attempts=$$((attempts + 1)) - if [ "$$attempts" -ge 30 ]; then - echo "minio-setup: gave up waiting for MinIO after $$attempts attempts" >&2 - exit 1 - fi - sleep 1 - done - mc admin user info penpot-s3 penpot-devenv >/dev/null 2>&1 || mc admin user add penpot-s3 penpot-devenv penpot-devenv -q - mc admin policy attach penpot-s3 readwrite --user=penpot-devenv -q - networks: - default: + - rustfs postgres: - image: postgres:16.8 + image: postgres:18.6 command: postgres -c config_file=/etc/postgresql.conf restart: always stop_signal: SIGINT @@ -62,7 +56,12 @@ services: volumes: - ./files/postgresql.conf:/etc/postgresql.conf:z - ./files/postgresql_init.sql:/docker-entrypoint-initdb.d/init.sql:z - - postgres_data_pg16:/var/lib/postgresql/data + - postgres_data_pg18:/var/lib/postgresql + healthcheck: + test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U $$POSTGRES_USER -d $$POSTGRES_DB"] + interval: 2s + timeout: 5s + retries: 30 networks: default: aliases: @@ -80,12 +79,24 @@ services: - valkey mailer: - image: sj26/mailcatcher:latest + image: axllent/mailpit:v1.31.1 restart: always + volumes: + - "mailpit_data:/data" + environment: + - MP_DATABASE=/data/mailpit.db + - MP_MAX_MESSAGES=5000 + - MP_DISABLE_VERSION_CHECK=true expose: - '1025' ports: - - "1080:1080" + - "127.0.0.1:1080:8025" + + healthcheck: + test: ["CMD", "wget", "--quiet", "--spider", "http://localhost:8025/readyz"] + interval: 2s + timeout: 5s + retries: 15 networks: default: diff --git a/docker/devenv/docker-compose.main.yml b/docker/devenv/docker-compose.main.yml index 35bac398ca..e593ad1ba7 100644 --- a/docker/devenv/docker-compose.main.yml +++ b/docker/devenv/docker-compose.main.yml @@ -84,8 +84,10 @@ services: - PENPOT_OBJECTS_STORAGE_BACKEND=${PENPOT_OBJECTS_STORAGE_BACKEND} - PENPOT_OBJECTS_STORAGE_S3_ENDPOINT=${PENPOT_OBJECTS_STORAGE_S3_ENDPOINT} - PENPOT_OBJECTS_STORAGE_S3_BUCKET=${PENPOT_OBJECTS_STORAGE_S3_BUCKET} + - PENPOT_OBJECTS_STORAGE_S3_REGION=${PENPOT_OBJECTS_STORAGE_S3_REGION} - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} - PENPOT_TENANT=${PENPOT_TENANT} - PENPOT_TMUX_ATTACH=${PENPOT_TMUX_ATTACH} diff --git a/docker/devenv/files/postgresql_init.sql b/docker/devenv/files/postgresql_init.sql index c36960e258..8e3d7d3c1c 100644 --- a/docker/devenv/files/postgresql_init.sql +++ b/docker/devenv/files/postgresql_init.sql @@ -1,2 +1,2 @@ CREATE DATABASE penpot_test; -CREATE DATABASE penpot_telemetry; +CREATE DATABASE penpot_nexus; diff --git a/docker/images/Dockerfile.exporter b/docker/images/Dockerfile.exporter index 362b107ad9..3b12e37303 100644 --- a/docker/images/Dockerfile.exporter +++ b/docker/images/Dockerfile.exporter @@ -91,9 +91,35 @@ COPY --from=penpotapp/imagemagick:7.1.2-27 /opt/imagick /opt/imagick WORKDIR /opt/penpot/exporter -# DHI Node image installs Node at the system level (symlinked into -# /usr/bin), so `./setup`'s internal `corepack enable` needs root to write -# there. Ownership is fixed right after. +# pnpm ships as a system binary (same tarball + SHA pin as +# docker/devenv/Dockerfile); the generated ./setup expects it on PATH. +# Corepack is gone from Node 25+, so nothing here may use it. +ARG PNPM_VERSION=12.5.1 +RUN set -eux; \ + ARCH="$(dpkg --print-architecture)"; \ + case "${ARCH}" in \ + aarch64|arm64) \ + PNPM_ARCH='arm64'; \ + PNPM_SHA256='84e1290e82c800acd406b6db27e9650e15db3c2344d12162cc305ea1f942c6ff'; \ + ;; \ + amd64|x86_64) \ + PNPM_ARCH='x64'; \ + PNPM_SHA256='5a397dfb6b3d4b07d3d7769586aeb471048faf04299a492e2808b95a9a1c701f'; \ + ;; \ + *) \ + echo "Unsupported arch: ${ARCH}"; \ + exit 1; \ + ;; \ + esac; \ + curl -LfsSo /tmp/pnpm.tar.gz "https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-linux-${PNPM_ARCH}.tar.gz"; \ + echo "${PNPM_SHA256} */tmp/pnpm.tar.gz" | sha256sum -c -; \ + tar -xzf /tmp/pnpm.tar.gz -C /usr/local/bin pnpm; \ + chmod 755 /usr/local/bin/pnpm; \ + rm -f /tmp/pnpm.tar.gz; \ + pnpm --version; + +# `./setup` only needs pnpm on PATH (installed above as root). +# Ownership is fixed right after. RUN ./setup && chown -R penpot:penpot /opt/penpot/exporter USER penpot:penpot diff --git a/docker/images/Dockerfile.mcp b/docker/images/Dockerfile.mcp index bad957b07c..043fa5493c 100644 --- a/docker/images/Dockerfile.mcp +++ b/docker/images/Dockerfile.mcp @@ -8,6 +8,36 @@ COPY $BUNDLE_PATH /opt/penpot/mcp/ WORKDIR /opt/penpot/mcp +# pnpm ships as a system binary (same tarball + SHA pin as +# docker/devenv/Dockerfile); ./setup expects it on PATH. +# Corepack is gone from Node 25+, so nothing here may use it. +ARG PNPM_VERSION=12.5.1 +RUN set -eux; \ + apt-get -qq update; \ + apt-get -qqy --no-install-recommends install curl ca-certificates; \ + rm -rf /var/lib/apt/lists/*; \ + ARCH="$(dpkg --print-architecture)"; \ + case "${ARCH}" in \ + aarch64|arm64) \ + PNPM_ARCH='arm64'; \ + PNPM_SHA256='84e1290e82c800acd406b6db27e9650e15db3c2344d12162cc305ea1f942c6ff'; \ + ;; \ + amd64|x86_64) \ + PNPM_ARCH='x64'; \ + PNPM_SHA256='5a397dfb6b3d4b07d3d7769586aeb471048faf04299a492e2808b95a9a1c701f'; \ + ;; \ + *) \ + echo "Unsupported arch: ${ARCH}"; \ + exit 1; \ + ;; \ + esac; \ + curl -LfsSo /tmp/pnpm.tar.gz "https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-linux-${PNPM_ARCH}.tar.gz"; \ + echo "${PNPM_SHA256} */tmp/pnpm.tar.gz" | sha256sum -c -; \ + tar -xzf /tmp/pnpm.tar.gz -C /usr/local/bin pnpm; \ + chmod 755 /usr/local/bin/pnpm; \ + rm -f /tmp/pnpm.tar.gz; \ + pnpm --version; + RUN ./setup diff --git a/docker/images/Dockerfile.media-processor b/docker/images/Dockerfile.media-processor index 9e30b0f3d4..a147b9d8b3 100644 --- a/docker/images/Dockerfile.media-processor +++ b/docker/images/Dockerfile.media-processor @@ -4,6 +4,7 @@ LABEL maintainer="Penpot " ENV LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 \ NODE_VERSION=v24.20.0 \ + PNPM_VERSION=12.5.1 \ DEBIAN_FRONTEND=noninteractive \ PATH=/opt/node/bin:$PATH @@ -56,9 +57,13 @@ RUN set -eux; \ case "${ARCH}" in \ aarch64|arm64) \ BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-arm64.tar.gz"; \ + PNPM_ARCH='arm64'; \ + PNPM_SHA256='84e1290e82c800acd406b6db27e9650e15db3c2344d12162cc305ea1f942c6ff'; \ ;; \ amd64|x86_64) \ BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.gz"; \ + PNPM_ARCH='x64'; \ + PNPM_SHA256='5a397dfb6b3d4b07d3d7769586aeb471048faf04299a492e2808b95a9a1c701f'; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ @@ -71,7 +76,13 @@ RUN set -eux; \ tar -xf /tmp/nodejs.tar.gz --strip-components=1; \ chown -R root /opt/node; \ rm -rf /tmp/nodejs.tar.gz; \ - corepack enable; \ + PNPM_URL="https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-linux-${PNPM_ARCH}.tar.gz"; \ + curl -LfsSo /tmp/pnpm.tar.gz "${PNPM_URL}"; \ + echo "${PNPM_SHA256} */tmp/pnpm.tar.gz" | sha256sum -c -; \ + tar -xzf /tmp/pnpm.tar.gz -C /opt/node/bin pnpm; \ + chmod 755 /opt/node/bin/pnpm; \ + rm -f /tmp/pnpm.tar.gz; \ + pnpm --version; \ mkdir -p /opt/penpot; \ chown -R penpot:penpot /opt/penpot; diff --git a/docs/README.md b/docs/README.md index 1acb98bb6a..caf7b226d7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,7 +10,6 @@ To view this site locally, first set up the environment: # only if necessary nvm install nvm use -corepack enable pnpm install ``` diff --git a/docs/package.json b/docs/package.json index 208cd18089..8a9c016f80 100644 --- a/docs/package.json +++ b/docs/package.json @@ -39,5 +39,5 @@ "markdown-it-anchor": "^9.2.1", "markdown-it-plantuml": "^1.4.1" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 3527b910e8..0ca49e8270 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/docs/scripts/build b/docs/scripts/build index 675605f180..5aa4de5bc7 100755 --- a/docs/scripts/build +++ b/docs/scripts/build @@ -2,9 +2,6 @@ set -ex -corepack enable; -corepack install; - rm -rf ./_dist pnpm install pnpm run build diff --git a/docs/technical-guide/developer/devenv.md b/docs/technical-guide/developer/devenv.md index 12a7e53ee8..055db27a36 100644 --- a/docs/technical-guide/developer/devenv.md +++ b/docs/technical-guide/developer/devenv.md @@ -62,7 +62,7 @@ See the dedicated section [Agentic Dev Environment](../agentic-devenv/) for deta ### Parallel workspaces The devenv runs as separate compose projects: - * shared infra (`penpotdev-infra`: Postgres, MinIO, mailer, LDAP) + * shared infra (`penpotdev-infra`: Postgres, RustFS, Valkey, mailer, LDAP) * `penpotdev-wsN` project per runtime instance. - `ws0` (a.k.a. `main`) is the current state of your repo; - `ws1` and up are clones that you maintain explicitly under `${PENPOT_WORKSPACES_DIR}/wsN/` @@ -168,7 +168,7 @@ the container's data volume regardless of this flag. ### Shared state and workers -All instances share one Penpot database and one MinIO bucket; users, teams, +All instances share one Penpot database and one RustFS bucket; users, teams, files, and MCP tokens are visible from every instance. Per-instance Valkey keeps msgbus Pub/Sub channels (collab broadcasts, team-org notifications, file-summary cache, rate-limit counters) isolated. @@ -176,7 +176,7 @@ file-summary cache, rate-limit counters) isolated. Background workers (`enable-backend-worker`) run only on ws0 — ws1+ overlays disable it. ws1+ RPC handlers still enqueue tasks into the shared Postgres `task` table; ws0's dispatcher claims them via `FOR UPDATE SKIP LOCKED` and -runs them against the shared DB and MinIO. Workers are fire-and-forget: +runs them against the shared DB and RustFS. Workers are fire-and-forget: `wrk/submit!` inserts a row and returns; RPC handlers never wait on completion. The "ws0 only" policy avoids multi-instance worker races (cron dedup is best-effort across instances, `wrk/submit!` `dedupe` is racy across @@ -190,7 +190,8 @@ Shared infrastructure shuts down only when no instances remain running. The devenv compose configuration has been split into two files and reorganized into separate compose projects per runtime instance: -- `docker/devenv/docker-compose.infra.yml` (Postgres, MinIO, mailer, LDAP) +- `docker/devenv/docker-compose.infra.yml` (Postgres, RustFS, Valkey, mailer, + LDAP) runs under the compose project `penpotdev-infra`. - `docker/devenv/docker-compose.main.yml` (one main container + its Valkey) runs once per runtime instance under `penpotdev-ws0`, `penpotdev-ws1`, …. @@ -202,10 +203,17 @@ into separate compose projects per runtime instance: If you had the devenv running on the previous single-project (`penpotdev`) layout, leftover containers and the auto-generated `penpotdev_default` network must be removed before bringing the new ws0 instance up. The named -data volumes (`penpotdev_postgres_data_pg16`, `penpotdev_minio_data`, -`penpotdev_user_data`, `penpotdev_valkey_data`) are pinned by explicit -`name:` entries in the new compose files and are preserved through the -transition — your Postgres DB, MinIO objects, and home cache survive. +data volumes (`penpotdev_postgres_data_pg18`, `penpotdev_rustfs_data`, +`penpotdev_mailpit_data`, `penpotdev_user_data`, `penpotdev_valkey_data`) are +pinned by explicit `name:` entries in the new compose files. The legacy +`penpotdev_postgres_data_pg16` and `penpotdev_minio_data` volumes remain +untouched. PostgreSQL 16 data and MinIO objects are not migrated automatically. + +PostgreSQL 18 stores its versioned data directory under +`/var/lib/postgresql/18/docker`, so the devenv mounts its volume at +`/var/lib/postgresql`. To retain data from PostgreSQL 16, export and restore it +with `pg_dump` and `pg_restore`; do not mount the PostgreSQL 16 volume directly +in the PostgreSQL 18 container. One-time cleanup, then bring up ws0: @@ -388,15 +396,29 @@ An example of your cursor configuration can be: } ``` +## Object storage + +The devenv uses RustFS for S3-compatible object storage. Its API is available +at [http://localhost:9000](http://localhost:9000), and its management console +is available at [http://localhost:9001](http://localhost:9001). Log in to the +console with `penpot-devenv` as both the access key and secret key. + +Both ports bind only to the host loopback interface and are not exposed to the +local network. + ## Email -To test email sending, the devenv includes [MailCatcher](https://mailcatcher.me/), -a SMTP server that is used for develop. It does not send any mail outbounds. -Instead, it stores them in memory and allows to browse them via a web interface -similar to a webmail client. Simply navigate to: +To test email sending, the devenv includes +[Mailpit](https://mailpit.axllent.org/), an SMTP server for development. It does +not send mail externally. Instead, it stores messages in a persistent Docker +volume and provides a webmail-like interface. Simply navigate to: [http://localhost:1080](http://localhost:1080) +The inbox persists when the container is recreated. `drop-devenv` preserves +the `penpotdev_mailpit_data` volume, together with the other devenv data +volumes. + ## Create user You can register a new user manually, or create new users automatically with this script. From your tmux instance, run: diff --git a/docs/technical-guide/developer/frontend.md b/docs/technical-guide/developer/frontend.md index 85dd9d7056..6a28339a8a 100644 --- a/docs/technical-guide/developer/frontend.md +++ b/docs/technical-guide/developer/frontend.md @@ -356,7 +356,7 @@ npx playwright test --ui > ❗️ **IMPORTANT**: You might need to [install Playwright's browsers and dependencies](https://playwright.dev/docs/intro) in your host machine with: npx playwright install --with-deps. In case you are using a Linux distribution other than Ubuntu, [you might need to install the dependencies manually](https://github.com/microsoft/playwright/issues/11122). -> You will also need pnpm in your host nodejs. For this, do corepack enable and then just pnpm. +> You will also need pnpm in your host nodejs (the devenv already ships it; outside it, run npm install -g pnpm) and then just pnpm. ### How to write a test diff --git a/exporter/package.json b/exporter/package.json index 47429d2541..d04dafe2a5 100644 --- a/exporter/package.json +++ b/exporter/package.json @@ -4,7 +4,7 @@ "license": "MPL-2.0", "author": "Kaleidos INC Sucursal en España SL", "private": true, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "repository": { "type": "git", "url": "https://github.com/penpot/penpot" @@ -30,7 +30,8 @@ }, "scripts": { "clear:shadow-cache": "rm -rf .shadow-cljs && rm -rf target", - "watch:app": "pnpm run clear:shadow-cache && clojure -M:dev:shadow-cljs watch main", + "build:wasm": "exit 0", + "watch:app": "pnpm run build:wasm && pnpm run clear:shadow-cache && clojure -M:dev:shadow-cljs watch main", "watch": "pnpm run watch:app", "build:app": "clojure -M:dev:shadow-cljs release main", "build": "pnpm run clear:shadow-cache && pnpm run build:app", diff --git a/exporter/pnpm-lock.yaml b/exporter/pnpm-lock.yaml index 660f44b821..e30ff1e950 100644 --- a/exporter/pnpm-lock.yaml +++ b/exporter/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/exporter/scripts/build b/exporter/scripts/build index 40eba8f44c..487b697654 100755 --- a/exporter/scripts/build +++ b/exporter/scripts/build @@ -5,8 +5,6 @@ set -ex export CURRENT_VERSION=$1; export NODE_ENV=production; -corepack enable; -corepack install || exit 1; pnpm install || exit 1; rm -rf target @@ -21,8 +19,7 @@ touch target/pnpm-workspace.yaml; cat </dev/null || { echo "error: pnpm not found in PATH" >&2; exit 1; }; pnpm install pnpm exec playwright install chromium; EOF diff --git a/exporter/scripts/setup b/exporter/scripts/setup index a99157468d..3607ca3d67 100755 --- a/exporter/scripts/setup +++ b/exporter/scripts/setup @@ -2,7 +2,5 @@ set -e; -corepack enable; -corepack install; pnpm install; pnpm exec playwright install chromium diff --git a/exporter/scripts/test b/exporter/scripts/test index 6402c5afd1..169cdc8a9e 100755 --- a/exporter/scripts/test +++ b/exporter/scripts/test @@ -1,7 +1,5 @@ #!/usr/bin/env bash set -ex -corepack enable; -corepack install; pnpm install; pnpm run test; diff --git a/frontend/package.json b/frontend/package.json index 705f080055..894e6e651d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,7 +4,7 @@ "license": "MPL-2.0", "author": "Kaleidos INC Sucursal en España SL", "private": true, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "browserslist": [ "defaults" ], diff --git a/frontend/packages/draft-js/package.json b/frontend/packages/draft-js/package.json index e9f6c0ffd7..d257b4bec2 100644 --- a/frontend/packages/draft-js/package.json +++ b/frontend/packages/draft-js/package.json @@ -4,7 +4,7 @@ "description": "Penpot Draft-JS Wrapper", "main": "index.js", "type": "module", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "author": "Andrey Antukh", "license": "MPL-2.0", "dependencies": { diff --git a/frontend/packages/mousetrap/package.json b/frontend/packages/mousetrap/package.json index 509d95b0ed..e71ccbf825 100644 --- a/frontend/packages/mousetrap/package.json +++ b/frontend/packages/mousetrap/package.json @@ -4,7 +4,7 @@ "description": "Simple library for handling keyboard shortcuts", "main": "index.js", "type": "module", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "author": "Craig Campbell", "license": "Apache-2.0 WITH LLVM-exception" } diff --git a/frontend/packages/tokenscript/package.json b/frontend/packages/tokenscript/package.json index cc8330b50e..32d7442bf5 100644 --- a/frontend/packages/tokenscript/package.json +++ b/frontend/packages/tokenscript/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "type": "module", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "author": "Andrey Antukh", "license": "MPL-2.0", "dependencies": { diff --git a/frontend/packages/ui/package.json b/frontend/packages/ui/package.json index bd2351e197..38657cbad1 100644 --- a/frontend/packages/ui/package.json +++ b/frontend/packages/ui/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "types": "./dist/index.d.ts", "type": "module", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "exports": { ".": { "import": "./dist/index.js" diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 64aa97b44e..eb187d1c4a 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/frontend/scripts/build b/frontend/scripts/build index 4d4cc79d10..f19a643fe5 100755 --- a/frontend/scripts/build +++ b/frontend/scripts/build @@ -18,8 +18,6 @@ export NODE_ENV=production; rm -rf node_modules; -corepack enable; -corepack install; pnpm install; rm -rf target/dist; @@ -43,7 +41,6 @@ popd; pushd ../plugins rm -rf node_modules; rm -rf dist/apps/; -corepack install; pnpm -r install; pnpm run build:plugins; popd diff --git a/frontend/scripts/build-storybook b/frontend/scripts/build-storybook index f94b434df4..d40a73aa14 100755 --- a/frontend/scripts/build-storybook +++ b/frontend/scripts/build-storybook @@ -12,8 +12,6 @@ export VERSION_TAG="${VERSION}-${BUILD_TS}"; export NODE_ENV=production; -corepack enable; -corepack install; pnpm install; pnpm run build:storybook; diff --git a/frontend/scripts/setup b/frontend/scripts/setup index bf54c0440c..73bf2038ae 100755 --- a/frontend/scripts/setup +++ b/frontend/scripts/setup @@ -1,6 +1,4 @@ #!/usr/bin/env bash -corepack enable; -corepack install; pnpm install; pnpm exec playwright install chromium; diff --git a/frontend/scripts/test b/frontend/scripts/test index 0da76e90c2..6d822b9542 100755 --- a/frontend/scripts/test +++ b/frontend/scripts/test @@ -1,8 +1,6 @@ #!/usr/bin/env bash set -ex -corepack enable; -corepack install; pnpm install; # Build render wasm binary diff --git a/frontend/scripts/watch b/frontend/scripts/watch index 80d579b73f..9fc909dfa9 100755 --- a/frontend/scripts/watch +++ b/frontend/scripts/watch @@ -4,7 +4,5 @@ TARGET=${1:-app}; set -ex -corepack enable; -corepack install; pnpm install; pnpm run watch:$TARGET diff --git a/frontend/text-editor/package.json b/frontend/text-editor/package.json index 42c442f5f0..94d61aaaaa 100644 --- a/frontend/text-editor/package.json +++ b/frontend/text-editor/package.json @@ -28,5 +28,5 @@ "vite": "^8.2.0", "vitest": "^4.1.10" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/library/package.json b/library/package.json index aff0eb2082..dec0f1bdc6 100644 --- a/library/package.json +++ b/library/package.json @@ -3,7 +3,7 @@ "version": "1.2.0-RC1", "license": "MPL-2.0", "author": "Kaleidos INC Sucursal en España SL", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "type": "module", "repository": { "type": "git", diff --git a/library/pnpm-lock.yaml b/library/pnpm-lock.yaml index 9f4a4d81a3..8b8daa71b9 100644 --- a/library/pnpm-lock.yaml +++ b/library/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/library/scripts/test b/library/scripts/test index d724fbc9c3..11f90bfaaf 100755 --- a/library/scripts/test +++ b/library/scripts/test @@ -1,8 +1,6 @@ #!/usr/bin/env bash set -ex -corepack enable; -corepack install; pnpm install; pnpm run build:bundle; diff --git a/manage.sh b/manage.sh index c3fb41d07c..d1b0db408b 100755 --- a/manage.sh +++ b/manage.sh @@ -209,9 +209,7 @@ function ensure-devenv-network { # Compose-project plumbing for the parallel-workspaces layout. # -# - Shared infrastructure (postgres, minio, mailer, ldap, minio-setup) runs -# under project `penpotdev-infra`. -# - Shared infrastructure (postgres, minio, mailer, ldap, valkey, minio-setup) +# - Shared infrastructure (postgres, RustFS, mailer, LDAP, Valkey) # runs under project `penpotdev-infra`. # - Each runtime instance (ws0, ws1, ...) runs only its own main container # under project `penpotdev-wsN`. All workspaces uniformly overlay their @@ -296,16 +294,11 @@ function devenv-main-running { [[ -n "$container" ]] && [[ "$(docker inspect -f '{{.State.Running}}' "$container" 2>/dev/null)" = "true" ]] } -# Bring shared infra up and block until minio-setup has provisioned the -# shared MinIO user/policy. Idempotent: a second call when everything is -# already up returns immediately. +# Bring shared infra up and block until services with healthchecks are healthy. +# Removing orphaned containers retires old infra services without deleting +# their named volumes. function ensure-infra-up { - infra-compose up -d - local setup_container - setup_container=$(infra-compose ps -aq minio-setup 2>/dev/null) - if [[ -n "$setup_container" ]]; then - docker wait "$setup_container" >/dev/null 2>&1 || true - fi + infra-compose up -d --wait --wait-timeout 60 --remove-orphans } # Refuse to sync workspaces if the live repo is in a fragile Git state. diff --git a/mcp/README.md b/mcp/README.md index 6842adce7e..702eec3d60 100644 --- a/mcp/README.md +++ b/mcp/README.md @@ -68,7 +68,7 @@ Once the servers are running, continue with step 2. #### Running the Source Version from the Repository -The tools `corepack` and `npx` should be available in your terminal. +The tools `pnpm` and `npx` should be available in your terminal. On Windows, use the Git Bash terminal to ensure compatibility with the provided scripts. diff --git a/mcp/package.json b/mcp/package.json index abd1b8c8be..58eedd05f6 100644 --- a/mcp/package.json +++ b/mcp/package.json @@ -23,7 +23,7 @@ "type": "git", "url": "https://github.com/penpot/penpot.git" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "devDependencies": { "concurrently": "^10.0.5", "prettier": "^3.9.6" diff --git a/mcp/packages/common/package.json b/mcp/packages/common/package.json index fae32707ef..4e3dda0cc8 100644 --- a/mcp/packages/common/package.json +++ b/mcp/packages/common/package.json @@ -4,7 +4,7 @@ "description": "Shared type definitions and interfaces for Penpot MCP", "main": "dist/index.js", "types": "dist/index.d.ts", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "scripts": { "build": "tsc --build --clean && tsc --build", "watch": "tsc --watch", diff --git a/mcp/packages/plugin/package.json b/mcp/packages/plugin/package.json index 534fef6226..33b37f2442 100644 --- a/mcp/packages/plugin/package.json +++ b/mcp/packages/plugin/package.json @@ -3,7 +3,7 @@ "private": true, "version": "1.0.0", "type": "module", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "scripts": { "start": "vite build --watch --config vite.config.ts", "start:multi-user": "pnpm run start", diff --git a/mcp/packages/server/package.json b/mcp/packages/server/package.json index 4711b793a5..c30679f6f6 100644 --- a/mcp/packages/server/package.json +++ b/mcp/packages/server/package.json @@ -24,7 +24,7 @@ ], "author": "", "license": "MIT", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "class-transformer": "^0.5.1", diff --git a/mcp/pnpm-lock.yaml b/mcp/pnpm-lock.yaml index 6b15ed28ab..13321c823a 100644 --- a/mcp/pnpm-lock.yaml +++ b/mcp/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/mcp/scripts/build b/mcp/scripts/build index 09523164fe..c7e2b1f922 100755 --- a/mcp/scripts/build +++ b/mcp/scripts/build @@ -9,9 +9,6 @@ echo "Preparing bundle for types from $URL" set -ex -corepack enable; -corepack install; - # Ensure clean working directory rm -rf dist; rm -rf node_modules; @@ -37,8 +34,7 @@ touch ./dist/pnpm-workspace.yaml; cat </dev/null || { echo "error: pnpm not found in PATH" >&2; exit 1; }; pnpm install -P EOF diff --git a/mcp/scripts/setup b/mcp/scripts/setup index 83a3074583..ccb52413c0 100755 --- a/mcp/scripts/setup +++ b/mcp/scripts/setup @@ -2,6 +2,4 @@ set -e; -corepack enable; -corepack install; pnpm -r install; diff --git a/media-processor/package.json b/media-processor/package.json index ea012c5246..8190c530bf 100644 --- a/media-processor/package.json +++ b/media-processor/package.json @@ -14,7 +14,7 @@ "fmt:check": "prettier --check src/ test/", "clean": "rm -rf dist/" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "dependencies": { "express": "^5.2.1", "multer": "^2.2.0", diff --git a/media-processor/pnpm-lock.yaml b/media-processor/pnpm-lock.yaml index a35ada5f76..98803e8f77 100644 --- a/media-processor/pnpm-lock.yaml +++ b/media-processor/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/media-processor/scripts/setup b/media-processor/scripts/setup index c7be37d33d..43cf18877f 100755 --- a/media-processor/scripts/setup +++ b/media-processor/scripts/setup @@ -1,6 +1,4 @@ #!/bin/bash set -e cd "$(dirname "$0")/.." -corepack enable -corepack install pnpm install diff --git a/package.json b/package.json index 965f175b3d..150214c26f 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "MPL-2.0", "author": "Kaleidos INC Sucursal en España SL", "private": true, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "repository": { "type": "git", "url": "https://github.com/penpot/penpot" diff --git a/plugins/apps/colors-to-tokens-plugin/package.json b/plugins/apps/colors-to-tokens-plugin/package.json index 2bec61bf8b..30715f65e5 100644 --- a/plugins/apps/colors-to-tokens-plugin/package.json +++ b/plugins/apps/colors-to-tokens-plugin/package.json @@ -13,5 +13,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/composable-test-suite/package.json b/plugins/apps/composable-test-suite/package.json index 949296d0b4..f2a776ec8f 100644 --- a/plugins/apps/composable-test-suite/package.json +++ b/plugins/apps/composable-test-suite/package.json @@ -26,5 +26,5 @@ "vite": "^8.2.2", "vite-live-preview": "^0.4.0" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/contrast-plugin/package.json b/plugins/apps/contrast-plugin/package.json index 6036de7b96..ee854f007f 100644 --- a/plugins/apps/contrast-plugin/package.json +++ b/plugins/apps/contrast-plugin/package.json @@ -13,5 +13,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/create-palette-plugin/package.json b/plugins/apps/create-palette-plugin/package.json index ee5d641bf9..c99b93bf8c 100644 --- a/plugins/apps/create-palette-plugin/package.json +++ b/plugins/apps/create-palette-plugin/package.json @@ -12,5 +12,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/e2e/package.json b/plugins/apps/e2e/package.json index 866566cfa8..c0501e2733 100644 --- a/plugins/apps/e2e/package.json +++ b/plugins/apps/e2e/package.json @@ -7,5 +7,5 @@ "test": "vitest", "lint": "eslint ." }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/example-styles/package.json b/plugins/apps/example-styles/package.json index 3e919d958b..714fe4228d 100644 --- a/plugins/apps/example-styles/package.json +++ b/plugins/apps/example-styles/package.json @@ -11,5 +11,5 @@ "serve": "vite preview", "lint": "eslint ." }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/icons-plugin/package.json b/plugins/apps/icons-plugin/package.json index 749eebfdff..4c6eee5406 100644 --- a/plugins/apps/icons-plugin/package.json +++ b/plugins/apps/icons-plugin/package.json @@ -13,5 +13,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/lorem-ipsum-plugin/package.json b/plugins/apps/lorem-ipsum-plugin/package.json index fffd54a5d3..6e1dcc3de4 100644 --- a/plugins/apps/lorem-ipsum-plugin/package.json +++ b/plugins/apps/lorem-ipsum-plugin/package.json @@ -13,5 +13,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/plugin-api-test-suite/package.json b/plugins/apps/plugin-api-test-suite/package.json index 3d2fa7ec9b..92eeee54fe 100644 --- a/plugins/apps/plugin-api-test-suite/package.json +++ b/plugins/apps/plugin-api-test-suite/package.json @@ -19,5 +19,5 @@ "devDependencies": { "playwright": "^1.62.1" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/poc-state-plugin/package.json b/plugins/apps/poc-state-plugin/package.json index 7a79003310..7c593ede9f 100644 --- a/plugins/apps/poc-state-plugin/package.json +++ b/plugins/apps/poc-state-plugin/package.json @@ -13,5 +13,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/poc-tokens-plugin/package.json b/plugins/apps/poc-tokens-plugin/package.json index 852e7f1764..06fcd3e9cc 100644 --- a/plugins/apps/poc-tokens-plugin/package.json +++ b/plugins/apps/poc-tokens-plugin/package.json @@ -13,5 +13,5 @@ "lint": "eslint .", "test": "exit 0" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/rename-layers-plugin/package.json b/plugins/apps/rename-layers-plugin/package.json index 87279ccc4b..ca69e49f14 100644 --- a/plugins/apps/rename-layers-plugin/package.json +++ b/plugins/apps/rename-layers-plugin/package.json @@ -13,5 +13,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/apps/table-plugin/package.json b/plugins/apps/table-plugin/package.json index 20bfb2245f..be103b05ff 100644 --- a/plugins/apps/table-plugin/package.json +++ b/plugins/apps/table-plugin/package.json @@ -13,5 +13,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/libs/plugin-types/package.json b/plugins/libs/plugin-types/package.json index c63c7069ed..0f0da1e1e3 100644 --- a/plugins/libs/plugin-types/package.json +++ b/plugins/libs/plugin-types/package.json @@ -7,5 +7,5 @@ "build": "node ../../tools/scripts/build-types.mjs", "lint": "tsc -p . --noEmit" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/libs/plugins-runtime/package.json b/plugins/libs/plugins-runtime/package.json index 4dc44175bb..cf15cc95aa 100644 --- a/plugins/libs/plugins-runtime/package.json +++ b/plugins/libs/plugins-runtime/package.json @@ -16,5 +16,5 @@ "lint": "eslint .", "test": "vitest" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/libs/plugins-styles/package.json b/plugins/libs/plugins-styles/package.json index 62f2b3c21b..301ac323ef 100644 --- a/plugins/libs/plugins-styles/package.json +++ b/plugins/libs/plugins-styles/package.json @@ -6,5 +6,5 @@ "build": "node ../../tools/scripts/build-css.mjs", "lint": "echo 0" }, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457" + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f" } diff --git a/plugins/package.json b/plugins/package.json index 25fa71a7fb..912a0a7f70 100644 --- a/plugins/package.json +++ b/plugins/package.json @@ -3,7 +3,7 @@ "version": "0.6.0", "type": "module", "license": "MIT", - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "scripts": { "start": "pnpm run start:app:runtime", "start:app:runtime": "concurrently --kill-others --names build,server \"pnpm --filter @penpot/plugins-runtime run build:watch\" \"pnpm --filter @penpot/plugins-runtime run preview\"", diff --git a/plugins/pnpm-lock.yaml b/plugins/pnpm-lock.yaml index 70b95a2f81..0f3df9cca1 100644 --- a/plugins/pnpm-lock.yaml +++ b/plugins/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c35d255221..6ef1b2c144 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/render-wasm/_build_env b/render-wasm/_build_env index 0b506e415d..4bc9759958 100644 --- a/render-wasm/_build_env +++ b/render-wasm/_build_env @@ -67,8 +67,6 @@ function clean { } function setup { - corepack enable; - corepack install; pnpm install; } diff --git a/render-wasm/package.json b/render-wasm/package.json index 3f8b581f51..4b56c15f73 100644 --- a/render-wasm/package.json +++ b/render-wasm/package.json @@ -4,7 +4,7 @@ "license": "MPL-2.0", "author": "Kaleidos INC Sucursal en España SL", "private": true, - "packageManager": "pnpm@12.3.4+sha512.961aa41fb077da3a04a441d9f8e15ebc0c96da8ef710b2eb67bf9ee7cb0610eabd48f1fd85f51cffe73846785fa0f87c56a3a872a1d893f8446741b5cce45457", + "packageManager": "pnpm@12.5.1+sha512.e3f305bc784a2bc89f5ad3b6138889470fae8d2af5f36b61216ec91c2c3d64089775f9de38aac331044ea40f245cb0d5666392dfdf65824e1907ef6a2c62de5f", "repository": { "type": "git", "url": "https://github.com/penpot/penpot" diff --git a/render-wasm/pnpm-lock.yaml b/render-wasm/pnpm-lock.yaml index 58127cd45a..c00e4d1b27 100644 --- a/render-wasm/pnpm-lock.yaml +++ b/render-wasm/pnpm-lock.yaml @@ -7,96 +7,153 @@ importers: configDependencies: {} packageManagerDependencies: pnpm: - specifier: 12.3.4 - version: 12.3.4 + specifier: 12.5.1 + version: 12.5.1 packages: - '@pnpm/exe.darwin-arm64@12.3.4': - resolution: {integrity: sha512-PAyUol8T1+/+ViOiXAt51ECA+QnfXCqz6foL4bW+LsoX0NcVd5XVEM2mRQu+LV4oc7uRz9zf9U0P+XFfuQeDAw==} + '@pnpm/exe.android-arm64@12.5.1': + resolution: {integrity: sha512-6LGBmQuDzUmgpHSuy+haG0jrmkwFNa4EuShDZqK3cIBv4Wfb75CzjJmowkzr+iJg40vnBKMQ62t4Ko6mwsId7A==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.5.1': + resolution: {integrity: sha512-091oCltP3Rx89yxL1Wh5rXkUXEyFzyxIzSHKRFDyDFlQkb8Ox8FaDcm+M8PNkMyqnLA+qeGOLzY7Rjj9izl1Ww==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.5.1': + resolution: {integrity: sha512-r1vEMQPVjRexZMyL2HonxJoo3+nuB/+G+tg+f2PK6faRdXX1TDwevKXOxJAfqlPInTy6W/pm912+s+m0NcR4BQ==} cpu: [arm64] os: [darwin] - '@pnpm/exe.darwin-x64@12.3.4': - resolution: {integrity: sha512-fxP9JCk0Cdye+ePuj+GJJLMUMTqHGWRdb1dtv4How876uQ2ehxvenpgiYAir/ceO9PsYUZkFTtyZdx+rRu5QOA==} + '@pnpm/exe.darwin-x64@12.5.1': + resolution: {integrity: sha512-YHwI1g2B+Y2cAEylOR31r781GWijdJL7Gy7TEn/ZpZ5v/Cuwp5/Pz0EFCgo0M2MKLafAbL/laUMGvOpAdnerAw==} cpu: [x64] os: [darwin] - '@pnpm/exe.linux-arm64-musl@12.3.4': - resolution: {integrity: sha512-FBOt0/7ye6O6q4AllVV5QMviB6qE6fqkeczV/+MDWQsmo+QJrlfsh6X7CpH/tClVpBZEyIbjpUoT8bNhCYBxEg==} + '@pnpm/exe.freebsd-x64@12.5.1': + resolution: {integrity: sha512-sFUMHiYFs6q5syFwgaVppzhQSmqnXoJIz/YwTXIOXTDE76ndIpTRpDGAnBCBKjsaEBnqjJA/2l6hpJcNDNoMiA==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.5.1': + resolution: {integrity: sha512-zupuxYZBuBEGjUz805/4/Asq01UNziFADANt8yp+LdUjU9bbMa3xY78Bx1PsGDqBy7aiad4sdUMK8ZxH4n4gmQ==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/exe.linux-arm64@12.3.4': - resolution: {integrity: sha512-t71AVA7LRqiKTyZ5xMYaZc2n5DfdpMbfokZuiIOXHBOM03ECnF0t4iYwaBDqJgVjlKYUOwaF/bRQajGNA4cJ4w==} + '@pnpm/exe.linux-arm64@12.5.1': + resolution: {integrity: sha512-6hbMWW2/eQo1b5wvQPe/ndLHVTH88Rav6N+ffD4/h6IuFMjWCgasFYYsFv0GrvpqREAx3SwmZSvli+0NFXqbxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@pnpm/exe.linux-x64-musl@12.3.4': - resolution: {integrity: sha512-RPmk7Jb/aYaFvL2iyDN/AtMY+hUEsue732WmXpcuQ9tBpMnGyA5py7Z3+e+qmQaJ0zY/4ni9jJiyPBQHujmv6w==} + '@pnpm/exe.linux-ppc64@12.5.1': + resolution: {integrity: sha512-Gg3maDzaE/ZFMV9HIx/BwMN0Y6QbEs13URfxmiYHtKjjLAs5wEQZRMUP87YNLYO7cNaEfbM8GRbS9vPosyD9Gw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.5.1': + resolution: {integrity: sha512-6fgWxXYMBMsWQ8DAiRevscX4QZQjwh+FsyCj8ZOk8pMXvqeq84MqBLCmS6KckvnbdqJ+HlSVQ7fs/kd0ldwfhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.5.1': + resolution: {integrity: sha512-nzMZruRvxDhEfYUhzu+7EmM39+82Dgagc/6hPFPqGqzXNGcIG0anuxbUxfeNtI64SHt91KuuYUmCB/inlM+Pag==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.5.1': + resolution: {integrity: sha512-kHCbegdTNHpzmPtUD4S5fqkVkqgdQR47spF9p2VPP3dIIkZl6Ytk8w0vhlAsAGgge8FmucfwX+vvPKgm0NtOCQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/exe.linux-x64@12.3.4': - resolution: {integrity: sha512-2ZqOlSPkfwX1h5cR+FPiWf8+F+2hZT/3TvhUK5sigHqwaQCIiq8R7CGxhndKs63JtcLi2a1Qpo+wX/EoyfjyJQ==} + '@pnpm/exe.linux-x64@12.5.1': + resolution: {integrity: sha512-3PkUBYo5z4dgtlnTNIFj7QGpcDUAuqXz9WGVigPDCeccEnhGiRkWmA5102TmYJHtwJP3LfmE+ZF9PGeWhn8p9Q==} cpu: [x64] os: [linux] libc: [glibc] - '@pnpm/exe.win32-arm64@12.3.4': - resolution: {integrity: sha512-ANyrHqyqco6SXBysUTRF74itDyyraea7IbFsKFdNXTjcFnfycTDx37EwuhdpPYFNSIh2JhUG4fByclsRfiHX7w==} + '@pnpm/exe.win32-arm64@12.5.1': + resolution: {integrity: sha512-49NvjZIXHly56/PLoEDD7VphbO4N8dwMXoApElDFCpVGDNGeKlwlib1tXtnpTF6i2/XIsAj7GgatHB5KHXgBnA==} cpu: [arm64] os: [win32] - '@pnpm/exe.win32-x64@12.3.4': - resolution: {integrity: sha512-WH/KqBPY/hq2Tb7SgQltEZytimcjgKRaCRL/aM9CI0c67iKc5TVmHUhIiL3Ux9FB4bWn36i6XewUcScQI+zG8w==} + '@pnpm/exe.win32-x64@12.5.1': + resolution: {integrity: sha512-ePUmQFPAPJFNMwg1lelDx2PdjHqYRiF0yfg5e6qeDbPNOu97QNo557Ru/SxmCrmt8ydQWNuZXWpdEp019md5vw==} cpu: [x64] os: [win32] - pnpm@12.3.4: - resolution: {integrity: sha512-lhqkH7B32joEpEHZ+OFevAyW2o73ELLrZ7+e58sGEOq9SPH9hfUc/+c4RnhfoPh8VqOocqHYk/hEZ0G1zORUVw==} + pnpm@12.5.1: + resolution: {integrity: sha512-4/MFvHhKK8ifWtO2E4iJRw+ujSr182thIW7JHCw9ZAiXdfneOKrDMQROpA8kXLDVZmOS399lgk4ZB+9qLGLeXw==} engines: {node: '>=18.*'} hasBin: true snapshots: - '@pnpm/exe.darwin-arm64@12.3.4': + '@pnpm/exe.android-arm64@12.5.1': optional: true - '@pnpm/exe.darwin-x64@12.3.4': + '@pnpm/exe.android-x64@12.5.1': optional: true - '@pnpm/exe.linux-arm64-musl@12.3.4': + '@pnpm/exe.darwin-arm64@12.5.1': optional: true - '@pnpm/exe.linux-arm64@12.3.4': + '@pnpm/exe.darwin-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64-musl@12.3.4': + '@pnpm/exe.freebsd-x64@12.5.1': optional: true - '@pnpm/exe.linux-x64@12.3.4': + '@pnpm/exe.linux-arm64-musl@12.5.1': optional: true - '@pnpm/exe.win32-arm64@12.3.4': + '@pnpm/exe.linux-arm64@12.5.1': optional: true - '@pnpm/exe.win32-x64@12.3.4': + '@pnpm/exe.linux-ppc64@12.5.1': optional: true - pnpm@12.3.4: + '@pnpm/exe.linux-riscv64@12.5.1': + optional: true + + '@pnpm/exe.linux-s390x@12.5.1': + optional: true + + '@pnpm/exe.linux-x64-musl@12.5.1': + optional: true + + '@pnpm/exe.linux-x64@12.5.1': + optional: true + + '@pnpm/exe.win32-arm64@12.5.1': + optional: true + + '@pnpm/exe.win32-x64@12.5.1': + optional: true + + pnpm@12.5.1: optionalDependencies: - '@pnpm/exe.darwin-arm64': 12.3.4 - '@pnpm/exe.darwin-x64': 12.3.4 - '@pnpm/exe.linux-arm64': 12.3.4 - '@pnpm/exe.linux-arm64-musl': 12.3.4 - '@pnpm/exe.linux-x64': 12.3.4 - '@pnpm/exe.linux-x64-musl': 12.3.4 - '@pnpm/exe.win32-arm64': 12.3.4 - '@pnpm/exe.win32-x64': 12.3.4 + '@pnpm/exe.android-arm64': 12.5.1 + '@pnpm/exe.android-x64': 12.5.1 + '@pnpm/exe.darwin-arm64': 12.5.1 + '@pnpm/exe.darwin-x64': 12.5.1 + '@pnpm/exe.freebsd-x64': 12.5.1 + '@pnpm/exe.linux-arm64': 12.5.1 + '@pnpm/exe.linux-arm64-musl': 12.5.1 + '@pnpm/exe.linux-ppc64': 12.5.1 + '@pnpm/exe.linux-riscv64': 12.5.1 + '@pnpm/exe.linux-s390x': 12.5.1 + '@pnpm/exe.linux-x64': 12.5.1 + '@pnpm/exe.linux-x64-musl': 12.5.1 + '@pnpm/exe.win32-arm64': 12.5.1 + '@pnpm/exe.win32-x64': 12.5.1 --- lockfileVersion: '9.0' diff --git a/scripts/sync-pnpm-version b/scripts/sync-pnpm-version new file mode 100755 index 0000000000..e87cf17500 --- /dev/null +++ b/scripts/sync-pnpm-version @@ -0,0 +1,185 @@ +#!/usr/bin/env bash +# Sync the `packageManager` field of every first-party package.json to the +# system pnpm version. +# +# Only `pnpm` and `node` are required (plus registry access to resolve the +# integrity hash, unless --field is given). +# +# Run it from the repo root with the log redirected to a file (never pipe +# tool output through filters). + +set -euo pipefail + +usage() { + cat <<'EOF' +Usage: scripts/sync-pnpm-version [options] [version] + +Stamp every first-party package.json's `packageManager` field with the +system pnpm version (default: `pnpm --version`). + +Options: + --field FIELD Use FIELD verbatim, skip the registry lookup. + For tests and offline use. + --check Verify all fields match; do not write. Exit 1 on drift. + --install After stamping, run `pnpm install` in each workspace + root to refresh lockfile metadata. + --root DIR Scan DIR instead of the repo root. For tests. + -h, --help Show this help. + +external/ (vendored trees with their own lifecycles), .opencode/, +.pnpm-store/, bundles/ and docker build-context copies are never stamped. +EOF +} + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +FIELD="" +CHECK=0 +INSTALL=0 +VERSION="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --field) FIELD="$2"; shift 2 ;; + --field=*) FIELD="${1#--field=}"; shift ;; + --check) CHECK=1; shift ;; + --install) INSTALL=1; shift ;; + --root) ROOT="$2"; shift 2 ;; + --root=*) ROOT="${1#--root=}"; shift ;; + -h | --help) usage; exit 0 ;; + -*) { + echo "error: unknown option: $1" >&2 + usage >&2 + exit 64 + } ;; + *) + if [[ -n "$VERSION" ]]; then + echo "error: only one version argument allowed" >&2 + usage >&2 + exit 64 + fi + VERSION="$1"; shift ;; + esac +done + +if [[ -z "$FIELD" ]]; then + if [[ -z "$VERSION" ]]; then + VERSION="$(pnpm --version | tr -d '[:space:]')" + fi + if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-.+)?$ ]]; then + echo "error: invalid pnpm version: $VERSION" >&2 + exit 64 + fi + # Same value `npm view pnpm@ dist.integrity` returns; pnpm is the one + # tool guaranteed to exist everywhere, so no npm needed. + integrity="$(pnpm view "pnpm@${VERSION}" dist.integrity | tr -d '[:space:]')" + b64="${integrity#sha512-}" + if ! [[ "$b64" =~ ^[A-Za-z0-9+/=]+$ ]]; then + echo "error: unexpected integrity for pnpm@${VERSION}: ${integrity}" >&2 + exit 1 + fi + # node ships with every pnpm, so no python3 needed for base64 -> hex. + hex="$(node -p "Buffer.from('${b64}','base64').toString('hex')")" + FIELD="pnpm@${VERSION}+sha512.${hex}" +fi + +cd "$ROOT" + +# Same exclusions as scripts/clean-node-modules, plus build-context copies +# (bundles/, docker/images/bundle-*) which builds regenerate from the +# stamped sources. +mapfile -t files < <( + find . \ + \( -name .git -o -name node_modules -o -name .pnpm-store \ + -o -name external -o -name .opencode -o -name bundles \ + -o -name .angular \) -type d -prune \ + -o -path './docker/images/bundle-*' -prune \ + -o -name package.json -type f -print | sort +) + +if [[ ${#files[@]} -eq 0 ]]; then + echo "error: no package.json files found under $ROOT" >&2 + exit 1 +fi + +# Stamp one file with node: replaces only the packageManager value when the +# key exists (indent, key order and the rest stay byte-identical), else +# inserts the key after "name" using the file's own indent. Prints +# "updated " / "unchanged " / "missing " / "mismatch ". +stamp_one() { + node -e ' + const fs = require("fs"); + const [file, field, check] = process.argv.slice(1); + const raw = fs.readFileSync(file, "utf8"); + const data = JSON.parse(raw); + const rel = file.replace(/^\.\//, ""); + if (data.packageManager === field) { + console.log(`unchanged ${rel}`); + } else if (check === "1") { + console.log(`${data.packageManager === undefined ? "missing" : "mismatch"} ${rel}`); + process.exit(3); + } else { + let out; + const valueRe = /("packageManager"\s*:\s*")[^"]*(")/; + if (valueRe.test(raw)) { + out = raw.replace(valueRe, `$1${field}$2`); + } else { + const anchor = raw.match(/^(\s*)"(name|version)"\s*:\s*"[^"]*",\s*$/m); + if (!anchor) { + console.error(`error: cannot find insertion point in ${rel}`); + process.exit(1); + } + out = raw.replace( + anchor[0], + `${anchor[0]}\n${anchor[1]}"packageManager": "${field}",` + ); + } + JSON.parse(out); // refuse to write invalid JSON + fs.writeFileSync(file, out); + console.log(`updated ${rel}`); + } + ' "$1" "$FIELD" "$CHECK" +} + +failures=0 +updated=0 +unchanged=0 +for file in "${files[@]}"; do + if [[ "$CHECK" -eq 1 ]]; then + if stamp_one "$file"; then + unchanged=$((unchanged + 1)) + else + rc=$? + if [[ "$rc" -eq 3 ]]; then + failures=$((failures + 1)) + else + exit "$rc" + fi + fi + else + if [[ "$(stamp_one "$file")" == updated* ]]; then + updated=$((updated + 1)) + else + unchanged=$((unchanged + 1)) + fi + fi +done + +if [[ "$CHECK" -eq 1 ]]; then + if [[ "$failures" -gt 0 ]]; then + echo "check failed: ${failures} file(s) differ from ${FIELD}" >&2 + exit 1 + fi + echo "all ${unchanged} package.json files match ${FIELD}" + exit 0 +fi + +echo "stamped ${FIELD}: ${updated} updated, ${unchanged} unchanged" + +if [[ "$INSTALL" -eq 1 ]]; then + # The 11 pnpm workspaces: repo root plus one per module. Members resolve + # through their parent workspace lockfile, so no per-member install. + for dir in . backend common docs exporter frontend library mcp media-processor plugins render-wasm; do + echo "--- pnpm install in ${dir}" + (cd "$dir" && pnpm install) + done +fi diff --git a/scripts/test_sync_pnpm_version.py b/scripts/test_sync_pnpm_version.py new file mode 100644 index 0000000000..889250f433 --- /dev/null +++ b/scripts/test_sync_pnpm_version.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +"""Tests for scripts/sync-pnpm-version. + +Run with: + + python3 scripts/test_sync_pnpm_version.py + +Covers stamping the `packageManager` field across a package.json tree: +stale values get updated, missing fields get inserted, formatting of each +file is preserved (only the stamped line may change), --check reports +drift without writing, and stamping is idempotent. +""" + +import json +import pathlib +import shutil +import subprocess +import sys +import tempfile +import unittest + +# Loading scripts/sync-pnpm-version via subprocess; no bytecode emitted. +sys.dont_write_bytecode = True + +SCRIPT_PATH = pathlib.Path(__file__).resolve().parent / "sync-pnpm-version" + +FIELD = "pnpm@99.0.0+sha512." + "ab" * 64 + + +def run_script(*args): + """Run the script, returning the CompletedProcess.""" + return subprocess.run( + ["bash", str(SCRIPT_PATH), *args], + capture_output=True, + text=True, + ) + + +def make_fixture(root): + """Build a 3-file tree: stale value, already synced, missing field.""" + stale = root / "stale" + stale.mkdir() + (stale / "package.json").write_text( + '{\n' + ' "name": "stale",\n' + ' "version": "1.0.0",\n' + ' "private": true,\n' + ' "packageManager": "pnpm@10.0.0+sha512.' + "00" * 64 + '",\n' + ' "scripts": {\n' + ' "test": "echo ok"\n' + ' }\n' + '}\n' + ) + synced = root / "synced" + synced.mkdir() + # 4-space indent on purpose: the stamp must not reformat the file. + (synced / "package.json").write_text( + '{\n' + ' "name": "synced",\n' + ' "version": "1.0.0",\n' + f' "packageManager": "{FIELD}"\n' + '}\n' + ) + missing = root / "missing" + missing.mkdir() + (missing / "package.json").write_text( + '{\n' + ' "name": "missing",\n' + ' "version": "1.0.0",\n' + ' "scripts": {\n' + ' "test": "echo ok"\n' + ' }\n' + '}\n' + ) + return stale, synced, missing + + +class SyncPnpmVersionTests(unittest.TestCase): + def setUp(self): + self.tmp = pathlib.Path(tempfile.mkdtemp(prefix="sync-pnpm-")) + self.stale, self.synced, self.missing = make_fixture(self.tmp) + self.synced_before = (self.synced / "package.json").read_bytes() + + def tearDown(self): + shutil.rmtree(self.tmp, ignore_errors=True) + + def stamp(self, *extra): + return run_script("--root", str(self.tmp), "--field", FIELD, *extra) + + def read(self, path): + return (path / "package.json").read_text() + + def test_stamp_updates_stale_inserts_missing_keeps_synced(self): + proc = self.stamp() + self.assertEqual(proc.returncode, 0, proc.stderr) + + stale_lines = self.read(self.stale).splitlines() + self.assertIn(f' "packageManager": "{FIELD}",', stale_lines) + data = json.loads(self.read(self.stale)) + self.assertEqual(data["packageManager"], FIELD) + # Only the packageManager line changed in the stale file. + self.assertEqual(len(stale_lines), 9) + + # The already-synced file is byte-identical (indent preserved). + self.assertEqual( + (self.synced / "package.json").read_bytes(), self.synced_before + ) + + # The missing field was inserted; the file stays valid JSON. + data = json.loads(self.read(self.missing)) + self.assertEqual(data["packageManager"], FIELD) + self.assertEqual(data["name"], "missing") + + def test_check_passes_once_synced(self): + self.assertEqual(self.stamp().returncode, 0) + proc = self.stamp("--check") + self.assertEqual(proc.returncode, 0, proc.stdout + proc.stderr) + + def test_check_fails_on_drift_without_writing(self): + self.assertEqual(self.stamp().returncode, 0) + before = (self.stale / "package.json").read_bytes() + (self.stale / "package.json").write_text( + self.read(self.stale).replace(FIELD, "pnpm@1.0.0+sha512." + "ff" * 64) + ) + proc = self.stamp("--check") + self.assertNotEqual(proc.returncode, 0) + self.assertIn("stale/package.json", proc.stdout + proc.stderr) + # --check must not write: reverting the tamper restores a pass. + (self.stale / "package.json").write_bytes(before) + self.assertEqual(self.stamp("--check").returncode, 0) + + def test_check_reports_missing_field(self): + proc = self.stamp("--check") + self.assertNotEqual(proc.returncode, 0) + self.assertIn("missing/package.json", proc.stdout + proc.stderr) + + def test_stamp_is_idempotent(self): + self.assertEqual(self.stamp().returncode, 0) + first = { + p: (self.tmp / p / "package.json").read_bytes() + for p in ("stale", "synced", "missing") + } + second = self.stamp() + self.assertEqual(second.returncode, 0, second.stderr) + for name, content in first.items(): + self.assertEqual( + (self.tmp / name / "package.json").read_bytes(), content + ) + + +if __name__ == "__main__": + unittest.main()