@zuplo/cli 6.62.9 → 6.62.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,10 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { join, relative, resolve } from "node:path";
2
+ import { resolve } from "node:path";
3
3
  import { build as runBuild } from "@zuplo/core/cli";
4
4
  import { logger } from "../common/logger.js";
5
5
  import { ConsoleOutput, printDiagnosticsToConsole } from "../common/output.js";
6
6
  export async function build(argv) {
7
- const sourceDirectory = resolve(join(relative(process.cwd(), argv.dir)));
7
+ const sourceDirectory = resolve(argv.dir);
8
8
  const customDomain = argv.customDomain ?? undefined;
9
9
  const buildId = randomUUID();
10
10
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/build/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAO/E,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAe;IACzC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEzE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;IAEpD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC5B,OAAO;YACP,MAAM,EAAE,IAAI,aAAa,EAAE;YAC3B,eAAe;YACf,OAAO,EAAE,OAAO;YAChB,MAAM;YACN,IAAI,EAAE,YAAY;gBAChB,CAAC,CAAC;oBACE,GAAG,EAAE;wBACH,UAAU,EAAE,YAAY;wBACxB,IAAI,EAAE,CAAC,YAAY,CAAC;qBACrB;iBACF;gBACH,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yBAAyB,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { join, relative, resolve } from \"node:path\";\nimport { build as runBuild } from \"@zuplo/core/cli\";\nimport { logger } from \"../common/logger.js\";\nimport { ConsoleOutput, printDiagnosticsToConsole } from \"../common/output.js\";\n\nexport interface Arguments {\n dir: string;\n customDomain?: string;\n}\n\nexport async function build(argv: Arguments) {\n const sourceDirectory = resolve(join(relative(process.cwd(), argv.dir)));\n\n const customDomain = argv.customDomain ?? undefined;\n\n const buildId = randomUUID();\n\n try {\n const result = await runBuild({\n buildId,\n output: new ConsoleOutput(),\n sourceDirectory,\n command: \"build\",\n logger,\n urls: customDomain\n ? {\n api: {\n defaultUrl: customDomain,\n urls: [customDomain],\n },\n }\n : undefined,\n });\n if (result.status === \"Failed\") {\n process.exit(1);\n } else {\n process.exit();\n }\n } catch (err) {\n printDiagnosticsToConsole(`Build error occurred: ${err.message}`);\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/build/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAO/E,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAe;IACzC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;IAEpD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC5B,OAAO;YACP,MAAM,EAAE,IAAI,aAAa,EAAE;YAC3B,eAAe;YACf,OAAO,EAAE,OAAO;YAChB,MAAM;YACN,IAAI,EAAE,YAAY;gBAChB,CAAC,CAAC;oBACE,GAAG,EAAE;wBACH,UAAU,EAAE,YAAY;wBACxB,IAAI,EAAE,CAAC,YAAY,CAAC;qBACrB;iBACF;gBACH,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yBAAyB,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { resolve } from \"node:path\";\nimport { build as runBuild } from \"@zuplo/core/cli\";\nimport { logger } from \"../common/logger.js\";\nimport { ConsoleOutput, printDiagnosticsToConsole } from \"../common/output.js\";\n\nexport interface Arguments {\n dir: string;\n customDomain?: string;\n}\n\nexport async function build(argv: Arguments) {\n const sourceDirectory = resolve(argv.dir);\n\n const customDomain = argv.customDomain ?? undefined;\n\n const buildId = randomUUID();\n\n try {\n const result = await runBuild({\n buildId,\n output: new ConsoleOutput(),\n sourceDirectory,\n command: \"build\",\n logger,\n urls: customDomain\n ? {\n api: {\n defaultUrl: customDomain,\n urls: [customDomain],\n },\n }\n : undefined,\n });\n if (result.status === \"Failed\") {\n process.exit(1);\n } else {\n process.exit();\n }\n } catch (err) {\n printDiagnosticsToConsole(`Build error occurred: ${err.message}`);\n }\n}\n"]}
@@ -1,13 +1,13 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { cpSync, existsSync, readFileSync } from "node:fs";
3
- import { join, relative, resolve } from "node:path";
3
+ import { join, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import dotenv from "dotenv";
6
6
  import { logger } from "../common/logger.js";
7
7
  import { ConsoleOutput, printCriticalFailureToConsoleAndExit, printDiagnosticsToConsole, printResultToConsoleAndExitGracefully, } from "../common/output.js";
8
8
  import { handleRuntimeStdio } from "../common/worker-output.js";
9
9
  export async function compile(argv) {
10
- const sourceDirectory = resolve(join(relative(process.cwd(), argv.dir)));
10
+ const sourceDirectory = resolve(argv.dir);
11
11
  const zuploRuntimePath = new URL("../../node_modules/@zuplo/runtime", import.meta.url);
12
12
  if (existsSync(zuploRuntimePath)) {
13
13
  cpSync(zuploRuntimePath, join(sourceDirectory, "node_modules/@zuplo/runtime"), {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/compile/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,aAAa,EACb,oCAAoC,EACpC,yBAAyB,EACzB,qCAAqC,GACtC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAUhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAe;IAC3C,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAMzE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,mCAAmC,EACnC,MAAM,CAAC,IAAI,CAAC,GAAG,CAChB,CAAC;IACF,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,MAAM,CACJ,gBAAgB,EAChB,IAAI,CAAC,eAAe,EAAE,6BAA6B,CAAC,EACpD;YACE,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI;SAClB,CACF,CAAC;IACJ,CAAC;IAID,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,aAAa,CAChD,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAC/C,CAAC;IAGF,IAAI,QAAQ,GAA6B,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC5C,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAMD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,oBAAoB,CAAC;YAC9B,OAAO;YACP,MAAM,EAAE,IAAI,aAAa,EAAE;YAC3B,eAAe;YACf,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;YAC/B,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;YAC/B,+BAA+B,EAAE,QAAQ;gBACvC,CAAC,CAAC;oBAEE,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;oBAE/C,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;oBAE/C,sBAAsB,EAAE,QAAQ,CAAC,sBAAsB;iBACxD;gBACH,CAAC;oBACC,SAAS;YACb,MAAM;YACN,kBAAkB;SACnB,CAAC,CAAC;QAEH,yBAAyB,CAAC,yCAAyC,CAAC,CAAC;QACrE,MAAM,qCAAqC,CACzC,8BAA8B,eAAe,SAAS,IAAI,CAAC,aAAa,CAAC,EAAE,CAC5E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,oCAAoC,CACxC,kCAAkC,CACnC,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { cpSync, existsSync, readFileSync } from \"node:fs\";\nimport { join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport dotenv from \"dotenv\";\nimport { logger } from \"../common/logger.js\";\nimport {\n ConsoleOutput,\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../common/output.js\";\nimport { handleRuntimeStdio } from \"../common/worker-output.js\";\n\nexport interface Arguments {\n dir: string;\n \"bundled-dir\": string;\n port: number;\n \"binary-name\": string;\n \"build-id\": string;\n}\n\nexport async function compile(argv: Arguments) {\n const sourceDirectory = resolve(join(relative(process.cwd(), argv.dir)));\n\n // When we build, we MIGHT need to use the @zuplo/runtime from the node_modules if the user\n // has installed our packages using https://www.npmjs.com/package/zuplo in a global directory\n\n // Try to copy the @zuplo/runtime locally\n const zuploRuntimePath = new URL(\n \"../../node_modules/@zuplo/runtime\",\n import.meta.url\n );\n if (existsSync(zuploRuntimePath)) {\n cpSync(\n zuploRuntimePath,\n join(sourceDirectory, \"node_modules/@zuplo/runtime\"),\n {\n recursive: true,\n dereference: true,\n }\n );\n }\n\n // Set GLOBAL_MODULE_LOCATION to the location of the CLIs node_modules\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.GLOBAL_MODULE_LOCATION = fileURLToPath(\n new URL(\"../../node_modules\", import.meta.url)\n );\n\n // Check if the user has a .env.zuplo file\n let envZuplo: dotenv.DotenvParseOutput = {};\n const envZuploFile = join(sourceDirectory, \".env.zuplo\");\n if (existsSync(envZuploFile)) {\n const contents = readFileSync(envZuploFile);\n envZuplo = dotenv.parse(contents);\n }\n // Set other variables using __ZUPLO_CONFIG as necessary\n // const config = {\n // };\n // process.env.__ZUPLO_CONFIG = btoa(JSON.stringify(config));\n // Use a dynamic import so that setting process.env has effect\n const core = await import(\"@zuplo/core/cli\");\n\n const zupPort = argv.port;\n\n const buildId = argv[\"build-id\"] || randomUUID();\n\n try {\n await core.compileWorkerdServer({\n buildId,\n output: new ConsoleOutput(),\n sourceDirectory,\n bundledDir: argv[\"bundled-dir\"],\n port: zupPort,\n binaryName: argv[\"binary-name\"],\n publicZuploEnvironmentVariables: envZuplo\n ? {\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_ACCOUNT_NAME: envZuplo.ZUPLO_ACCOUNT_NAME,\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_PROJECT_NAME: envZuplo.ZUPLO_PROJECT_NAME,\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_ENVIRONMENT_TYPE: envZuplo.ZUPLO_ENVIRONMENT_TYPE,\n }\n : // Leave this as undefined to simulate the old behavior\n undefined,\n logger,\n handleRuntimeStdio,\n });\n\n printDiagnosticsToConsole(\"šŸ“¦ Compiled a self-contained zup binary\");\n await printResultToConsoleAndExitGracefully(\n `The binary is available at ${sourceDirectory}/dist/${argv[\"binary-name\"]}`\n );\n } catch (err) {\n printDiagnosticsToConsole(err.message);\n await printCriticalFailureToConsoleAndExit(\n \"Failed to compile the zup binary\"\n );\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/compile/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,aAAa,EACb,oCAAoC,EACpC,yBAAyB,EACzB,qCAAqC,GACtC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAUhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAe;IAC3C,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAM1C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,mCAAmC,EACnC,MAAM,CAAC,IAAI,CAAC,GAAG,CAChB,CAAC;IACF,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,MAAM,CACJ,gBAAgB,EAChB,IAAI,CAAC,eAAe,EAAE,6BAA6B,CAAC,EACpD;YACE,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI;SAClB,CACF,CAAC;IACJ,CAAC;IAID,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,aAAa,CAChD,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAC/C,CAAC;IAGF,IAAI,QAAQ,GAA6B,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC5C,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAMD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,oBAAoB,CAAC;YAC9B,OAAO;YACP,MAAM,EAAE,IAAI,aAAa,EAAE;YAC3B,eAAe;YACf,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;YAC/B,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;YAC/B,+BAA+B,EAAE,QAAQ;gBACvC,CAAC,CAAC;oBAEE,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;oBAE/C,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;oBAE/C,sBAAsB,EAAE,QAAQ,CAAC,sBAAsB;iBACxD;gBACH,CAAC;oBACC,SAAS;YACb,MAAM;YACN,kBAAkB;SACnB,CAAC,CAAC;QAEH,yBAAyB,CAAC,yCAAyC,CAAC,CAAC;QACrE,MAAM,qCAAqC,CACzC,8BAA8B,eAAe,SAAS,IAAI,CAAC,aAAa,CAAC,EAAE,CAC5E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,oCAAoC,CACxC,kCAAkC,CACnC,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { cpSync, existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport dotenv from \"dotenv\";\nimport { logger } from \"../common/logger.js\";\nimport {\n ConsoleOutput,\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../common/output.js\";\nimport { handleRuntimeStdio } from \"../common/worker-output.js\";\n\nexport interface Arguments {\n dir: string;\n \"bundled-dir\": string;\n port: number;\n \"binary-name\": string;\n \"build-id\": string;\n}\n\nexport async function compile(argv: Arguments) {\n const sourceDirectory = resolve(argv.dir);\n\n // When we build, we MIGHT need to use the @zuplo/runtime from the node_modules if the user\n // has installed our packages using https://www.npmjs.com/package/zuplo in a global directory\n\n // Try to copy the @zuplo/runtime locally\n const zuploRuntimePath = new URL(\n \"../../node_modules/@zuplo/runtime\",\n import.meta.url\n );\n if (existsSync(zuploRuntimePath)) {\n cpSync(\n zuploRuntimePath,\n join(sourceDirectory, \"node_modules/@zuplo/runtime\"),\n {\n recursive: true,\n dereference: true,\n }\n );\n }\n\n // Set GLOBAL_MODULE_LOCATION to the location of the CLIs node_modules\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.GLOBAL_MODULE_LOCATION = fileURLToPath(\n new URL(\"../../node_modules\", import.meta.url)\n );\n\n // Check if the user has a .env.zuplo file\n let envZuplo: dotenv.DotenvParseOutput = {};\n const envZuploFile = join(sourceDirectory, \".env.zuplo\");\n if (existsSync(envZuploFile)) {\n const contents = readFileSync(envZuploFile);\n envZuplo = dotenv.parse(contents);\n }\n // Set other variables using __ZUPLO_CONFIG as necessary\n // const config = {\n // };\n // process.env.__ZUPLO_CONFIG = btoa(JSON.stringify(config));\n // Use a dynamic import so that setting process.env has effect\n const core = await import(\"@zuplo/core/cli\");\n\n const zupPort = argv.port;\n\n const buildId = argv[\"build-id\"] || randomUUID();\n\n try {\n await core.compileWorkerdServer({\n buildId,\n output: new ConsoleOutput(),\n sourceDirectory,\n bundledDir: argv[\"bundled-dir\"],\n port: zupPort,\n binaryName: argv[\"binary-name\"],\n publicZuploEnvironmentVariables: envZuplo\n ? {\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_ACCOUNT_NAME: envZuplo.ZUPLO_ACCOUNT_NAME,\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_PROJECT_NAME: envZuplo.ZUPLO_PROJECT_NAME,\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_ENVIRONMENT_TYPE: envZuplo.ZUPLO_ENVIRONMENT_TYPE,\n }\n : // Leave this as undefined to simulate the old behavior\n undefined,\n logger,\n handleRuntimeStdio,\n });\n\n printDiagnosticsToConsole(\"šŸ“¦ Compiled a self-contained zup binary\");\n await printResultToConsoleAndExitGracefully(\n `The binary is available at ${sourceDirectory}/dist/${argv[\"binary-name\"]}`\n );\n } catch (err) {\n printDiagnosticsToConsole(err.message);\n await printCriticalFailureToConsoleAndExit(\n \"Failed to compile the zup binary\"\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/convert/handler.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS,iBAqC5C"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/convert/handler.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS,iBAoC5C"}
@@ -1,14 +1,13 @@
1
1
  import { writeFileSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
- import { join, relative } from "node:path";
3
+ import { join, resolve } from "node:path";
4
4
  import { format } from "prettier";
5
5
  import { logger } from "../common/logger.js";
6
6
  import { printCriticalFailureToConsoleAndExit } from "../common/output.js";
7
7
  import { convertPolicies, convertRoutes } from "./engine.js";
8
8
  export async function convert(argv) {
9
9
  try {
10
- const dir = argv.dir;
11
- const normalizedDir = join(relative(process.cwd(), dir));
10
+ const normalizedDir = resolve(argv.dir);
12
11
  const rawRoutes = await readFile(join(normalizedDir, "config", "routes.json"));
13
12
  const routes = JSON.parse(rawRoutes.toString());
14
13
  const openApi = convertRoutes(routes);
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/convert/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO7D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAe;IAC3C,IAAI,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,CAAC,CAC7C,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAoB,CAAC;QAGnE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAGtC,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACzE,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QACH,aAAa,CAAC,eAAe,EAAE,gBAAgB,EAAE;YAC/C,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;QAGH,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAGzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QACxE,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;YAC/D,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QACH,aAAa,CAAC,gBAAgB,EAAE,iBAAiB,EAAE;YACjD,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,oCAAoC,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC","sourcesContent":["import { writeFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { format } from \"prettier\";\nimport { logger } from \"../common/logger.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../common/output.js\";\nimport { convertPolicies, convertRoutes } from \"./engine.js\";\nimport { RouteConfigFile } from \"./routes.legacy.js\";\n\nexport interface Arguments {\n dir: string;\n}\n\nexport async function convert(argv: Arguments) {\n try {\n // 1. Read the routes.json\n const dir = argv.dir;\n const normalizedDir = join(relative(process.cwd(), dir));\n const rawRoutes = await readFile(\n join(normalizedDir, \"config\", \"routes.json\")\n );\n const routes = JSON.parse(rawRoutes.toString()) as RouteConfigFile;\n\n // 2. Convert to OpenAPI\n const openApi = convertRoutes(routes);\n\n // 3. Write to routes.oas.json\n const openAPIFilePath = join(normalizedDir, \"config\", \"routes.oas.json\");\n const formattedOpenAPI = await format(JSON.stringify(openApi), {\n parser: \"json-stringify\",\n });\n writeFileSync(openAPIFilePath, formattedOpenAPI, {\n flag: \"w\",\n });\n\n // 4. Extract policies\n const policies = convertPolicies(routes);\n\n // 5. Write policies\n const policiesFilePath = join(normalizedDir, \"config\", \"policies.json\");\n const formattedPolicies = await format(JSON.stringify(policies), {\n parser: \"json-stringify\",\n });\n writeFileSync(policiesFilePath, formattedPolicies, {\n flag: \"w\",\n });\n } catch (err) {\n logger.error(err);\n await printCriticalFailureToConsoleAndExit(err);\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/convert/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,oCAAoC,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO7D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAe;IAC3C,IAAI,CAAC;QAEH,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,CAAC,CAC7C,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAoB,CAAC;QAGnE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAGtC,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACzE,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QACH,aAAa,CAAC,eAAe,EAAE,gBAAgB,EAAE;YAC/C,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;QAGH,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAGzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QACxE,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;YAC/D,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QACH,aAAa,CAAC,gBAAgB,EAAE,iBAAiB,EAAE;YACjD,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,MAAM,oCAAoC,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC","sourcesContent":["import { writeFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { format } from \"prettier\";\nimport { logger } from \"../common/logger.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../common/output.js\";\nimport { convertPolicies, convertRoutes } from \"./engine.js\";\nimport { RouteConfigFile } from \"./routes.legacy.js\";\n\nexport interface Arguments {\n dir: string;\n}\n\nexport async function convert(argv: Arguments) {\n try {\n // 1. Read the routes.json\n const normalizedDir = resolve(argv.dir);\n const rawRoutes = await readFile(\n join(normalizedDir, \"config\", \"routes.json\")\n );\n const routes = JSON.parse(rawRoutes.toString()) as RouteConfigFile;\n\n // 2. Convert to OpenAPI\n const openApi = convertRoutes(routes);\n\n // 3. Write to routes.oas.json\n const openAPIFilePath = join(normalizedDir, \"config\", \"routes.oas.json\");\n const formattedOpenAPI = await format(JSON.stringify(openApi), {\n parser: \"json-stringify\",\n });\n writeFileSync(openAPIFilePath, formattedOpenAPI, {\n flag: \"w\",\n });\n\n // 4. Extract policies\n const policies = convertPolicies(routes);\n\n // 5. Write policies\n const policiesFilePath = join(normalizedDir, \"config\", \"policies.json\");\n const formattedPolicies = await format(JSON.stringify(policies), {\n parser: \"json-stringify\",\n });\n writeFileSync(policiesFilePath, formattedPolicies, {\n flag: \"w\",\n });\n } catch (err) {\n logger.error(err);\n await printCriticalFailureToConsoleAndExit(err);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/deploy/archive.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAS3C,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS;;;;;;;GA6D5C;AAID,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,OA2BzD;AAeD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS;;;;GAmErD"}
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/deploy/archive.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAS3C,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS;;;;;;;GA4D5C;AAID,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,OA2BzD;AAeD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,SAAS;;;;GAmErD"}
@@ -1,7 +1,7 @@
1
1
  import { randomBytes } from "node:crypto";
2
2
  import { existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
- import { join, relative, sep } from "node:path";
4
+ import { join, relative, resolve, sep } from "node:path";
5
5
  import ignore from "ignore";
6
6
  import { minimatch } from "minimatch";
7
7
  import { simpleGit } from "simple-git";
@@ -17,9 +17,8 @@ function createTempFileWithSuffix(suffix = ARCHIVE_EXTENSION) {
17
17
  }
18
18
  export async function archive(argv) {
19
19
  const tarball = createTempFileWithSuffix();
20
- const dir = argv.dir;
21
- const ignoreFn = createIgnoreFunction(dir);
22
- const normalizedDir = join(relative(process.cwd(), dir));
20
+ const ignoreFn = createIgnoreFunction(argv.dir);
21
+ const normalizedDir = resolve(argv.dir);
23
22
  const metadata = await prepareDeployerMetadata(argv);
24
23
  await tar.create({
25
24
  gzip: true,
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/deploy/archive.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport {\n Stats,\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join, relative, sep } from \"node:path\";\nimport ignore from \"ignore\";\nimport { minimatch } from \"minimatch\";\nimport { simpleGit } from \"simple-git\";\nimport * as tar from \"tar\";\nimport { DEPLOYER_METADATA_FILE } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { Arguments } from \"./handler.js\";\n\nexport const ARCHIVE_EXTENSION = \".tar.gz\";\n\nfunction createTempFileWithSuffix(suffix = ARCHIVE_EXTENSION) {\n const tempDir = tmpdir();\n const randomName = randomBytes(16).toString(\"hex\");\n const tempFilePath = join(tempDir, `${randomName}${suffix}`);\n return tempFilePath;\n}\n\nexport async function archive(argv: Arguments) {\n const tarball = createTempFileWithSuffix();\n const dir = argv.dir;\n const ignoreFn = createIgnoreFunction(dir);\n const normalizedDir = join(relative(process.cwd(), dir));\n\n const metadata = await prepareDeployerMetadata(argv);\n\n await tar.create(\n {\n gzip: true,\n file: tarball,\n filter: (path, stat) => {\n const stats = stat as unknown as Stats;\n const normalizedPath = stats.isDirectory()\n ? join(relative(process.cwd(), path), sep) // add / to help the ignore module determine that this is a folder\n : join(relative(process.cwd(), path));\n\n // special case to allow for processing of the root by tar (./)\n if (minimatch(normalizedPath, \"/\", { windowsPathsNoEscape: true })) {\n return true;\n }\n\n if (\n minimatch(normalizedPath, \".zuplo/\", { windowsPathsNoEscape: true })\n ) {\n // Need to return true to allow this to process the entries of the directory\n return true;\n }\n\n if (\n minimatch(normalizedPath, `.zuplo/${DEPLOYER_METADATA_FILE}`, {\n windowsPathsNoEscape: true,\n })\n ) {\n // Now on the second round when it enters the .zuplo folder, we specifically look for this file\n return true;\n }\n\n // We special case the .env files to allow for the self-hosted endpoint to be passed in\n if (normalizedPath === \".env\" || normalizedPath === \".env.zuplo\") {\n if (argv[\"self-hosted-endpoint\"]) {\n return true;\n }\n }\n\n const result = ignoreFn.ignores(normalizedPath);\n logger.trace(`${normalizedPath} ignored: ${result}`);\n\n // The way `tar` interprets true|false is \"opposite\" from ignore\n // When ignore returns true, it means that the .ignore file doesn't want it.\n // When tar return true, it means that we want it.\n return !result;\n },\n },\n [normalizedDir]\n );\n return {\n tarball,\n metadata,\n };\n}\n\n// Note that we do not recursively create an ignore function for each dir\n// We only create one for the top-level of the directory\nexport function createIgnoreFunction(normalizedDir: string) {\n // Most ignore files forget to ignore the .git directory\n\n // Need to do this conversion because of some weird confusion with the d.ts for ignore package in esm\n // biome-ignore lint/suspicious/noExplicitAny: Migrated from ESLint\n const baseIgnore = (ignore as any)().add(\".git/\");\n\n if (existsSync(`${normalizedDir}/.zupignore`)) {\n const zupignorePath = `${normalizedDir}/.zupignore`;\n logger.debug(`Using ${zupignorePath} to filter out files`);\n return baseIgnore.add(readFileSync(zupignorePath).toString());\n } else if (existsSync(`${normalizedDir}/.gitignore`)) {\n const gitignorePath = `${normalizedDir}/.gitignore`;\n logger.debug(`Using ${gitignorePath} to filter out files`);\n const gitIgnoreContent = readFileSync(gitignorePath).toString();\n // @NOTE - we should always include the .zuplo folder\n const gitIgnoreContentDotZuploRemoved = gitIgnoreContent.replace(\n /\\.zuplo[/]/,\n \"\"\n );\n return baseIgnore.add(gitIgnoreContentDotZuploRemoved);\n } else {\n logger.debug(\n \"Didn't find a .gitignore or .zupignore file. Defaulting to ignoring .git and node_modules.\"\n );\n return baseIgnore.add(\"node_modules/\");\n }\n}\n\ninterface DeployerMetadata {\n branch: string;\n repoUrl: string | undefined;\n sha: string | undefined;\n}\n\nasync function prepareDeployerMetadata(argv: Arguments) {\n const dir = argv.dir;\n const metadata = await generateMetadata(argv);\n await writeGeneratedMetadata(dir, metadata);\n return metadata;\n}\n\nexport async function generateMetadata(argv: Arguments) {\n const dir = argv.dir;\n const git = simpleGit({ baseDir: dir });\n\n const isRepo = await git.checkIsRepo();\n let branch: string;\n if (argv.environment) {\n branch = argv.environment;\n } else if (isRepo) {\n // Get the current branch from Git\n const status = await git.status();\n if (!status.current) {\n throw new Error(\"Invalid state: Directory is in detached head state.\");\n }\n branch = status.current.trim();\n\n // @NOTE - gitlab returns HEAD as the current branch when running git.status()\n // https://forum.gitlab.com/t/why-i-cant-get-the-branch-name/72462/6\n if (branch === \"HEAD\") {\n // Fetch remote branches to ensure the latest information\n await git.fetch([\"--all\"]);\n\n const branchCommit = await git.branch([\"-a\"]);\n const brancheRef = await git.branch([\n \"-r\",\n \"--contains\",\n branchCommit.current,\n ]);\n if (brancheRef?.all?.[0]) {\n const originBranch = brancheRef.all[0];\n const cleanOriginBranch = originBranch.replace(/^origin\\//, \"\");\n if (!cleanOriginBranch) {\n throw new Error(\n \"Invalid state: Directory is in detached head state.\"\n );\n }\n branch = cleanOriginBranch.trim();\n }\n }\n } else {\n throw new Error(\n \"The argument `environment` is required when not in a git repository.\"\n );\n }\n\n // Get the current sha\n let sha: string | undefined;\n let repoUrl: string | undefined;\n if (argv[\"override-repo-url\"]) {\n repoUrl = argv[\"override-repo-url\"];\n } else if (isRepo) {\n sha = (await git.revparse([\"HEAD\"])).trim();\n try {\n repoUrl = (await git.listRemote([\"--get-url\"])).trim();\n } catch {\n logger.debug(\n \"Failed to get the remote URL from the git repository. This can happen if there is no remote configured.\"\n );\n repoUrl = undefined;\n }\n }\n\n return {\n branch,\n repoUrl,\n sha,\n };\n}\n\nasync function writeGeneratedMetadata(dir: string, metadata: DeployerMetadata) {\n try {\n mkdirSync(join(dir, \".zuplo\"));\n } catch (err) {\n if (err.code === \"EEXIST\") {\n // this is fine, which means that we don't create it and move on\n } else {\n throw err;\n }\n }\n writeFileSync(\n join(dir, \".zuplo\", DEPLOYER_METADATA_FILE),\n JSON.stringify(metadata, null, 2),\n {\n flag: \"w\",\n }\n );\n}\n"]}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/deploy/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAEL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C,SAAS,wBAAwB,CAAC,MAAM,GAAG,iBAAiB;IAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;IACzB,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC,CAAC;IAC7D,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAe;IAC3C,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,GAAG,CAAC,MAAM,CACd;QACE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,IAAwB,CAAC;YACvC,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,EAAE;gBACxC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;gBAC1C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YAGxC,IAAI,SAAS,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBACnE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IACE,SAAS,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,EACpE,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IACE,SAAS,CAAC,cAAc,EAAE,UAAU,sBAAsB,EAAE,EAAE;gBAC5D,oBAAoB,EAAE,IAAI;aAC3B,CAAC,EACF,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC;YAGD,IAAI,cAAc,KAAK,MAAM,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;gBACjE,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;oBACjC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,aAAa,MAAM,EAAE,CAAC,CAAC;YAKrD,OAAO,CAAC,MAAM,CAAC;QACjB,CAAC;KACF,EACD,CAAC,aAAa,CAAC,CAChB,CAAC;IACF,OAAO;QACL,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,oBAAoB,CAAC,aAAqB;IAKxD,MAAM,UAAU,GAAI,MAAc,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAElD,IAAI,UAAU,CAAC,GAAG,aAAa,aAAa,CAAC,EAAE,CAAC;QAC9C,MAAM,aAAa,GAAG,GAAG,aAAa,aAAa,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,SAAS,aAAa,sBAAsB,CAAC,CAAC;QAC3D,OAAO,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,UAAU,CAAC,GAAG,aAAa,aAAa,CAAC,EAAE,CAAC;QACrD,MAAM,aAAa,GAAG,GAAG,aAAa,aAAa,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,SAAS,aAAa,sBAAsB,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEhE,MAAM,+BAA+B,GAAG,gBAAgB,CAAC,OAAO,CAC9D,YAAY,EACZ,EAAE,CACH,CAAC;QACF,OAAO,UAAU,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CACV,4FAA4F,CAC7F,CAAC;QACF,OAAO,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAQD,KAAK,UAAU,uBAAuB,CAAC,IAAe;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAe;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,MAAc,CAAC;IACnB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAElB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAI/B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAEtB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAE3B,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;gBAClC,IAAI;gBACJ,YAAY;gBACZ,YAAY,CAAC,OAAO;aACrB,CAAC,CAAC;YACH,IAAI,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvC,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAChE,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CACb,qDAAqD,CACtD,CAAC;gBACJ,CAAC;gBACD,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAGD,IAAI,GAAuB,CAAC;IAC5B,IAAI,OAA2B,CAAC;IAChC,IAAI,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,KAAK,CACV,yGAAyG,CAC1G,CAAC;YACF,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,GAAW,EAAE,QAA0B;IAC3E,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAE5B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,sBAAsB,CAAC,EAC3C,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC;QACE,IAAI,EAAE,GAAG;KACV,CACF,CAAC;AACJ,CAAC","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport {\n Stats,\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join, relative, resolve, sep } from \"node:path\";\nimport ignore from \"ignore\";\nimport { minimatch } from \"minimatch\";\nimport { simpleGit } from \"simple-git\";\nimport * as tar from \"tar\";\nimport { DEPLOYER_METADATA_FILE } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { Arguments } from \"./handler.js\";\n\nexport const ARCHIVE_EXTENSION = \".tar.gz\";\n\nfunction createTempFileWithSuffix(suffix = ARCHIVE_EXTENSION) {\n const tempDir = tmpdir();\n const randomName = randomBytes(16).toString(\"hex\");\n const tempFilePath = join(tempDir, `${randomName}${suffix}`);\n return tempFilePath;\n}\n\nexport async function archive(argv: Arguments) {\n const tarball = createTempFileWithSuffix();\n const ignoreFn = createIgnoreFunction(argv.dir);\n const normalizedDir = resolve(argv.dir);\n\n const metadata = await prepareDeployerMetadata(argv);\n\n await tar.create(\n {\n gzip: true,\n file: tarball,\n filter: (path, stat) => {\n const stats = stat as unknown as Stats;\n const normalizedPath = stats.isDirectory()\n ? join(relative(process.cwd(), path), sep) // add / to help the ignore module determine that this is a folder\n : join(relative(process.cwd(), path));\n\n // special case to allow for processing of the root by tar (./)\n if (minimatch(normalizedPath, \"/\", { windowsPathsNoEscape: true })) {\n return true;\n }\n\n if (\n minimatch(normalizedPath, \".zuplo/\", { windowsPathsNoEscape: true })\n ) {\n // Need to return true to allow this to process the entries of the directory\n return true;\n }\n\n if (\n minimatch(normalizedPath, `.zuplo/${DEPLOYER_METADATA_FILE}`, {\n windowsPathsNoEscape: true,\n })\n ) {\n // Now on the second round when it enters the .zuplo folder, we specifically look for this file\n return true;\n }\n\n // We special case the .env files to allow for the self-hosted endpoint to be passed in\n if (normalizedPath === \".env\" || normalizedPath === \".env.zuplo\") {\n if (argv[\"self-hosted-endpoint\"]) {\n return true;\n }\n }\n\n const result = ignoreFn.ignores(normalizedPath);\n logger.trace(`${normalizedPath} ignored: ${result}`);\n\n // The way `tar` interprets true|false is \"opposite\" from ignore\n // When ignore returns true, it means that the .ignore file doesn't want it.\n // When tar return true, it means that we want it.\n return !result;\n },\n },\n [normalizedDir]\n );\n return {\n tarball,\n metadata,\n };\n}\n\n// Note that we do not recursively create an ignore function for each dir\n// We only create one for the top-level of the directory\nexport function createIgnoreFunction(normalizedDir: string) {\n // Most ignore files forget to ignore the .git directory\n\n // Need to do this conversion because of some weird confusion with the d.ts for ignore package in esm\n // biome-ignore lint/suspicious/noExplicitAny: Migrated from ESLint\n const baseIgnore = (ignore as any)().add(\".git/\");\n\n if (existsSync(`${normalizedDir}/.zupignore`)) {\n const zupignorePath = `${normalizedDir}/.zupignore`;\n logger.debug(`Using ${zupignorePath} to filter out files`);\n return baseIgnore.add(readFileSync(zupignorePath).toString());\n } else if (existsSync(`${normalizedDir}/.gitignore`)) {\n const gitignorePath = `${normalizedDir}/.gitignore`;\n logger.debug(`Using ${gitignorePath} to filter out files`);\n const gitIgnoreContent = readFileSync(gitignorePath).toString();\n // @NOTE - we should always include the .zuplo folder\n const gitIgnoreContentDotZuploRemoved = gitIgnoreContent.replace(\n /\\.zuplo[/]/,\n \"\"\n );\n return baseIgnore.add(gitIgnoreContentDotZuploRemoved);\n } else {\n logger.debug(\n \"Didn't find a .gitignore or .zupignore file. Defaulting to ignoring .git and node_modules.\"\n );\n return baseIgnore.add(\"node_modules/\");\n }\n}\n\ninterface DeployerMetadata {\n branch: string;\n repoUrl: string | undefined;\n sha: string | undefined;\n}\n\nasync function prepareDeployerMetadata(argv: Arguments) {\n const dir = argv.dir;\n const metadata = await generateMetadata(argv);\n await writeGeneratedMetadata(dir, metadata);\n return metadata;\n}\n\nexport async function generateMetadata(argv: Arguments) {\n const dir = argv.dir;\n const git = simpleGit({ baseDir: dir });\n\n const isRepo = await git.checkIsRepo();\n let branch: string;\n if (argv.environment) {\n branch = argv.environment;\n } else if (isRepo) {\n // Get the current branch from Git\n const status = await git.status();\n if (!status.current) {\n throw new Error(\"Invalid state: Directory is in detached head state.\");\n }\n branch = status.current.trim();\n\n // @NOTE - gitlab returns HEAD as the current branch when running git.status()\n // https://forum.gitlab.com/t/why-i-cant-get-the-branch-name/72462/6\n if (branch === \"HEAD\") {\n // Fetch remote branches to ensure the latest information\n await git.fetch([\"--all\"]);\n\n const branchCommit = await git.branch([\"-a\"]);\n const brancheRef = await git.branch([\n \"-r\",\n \"--contains\",\n branchCommit.current,\n ]);\n if (brancheRef?.all?.[0]) {\n const originBranch = brancheRef.all[0];\n const cleanOriginBranch = originBranch.replace(/^origin\\//, \"\");\n if (!cleanOriginBranch) {\n throw new Error(\n \"Invalid state: Directory is in detached head state.\"\n );\n }\n branch = cleanOriginBranch.trim();\n }\n }\n } else {\n throw new Error(\n \"The argument `environment` is required when not in a git repository.\"\n );\n }\n\n // Get the current sha\n let sha: string | undefined;\n let repoUrl: string | undefined;\n if (argv[\"override-repo-url\"]) {\n repoUrl = argv[\"override-repo-url\"];\n } else if (isRepo) {\n sha = (await git.revparse([\"HEAD\"])).trim();\n try {\n repoUrl = (await git.listRemote([\"--get-url\"])).trim();\n } catch {\n logger.debug(\n \"Failed to get the remote URL from the git repository. This can happen if there is no remote configured.\"\n );\n repoUrl = undefined;\n }\n }\n\n return {\n branch,\n repoUrl,\n sha,\n };\n}\n\nasync function writeGeneratedMetadata(dir: string, metadata: DeployerMetadata) {\n try {\n mkdirSync(join(dir, \".zuplo\"));\n } catch (err) {\n if (err.code === \"EEXIST\") {\n // this is fine, which means that we don't create it and move on\n } else {\n throw err;\n }\n }\n writeFileSync(\n join(dir, \".zuplo\", DEPLOYER_METADATA_FILE),\n JSON.stringify(metadata, null, 2),\n {\n flag: \"w\",\n }\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
- import { join, relative } from "node:path";
2
+ import { join, resolve } from "node:path";
3
3
  import { MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH, ZUPLO_SYSTEM_ENV_VAR, } from "../common/constants.js";
4
4
  import { logger } from "../common/logger.js";
5
5
  import { printCriticalFailureToConsoleAndExit, printDiagnosticsToConsole, printResultToConsoleAndExitGracefully, printSpinnerToConsole, printWarningToConsole, } from "../common/output.js";
@@ -159,8 +159,7 @@ To fix this, check that the project, ${argv.project} exists and this api-key has
159
159
  }
160
160
  }
161
161
  function retrieveExistingZuploEnv(argv) {
162
- const dir = argv.dir;
163
- const normalizedDir = join(relative(process.cwd(), dir));
162
+ const normalizedDir = resolve(argv.dir);
164
163
  const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);
165
164
  if (existsSync(envFilePath)) {
166
165
  const envFileContent = readFileSync(envFilePath, "utf-8");
@@ -172,8 +171,7 @@ function retrieveExistingZuploEnv(argv) {
172
171
  }
173
172
  function restoreExistingZuploEnvAsNecessary(argv, originalValue) {
174
173
  if (originalValue) {
175
- const dir = argv.dir;
176
- const normalizedDir = join(relative(process.cwd(), dir));
174
+ const normalizedDir = resolve(argv.dir);
177
175
  const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);
178
176
  writeFileSync(envFilePath, originalValue);
179
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/deploy/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport {\n MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH,\n ZUPLO_SYSTEM_ENV_VAR,\n} from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n printSpinnerToConsole,\n printWarningToConsole,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { RequiredProperties } from \"../common/utils/types.js\";\nimport { normalizeUrl } from \"../common/utils/urls.js\";\nimport { pullSystemConfig } from \"../common/populate.js\";\nimport { archive, generateMetadata } from \"./archive.js\";\nimport {\n UnableToAutoLinkToExistingProject,\n retrieveOrCreateEnvironment,\n} from \"./environments.js\";\nimport { upload } from \"./file-upload.js\";\nimport { pollBuild, pollDeployment } from \"./poll-deployment.js\";\n\nexport interface Arguments {\n account: string;\n project: string;\n dir: string;\n environment?: string;\n authToken: string;\n \"verify-remote\"?: boolean;\n \"self-hosted-endpoint\"?: string;\n \"override-repo-url\"?: string;\n}\n\nexport type SelfHostedArgs = RequiredProperties<\n Arguments,\n \"self-hosted-endpoint\"\n>;\n\nexport async function deploy(argv: Arguments) {\n if (argv[\"self-hosted-endpoint\"]) {\n const args = argv as SelfHostedArgs;\n await deployToSelfHosted(args);\n } else {\n await deployToSaas(argv);\n }\n}\n\nasync function deployToSaas(argv: Arguments) {\n // 1. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata.tarball}`);\n\n // 2. Build uploadUrl request\n const { account, project } = argv;\n\n const payload = {\n accountName: account,\n projectName: project,\n environment: archiveMetadata.metadata.branch,\n repositoryUrl: archiveMetadata.metadata.repoUrl,\n sha: archiveMetadata.metadata.sha,\n };\n\n const uploadUrlResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/source-url`,\n {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: JSON.stringify(payload),\n }\n );\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n // 3. Upload to request URL\n const { uploadUrl, deploymentId } = await uploadUrlResponse.json();\n\n const uploadResponse = await upload({\n tarballPath: archiveMetadata.tarball,\n uploadUrl,\n deploymentId,\n ...payload,\n });\n\n logger.debug(`Upload response: ${uploadResponse.status}`);\n\n if (uploadResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the '${payload.environment}' environment to '${project}' on account '${account}'...`\n );\n\n const { url, logUrl } = await pollDeployment(\n argv,\n deploymentId,\n account,\n project,\n spinner\n );\n if (url) {\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${url}`,\n spinner\n );\n } else {\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the environment ${\n archiveMetadata.metadata.branch\n } to project ${project} on account ${account}.\\nDeployment ID: ${deploymentId}\\nFor more information, check the deployment logs in the Zuplo dashboard.\\n\n ${logUrl}`,\n spinner\n );\n }\n } else {\n logger.error(\n {\n status: uploadResponse.status,\n statusText: uploadResponse.statusText,\n },\n \"Failed to upload source to cloud storage\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to upload deployment source. Please try again.\"\n );\n }\n } else {\n logger.error(\n {\n status: uploadUrlResponse.status,\n statusText: uploadUrlResponse.statusText,\n },\n \"Failed to retrieve uploadUrl\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload deployment source. Please try again.\"\n );\n }\n}\n\nasync function deployToSelfHosted(argv: SelfHostedArgs) {\n const { account, project } = argv;\n\n let existingZuploEnv: string | undefined;\n\n try {\n // 0. Finagle the URL first\n const endpoint = normalizeUrl(argv[\"self-hosted-endpoint\"]);\n\n // 1. Perform the link on-behalf-of-the-user\n // Store the current .env.zuplo if there is one and restore it later\n existingZuploEnv = retrieveExistingZuploEnv(argv);\n const branch = (await generateMetadata(argv)).branch;\n try {\n const environmentToAutoLink = await retrieveOrCreateEnvironment(\n branch,\n argv\n );\n await pullSystemConfig({\n dir: argv.dir,\n environment: environmentToAutoLink.name,\n authToken: argv.authToken,\n });\n } catch (error) {\n if (\n error instanceof UnableToAutoLinkToExistingProject &&\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS\n ) {\n printWarningToConsole(\n `We are unable to fetch the environment variables from Zuplo for this project. \nDeployment will proceed because ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS is set. \nHowever, the environment variables will not be available. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n } else if (error instanceof UnableToAutoLinkToExistingProject) {\n await printCriticalFailureToConsoleAndExit(\n `We are unable to fetch the environment variables from Zuplo for this project. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.\nIf you want to force deployment without the environment variables, set ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS to true.`\n );\n } else {\n logger.error(error, \"Failed to fetch environment variables\");\n await printCriticalFailureToConsoleAndExit(\n `We are unable to fetch the environment variables from Zuplo for this project. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n }\n }\n\n // 2. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata.tarball}`);\n\n // 3. Build uploadUrl request\n const form = new FormData();\n const deploymentName = `${project}-${getPrettyBranch(\n archiveMetadata.metadata.branch\n )}`;\n form.set(\n \"file\",\n new Blob([readFileSync(archiveMetadata.tarball)], {\n type: \"application/gzip\",\n })\n );\n form.set(\"projectName\", project);\n form.set(\"deploymentName\", deploymentName);\n\n const uploadUrlResponse = await fetch(`${endpoint}/v1/deployments/build`, {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: form,\n });\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the current branch ${archiveMetadata.metadata.branch} to project ${project} on account ${account}...`\n );\n\n // 4. Poll for build\n const { buildName } = await uploadUrlResponse.json();\n\n logger.debug(`Deployment started for ${buildName}`);\n\n const buildResult = await pollBuild(argv, endpoint, buildName, spinner);\n\n if (buildResult.conditionType === \"Complete\") {\n // Retrieve the deployment\n const deploymentResponse = await fetch(\n `${endpoint}/v1/deployments/${deploymentName}`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n const deploymentJSON: { deploymentUrl: string } =\n await deploymentResponse.json();\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${deploymentJSON.deploymentUrl}`,\n spinner\n );\n } else {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the current environment. Here's the diagnostics: ${JSON.stringify(\n buildResult\n )}`,\n spinner\n );\n }\n } else {\n logger.error(\n await uploadUrlResponse.text(),\n \"Failed to upload to self-hosted build endpoint\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload to self-hosted build endpoint\"\n );\n }\n } catch (error) {\n logger.error(error);\n } finally {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n }\n}\n\nfunction retrieveExistingZuploEnv(argv: SelfHostedArgs): string | undefined {\n const dir = argv.dir;\n const normalizedDir = join(relative(process.cwd(), dir));\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n if (existsSync(envFilePath)) {\n const envFileContent = readFileSync(envFilePath, \"utf-8\");\n return envFileContent;\n } else {\n return undefined;\n }\n}\n\nfunction restoreExistingZuploEnvAsNecessary(\n argv: SelfHostedArgs,\n originalValue: string | undefined\n) {\n if (originalValue) {\n const dir = argv.dir;\n const normalizedDir = join(relative(process.cwd(), dir));\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n writeFileSync(envFilePath, originalValue);\n }\n}\n\nconst getPrettyBranch = (branch: string): string => {\n // https://ricardometring.com/javascript-replace-special-characters\n return branch\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\") // Remove accents\n .replace(/([^\\w]+|\\s+)/g, \"-\") // Replace space and other characters by hyphen\n .replace(/--+/g, \"-\") // Replaces multiple hyphens by one hyphen\n .replace(/(^-+|-+$)/, \"\") // Remove extra hyphens from beginning or end of the string\n .replaceAll(\"_\", \"-\") // Replace underscores by hyphens (Url hosts cannot have underscores)\n .toLowerCase()\n .substring(0, MAX_PRETTY_BRANCH_LENGTH);\n};\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/deploy/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport {\n MAX_PRETTY_BRANCH_NAME as MAX_PRETTY_BRANCH_LENGTH,\n ZUPLO_SYSTEM_ENV_VAR,\n} from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n printSpinnerToConsole,\n printWarningToConsole,\n} from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { RequiredProperties } from \"../common/utils/types.js\";\nimport { normalizeUrl } from \"../common/utils/urls.js\";\nimport { pullSystemConfig } from \"../common/populate.js\";\nimport { archive, generateMetadata } from \"./archive.js\";\nimport {\n UnableToAutoLinkToExistingProject,\n retrieveOrCreateEnvironment,\n} from \"./environments.js\";\nimport { upload } from \"./file-upload.js\";\nimport { pollBuild, pollDeployment } from \"./poll-deployment.js\";\n\nexport interface Arguments {\n account: string;\n project: string;\n dir: string;\n environment?: string;\n authToken: string;\n \"verify-remote\"?: boolean;\n \"self-hosted-endpoint\"?: string;\n \"override-repo-url\"?: string;\n}\n\nexport type SelfHostedArgs = RequiredProperties<\n Arguments,\n \"self-hosted-endpoint\"\n>;\n\nexport async function deploy(argv: Arguments) {\n if (argv[\"self-hosted-endpoint\"]) {\n const args = argv as SelfHostedArgs;\n await deployToSelfHosted(args);\n } else {\n await deployToSaas(argv);\n }\n}\n\nasync function deployToSaas(argv: Arguments) {\n // 1. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata.tarball}`);\n\n // 2. Build uploadUrl request\n const { account, project } = argv;\n\n const payload = {\n accountName: account,\n projectName: project,\n environment: archiveMetadata.metadata.branch,\n repositoryUrl: archiveMetadata.metadata.repoUrl,\n sha: archiveMetadata.metadata.sha,\n };\n\n const uploadUrlResponse = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/deployments/source-url`,\n {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: JSON.stringify(payload),\n }\n );\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n // 3. Upload to request URL\n const { uploadUrl, deploymentId } = await uploadUrlResponse.json();\n\n const uploadResponse = await upload({\n tarballPath: archiveMetadata.tarball,\n uploadUrl,\n deploymentId,\n ...payload,\n });\n\n logger.debug(`Upload response: ${uploadResponse.status}`);\n\n if (uploadResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the '${payload.environment}' environment to '${project}' on account '${account}'...`\n );\n\n const { url, logUrl } = await pollDeployment(\n argv,\n deploymentId,\n account,\n project,\n spinner\n );\n if (url) {\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${url}`,\n spinner\n );\n } else {\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the environment ${\n archiveMetadata.metadata.branch\n } to project ${project} on account ${account}.\\nDeployment ID: ${deploymentId}\\nFor more information, check the deployment logs in the Zuplo dashboard.\\n\n ${logUrl}`,\n spinner\n );\n }\n } else {\n logger.error(\n {\n status: uploadResponse.status,\n statusText: uploadResponse.statusText,\n },\n \"Failed to upload source to cloud storage\"\n );\n printDiagnosticsToConsole(\n \"Error: Failed to upload deployment source. Please try again.\"\n );\n }\n } else {\n logger.error(\n {\n status: uploadUrlResponse.status,\n statusText: uploadUrlResponse.statusText,\n },\n \"Failed to retrieve uploadUrl\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload deployment source. Please try again.\"\n );\n }\n}\n\nasync function deployToSelfHosted(argv: SelfHostedArgs) {\n const { account, project } = argv;\n\n let existingZuploEnv: string | undefined;\n\n try {\n // 0. Finagle the URL first\n const endpoint = normalizeUrl(argv[\"self-hosted-endpoint\"]);\n\n // 1. Perform the link on-behalf-of-the-user\n // Store the current .env.zuplo if there is one and restore it later\n existingZuploEnv = retrieveExistingZuploEnv(argv);\n const branch = (await generateMetadata(argv)).branch;\n try {\n const environmentToAutoLink = await retrieveOrCreateEnvironment(\n branch,\n argv\n );\n await pullSystemConfig({\n dir: argv.dir,\n environment: environmentToAutoLink.name,\n authToken: argv.authToken,\n });\n } catch (error) {\n if (\n error instanceof UnableToAutoLinkToExistingProject &&\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS\n ) {\n printWarningToConsole(\n `We are unable to fetch the environment variables from Zuplo for this project. \nDeployment will proceed because ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS is set. \nHowever, the environment variables will not be available. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n } else if (error instanceof UnableToAutoLinkToExistingProject) {\n await printCriticalFailureToConsoleAndExit(\n `We are unable to fetch the environment variables from Zuplo for this project. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.\nIf you want to force deployment without the environment variables, set ZUPLO_ALLOW_DEPLOY_WITH_EMPTY_VARS to true.`\n );\n } else {\n logger.error(error, \"Failed to fetch environment variables\");\n await printCriticalFailureToConsoleAndExit(\n `We are unable to fetch the environment variables from Zuplo for this project. \nTo fix this, check that the project, ${argv.project} exists and this api-key has access to it.`\n );\n }\n }\n\n // 2. Create the tarball locally\n const archiveMetadata = await archive(argv);\n logger.debug(`Tarball created locally at ${archiveMetadata.tarball}`);\n\n // 3. Build uploadUrl request\n const form = new FormData();\n const deploymentName = `${project}-${getPrettyBranch(\n archiveMetadata.metadata.branch\n )}`;\n form.set(\n \"file\",\n new Blob([readFileSync(archiveMetadata.tarball)], {\n type: \"application/gzip\",\n })\n );\n form.set(\"projectName\", project);\n form.set(\"deploymentName\", deploymentName);\n\n const uploadUrlResponse = await fetch(`${endpoint}/v1/deployments/build`, {\n method: \"POST\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n body: form,\n });\n\n logger.debug(`Upload URL response: ${uploadUrlResponse.status}`);\n\n if (uploadUrlResponse.ok) {\n const spinner = printSpinnerToConsole(\n `Deploying the current branch ${archiveMetadata.metadata.branch} to project ${project} on account ${account}...`\n );\n\n // 4. Poll for build\n const { buildName } = await uploadUrlResponse.json();\n\n logger.debug(`Deployment started for ${buildName}`);\n\n const buildResult = await pollBuild(argv, endpoint, buildName, spinner);\n\n if (buildResult.conditionType === \"Complete\") {\n // Retrieve the deployment\n const deploymentResponse = await fetch(\n `${endpoint}/v1/deployments/${deploymentName}`,\n {\n method: \"GET\",\n headers: {\n // biome-ignore lint/style/useNamingConvention: External API property\n Authorization: `Bearer ${argv.authToken}`,\n },\n }\n );\n const deploymentJSON: { deploymentUrl: string } =\n await deploymentResponse.json();\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n\n await printResultToConsoleAndExitGracefully(\n `Deployed to ${deploymentJSON.deploymentUrl}`,\n spinner\n );\n } else {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n await printCriticalFailureToConsoleAndExit(\n `Failed to deploy the current environment. Here's the diagnostics: ${JSON.stringify(\n buildResult\n )}`,\n spinner\n );\n }\n } else {\n logger.error(\n await uploadUrlResponse.text(),\n \"Failed to upload to self-hosted build endpoint\"\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to upload to self-hosted build endpoint\"\n );\n }\n } catch (error) {\n logger.error(error);\n } finally {\n restoreExistingZuploEnvAsNecessary(argv, existingZuploEnv);\n }\n}\n\nfunction retrieveExistingZuploEnv(argv: SelfHostedArgs): string | undefined {\n const normalizedDir = resolve(argv.dir);\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n if (existsSync(envFilePath)) {\n const envFileContent = readFileSync(envFilePath, \"utf-8\");\n return envFileContent;\n } else {\n return undefined;\n }\n}\n\nfunction restoreExistingZuploEnvAsNecessary(\n argv: SelfHostedArgs,\n originalValue: string | undefined\n) {\n if (originalValue) {\n const normalizedDir = resolve(argv.dir);\n const envFilePath = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n writeFileSync(envFilePath, originalValue);\n }\n}\n\nconst getPrettyBranch = (branch: string): string => {\n // https://ricardometring.com/javascript-replace-special-characters\n return branch\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\") // Remove accents\n .replace(/([^\\w]+|\\s+)/g, \"-\") // Replace space and other characters by hyphen\n .replace(/--+/g, \"-\") // Replaces multiple hyphens by one hyphen\n .replace(/(^-+|-+$)/, \"\") // Remove extra hyphens from beginning or end of the string\n .replaceAll(\"_\", \"-\") // Replace underscores by hyphens (Url hosts cannot have underscores)\n .toLowerCase()\n .substring(0, MAX_PRETTY_BRANCH_LENGTH);\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { cpSync, existsSync, readFileSync } from "node:fs";
3
- import { join, relative, resolve } from "node:path";
3
+ import { join, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import dotenv from "dotenv";
6
6
  import { logger } from "../common/logger.js";
@@ -9,7 +9,7 @@ import { isPortAvailable } from "../common/utils/ports.js";
9
9
  import { handleRuntimeStdio } from "../common/worker-output.js";
10
10
  import { LocalEditorServer } from "@zuplo/editor";
11
11
  export async function dev(argv) {
12
- const sourceDirectory = resolve(join(relative(process.cwd(), argv.dir)));
12
+ const sourceDirectory = resolve(argv.dir);
13
13
  const zuploRuntimePath = new URL("../../node_modules/@zuplo/runtime", import.meta.url);
14
14
  if (existsSync(zuploRuntimePath)) {
15
15
  cpSync(zuploRuntimePath, join(sourceDirectory, "node_modules/@zuplo/runtime"), {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/dev/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { cpSync, existsSync, readFileSync } from \"node:fs\";\nimport { join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport dotenv from \"dotenv\";\nimport { logger } from \"../common/logger.js\";\nimport {\n ConsoleOutput,\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n} from \"../common/output.js\";\nimport { isPortAvailable } from \"../common/utils/ports.js\";\nimport { handleRuntimeStdio } from \"../common/worker-output.js\";\nimport { LocalEditorServer } from \"@zuplo/editor\";\n\nexport interface Arguments {\n dir: string;\n \"start-editor\": boolean;\n port: number;\n editorPort: number;\n debugPort?: number;\n unsafelyIgnoreCertificateErrors?: boolean;\n}\n\nexport async function dev(argv: Arguments) {\n const sourceDirectory = resolve(join(relative(process.cwd(), argv.dir)));\n\n // When we build, we MIGHT need to use the @zuplo/runtime from the node_modules if the user\n // has installed our packages using https://www.npmjs.com/package/zuplo in a global directory\n\n // Try to copy the @zuplo/runtime locally\n const zuploRuntimePath = new URL(\n \"../../node_modules/@zuplo/runtime\",\n import.meta.url\n );\n if (existsSync(zuploRuntimePath)) {\n cpSync(\n zuploRuntimePath,\n join(sourceDirectory, \"node_modules/@zuplo/runtime\"),\n {\n recursive: true,\n dereference: true,\n }\n );\n }\n\n // Set GLOBAL_MODULE_LOCATION to the location of the CLIs node_modules\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.GLOBAL_MODULE_LOCATION = fileURLToPath(\n new URL(\"../../node_modules\", import.meta.url)\n );\n\n const loadedEnvFiles: string[] = [];\n\n // Check if the user has a .env file\n const envFile = join(sourceDirectory, \".env\");\n if (existsSync(envFile)) {\n loadedEnvFiles.push(\".env\");\n }\n\n // Check if the user has a .env.zuplo file\n let envZuplo: dotenv.DotenvParseOutput | undefined;\n const envZuploFile = join(sourceDirectory, \".env.zuplo\");\n if (existsSync(envZuploFile)) {\n const contents = readFileSync(envZuploFile);\n envZuplo = dotenv.parse(contents);\n loadedEnvFiles.push(\".env.zuplo\");\n }\n\n // Set other variables using __ZUPLO_CONFIG as necessary\n // const config = {\n // };\n // process.env.__ZUPLO_CONFIG = btoa(JSON.stringify(config));\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.ZUPLO_IS_LOCAL_DEVELOPMENT = \"true\";\n\n // Use a dynamic import so that setting process.env has effect\n const core = await import(\"@zuplo/core/cli\");\n\n const zupPort = argv.port;\n const zupEditorPort = argv.editorPort;\n const zupDebugPort = argv.debugPort;\n\n const isZupPortAvailable = await isPortAvailable(\"localhost\", zupPort);\n if (!isZupPortAvailable) {\n await printCriticalFailureToConsoleAndExit(\n `Port ${zupPort} is already in use. Please specify a different port using --port.`\n );\n }\n\n const isZupEditorPortAvailable = await isPortAvailable(\n \"localhost\",\n zupEditorPort\n );\n if (!isZupEditorPortAvailable) {\n await printCriticalFailureToConsoleAndExit(\n `Port ${zupEditorPort} is already in use. Please specify a different port using --editor-port.`\n );\n }\n\n if (zupDebugPort) {\n const isZupDebugPortAvailable = await isPortAvailable(\n \"localhost\",\n zupDebugPort\n );\n if (!isZupDebugPortAvailable) {\n await printCriticalFailureToConsoleAndExit(\n `Port ${zupDebugPort} is already in use. Please specify a different port using --debug-port.`\n );\n }\n }\n\n const buildId = randomUUID();\n\n let firstLoad = true;\n\n await core.startDevServer({\n buildId,\n output: new ConsoleOutput(),\n sourceDirectory,\n port: zupPort,\n debugPort: argv.debugPort,\n unsafelyIgnoreCertificateErrors: argv.unsafelyIgnoreCertificateErrors,\n publicZuploEnvironmentVariables: envZuplo\n ? {\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_ACCOUNT_NAME: envZuplo.ZUPLO_ACCOUNT_NAME,\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_PROJECT_NAME: envZuplo.ZUPLO_PROJECT_NAME,\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_ENVIRONMENT_TYPE: envZuplo.ZUPLO_ENVIRONMENT_TYPE,\n }\n : // Leave this as undefined to simulate the old behavior\n undefined,\n logger,\n handleRuntimeStdio,\n onReload: () => {\n if (firstLoad) {\n firstLoad = false;\n } else {\n printDiagnosticsToConsole(\"Code changed. Server reloaded...\");\n }\n },\n });\n\n let editor: LocalEditorServer;\n\n if (argv[\"start-editor\"]) {\n editor = new LocalEditorServer({\n sourceDirectory,\n deploymentUrl: `http://localhost:${zupPort}`,\n port: argv.editorPort,\n logger,\n });\n editor.start().catch((err) => logger.error(err));\n }\n\n printDiagnosticsToConsole(\"Started local development setup\");\n printDiagnosticsToConsole(\"Ctrl+C to exit\");\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(`šŸš€ Zuplo Gateway: http://localhost:${zupPort}`);\n if (argv[\"start-editor\"]) {\n printDiagnosticsToConsole(\n `šŸ“˜ Route Designer: http://localhost:${argv.editorPort}`\n );\n }\n if (loadedEnvFiles.length > 0) {\n printDiagnosticsToConsole(\n `āš™ļø Loaded env files: \\n - ${loadedEnvFiles.join(\" \\n - \")}`\n );\n }\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(\"\");\n\n return new Promise<void>((resolve) => {\n async function exit() {\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(\"Stopping local development server...\");\n\n if (argv[\"start-editor\"]) {\n await editor.close();\n }\n resolve();\n }\n\n process.on(\"SIGTERM\", exit);\n process.on(\"SIGINT\", exit);\n });\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/dev/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { cpSync, existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport dotenv from \"dotenv\";\nimport { logger } from \"../common/logger.js\";\nimport {\n ConsoleOutput,\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n} from \"../common/output.js\";\nimport { isPortAvailable } from \"../common/utils/ports.js\";\nimport { handleRuntimeStdio } from \"../common/worker-output.js\";\nimport { LocalEditorServer } from \"@zuplo/editor\";\n\nexport interface Arguments {\n dir: string;\n \"start-editor\": boolean;\n port: number;\n editorPort: number;\n debugPort?: number;\n unsafelyIgnoreCertificateErrors?: boolean;\n}\n\nexport async function dev(argv: Arguments) {\n const sourceDirectory = resolve(argv.dir);\n\n // When we build, we MIGHT need to use the @zuplo/runtime from the node_modules if the user\n // has installed our packages using https://www.npmjs.com/package/zuplo in a global directory\n\n // Try to copy the @zuplo/runtime locally\n const zuploRuntimePath = new URL(\n \"../../node_modules/@zuplo/runtime\",\n import.meta.url\n );\n if (existsSync(zuploRuntimePath)) {\n cpSync(\n zuploRuntimePath,\n join(sourceDirectory, \"node_modules/@zuplo/runtime\"),\n {\n recursive: true,\n dereference: true,\n }\n );\n }\n\n // Set GLOBAL_MODULE_LOCATION to the location of the CLIs node_modules\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.GLOBAL_MODULE_LOCATION = fileURLToPath(\n new URL(\"../../node_modules\", import.meta.url)\n );\n\n const loadedEnvFiles: string[] = [];\n\n // Check if the user has a .env file\n const envFile = join(sourceDirectory, \".env\");\n if (existsSync(envFile)) {\n loadedEnvFiles.push(\".env\");\n }\n\n // Check if the user has a .env.zuplo file\n let envZuplo: dotenv.DotenvParseOutput | undefined;\n const envZuploFile = join(sourceDirectory, \".env.zuplo\");\n if (existsSync(envZuploFile)) {\n const contents = readFileSync(envZuploFile);\n envZuplo = dotenv.parse(contents);\n loadedEnvFiles.push(\".env.zuplo\");\n }\n\n // Set other variables using __ZUPLO_CONFIG as necessary\n // const config = {\n // };\n // process.env.__ZUPLO_CONFIG = btoa(JSON.stringify(config));\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n process.env.ZUPLO_IS_LOCAL_DEVELOPMENT = \"true\";\n\n // Use a dynamic import so that setting process.env has effect\n const core = await import(\"@zuplo/core/cli\");\n\n const zupPort = argv.port;\n const zupEditorPort = argv.editorPort;\n const zupDebugPort = argv.debugPort;\n\n const isZupPortAvailable = await isPortAvailable(\"localhost\", zupPort);\n if (!isZupPortAvailable) {\n await printCriticalFailureToConsoleAndExit(\n `Port ${zupPort} is already in use. Please specify a different port using --port.`\n );\n }\n\n const isZupEditorPortAvailable = await isPortAvailable(\n \"localhost\",\n zupEditorPort\n );\n if (!isZupEditorPortAvailable) {\n await printCriticalFailureToConsoleAndExit(\n `Port ${zupEditorPort} is already in use. Please specify a different port using --editor-port.`\n );\n }\n\n if (zupDebugPort) {\n const isZupDebugPortAvailable = await isPortAvailable(\n \"localhost\",\n zupDebugPort\n );\n if (!isZupDebugPortAvailable) {\n await printCriticalFailureToConsoleAndExit(\n `Port ${zupDebugPort} is already in use. Please specify a different port using --debug-port.`\n );\n }\n }\n\n const buildId = randomUUID();\n\n let firstLoad = true;\n\n await core.startDevServer({\n buildId,\n output: new ConsoleOutput(),\n sourceDirectory,\n port: zupPort,\n debugPort: argv.debugPort,\n unsafelyIgnoreCertificateErrors: argv.unsafelyIgnoreCertificateErrors,\n publicZuploEnvironmentVariables: envZuplo\n ? {\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_ACCOUNT_NAME: envZuplo.ZUPLO_ACCOUNT_NAME,\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_PROJECT_NAME: envZuplo.ZUPLO_PROJECT_NAME,\n // biome-ignore lint/style/useNamingConvention: External API property\n ZUPLO_ENVIRONMENT_TYPE: envZuplo.ZUPLO_ENVIRONMENT_TYPE,\n }\n : // Leave this as undefined to simulate the old behavior\n undefined,\n logger,\n handleRuntimeStdio,\n onReload: () => {\n if (firstLoad) {\n firstLoad = false;\n } else {\n printDiagnosticsToConsole(\"Code changed. Server reloaded...\");\n }\n },\n });\n\n let editor: LocalEditorServer;\n\n if (argv[\"start-editor\"]) {\n editor = new LocalEditorServer({\n sourceDirectory,\n deploymentUrl: `http://localhost:${zupPort}`,\n port: argv.editorPort,\n logger,\n });\n editor.start().catch((err) => logger.error(err));\n }\n\n printDiagnosticsToConsole(\"Started local development setup\");\n printDiagnosticsToConsole(\"Ctrl+C to exit\");\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(`šŸš€ Zuplo Gateway: http://localhost:${zupPort}`);\n if (argv[\"start-editor\"]) {\n printDiagnosticsToConsole(\n `šŸ“˜ Route Designer: http://localhost:${argv.editorPort}`\n );\n }\n if (loadedEnvFiles.length > 0) {\n printDiagnosticsToConsole(\n `āš™ļø Loaded env files: \\n - ${loadedEnvFiles.join(\" \\n - \")}`\n );\n }\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(\"\");\n\n return new Promise<void>((resolve) => {\n async function exit() {\n printDiagnosticsToConsole(\"\");\n printDiagnosticsToConsole(\"Stopping local development server...\");\n\n if (argv[\"start-editor\"]) {\n await editor.close();\n }\n resolve();\n }\n\n process.on(\"SIGTERM\", exit);\n process.on(\"SIGINT\", exit);\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/open-api/convert/handler.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEnE"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/open-api/convert/handler.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,wBAAsB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EnE"}
@@ -4,7 +4,9 @@ import { printDiagnosticsToConsole } from "../../common/output.js";
4
4
  import { logger } from "../../common/logger.js";
5
5
  import { detectFormat, convertDocument, generateOutputPath, } from "./convert-engine.js";
6
6
  export async function convertOpenAPI(args) {
7
- const { input: inputPath, format, json, yaml, output: outputPath } = args;
7
+ const inputPath = path.resolve(args.input);
8
+ const outputPath = args.output ? path.resolve(args.output) : undefined;
9
+ const { format, json, yaml } = args;
8
10
  let outputFormat;
9
11
  if (format) {
10
12
  outputFormat = format;
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/convert/handler.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n detectFormat,\n convertDocument,\n generateOutputPath,\n type FileFormat,\n} from \"./convert-engine.js\";\n\nexport interface Arguments {\n input: string;\n format?: \"json\" | \"yaml\";\n json?: boolean;\n yaml?: boolean;\n output?: string;\n}\n\n/**\n * Convert OpenAPI document between JSON and YAML formats\n */\nexport async function convertOpenAPI(args: Arguments): Promise<void> {\n const { input: inputPath, format, json, yaml, output: outputPath } = args;\n\n // Determine output format\n let outputFormat: FileFormat;\n if (format) {\n outputFormat = format;\n } else if (json) {\n outputFormat = \"json\";\n } else if (yaml) {\n outputFormat = \"yaml\";\n } else {\n throw new Error(\n \"Output format must be specified using --format, --json, or --yaml\"\n );\n }\n\n // Determine input format from extension\n const inputFormat = detectFormat(inputPath);\n if (!inputFormat) {\n throw new Error(\n `Unable to determine input format from extension: ${path.extname(inputPath)}`\n );\n }\n\n // Check if conversion is needed\n if (inputFormat === outputFormat) {\n console.log(\n `Input file is already in ${outputFormat.toUpperCase()} format. No conversion needed.`\n );\n return;\n }\n\n console.log(\"OpenAPI Format Converter\");\n console.log(\"========================\");\n console.log(`Input file: ${inputPath}`);\n console.log(`Input format: ${inputFormat.toUpperCase()}`);\n console.log(`Output format: ${outputFormat.toUpperCase()}`);\n if (outputPath) {\n console.log(`Output file: ${outputPath}`);\n }\n\n try {\n // Load input file\n const inputContent = fs.readFileSync(inputPath, \"utf-8\");\n\n // Convert document\n const { content: outputContent } = convertDocument(\n inputContent,\n inputFormat,\n outputFormat\n );\n\n // Determine output path (use provided path or generate one)\n const finalOutputPath =\n outputPath || generateOutputPath(inputPath, outputFormat);\n\n // Create output directory if it doesn't exist\n const outputDir = path.dirname(finalOutputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write output file\n fs.writeFileSync(finalOutputPath, outputContent, \"utf-8\");\n\n console.log(`\\nāœ“ Converted file written to: ${finalOutputPath}`);\n } catch (error) {\n logger.error(error, \"Error converting OpenAPI file\");\n printDiagnosticsToConsole(`Error: ${(error as Error).message}`);\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/convert/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAa7B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAe;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAGpC,IAAI,YAAwB,CAAC;IAC7B,IAAI,MAAM,EAAE,CAAC;QACX,YAAY,GAAG,MAAM,CAAC;IACxB,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,YAAY,GAAG,MAAM,CAAC;IACxB,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,YAAY,GAAG,MAAM,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAGD,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,oDAAoD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAC9E,CAAC;IACJ,CAAC;IAGD,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CACT,4BAA4B,YAAY,CAAC,WAAW,EAAE,gCAAgC,CACvF,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC;QAEH,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAGzD,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,eAAe,CAChD,YAAY,EACZ,WAAW,EACX,YAAY,CACb,CAAC;QAGF,MAAM,eAAe,GACnB,UAAU,IAAI,kBAAkB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAG5D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAGD,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QAE1D,OAAO,CAAC,GAAG,CAAC,kCAAkC,eAAe,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC;QACrD,yBAAyB,CAAC,UAAW,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n detectFormat,\n convertDocument,\n generateOutputPath,\n type FileFormat,\n} from \"./convert-engine.js\";\n\nexport interface Arguments {\n input: string;\n format?: \"json\" | \"yaml\";\n json?: boolean;\n yaml?: boolean;\n output?: string;\n}\n\n/**\n * Convert OpenAPI document between JSON and YAML formats\n */\nexport async function convertOpenAPI(args: Arguments): Promise<void> {\n const inputPath = path.resolve(args.input);\n const outputPath = args.output ? path.resolve(args.output) : undefined;\n const { format, json, yaml } = args;\n\n // Determine output format\n let outputFormat: FileFormat;\n if (format) {\n outputFormat = format;\n } else if (json) {\n outputFormat = \"json\";\n } else if (yaml) {\n outputFormat = \"yaml\";\n } else {\n throw new Error(\n \"Output format must be specified using --format, --json, or --yaml\"\n );\n }\n\n // Determine input format from extension\n const inputFormat = detectFormat(inputPath);\n if (!inputFormat) {\n throw new Error(\n `Unable to determine input format from extension: ${path.extname(inputPath)}`\n );\n }\n\n // Check if conversion is needed\n if (inputFormat === outputFormat) {\n console.log(\n `Input file is already in ${outputFormat.toUpperCase()} format. No conversion needed.`\n );\n return;\n }\n\n console.log(\"OpenAPI Format Converter\");\n console.log(\"========================\");\n console.log(`Input file: ${inputPath}`);\n console.log(`Input format: ${inputFormat.toUpperCase()}`);\n console.log(`Output format: ${outputFormat.toUpperCase()}`);\n if (outputPath) {\n console.log(`Output file: ${outputPath}`);\n }\n\n try {\n // Load input file\n const inputContent = fs.readFileSync(inputPath, \"utf-8\");\n\n // Convert document\n const { content: outputContent } = convertDocument(\n inputContent,\n inputFormat,\n outputFormat\n );\n\n // Determine output path (use provided path or generate one)\n const finalOutputPath =\n outputPath || generateOutputPath(inputPath, outputFormat);\n\n // Create output directory if it doesn't exist\n const outputDir = path.dirname(finalOutputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write output file\n fs.writeFileSync(finalOutputPath, outputContent, \"utf-8\");\n\n console.log(`\\nāœ“ Converted file written to: ${finalOutputPath}`);\n } catch (error) {\n logger.error(error, \"Error converting OpenAPI file\");\n printDiagnosticsToConsole(`Error: ${(error as Error).message}`);\n throw error;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/open-api/merge/handler.ts"],"names":[],"mappings":"AAcA,OAAO,EAOL,KAAK,SAAS,EAEf,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA8JlE"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/open-api/merge/handler.ts"],"names":[],"mappings":"AAcA,OAAO,EAOL,KAAK,SAAS,EAEf,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2JlE"}
@@ -38,8 +38,7 @@ export async function importOpenApi(argv) {
38
38
  }
39
39
  }
40
40
  else {
41
- const filePath = argv.source;
42
- normalizedFilePath = path.join(path.relative(process.cwd(), filePath));
41
+ normalizedFilePath = path.resolve(argv.source);
43
42
  if (!existsSync(normalizedFilePath)) {
44
43
  await printCriticalFailureToConsoleAndExit(`The file ${normalizedFilePath} to import does not exist.`);
45
44
  }
@@ -52,7 +51,7 @@ export async function importOpenApi(argv) {
52
51
  if (!destination.endsWith(".oas.json")) {
53
52
  await printCriticalFailureToConsoleAndExit("Destination file name must end with '.oas.json'");
54
53
  }
55
- const destinationFilePath = path.join(path.relative(process.cwd(), destination));
54
+ const destinationFilePath = path.resolve(destination);
56
55
  let originalDocument;
57
56
  if (!existsSync(destinationFilePath)) {
58
57
  originalDocument = (await parseOpenApiFile(".json", BASE_TEMPLATE));
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/merge/handler.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { mergeOpenApiDocuments } from \"@zuplo/openapi-tools\";\nimport { format } from \"prettier\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../../common/output.js\";\nimport {\n BASE_TEMPLATE,\n addOperationIdsAsNecessary,\n detectFormatFromContent,\n guessFileNameFromUrl,\n isUrl,\n parseOpenApiFile,\n type MergeMode,\n type ZuploOpenApiDocument,\n} from \"./merge-engine.js\";\n\nexport interface Arguments {\n prompt?: boolean;\n source: string;\n destination: string;\n \"merge-mode\"?: MergeMode;\n}\n\nexport async function importOpenApi(argv: Arguments): Promise<void> {\n let normalizedFilePath: string;\n\n // Check if source is a URL\n if (isUrl(argv.source)) {\n const parsedUrl = new URL(argv.source);\n const tempDir = tmpdir();\n const guessedFileName = guessFileNameFromUrl(argv.source);\n normalizedFilePath = path.join(tempDir, guessedFileName);\n await mkdir(path.dirname(normalizedFilePath), { recursive: true });\n\n try {\n const response = await fetch(parsedUrl);\n if (!response.ok) {\n await printCriticalFailureToConsoleAndExit(\n `Failed to download the remote OpenAPI file. Server responded with ${response.status} ${response.statusText}`\n );\n }\n\n const text = await response.text();\n\n try {\n const format = detectFormatFromContent(text);\n normalizedFilePath = `${normalizedFilePath}.${format === \"json\" ? \"json\" : \"yaml\"}`;\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch (err) {\n logger.error(err);\n await printCriticalFailureToConsoleAndExit(\n \"Failed to parse the remote OpenAPI file as either JSON or YAML.\"\n );\n }\n } catch (err) {\n logger.error(err);\n await printCriticalFailureToConsoleAndExit(\n \"Failed to download the remote OpenAPI file.\"\n );\n }\n } else {\n // This is a normal file\n const filePath = argv.source;\n normalizedFilePath = path.join(path.relative(process.cwd(), filePath));\n\n if (!existsSync(normalizedFilePath)) {\n await printCriticalFailureToConsoleAndExit(\n `The file ${normalizedFilePath} to import does not exist.`\n );\n }\n }\n\n const rawOpenApiSpec = await readFile(normalizedFilePath);\n const extName = path.extname(normalizedFilePath);\n const fileContent = rawOpenApiSpec.toString();\n const parsedOpenApiSpec = await parseOpenApiFile(extName, fileContent);\n\n const destination = argv.destination;\n\n if (!destination.endsWith(\".oas.json\")) {\n await printCriticalFailureToConsoleAndExit(\n \"Destination file name must end with '.oas.json'\"\n );\n }\n\n const destinationFilePath = path.join(\n path.relative(process.cwd(), destination)\n );\n\n let originalDocument: ZuploOpenApiDocument;\n if (!existsSync(destinationFilePath)) {\n // This is an initial import\n originalDocument = (await parseOpenApiFile(\n \".json\",\n BASE_TEMPLATE\n )) as ZuploOpenApiDocument;\n } else {\n const existingOpenApiSpec = await readFile(destinationFilePath);\n const existingFileContent = existingOpenApiSpec.toString();\n originalDocument = (await parseOpenApiFile(\n extName,\n existingFileContent\n )) as ZuploOpenApiDocument;\n }\n\n // Default to path-method merging\n const mergeMode = argv[\"merge-mode\"] || \"path-method\";\n\n const { created, merged, retained, mergedDocument } = mergeOpenApiDocuments(\n originalDocument,\n parsedOpenApiSpec,\n mergeMode\n );\n\n // Present the changes\n printDiagnosticsToConsole(\"This import will...\");\n printDiagnosticsToConsole(\"\");\n\n if (created.size > 0) {\n printDiagnosticsToConsole(\n `Create ${created.size} new ${created.size > 1 ? \"operations\" : \"operation\"}`\n );\n printDiagnosticsToConsole(\"\");\n created.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (merged.size > 0) {\n printDiagnosticsToConsole(\n `Merge ${merged.size} ${merged.size > 1 ? \"operations\" : \"operation\"}`\n );\n printDiagnosticsToConsole(\"\");\n merged.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (retained.size > 0) {\n printDiagnosticsToConsole(\n `Retain ${retained.size} ${retained.size > 1 ? \"operations\" : \"operation\"}`\n );\n printDiagnosticsToConsole(\"\");\n retained.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (argv.prompt) {\n printDiagnosticsToConsole(\"\");\n const answer = await confirm({ message: \"Proceed?\", default: true });\n if (!answer) {\n await printResultToConsoleAndExitGracefully(\"Import cancelled.\");\n }\n }\n\n addOperationIdsAsNecessary(mergedDocument);\n\n const formattedOpenApi = await format(JSON.stringify(mergedDocument), {\n parser: \"json-stringify\",\n });\n\n // Create folder structure if needed\n if (!existsSync(destinationFilePath)) {\n // Get the directory path of the file\n const dir = path.dirname(destinationFilePath);\n\n // Ensure that the directory exists (creates parent directories if necessary)\n await mkdir(dir, { recursive: true });\n }\n\n writeFileSync(destinationFilePath, formattedOpenApi, {\n flag: \"w\",\n });\n\n await printResultToConsoleAndExitGracefully(\n `Import successful. File written to ${destinationFilePath}`\n );\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/merge/handler.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { mergeOpenApiDocuments } from \"@zuplo/openapi-tools\";\nimport { format } from \"prettier\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../../common/output.js\";\nimport {\n BASE_TEMPLATE,\n addOperationIdsAsNecessary,\n detectFormatFromContent,\n guessFileNameFromUrl,\n isUrl,\n parseOpenApiFile,\n type MergeMode,\n type ZuploOpenApiDocument,\n} from \"./merge-engine.js\";\n\nexport interface Arguments {\n prompt?: boolean;\n source: string;\n destination: string;\n \"merge-mode\"?: MergeMode;\n}\n\nexport async function importOpenApi(argv: Arguments): Promise<void> {\n let normalizedFilePath: string;\n\n // Check if source is a URL\n if (isUrl(argv.source)) {\n const parsedUrl = new URL(argv.source);\n const tempDir = tmpdir();\n const guessedFileName = guessFileNameFromUrl(argv.source);\n normalizedFilePath = path.join(tempDir, guessedFileName);\n await mkdir(path.dirname(normalizedFilePath), { recursive: true });\n\n try {\n const response = await fetch(parsedUrl);\n if (!response.ok) {\n await printCriticalFailureToConsoleAndExit(\n `Failed to download the remote OpenAPI file. Server responded with ${response.status} ${response.statusText}`\n );\n }\n\n const text = await response.text();\n\n try {\n const format = detectFormatFromContent(text);\n normalizedFilePath = `${normalizedFilePath}.${format === \"json\" ? \"json\" : \"yaml\"}`;\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch (err) {\n logger.error(err);\n await printCriticalFailureToConsoleAndExit(\n \"Failed to parse the remote OpenAPI file as either JSON or YAML.\"\n );\n }\n } catch (err) {\n logger.error(err);\n await printCriticalFailureToConsoleAndExit(\n \"Failed to download the remote OpenAPI file.\"\n );\n }\n } else {\n // This is a normal file\n normalizedFilePath = path.resolve(argv.source);\n\n if (!existsSync(normalizedFilePath)) {\n await printCriticalFailureToConsoleAndExit(\n `The file ${normalizedFilePath} to import does not exist.`\n );\n }\n }\n\n const rawOpenApiSpec = await readFile(normalizedFilePath);\n const extName = path.extname(normalizedFilePath);\n const fileContent = rawOpenApiSpec.toString();\n const parsedOpenApiSpec = await parseOpenApiFile(extName, fileContent);\n\n const destination = argv.destination;\n\n if (!destination.endsWith(\".oas.json\")) {\n await printCriticalFailureToConsoleAndExit(\n \"Destination file name must end with '.oas.json'\"\n );\n }\n\n const destinationFilePath = path.resolve(destination);\n\n let originalDocument: ZuploOpenApiDocument;\n if (!existsSync(destinationFilePath)) {\n // This is an initial import\n originalDocument = (await parseOpenApiFile(\n \".json\",\n BASE_TEMPLATE\n )) as ZuploOpenApiDocument;\n } else {\n const existingOpenApiSpec = await readFile(destinationFilePath);\n const existingFileContent = existingOpenApiSpec.toString();\n originalDocument = (await parseOpenApiFile(\n extName,\n existingFileContent\n )) as ZuploOpenApiDocument;\n }\n\n // Default to path-method merging\n const mergeMode = argv[\"merge-mode\"] || \"path-method\";\n\n const { created, merged, retained, mergedDocument } = mergeOpenApiDocuments(\n originalDocument,\n parsedOpenApiSpec,\n mergeMode\n );\n\n // Present the changes\n printDiagnosticsToConsole(\"This import will...\");\n printDiagnosticsToConsole(\"\");\n\n if (created.size > 0) {\n printDiagnosticsToConsole(\n `Create ${created.size} new ${created.size > 1 ? \"operations\" : \"operation\"}`\n );\n printDiagnosticsToConsole(\"\");\n created.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (merged.size > 0) {\n printDiagnosticsToConsole(\n `Merge ${merged.size} ${merged.size > 1 ? \"operations\" : \"operation\"}`\n );\n printDiagnosticsToConsole(\"\");\n merged.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (retained.size > 0) {\n printDiagnosticsToConsole(\n `Retain ${retained.size} ${retained.size > 1 ? \"operations\" : \"operation\"}`\n );\n printDiagnosticsToConsole(\"\");\n retained.forEach((operation) => {\n printDiagnosticsToConsole(operation);\n });\n printDiagnosticsToConsole(\"\");\n }\n\n if (argv.prompt) {\n printDiagnosticsToConsole(\"\");\n const answer = await confirm({ message: \"Proceed?\", default: true });\n if (!answer) {\n await printResultToConsoleAndExitGracefully(\"Import cancelled.\");\n }\n }\n\n addOperationIdsAsNecessary(mergedDocument);\n\n const formattedOpenApi = await format(JSON.stringify(mergedDocument), {\n parser: \"json-stringify\",\n });\n\n // Create folder structure if needed\n if (!existsSync(destinationFilePath)) {\n // Get the directory path of the file\n const dir = path.dirname(destinationFilePath);\n\n // Ensure that the directory exists (creates parent directories if necessary)\n await mkdir(dir, { recursive: true });\n }\n\n writeFileSync(destinationFilePath, formattedOpenApi, {\n flag: \"w\",\n });\n\n await printResultToConsoleAndExitGracefully(\n `Import successful. File written to ${destinationFilePath}`\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA2DD,wBAAsB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEjE"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA2DD,wBAAsB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2EjE"}
@@ -40,7 +40,9 @@ function applyOverlayWithProgress(openapi, overlay) {
40
40
  return finalResult;
41
41
  }
42
42
  export async function applyOverlay(args) {
43
- const { overlay: overlayPath, input: openapiPath, output: outputPath } = args;
43
+ const openapiPath = path.resolve(args.input);
44
+ const overlayPath = path.resolve(args.overlay);
45
+ const outputPath = path.resolve(args.output);
44
46
  if (!fs.existsSync(openapiPath)) {
45
47
  throw new Error(`OpenAPI file not found: ${openapiPath}`);
46
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n detectFormatFromExtension,\n parseFile,\n serializeContent,\n type FileFormat,\n} from \"../../common/file-format.js\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n applyOverlay as applyOverlayEngine,\n applyAction,\n deepClone,\n type OverlayDocument,\n} from \"./overlay-engine.js\";\n\nexport interface Arguments {\n overlay: string;\n input: string;\n output: string;\n format?: \"json\" | \"yaml\";\n json?: boolean;\n yaml?: boolean;\n}\n\n/**\n * Apply overlay to OpenAPI document with console output\n */\n// biome-ignore lint/suspicious/noExplicitAny: Working with dynamic JSON structures\nfunction applyOverlayWithProgress(openapi: any, overlay: OverlayDocument): any {\n printDiagnosticsToConsole(\n `\\nApplying overlay: ${overlay.info?.title || \"Unnamed\"}`\n );\n printDiagnosticsToConsole(`Version: ${overlay.overlay || \"unknown\"}\\n`);\n\n // Clone the document for modification\n const result = deepClone(openapi);\n const stats = { applied: 0, skipped: 0, totalNodes: 0 };\n\n // Apply actions with progress reporting\n for (const [index, action] of overlay.actions.entries()) {\n const desc = action.description || `Action ${index + 1}`;\n process.stdout.write(\n ` [${index + 1}/${overlay.actions.length}] ${desc}... `\n );\n\n try {\n const { applied, count } = applyAction(result, action);\n\n if (applied) {\n printDiagnosticsToConsole(`āœ“ (${count} node${count !== 1 ? \"s\" : \"\"})`);\n stats.applied++;\n stats.totalNodes += count;\n } else {\n printDiagnosticsToConsole(\"⊘ skipped\");\n stats.skipped++;\n }\n } catch (error) {\n printDiagnosticsToConsole(`āœ— failed`);\n logger.warn(error, `Failed to apply action: ${desc}`);\n stats.skipped++;\n }\n }\n\n printDiagnosticsToConsole(`\\n=== Summary ===`);\n printDiagnosticsToConsole(\n `Applied: ${stats.applied}/${overlay.actions.length} actions`\n );\n printDiagnosticsToConsole(`Modified: ${stats.totalNodes} nodes`);\n if (stats.skipped > 0) {\n printDiagnosticsToConsole(`Skipped: ${stats.skipped} actions`);\n }\n\n // Use the engine's reordering functions\n const { result: finalResult } = applyOverlayEngine(openapi, overlay);\n\n return finalResult;\n}\n\n/**\n * Main handler function\n */\nexport async function applyOverlay(args: Arguments): Promise<void> {\n const { overlay: overlayPath, input: openapiPath, output: outputPath } = args;\n\n // Validate input files exist\n if (!fs.existsSync(openapiPath)) {\n throw new Error(`OpenAPI file not found: ${openapiPath}`);\n }\n\n if (!fs.existsSync(overlayPath)) {\n throw new Error(`Overlay file not found: ${overlayPath}`);\n }\n\n printDiagnosticsToConsole(\"OpenAPI Overlay Applicator\");\n printDiagnosticsToConsole(\"===========================\");\n printDiagnosticsToConsole(`OpenAPI file: ${openapiPath}`);\n printDiagnosticsToConsole(`Overlay file: ${overlayPath}`);\n printDiagnosticsToConsole(`Output file: ${outputPath}`);\n\n try {\n // Load files with flexible parsing\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const overlayContent = fs.readFileSync(overlayPath, \"utf-8\");\n\n // Parse with automatic format detection\n const { document: openapi } = parseFile(openapiContent, openapiPath);\n const { document: overlay } = parseFile(overlayContent, overlayPath);\n\n // Validate overlay format\n if (!overlay.overlay || !overlay.actions) {\n throw new Error(\n \"Invalid overlay format. Must include 'overlay' version and 'actions' array.\"\n );\n }\n\n // Apply overlay with progress output\n const result = applyOverlayWithProgress(\n openapi,\n overlay as OverlayDocument\n );\n\n // Determine output format\n let outputFormat: FileFormat;\n if (args.format) {\n outputFormat = args.format;\n } else if (args.json) {\n outputFormat = \"json\";\n } else if (args.yaml) {\n outputFormat = \"yaml\";\n } else {\n // Try to detect from output file extension\n const formatFromExt = detectFormatFromExtension(outputPath);\n outputFormat = formatFromExt || \"json\"; // Default to JSON if no extension\n }\n\n // Serialize output\n const outputContent = serializeContent(result, outputFormat);\n\n // Create output directory if it doesn't exist\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\n printDiagnosticsToConsole(\n `\\nāœ“ Output written to: ${outputPath} (${outputFormat.toUpperCase()})`\n );\n } catch (error) {\n logger.error(error, \"Error applying overlay\");\n printDiagnosticsToConsole(`Error: ${(error as Error).message}`);\n throw error;\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/open-api/overlay/handler.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: CLI output file */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n detectFormatFromExtension,\n parseFile,\n serializeContent,\n type FileFormat,\n} from \"../../common/file-format.js\";\nimport { printDiagnosticsToConsole } from \"../../common/output.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n applyOverlay as applyOverlayEngine,\n applyAction,\n deepClone,\n type OverlayDocument,\n} from \"./overlay-engine.js\";\n\nexport interface Arguments {\n overlay: string;\n input: string;\n output: string;\n format?: \"json\" | \"yaml\";\n json?: boolean;\n yaml?: boolean;\n}\n\n/**\n * Apply overlay to OpenAPI document with console output\n */\n// biome-ignore lint/suspicious/noExplicitAny: Working with dynamic JSON structures\nfunction applyOverlayWithProgress(openapi: any, overlay: OverlayDocument): any {\n printDiagnosticsToConsole(\n `\\nApplying overlay: ${overlay.info?.title || \"Unnamed\"}`\n );\n printDiagnosticsToConsole(`Version: ${overlay.overlay || \"unknown\"}\\n`);\n\n // Clone the document for modification\n const result = deepClone(openapi);\n const stats = { applied: 0, skipped: 0, totalNodes: 0 };\n\n // Apply actions with progress reporting\n for (const [index, action] of overlay.actions.entries()) {\n const desc = action.description || `Action ${index + 1}`;\n process.stdout.write(\n ` [${index + 1}/${overlay.actions.length}] ${desc}... `\n );\n\n try {\n const { applied, count } = applyAction(result, action);\n\n if (applied) {\n printDiagnosticsToConsole(`āœ“ (${count} node${count !== 1 ? \"s\" : \"\"})`);\n stats.applied++;\n stats.totalNodes += count;\n } else {\n printDiagnosticsToConsole(\"⊘ skipped\");\n stats.skipped++;\n }\n } catch (error) {\n printDiagnosticsToConsole(`āœ— failed`);\n logger.warn(error, `Failed to apply action: ${desc}`);\n stats.skipped++;\n }\n }\n\n printDiagnosticsToConsole(`\\n=== Summary ===`);\n printDiagnosticsToConsole(\n `Applied: ${stats.applied}/${overlay.actions.length} actions`\n );\n printDiagnosticsToConsole(`Modified: ${stats.totalNodes} nodes`);\n if (stats.skipped > 0) {\n printDiagnosticsToConsole(`Skipped: ${stats.skipped} actions`);\n }\n\n // Use the engine's reordering functions\n const { result: finalResult } = applyOverlayEngine(openapi, overlay);\n\n return finalResult;\n}\n\n/**\n * Main handler function\n */\nexport async function applyOverlay(args: Arguments): Promise<void> {\n const openapiPath = path.resolve(args.input);\n const overlayPath = path.resolve(args.overlay);\n const outputPath = path.resolve(args.output);\n\n // Validate input files exist\n if (!fs.existsSync(openapiPath)) {\n throw new Error(`OpenAPI file not found: ${openapiPath}`);\n }\n\n if (!fs.existsSync(overlayPath)) {\n throw new Error(`Overlay file not found: ${overlayPath}`);\n }\n\n printDiagnosticsToConsole(\"OpenAPI Overlay Applicator\");\n printDiagnosticsToConsole(\"===========================\");\n printDiagnosticsToConsole(`OpenAPI file: ${openapiPath}`);\n printDiagnosticsToConsole(`Overlay file: ${overlayPath}`);\n printDiagnosticsToConsole(`Output file: ${outputPath}`);\n\n try {\n // Load files with flexible parsing\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const overlayContent = fs.readFileSync(overlayPath, \"utf-8\");\n\n // Parse with automatic format detection\n const { document: openapi } = parseFile(openapiContent, openapiPath);\n const { document: overlay } = parseFile(overlayContent, overlayPath);\n\n // Validate overlay format\n if (!overlay.overlay || !overlay.actions) {\n throw new Error(\n \"Invalid overlay format. Must include 'overlay' version and 'actions' array.\"\n );\n }\n\n // Apply overlay with progress output\n const result = applyOverlayWithProgress(\n openapi,\n overlay as OverlayDocument\n );\n\n // Determine output format\n let outputFormat: FileFormat;\n if (args.format) {\n outputFormat = args.format;\n } else if (args.json) {\n outputFormat = \"json\";\n } else if (args.yaml) {\n outputFormat = \"yaml\";\n } else {\n // Try to detect from output file extension\n const formatFromExt = detectFormatFromExtension(outputPath);\n outputFormat = formatFromExt || \"json\"; // Default to JSON if no extension\n }\n\n // Serialize output\n const outputContent = serializeContent(result, outputFormat);\n\n // Create output directory if it doesn't exist\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n fs.writeFileSync(outputPath, outputContent, \"utf-8\");\n\n printDiagnosticsToConsole(\n `\\nāœ“ Output written to: ${outputPath} (${outputFormat.toUpperCase()})`\n );\n } catch (error) {\n logger.error(error, \"Error applying overlay\");\n printDiagnosticsToConsole(`Error: ${(error as Error).message}`);\n throw error;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAoBpB,eAAO,MAAM,gBAAgB,GAAU,MAAM,SAAS,kBAmErD,CAAC"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,SAAS,EAMV,MAAM,YAAY,CAAC;AAoBpB,eAAO,MAAM,gBAAgB,GAAU,MAAM,SAAS,kBAiErD,CAAC"}
@@ -20,9 +20,7 @@ const deleteUndefinedValues = (obj) => {
20
20
  };
21
21
  const execAsync = promisify(exec);
22
22
  export const migrateDevPortal = async (args) => {
23
- const absoluteBaseDir = path.isAbsolute(args.dir)
24
- ? args.dir
25
- : path.join(process.cwd(), args.dir);
23
+ const absoluteBaseDir = path.resolve(args.dir);
26
24
  const tasks = [
27
25
  checkGitStatus,
28
26
  loadInputFiles,
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n readFile,\n writeFile,\n stat,\n mkdir,\n rename,\n unlink,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport glob from \"fast-glob\";\nimport type {\n DevPortalConfig,\n DevPortalAuthConfig,\n SidebarConfig,\n} from \"@zuplo/types\";\nimport { format } from \"prettier\";\nimport chalk from \"chalk\";\nimport type {\n Arguments,\n MigrationConfig,\n MigrationData,\n MigrationPlugin,\n ZudokuConfig,\n ZudokuNavigationItem,\n} from \"./types.js\";\nimport { printDiagnosticsToConsole } from \"../../../common/output.js\";\nimport { PluginResult, runPlugins } from \"../../../common/runner.js\";\nimport { stringifyConfig } from \"../../../common/utils/stringify-config.js\";\n\nconst exists = (path: string) =>\n stat(path)\n .then(() => true)\n .catch(() => false);\n\nconst deleteUndefinedValues = (obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n if (value === undefined) {\n delete obj[key];\n }\n });\n};\n\nconst execAsync = promisify(exec);\n\nexport const migrateDevPortal = async (args: Arguments) => {\n const absoluteBaseDir = path.isAbsolute(args.dir)\n ? args.dir\n : path.join(process.cwd(), args.dir);\n\n const tasks = [\n checkGitStatus,\n loadInputFiles,\n validateDevPortalEnabled,\n convertBasicConfig,\n convertSidebar,\n handleApiReferences,\n handleAuthentication,\n handleAdditionalFeatures,\n updatePackageJsonWorkspaces,\n createPackageJson,\n createTsConfig,\n moveMarkdownFiles,\n writeConfigFile,\n cleanupOldFiles,\n ];\n\n const pluginConfig: MigrationConfig = {\n absoluteBaseDir,\n force: args.force,\n };\n\n const { errors, warnings, notes } = await runPlugins<\n MigrationConfig,\n MigrationData\n >(tasks, pluginConfig);\n\n // Handle plugin errors first (these are execution failures)\n if (errors.length > 0) {\n printDiagnosticsToConsole(\"āŒ Migration failed with errors:\");\n errors.forEach((error) =>\n printDiagnosticsToConsole(`- [${error.pluginName}] ${error.message}`)\n );\n process.exit(1);\n }\n\n printDiagnosticsToConsole(\n chalk.green(\"\\nāœ… Migration completed successfully! šŸŽ‰\")\n );\n\n if (notes.length > 0) {\n printDiagnosticsToConsole(\"\\nšŸ“ Migration notes:\");\n notes.forEach((note) => printDiagnosticsToConsole(`- ${note}`));\n }\n\n if (warnings.length > 0) {\n printDiagnosticsToConsole(\"\\nāš ļø Plugin warnings:\");\n warnings.forEach((warning) =>\n printDiagnosticsToConsole(`- [${warning.pluginName}] ${warning.message}`)\n );\n }\n\n printDiagnosticsToConsole(\"\\nNext steps:\");\n printDiagnosticsToConsole(\"1. Switch to the docs directory:\");\n printDiagnosticsToConsole(\n ` ${chalk.cyan(`cd ${path.join(absoluteBaseDir, \"docs\")}`)}`\n );\n printDiagnosticsToConsole(\"\\n2. Install dependencies:\");\n printDiagnosticsToConsole(` ${chalk.cyan(\"npm install\")}`);\n printDiagnosticsToConsole(\"\\n3. Start the dev portal:\");\n printDiagnosticsToConsole(` ${chalk.cyan(\"npm run dev\")}`);\n printDiagnosticsToConsole(\"\");\n};\n\nconst checkGitStatus: MigrationPlugin = async (config) => {\n if (config.force) return new PluginResult();\n\n try {\n // Check if we're in a git repository first\n await execAsync(\"git rev-parse --git-dir\", { cwd: config.absoluteBaseDir });\n\n // Check for uncommitted changes\n const status = await execAsync(\"git status --porcelain\", {\n cwd: config.absoluteBaseDir,\n });\n if (status.stdout.trim() !== \"\") {\n return new PluginResult({\n pluginName: \"check-git-status\",\n message:\n \"There are uncommitted changes in the repository.\\nCommit or stash them before running the migration, or use --force to proceed anyway.\",\n severity: \"error\",\n });\n }\n } catch {\n // If git command fails, likely not a git repository - continue silently\n }\n return new PluginResult();\n};\n\nconst loadInputFiles: MigrationPlugin = async (config, { data }) => {\n const dir = config.absoluteBaseDir;\n\n try {\n const packageJson = JSON.parse(\n await readFile(path.join(dir, \"package.json\"), \"utf-8\")\n );\n const inputFile = path.join(dir, \"config/dev-portal.json\");\n const sidebarFile = path.join(dir, \"docs/sidebar.json\");\n\n const devPortalConfig: DevPortalConfig = JSON.parse(\n await readFile(inputFile, \"utf-8\")\n );\n\n const sidebar: SidebarConfig = JSON.parse(\n await readFile(sidebarFile, \"utf-8\")\n );\n\n const themeCssFilePath = path.join(dir, \"docs/theme.css\");\n if (await exists(themeCssFilePath)) {\n data.themeCss = await readFile(themeCssFilePath, \"utf-8\");\n }\n\n data.packageJson = packageJson;\n data.devPortalConfig = devPortalConfig;\n data.sidebar = sidebar;\n\n return new PluginResult();\n } catch (error) {\n return new PluginResult({\n pluginName: \"load-input-files\",\n message: `Failed to load input files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst validateDevPortalEnabled: MigrationPlugin = async (_, { data }) => {\n if (data.devPortalConfig?.enabled === false) {\n return new PluginResult({\n pluginName: \"validate-dev-portal-enabled\",\n message: \"Dev portal is not enabled in the config\",\n severity: \"error\",\n });\n }\n\n return new PluginResult();\n};\n\nconst convertBasicConfig: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig) {\n return new PluginResult({\n pluginName: \"convert-basic-config\",\n message: \"Dev portal config not found\",\n severity: \"error\",\n });\n }\n\n const zudokuConfig: ZudokuConfig = {\n site: {\n title: data.devPortalConfig.pageTitle || \"Developer Portal\",\n logo: {\n src: {\n light: \"https://cdn.zuplo.com/assets/my-dev-portal-light.svg\",\n dark: \"https://cdn.zuplo.com/assets/my-dev-portal-dark.svg\",\n },\n alt: data.devPortalConfig.pageTitle || \"Developer Portal\",\n href: \"/\",\n },\n },\n };\n\n // Map favicon\n if (data.devPortalConfig.faviconUrl) {\n zudokuConfig.metadata = {\n ...zudokuConfig.metadata,\n favicon: data.devPortalConfig.faviconUrl,\n };\n }\n\n // Map page title\n if (data.devPortalConfig.pageTitle) {\n zudokuConfig.metadata = {\n ...zudokuConfig.metadata,\n title: data.devPortalConfig.pageTitle,\n };\n }\n\n // Map site pathname to basePath\n if (data.devPortalConfig.sitePathname) {\n zudokuConfig.basePath = data.devPortalConfig.sitePathname;\n }\n\n // Extract logo URL from theme CSS if available\n if (data.themeCss) {\n try {\n const logoUrlMatch = data.themeCss.match(\n /--logo-url\\s*:\\s*url\\((.*?)\\)/\n );\n if (logoUrlMatch?.[1]) {\n const logoUrl = logoUrlMatch[1].trim();\n zudokuConfig.site = zudokuConfig.site || {};\n zudokuConfig.site.logo = {\n ...zudokuConfig.site.logo,\n src: {\n light: logoUrl,\n dark: logoUrl,\n },\n alt: zudokuConfig.site.title || \"Developer Portal\",\n href: \"/\",\n width: 200,\n };\n }\n } catch (error) {\n // Log warning but don't fail the migration\n const result = new PluginResult();\n result.warnings.push({\n message: `Failed to extract logo URL from theme.css. You will need to set the logo manually.`,\n pluginName: \"convert-basic-config\",\n severity: \"warning\",\n });\n data.zudokuConfig = zudokuConfig;\n return result;\n }\n }\n\n data.zudokuConfig = zudokuConfig;\n return new PluginResult();\n } catch (error) {\n return new PluginResult({\n pluginName: \"convert-basic-config\",\n message: `Failed to convert basic config: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst convertSidebar: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"convert-sidebar\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const convertSidebarToNavigation = (\n oldSidebar: SidebarConfig\n ): ZudokuNavigationItem[] => {\n const navigation: ZudokuNavigationItem[] = [];\n\n if (!oldSidebar.docs) {\n return navigation;\n }\n\n for (const item of oldSidebar.docs) {\n if (typeof item === \"string\") {\n navigation.push(item);\n } else if (item.type === \"doc\") {\n const docItem: ZudokuNavigationItem = {\n type: \"doc\",\n file: item.id,\n label: item.label,\n };\n\n if (\"defaultPage\" in item && item.defaultPage) {\n docItem.path = \"/\";\n }\n\n navigation.push(docItem);\n } else if (item.type === \"category\") {\n const category: ZudokuNavigationItem = {\n type: \"category\",\n label: item.label,\n items: [],\n };\n\n if (item.link) {\n if (typeof item.link === \"string\") {\n category.link = item.link;\n } else if (item.link.type === \"doc\") {\n category.link = { type: \"doc\", file: item.link.id };\n }\n }\n\n if (item.items) {\n category.items = [];\n for (const subItem of item.items) {\n if (typeof subItem === \"string\") {\n category.items.push({\n type: \"doc\",\n file: subItem,\n });\n } else if (subItem.type === \"doc\") {\n category.items.push({\n type: \"doc\",\n file: subItem.id,\n label: subItem.label,\n });\n }\n }\n }\n\n navigation.push(category);\n }\n }\n\n return navigation;\n };\n\n const navigation = convertSidebarToNavigation(data.sidebar);\n data.zudokuConfig = {\n ...data.zudokuConfig,\n navigation,\n };\n\n const result = new PluginResult();\n if (navigation.length > 0) {\n result.notes.push(\n `Converted sidebar navigation: ${navigation.length} navigation items`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"convert-sidebar\",\n message: `Failed to convert sidebar: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleApiReferences: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-api-references\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const apiRefItems = data.sidebar.docs?.filter(\n (item) => typeof item !== \"string\" && item.type === \"api-ref\"\n );\n\n const result = new PluginResult();\n\n if (!apiRefItems || apiRefItems.length === 0) {\n return result;\n }\n\n data.zudokuConfig.apis = apiRefItems.map((apiRefItem, index) => {\n const specInput = apiRefItem.defaultSpec\n ? `../config/${apiRefItem.defaultSpec}.oas.json`\n : \"../config/routes.oas.json\";\n\n const apiPath = index === 0 ? \"/api\" : `/api-${index + 1}`;\n\n result.notes.push(`Migrated API reference to ${apiPath}`);\n\n return {\n type: \"file\" as const,\n input: specInput,\n path: apiPath,\n };\n });\n\n if (apiRefItems.length > 1) {\n result.warnings.push({\n message:\n \"Multiple API references found. Adding multiple links to the navigation. For advanced use cases you can use an API catalog. See: https://zuplo.com/docs/dev-portal/zudoku/configuration/api-catalog.\",\n pluginName: \"handle-api-references\",\n severity: \"warning\",\n });\n }\n\n const navigationLinks = apiRefItems.map((apiRefItem, index) => {\n const apiPath = index === 0 ? \"/api\" : `/api-${index + 1}`;\n return {\n type: \"link\" as const,\n to: apiPath,\n label: apiRefItem.label,\n };\n });\n\n // Add API navigation links to the existing navigation\n data.zudokuConfig.navigation = [\n ...(data.zudokuConfig.navigation || []),\n ...navigationLinks,\n ];\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-api-references\",\n message: `Failed to handle API references: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleAuthentication: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-authentication\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n if (data.devPortalConfig.authentication) {\n const auth = data.devPortalConfig.authentication as DevPortalAuthConfig;\n\n // Extract client info - handle both current and legacy structures\n let clientId: string | undefined;\n let audience: string | undefined;\n let issuer: string | undefined;\n let scope: string | undefined;\n\n if (\"clientId\" in auth) {\n // Current format\n clientId = auth.clientId;\n audience = auth.audience;\n issuer = auth.issuer;\n scope = auth.scope;\n } else if (\"devPortalClient\" in auth) {\n // Legacy format\n clientId = auth.devPortalClient?.clientId;\n audience = auth.devPortalClient?.audience;\n issuer = auth.authority;\n }\n\n if (auth.provider === \"auth0\") {\n data.zudokuConfig.authentication = {\n type: \"auth0\",\n clientId,\n domain: issuer?.replace(\"https://\", \"\").replace(\"/\", \"\"),\n audience,\n scopes: scope?.split(\" \"),\n };\n } else if (auth.provider === \"clerk\") {\n const clerkPubKey = issuer?.match(/clerk\\.accounts\\.dev/)?.[0]\n ? issuer.split(\"://\")[1]?.split(\".\")[0]\n : undefined;\n\n data.zudokuConfig.authentication = {\n type: \"clerk\",\n clerkPubKey: clerkPubKey || clientId,\n };\n } else {\n // All other providers (azure-ad, okta, oidc, etc.) use OpenID Connect\n data.zudokuConfig.authentication = {\n type: \"openid\",\n clientId,\n issuer,\n audience,\n scopes: scope?.split(\" \"),\n };\n }\n }\n\n if (data.zudokuConfig.authentication) {\n deleteUndefinedValues(data.zudokuConfig.authentication);\n }\n\n const result = new PluginResult();\n if (data.zudokuConfig.authentication) {\n result.notes.push(\n `Configured ${data.zudokuConfig.authentication.type} authentication`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-authentication\",\n message: `Failed to handle authentication: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleAdditionalFeatures: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig || !data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-additional-features\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const result = new PluginResult();\n\n // Handle API keys\n if (data.devPortalConfig.apiKeys) {\n data.zudokuConfig.apiKeys = {\n enabled: true,\n };\n }\n\n // Check for unsupported specs filtering\n const hasSpecsFiltering = data.sidebar.docs?.some((item) => {\n if (typeof item === \"string\") return false;\n if (item.type === \"doc\" && \"specs\" in item && item.specs) return true;\n if (item.type === \"category\" && \"specs\" in item && item.specs)\n return true;\n if (item.type === \"category\" && item.items) {\n return item.items.some(\n (subItem) =>\n typeof subItem !== \"string\" && \"specs\" in subItem && subItem.specs\n );\n }\n return false;\n });\n\n if (hasSpecsFiltering) {\n result.warnings.push({\n message:\n \"The 'specs' property for filtering docs by OpenAPI specification is not supported in Zudoku\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n\n if (data.devPortalConfig.monetization) {\n result.warnings.push({\n message:\n \"Monetization configuration is not supported in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n if (data.devPortalConfig.enableMetering) {\n result.warnings.push({\n message: \"Metering is not supported in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n if (\n data.devPortalConfig.authorizePathname &&\n data.devPortalConfig.authorizePathname !== \"/oauth/authorize\"\n ) {\n result.warnings.push({\n message:\n \"Custom authorize pathname is not configurable in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n\n // Add notes for successfully configured features\n if (data.zudokuConfig.apiKeys?.enabled) {\n result.notes.push(\"Enabled API keys support\");\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-additional-features\",\n message: `Failed to handle additional features: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createPackageJson: MigrationPlugin = async (config) => {\n try {\n const packageJsonFile = path.join(\n config.absoluteBaseDir,\n \"docs/package.json\"\n );\n\n if (!config.force && (await exists(packageJsonFile))) {\n return new PluginResult({\n pluginName: \"create-package-json\",\n message: \"package.json already exists\",\n severity: \"warning\",\n });\n }\n\n // get the version of zudoku from npm online:\n const zudokuPackageJson = await fetch(\n \"https://cdn.jsdelivr.net/npm/zudoku/package.json\"\n ).then((res) => res.json());\n\n const packageJsonContent = {\n name: \"docs\",\n version: \"1.0.0\",\n type: \"module\",\n private: true,\n scripts: {\n dev: \"zudoku dev\",\n build: \"zudoku build\",\n start: \"zudoku start\",\n },\n dependencies: {\n zudoku: zudokuPackageJson.version || \"latest\",\n react: zudokuPackageJson.dependencies.react || \"^19.0.0\",\n \"react-dom\": zudokuPackageJson.dependencies[\"react-dom\"] || \"^19.0.0\",\n },\n devDependencies: {\n \"@types/node\": \"^22\",\n \"@types/react\": \">=19\",\n \"@types/react-dom\": \">=19\",\n typescript: zudokuPackageJson.devDependencies.typescript || \"^5\",\n },\n };\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJsonContent, null, 2)\n );\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/package.json\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-package-json\",\n message: `Failed to create package.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createTsConfig: MigrationPlugin = async (config) => {\n try {\n const tsConfigFile = path.join(\n config.absoluteBaseDir,\n \"docs/tsconfig.json\"\n );\n\n if (!config.force && (await exists(tsConfigFile))) {\n return new PluginResult({\n pluginName: \"create-tsconfig\",\n message: \"tsconfig.json already exists\",\n severity: \"warning\",\n });\n }\n\n const tsConfigContent = await fetch(\n \"https://cdn.jsdelivr.net/npm/create-zudoku/dist/templates/zuplo/tsconfig.json\"\n ).then((res) => res.text());\n\n await writeFile(tsConfigFile, tsConfigContent);\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/tsconfig.json\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-tsconfig\",\n message: `Failed to create tsconfig.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst updatePackageJsonWorkspaces: MigrationPlugin = async (config) => {\n try {\n const packageJsonFile = path.join(config.absoluteBaseDir, \"package.json\");\n\n if (!(await exists(packageJsonFile))) {\n return new PluginResult({\n pluginName: \"update-package-json-workspaces\",\n message: \"Root package.json not found\",\n severity: \"warning\",\n });\n }\n\n const packageJsonContent = JSON.parse(\n await readFile(packageJsonFile, \"utf-8\")\n );\n\n if (Array.isArray(packageJsonContent.workspaces)) {\n if (!packageJsonContent.workspaces.includes(\"docs\")) {\n packageJsonContent.workspaces.push(\"docs\");\n }\n } else if (!packageJsonContent.workspaces) {\n packageJsonContent.workspaces = [\"docs\"];\n }\n\n packageJsonContent.scripts = packageJsonContent.scripts || {};\n if (!packageJsonContent.scripts[\"docs\"]) {\n packageJsonContent.scripts[\"docs\"] = \"npm run dev --workspace docs\";\n }\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJsonContent, null, 2)\n );\n\n const result = new PluginResult();\n result.notes.push(\"Updated package.json workspaces\");\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"update-package-json-workspaces\",\n message: `Failed to update package.json workspaces: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst moveMarkdownFiles: MigrationPlugin = async (config) => {\n try {\n const docsDir = path.join(config.absoluteBaseDir, \"docs\");\n const pagesDir = path.join(docsDir, \"pages\");\n\n const markdownFiles = await glob([\"*.md\", \"*.mdx\"], {\n cwd: docsDir,\n absolute: false,\n });\n\n try {\n await mkdir(pagesDir, { recursive: true });\n } catch {\n // directory might already exist, that's okay\n }\n\n const result = new PluginResult();\n const movedFiles: string[] = [];\n\n for (const file of markdownFiles) {\n const sourcePath = path.join(docsDir, file);\n const targetPath = path.join(pagesDir, file);\n\n try {\n await rename(sourcePath, targetPath);\n movedFiles.push(file);\n } catch (error) {\n result.warnings.push({\n message: `Failed to move ${file}: ${(error as Error).message}`,\n pluginName: \"move-markdown-files\",\n severity: \"warning\",\n });\n }\n }\n\n if (movedFiles.length > 0) {\n result.notes.push(\n `Moved ${movedFiles.length} markdown files to docs/pages/`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"move-markdown-files\",\n message: `Failed to move markdown files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst cleanupOldFiles: MigrationPlugin = async (config) => {\n try {\n const filesToCleanup = [\n path.join(config.absoluteBaseDir, \"config/dev-portal.json\"),\n path.join(config.absoluteBaseDir, \"docs/sidebar.json\"),\n ];\n\n const result = new PluginResult();\n const cleanedFiles: string[] = [];\n\n for (const filePath of filesToCleanup) {\n try {\n if (await exists(filePath)) {\n await unlink(filePath);\n cleanedFiles.push(path.relative(config.absoluteBaseDir, filePath));\n }\n } catch (error) {\n result.warnings.push({\n message: `Failed to remove ${path.relative(config.absoluteBaseDir, filePath)}: ${(error as Error).message}`,\n pluginName: \"cleanup-old-files\",\n severity: \"warning\",\n });\n }\n }\n\n if (cleanedFiles.length > 0) {\n result.notes.push(`Cleaned up old files: ${cleanedFiles.join(\", \")}`);\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"cleanup-old-files\",\n message: `Failed to cleanup old files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst writeConfigFile: MigrationPlugin = async (config, { data }) => {\n try {\n if (!data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"write-output-file\",\n message: \"Zudoku config not found\",\n severity: \"error\",\n });\n }\n\n const outputFile = path.join(\n config.absoluteBaseDir,\n \"docs/zudoku.config.tsx\"\n );\n\n const configContent = [];\n\n configContent.push(`// This file was generated by the Zuplo CLI migrate-dev-portal command.\n// It is used to configure the Zuplo dev portal.\n// You can edit this file to customize the dev portal.\n// For more information, see https://zuplo.com/docs/dev-portal/zudoku/configuration/overview`);\n\n configContent.push(`import type { ZudokuConfig } from \"zudoku\";\\n`);\n configContent.push(\n `const config: ZudokuConfig = ${stringifyConfig(data.zudokuConfig)}`\n );\n configContent.push(`export default config;`);\n\n await writeFile(\n outputFile,\n await format(configContent.join(\"\\n\"), { parser: \"typescript\" })\n );\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/zudoku.config.tsx\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"write-output-file\",\n message: `Failed to write output file: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/source/migrate/dev-portal/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n readFile,\n writeFile,\n stat,\n mkdir,\n rename,\n unlink,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport glob from \"fast-glob\";\nimport type {\n DevPortalConfig,\n DevPortalAuthConfig,\n SidebarConfig,\n} from \"@zuplo/types\";\nimport { format } from \"prettier\";\nimport chalk from \"chalk\";\nimport type {\n Arguments,\n MigrationConfig,\n MigrationData,\n MigrationPlugin,\n ZudokuConfig,\n ZudokuNavigationItem,\n} from \"./types.js\";\nimport { printDiagnosticsToConsole } from \"../../../common/output.js\";\nimport { PluginResult, runPlugins } from \"../../../common/runner.js\";\nimport { stringifyConfig } from \"../../../common/utils/stringify-config.js\";\n\nconst exists = (path: string) =>\n stat(path)\n .then(() => true)\n .catch(() => false);\n\nconst deleteUndefinedValues = (obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n if (value === undefined) {\n delete obj[key];\n }\n });\n};\n\nconst execAsync = promisify(exec);\n\nexport const migrateDevPortal = async (args: Arguments) => {\n const absoluteBaseDir = path.resolve(args.dir);\n\n const tasks = [\n checkGitStatus,\n loadInputFiles,\n validateDevPortalEnabled,\n convertBasicConfig,\n convertSidebar,\n handleApiReferences,\n handleAuthentication,\n handleAdditionalFeatures,\n updatePackageJsonWorkspaces,\n createPackageJson,\n createTsConfig,\n moveMarkdownFiles,\n writeConfigFile,\n cleanupOldFiles,\n ];\n\n const pluginConfig: MigrationConfig = {\n absoluteBaseDir,\n force: args.force,\n };\n\n const { errors, warnings, notes } = await runPlugins<\n MigrationConfig,\n MigrationData\n >(tasks, pluginConfig);\n\n // Handle plugin errors first (these are execution failures)\n if (errors.length > 0) {\n printDiagnosticsToConsole(\"āŒ Migration failed with errors:\");\n errors.forEach((error) =>\n printDiagnosticsToConsole(`- [${error.pluginName}] ${error.message}`)\n );\n process.exit(1);\n }\n\n printDiagnosticsToConsole(\n chalk.green(\"\\nāœ… Migration completed successfully! šŸŽ‰\")\n );\n\n if (notes.length > 0) {\n printDiagnosticsToConsole(\"\\nšŸ“ Migration notes:\");\n notes.forEach((note) => printDiagnosticsToConsole(`- ${note}`));\n }\n\n if (warnings.length > 0) {\n printDiagnosticsToConsole(\"\\nāš ļø Plugin warnings:\");\n warnings.forEach((warning) =>\n printDiagnosticsToConsole(`- [${warning.pluginName}] ${warning.message}`)\n );\n }\n\n printDiagnosticsToConsole(\"\\nNext steps:\");\n printDiagnosticsToConsole(\"1. Switch to the docs directory:\");\n printDiagnosticsToConsole(\n ` ${chalk.cyan(`cd ${path.join(absoluteBaseDir, \"docs\")}`)}`\n );\n printDiagnosticsToConsole(\"\\n2. Install dependencies:\");\n printDiagnosticsToConsole(` ${chalk.cyan(\"npm install\")}`);\n printDiagnosticsToConsole(\"\\n3. Start the dev portal:\");\n printDiagnosticsToConsole(` ${chalk.cyan(\"npm run dev\")}`);\n printDiagnosticsToConsole(\"\");\n};\n\nconst checkGitStatus: MigrationPlugin = async (config) => {\n if (config.force) return new PluginResult();\n\n try {\n // Check if we're in a git repository first\n await execAsync(\"git rev-parse --git-dir\", { cwd: config.absoluteBaseDir });\n\n // Check for uncommitted changes\n const status = await execAsync(\"git status --porcelain\", {\n cwd: config.absoluteBaseDir,\n });\n if (status.stdout.trim() !== \"\") {\n return new PluginResult({\n pluginName: \"check-git-status\",\n message:\n \"There are uncommitted changes in the repository.\\nCommit or stash them before running the migration, or use --force to proceed anyway.\",\n severity: \"error\",\n });\n }\n } catch {\n // If git command fails, likely not a git repository - continue silently\n }\n return new PluginResult();\n};\n\nconst loadInputFiles: MigrationPlugin = async (config, { data }) => {\n const dir = config.absoluteBaseDir;\n\n try {\n const packageJson = JSON.parse(\n await readFile(path.join(dir, \"package.json\"), \"utf-8\")\n );\n const inputFile = path.join(dir, \"config/dev-portal.json\");\n const sidebarFile = path.join(dir, \"docs/sidebar.json\");\n\n const devPortalConfig: DevPortalConfig = JSON.parse(\n await readFile(inputFile, \"utf-8\")\n );\n\n const sidebar: SidebarConfig = JSON.parse(\n await readFile(sidebarFile, \"utf-8\")\n );\n\n const themeCssFilePath = path.join(dir, \"docs/theme.css\");\n if (await exists(themeCssFilePath)) {\n data.themeCss = await readFile(themeCssFilePath, \"utf-8\");\n }\n\n data.packageJson = packageJson;\n data.devPortalConfig = devPortalConfig;\n data.sidebar = sidebar;\n\n return new PluginResult();\n } catch (error) {\n return new PluginResult({\n pluginName: \"load-input-files\",\n message: `Failed to load input files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst validateDevPortalEnabled: MigrationPlugin = async (_, { data }) => {\n if (data.devPortalConfig?.enabled === false) {\n return new PluginResult({\n pluginName: \"validate-dev-portal-enabled\",\n message: \"Dev portal is not enabled in the config\",\n severity: \"error\",\n });\n }\n\n return new PluginResult();\n};\n\nconst convertBasicConfig: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig) {\n return new PluginResult({\n pluginName: \"convert-basic-config\",\n message: \"Dev portal config not found\",\n severity: \"error\",\n });\n }\n\n const zudokuConfig: ZudokuConfig = {\n site: {\n title: data.devPortalConfig.pageTitle || \"Developer Portal\",\n logo: {\n src: {\n light: \"https://cdn.zuplo.com/assets/my-dev-portal-light.svg\",\n dark: \"https://cdn.zuplo.com/assets/my-dev-portal-dark.svg\",\n },\n alt: data.devPortalConfig.pageTitle || \"Developer Portal\",\n href: \"/\",\n },\n },\n };\n\n // Map favicon\n if (data.devPortalConfig.faviconUrl) {\n zudokuConfig.metadata = {\n ...zudokuConfig.metadata,\n favicon: data.devPortalConfig.faviconUrl,\n };\n }\n\n // Map page title\n if (data.devPortalConfig.pageTitle) {\n zudokuConfig.metadata = {\n ...zudokuConfig.metadata,\n title: data.devPortalConfig.pageTitle,\n };\n }\n\n // Map site pathname to basePath\n if (data.devPortalConfig.sitePathname) {\n zudokuConfig.basePath = data.devPortalConfig.sitePathname;\n }\n\n // Extract logo URL from theme CSS if available\n if (data.themeCss) {\n try {\n const logoUrlMatch = data.themeCss.match(\n /--logo-url\\s*:\\s*url\\((.*?)\\)/\n );\n if (logoUrlMatch?.[1]) {\n const logoUrl = logoUrlMatch[1].trim();\n zudokuConfig.site = zudokuConfig.site || {};\n zudokuConfig.site.logo = {\n ...zudokuConfig.site.logo,\n src: {\n light: logoUrl,\n dark: logoUrl,\n },\n alt: zudokuConfig.site.title || \"Developer Portal\",\n href: \"/\",\n width: 200,\n };\n }\n } catch (error) {\n // Log warning but don't fail the migration\n const result = new PluginResult();\n result.warnings.push({\n message: `Failed to extract logo URL from theme.css. You will need to set the logo manually.`,\n pluginName: \"convert-basic-config\",\n severity: \"warning\",\n });\n data.zudokuConfig = zudokuConfig;\n return result;\n }\n }\n\n data.zudokuConfig = zudokuConfig;\n return new PluginResult();\n } catch (error) {\n return new PluginResult({\n pluginName: \"convert-basic-config\",\n message: `Failed to convert basic config: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst convertSidebar: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"convert-sidebar\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const convertSidebarToNavigation = (\n oldSidebar: SidebarConfig\n ): ZudokuNavigationItem[] => {\n const navigation: ZudokuNavigationItem[] = [];\n\n if (!oldSidebar.docs) {\n return navigation;\n }\n\n for (const item of oldSidebar.docs) {\n if (typeof item === \"string\") {\n navigation.push(item);\n } else if (item.type === \"doc\") {\n const docItem: ZudokuNavigationItem = {\n type: \"doc\",\n file: item.id,\n label: item.label,\n };\n\n if (\"defaultPage\" in item && item.defaultPage) {\n docItem.path = \"/\";\n }\n\n navigation.push(docItem);\n } else if (item.type === \"category\") {\n const category: ZudokuNavigationItem = {\n type: \"category\",\n label: item.label,\n items: [],\n };\n\n if (item.link) {\n if (typeof item.link === \"string\") {\n category.link = item.link;\n } else if (item.link.type === \"doc\") {\n category.link = { type: \"doc\", file: item.link.id };\n }\n }\n\n if (item.items) {\n category.items = [];\n for (const subItem of item.items) {\n if (typeof subItem === \"string\") {\n category.items.push({\n type: \"doc\",\n file: subItem,\n });\n } else if (subItem.type === \"doc\") {\n category.items.push({\n type: \"doc\",\n file: subItem.id,\n label: subItem.label,\n });\n }\n }\n }\n\n navigation.push(category);\n }\n }\n\n return navigation;\n };\n\n const navigation = convertSidebarToNavigation(data.sidebar);\n data.zudokuConfig = {\n ...data.zudokuConfig,\n navigation,\n };\n\n const result = new PluginResult();\n if (navigation.length > 0) {\n result.notes.push(\n `Converted sidebar navigation: ${navigation.length} navigation items`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"convert-sidebar\",\n message: `Failed to convert sidebar: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleApiReferences: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-api-references\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const apiRefItems = data.sidebar.docs?.filter(\n (item) => typeof item !== \"string\" && item.type === \"api-ref\"\n );\n\n const result = new PluginResult();\n\n if (!apiRefItems || apiRefItems.length === 0) {\n return result;\n }\n\n data.zudokuConfig.apis = apiRefItems.map((apiRefItem, index) => {\n const specInput = apiRefItem.defaultSpec\n ? `../config/${apiRefItem.defaultSpec}.oas.json`\n : \"../config/routes.oas.json\";\n\n const apiPath = index === 0 ? \"/api\" : `/api-${index + 1}`;\n\n result.notes.push(`Migrated API reference to ${apiPath}`);\n\n return {\n type: \"file\" as const,\n input: specInput,\n path: apiPath,\n };\n });\n\n if (apiRefItems.length > 1) {\n result.warnings.push({\n message:\n \"Multiple API references found. Adding multiple links to the navigation. For advanced use cases you can use an API catalog. See: https://zuplo.com/docs/dev-portal/zudoku/configuration/api-catalog.\",\n pluginName: \"handle-api-references\",\n severity: \"warning\",\n });\n }\n\n const navigationLinks = apiRefItems.map((apiRefItem, index) => {\n const apiPath = index === 0 ? \"/api\" : `/api-${index + 1}`;\n return {\n type: \"link\" as const,\n to: apiPath,\n label: apiRefItem.label,\n };\n });\n\n // Add API navigation links to the existing navigation\n data.zudokuConfig.navigation = [\n ...(data.zudokuConfig.navigation || []),\n ...navigationLinks,\n ];\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-api-references\",\n message: `Failed to handle API references: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleAuthentication: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-authentication\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n if (data.devPortalConfig.authentication) {\n const auth = data.devPortalConfig.authentication as DevPortalAuthConfig;\n\n // Extract client info - handle both current and legacy structures\n let clientId: string | undefined;\n let audience: string | undefined;\n let issuer: string | undefined;\n let scope: string | undefined;\n\n if (\"clientId\" in auth) {\n // Current format\n clientId = auth.clientId;\n audience = auth.audience;\n issuer = auth.issuer;\n scope = auth.scope;\n } else if (\"devPortalClient\" in auth) {\n // Legacy format\n clientId = auth.devPortalClient?.clientId;\n audience = auth.devPortalClient?.audience;\n issuer = auth.authority;\n }\n\n if (auth.provider === \"auth0\") {\n data.zudokuConfig.authentication = {\n type: \"auth0\",\n clientId,\n domain: issuer?.replace(\"https://\", \"\").replace(\"/\", \"\"),\n audience,\n scopes: scope?.split(\" \"),\n };\n } else if (auth.provider === \"clerk\") {\n const clerkPubKey = issuer?.match(/clerk\\.accounts\\.dev/)?.[0]\n ? issuer.split(\"://\")[1]?.split(\".\")[0]\n : undefined;\n\n data.zudokuConfig.authentication = {\n type: \"clerk\",\n clerkPubKey: clerkPubKey || clientId,\n };\n } else {\n // All other providers (azure-ad, okta, oidc, etc.) use OpenID Connect\n data.zudokuConfig.authentication = {\n type: \"openid\",\n clientId,\n issuer,\n audience,\n scopes: scope?.split(\" \"),\n };\n }\n }\n\n if (data.zudokuConfig.authentication) {\n deleteUndefinedValues(data.zudokuConfig.authentication);\n }\n\n const result = new PluginResult();\n if (data.zudokuConfig.authentication) {\n result.notes.push(\n `Configured ${data.zudokuConfig.authentication.type} authentication`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-authentication\",\n message: `Failed to handle authentication: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst handleAdditionalFeatures: MigrationPlugin = async (_, { data }) => {\n try {\n if (!data.devPortalConfig || !data.sidebar || !data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"handle-additional-features\",\n message: \"Required data not found\",\n severity: \"error\",\n });\n }\n\n const result = new PluginResult();\n\n // Handle API keys\n if (data.devPortalConfig.apiKeys) {\n data.zudokuConfig.apiKeys = {\n enabled: true,\n };\n }\n\n // Check for unsupported specs filtering\n const hasSpecsFiltering = data.sidebar.docs?.some((item) => {\n if (typeof item === \"string\") return false;\n if (item.type === \"doc\" && \"specs\" in item && item.specs) return true;\n if (item.type === \"category\" && \"specs\" in item && item.specs)\n return true;\n if (item.type === \"category\" && item.items) {\n return item.items.some(\n (subItem) =>\n typeof subItem !== \"string\" && \"specs\" in subItem && subItem.specs\n );\n }\n return false;\n });\n\n if (hasSpecsFiltering) {\n result.warnings.push({\n message:\n \"The 'specs' property for filtering docs by OpenAPI specification is not supported in Zudoku\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n\n if (data.devPortalConfig.monetization) {\n result.warnings.push({\n message:\n \"Monetization configuration is not supported in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n if (data.devPortalConfig.enableMetering) {\n result.warnings.push({\n message: \"Metering is not supported in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n if (\n data.devPortalConfig.authorizePathname &&\n data.devPortalConfig.authorizePathname !== \"/oauth/authorize\"\n ) {\n result.warnings.push({\n message:\n \"Custom authorize pathname is not configurable in the new dev portal.\",\n pluginName: \"handle-additional-features\",\n severity: \"warning\",\n });\n }\n\n // Add notes for successfully configured features\n if (data.zudokuConfig.apiKeys?.enabled) {\n result.notes.push(\"Enabled API keys support\");\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"handle-additional-features\",\n message: `Failed to handle additional features: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createPackageJson: MigrationPlugin = async (config) => {\n try {\n const packageJsonFile = path.join(\n config.absoluteBaseDir,\n \"docs/package.json\"\n );\n\n if (!config.force && (await exists(packageJsonFile))) {\n return new PluginResult({\n pluginName: \"create-package-json\",\n message: \"package.json already exists\",\n severity: \"warning\",\n });\n }\n\n // get the version of zudoku from npm online:\n const zudokuPackageJson = await fetch(\n \"https://cdn.jsdelivr.net/npm/zudoku/package.json\"\n ).then((res) => res.json());\n\n const packageJsonContent = {\n name: \"docs\",\n version: \"1.0.0\",\n type: \"module\",\n private: true,\n scripts: {\n dev: \"zudoku dev\",\n build: \"zudoku build\",\n start: \"zudoku start\",\n },\n dependencies: {\n zudoku: zudokuPackageJson.version || \"latest\",\n react: zudokuPackageJson.dependencies.react || \"^19.0.0\",\n \"react-dom\": zudokuPackageJson.dependencies[\"react-dom\"] || \"^19.0.0\",\n },\n devDependencies: {\n \"@types/node\": \"^22\",\n \"@types/react\": \">=19\",\n \"@types/react-dom\": \">=19\",\n typescript: zudokuPackageJson.devDependencies.typescript || \"^5\",\n },\n };\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJsonContent, null, 2)\n );\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/package.json\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-package-json\",\n message: `Failed to create package.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst createTsConfig: MigrationPlugin = async (config) => {\n try {\n const tsConfigFile = path.join(\n config.absoluteBaseDir,\n \"docs/tsconfig.json\"\n );\n\n if (!config.force && (await exists(tsConfigFile))) {\n return new PluginResult({\n pluginName: \"create-tsconfig\",\n message: \"tsconfig.json already exists\",\n severity: \"warning\",\n });\n }\n\n const tsConfigContent = await fetch(\n \"https://cdn.jsdelivr.net/npm/create-zudoku/dist/templates/zuplo/tsconfig.json\"\n ).then((res) => res.text());\n\n await writeFile(tsConfigFile, tsConfigContent);\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/tsconfig.json\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"create-tsconfig\",\n message: `Failed to create tsconfig.json: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst updatePackageJsonWorkspaces: MigrationPlugin = async (config) => {\n try {\n const packageJsonFile = path.join(config.absoluteBaseDir, \"package.json\");\n\n if (!(await exists(packageJsonFile))) {\n return new PluginResult({\n pluginName: \"update-package-json-workspaces\",\n message: \"Root package.json not found\",\n severity: \"warning\",\n });\n }\n\n const packageJsonContent = JSON.parse(\n await readFile(packageJsonFile, \"utf-8\")\n );\n\n if (Array.isArray(packageJsonContent.workspaces)) {\n if (!packageJsonContent.workspaces.includes(\"docs\")) {\n packageJsonContent.workspaces.push(\"docs\");\n }\n } else if (!packageJsonContent.workspaces) {\n packageJsonContent.workspaces = [\"docs\"];\n }\n\n packageJsonContent.scripts = packageJsonContent.scripts || {};\n if (!packageJsonContent.scripts[\"docs\"]) {\n packageJsonContent.scripts[\"docs\"] = \"npm run dev --workspace docs\";\n }\n\n await writeFile(\n packageJsonFile,\n JSON.stringify(packageJsonContent, null, 2)\n );\n\n const result = new PluginResult();\n result.notes.push(\"Updated package.json workspaces\");\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"update-package-json-workspaces\",\n message: `Failed to update package.json workspaces: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst moveMarkdownFiles: MigrationPlugin = async (config) => {\n try {\n const docsDir = path.join(config.absoluteBaseDir, \"docs\");\n const pagesDir = path.join(docsDir, \"pages\");\n\n const markdownFiles = await glob([\"*.md\", \"*.mdx\"], {\n cwd: docsDir,\n absolute: false,\n });\n\n try {\n await mkdir(pagesDir, { recursive: true });\n } catch {\n // directory might already exist, that's okay\n }\n\n const result = new PluginResult();\n const movedFiles: string[] = [];\n\n for (const file of markdownFiles) {\n const sourcePath = path.join(docsDir, file);\n const targetPath = path.join(pagesDir, file);\n\n try {\n await rename(sourcePath, targetPath);\n movedFiles.push(file);\n } catch (error) {\n result.warnings.push({\n message: `Failed to move ${file}: ${(error as Error).message}`,\n pluginName: \"move-markdown-files\",\n severity: \"warning\",\n });\n }\n }\n\n if (movedFiles.length > 0) {\n result.notes.push(\n `Moved ${movedFiles.length} markdown files to docs/pages/`\n );\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"move-markdown-files\",\n message: `Failed to move markdown files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst cleanupOldFiles: MigrationPlugin = async (config) => {\n try {\n const filesToCleanup = [\n path.join(config.absoluteBaseDir, \"config/dev-portal.json\"),\n path.join(config.absoluteBaseDir, \"docs/sidebar.json\"),\n ];\n\n const result = new PluginResult();\n const cleanedFiles: string[] = [];\n\n for (const filePath of filesToCleanup) {\n try {\n if (await exists(filePath)) {\n await unlink(filePath);\n cleanedFiles.push(path.relative(config.absoluteBaseDir, filePath));\n }\n } catch (error) {\n result.warnings.push({\n message: `Failed to remove ${path.relative(config.absoluteBaseDir, filePath)}: ${(error as Error).message}`,\n pluginName: \"cleanup-old-files\",\n severity: \"warning\",\n });\n }\n }\n\n if (cleanedFiles.length > 0) {\n result.notes.push(`Cleaned up old files: ${cleanedFiles.join(\", \")}`);\n }\n\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"cleanup-old-files\",\n message: `Failed to cleanup old files: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n\nconst writeConfigFile: MigrationPlugin = async (config, { data }) => {\n try {\n if (!data.zudokuConfig) {\n return new PluginResult({\n pluginName: \"write-output-file\",\n message: \"Zudoku config not found\",\n severity: \"error\",\n });\n }\n\n const outputFile = path.join(\n config.absoluteBaseDir,\n \"docs/zudoku.config.tsx\"\n );\n\n const configContent = [];\n\n configContent.push(`// This file was generated by the Zuplo CLI migrate-dev-portal command.\n// It is used to configure the Zuplo dev portal.\n// You can edit this file to customize the dev portal.\n// For more information, see https://zuplo.com/docs/dev-portal/zudoku/configuration/overview`);\n\n configContent.push(`import type { ZudokuConfig } from \"zudoku\";\\n`);\n configContent.push(\n `const config: ZudokuConfig = ${stringifyConfig(data.zudokuConfig)}`\n );\n configContent.push(`export default config;`);\n\n await writeFile(\n outputFile,\n await format(configContent.join(\"\\n\"), { parser: \"typescript\" })\n );\n\n const result = new PluginResult();\n result.notes.push(\"Wrote docs/zudoku.config.tsx\");\n return result;\n } catch (error) {\n return new PluginResult({\n pluginName: \"write-output-file\",\n message: `Failed to write output file: ${(error as Error).message}`,\n severity: \"error\",\n });\n }\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/test/handler.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,iBAyBzC"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/test/handler.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,iBA0BzC"}
@@ -7,7 +7,8 @@ import { generateBuildOptionsForTest } from "./esbuild-config.js";
7
7
  import { runTests } from "./invoke-test.js";
8
8
  import { findTestFiles } from "./test-files.js";
9
9
  export async function test(argv) {
10
- const testDir = path.join(path.normalize(argv.dir), TEST_OUT_FOLDER);
10
+ const normalizedDir = path.resolve(argv.dir);
11
+ const testDir = path.join(normalizedDir, TEST_OUT_FOLDER);
11
12
  rimrafSync(testDir);
12
13
  const result = await esbuild.build({
13
14
  ...generateBuildOptionsForTest(argv),
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/test/handler.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAwB,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAe;IAExC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;IACrE,UAAU,CAAC,OAAO,CAAC,CAAC;IAGpB,MAAM,MAAM,GAAgB,MAAM,OAAO,CAAC,KAAK,CAAC;QAC9C,GAAG,2BAA2B,CAAC,IAAI,CAAC;QACpC,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;KACrC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,MAAM,EACb,qCAAqC,IAAI,CAAC,GAAG,IAAI,cAAc,EAAE,CAClE,CAAC;IACJ,CAAC;SAAM,CAAC;QAEN,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC","sourcesContent":["import path from \"node:path\";\nimport esbuild, { BuildResult } from \"esbuild\";\nimport { rimrafSync } from \"rimraf\";\nimport { TEST_IN_FOLDER, TEST_OUT_FOLDER } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { generateBuildOptionsForTest } from \"./esbuild-config.js\";\nimport { runTests } from \"./invoke-test.js\";\nimport { findTestFiles } from \"./test-files.js\";\n\nexport interface Arguments {\n dir: string;\n endpoint: string;\n filter: string;\n}\n\nexport async function test(argv: Arguments) {\n // 1. Clean out the folder\n const testDir = path.join(path.normalize(argv.dir), TEST_OUT_FOLDER);\n rimrafSync(testDir);\n\n // 2. Build the test files\n const result: BuildResult = await esbuild.build({\n ...generateBuildOptionsForTest(argv),\n entryPoints: findTestFiles(argv.dir),\n });\n\n if (result.warnings.length > 0) {\n logger.debug(result.warnings);\n }\n\n if (result.errors.length > 0) {\n logger.error(\n result.errors,\n `Failed to build the test files in ${argv.dir}/${TEST_IN_FOLDER}`\n );\n } else {\n // 3. Run `node test`\n const { exitCode } = await runTests(argv);\n process.exit(exitCode);\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/test/handler.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAwB,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAe;IAExC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAC1D,UAAU,CAAC,OAAO,CAAC,CAAC;IAGpB,MAAM,MAAM,GAAgB,MAAM,OAAO,CAAC,KAAK,CAAC;QAC9C,GAAG,2BAA2B,CAAC,IAAI,CAAC;QACpC,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;KACrC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,MAAM,EACb,qCAAqC,IAAI,CAAC,GAAG,IAAI,cAAc,EAAE,CAClE,CAAC;IACJ,CAAC;SAAM,CAAC;QAEN,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC","sourcesContent":["import path from \"node:path\";\nimport esbuild, { BuildResult } from \"esbuild\";\nimport { rimrafSync } from \"rimraf\";\nimport { TEST_IN_FOLDER, TEST_OUT_FOLDER } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { generateBuildOptionsForTest } from \"./esbuild-config.js\";\nimport { runTests } from \"./invoke-test.js\";\nimport { findTestFiles } from \"./test-files.js\";\n\nexport interface Arguments {\n dir: string;\n endpoint: string;\n filter: string;\n}\n\nexport async function test(argv: Arguments) {\n // 1. Clean out the folder\n const normalizedDir = path.resolve(argv.dir);\n const testDir = path.join(normalizedDir, TEST_OUT_FOLDER);\n rimrafSync(testDir);\n\n // 2. Build the test files\n const result: BuildResult = await esbuild.build({\n ...generateBuildOptionsForTest(argv),\n entryPoints: findTestFiles(argv.dir),\n });\n\n if (result.warnings.length > 0) {\n logger.debug(result.warnings);\n }\n\n if (result.errors.length > 0) {\n logger.error(\n result.errors,\n `Failed to build the test files in ${argv.dir}/${TEST_IN_FOLDER}`\n );\n } else {\n // 3. Run `node test`\n const { exitCode } = await runTests(argv);\n process.exit(exitCode);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuplo/cli",
3
- "version": "6.62.9",
3
+ "version": "6.62.11",
4
4
  "repository": "https://github.com/zuplo/zuplo",
5
5
  "author": "Zuplo, Inc.",
6
6
  "type": "module",
@@ -29,10 +29,10 @@
29
29
  "@opentelemetry/api": "1.9.0",
30
30
  "@sentry/node": "9.22.0",
31
31
  "@swc/core": "1.10.18",
32
- "@zuplo/core": "6.62.9",
32
+ "@zuplo/core": "6.62.11",
33
33
  "@zuplo/editor": "~1.0.0",
34
- "@zuplo/openapi-tools": "6.62.9",
35
- "@zuplo/runtime": "6.62.9",
34
+ "@zuplo/openapi-tools": "6.62.11",
35
+ "@zuplo/runtime": "6.62.11",
36
36
  "as-table": "1.0.55",
37
37
  "chalk": "5.4.1",
38
38
  "chokidar": "3.5.3",