diff --git a/packages/server/package.json b/packages/server/package.json index 289b7c2..46e1616 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -17,6 +17,7 @@ "test:profiles": "node test/profiles-smoke.js" }, "dependencies": { + "@jerapah-flow/shared": "workspace:*", "@aws-sdk/client-s3": "^3.1111.0", "@aws-sdk/s3-request-presigner": "^3.1111.0", "@fastify/cookie": "^11.0.2", diff --git a/packages/server/profile-config.js b/packages/server/profile-config.js index 1be3c9d..2607783 100644 --- a/packages/server/profile-config.js +++ b/packages/server/profile-config.js @@ -1,31 +1 @@ -/** - * Shallow merge: step overlay keys replace profile defaults (including ""). - * Nested objects/arrays are replaced, not deep-merged. - * - * @param {unknown} profileConfig - * @param {unknown} stepConfig - * @returns {Record} - */ -export function mergeProfileConfig(profileConfig, stepConfig) { - const base = - profileConfig != null && typeof profileConfig === "object" && !Array.isArray(profileConfig) - ? { ...profileConfig } - : {}; - if (stepConfig == null || typeof stepConfig !== "object" || Array.isArray(stepConfig)) { - return base; - } - return { ...base, ...stepConfig }; -} - -/** - * @param {unknown} config - * @returns {boolean} - */ -export function configHasOverlay(config) { - return ( - config != null && - typeof config === "object" && - !Array.isArray(config) && - Object.keys(config).length > 0 - ); -} +export { mergeProfileConfig, configHasOverlay } from "@jerapah-flow/shared"; diff --git a/packages/server/registry.js b/packages/server/registry.js index 670332c..24c81d0 100644 --- a/packages/server/registry.js +++ b/packages/server/registry.js @@ -31,7 +31,7 @@ import { sendSuccessPage, } from "./http-trigger-auth.js"; import { resolveConfigRefs } from "./config-refs.js"; -import { mergeProfileConfig } from "./profile-config.js"; +import { HTTP_METHODS, hasWorkflowTrigger, mergeProfileConfig } from "@jerapah-flow/shared"; import { getProfilePlain } from "./profiles-store.js"; import { buildFailureAlertData, @@ -46,17 +46,6 @@ import { ensureInitialRevision } from "./workflow-history.js"; */ const MAX_WORKFLOW_TRIGGER_DEPTH = 8; -const HTTP_METHODS = ["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE"]; - -/** - * @param {unknown} workflow - */ -function hasWorkflowTrigger(workflow) { - if (!workflow || typeof workflow !== "object") return false; - const triggers = /** @type {{ triggers?: Array<{ type?: string }> }} */ (workflow) - .triggers; - return (triggers ?? []).some((t) => t?.type === "workflow"); -} /** * @param {import("fastify").FastifyInstance} server diff --git a/packages/server/step-result.js b/packages/server/step-result.js index af7084f..958f81a 100644 --- a/packages/server/step-result.js +++ b/packages/server/step-result.js @@ -2,12 +2,9 @@ * Step return contract: `{ output, context?, skipRemaining? }`. */ -/** - * @param {unknown} value - */ -export function isPlainObject(value) { - return value != null && typeof value === "object" && !Array.isArray(value); -} +import { isPlainObject } from "@jerapah-flow/shared"; + +export { isPlainObject }; /** * @param {unknown} value diff --git a/packages/server/workflow-duplicate.js b/packages/server/workflow-duplicate.js index d540b40..d7ae641 100644 --- a/packages/server/workflow-duplicate.js +++ b/packages/server/workflow-duplicate.js @@ -1,36 +1,14 @@ import yaml from "yaml"; +import { + ensureWorkflowFilename, + suggestCopyFilename, +} from "@jerapah-flow/shared"; import { newWorkflowFilename, workflowFileStem, } from "./workflow-normalize.js"; -export function ensureWorkflowFilename(file) { - const trimmed = String(file ?? "").trim(); - if (!trimmed) return ""; - return /\.ya?ml$/i.test(trimmed) ? trimmed : `${trimmed}.yaml`; -} - -/** - * Legacy human-readable copy name (kept for UI hints). - * @param {string} file - * @param {string[]} existingFiles - */ -export function suggestCopyFilename(file, existingFiles = []) { - const name = ensureWorkflowFilename(file) || "workflow.yaml"; - const match = name.match(/^(.*?)(\.ya?ml)$/i); - const base = match ? match[1] : name; - const ext = match ? match[2] : ".yaml"; - const existing = new Set(existingFiles); - - const copyMatch = base.match(/^(.*)-copy(?:-(\d+))?$/); - const root = copyMatch ? copyMatch[1] : base; - const candidate = (i) => - i <= 1 ? `${root}-copy${ext}` : `${root}-copy-${i}${ext}`; - - let n = copyMatch ? Number(copyMatch[2] || 1) + 1 : 1; - while (existing.has(candidate(n))) n += 1; - return candidate(n); -} +export { ensureWorkflowFilename, suggestCopyFilename }; /** * UUID-based duplicate filename (default for new duplicates). diff --git a/packages/server/workflow-parse.js b/packages/server/workflow-parse.js index 2cb0fc9..dd26e4a 100644 --- a/packages/server/workflow-parse.js +++ b/packages/server/workflow-parse.js @@ -1,4 +1,5 @@ import jsonata from "jsonata"; +export { namespacedPath } from "@jerapah-flow/shared"; export const SET_STEP_SCRIPT = "set"; @@ -68,16 +69,6 @@ export async function evaluateJsonata(source, ctx) { return await result; } -/** - * Resolve an HTTP path under the owner namespace: /notify -> /u/alice/notify - * @param {string} owner - * @param {string} triggerPath - */ -export function namespacedPath(owner, triggerPath) { - const cleaned = String(triggerPath).replace(/^\/+/, ""); - return `/u/${owner}/${cleaned}`; -} - /** * @param {unknown} step * @returns {ParsedStep} diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 0000000..750c271 --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,9 @@ +{ + "name": "@jerapah-flow/shared", + "version": "0.1.0", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.js" + } +} diff --git a/packages/shared/src/index.js b/packages/shared/src/index.js new file mode 100644 index 0000000..aba8437 --- /dev/null +++ b/packages/shared/src/index.js @@ -0,0 +1,4 @@ +export { isPlainObject } from "./is-plain-object.js"; +export { mergeProfileConfig, configHasOverlay } from "./profile-config.js"; +export { ensureWorkflowFilename, suggestCopyFilename } from "./workflow-filename.js"; +export { HTTP_METHODS, namespacedPath, hasWorkflowTrigger } from "./workflow-path.js"; diff --git a/packages/shared/src/is-plain-object.js b/packages/shared/src/is-plain-object.js new file mode 100644 index 0000000..d8a3835 --- /dev/null +++ b/packages/shared/src/is-plain-object.js @@ -0,0 +1,3 @@ +export function isPlainObject(value) { + return value != null && typeof value === "object" && !Array.isArray(value); +} diff --git a/packages/shared/src/profile-config.js b/packages/shared/src/profile-config.js new file mode 100644 index 0000000..1be3c9d --- /dev/null +++ b/packages/shared/src/profile-config.js @@ -0,0 +1,31 @@ +/** + * Shallow merge: step overlay keys replace profile defaults (including ""). + * Nested objects/arrays are replaced, not deep-merged. + * + * @param {unknown} profileConfig + * @param {unknown} stepConfig + * @returns {Record} + */ +export function mergeProfileConfig(profileConfig, stepConfig) { + const base = + profileConfig != null && typeof profileConfig === "object" && !Array.isArray(profileConfig) + ? { ...profileConfig } + : {}; + if (stepConfig == null || typeof stepConfig !== "object" || Array.isArray(stepConfig)) { + return base; + } + return { ...base, ...stepConfig }; +} + +/** + * @param {unknown} config + * @returns {boolean} + */ +export function configHasOverlay(config) { + return ( + config != null && + typeof config === "object" && + !Array.isArray(config) && + Object.keys(config).length > 0 + ); +} diff --git a/packages/shared/src/workflow-filename.js b/packages/shared/src/workflow-filename.js new file mode 100644 index 0000000..158ba6d --- /dev/null +++ b/packages/shared/src/workflow-filename.js @@ -0,0 +1,27 @@ +export function ensureWorkflowFilename(file) { + const trimmed = String(file ?? "").trim(); + if (!trimmed) return ""; + return /\.ya?ml$/i.test(trimmed) ? trimmed : `${trimmed}.yaml`; +} + +/** + * Legacy human-readable copy name (kept for UI hints). + * @param {string} file + * @param {string[]} existingFiles + */ +export function suggestCopyFilename(file, existingFiles = []) { + const name = ensureWorkflowFilename(file) || "workflow.yaml"; + const match = name.match(/^(.*?)(\.ya?ml)$/i); + const base = match ? match[1] : name; + const ext = match ? match[2] : ".yaml"; + const existing = new Set(existingFiles); + + const copyMatch = base.match(/^(.*)-copy(?:-(\d+))?$/); + const root = copyMatch ? copyMatch[1] : base; + const candidate = (i) => + i <= 1 ? `${root}-copy${ext}` : `${root}-copy-${i}${ext}`; + + let n = copyMatch ? Number(copyMatch[2] || 1) + 1 : 1; + while (existing.has(candidate(n))) n += 1; + return candidate(n); +} diff --git a/packages/shared/src/workflow-path.js b/packages/shared/src/workflow-path.js new file mode 100644 index 0000000..9a6a7bd --- /dev/null +++ b/packages/shared/src/workflow-path.js @@ -0,0 +1,13 @@ +export const HTTP_METHODS = ["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]; + +export function namespacedPath(owner, triggerPath) { + const cleaned = String(triggerPath ?? "").replace(/^\/+/, "").trim(); + return `/u/${owner}/${cleaned}`; +} + +export function hasWorkflowTrigger(workflow) { + if (!workflow || typeof workflow !== "object") return false; + const triggers = workflow.triggers; + if (!Array.isArray(triggers)) return false; + return triggers.some((t) => String(t?.type ?? "").toLowerCase() === "workflow"); +} diff --git a/packages/web/package.json b/packages/web/package.json index 64e7136..2417f74 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -9,6 +9,7 @@ "preview": "vite preview" }, "dependencies": { + "@jerapah-flow/shared": "workspace:*", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", diff --git a/packages/web/src/lib/profile.js b/packages/web/src/lib/profile.js index 28a1bb9..2607783 100644 --- a/packages/web/src/lib/profile.js +++ b/packages/web/src/lib/profile.js @@ -1,16 +1 @@ -export function mergeProfileConfig(base, overlay) { - const a = base && typeof base === "object" && !Array.isArray(base) ? { ...base } : {}; - if (overlay == null || typeof overlay !== "object" || Array.isArray(overlay)) { - return a; - } - return { ...a, ...overlay }; -} - -export function configHasOverlay(config) { - return ( - config != null && - typeof config === "object" && - !Array.isArray(config) && - Object.keys(config).length > 0 - ); -} +export { mergeProfileConfig, configHasOverlay } from "@jerapah-flow/shared"; diff --git a/packages/web/src/lib/script.js b/packages/web/src/lib/script.js index 34fd33e..b29069e 100644 --- a/packages/web/src/lib/script.js +++ b/packages/web/src/lib/script.js @@ -1,3 +1,5 @@ +import { isPlainObject } from "@jerapah-flow/shared"; + export const NEW_SCRIPT_TEMPLATE = `async function main(ctx) { return { output: ctx.data ?? null, context: ctx.context ?? {} }; } @@ -72,10 +74,6 @@ export function prettyJson(value) { } } -function isPlainObject(value) { - return value != null && typeof value === "object" && !Array.isArray(value); -} - function defaultsFromFields(fields) { if (!isPlainObject(fields)) return {}; /** @type {Record} */ diff --git a/packages/web/src/lib/workflow-doc.js b/packages/web/src/lib/workflow-doc.js index 300f4f4..ed024aa 100644 --- a/packages/web/src/lib/workflow-doc.js +++ b/packages/web/src/lib/workflow-doc.js @@ -1,7 +1,13 @@ import { parse as parseYaml, stringify as stringifyYaml } from "yaml"; +import { + HTTP_METHODS, + namespacedPath, + hasWorkflowTrigger, +} from "@jerapah-flow/shared"; const KNOWN_TOP = new Set(["name", "description", "enabled", "scripts", "triggers"]); -const HTTP_METHODS = ["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]; + +export { HTTP_METHODS, namespacedPath, hasWorkflowTrigger }; export const NEW_WORKFLOW_YAML = `name: new workflow scripts: @@ -19,13 +25,6 @@ export function nextUiId(prefix = "ui") { return `${prefix}-${uidSeq}-${Math.random().toString(36).slice(2, 8)}`; } -export function namespacedPath(owner, triggerPath) { - const cleaned = String(triggerPath ?? "") - .replace(/^\/+/, "") - .trim(); - return `/u/${owner}/${cleaned}`; -} - /** * @param {string} text * @returns {{ doc: WorkflowDoc | null, parseError: string | null }} @@ -162,10 +161,6 @@ export function newWorkflowTrigger() { }; } -export function hasWorkflowTrigger(workflow) { - return (workflow?.triggers ?? []).some((t) => String(t?.type ?? "").toLowerCase() === "workflow"); -} - export function triggerDestinations(workflows, { owner, excludeFile } = {}) { return (workflows ?? []).filter((w) => { if (owner && w.owner !== owner) return false; @@ -174,8 +169,6 @@ export function triggerDestinations(workflows, { owner, excludeFile } = {}) { }); } -export { HTTP_METHODS }; - function readOnFailureWorkflow(raw) { return typeof raw?.onFailureWorkflow === "string" ? raw.onFailureWorkflow : ""; } diff --git a/packages/web/src/lib/workflow-test-storage.js b/packages/web/src/lib/workflow-test-storage.js index 06d1c44..04d2a60 100644 --- a/packages/web/src/lib/workflow-test-storage.js +++ b/packages/web/src/lib/workflow-test-storage.js @@ -1,13 +1,11 @@ +import { isPlainObject } from "@jerapah-flow/shared"; + const PREFIX = "jerapah-flow.workflowTestData:"; export function workflowTestStorageKey(owner, file) { return `${PREFIX}${owner}/${file}`; } -function isPlainObject(value) { - return value != null && typeof value === "object" && !Array.isArray(value); -} - /** Overlay saved test JSON on the schema/YAML seed. Stored object keys win. */ export function overlayWorkflowTestData(seed, stored) { const base = isPlainObject(seed) ? seed : {}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7d815a..d45e309 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,9 +28,12 @@ importers: '@fastify/static': specifier: ^8.2.0 version: 8.3.0 + '@jerapah-flow/shared': + specifier: workspace:* + version: link:../shared axios: specifier: ^1.19.0 - version: 1.19.0 + version: 1.19.0(debug@4.3.4(supports-color@7.2.0))(supports-color@7.2.0) basic-ftp: specifier: ^6.2.0 version: 6.2.0 @@ -42,19 +45,19 @@ importers: version: 13.0.3 bullmq: specifier: ^6.1.2 - version: 6.1.2(ioredis@6.0.0) + version: 6.1.2(ioredis@6.0.0(supports-color@7.2.0)) fastify: specifier: ^5.12.0 version: 5.12.0 ioredis: specifier: ^6.0.0 - version: 6.0.0 + version: 6.0.0(supports-color@7.2.0) jsonata: specifier: ^2.2.2 version: 2.2.2 knex: specifier: ^3.3.0 - version: 3.3.0(better-sqlite3@13.0.3) + version: 3.3.0(better-sqlite3@13.0.3)(supports-color@7.2.0) mustache: specifier: ^4.2.0 version: 4.2.0 @@ -75,7 +78,7 @@ importers: version: 4.0.0 pm2: specifier: ^6.0.13 - version: 6.0.14 + version: 6.0.14(supports-color@7.2.0) rss-parser: specifier: ^3.13.0 version: 3.13.0 @@ -89,6 +92,8 @@ importers: specifier: ^2.9.0 version: 2.9.0 + packages/shared: {} + packages/web: dependencies: '@dnd-kit/core': @@ -100,6 +105,9 @@ importers: '@dnd-kit/utilities': specifier: ^3.2.2 version: 3.2.2(react@19.2.8) + '@jerapah-flow/shared': + specifier: workspace:* + version: link:../shared '@monaco-editor/react': specifier: ^4.7.0 version: 4.7.0(monaco-editor@0.56.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -111,7 +119,7 @@ importers: version: 2.0.0-alpha.43(@babel/runtime@8.0.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) axios: specifier: ^1.11.0 - version: 1.19.0 + version: 1.19.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) cronstrue: specifier: ^3.24.0 version: 3.24.0 @@ -139,7 +147,7 @@ importers: version: 4.3.3(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) '@vitejs/plugin-react': specifier: ^5.0.0 - version: 5.2.0(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) + version: 5.2.0(supports-color@7.2.0)(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) daisyui: specifier: ^5.0.50 version: 5.7.16 @@ -621,6 +629,7 @@ packages: engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] + libc: [glibc] '@nodable/entities@3.0.0': resolution: {integrity: sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==} @@ -684,66 +693,79 @@ packages: resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.62.4': resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.62.4': resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.62.4': resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.62.4': resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.62.4': resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.62.4': resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.62.4': resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.62.4': resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.62.4': resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.62.4': resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.62.4': resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.62.4': resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.62.4': resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} @@ -837,24 +859,28 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.3.3': resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.3.3': resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.3.3': resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.3.3': resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} @@ -2062,24 +2088,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -3044,20 +3074,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@7.2.0) '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3082,19 +3112,19 @@ snapshots: '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@7.2.0)': dependencies: - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@7.2.0) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/helper-module-imports': 7.29.7(supports-color@7.2.0) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -3115,14 +3145,14 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@7.2.0))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@7.2.0) '@babel/helper-plugin-utils': 7.29.7 '@babel/runtime@8.0.0': {} @@ -3133,7 +3163,7 @@ snapshots: '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - '@babel/traverse@7.29.8': + '@babel/traverse@7.29.8(supports-color@7.2.0)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 @@ -3141,7 +3171,7 @@ snapshots: '@babel/parser': 7.29.8 '@babel/template': 7.29.7 '@babel/types': 7.29.8 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -3394,18 +3424,18 @@ snapshots: '@pinojs/redact@0.4.0': {} - '@pm2/agent@2.1.1': + '@pm2/agent@2.1.1(supports-color@7.2.0)': dependencies: async: 3.2.6 chalk: 3.0.0 dayjs: 1.8.36 - debug: 4.3.4 + debug: 4.3.4(supports-color@7.2.0) eventemitter2: 5.0.1 fast-json-patch: 3.1.1 fclone: 1.0.11 - pm2-axon: 4.0.1 - pm2-axon-rpc: 0.7.1 - proxy-agent: 6.4.0 + pm2-axon: 4.0.1(supports-color@7.2.0) + pm2-axon-rpc: 0.7.1(supports-color@7.2.0) + proxy-agent: 6.4.0(supports-color@7.2.0) semver: 7.5.4 ws: 7.5.13 transitivePeerDependencies: @@ -3415,12 +3445,12 @@ snapshots: '@pm2/blessed@0.1.81': {} - '@pm2/io@6.1.0': + '@pm2/io@6.1.0(supports-color@7.2.0)': dependencies: async: 2.6.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@7.2.0) eventemitter2: 6.4.9 - require-in-the-middle: 5.2.0 + require-in-the-middle: 5.2.0(supports-color@7.2.0) semver: 7.5.4 shimmer: 1.2.1 signal-exit: 3.0.7 @@ -3428,21 +3458,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@pm2/js-api@0.8.1': + '@pm2/js-api@0.8.1(supports-color@7.2.0)': dependencies: async: 2.6.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@7.2.0) eventemitter2: 6.4.9 - extrareqp2: 1.0.0(debug@4.3.4) + extrareqp2: 1.0.0(debug@4.3.4(supports-color@7.2.0)) ws: 8.21.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@pm2/pm2-version-check@1.0.4': + '@pm2/pm2-version-check@1.0.4(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -3789,11 +3819,11 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vitejs/plugin-react@5.2.0(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': + '@vitejs/plugin-react@5.2.0(supports-color@7.2.0)(vite@7.3.6(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@7.2.0) + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@7.2.0)) '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 @@ -3803,9 +3833,9 @@ snapshots: abstract-logging@2.0.1: {} - agent-base@6.0.2: + agent-base@6.0.2(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -3875,11 +3905,21 @@ snapshots: '@fastify/error': 4.2.0 fastq: 1.20.1 - axios@1.19.0: + axios@1.19.0(debug@4.3.4(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - follow-redirects: 1.16.0(debug@4.3.4) + follow-redirects: 1.16.0(debug@4.3.4(supports-color@7.2.0)) form-data: 4.0.6 - https-proxy-agent: 5.0.1 + https-proxy-agent: 5.0.1(supports-color@7.2.0) + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + axios@1.19.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): + dependencies: + follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) + form-data: 4.0.6 + https-proxy-agent: 5.0.1(supports-color@7.2.0) proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -3942,7 +3982,7 @@ snapshots: buildcheck@0.0.7: optional: true - bullmq@6.1.2(ioredis@6.0.0): + bullmq@6.1.2(ioredis@6.0.0(supports-color@7.2.0)): dependencies: cron-parser: 5.10.0 msgpackr: 2.0.5 @@ -3950,7 +3990,7 @@ snapshots: semver: 7.8.5 tslib: 2.8.1 optionalDependencies: - ioredis: 6.0.0 + ioredis: 6.0.0(supports-color@7.2.0) byte-length@1.0.2: {} @@ -4265,17 +4305,23 @@ snapshots: dayjs@1.8.36: {} - debug@3.2.7: + debug@3.2.7(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 - debug@4.3.4: + debug@4.3.4(supports-color@7.2.0): dependencies: ms: 2.1.2 + optionalDependencies: + supports-color: 7.2.0 - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 degenerator@5.0.1: dependencies: @@ -4424,9 +4470,9 @@ snapshots: eventemitter2@6.4.9: {} - extrareqp2@1.0.0(debug@4.3.4): + extrareqp2@1.0.0(debug@4.3.4(supports-color@7.2.0)): dependencies: - follow-redirects: 1.16.0(debug@4.3.4) + follow-redirects: 1.16.0(debug@4.3.4(supports-color@7.2.0)) transitivePeerDependencies: - debug @@ -4535,9 +4581,13 @@ snapshots: fast-querystring: 1.1.2 safe-regex2: 5.1.1 - follow-redirects@1.16.0(debug@4.3.4): + follow-redirects@1.16.0(debug@4.3.4(supports-color@7.2.0)): optionalDependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@7.2.0) + + follow-redirects@1.16.0(debug@4.4.3(supports-color@7.2.0)): + optionalDependencies: + debug: 4.4.3(supports-color@7.2.0) foreground-child@3.3.1: dependencies: @@ -4583,11 +4633,11 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 - get-uri@6.0.5: + get-uri@6.0.5(supports-color@7.2.0): dependencies: basic-ftp: 5.3.1 data-uri-to-buffer: 6.0.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4640,24 +4690,24 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - https-proxy-agent@5.0.1: + https-proxy-agent@5.0.1(supports-color@7.2.0): dependencies: - agent-base: 6.0.2 - debug: 4.4.3 + agent-base: 6.0.2(supports-color@7.2.0) + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4681,11 +4731,11 @@ snapshots: interpret@2.2.0: {} - ioredis@6.0.0: + ioredis@6.0.0(supports-color@7.2.0): dependencies: '@ioredis/commands': 2.0.0 cluster-key-slot: 1.1.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) denque: 2.1.0 redis-errors: 1.2.0 standard-as-callback: 2.1.0 @@ -4758,11 +4808,11 @@ snapshots: khroma@2.1.0: {} - knex@3.3.0(better-sqlite3@13.0.3): + knex@3.3.0(better-sqlite3@13.0.3)(supports-color@7.2.0): dependencies: colorette: 2.0.19 commander: 10.0.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@7.2.0) escalade: 3.2.0 esm: 3.2.25 get-package-type: 0.1.0 @@ -4960,9 +5010,9 @@ snapshots: nanoid@3.3.18: {} - needle@2.4.0: + needle@2.4.0(supports-color@7.2.0): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) iconv-lite: 0.4.24 sax: 1.6.1 transitivePeerDependencies: @@ -5010,16 +5060,16 @@ snapshots: on-exit-leak-free@2.1.2: {} - pac-proxy-agent@7.2.0: + pac-proxy-agent@7.2.0(supports-color@7.2.0): dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.3 - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + debug: 4.4.3(supports-color@7.2.0) + get-uri: 6.0.5(supports-color@7.2.0) + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 + socks-proxy-agent: 8.0.5(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -5091,17 +5141,17 @@ snapshots: sonic-boom: 4.2.1 thread-stream: 4.2.0 - pm2-axon-rpc@0.7.1: + pm2-axon-rpc@0.7.1(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color - pm2-axon@4.0.1: + pm2-axon@4.0.1(supports-color@7.2.0): dependencies: amp: 0.3.1 amp-message: 0.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) escape-string-regexp: 4.0.0 transitivePeerDependencies: - supports-color @@ -5115,10 +5165,10 @@ snapshots: dependencies: charm: 0.1.2 - pm2-sysmonit@1.2.8: + pm2-sysmonit@1.2.8(supports-color@7.2.0): dependencies: async: 3.2.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) pidusage: 2.0.21 systeminformation: 5.33.1 tx2: 1.0.5 @@ -5126,13 +5176,13 @@ snapshots: - supports-color optional: true - pm2@6.0.14: + pm2@6.0.14(supports-color@7.2.0): dependencies: - '@pm2/agent': 2.1.1 + '@pm2/agent': 2.1.1(supports-color@7.2.0) '@pm2/blessed': 0.1.81 - '@pm2/io': 6.1.0 - '@pm2/js-api': 0.8.1 - '@pm2/pm2-version-check': 1.0.4 + '@pm2/io': 6.1.0(supports-color@7.2.0) + '@pm2/js-api': 0.8.1(supports-color@7.2.0) + '@pm2/pm2-version-check': 1.0.4(supports-color@7.2.0) ansis: 4.0.0-node10 async: 3.2.6 chokidar: 3.6.0 @@ -5140,16 +5190,16 @@ snapshots: commander: 2.15.1 croner: 4.1.97 dayjs: 1.11.15 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) enquirer: 2.3.6 eventemitter2: 5.0.1 fclone: 1.0.11 js-yaml: 4.1.1 mkdirp: 1.0.4 - needle: 2.4.0 + needle: 2.4.0(supports-color@7.2.0) pidusage: 3.0.2 - pm2-axon: 4.0.1 - pm2-axon-rpc: 0.7.1 + pm2-axon: 4.0.1(supports-color@7.2.0) + pm2-axon-rpc: 0.7.1(supports-color@7.2.0) pm2-deploy: 1.0.2 pm2-multimeter: 0.1.2 promptly: 2.2.0 @@ -5158,7 +5208,7 @@ snapshots: sprintf-js: 1.1.2 vizion: 2.2.1 optionalDependencies: - pm2-sysmonit: 1.2.8 + pm2-sysmonit: 1.2.8(supports-color@7.2.0) transitivePeerDependencies: - bufferutil - supports-color @@ -5185,16 +5235,16 @@ snapshots: dependencies: read: 1.0.7 - proxy-agent@6.4.0: + proxy-agent@6.4.0(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + debug: 4.4.3(supports-color@7.2.0) + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 + pac-proxy-agent: 7.2.0(supports-color@7.2.0) proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 + socks-proxy-agent: 8.0.5(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -5259,9 +5309,9 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@5.2.0: + require-in-the-middle@5.2.0(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) module-details-from-path: 1.0.4 resolve: 1.22.12 transitivePeerDependencies: @@ -5378,10 +5428,10 @@ snapshots: smart-buffer@4.2.0: {} - socks-proxy-agent@8.0.5: + socks-proxy-agent@8.0.5(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) socks: 2.8.9 transitivePeerDependencies: - supports-color