@zuplo/cli 6.31.1 → 6.31.4

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.
@@ -18,7 +18,7 @@ export async function identify(argv) {
18
18
  const decoded = jose.decodeJwt(authJson.access_token);
19
19
  userId = decoded.sub;
20
20
  }
21
- catch (_err) {
21
+ catch {
22
22
  userId = machineId();
23
23
  }
24
24
  Sentry.setUser({ id: machineId() });
@@ -1 +1 @@
1
- {"version":3,"file":"user-identification.js","sourceRoot":"","sources":["../../../src/common/middleware/user-identification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAgC;IAG7D,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QAEN,IAAI,MAAM,CAAC;QAGX,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,EAChD,OAAO,CACR,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,CAAC;QAAC,OAAO,IAAI,EAAE,CAAC;YAEd,MAAM,GAAG,SAAS,EAAE,CAAC;QACvB,CAAC;QAID,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAEpC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC;IACjC,CAAC;AACH,CAAC","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport * as jose from \"jose\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ZUPLO_AUTH_FILE_NAME } from \"../constants.js\";\nimport { logger } from \"../logger.js\";\nimport { machineId } from \"../machine-id/lib.js\";\nimport { ZUPLO_XDG_STATE_HOME } from \"../xdg/lib.js\";\n\nexport async function identify(argv: { [key: string]: unknown }) {\n // 0. Respect GDPR and allow user to stop-tracking\n // eslint-disable-next-line node/no-process-env\n if (process.env.ZUPLO_DO_NOT_TRACK) {\n logger.trace(\"Sentry traces will be sent without user identification.\");\n } else {\n // We will supplement any Sentry errors with user information\n let userId;\n\n // 1. Read from the result of `zup link` (if it exists)\n try {\n const rawAuth = await readFile(\n join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME),\n \"utf-8\"\n );\n const authJson = JSON.parse(rawAuth);\n const decoded = jose.decodeJwt(authJson.access_token);\n userId = decoded.sub;\n } catch (_err) {\n // 2. Else generate an id from the machine\n userId = machineId();\n }\n\n // 4. Add information to sentry\n // 4a. Always use the machine id as the primary id so that we can relate events when the user is logged in or logged out\n Sentry.setUser({ id: machineId() });\n // 4b. If we have more information about the identity of the user, we can add it as tags\n Sentry.setTag(\"user-id\", userId);\n if (argv.account && typeof argv.account === \"string\") {\n Sentry.setTag(\"account\", argv.account);\n }\n if (argv.project && typeof argv.project === \"string\") {\n Sentry.setTag(\"project\", argv.project);\n }\n // 5. Now that we have identified the user, set it in argv for others to use\n argv[\"zuplo-user-id\"] = userId;\n }\n}\n"]}
1
+ {"version":3,"file":"user-identification.js","sourceRoot":"","sources":["../../../src/common/middleware/user-identification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAgC;IAG7D,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QAEN,IAAI,MAAM,CAAC;QAGX,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,IAAI,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,EAChD,OAAO,CACR,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YAEP,MAAM,GAAG,SAAS,EAAE,CAAC;QACvB,CAAC;QAID,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAEpC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC;IACjC,CAAC;AACH,CAAC","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport * as jose from \"jose\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { ZUPLO_AUTH_FILE_NAME } from \"../constants.js\";\nimport { logger } from \"../logger.js\";\nimport { machineId } from \"../machine-id/lib.js\";\nimport { ZUPLO_XDG_STATE_HOME } from \"../xdg/lib.js\";\n\nexport async function identify(argv: { [key: string]: unknown }) {\n // 0. Respect GDPR and allow user to stop-tracking\n // eslint-disable-next-line node/no-process-env\n if (process.env.ZUPLO_DO_NOT_TRACK) {\n logger.trace(\"Sentry traces will be sent without user identification.\");\n } else {\n // We will supplement any Sentry errors with user information\n let userId;\n\n // 1. Read from the result of `zup link` (if it exists)\n try {\n const rawAuth = await readFile(\n join(ZUPLO_XDG_STATE_HOME, ZUPLO_AUTH_FILE_NAME),\n \"utf-8\"\n );\n const authJson = JSON.parse(rawAuth);\n const decoded = jose.decodeJwt(authJson.access_token);\n userId = decoded.sub;\n } catch {\n // 2. Else generate an id from the machine\n userId = machineId();\n }\n\n // 4. Add information to sentry\n // 4a. Always use the machine id as the primary id so that we can relate events when the user is logged in or logged out\n Sentry.setUser({ id: machineId() });\n // 4b. If we have more information about the identity of the user, we can add it as tags\n Sentry.setTag(\"user-id\", userId);\n if (argv.account && typeof argv.account === \"string\") {\n Sentry.setTag(\"account\", argv.account);\n }\n if (argv.project && typeof argv.project === \"string\") {\n Sentry.setTag(\"project\", argv.project);\n }\n // 5. Now that we have identified the user, set it in argv for others to use\n argv[\"zuplo-user-id\"] = userId;\n }\n}\n"]}
@@ -45,7 +45,7 @@ async function getVersionCheckInfo() {
45
45
  try {
46
46
  versionCheckInfo = await readFile(versionCheckPath, "utf-8").then(JSON.parse);
47
47
  }
48
- catch (_err) {
48
+ catch {
49
49
  }
50
50
  if (versionCheckInfo) {
51
51
  if (typeof versionCheckInfo.lastCheck !== "number" ||
@@ -1 +1 @@
1
- {"version":3,"file":"outdated.js","sourceRoot":"","sources":["../../src/common/outdated.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable node/no-process-env */\nimport chalk from \"chalk\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { gt, inc, lt } from \"semver\";\nimport { ZUPLO_VERSION_CHECK_FILE } from \"./constants.js\";\nimport { printWarningToConsole } from \"./output.js\";\nimport box from \"./utils/box.js\";\nimport { ZUPLO_XDG_STATE_HOME } from \"./xdg/lib.js\";\n\ninterface VersionCheckInfo {\n lastCheck: number;\n latestVersion: string;\n}\nexport async function warnNodeVersion(\n currentCliVersion: string,\n desiredNodeVersion: string\n) {\n const currentNodeVersion = process.versions.node;\n if (lt(currentNodeVersion, desiredNodeVersion)) {\n const nextMajorCliVersion = inc(currentCliVersion, \"major\");\n printWarningToConsole(\n box(\n `You are using Node.js ${currentNodeVersion}. The recommended version for the @zuplo/cli is ${nextMajorCliVersion} or greater.\n Some features might not work as expected. Please update your Node.js version as soon as possible.`\n )\n );\n }\n}\n\nexport async function warnIfOutdatedVersion(currentVersion: string) {\n // Print update information, if available\n if (\n !process.env.ZUPLO_OVERRIDE_CI_TO_TEST &&\n (process.env.CI || process.env.ZUPLO_DISABLE_UPDATE_CHECK)\n ) {\n return false;\n }\n const versionCheckInfo = await getVersionCheckInfo();\n const shouldWarn = gt(versionCheckInfo.latestVersion, currentVersion);\n\n if (shouldWarn) {\n printWarningToConsole(\n box(\n `Update available! ${chalk.gray(`v${currentVersion}`)} ≫ ${chalk.green(\n `v${versionCheckInfo.latestVersion}`\n )}\nRun ${chalk.cyan(\"npm install zuplo@latest\")} to update.\n\n${chalk.gray(\"Older versions are unsupported and may not work as expected.\")}`\n )\n );\n }\n\n return shouldWarn;\n}\n\nasync function getLatestVersion(): Promise<string> {\n const response = await fetch(\n \"https://raw.githubusercontent.com/zuplo/zuplo/main/packages/zuplo/package.json\"\n );\n const result = await response.json();\n\n return result.dependencies[\"@zuplo/cli\"];\n}\n\nasync function getVersionCheckInfo(): Promise<VersionCheckInfo> {\n if (!existsSync(ZUPLO_XDG_STATE_HOME)) {\n mkdirSync(ZUPLO_XDG_STATE_HOME, { recursive: true });\n }\n const versionCheckPath = join(ZUPLO_XDG_STATE_HOME, ZUPLO_VERSION_CHECK_FILE);\n\n let versionCheckInfo: VersionCheckInfo | undefined;\n if (existsSync(versionCheckPath)) {\n try {\n versionCheckInfo = await readFile(versionCheckPath, \"utf-8\").then(\n JSON.parse\n );\n } catch (_err) {\n // Error reading or parsing file, ignore it\n }\n\n // Check if the file is valid, if not ignore it\n if (versionCheckInfo) {\n if (\n typeof versionCheckInfo.lastCheck !== \"number\" ||\n typeof versionCheckInfo.latestVersion !== \"string\"\n ) {\n versionCheckInfo = undefined;\n }\n }\n }\n\n let shouldCheck = true;\n if (versionCheckInfo) {\n const now = Date.now();\n const lastCheck = versionCheckInfo.lastCheck;\n if (now - lastCheck < 1000 * 60 * 60 * 24) {\n shouldCheck = false;\n }\n }\n\n if (!versionCheckInfo || shouldCheck) {\n const latestVersion = await getLatestVersion();\n\n versionCheckInfo = {\n lastCheck: Date.now(),\n latestVersion,\n };\n await writeFile(\n versionCheckPath,\n JSON.stringify(versionCheckInfo),\n \"utf-8\"\n );\n }\n\n return versionCheckInfo;\n}\n"]}
1
+ {"version":3,"file":"outdated.js","sourceRoot":"","sources":["../../src/common/outdated.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable node/no-process-env */\nimport chalk from \"chalk\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { gt, inc, lt } from \"semver\";\nimport { ZUPLO_VERSION_CHECK_FILE } from \"./constants.js\";\nimport { printWarningToConsole } from \"./output.js\";\nimport box from \"./utils/box.js\";\nimport { ZUPLO_XDG_STATE_HOME } from \"./xdg/lib.js\";\n\ninterface VersionCheckInfo {\n lastCheck: number;\n latestVersion: string;\n}\nexport async function warnNodeVersion(\n currentCliVersion: string,\n desiredNodeVersion: string\n) {\n const currentNodeVersion = process.versions.node;\n if (lt(currentNodeVersion, desiredNodeVersion)) {\n const nextMajorCliVersion = inc(currentCliVersion, \"major\");\n printWarningToConsole(\n box(\n `You are using Node.js ${currentNodeVersion}. The recommended version for the @zuplo/cli is ${nextMajorCliVersion} or greater.\n Some features might not work as expected. Please update your Node.js version as soon as possible.`\n )\n );\n }\n}\n\nexport async function warnIfOutdatedVersion(currentVersion: string) {\n // Print update information, if available\n if (\n !process.env.ZUPLO_OVERRIDE_CI_TO_TEST &&\n (process.env.CI || process.env.ZUPLO_DISABLE_UPDATE_CHECK)\n ) {\n return false;\n }\n const versionCheckInfo = await getVersionCheckInfo();\n const shouldWarn = gt(versionCheckInfo.latestVersion, currentVersion);\n\n if (shouldWarn) {\n printWarningToConsole(\n box(\n `Update available! ${chalk.gray(`v${currentVersion}`)} ≫ ${chalk.green(\n `v${versionCheckInfo.latestVersion}`\n )}\nRun ${chalk.cyan(\"npm install zuplo@latest\")} to update.\n\n${chalk.gray(\"Older versions are unsupported and may not work as expected.\")}`\n )\n );\n }\n\n return shouldWarn;\n}\n\nasync function getLatestVersion(): Promise<string> {\n const response = await fetch(\n \"https://raw.githubusercontent.com/zuplo/zuplo/main/packages/zuplo/package.json\"\n );\n const result = await response.json();\n\n return result.dependencies[\"@zuplo/cli\"];\n}\n\nasync function getVersionCheckInfo(): Promise<VersionCheckInfo> {\n if (!existsSync(ZUPLO_XDG_STATE_HOME)) {\n mkdirSync(ZUPLO_XDG_STATE_HOME, { recursive: true });\n }\n const versionCheckPath = join(ZUPLO_XDG_STATE_HOME, ZUPLO_VERSION_CHECK_FILE);\n\n let versionCheckInfo: VersionCheckInfo | undefined;\n if (existsSync(versionCheckPath)) {\n try {\n versionCheckInfo = await readFile(versionCheckPath, \"utf-8\").then(\n JSON.parse\n );\n } catch {\n // Error reading or parsing file, ignore it\n }\n\n // Check if the file is valid, if not ignore it\n if (versionCheckInfo) {\n if (\n typeof versionCheckInfo.lastCheck !== \"number\" ||\n typeof versionCheckInfo.latestVersion !== \"string\"\n ) {\n versionCheckInfo = undefined;\n }\n }\n }\n\n let shouldCheck = true;\n if (versionCheckInfo) {\n const now = Date.now();\n const lastCheck = versionCheckInfo.lastCheck;\n if (now - lastCheck < 1000 * 60 * 60 * 24) {\n shouldCheck = false;\n }\n }\n\n if (!versionCheckInfo || shouldCheck) {\n const latestVersion = await getLatestVersion();\n\n versionCheckInfo = {\n lastCheck: Date.now(),\n latestVersion,\n };\n await writeFile(\n versionCheckPath,\n JSON.stringify(versionCheckInfo),\n \"utf-8\"\n );\n }\n\n return versionCheckInfo;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/common/output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAY,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAMzC,MAAM,UAAU,yBAAyB,CAAC,OAAa,EAAE,YAAkB;IACzE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAExC,IACE,YAAY;QACZ,OAAO,YAAY,KAAK,QAAQ;QAChC,QAAQ,IAAI,YAAY;QACxB,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ,EACvC,CAAC;QAED,OAAO,CAAC,KAAK,CACX,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAC/D,CAAC;IACJ,CAAC;SAAM,IACL,YAAY;QACZ,OAAO,YAAY,KAAK,QAAQ;QAChC,OAAO,IAAI,YAAY;QACvB,OAAO,YAAY,CAAC,KAAK,KAAK,QAAQ,EACtC,CAAC;QAED,OAAO,CAAC,KAAK,CACX,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAa;IACjD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,OAAa,EACb,OAAa;IAEb,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAID,MAAM,UAAU,oBAAoB,CAAC,OAAa;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACzC,CAAC;AAID,MAAM,UAAU,mBAAmB,CAAC,KAAU;IAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qCAAqC,CACzD,OAAa,EACb,OAAa;IAEb,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oCAAoC,CAAC,KAAU;IACnE,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAaD,MAAM,CAAC,OAAO,UAAU,WAAW;IAEjC,IAAI,OAAO,OAAO,KAAK,WAAW;QAAE,OAAO;IAC3C,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,OAAuC,CAAC;QACvD,IACE,MAAM,CAAC,OAAO;YACd,MAAM,CAAC,KAAK;YACZ,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,KAAK,UAAU,EAChD,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE1B,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,aAAa;IACxB,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC;QACb,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/C,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAChD,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;KACnD,CAAC,CAAC;CACJ","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\n\nimport * as Sentry from \"@sentry/node\";\nimport chalk from \"chalk\";\nimport ora, { Ora } from \"ora\";\nimport { MAX_WAIT_PENDING_TIME_MS } from \"./constants.js\";\n\nconst indent = ` ${chalk.gray(\"|\")} `;\n\n// We standardize printing to the terminal with this module\n\n// According to https://unix.stackexchange.com/questions/331611/do-progress-reports-logging-information-belong-on-stderr-or-stdout\n// any diagnostic information should go to stderr, and only the actual output goes to stdout\nexport function printDiagnosticsToConsole(message?: any, maybeProblem?: any) {\n console.error(chalk.bold.blue(message));\n\n if (\n maybeProblem &&\n typeof maybeProblem === \"object\" &&\n \"detail\" in maybeProblem &&\n typeof maybeProblem.detail === \"string\"\n ) {\n // The details are better to log if we have it\n console.error(\n indent + chalk.bold.red(JSON.stringify(maybeProblem, null, 2))\n );\n } else if (\n maybeProblem &&\n typeof maybeProblem === \"object\" &&\n \"title\" in maybeProblem &&\n typeof maybeProblem.title === \"string\"\n ) {\n // If we dont have details then log the title\n console.error(\n indent + chalk.bold.red(JSON.stringify(maybeProblem.title, null, 2))\n );\n }\n}\n\nexport function printSpinnerToConsole(message?: string) {\n return ora(message).start();\n}\n\nexport function printWarningToConsole(message?: any) {\n console.error(chalk.yellow(message));\n}\n\n// This information is displayed to the user, so it should be actionable.\nexport async function printCriticalFailureToConsoleAndExit(\n message?: any,\n spinner?: Ora\n) {\n if (spinner) {\n spinner?.fail(message);\n } else {\n console.error(chalk.bold.red(message));\n }\n await Sentry.close(MAX_WAIT_PENDING_TIME_MS).then(() => {\n process.exit(1);\n });\n}\n\n// Only use this to output the actual result of a command\n// This outputs to STDOUT, which is reserved for the actual result of a command\nexport function printResultToConsole(message?: any) {\n console.log(chalk.bold.green(message));\n}\n\n// Only use this to output the actual result of a command\n// This outputs to STDOUT, which is reserved for the actual result of a command\nexport function printTableToConsole(table: any) {\n console.table(table);\n}\n\nexport async function printResultToConsoleAndExitGracefully(\n message?: any,\n spinner?: Ora\n) {\n if (spinner) {\n spinner?.succeed(message);\n } else {\n printResultToConsole(message);\n }\n await Sentry.close(MAX_WAIT_PENDING_TIME_MS).then(() => {\n process.exit(0);\n });\n}\n\nexport async function printTableToConsoleAndExitGracefully(table: any) {\n printTableToConsole(table);\n await Sentry.close(MAX_WAIT_PENDING_TIME_MS).then(() => {\n process.exit(0);\n });\n}\n\n// See https://nodejs.org/docs/latest-v18.x/api/process.html#a-note-on-process-io\n// We want to deliberately have STDOUT flush synchronously, so we can pipe the output to another command\n\ninterface WriteStreamWithHandle {\n _handle: {\n // eslint-disable-next-line @typescript-eslint/ban-types\n setBlocking: Function;\n };\n isTTY: boolean;\n}\n\nexport default function setBlocking() {\n // Deno and browser have no process object:\n if (typeof process === \"undefined\") return;\n [process.stdout, process.stderr].forEach((_stream) => {\n const stream = _stream as any as WriteStreamWithHandle;\n if (\n stream._handle &&\n stream.isTTY &&\n typeof stream._handle.setBlocking === \"function\"\n ) {\n stream._handle.setBlocking(true);\n }\n });\n}\n\nexport function textOrJson(text: string) {\n try {\n return JSON.parse(text);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (_e) {\n return text;\n }\n}\n\nexport class ConsoleOutput {\n child = () => ({\n info: (message: string) => console.log(message),\n warn: (message: string) => console.warn(message),\n error: (message: string) => console.error(message),\n });\n}\n"]}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/common/output.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-console */\n\nimport * as Sentry from \"@sentry/node\";\nimport chalk from \"chalk\";\nimport ora, { Ora } from \"ora\";\nimport { MAX_WAIT_PENDING_TIME_MS } from \"./constants.js\";\n\nconst indent = ` ${chalk.gray(\"|\")} `;\n\n// We standardize printing to the terminal with this module\n\n// According to https://unix.stackexchange.com/questions/331611/do-progress-reports-logging-information-belong-on-stderr-or-stdout\n// any diagnostic information should go to stderr, and only the actual output goes to stdout\nexport function printDiagnosticsToConsole(message?: any, maybeProblem?: any) {\n console.error(chalk.bold.blue(message));\n\n if (\n maybeProblem &&\n typeof maybeProblem === \"object\" &&\n \"detail\" in maybeProblem &&\n typeof maybeProblem.detail === \"string\"\n ) {\n // The details are better to log if we have it\n console.error(\n indent + chalk.bold.red(JSON.stringify(maybeProblem, null, 2))\n );\n } else if (\n maybeProblem &&\n typeof maybeProblem === \"object\" &&\n \"title\" in maybeProblem &&\n typeof maybeProblem.title === \"string\"\n ) {\n // If we dont have details then log the title\n console.error(\n indent + chalk.bold.red(JSON.stringify(maybeProblem.title, null, 2))\n );\n }\n}\n\nexport function printSpinnerToConsole(message?: string) {\n return ora(message).start();\n}\n\nexport function printWarningToConsole(message?: any) {\n console.error(chalk.yellow(message));\n}\n\n// This information is displayed to the user, so it should be actionable.\nexport async function printCriticalFailureToConsoleAndExit(\n message?: any,\n spinner?: Ora\n) {\n if (spinner) {\n spinner?.fail(message);\n } else {\n console.error(chalk.bold.red(message));\n }\n await Sentry.close(MAX_WAIT_PENDING_TIME_MS).then(() => {\n process.exit(1);\n });\n}\n\n// Only use this to output the actual result of a command\n// This outputs to STDOUT, which is reserved for the actual result of a command\nexport function printResultToConsole(message?: any) {\n console.log(chalk.bold.green(message));\n}\n\n// Only use this to output the actual result of a command\n// This outputs to STDOUT, which is reserved for the actual result of a command\nexport function printTableToConsole(table: any) {\n console.table(table);\n}\n\nexport async function printResultToConsoleAndExitGracefully(\n message?: any,\n spinner?: Ora\n) {\n if (spinner) {\n spinner?.succeed(message);\n } else {\n printResultToConsole(message);\n }\n await Sentry.close(MAX_WAIT_PENDING_TIME_MS).then(() => {\n process.exit(0);\n });\n}\n\nexport async function printTableToConsoleAndExitGracefully(table: any) {\n printTableToConsole(table);\n await Sentry.close(MAX_WAIT_PENDING_TIME_MS).then(() => {\n process.exit(0);\n });\n}\n\n// See https://nodejs.org/docs/latest-v18.x/api/process.html#a-note-on-process-io\n// We want to deliberately have STDOUT flush synchronously, so we can pipe the output to another command\n\ninterface WriteStreamWithHandle {\n _handle: {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n setBlocking: Function;\n };\n isTTY: boolean;\n}\n\nexport default function setBlocking() {\n // Deno and browser have no process object:\n if (typeof process === \"undefined\") return;\n [process.stdout, process.stderr].forEach((_stream) => {\n const stream = _stream as any as WriteStreamWithHandle;\n if (\n stream._handle &&\n stream.isTTY &&\n typeof stream._handle.setBlocking === \"function\"\n ) {\n stream._handle.setBlocking(true);\n }\n });\n}\n\nexport function textOrJson(text: string) {\n try {\n return JSON.parse(text);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (_e) {\n return text;\n }\n}\n\nexport class ConsoleOutput {\n child = () => ({\n info: (message: string) => console.log(message),\n warn: (message: string) => console.warn(message),\n error: (message: string) => console.error(message),\n });\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { readFile, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
- import prettier from "prettier";
3
+ import { format } from "prettier";
4
4
  import { StandardUpgrader } from "./lib.js";
5
5
  export class FailedToParsePackageJson extends Error {
6
6
  constructor() {
@@ -15,7 +15,7 @@ export class PackageJsonUpgrader extends StandardUpgrader {
15
15
  JSON.parse(rawPackage);
16
16
  return { ok: true };
17
17
  }
18
- catch (err) {
18
+ catch {
19
19
  return { ok: false, error: new FailedToParsePackageJson() };
20
20
  }
21
21
  }
@@ -55,7 +55,7 @@ export class PackageJsonUpgrader extends StandardUpgrader {
55
55
  if (packageJson.devDependencies["@types/chai"])
56
56
  delete packageJson.devDependencies["@types/chai"];
57
57
  }
58
- const formatted = await prettier.format(JSON.stringify(packageJson), {
58
+ const formatted = await format(JSON.stringify(packageJson), {
59
59
  parser: "json-stringify",
60
60
  quoteProps: "as-needed",
61
61
  });
@@ -1 +1 @@
1
- {"version":3,"file":"package-json-upgrader.js","sourceRoot":"","sources":["../../../src/common/upgraders/package-json-upgrader.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport prettier from \"prettier\";\nimport { Result } from \"../validators/lib.js\";\nimport { StandardUpgrader } from \"./lib.js\";\n\nexport class FailedToParsePackageJson extends Error {\n constructor() {\n super(\"Invalid package.json: Failed to parse the package.json file.\");\n Object.setPrototypeOf(this, FailedToParsePackageJson.prototype);\n }\n}\n\nexport class PackageJsonUpgrader extends StandardUpgrader {\n async isApplicable(): Promise<Result> {\n try {\n // Read in the package.json file\n const rawPackage = await readFile(\n join(this.normalizedDir, \"package.json\"),\n \"utf-8\"\n );\n JSON.parse(rawPackage);\n return { ok: true };\n } catch (err) {\n return { ok: false, error: new FailedToParsePackageJson() };\n }\n }\n\n async upgrade(): Promise<void> {\n const packageJsonFile = join(this.normalizedDir, \"package.json\");\n const rawPackage = await readFile(packageJsonFile, \"utf-8\");\n\n const packageJson = JSON.parse(rawPackage);\n\n // Add the dev script\n packageJson.scripts.dev = \"zup dev\";\n\n // Remove the build script\n if (\n packageJson.scripts.build &&\n (packageJson.scripts.build === \"zup build\" ||\n packageJson.scripts.build === \"zuplo build\")\n )\n delete packageJson.scripts.build;\n\n // Fix the test script\n if (packageJson.scripts.test && packageJson.scripts.test === \"zuplo test\") {\n packageJson.scripts.test = \"zup test\";\n } else if (!packageJson.scripts.test) {\n packageJson.scripts.test = \"zup test\";\n }\n\n if (\n packageJson.scripts.postinstall &&\n packageJson.scripts.postinstall === \"husky install\"\n ) {\n delete packageJson.scripts.postinstall;\n }\n\n // Tackle the dependencies\n packageJson.dependencies[\"zuplo\"] = \"latest\";\n if (packageJson.dependencies[\"@zuplo/runtime\"]) {\n delete packageJson.dependencies[\"@zuplo/runtime\"];\n }\n if (packageJson.dependencies[\"@zuplo/core\"]) {\n delete packageJson.dependencies[\"@zuplo/core\"];\n }\n\n // Tackle the devDependencies\n if (packageJson.devDependencies) {\n if (packageJson.devDependencies[\"@zuplo/test\"])\n delete packageJson.devDependencies[\"@zuplo/test\"];\n\n if (packageJson.devDependencies[\"husky\"])\n delete packageJson.devDependencies[\"husky\"];\n\n if (packageJson.devDependencies[\"chai\"])\n delete packageJson.devDependencies[\"chai\"];\n\n if (packageJson.devDependencies[\"@types/chai\"])\n delete packageJson.devDependencies[\"@types/chai\"];\n }\n\n // Write out the new package.json\n const formatted = await prettier.format(JSON.stringify(packageJson), {\n parser: \"json-stringify\",\n quoteProps: \"as-needed\",\n });\n\n await writeFile(packageJsonFile, formatted);\n }\n}\n"]}
1
+ {"version":3,"file":"package-json-upgrader.js","sourceRoot":"","sources":["../../../src/common/upgraders/package-json-upgrader.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { format } from \"prettier\";\nimport { Result } from \"../validators/lib.js\";\nimport { StandardUpgrader } from \"./lib.js\";\n\nexport class FailedToParsePackageJson extends Error {\n constructor() {\n super(\"Invalid package.json: Failed to parse the package.json file.\");\n Object.setPrototypeOf(this, FailedToParsePackageJson.prototype);\n }\n}\n\nexport class PackageJsonUpgrader extends StandardUpgrader {\n async isApplicable(): Promise<Result> {\n try {\n // Read in the package.json file\n const rawPackage = await readFile(\n join(this.normalizedDir, \"package.json\"),\n \"utf-8\"\n );\n JSON.parse(rawPackage);\n return { ok: true };\n } catch {\n return { ok: false, error: new FailedToParsePackageJson() };\n }\n }\n\n async upgrade(): Promise<void> {\n const packageJsonFile = join(this.normalizedDir, \"package.json\");\n const rawPackage = await readFile(packageJsonFile, \"utf-8\");\n\n const packageJson = JSON.parse(rawPackage);\n\n // Add the dev script\n packageJson.scripts.dev = \"zup dev\";\n\n // Remove the build script\n if (\n packageJson.scripts.build &&\n (packageJson.scripts.build === \"zup build\" ||\n packageJson.scripts.build === \"zuplo build\")\n )\n delete packageJson.scripts.build;\n\n // Fix the test script\n if (packageJson.scripts.test && packageJson.scripts.test === \"zuplo test\") {\n packageJson.scripts.test = \"zup test\";\n } else if (!packageJson.scripts.test) {\n packageJson.scripts.test = \"zup test\";\n }\n\n if (\n packageJson.scripts.postinstall &&\n packageJson.scripts.postinstall === \"husky install\"\n ) {\n delete packageJson.scripts.postinstall;\n }\n\n // Tackle the dependencies\n packageJson.dependencies[\"zuplo\"] = \"latest\";\n if (packageJson.dependencies[\"@zuplo/runtime\"]) {\n delete packageJson.dependencies[\"@zuplo/runtime\"];\n }\n if (packageJson.dependencies[\"@zuplo/core\"]) {\n delete packageJson.dependencies[\"@zuplo/core\"];\n }\n\n // Tackle the devDependencies\n if (packageJson.devDependencies) {\n if (packageJson.devDependencies[\"@zuplo/test\"])\n delete packageJson.devDependencies[\"@zuplo/test\"];\n\n if (packageJson.devDependencies[\"husky\"])\n delete packageJson.devDependencies[\"husky\"];\n\n if (packageJson.devDependencies[\"chai\"])\n delete packageJson.devDependencies[\"chai\"];\n\n if (packageJson.devDependencies[\"@types/chai\"])\n delete packageJson.devDependencies[\"@types/chai\"];\n }\n\n // Write out the new package.json\n const formatted = await format(JSON.stringify(packageJson), {\n parser: \"json-stringify\",\n quoteProps: \"as-needed\",\n });\n\n await writeFile(packageJsonFile, formatted);\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { parse } from "jsonc-parser";
2
2
  import { readFile, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
- import prettier from "prettier";
4
+ import { format } from "prettier";
5
5
  import { printWarningToConsole } from "../output.js";
6
6
  import { StandardUpgrader } from "./lib.js";
7
7
  export class FailedToParseTSConfigJson extends Error {
@@ -71,7 +71,7 @@ export class TSConfigUpgrader extends StandardUpgrader {
71
71
  !includesAllLibs(tsConfigJson.compilerOptions.lib ?? []));
72
72
  }
73
73
  }
74
- catch (err) {
74
+ catch {
75
75
  return true;
76
76
  }
77
77
  }
@@ -80,7 +80,7 @@ export class TSConfigUpgrader extends StandardUpgrader {
80
80
  return;
81
81
  }
82
82
  const tsFilePath = join(this.normalizedDir, "tsconfig.json");
83
- const formatted = await prettier.format(JSON.stringify(tsConfig), {
83
+ const formatted = await format(JSON.stringify(tsConfig), {
84
84
  parser: "json",
85
85
  });
86
86
  await writeFile(tsFilePath, formatted);
@@ -1 +1 @@
1
- {"version":3,"file":"tsconfig-upgrader.js","sourceRoot":"","sources":["../../../src/common/upgraders/tsconfig-upgrader.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse } from \"jsonc-parser\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport prettier from \"prettier\";\n\nimport { printWarningToConsole } from \"../output.js\";\nimport { Result } from \"../validators/lib.js\";\nimport { StandardUpgrader } from \"./lib.js\";\n\nexport class FailedToParseTSConfigJson extends Error {\n constructor() {\n super(\"Invalid tsconfig.json: Failed to parse the tsconfig.json file.\");\n Object.setPrototypeOf(this, FailedToParseTSConfigJson.prototype);\n }\n}\n\nconst tsConfig = {\n include: [\"modules/**/*\", \".zuplo/**/*\", \"tests/**/*\"],\n exclude: [\"./node_modules\", \"./dist\"],\n compilerOptions: {\n module: \"ESNext\",\n target: \"ES2022\",\n moduleResolution: \"Bundler\",\n lib: [\"ESNext\", \"WebWorker\", \"Webworker.Iterable\"],\n preserveConstEnums: true,\n useUnknownInCatchVariables: false,\n forceConsistentCasingInFileNames: true,\n importHelpers: true,\n removeComments: true,\n esModuleInterop: true,\n strictNullChecks: true,\n noEmit: true,\n },\n};\n\nexport class InvalidTSConfigJson extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, InvalidTSConfigJson.prototype);\n }\n}\n\nexport class TSConfigUpgrader extends StandardUpgrader {\n async isApplicable(): Promise<Result> {\n // Every project should be upgraded, must have tsconfig.json file\n return { ok: true };\n }\n\n async needsUpgrade(): Promise<boolean> {\n try {\n // Read in the tsconfig.json file\n const tsFilePath = join(this.normalizedDir, \"tsconfig.json\");\n const tsConfigRaw = await readFile(tsFilePath, \"utf-8\");\n const tsConfigJson = parse(tsConfigRaw);\n // Validate the compilerOptions property\n if (\n !(\n tsConfigJson &&\n typeof tsConfigJson === \"object\" &&\n \"compilerOptions\" in tsConfigJson\n )\n ) {\n return true;\n }\n\n const libValue = [\"ESNext\", \"WebWorker\", \"Webworker.Iterable\"];\n const includesAllLibs = (userLibs: string[]): boolean => {\n const a = libValue.map((item) => item.toLowerCase());\n const b = userLibs.map((item) => item.toLowerCase());\n return a.every((item) => b.includes(item));\n };\n\n if (tsConfigJson.extends) {\n printWarningToConsole(\n \"This project uses an advanced tsconfig.json setup. You will need to manually upgrade this file.\"\n );\n return false;\n } else {\n const options = tsConfigJson.compilerOptions;\n return (\n options.module?.toLowerCase() !==\n tsConfig.compilerOptions.module.toLowerCase() ||\n options.target?.toLowerCase() !==\n tsConfig.compilerOptions.target.toLowerCase() ||\n options.moduleResolution?.toLowerCase() !==\n tsConfig.compilerOptions.moduleResolution.toLowerCase() ||\n !options.lib ||\n options.baseUrl !== undefined ||\n !includesAllLibs(tsConfigJson.compilerOptions.lib ?? [])\n );\n }\n } catch (err) {\n return true;\n }\n }\n\n async upgrade(): Promise<void> {\n if (!(await this.needsUpgrade())) {\n return;\n }\n const tsFilePath = join(this.normalizedDir, \"tsconfig.json\");\n\n // Write out the new tsconfig.json\n const formatted = await prettier.format(JSON.stringify(tsConfig), {\n parser: \"json\",\n });\n\n await writeFile(tsFilePath, formatted);\n }\n}\n"]}
1
+ {"version":3,"file":"tsconfig-upgrader.js","sourceRoot":"","sources":["../../../src/common/upgraders/tsconfig-upgrader.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse } from \"jsonc-parser\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { format } from \"prettier\";\n\nimport { printWarningToConsole } from \"../output.js\";\nimport { Result } from \"../validators/lib.js\";\nimport { StandardUpgrader } from \"./lib.js\";\n\nexport class FailedToParseTSConfigJson extends Error {\n constructor() {\n super(\"Invalid tsconfig.json: Failed to parse the tsconfig.json file.\");\n Object.setPrototypeOf(this, FailedToParseTSConfigJson.prototype);\n }\n}\n\nconst tsConfig = {\n include: [\"modules/**/*\", \".zuplo/**/*\", \"tests/**/*\"],\n exclude: [\"./node_modules\", \"./dist\"],\n compilerOptions: {\n module: \"ESNext\",\n target: \"ES2022\",\n moduleResolution: \"Bundler\",\n lib: [\"ESNext\", \"WebWorker\", \"Webworker.Iterable\"],\n preserveConstEnums: true,\n useUnknownInCatchVariables: false,\n forceConsistentCasingInFileNames: true,\n importHelpers: true,\n removeComments: true,\n esModuleInterop: true,\n strictNullChecks: true,\n noEmit: true,\n },\n};\n\nexport class InvalidTSConfigJson extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, InvalidTSConfigJson.prototype);\n }\n}\n\nexport class TSConfigUpgrader extends StandardUpgrader {\n async isApplicable(): Promise<Result> {\n // Every project should be upgraded, must have tsconfig.json file\n return { ok: true };\n }\n\n async needsUpgrade(): Promise<boolean> {\n try {\n // Read in the tsconfig.json file\n const tsFilePath = join(this.normalizedDir, \"tsconfig.json\");\n const tsConfigRaw = await readFile(tsFilePath, \"utf-8\");\n const tsConfigJson = parse(tsConfigRaw);\n // Validate the compilerOptions property\n if (\n !(\n tsConfigJson &&\n typeof tsConfigJson === \"object\" &&\n \"compilerOptions\" in tsConfigJson\n )\n ) {\n return true;\n }\n\n const libValue = [\"ESNext\", \"WebWorker\", \"Webworker.Iterable\"];\n const includesAllLibs = (userLibs: string[]): boolean => {\n const a = libValue.map((item) => item.toLowerCase());\n const b = userLibs.map((item) => item.toLowerCase());\n return a.every((item) => b.includes(item));\n };\n\n if (tsConfigJson.extends) {\n printWarningToConsole(\n \"This project uses an advanced tsconfig.json setup. You will need to manually upgrade this file.\"\n );\n return false;\n } else {\n const options = tsConfigJson.compilerOptions;\n return (\n options.module?.toLowerCase() !==\n tsConfig.compilerOptions.module.toLowerCase() ||\n options.target?.toLowerCase() !==\n tsConfig.compilerOptions.target.toLowerCase() ||\n options.moduleResolution?.toLowerCase() !==\n tsConfig.compilerOptions.moduleResolution.toLowerCase() ||\n !options.lib ||\n options.baseUrl !== undefined ||\n !includesAllLibs(tsConfigJson.compilerOptions.lib ?? [])\n );\n }\n } catch {\n return true;\n }\n }\n\n async upgrade(): Promise<void> {\n if (!(await this.needsUpgrade())) {\n return;\n }\n const tsFilePath = join(this.normalizedDir, \"tsconfig.json\");\n\n // Write out the new tsconfig.json\n const formatted = await format(JSON.stringify(tsConfig), {\n parser: \"json\",\n });\n\n await writeFile(tsFilePath, formatted);\n }\n}\n"]}
@@ -2,7 +2,7 @@ import { parse } from "jsonc-parser";
2
2
  import { existsSync } from "node:fs";
3
3
  import { readFile, writeFile } from "node:fs/promises";
4
4
  import { join } from "node:path";
5
- import prettier from "prettier";
5
+ import { format } from "prettier";
6
6
  import { StandardUpgrader, VsCodeFolderMissing } from "./lib.js";
7
7
  const zuploSchemas = [
8
8
  {
@@ -56,7 +56,7 @@ export class VsCodeSettingsJsonUpgrader extends StandardUpgrader {
56
56
  }
57
57
  ]
58
58
  }`;
59
- const formatted = await prettier.format(content, {
59
+ const formatted = await format(content, {
60
60
  parser: "json",
61
61
  quoteProps: "as-needed",
62
62
  });
@@ -74,7 +74,7 @@ export class VsCodeSettingsJsonUpgrader extends StandardUpgrader {
74
74
  settingsJson["json.schemas"].push(schema);
75
75
  }
76
76
  }
77
- const formatted = await prettier.format(JSON.stringify(settingsJson), {
77
+ const formatted = await format(JSON.stringify(settingsJson), {
78
78
  parser: "json",
79
79
  quoteProps: "as-needed",
80
80
  });
@@ -1 +1 @@
1
- {"version":3,"file":"vscode-settings-json-upgrader.js","sourceRoot":"","sources":["../../../src/common/upgraders/vscode-settings-json-upgrader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEjE,MAAM,YAAY,GAAG;IACnB;QACE,SAAS,EAAE,CAAC,mBAAmB,CAAC;QAChC,GAAG,EAAE,uDAAuD;KAC7D;IACD;QACE,SAAS,EAAE,CAAC,sBAAsB,CAAC;QACnC,GAAG,EAAE,6CAA6C;KACnD;IACD;QACE,SAAS,EAAE,CAAC,wBAAwB,CAAC;QACrC,GAAG,EAAE,+CAA+C;KACrD;IACD;QACE,SAAS,EAAE,CAAC,mBAAmB,CAAC;QAChC,GAAG,EAAE,4CAA4C;KAClD;CACF,CAAC;AAEF,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IAC9D,KAAK,CAAC,YAAY;QAChB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,mBAAmB,EAAE,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,kBAAkB,GAAG,IAAI,CAC7B,IAAI,CAAC,aAAa,EAClB,SAAS,EACT,eAAe,CAChB,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAEpC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;EAoBpB,CAAC;YACG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE;gBAC/C,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,WAAW;aACxB,CAAC,CAAC;YACH,MAAM,SAAS,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YAGN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1E,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;gBAClC,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAEtD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CACnD,CAAC;gBACF,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;gBACpE,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,WAAW;aACxB,CAAC,CAAC;YACH,MAAM,SAAS,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CACF","sourcesContent":["import { parse } from \"jsonc-parser\";\nimport { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport prettier from \"prettier\";\nimport { Result } from \"../validators/lib.js\";\nimport { StandardUpgrader, VsCodeFolderMissing } from \"./lib.js\";\n\nconst zuploSchemas = [\n {\n fileMatch: [\"config/*.oas.json\"],\n url: \"https://cdn.zuplo.com/schemas/openapi-v3.1-zuplo.json\",\n },\n {\n fileMatch: [\"config/policies.json\"],\n url: \"https://cdn.zuplo.com/schemas/policies.json\",\n },\n {\n fileMatch: [\"config/dev-portal.json\"],\n url: \"https://cdn.zuplo.com/schemas/dev-portal.json\",\n },\n {\n fileMatch: [\"docs/sidebar.json\"],\n url: \"https://cdn.zuplo.com/schemas/sidebar.json\",\n },\n];\n\nexport class VsCodeSettingsJsonUpgrader extends StandardUpgrader {\n async isApplicable(): Promise<Result> {\n const vsCodeFolder = join(this.normalizedDir, \".vscode\");\n if (existsSync(vsCodeFolder)) {\n return { ok: true };\n } else {\n return { ok: false, error: new VsCodeFolderMissing() };\n }\n }\n\n async upgrade(): Promise<void> {\n const vsCodeSettingsFile = join(\n this.normalizedDir,\n \".vscode\",\n \"settings.json\"\n );\n\n if (!existsSync(vsCodeSettingsFile)) {\n // Create a new one from scratch\n const content = `\n{\n\"json.schemas\": [\n {\n \"fileMatch\": [\"config/*.oas.json\"],\n \"url\": \"https://cdn.zuplo.com/schemas/openapi-v3.1-zuplo.json\"\n },\n {\n \"fileMatch\": [\"config/policies.json\"],\n \"url\": \"https://cdn.zuplo.com/schemas/policies.json\"\n },\n {\n \"fileMatch\": [\"config/dev-portal.json\"],\n \"url\": \"https://cdn.zuplo.com/schemas/dev-portal.json\"\n },\n {\n \"fileMatch\": [\"docs/sidebar.json\"],\n \"url\": \"https://cdn.zuplo.com/schemas/sidebar.json\"\n }\n]\n}`;\n const formatted = await prettier.format(content, {\n parser: \"json\",\n quoteProps: \"as-needed\",\n });\n await writeFile(vsCodeSettingsFile, formatted);\n } else {\n // Upgrade the existing one (safely)\n // NOTE: For safety, I'm parsing this with comments. But, for simplicity, I'm not writing it back with comments.\n const settingsRaw = await readFile(vsCodeSettingsFile, \"utf-8\");\n const settingsJson = parse(settingsRaw, [], { allowTrailingComma: true });\n\n for (const schema of zuploSchemas) {\n const existingSchema = settingsJson[\"json.schemas\"].find(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (s: any) => s.fileMatch[0] === schema.fileMatch[0]\n );\n if (existingSchema) {\n existingSchema.url = schema.url;\n } else {\n settingsJson[\"json.schemas\"].push(schema);\n }\n }\n\n const formatted = await prettier.format(JSON.stringify(settingsJson), {\n parser: \"json\",\n quoteProps: \"as-needed\",\n });\n await writeFile(vsCodeSettingsFile, formatted);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"vscode-settings-json-upgrader.js","sourceRoot":"","sources":["../../../src/common/upgraders/vscode-settings-json-upgrader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEjE,MAAM,YAAY,GAAG;IACnB;QACE,SAAS,EAAE,CAAC,mBAAmB,CAAC;QAChC,GAAG,EAAE,uDAAuD;KAC7D;IACD;QACE,SAAS,EAAE,CAAC,sBAAsB,CAAC;QACnC,GAAG,EAAE,6CAA6C;KACnD;IACD;QACE,SAAS,EAAE,CAAC,wBAAwB,CAAC;QACrC,GAAG,EAAE,+CAA+C;KACrD;IACD;QACE,SAAS,EAAE,CAAC,mBAAmB,CAAC;QAChC,GAAG,EAAE,4CAA4C;KAClD;CACF,CAAC;AAEF,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IAC9D,KAAK,CAAC,YAAY;QAChB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,mBAAmB,EAAE,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,kBAAkB,GAAG,IAAI,CAC7B,IAAI,CAAC,aAAa,EAClB,SAAS,EACT,eAAe,CAChB,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAEpC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;EAoBpB,CAAC;YACG,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE;gBACtC,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,WAAW;aACxB,CAAC,CAAC;YACH,MAAM,SAAS,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YAGN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1E,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;gBAClC,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAEtD,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CACnD,CAAC;gBACF,IAAI,cAAc,EAAE,CAAC;oBACnB,cAAc,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;gBAC3D,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,WAAW;aACxB,CAAC,CAAC;YACH,MAAM,SAAS,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CACF","sourcesContent":["import { parse } from \"jsonc-parser\";\nimport { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { format } from \"prettier\";\nimport { Result } from \"../validators/lib.js\";\nimport { StandardUpgrader, VsCodeFolderMissing } from \"./lib.js\";\n\nconst zuploSchemas = [\n {\n fileMatch: [\"config/*.oas.json\"],\n url: \"https://cdn.zuplo.com/schemas/openapi-v3.1-zuplo.json\",\n },\n {\n fileMatch: [\"config/policies.json\"],\n url: \"https://cdn.zuplo.com/schemas/policies.json\",\n },\n {\n fileMatch: [\"config/dev-portal.json\"],\n url: \"https://cdn.zuplo.com/schemas/dev-portal.json\",\n },\n {\n fileMatch: [\"docs/sidebar.json\"],\n url: \"https://cdn.zuplo.com/schemas/sidebar.json\",\n },\n];\n\nexport class VsCodeSettingsJsonUpgrader extends StandardUpgrader {\n async isApplicable(): Promise<Result> {\n const vsCodeFolder = join(this.normalizedDir, \".vscode\");\n if (existsSync(vsCodeFolder)) {\n return { ok: true };\n } else {\n return { ok: false, error: new VsCodeFolderMissing() };\n }\n }\n\n async upgrade(): Promise<void> {\n const vsCodeSettingsFile = join(\n this.normalizedDir,\n \".vscode\",\n \"settings.json\"\n );\n\n if (!existsSync(vsCodeSettingsFile)) {\n // Create a new one from scratch\n const content = `\n{\n\"json.schemas\": [\n {\n \"fileMatch\": [\"config/*.oas.json\"],\n \"url\": \"https://cdn.zuplo.com/schemas/openapi-v3.1-zuplo.json\"\n },\n {\n \"fileMatch\": [\"config/policies.json\"],\n \"url\": \"https://cdn.zuplo.com/schemas/policies.json\"\n },\n {\n \"fileMatch\": [\"config/dev-portal.json\"],\n \"url\": \"https://cdn.zuplo.com/schemas/dev-portal.json\"\n },\n {\n \"fileMatch\": [\"docs/sidebar.json\"],\n \"url\": \"https://cdn.zuplo.com/schemas/sidebar.json\"\n }\n]\n}`;\n const formatted = await format(content, {\n parser: \"json\",\n quoteProps: \"as-needed\",\n });\n await writeFile(vsCodeSettingsFile, formatted);\n } else {\n // Upgrade the existing one (safely)\n // NOTE: For safety, I'm parsing this with comments. But, for simplicity, I'm not writing it back with comments.\n const settingsRaw = await readFile(vsCodeSettingsFile, \"utf-8\");\n const settingsJson = parse(settingsRaw, [], { allowTrailingComma: true });\n\n for (const schema of zuploSchemas) {\n const existingSchema = settingsJson[\"json.schemas\"].find(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (s: any) => s.fileMatch[0] === schema.fileMatch[0]\n );\n if (existingSchema) {\n existingSchema.url = schema.url;\n } else {\n settingsJson[\"json.schemas\"].push(schema);\n }\n }\n\n const formatted = await format(JSON.stringify(settingsJson), {\n parser: \"json\",\n quoteProps: \"as-needed\",\n });\n await writeFile(vsCodeSettingsFile, formatted);\n }\n }\n}\n"]}
@@ -89,7 +89,7 @@ export async function logConsoleAsync(level, data, callDepth = 0) {
89
89
  try {
90
90
  logEntry = JSON.parse(message);
91
91
  }
92
- catch (e) {
92
+ catch {
93
93
  if (callDepth === 1) {
94
94
  const lines = message.split("\n");
95
95
  await Promise.all(lines.map(async (line) => logConsole(level, line, callDepth++)));
@@ -111,7 +111,7 @@ export async function logConsoleAsync(level, data, callDepth = 0) {
111
111
  console[level](line);
112
112
  }
113
113
  }
114
- catch (err) {
114
+ catch {
115
115
  const line = logFormatter.formatLine(level, data);
116
116
  console[level](line);
117
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"worker-output.js","sourceRoot":"","sources":["../../src/common/worker-output.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\n\nimport { ConsoleLogEntry, LogFormatter, LogLevel } from \"@zuplo/core/cli\";\nimport { Readable } from \"node:stream\";\n\nconst logFormatter = new LogFormatter();\n\nexport function handleRuntimeStdio(stdout: Readable, stderr: Readable) {\n // ASSUMPTION: each chunk is a whole message from workerd\n // This may not hold across OSes/architectures, but it seems to work on macOS M-line\n // I'm going with this simple approach to avoid complicating this too early\n // We can iterate on this heuristic in the future if it causes issues\n const classifiers = {\n // Is this chunk a big chonky barf from workerd that we want to hijack to cleanup/ignore?\n isBarf(chunk: string) {\n const containsLlvmSymbolizerWarning = chunk.includes(\n \"Not symbolizing stack traces because $LLVM_SYMBOLIZER is not set\"\n );\n const containsRecursiveIsolateLockWarning = chunk.includes(\n \"took recursive isolate lock\"\n );\n // Matches stack traces from workerd\n // - on unix: groups of 9 hex digits separated by spaces\n // - on windows: groups of 12 hex digits, or a single digit 0, separated by spaces\n const containsHexStack = /stack:( (0|[a-f\\d]{4,})){3,}/.test(chunk);\n\n return (\n containsLlvmSymbolizerWarning ||\n containsRecursiveIsolateLockWarning ||\n containsHexStack\n );\n },\n // Is this chunk an Address In Use error?\n isAddressInUse(chunk: string) {\n return chunk.includes(\"Address already in use; toString() = \");\n },\n isWarning(chunk: string) {\n return /\\.c\\+\\+:\\d+: warning:/.test(chunk);\n },\n isCodeMovedWarning(chunk: string) {\n return /CODE_MOVED for unknown code block/.test(chunk);\n },\n isAccessViolation(chunk: string) {\n return chunk.includes(\"access violation;\");\n },\n };\n\n stdout.on(\"data\", (chunk: Buffer | string) => {\n chunk = chunk.toString().trim();\n\n if (classifiers.isBarf(chunk)) {\n // this is a big chonky barf from workerd that we want to hijack to cleanup/ignore\n\n // CLEANABLE:\n // there are no known cases to cleanup yet\n // but, as they are identified, we will do that here\n\n // IGNORABLE:\n // anything else not handled above is considered ignorable\n // so send it to the debug logs which are discarded unless\n // the user explicitly sets a logLevel indicating they care\n logConsole(\"debug\", chunk);\n }\n\n // known case: warnings are not info, log them as such\n else if (classifiers.isWarning(chunk)) {\n logConsole(\"warn\", chunk);\n }\n\n // anything not explicitly handled above should be logged as info (via stdout)\n else {\n logConsole(\"error\", chunk);\n }\n });\n\n stderr.on(\"data\", (chunk: Buffer | string) => {\n chunk = chunk.toString().trim();\n\n if (classifiers.isBarf(chunk)) {\n // this is a big chonky barf from workerd that we want to hijack to cleanup/ignore\n\n // CLEANABLE:\n // known case to cleanup: Address in use errors\n if (classifiers.isAddressInUse(chunk)) {\n const address = chunk.match(\n /Address already in use; toString\\(\\) = (.+)\\n/\n )?.[1];\n\n logConsole(\n \"error\",\n `Address already in use (${address}). Please check that you are not already running a server on this address or specify a different port with --port.`\n );\n\n // Log the original error to the debug logs.\n logConsole(\"debug\", chunk);\n }\n // In the past we have seen Access Violation errors on Windows, which may be caused by an outdated\n // version of the Windows OS or the Microsoft Visual C++ Redistributable.\n // See https://github.com/cloudflare/workers-sdk/issues/6170#issuecomment-2245209918\n else if (classifiers.isAccessViolation(chunk)) {\n let error = \"There was an access violation in the runtime.\";\n if (process.platform === \"win32\") {\n error +=\n \"\\nOn Windows, this may be caused by an outdated Microsoft Visual C++ Redistributable library.\\n\" +\n \"Check that you have the latest version installed.\\n\" +\n \"See https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist.\";\n }\n logConsole(\"error\", error);\n\n // Log the original error to the debug logs.\n logConsole(\"debug\", chunk);\n }\n\n // IGNORABLE:\n // anything else not handled above is considered ignorable\n // so send it to the debug logs which are discarded unless\n // the user explicitly sets a logLevel indicating they care\n else {\n logConsole(\"debug\", chunk);\n }\n }\n\n // known case: warnings are not errors, log them as such\n else if (classifiers.isWarning(chunk)) {\n logConsole(\"warn\", chunk);\n }\n\n // known case: \"error: CODE_MOVED for unknown code block?\", warning for workerd devs, not application devs\n else if (classifiers.isCodeMovedWarning(chunk)) {\n // ignore entirely, don't even send it to the debug log file\n }\n\n // anything not explicitly handled above should be logged as an error (via stderr)\n else {\n logConsole(\"error\", chunk);\n }\n });\n}\n\nexport function logConsole(level: LogLevel, data: string, callDepth = 0) {\n void logConsoleAsync(level, data, callDepth);\n}\n\n/**\n * This is what is logged when the runtime calls console.log, etc.\n */\nexport async function logConsoleAsync(\n level: LogLevel,\n data: string,\n callDepth = 0\n) {\n try {\n if (!data) {\n return;\n }\n\n // This shouldn't happen, but just in case\n if (typeof data !== \"string\") {\n console[level](data);\n return;\n }\n\n let message = data?.trim();\n if (!message || message?.length === 0) {\n return;\n }\n\n // Probably a JSON object\n if (message.startsWith(`{`) && message.endsWith(`}`)) {\n let logEntry: ConsoleLogEntry;\n try {\n logEntry = JSON.parse(message);\n } catch (e) {\n // If we are at a depth of 1 it means we are trying to handle the case\n // where a chunk might be multiple JSON entries.\n if (callDepth === 1) {\n // We might have multiple log entries in a single chunk\n // so split them and log each one\n const lines = message.split(\"\\n\");\n await Promise.all(\n lines.map(async (line) => logConsole(level, line, callDepth++))\n );\n return;\n } else {\n console[level](data);\n return;\n }\n }\n await Promise.all(\n logEntry.messages.map(async (msg) => {\n const line = await logFormatter.formatStructured(logEntry, msg);\n console[level](line);\n })\n );\n } else {\n message = await logFormatter.formatMessage(message);\n\n const line = logFormatter.formatLine(level, message);\n console[level](line);\n }\n } catch (err) {\n const line = logFormatter.formatLine(level, data);\n\n console[level](line);\n }\n}\n"]}
1
+ {"version":3,"file":"worker-output.js","sourceRoot":"","sources":["../../src/common/worker-output.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\n\nimport { ConsoleLogEntry, LogFormatter, LogLevel } from \"@zuplo/core/cli\";\nimport { Readable } from \"node:stream\";\n\nconst logFormatter = new LogFormatter();\n\nexport function handleRuntimeStdio(stdout: Readable, stderr: Readable) {\n // ASSUMPTION: each chunk is a whole message from workerd\n // This may not hold across OSes/architectures, but it seems to work on macOS M-line\n // I'm going with this simple approach to avoid complicating this too early\n // We can iterate on this heuristic in the future if it causes issues\n const classifiers = {\n // Is this chunk a big chonky barf from workerd that we want to hijack to cleanup/ignore?\n isBarf(chunk: string) {\n const containsLlvmSymbolizerWarning = chunk.includes(\n \"Not symbolizing stack traces because $LLVM_SYMBOLIZER is not set\"\n );\n const containsRecursiveIsolateLockWarning = chunk.includes(\n \"took recursive isolate lock\"\n );\n // Matches stack traces from workerd\n // - on unix: groups of 9 hex digits separated by spaces\n // - on windows: groups of 12 hex digits, or a single digit 0, separated by spaces\n const containsHexStack = /stack:( (0|[a-f\\d]{4,})){3,}/.test(chunk);\n\n return (\n containsLlvmSymbolizerWarning ||\n containsRecursiveIsolateLockWarning ||\n containsHexStack\n );\n },\n // Is this chunk an Address In Use error?\n isAddressInUse(chunk: string) {\n return chunk.includes(\"Address already in use; toString() = \");\n },\n isWarning(chunk: string) {\n return /\\.c\\+\\+:\\d+: warning:/.test(chunk);\n },\n isCodeMovedWarning(chunk: string) {\n return /CODE_MOVED for unknown code block/.test(chunk);\n },\n isAccessViolation(chunk: string) {\n return chunk.includes(\"access violation;\");\n },\n };\n\n stdout.on(\"data\", (chunk: Buffer | string) => {\n chunk = chunk.toString().trim();\n\n if (classifiers.isBarf(chunk)) {\n // this is a big chonky barf from workerd that we want to hijack to cleanup/ignore\n\n // CLEANABLE:\n // there are no known cases to cleanup yet\n // but, as they are identified, we will do that here\n\n // IGNORABLE:\n // anything else not handled above is considered ignorable\n // so send it to the debug logs which are discarded unless\n // the user explicitly sets a logLevel indicating they care\n logConsole(\"debug\", chunk);\n }\n\n // known case: warnings are not info, log them as such\n else if (classifiers.isWarning(chunk)) {\n logConsole(\"warn\", chunk);\n }\n\n // anything not explicitly handled above should be logged as info (via stdout)\n else {\n logConsole(\"error\", chunk);\n }\n });\n\n stderr.on(\"data\", (chunk: Buffer | string) => {\n chunk = chunk.toString().trim();\n\n if (classifiers.isBarf(chunk)) {\n // this is a big chonky barf from workerd that we want to hijack to cleanup/ignore\n\n // CLEANABLE:\n // known case to cleanup: Address in use errors\n if (classifiers.isAddressInUse(chunk)) {\n const address = chunk.match(\n /Address already in use; toString\\(\\) = (.+)\\n/\n )?.[1];\n\n logConsole(\n \"error\",\n `Address already in use (${address}). Please check that you are not already running a server on this address or specify a different port with --port.`\n );\n\n // Log the original error to the debug logs.\n logConsole(\"debug\", chunk);\n }\n // In the past we have seen Access Violation errors on Windows, which may be caused by an outdated\n // version of the Windows OS or the Microsoft Visual C++ Redistributable.\n // See https://github.com/cloudflare/workers-sdk/issues/6170#issuecomment-2245209918\n else if (classifiers.isAccessViolation(chunk)) {\n let error = \"There was an access violation in the runtime.\";\n if (process.platform === \"win32\") {\n error +=\n \"\\nOn Windows, this may be caused by an outdated Microsoft Visual C++ Redistributable library.\\n\" +\n \"Check that you have the latest version installed.\\n\" +\n \"See https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist.\";\n }\n logConsole(\"error\", error);\n\n // Log the original error to the debug logs.\n logConsole(\"debug\", chunk);\n }\n\n // IGNORABLE:\n // anything else not handled above is considered ignorable\n // so send it to the debug logs which are discarded unless\n // the user explicitly sets a logLevel indicating they care\n else {\n logConsole(\"debug\", chunk);\n }\n }\n\n // known case: warnings are not errors, log them as such\n else if (classifiers.isWarning(chunk)) {\n logConsole(\"warn\", chunk);\n }\n\n // known case: \"error: CODE_MOVED for unknown code block?\", warning for workerd devs, not application devs\n else if (classifiers.isCodeMovedWarning(chunk)) {\n // ignore entirely, don't even send it to the debug log file\n }\n\n // anything not explicitly handled above should be logged as an error (via stderr)\n else {\n logConsole(\"error\", chunk);\n }\n });\n}\n\nexport function logConsole(level: LogLevel, data: string, callDepth = 0) {\n void logConsoleAsync(level, data, callDepth);\n}\n\n/**\n * This is what is logged when the runtime calls console.log, etc.\n */\nexport async function logConsoleAsync(\n level: LogLevel,\n data: string,\n callDepth = 0\n) {\n try {\n if (!data) {\n return;\n }\n\n // This shouldn't happen, but just in case\n if (typeof data !== \"string\") {\n console[level](data);\n return;\n }\n\n let message = data?.trim();\n if (!message || message?.length === 0) {\n return;\n }\n\n // Probably a JSON object\n if (message.startsWith(`{`) && message.endsWith(`}`)) {\n let logEntry: ConsoleLogEntry;\n try {\n logEntry = JSON.parse(message);\n } catch {\n // If we are at a depth of 1 it means we are trying to handle the case\n // where a chunk might be multiple JSON entries.\n if (callDepth === 1) {\n // We might have multiple log entries in a single chunk\n // so split them and log each one\n const lines = message.split(\"\\n\");\n await Promise.all(\n lines.map(async (line) => logConsole(level, line, callDepth++))\n );\n return;\n } else {\n console[level](data);\n return;\n }\n }\n await Promise.all(\n logEntry.messages.map(async (msg) => {\n const line = await logFormatter.formatStructured(logEntry, msg);\n console[level](line);\n })\n );\n } else {\n message = await logFormatter.formatMessage(message);\n\n const line = logFormatter.formatLine(level, message);\n console[level](line);\n }\n } catch {\n const line = logFormatter.formatLine(level, data);\n\n console[level](line);\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { writeFileSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { join, relative } from "node:path";
4
- import prettier from "prettier";
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";
@@ -13,7 +13,7 @@ export async function convert(argv) {
13
13
  const routes = JSON.parse(rawRoutes.toString());
14
14
  const openApi = convertRoutes(routes);
15
15
  const openAPIFilePath = join(normalizedDir, "config", "routes.oas.json");
16
- const formattedOpenAPI = await prettier.format(JSON.stringify(openApi), {
16
+ const formattedOpenAPI = await format(JSON.stringify(openApi), {
17
17
  parser: "json-stringify",
18
18
  });
19
19
  writeFileSync(openAPIFilePath, formattedOpenAPI, {
@@ -21,7 +21,7 @@ export async function convert(argv) {
21
21
  });
22
22
  const policies = convertPolicies(routes);
23
23
  const policiesFilePath = join(normalizedDir, "config", "policies.json");
24
- const formattedPolicies = await prettier.format(JSON.stringify(policies), {
24
+ const formattedPolicies = await format(JSON.stringify(policies), {
25
25
  parser: "json-stringify",
26
26
  });
27
27
  writeFileSync(policiesFilePath, formattedPolicies, {
@@ -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,QAAQ,MAAM,UAAU,CAAC;AAChC,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,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;YACtE,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,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;YACxE,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 prettier 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 prettier.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 prettier.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,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"]}
@@ -125,7 +125,7 @@ export async function generateMetadata(argv) {
125
125
  try {
126
126
  repoUrl = (await git.listRemote(["--get-url"])).trim();
127
127
  }
128
- catch (err) {
128
+ catch {
129
129
  logger.debug("Failed to get the remote URL from the git repository. This can happen if there is no remote configured.");
130
130
  repoUrl = undefined;
131
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/deploy/archive.ts"],"names":[],"mappings":"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","sourcesContent":["import ignore from \"ignore\";\nimport { minimatch } from \"minimatch\";\nimport { randomBytes } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n Stats,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join, relative, sep } from \"node:path\";\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 && brancheRef.all && 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 (err) {\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(`${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 await writeFileSync(\n `${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":"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","sourcesContent":["import ignore from \"ignore\";\nimport { minimatch } from \"minimatch\";\nimport { randomBytes } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n Stats,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join, relative, sep } from \"node:path\";\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 && brancheRef.all && 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(`${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 await writeFileSync(\n `${dir}/.zuplo/${DEPLOYER_METADATA_FILE}`,\n JSON.stringify(metadata, null, 2),\n {\n flag: \"w\",\n }\n );\n}\n"]}
@@ -2,7 +2,7 @@ import { applyEdits, modify } from "jsonc-parser";
2
2
  import { existsSync } from "node:fs";
3
3
  import { readFile, writeFile } from "node:fs/promises";
4
4
  import { join, relative } from "node:path";
5
- import prettier from "prettier";
5
+ import { format } from "prettier";
6
6
  import { ZUPLO_FALLBACK_JSON_FILE, ZUPLO_PREFERRED_JSON_FILE, ZUPLO_SYSTEM_ENV_VAR, } from "../common/constants.js";
7
7
  import { logger } from "../common/logger.js";
8
8
  import { printCriticalFailureToConsoleAndExit } from "../common/output.js";
@@ -17,7 +17,7 @@ export async function safeMergeConfig(dir, project) {
17
17
  getInsertionIndex: () => 2,
18
18
  });
19
19
  const contentsPostProject = applyEdits(originalContents, modifyProjectEdit);
20
- const formatted = await prettier.format(contentsPostProject, {
20
+ const formatted = await format(contentsPostProject, {
21
21
  parser: "json",
22
22
  quoteProps: "as-needed",
23
23
  });
@@ -25,7 +25,7 @@ export async function safeMergeConfig(dir, project) {
25
25
  }
26
26
  else if (existsSync(zuploFallbackConfigFile)) {
27
27
  const config = JSON.parse(await readFile(zuploFallbackConfigFile, "utf-8"));
28
- const formatted = await prettier.format(JSON.stringify({
28
+ const formatted = await format(JSON.stringify({
29
29
  version: 1,
30
30
  project: project,
31
31
  compatibilityDate: config.compatibilityDate,
@@ -36,7 +36,7 @@ export async function safeMergeConfig(dir, project) {
36
36
  await writeFile(zuploPreferredConfigFile, formatted);
37
37
  }
38
38
  else {
39
- const formatted = await prettier.format(JSON.stringify({
39
+ const formatted = await format(JSON.stringify({
40
40
  version: 1,
41
41
  project: project,
42
42
  compatibilityDate: "2023-03-14",
@@ -1 +1 @@
1
- {"version":3,"file":"populate.js","sourceRoot":"","sources":["../../src/link/populate.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyEdits, modify } from \"jsonc-parser\";\nimport { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport prettier from \"prettier\";\nimport {\n ZUPLO_FALLBACK_JSON_FILE,\n ZUPLO_PREFERRED_JSON_FILE,\n ZUPLO_SYSTEM_ENV_VAR,\n} from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { Arguments } from \"../link/handler.js\";\n\nexport async function safeMergeConfig(dir: string, project: string) {\n const normalizedDir = join(relative(process.cwd(), dir));\n const zuploPreferredConfigFile = join(\n normalizedDir,\n ZUPLO_PREFERRED_JSON_FILE\n );\n const zuploFallbackConfigFile = join(normalizedDir, ZUPLO_FALLBACK_JSON_FILE);\n if (existsSync(zuploPreferredConfigFile)) {\n // Process the file, while respecting comments\n // Apply the edits sequentially\n const originalContents = await readFile(zuploPreferredConfigFile, \"utf-8\");\n const modifyProjectEdit = modify(originalContents, [\"project\"], project, {\n getInsertionIndex: () => 2,\n });\n const contentsPostProject = applyEdits(originalContents, modifyProjectEdit);\n const formatted = await prettier.format(contentsPostProject, {\n parser: \"json\",\n quoteProps: \"as-needed\",\n });\n await writeFile(zuploPreferredConfigFile, formatted);\n } else if (existsSync(zuploFallbackConfigFile)) {\n // Copy the file over\n const config = JSON.parse(await readFile(zuploFallbackConfigFile, \"utf-8\"));\n const formatted = await prettier.format(\n JSON.stringify({\n version: 1,\n project: project,\n compatibilityDate: config.compatibilityDate,\n }),\n {\n parser: \"json\",\n quoteProps: \"as-needed\",\n }\n );\n await writeFile(zuploPreferredConfigFile, formatted);\n } else {\n // Create new file\n const formatted = await prettier.format(\n JSON.stringify({\n version: 1,\n project: project,\n compatibilityDate: \"2023-03-14\",\n }),\n {\n parser: \"json\",\n quoteProps: \"as-needed\",\n }\n );\n await writeFile(zuploPreferredConfigFile, formatted);\n }\n}\n\nexport async function pullSystemConfig(\n argv: Pick<Arguments, \"dir\" | \"environment\" | \"api-key\">\n) {\n const normalizedDir = join(relative(process.cwd(), argv.dir));\n const zuploPreferredConfigFile = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n\n const environmentResponseFromDeveloperAPI = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments/${argv.environment}/configurations`,\n {\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n }\n );\n\n if (!environmentResponseFromDeveloperAPI.ok) {\n if (\n environmentResponseFromDeveloperAPI.status === 404 ||\n environmentResponseFromDeveloperAPI.status === 401\n ) {\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to link data from the environment. The environment you specified doesn't exist or you don't have access to it.\"\n );\n } else {\n logger.error(\n {\n status: environmentResponseFromDeveloperAPI.status,\n statusText: environmentResponseFromDeveloperAPI.statusText,\n },\n `Failed to link data from ${argv.environment}`\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to link data from the environment. Please try again later.\"\n );\n }\n }\n\n const payload = await environmentResponseFromDeveloperAPI.json();\n\n const content = `\n# This file is auto-generated from zup link. Please do not edit it manually.\n# It will be auto-generated afresh the next time you run zup link.\n# If you wish to add your own environment variables, create a separate .env file.\n\nZUPLO_ACCOUNT_NAME=${payload.accountName}\nZUPLO_PROJECT_NAME=${payload.projectName}\nZUPLO_ENVIRONMENT_TYPE=${payload.environmentType}\nZUPLO_SYSTEM_CONFIGURATIONS=${payload[\"systemConfigurations\"]}\n`;\n\n await writeFile(zuploPreferredConfigFile, content);\n}\n"]}
1
+ {"version":3,"file":"populate.js","sourceRoot":"","sources":["../../src/link/populate.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyEdits, modify } from \"jsonc-parser\";\nimport { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { format } from \"prettier\";\nimport {\n ZUPLO_FALLBACK_JSON_FILE,\n ZUPLO_PREFERRED_JSON_FILE,\n ZUPLO_SYSTEM_ENV_VAR,\n} from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport { printCriticalFailureToConsoleAndExit } from \"../common/output.js\";\nimport settings from \"../common/settings.js\";\nimport { Arguments } from \"../link/handler.js\";\n\nexport async function safeMergeConfig(dir: string, project: string) {\n const normalizedDir = join(relative(process.cwd(), dir));\n const zuploPreferredConfigFile = join(\n normalizedDir,\n ZUPLO_PREFERRED_JSON_FILE\n );\n const zuploFallbackConfigFile = join(normalizedDir, ZUPLO_FALLBACK_JSON_FILE);\n if (existsSync(zuploPreferredConfigFile)) {\n // Process the file, while respecting comments\n // Apply the edits sequentially\n const originalContents = await readFile(zuploPreferredConfigFile, \"utf-8\");\n const modifyProjectEdit = modify(originalContents, [\"project\"], project, {\n getInsertionIndex: () => 2,\n });\n const contentsPostProject = applyEdits(originalContents, modifyProjectEdit);\n const formatted = await format(contentsPostProject, {\n parser: \"json\",\n quoteProps: \"as-needed\",\n });\n await writeFile(zuploPreferredConfigFile, formatted);\n } else if (existsSync(zuploFallbackConfigFile)) {\n // Copy the file over\n const config = JSON.parse(await readFile(zuploFallbackConfigFile, \"utf-8\"));\n const formatted = await format(\n JSON.stringify({\n version: 1,\n project: project,\n compatibilityDate: config.compatibilityDate,\n }),\n {\n parser: \"json\",\n quoteProps: \"as-needed\",\n }\n );\n await writeFile(zuploPreferredConfigFile, formatted);\n } else {\n // Create new file\n const formatted = await format(\n JSON.stringify({\n version: 1,\n project: project,\n compatibilityDate: \"2023-03-14\",\n }),\n {\n parser: \"json\",\n quoteProps: \"as-needed\",\n }\n );\n await writeFile(zuploPreferredConfigFile, formatted);\n }\n}\n\nexport async function pullSystemConfig(\n argv: Pick<Arguments, \"dir\" | \"environment\" | \"api-key\">\n) {\n const normalizedDir = join(relative(process.cwd(), argv.dir));\n const zuploPreferredConfigFile = join(normalizedDir, ZUPLO_SYSTEM_ENV_VAR);\n\n const environmentResponseFromDeveloperAPI = await fetch(\n `${settings.ZUPLO_DEVELOPER_API_ENDPOINT}/v1/environments/${argv.environment}/configurations`,\n {\n headers: {\n authorization: `Bearer ${argv[\"api-key\"]}`,\n },\n }\n );\n\n if (!environmentResponseFromDeveloperAPI.ok) {\n if (\n environmentResponseFromDeveloperAPI.status === 404 ||\n environmentResponseFromDeveloperAPI.status === 401\n ) {\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to link data from the environment. The environment you specified doesn't exist or you don't have access to it.\"\n );\n } else {\n logger.error(\n {\n status: environmentResponseFromDeveloperAPI.status,\n statusText: environmentResponseFromDeveloperAPI.statusText,\n },\n `Failed to link data from ${argv.environment}`\n );\n await printCriticalFailureToConsoleAndExit(\n \"Error: Failed to link data from the environment. Please try again later.\"\n );\n }\n }\n\n const payload = await environmentResponseFromDeveloperAPI.json();\n\n const content = `\n# This file is auto-generated from zup link. Please do not edit it manually.\n# It will be auto-generated afresh the next time you run zup link.\n# If you wish to add your own environment variables, create a separate .env file.\n\nZUPLO_ACCOUNT_NAME=${payload.accountName}\nZUPLO_PROJECT_NAME=${payload.projectName}\nZUPLO_ENVIRONMENT_TYPE=${payload.environmentType}\nZUPLO_SYSTEM_CONFIGURATIONS=${payload[\"systemConfigurations\"]}\n`;\n\n await writeFile(zuploPreferredConfigFile, content);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/project/import-openapi/handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAelD,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,8IAUzB,CAAC;AAGF,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,iBAkLlD"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/project/import-openapi/handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAelD,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,8IAUzB,CAAC;AAGF,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,iBA+KlD"}
@@ -4,7 +4,7 @@ import { existsSync, writeFileSync } from "node:fs";
4
4
  import { mkdir, readFile, writeFile } from "node:fs/promises";
5
5
  import { tmpdir } from "node:os";
6
6
  import path, { basename, dirname, extname, join, relative } from "node:path";
7
- import prettier from "prettier";
7
+ import { format } from "prettier";
8
8
  import { logger } from "../../common/logger.js";
9
9
  import { printCriticalFailureToConsoleAndExit, printDiagnosticsToConsole, printResultToConsoleAndExitGracefully, } from "../../common/output.js";
10
10
  import { addOperationIdsAsNecessary, generateMergeChangeset, mergeOpenApiDocuments, parseOpenApiFile, } from "./utils.js";
@@ -25,7 +25,7 @@ export async function importOpenApi(argv) {
25
25
  try {
26
26
  new URL(argv.source);
27
27
  }
28
- catch (err) {
28
+ catch {
29
29
  handleAsUrl = false;
30
30
  }
31
31
  if (handleAsUrl) {
@@ -46,13 +46,13 @@ export async function importOpenApi(argv) {
46
46
  normalizedFilePath = normalizedFilePath + ".json";
47
47
  await writeFile(normalizedFilePath, text, { flag: "w+" });
48
48
  }
49
- catch (err) {
49
+ catch {
50
50
  try {
51
51
  jsYaml.load(text);
52
52
  normalizedFilePath = normalizedFilePath + ".yaml";
53
53
  await writeFile(normalizedFilePath, text, { flag: "w+" });
54
54
  }
55
- catch (err) {
55
+ catch {
56
56
  await printCriticalFailureToConsoleAndExit(`Failed to parse the remote OpenAPI file as either JSON or YAML.`);
57
57
  }
58
58
  }
@@ -123,7 +123,7 @@ export async function importOpenApi(argv) {
123
123
  }
124
124
  const mergedDocument = mergeOpenApiDocuments(originalDocument, parsedOpenApiSpec);
125
125
  addOperationIdsAsNecessary(mergedDocument);
126
- const formattedOpenApi = await prettier.format(JSON.stringify(mergedDocument), {
126
+ const formattedOpenApi = await format(JSON.stringify(mergedDocument), {
127
127
  parser: "json-stringify",
128
128
  });
129
129
  if (!existsSync(destinationFilePath)) {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/project/import-openapi/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { confirm } from \"@inquirer/prompts\";\nimport jsYaml from \"js-yaml\";\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path, { basename, dirname, extname, join, relative } from \"node:path\";\nimport prettier from \"prettier\";\nimport { CommonArgs } from \"../../common/args.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../../common/output.js\";\nimport { ZuploOpenApiDocument } from \"./interfaces.js\";\nimport {\n addOperationIdsAsNecessary,\n generateMergeChangeset,\n mergeOpenApiDocuments,\n parseOpenApiFile,\n} from \"./utils.js\";\n\nexport interface Arguments extends CommonArgs {\n dir: string;\n prompt: boolean;\n source: string;\n destination: string;\n \"source-url\": string;\n}\n\nexport const BASE_TEMPLATE = `\n{\n \"openapi\": \"3.1.0\",\n \"info\": {\n \"version\": \"1.0.0\",\n \"title\": \"My Zuplo API\"\n },\n \"paths\": {}\n}\n\n`;\n\n// import is a reserved keyword so importSpec was used instead\nexport async function importOpenApi(argv: Arguments) {\n let normalizedFilePath: string;\n // First see if this is a url\n let handleAsUrl = true;\n try {\n new URL(argv.source);\n } catch (err) {\n handleAsUrl = false;\n }\n\n if (handleAsUrl) {\n const parsedUrl = new URL(argv.source);\n const tempDir = tmpdir();\n const guessedFileName =\n basename(parsedUrl.pathname).replace(/\\.[^/.]+$/, \"\") ||\n `imported-${Buffer.from(argv.source).toString(\"base64\")}`;\n normalizedFilePath = join(tempDir, guessedFileName);\n await mkdir(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 // 1a. See if this is json else try to parse as yaml\n JSON.parse(text);\n normalizedFilePath = normalizedFilePath + \".json\";\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch (err) {\n try {\n // 1b. See if this is yaml\n jsYaml.load(text);\n normalizedFilePath = normalizedFilePath + \".yaml\";\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch (err) {\n await printCriticalFailureToConsoleAndExit(\n `Failed to parse the remote OpenAPI file as either JSON or YAML.`\n );\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 // 1c. This is a normal file so we use the file extension\n const filePath = argv.source;\n normalizedFilePath = join(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 = 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 = join(relative(process.cwd(), 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 const { created, merged, retained } = generateMergeChangeset(\n originalDocument,\n parsedOpenApiSpec\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 ${\n created.size > 1 ? \"operations\" : \"operation\"\n }`\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} new ${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} new ${\n retained.size > 1 ? \"operations\" : \"operation\"\n }`\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 const mergedDocument = mergeOpenApiDocuments(\n originalDocument,\n parsedOpenApiSpec\n );\n\n addOperationIdsAsNecessary(mergedDocument);\n\n const formattedOpenApi = await prettier.format(\n JSON.stringify(mergedDocument),\n {\n parser: \"json-stringify\",\n }\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/project/import-openapi/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { confirm } from \"@inquirer/prompts\";\nimport jsYaml from \"js-yaml\";\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path, { basename, dirname, extname, join, relative } from \"node:path\";\nimport { format } from \"prettier\";\nimport { CommonArgs } from \"../../common/args.js\";\nimport { logger } from \"../../common/logger.js\";\nimport {\n printCriticalFailureToConsoleAndExit,\n printDiagnosticsToConsole,\n printResultToConsoleAndExitGracefully,\n} from \"../../common/output.js\";\nimport { ZuploOpenApiDocument } from \"./interfaces.js\";\nimport {\n addOperationIdsAsNecessary,\n generateMergeChangeset,\n mergeOpenApiDocuments,\n parseOpenApiFile,\n} from \"./utils.js\";\n\nexport interface Arguments extends CommonArgs {\n dir: string;\n prompt: boolean;\n source: string;\n destination: string;\n \"source-url\": string;\n}\n\nexport const BASE_TEMPLATE = `\n{\n \"openapi\": \"3.1.0\",\n \"info\": {\n \"version\": \"1.0.0\",\n \"title\": \"My Zuplo API\"\n },\n \"paths\": {}\n}\n\n`;\n\n// import is a reserved keyword so importSpec was used instead\nexport async function importOpenApi(argv: Arguments) {\n let normalizedFilePath: string;\n // First see if this is a url\n let handleAsUrl = true;\n try {\n new URL(argv.source);\n } catch {\n handleAsUrl = false;\n }\n\n if (handleAsUrl) {\n const parsedUrl = new URL(argv.source);\n const tempDir = tmpdir();\n const guessedFileName =\n basename(parsedUrl.pathname).replace(/\\.[^/.]+$/, \"\") ||\n `imported-${Buffer.from(argv.source).toString(\"base64\")}`;\n normalizedFilePath = join(tempDir, guessedFileName);\n await mkdir(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 // 1a. See if this is json else try to parse as yaml\n JSON.parse(text);\n normalizedFilePath = normalizedFilePath + \".json\";\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch {\n try {\n // 1b. See if this is yaml\n jsYaml.load(text);\n normalizedFilePath = normalizedFilePath + \".yaml\";\n await writeFile(normalizedFilePath, text, { flag: \"w+\" });\n } catch {\n await printCriticalFailureToConsoleAndExit(\n `Failed to parse the remote OpenAPI file as either JSON or YAML.`\n );\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 // 1c. This is a normal file so we use the file extension\n const filePath = argv.source;\n normalizedFilePath = join(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 = 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 = join(relative(process.cwd(), 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 const { created, merged, retained } = generateMergeChangeset(\n originalDocument,\n parsedOpenApiSpec\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 ${\n created.size > 1 ? \"operations\" : \"operation\"\n }`\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} new ${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} new ${\n retained.size > 1 ? \"operations\" : \"operation\"\n }`\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 const mergedDocument = mergeOpenApiDocuments(\n originalDocument,\n parsedOpenApiSpec\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/test/handler.ts"],"names":[],"mappings":"AAWA,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,iBAwBzC"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/test/handler.ts"],"names":[],"mappings":"AAQA,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,iBAwBzC"}
@@ -1,10 +1,10 @@
1
+ import esbuild from "esbuild";
1
2
  import fg from "fast-glob";
2
3
  import { rimrafSync } from "rimraf";
3
4
  import { TEST_IN_FOLDER, TEST_OUT_FOLDER } from "../common/constants.js";
4
5
  import { logger } from "../common/logger.js";
5
6
  import { generateBuildOptionsForTest } from "./esbuild-config.js";
6
7
  import { runTests } from "./invoke-test.js";
7
- import esbuild from "esbuild";
8
8
  export async function test(argv) {
9
9
  rimrafSync(`${argv.dir}/${TEST_OUT_FOLDER}`);
10
10
  const result = await esbuild.build({
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/test/handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,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;AAG5C,OAAO,OAAO,MAAM,SAAS,CAAC;AAQ9B,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAe;IAExC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;IAG7C,MAAM,MAAM,GAAgB,MAAM,OAAO,CAAC,KAAK,CAAC;QAC9C,GAAG,2BAA2B,CAAC,IAAI,CAAC;QACpC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,cAAc,eAAe,CAAC;KACnE,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 { BuildResult } from \"esbuild\";\nimport fg from \"fast-glob\";\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\";\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nimport esbuild from \"esbuild\";\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 rimrafSync(`${argv.dir}/${TEST_OUT_FOLDER}`);\n\n // 2. Build the test files\n const result: BuildResult = await esbuild.build({\n ...generateBuildOptionsForTest(argv),\n entryPoints: fg.sync(`${argv.dir}/${TEST_IN_FOLDER}/**/*.test.ts`),\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,OAAwB,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3B,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;AAQ5C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAe;IAExC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;IAG7C,MAAM,MAAM,GAAgB,MAAM,OAAO,CAAC,KAAK,CAAC;QAC9C,GAAG,2BAA2B,CAAC,IAAI,CAAC;QACpC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,cAAc,eAAe,CAAC;KACnE,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 esbuild, { BuildResult } from \"esbuild\";\nimport fg from \"fast-glob\";\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\";\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 rimrafSync(`${argv.dir}/${TEST_OUT_FOLDER}`);\n\n // 2. Build the test files\n const result: BuildResult = await esbuild.build({\n ...generateBuildOptionsForTest(argv),\n entryPoints: fg.sync(`${argv.dir}/${TEST_IN_FOLDER}/**/*.test.ts`),\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 +1 @@
1
- {"root":["../src/cli.ts","../src/types.d.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/engine.test.ts","../src/__tests__/import-openapi-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/oas-test-data.ts","../src/__tests__/outdated.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/build/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/convert.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/editor.ts","../src/cmds/link.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/test.ts","../src/cmds/project/import-openapi.ts","../src/cmds/project/index.ts","../src/cmds/project/update.ts","../src/cmds/tunnel/create.ts","../src/cmds/tunnel/delete.ts","../src/cmds/tunnel/describe.ts","../src/cmds/tunnel/index.ts","../src/cmds/tunnel/list.ts","../src/cmds/tunnel/rotate-token.ts","../src/cmds/tunnel/services/describe.ts","../src/cmds/tunnel/services/index.ts","../src/cmds/tunnel/services/update.ts","../src/cmds/variable/create.ts","../src/cmds/variable/index.ts","../src/cmds/variable/update.ts","../src/common/alias.ts","../src/common/args.ts","../src/common/constants.ts","../src/common/handler.ts","../src/common/logger.ts","../src/common/models.ts","../src/common/outdated.ts","../src/common/output.ts","../src/common/settings.ts","../src/common/worker-output.ts","../src/common/analytics/lib.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/upgraders/lib.ts","../src/common/upgraders/package-json-upgrader.ts","../src/common/upgraders/tsconfig-upgrader.ts","../src/common/upgraders/vscode-settings-json-upgrader.ts","../src/common/utils/box.ts","../src/common/utils/ports.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/login-state-validator.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/convert/engine.ts","../src/convert/handler.ts","../src/convert/routes.legacy.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.ts","../src/deploy/environments.ts","../src/deploy/file-upload.ts","../src/deploy/handler.ts","../src/deploy/poll-deployment.ts","../src/dev/handler.ts","../src/editor/handler.ts","../src/editor/assets/index-03352ce7.js","../src/editor/server/cors-plugin.ts","../src/editor/server/server.ts","../src/editor/server/xfs.ts","../src/link/handler.ts","../src/link/populate.ts","../src/list/handler.ts","../src/login/handler.ts","../src/login/server.ts","../src/project/import-openapi/handler.ts","../src/project/import-openapi/interfaces.ts","../src/project/import-openapi/utils.ts","../src/project/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.ts","../src/test/esbuild-plugins/node-test-prep-plugin.ts","../src/tunnel/models.ts","../src/tunnel/create/handler.ts","../src/tunnel/delete/handler.ts","../src/tunnel/delete/poll-teardown-operation.ts","../src/tunnel/describe/handler.ts","../src/tunnel/list/handler.ts","../src/tunnel/rotate-token/handler.ts","../src/tunnel/services/describe/handler.ts","../src/tunnel/services/update/handler.ts","../src/tunnel/services/update/poll-provisioning-operations.ts","../src/variable/models.ts","../src/variable/create/handler.ts","../src/variable/update/handler.ts"],"version":"5.6.3"}
1
+ {"root":["../src/cli.ts","../src/types.d.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/engine.test.ts","../src/__tests__/import-openapi-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/oas-test-data.ts","../src/__tests__/outdated.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/build/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/convert.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/editor.ts","../src/cmds/link.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/test.ts","../src/cmds/project/import-openapi.ts","../src/cmds/project/index.ts","../src/cmds/project/update.ts","../src/cmds/tunnel/create.ts","../src/cmds/tunnel/delete.ts","../src/cmds/tunnel/describe.ts","../src/cmds/tunnel/index.ts","../src/cmds/tunnel/list.ts","../src/cmds/tunnel/rotate-token.ts","../src/cmds/tunnel/services/describe.ts","../src/cmds/tunnel/services/index.ts","../src/cmds/tunnel/services/update.ts","../src/cmds/variable/create.ts","../src/cmds/variable/index.ts","../src/cmds/variable/update.ts","../src/common/alias.ts","../src/common/args.ts","../src/common/constants.ts","../src/common/handler.ts","../src/common/logger.ts","../src/common/models.ts","../src/common/outdated.ts","../src/common/output.ts","../src/common/settings.ts","../src/common/worker-output.ts","../src/common/analytics/lib.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/upgraders/lib.ts","../src/common/upgraders/package-json-upgrader.ts","../src/common/upgraders/tsconfig-upgrader.ts","../src/common/upgraders/vscode-settings-json-upgrader.ts","../src/common/utils/box.ts","../src/common/utils/ports.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/login-state-validator.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/convert/engine.ts","../src/convert/handler.ts","../src/convert/routes.legacy.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.ts","../src/deploy/environments.ts","../src/deploy/file-upload.ts","../src/deploy/handler.ts","../src/deploy/poll-deployment.ts","../src/dev/handler.ts","../src/editor/handler.ts","../src/editor/assets/index-03352ce7.js","../src/editor/server/cors-plugin.ts","../src/editor/server/server.ts","../src/editor/server/xfs.ts","../src/link/handler.ts","../src/link/populate.ts","../src/list/handler.ts","../src/login/handler.ts","../src/login/server.ts","../src/project/import-openapi/handler.ts","../src/project/import-openapi/interfaces.ts","../src/project/import-openapi/utils.ts","../src/project/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.ts","../src/test/esbuild-plugins/node-test-prep-plugin.ts","../src/tunnel/models.ts","../src/tunnel/create/handler.ts","../src/tunnel/delete/handler.ts","../src/tunnel/delete/poll-teardown-operation.ts","../src/tunnel/describe/handler.ts","../src/tunnel/list/handler.ts","../src/tunnel/rotate-token/handler.ts","../src/tunnel/services/describe/handler.ts","../src/tunnel/services/update/handler.ts","../src/tunnel/services/update/poll-provisioning-operations.ts","../src/variable/models.ts","../src/variable/create/handler.ts","../src/variable/update/handler.ts"],"version":"5.7.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuplo/cli",
3
- "version": "6.31.1",
3
+ "version": "6.31.4",
4
4
  "repository": "https://github.com/zuplo/zuplo",
5
5
  "author": "Zuplo, Inc.",
6
6
  "type": "module",
@@ -29,8 +29,8 @@
29
29
  "@opentelemetry/api": "^1.8.0",
30
30
  "@sentry/node": "^8.47.0",
31
31
  "@swc/core": "1.7.22",
32
- "@zuplo/core": "^6.31.1",
33
- "@zuplo/runtime": "^6.31.1",
32
+ "@zuplo/core": "^6.31.4",
33
+ "@zuplo/runtime": "^6.31.4",
34
34
  "as-table": "^1.0.55",
35
35
  "chalk": "^5.3.0",
36
36
  "chokidar": "^3.5.3",