@zuplo/cli 6.74.14 → 7.0.0

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.
package/dist/cli.js CHANGED
@@ -43,8 +43,8 @@ import setBlocking, { printCriticalFailureToConsole, printCriticalFailureToConso
43
43
  if (process.env.ZUPLO_CLI_PROFILING) {
44
44
  await confirm({ message: "Continue executing CLI?", default: true });
45
45
  }
46
- const MIN_NODE_VERSION = "18.0.0";
47
- const RECOMMENDED_NODE_VERSION = "20.0.0";
46
+ const MIN_NODE_VERSION = "24.0.0";
47
+ const RECOMMENDED_NODE_VERSION = "24.0.0";
48
48
  if (gte(process.versions.node, MIN_NODE_VERSION)) {
49
49
  let cliVersion;
50
50
  try {
@@ -56,7 +56,7 @@ if (gte(process.versions.node, MIN_NODE_VERSION)) {
56
56
  logger.error(e);
57
57
  await printCriticalFailureToConsoleAndExit(`Unable to load @zuplo/cli. The package.json is missing or malformed.`);
58
58
  }
59
- await warnNodeVersion(cliVersion, RECOMMENDED_NODE_VERSION);
59
+ await warnNodeVersion(RECOMMENDED_NODE_VERSION);
60
60
  configureCliDispatcher(cliVersion);
61
61
  const cli = yargs(hideBin(process.argv))
62
62
  .env("ZUPLO")
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["import * as dotenv from \"dotenv\";\n\ndotenv.config();\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { gte } from \"semver\";\nimport { hideBin } from \"yargs/helpers\";\nimport yargs from \"yargs/yargs\";\nimport bucket from \"./cmds/bucket/index.js\";\nimport build from \"./cmds/build.js\";\nimport caCertificate from \"./cmds/ca-certificate/index.js\";\nimport compile from \"./cmds/compile.js\";\nimport customDomain from \"./cmds/custom-domain/index.js\";\nimport deleteZup from \"./cmds/delete.js\";\nimport deploy from \"./cmds/deploy.js\";\nimport dev from \"./cmds/dev.js\";\nimport docs from \"./cmds/docs.js\";\nimport editor from \"./cmds/editor.js\";\nimport info from \"./cmds/info.js\";\nimport init from \"./cmds/init.js\";\nimport link from \"./cmds/link.js\";\nimport list from \"./cmds/list.js\";\nimport login from \"./cmds/login.js\";\nimport logout from \"./cmds/logout.js\";\nimport mtlsCertificates from \"./cmds/mtls-certificates/index.js\";\nimport oas from \"./cmds/open-api/index.js\";\nimport project from \"./cmds/project/index.js\";\nimport proxies from \"./cmds/proxies/index.js\";\nimport source from \"./cmds/source/index.js\";\nimport test from \"./cmds/test.js\";\nimport tunnel from \"./cmds/tunnel/index.js\";\nimport variable from \"./cmds/variable/index.js\";\nimport whoami from \"./cmds/whoami.js\";\nimport { captureCliInvocationEvent } from \"./common/analytics/cli-invocation.js\";\nimport { captureError, shutdownAnalytics } from \"./common/analytics/lib.js\";\nimport { ApiError } from \"./common/api/client.js\";\nimport { configureCliDispatcher } from \"./common/cli-dispatcher.js\";\nimport { logger } from \"./common/logger.js\";\nimport { checkPnpmLifecycle } from \"./common/middleware/check-pnpm-lifecycle.js\";\nimport { logLevel } from \"./common/middleware/logging.js\";\nimport { warnIfOutdatedVersion, warnNodeVersion } from \"./common/outdated.js\";\nimport setBlocking, {\n printCriticalFailureToConsole,\n printCriticalFailureToConsoleAndExit,\n} from \"./common/output.js\";\n\n// This allows us to stop the CLI from executing so we can connect the profiler\n\n// biome-ignore lint/style/noProcessEnv: Migrated from ESLint\nif (process.env.ZUPLO_CLI_PROFILING) {\n await confirm({ message: \"Continue executing CLI?\", default: true });\n}\n\n// Note: We cannot set this to be higher than 18.0.0 because of the way\n// our documentation works -- we tell them to use npx @zuplo/cli@latest (even in CI/CD jobs)\n// If we set this to be higher than 18.0.0, then we will break them.\n// Instead we set the value in package.json to be engine.node >= 20.0.0, so it will warn\nconst MIN_NODE_VERSION = \"18.0.0\";\nconst RECOMMENDED_NODE_VERSION = \"20.0.0\";\n\nif (gte(process.versions.node, MIN_NODE_VERSION)) {\n let cliVersion: string;\n try {\n const packageJson = JSON.parse(\n readFileSync(\n fileURLToPath(new URL(\"../package.json\", import.meta.url)),\n \"utf-8\"\n )\n );\n cliVersion = packageJson.version;\n } catch (e) {\n cliVersion = \"0.0.0\";\n logger.error(e);\n await printCriticalFailureToConsoleAndExit(\n `Unable to load @zuplo/cli. The package.json is missing or malformed.`\n );\n }\n\n await warnNodeVersion(cliVersion, RECOMMENDED_NODE_VERSION);\n\n // Install CLI identity headers on undici's global dispatcher before any\n // command handlers run fetch.\n configureCliDispatcher(cliVersion);\n\n const cli = yargs(hideBin(process.argv))\n // This means that all env vars will have to be prefixed with ZUPLO_\n .env(\"ZUPLO\")\n .option(\"prompt\", {\n type: \"boolean\",\n describe: \"Bypass confirmation prompts\",\n default: true,\n hidden: true,\n })\n .option(\"verbose\", {\n alias: \"v\",\n type: \"count\",\n describe: \"Increase verbosity level (-v, -vv, -vvv)\",\n default: 0,\n })\n // setBlocking forces synchronous TTY writes so error messages flush before\n // process.exit. Runs first so subsequent middleware (including the\n // preflight, which can exit) benefit from it.\n .middleware(setBlocking)\n .middleware(logLevel)\n .middleware(checkPnpmLifecycle)\n .middleware((argv) => {\n void captureCliInvocationEvent(argv, cliVersion);\n })\n .command(caCertificate)\n .command(compile)\n .command(customDomain)\n .command(deleteZup) // delete is a reserved keyword in JavaScript, so we call this function deleteZup\n .command(deploy)\n .command(dev)\n .command(docs)\n .command(editor)\n .command(info)\n .command(init)\n .command(list)\n .command(link)\n .command(login)\n .command(logout)\n .command(test)\n .command(oas)\n .command(mtlsCertificates)\n .command(project)\n .command(source)\n .command(tunnel)\n .command(variable)\n .command(build)\n .command(bucket)\n .command(proxies)\n .command(whoami)\n .demandCommand()\n .strictCommands()\n .version(cliVersion)\n .fail(false)\n .help();\n\n let exitCode = 0;\n try {\n await cli.argv;\n\n // Don't block\n void warnIfOutdatedVersion(cliVersion);\n } catch (err) {\n exitCode = 1;\n if (err instanceof Error) {\n await captureError(err);\n }\n if (err instanceof ApiError) {\n // The API client has already logged the structured error and printed\n // a user-facing diagnostic. Nothing more to display here.\n } else {\n printCriticalFailureToConsole(err.message ?? err);\n cli.showHelp();\n }\n } finally {\n await shutdownAnalytics();\n process.exit(exitCode);\n }\n} else {\n await printCriticalFailureToConsoleAndExit(\n `The Zuplo CLI requires at least node.js v${MIN_NODE_VERSION}. You are using v${process.versions.node}. Please update your version of node.js.\n\n Consider using a Node.js version manager such as https://github.com/nvm-sh/nvm.`\n );\n}\n"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["import * as dotenv from \"dotenv\";\n\ndotenv.config();\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { confirm } from \"@inquirer/prompts\";\nimport { gte } from \"semver\";\nimport { hideBin } from \"yargs/helpers\";\nimport yargs from \"yargs/yargs\";\nimport bucket from \"./cmds/bucket/index.js\";\nimport build from \"./cmds/build.js\";\nimport caCertificate from \"./cmds/ca-certificate/index.js\";\nimport compile from \"./cmds/compile.js\";\nimport customDomain from \"./cmds/custom-domain/index.js\";\nimport deleteZup from \"./cmds/delete.js\";\nimport deploy from \"./cmds/deploy.js\";\nimport dev from \"./cmds/dev.js\";\nimport docs from \"./cmds/docs.js\";\nimport editor from \"./cmds/editor.js\";\nimport info from \"./cmds/info.js\";\nimport init from \"./cmds/init.js\";\nimport link from \"./cmds/link.js\";\nimport list from \"./cmds/list.js\";\nimport login from \"./cmds/login.js\";\nimport logout from \"./cmds/logout.js\";\nimport mtlsCertificates from \"./cmds/mtls-certificates/index.js\";\nimport oas from \"./cmds/open-api/index.js\";\nimport project from \"./cmds/project/index.js\";\nimport proxies from \"./cmds/proxies/index.js\";\nimport source from \"./cmds/source/index.js\";\nimport test from \"./cmds/test.js\";\nimport tunnel from \"./cmds/tunnel/index.js\";\nimport variable from \"./cmds/variable/index.js\";\nimport whoami from \"./cmds/whoami.js\";\nimport { captureCliInvocationEvent } from \"./common/analytics/cli-invocation.js\";\nimport { captureError, shutdownAnalytics } from \"./common/analytics/lib.js\";\nimport { ApiError } from \"./common/api/client.js\";\nimport { configureCliDispatcher } from \"./common/cli-dispatcher.js\";\nimport { logger } from \"./common/logger.js\";\nimport { checkPnpmLifecycle } from \"./common/middleware/check-pnpm-lifecycle.js\";\nimport { logLevel } from \"./common/middleware/logging.js\";\nimport { warnIfOutdatedVersion, warnNodeVersion } from \"./common/outdated.js\";\nimport setBlocking, {\n printCriticalFailureToConsole,\n printCriticalFailureToConsoleAndExit,\n} from \"./common/output.js\";\n\n// This allows us to stop the CLI from executing so we can connect the profiler\n\n// biome-ignore lint/style/noProcessEnv: Migrated from ESLint\nif (process.env.ZUPLO_CLI_PROFILING) {\n await confirm({ message: \"Continue executing CLI?\", default: true });\n}\n\n// The CLI requires Node.js 24 or newer, enforced as a hard floor. Our docs\n// tell people to run `npx @zuplo/cli@latest` (including from CI/CD jobs), so\n// anything older stops here with the actionable message below rather than\n// failing later on unsupported syntax.\n// RECOMMENDED matches MIN, so warnNodeVersion() has nothing to warn about today:\n// it only runs once current >= MIN, and warns when current < RECOMMENDED. To add\n// a soft tier later, raise RECOMMENDED ABOVE MIN — versions in between then warn\n// instead of failing.\nconst MIN_NODE_VERSION = \"24.0.0\";\nconst RECOMMENDED_NODE_VERSION = \"24.0.0\";\n\nif (gte(process.versions.node, MIN_NODE_VERSION)) {\n let cliVersion: string;\n try {\n const packageJson = JSON.parse(\n readFileSync(\n fileURLToPath(new URL(\"../package.json\", import.meta.url)),\n \"utf-8\"\n )\n );\n cliVersion = packageJson.version;\n } catch (e) {\n cliVersion = \"0.0.0\";\n logger.error(e);\n await printCriticalFailureToConsoleAndExit(\n `Unable to load @zuplo/cli. The package.json is missing or malformed.`\n );\n }\n\n await warnNodeVersion(RECOMMENDED_NODE_VERSION);\n\n // Install CLI identity headers on undici's global dispatcher before any\n // command handlers run fetch.\n configureCliDispatcher(cliVersion);\n\n const cli = yargs(hideBin(process.argv))\n // This means that all env vars will have to be prefixed with ZUPLO_\n .env(\"ZUPLO\")\n .option(\"prompt\", {\n type: \"boolean\",\n describe: \"Bypass confirmation prompts\",\n default: true,\n hidden: true,\n })\n .option(\"verbose\", {\n alias: \"v\",\n type: \"count\",\n describe: \"Increase verbosity level (-v, -vv, -vvv)\",\n default: 0,\n })\n // setBlocking forces synchronous TTY writes so error messages flush before\n // process.exit. Runs first so subsequent middleware (including the\n // preflight, which can exit) benefit from it.\n .middleware(setBlocking)\n .middleware(logLevel)\n .middleware(checkPnpmLifecycle)\n .middleware((argv) => {\n void captureCliInvocationEvent(argv, cliVersion);\n })\n .command(caCertificate)\n .command(compile)\n .command(customDomain)\n .command(deleteZup) // delete is a reserved keyword in JavaScript, so we call this function deleteZup\n .command(deploy)\n .command(dev)\n .command(docs)\n .command(editor)\n .command(info)\n .command(init)\n .command(list)\n .command(link)\n .command(login)\n .command(logout)\n .command(test)\n .command(oas)\n .command(mtlsCertificates)\n .command(project)\n .command(source)\n .command(tunnel)\n .command(variable)\n .command(build)\n .command(bucket)\n .command(proxies)\n .command(whoami)\n .demandCommand()\n .strictCommands()\n .version(cliVersion)\n .fail(false)\n .help();\n\n let exitCode = 0;\n try {\n await cli.argv;\n\n // Don't block\n void warnIfOutdatedVersion(cliVersion);\n } catch (err) {\n exitCode = 1;\n if (err instanceof Error) {\n await captureError(err);\n }\n if (err instanceof ApiError) {\n // The API client has already logged the structured error and printed\n // a user-facing diagnostic. Nothing more to display here.\n } else {\n printCriticalFailureToConsole(err.message ?? err);\n cli.showHelp();\n }\n } finally {\n await shutdownAnalytics();\n process.exit(exitCode);\n }\n} else {\n await printCriticalFailureToConsoleAndExit(\n `The Zuplo CLI requires at least node.js v${MIN_NODE_VERSION}. You are using v${process.versions.node}. Please update your version of node.js.\n\n Consider using a Node.js version manager such as https://github.com/nvm-sh/nvm.`\n );\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  export declare function warnNodeVersion(
2
- currentCliVersion: string,
3
2
  desiredNodeVersion: string
4
3
  ): Promise<void>;
5
4
  export declare function warnIfOutdatedVersion(
@@ -1 +1 @@
1
- {"version":3,"file":"outdated.d.ts","sourceRoot":"","sources":["../../src/common/outdated.ts"],"names":[],"mappings":"AAcA,wBAAsB,eAAe,CACnC,iBAAiB,EAAE,MAAM,EACzB,kBAAkB,EAAE,MAAM,iBAY3B;AAED,wBAAsB,qBAAqB,CAAC,cAAc,EAAE,MAAM,oBA2BjE"}
1
+ {"version":3,"file":"outdated.d.ts","sourceRoot":"","sources":["../../src/common/outdated.ts"],"names":[],"mappings":"AAcA,wBAAsB,eAAe,CAAC,kBAAkB,EAAE,MAAM,iBAU/D;AAED,wBAAsB,qBAAqB,CAAC,cAAc,EAAE,MAAM,oBA2BjE"}
@@ -2,16 +2,15 @@ import { existsSync, mkdirSync } from "node:fs";
2
2
  import { readFile, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import chalk from "chalk";
5
- import { gt, inc, lt } from "semver";
5
+ import { gt, lt } from "semver";
6
6
  import { ZUPLO_VERSION_CHECK_FILE } from "./constants.js";
7
7
  import { printWarningToConsole } from "./output.js";
8
8
  import box from "./utils/box.js";
9
9
  import { ZUPLO_XDG_STATE_HOME } from "./xdg/lib.js";
10
- export async function warnNodeVersion(currentCliVersion, desiredNodeVersion) {
10
+ export async function warnNodeVersion(desiredNodeVersion) {
11
11
  const currentNodeVersion = process.versions.node;
12
12
  if (lt(currentNodeVersion, desiredNodeVersion)) {
13
- const nextMajorCliVersion = inc(currentCliVersion, "major");
14
- printWarningToConsole(box(`You are using Node.js ${currentNodeVersion}. The recommended version for the Zuplo CLI is ${nextMajorCliVersion} or greater.
13
+ printWarningToConsole(box(`You are using Node.js ${currentNodeVersion}. The Zuplo CLI recommends Node.js ${desiredNodeVersion} or greater.
15
14
  Some features might not work as expected. Please update your Node.js version as soon as possible.`));
16
15
  }
17
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"outdated.js","sourceRoot":"","sources":["../../src/common/outdated.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\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 // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n !process.env.ZUPLO_OVERRIDE_CI_TO_TEST &&\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\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(\"https://registry.npmjs.org/@zuplo/cli/latest\");\n const result = await response.json();\n\n return result.version;\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
+ {"version":3,"file":"outdated.js","sourceRoot":"","sources":["../../src/common/outdated.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { gt, 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(desiredNodeVersion: string) {\n const currentNodeVersion = process.versions.node;\n if (lt(currentNodeVersion, desiredNodeVersion)) {\n printWarningToConsole(\n box(\n `You are using Node.js ${currentNodeVersion}. The Zuplo CLI recommends Node.js ${desiredNodeVersion} 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 // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\n !process.env.ZUPLO_OVERRIDE_CI_TO_TEST &&\n // biome-ignore lint/style/noProcessEnv: Migrated from ESLint\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(\"https://registry.npmjs.org/@zuplo/cli/latest\");\n const result = await response.json();\n\n return result.version;\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":"invoke-test.d.ts","sourceRoot":"","sources":["../../src/test/invoke-test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAS,MAAM,OAAO,CAAC;AAIpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkB9C,wBAAgB,uBAAuB,CACrC,WAAW,GAAE,MAA8B,GAC1C,OAAO,CAcT;AAaD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAwBpD"}
1
+ {"version":3,"file":"invoke-test.d.ts","sourceRoot":"","sources":["../../src/test/invoke-test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAS,MAAM,OAAO,CAAC;AAIpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAqB9C,wBAAgB,uBAAuB,CACrC,WAAW,GAAE,MAA8B,GAC1C,OAAO,CAcT;AAaD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAwBpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"invoke-test.js","sourceRoot":"","sources":["../../src/test/invoke-test.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport { type ExecaReturnBase, execa } from \"execa\";\nimport fg from \"fast-glob\";\nimport { TEST_OUT_FOLDER } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport type { Arguments } from \"./handler.js\";\n\nclass MissingNodeExecutableError extends Error {\n constructor() {\n super(\"Missing executable: Cannot locate node executable\");\n Object.setPrototypeOf(this, MissingNodeExecutableError.prototype);\n }\n}\n\n/**\n * Node added `--test-skip-pattern` in v22.1.0. It exists on NO earlier release\n * line — it was never backported to v20.x or v21.x while this package's\n * `engines.node` is `>=20.17.0`. Without this guard, `--skip-filter` on a\n * supported-but-older Node dies inside the spawned child with a bare\n * `bad option: --test-skip-pattern`, which reads like a broken CLI install.\n */\nconst MIN_NODE_FOR_SKIP_PATTERN = { major: 22, minor: 1 };\n\nexport function supportsTestSkipPattern(\n nodeVersion: string = process.versions.node\n): boolean {\n const [major, minor] = nodeVersion\n .split(\".\")\n .map((part) => Number.parseInt(part, 10));\n if (Number.isNaN(major) || Number.isNaN(minor)) {\n // Unparseable version: assume support and let Node speak for itself rather\n // than blocking a valid run on a version string we failed to read.\n return true;\n }\n return (\n major > MIN_NODE_FOR_SKIP_PATTERN.major ||\n (major === MIN_NODE_FOR_SKIP_PATTERN.major &&\n minor >= MIN_NODE_FOR_SKIP_PATTERN.minor)\n );\n}\n\nclass UnsupportedSkipFilterError extends Error {\n constructor(nodeVersion: string) {\n super(\n `--skip-filter requires Node >= ${MIN_NODE_FOR_SKIP_PATTERN.major}.${MIN_NODE_FOR_SKIP_PATTERN.minor}.0 ` +\n `(it maps to Node's --test-skip-pattern, added in v22.1.0), but this is Node ${nodeVersion}. ` +\n `Upgrade Node, or drop --skip-filter and use --filter to select tests instead.`\n );\n Object.setPrototypeOf(this, UnsupportedSkipFilterError.prototype);\n }\n}\n\nexport async function runTests(\n argv: Arguments\n): Promise<Pick<ExecaReturnBase<string>, \"exitCode\">> {\n // Assume that \"node\" is in the path\n const nodeExecutable = process.platform === \"win32\" ? \"node.exe\" : \"node\";\n if (nodeExecutable) {\n const args = buildNodeTestArgs(argv);\n const serialTestTargets =\n argv.testConcurrency === 1 ? findCompiledTestFiles(argv.dir) : [];\n const testTargets =\n serialTestTargets.length > 0\n ? serialTestTargets\n : [compiledTestGlob(argv.dir)];\n let failedResult: Pick<ExecaReturnBase<string>, \"exitCode\"> | undefined;\n\n for (const testTarget of testTargets) {\n const result = await runNodeTest(nodeExecutable, [...args, testTarget]);\n if (result.exitCode !== 0 && failedResult === undefined) {\n failedResult = result;\n }\n }\n\n return failedResult ?? { exitCode: 0 };\n } else {\n throw new MissingNodeExecutableError();\n }\n}\n\nfunction buildNodeTestArgs(argv: Arguments): string[] {\n const args = [\"--test\", \"--test-reporter=spec\", \"--enable-source-maps\"];\n if (argv.testConcurrency !== undefined && argv.testConcurrency !== 1) {\n args.push(`--test-concurrency=${argv.testConcurrency}`);\n }\n if (argv.only) {\n args.push(\"--test-only\");\n }\n if (argv.filter) {\n args.push(\"--test-name-pattern\", argv.filter);\n }\n if (argv.skipFilter) {\n if (!supportsTestSkipPattern()) {\n throw new UnsupportedSkipFilterError(process.versions.node);\n }\n args.push(\"--test-skip-pattern\", argv.skipFilter);\n }\n return args;\n}\n\nfunction compiledTestGlob(dir: string): string {\n const nodeVersion = parseInt(process.versions.node.split(\".\")[0], 10);\n return nodeVersion >= 21\n ? path.join(dir, TEST_OUT_FOLDER, \"**\", \"*.test.mjs\")\n : path.join(dir, TEST_OUT_FOLDER);\n}\n\nfunction findCompiledTestFiles(dir: string): string[] {\n const normalizedDir = path.normalize(dir);\n const testOutDir = fg.convertPathToPattern(\n path.join(normalizedDir, TEST_OUT_FOLDER)\n );\n return fg.sync(path.posix.join(testOutDir, \"**\", \"*.test.mjs\")).sort();\n}\n\nasync function runNodeTest(\n nodeExecutable: string,\n args: string[]\n): Promise<Pick<ExecaReturnBase<string>, \"exitCode\">> {\n const nodeProcess = execa(nodeExecutable, args);\n nodeProcess.stdout?.pipe(process.stdout);\n nodeProcess.stderr?.pipe(process.stderr);\n try {\n const result = await nodeProcess;\n return result;\n } catch (err) {\n // We do not want to output the err by default since it could be a test\n // failure. Test failures are already reported by piping stdout and stderr\n // above.\n logger.debug(err);\n return { exitCode: err.exitCode };\n }\n}\n"]}
1
+ {"version":3,"file":"invoke-test.js","sourceRoot":"","sources":["../../src/test/invoke-test.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport { type ExecaReturnBase, execa } from \"execa\";\nimport fg from \"fast-glob\";\nimport { TEST_OUT_FOLDER } from \"../common/constants.js\";\nimport { logger } from \"../common/logger.js\";\nimport type { Arguments } from \"./handler.js\";\n\nclass MissingNodeExecutableError extends Error {\n constructor() {\n super(\"Missing executable: Cannot locate node executable\");\n Object.setPrototypeOf(this, MissingNodeExecutableError.prototype);\n }\n}\n\n/**\n * Node added `--test-skip-pattern` in v22.1.0. It exists on NO earlier release\n * line — it was never backported to v20.x or v21.x.\n *\n * Every Node this package supports now has the flag (`engines.node` is\n * `>=24.0.0`, and cli.ts hard-fails below it), so this guard is defence in\n * depth rather than a reachable path. It is kept because without it\n * `--skip-filter` on an older Node dies inside the spawned child with a bare\n * `bad option: --test-skip-pattern`, which reads like a broken CLI install.\n */\nconst MIN_NODE_FOR_SKIP_PATTERN = { major: 22, minor: 1 };\n\nexport function supportsTestSkipPattern(\n nodeVersion: string = process.versions.node\n): boolean {\n const [major, minor] = nodeVersion\n .split(\".\")\n .map((part) => Number.parseInt(part, 10));\n if (Number.isNaN(major) || Number.isNaN(minor)) {\n // Unparseable version: assume support and let Node speak for itself rather\n // than blocking a valid run on a version string we failed to read.\n return true;\n }\n return (\n major > MIN_NODE_FOR_SKIP_PATTERN.major ||\n (major === MIN_NODE_FOR_SKIP_PATTERN.major &&\n minor >= MIN_NODE_FOR_SKIP_PATTERN.minor)\n );\n}\n\nclass UnsupportedSkipFilterError extends Error {\n constructor(nodeVersion: string) {\n super(\n `--skip-filter requires Node >= ${MIN_NODE_FOR_SKIP_PATTERN.major}.${MIN_NODE_FOR_SKIP_PATTERN.minor}.0 ` +\n `(it maps to Node's --test-skip-pattern, added in v22.1.0), but this is Node ${nodeVersion}. ` +\n `Upgrade Node, or drop --skip-filter and use --filter to select tests instead.`\n );\n Object.setPrototypeOf(this, UnsupportedSkipFilterError.prototype);\n }\n}\n\nexport async function runTests(\n argv: Arguments\n): Promise<Pick<ExecaReturnBase<string>, \"exitCode\">> {\n // Assume that \"node\" is in the path\n const nodeExecutable = process.platform === \"win32\" ? \"node.exe\" : \"node\";\n if (nodeExecutable) {\n const args = buildNodeTestArgs(argv);\n const serialTestTargets =\n argv.testConcurrency === 1 ? findCompiledTestFiles(argv.dir) : [];\n const testTargets =\n serialTestTargets.length > 0\n ? serialTestTargets\n : [compiledTestGlob(argv.dir)];\n let failedResult: Pick<ExecaReturnBase<string>, \"exitCode\"> | undefined;\n\n for (const testTarget of testTargets) {\n const result = await runNodeTest(nodeExecutable, [...args, testTarget]);\n if (result.exitCode !== 0 && failedResult === undefined) {\n failedResult = result;\n }\n }\n\n return failedResult ?? { exitCode: 0 };\n } else {\n throw new MissingNodeExecutableError();\n }\n}\n\nfunction buildNodeTestArgs(argv: Arguments): string[] {\n const args = [\"--test\", \"--test-reporter=spec\", \"--enable-source-maps\"];\n if (argv.testConcurrency !== undefined && argv.testConcurrency !== 1) {\n args.push(`--test-concurrency=${argv.testConcurrency}`);\n }\n if (argv.only) {\n args.push(\"--test-only\");\n }\n if (argv.filter) {\n args.push(\"--test-name-pattern\", argv.filter);\n }\n if (argv.skipFilter) {\n if (!supportsTestSkipPattern()) {\n throw new UnsupportedSkipFilterError(process.versions.node);\n }\n args.push(\"--test-skip-pattern\", argv.skipFilter);\n }\n return args;\n}\n\nfunction compiledTestGlob(dir: string): string {\n const nodeVersion = parseInt(process.versions.node.split(\".\")[0], 10);\n return nodeVersion >= 21\n ? path.join(dir, TEST_OUT_FOLDER, \"**\", \"*.test.mjs\")\n : path.join(dir, TEST_OUT_FOLDER);\n}\n\nfunction findCompiledTestFiles(dir: string): string[] {\n const normalizedDir = path.normalize(dir);\n const testOutDir = fg.convertPathToPattern(\n path.join(normalizedDir, TEST_OUT_FOLDER)\n );\n return fg.sync(path.posix.join(testOutDir, \"**\", \"*.test.mjs\")).sort();\n}\n\nasync function runNodeTest(\n nodeExecutable: string,\n args: string[]\n): Promise<Pick<ExecaReturnBase<string>, \"exitCode\">> {\n const nodeProcess = execa(nodeExecutable, args);\n nodeProcess.stdout?.pipe(process.stdout);\n nodeProcess.stderr?.pipe(process.stderr);\n try {\n const result = await nodeProcess;\n return result;\n } catch (err) {\n // We do not want to output the err by default since it could be a test\n // failure. Test failures are already reported by piping stdout and stderr\n // above.\n logger.debug(err);\n return { exitCode: err.exitCode };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"invoke-test.test.js","sourceRoot":"","sources":["../../src/test/invoke-test.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { access, mkdir, mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { describe, it } from \"node:test\";\nimport { expect } from \"chai\";\nimport { TEST_OUT_FOLDER } from \"../common/constants.js\";\nimport { supportsTestSkipPattern } from \"./invoke-test.js\";\n\ndescribe(\"runTests\", () => {\n it(\"runs every compiled test file serially after a failure\", async () => {\n const testDir = await mkdtemp(\n path.join(os.tmpdir(), \"zuplo-run-tests-serial-\")\n );\n\n try {\n const compiledTestDir = path.join(testDir, TEST_OUT_FOLDER);\n const secondTestMarker = path.join(testDir, \"second-test-ran\");\n await mkdir(compiledTestDir, { recursive: true });\n await writeFile(\n path.join(compiledTestDir, \"a-first.test.mjs\"),\n [\n 'import test from \"node:test\";',\n 'test(\"Moonshot first\", () => {',\n ' throw new Error(\"expected failure\");',\n \"});\",\n ].join(\"\\n\")\n );\n await writeFile(\n path.join(compiledTestDir, \"b-second.test.mjs\"),\n [\n 'import { writeFileSync } from \"node:fs\";',\n 'import test from \"node:test\";',\n 'test(\"Moonshot second\", () => {',\n ` writeFileSync(${JSON.stringify(secondTestMarker)}, \"ran\");`,\n \"});\",\n ].join(\"\\n\")\n );\n\n const environment = { ...process.env };\n delete environment.NODE_TEST_CONTEXT;\n const invokeTestUrl = new URL(\"./invoke-test.js\", import.meta.url).href;\n const script = [\n `import { runTests } from ${JSON.stringify(invokeTestUrl)};`,\n `const result = await runTests(${JSON.stringify({\n dir: testDir,\n endpoint: \"http://localhost\",\n filter: \"Moonshot\",\n testConcurrency: 1,\n })});`,\n \"process.exitCode = result.exitCode;\",\n ].join(\"\\n\");\n const exitCode = await new Promise<number | null>((resolve, reject) => {\n const child = spawn(\n process.execPath,\n [\"--input-type=module\", \"--eval\", script],\n {\n env: environment,\n stdio: \"ignore\",\n }\n );\n child.once(\"error\", reject);\n child.once(\"exit\", resolve);\n });\n\n expect(exitCode).not.to.equal(0);\n await access(secondTestMarker);\n } finally {\n await rm(testDir, { recursive: true, force: true });\n }\n });\n});\n\ndescribe(\"runTests --only\", () => {\n // Without `--test-only`, Node IGNORES the `.only` modifier and runs every\n // test anyway — so `describe.only` used to run the marked suite AND all the\n // others, the silent opposite of the intent. This drives the real runner\n // rather than asserting on the argv we build, because the argv is not the\n // claim: the claim is that the unmarked test does not execute.\n const writeOnlyFixture = async (testDir: string) => {\n const compiledTestDir = path.join(testDir, TEST_OUT_FOLDER);\n const markedMarker = path.join(testDir, \"marked-ran\");\n const unmarkedMarker = path.join(testDir, \"unmarked-ran\");\n await mkdir(compiledTestDir, { recursive: true });\n await writeFile(\n path.join(compiledTestDir, \"marked.test.mjs\"),\n [\n 'import { writeFileSync } from \"node:fs\";',\n 'import test from \"node:test\";',\n 'test.only(\"marked\", () => {',\n ` writeFileSync(${JSON.stringify(markedMarker)}, \"ran\");`,\n \"});\",\n ].join(\"\\n\")\n );\n await writeFile(\n path.join(compiledTestDir, \"unmarked.test.mjs\"),\n [\n 'import { writeFileSync } from \"node:fs\";',\n 'import test from \"node:test\";',\n 'test(\"unmarked\", () => {',\n ` writeFileSync(${JSON.stringify(unmarkedMarker)}, \"ran\");`,\n \"});\",\n ].join(\"\\n\")\n );\n return { markedMarker, unmarkedMarker };\n };\n\n const invoke = async (testDir: string, only: boolean) => {\n const environment = { ...process.env };\n delete environment.NODE_TEST_CONTEXT;\n const invokeTestUrl = new URL(\"./invoke-test.js\", import.meta.url).href;\n const script = [\n `import { runTests } from ${JSON.stringify(invokeTestUrl)};`,\n `const result = await runTests(${JSON.stringify({\n dir: testDir,\n endpoint: \"http://localhost\",\n only,\n })});`,\n \"process.exitCode = result.exitCode;\",\n ].join(\"\\n\");\n return await new Promise<number | null>((resolve, reject) => {\n const child = spawn(\n process.execPath,\n [\"--input-type=module\", \"--eval\", script],\n { env: environment, stdio: \"ignore\" }\n );\n child.once(\"error\", reject);\n child.once(\"exit\", resolve);\n });\n };\n\n const ran = async (marker: string) => {\n try {\n await access(marker);\n return true;\n } catch {\n return false;\n }\n };\n\n it(\"runs only the marked test when --only is passed\", async () => {\n const testDir = await mkdtemp(path.join(os.tmpdir(), \"zuplo-only-on-\"));\n try {\n const { markedMarker, unmarkedMarker } = await writeOnlyFixture(testDir);\n const exitCode = await invoke(testDir, true);\n expect(exitCode, \"runner exit code\").to.equal(0);\n expect(await ran(markedMarker), \"marked test ran\").to.equal(true);\n expect(await ran(unmarkedMarker), \"unmarked test ran\").to.equal(false);\n } finally {\n await rm(testDir, { recursive: true, force: true });\n }\n });\n\n it(\"runs everything when --only is absent, which is why .only alone is a trap\", async () => {\n const testDir = await mkdtemp(path.join(os.tmpdir(), \"zuplo-only-off-\"));\n try {\n const { markedMarker, unmarkedMarker } = await writeOnlyFixture(testDir);\n const exitCode = await invoke(testDir, false);\n expect(exitCode, \"runner exit code\").to.equal(0);\n expect(await ran(markedMarker), \"marked test ran\").to.equal(true);\n expect(await ran(unmarkedMarker), \"unmarked test ran\").to.equal(true);\n } finally {\n await rm(testDir, { recursive: true, force: true });\n }\n });\n});\n\ndescribe(\"supportsTestSkipPattern\", () => {\n // `--skip-filter` maps to Node's `--test-skip-pattern`, which landed in\n // v22.1.0 and was never backported. This package's engines.node is\n // \">=20.17.0\", so the gap is reachable by a real user: without the guard the\n // spawned child dies with a bare `bad option: --test-skip-pattern`.\n it(\"rejects release lines that never shipped the flag\", () => {\n for (const version of [\"20.17.0\", \"20.20.2\", \"21.7.3\", \"22.0.0\"]) {\n expect(supportsTestSkipPattern(version), version).to.equal(false);\n }\n });\n\n it(\"accepts v22.1.0 and later\", () => {\n for (const version of [\"22.1.0\", \"22.22.1\", \"23.0.0\", \"24.1.0\"]) {\n expect(supportsTestSkipPattern(version), version).to.equal(true);\n }\n });\n\n it(\"assumes support when the version string is unparseable\", () => {\n // Better to let Node itself reject an unknown flag than to block a valid\n // run because we could not read a version string.\n expect(supportsTestSkipPattern(\"not-a-version\")).to.equal(true);\n });\n});\n"]}
1
+ {"version":3,"file":"invoke-test.test.js","sourceRoot":"","sources":["../../src/test/invoke-test.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { access, mkdir, mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { describe, it } from \"node:test\";\nimport { expect } from \"chai\";\nimport { TEST_OUT_FOLDER } from \"../common/constants.js\";\nimport { supportsTestSkipPattern } from \"./invoke-test.js\";\n\ndescribe(\"runTests\", () => {\n it(\"runs every compiled test file serially after a failure\", async () => {\n const testDir = await mkdtemp(\n path.join(os.tmpdir(), \"zuplo-run-tests-serial-\")\n );\n\n try {\n const compiledTestDir = path.join(testDir, TEST_OUT_FOLDER);\n const secondTestMarker = path.join(testDir, \"second-test-ran\");\n await mkdir(compiledTestDir, { recursive: true });\n await writeFile(\n path.join(compiledTestDir, \"a-first.test.mjs\"),\n [\n 'import test from \"node:test\";',\n 'test(\"Moonshot first\", () => {',\n ' throw new Error(\"expected failure\");',\n \"});\",\n ].join(\"\\n\")\n );\n await writeFile(\n path.join(compiledTestDir, \"b-second.test.mjs\"),\n [\n 'import { writeFileSync } from \"node:fs\";',\n 'import test from \"node:test\";',\n 'test(\"Moonshot second\", () => {',\n ` writeFileSync(${JSON.stringify(secondTestMarker)}, \"ran\");`,\n \"});\",\n ].join(\"\\n\")\n );\n\n const environment = { ...process.env };\n delete environment.NODE_TEST_CONTEXT;\n const invokeTestUrl = new URL(\"./invoke-test.js\", import.meta.url).href;\n const script = [\n `import { runTests } from ${JSON.stringify(invokeTestUrl)};`,\n `const result = await runTests(${JSON.stringify({\n dir: testDir,\n endpoint: \"http://localhost\",\n filter: \"Moonshot\",\n testConcurrency: 1,\n })});`,\n \"process.exitCode = result.exitCode;\",\n ].join(\"\\n\");\n const exitCode = await new Promise<number | null>((resolve, reject) => {\n const child = spawn(\n process.execPath,\n [\"--input-type=module\", \"--eval\", script],\n {\n env: environment,\n stdio: \"ignore\",\n }\n );\n child.once(\"error\", reject);\n child.once(\"exit\", resolve);\n });\n\n expect(exitCode).not.to.equal(0);\n await access(secondTestMarker);\n } finally {\n await rm(testDir, { recursive: true, force: true });\n }\n });\n});\n\ndescribe(\"runTests --only\", () => {\n // Without `--test-only`, Node IGNORES the `.only` modifier and runs every\n // test anyway — so `describe.only` used to run the marked suite AND all the\n // others, the silent opposite of the intent. This drives the real runner\n // rather than asserting on the argv we build, because the argv is not the\n // claim: the claim is that the unmarked test does not execute.\n const writeOnlyFixture = async (testDir: string) => {\n const compiledTestDir = path.join(testDir, TEST_OUT_FOLDER);\n const markedMarker = path.join(testDir, \"marked-ran\");\n const unmarkedMarker = path.join(testDir, \"unmarked-ran\");\n await mkdir(compiledTestDir, { recursive: true });\n await writeFile(\n path.join(compiledTestDir, \"marked.test.mjs\"),\n [\n 'import { writeFileSync } from \"node:fs\";',\n 'import test from \"node:test\";',\n 'test.only(\"marked\", () => {',\n ` writeFileSync(${JSON.stringify(markedMarker)}, \"ran\");`,\n \"});\",\n ].join(\"\\n\")\n );\n await writeFile(\n path.join(compiledTestDir, \"unmarked.test.mjs\"),\n [\n 'import { writeFileSync } from \"node:fs\";',\n 'import test from \"node:test\";',\n 'test(\"unmarked\", () => {',\n ` writeFileSync(${JSON.stringify(unmarkedMarker)}, \"ran\");`,\n \"});\",\n ].join(\"\\n\")\n );\n return { markedMarker, unmarkedMarker };\n };\n\n const invoke = async (testDir: string, only: boolean) => {\n const environment = { ...process.env };\n delete environment.NODE_TEST_CONTEXT;\n const invokeTestUrl = new URL(\"./invoke-test.js\", import.meta.url).href;\n const script = [\n `import { runTests } from ${JSON.stringify(invokeTestUrl)};`,\n `const result = await runTests(${JSON.stringify({\n dir: testDir,\n endpoint: \"http://localhost\",\n only,\n })});`,\n \"process.exitCode = result.exitCode;\",\n ].join(\"\\n\");\n return await new Promise<number | null>((resolve, reject) => {\n const child = spawn(\n process.execPath,\n [\"--input-type=module\", \"--eval\", script],\n { env: environment, stdio: \"ignore\" }\n );\n child.once(\"error\", reject);\n child.once(\"exit\", resolve);\n });\n };\n\n const ran = async (marker: string) => {\n try {\n await access(marker);\n return true;\n } catch {\n return false;\n }\n };\n\n it(\"runs only the marked test when --only is passed\", async () => {\n const testDir = await mkdtemp(path.join(os.tmpdir(), \"zuplo-only-on-\"));\n try {\n const { markedMarker, unmarkedMarker } = await writeOnlyFixture(testDir);\n const exitCode = await invoke(testDir, true);\n expect(exitCode, \"runner exit code\").to.equal(0);\n expect(await ran(markedMarker), \"marked test ran\").to.equal(true);\n expect(await ran(unmarkedMarker), \"unmarked test ran\").to.equal(false);\n } finally {\n await rm(testDir, { recursive: true, force: true });\n }\n });\n\n it(\"runs everything when --only is absent, which is why .only alone is a trap\", async () => {\n const testDir = await mkdtemp(path.join(os.tmpdir(), \"zuplo-only-off-\"));\n try {\n const { markedMarker, unmarkedMarker } = await writeOnlyFixture(testDir);\n const exitCode = await invoke(testDir, false);\n expect(exitCode, \"runner exit code\").to.equal(0);\n expect(await ran(markedMarker), \"marked test ran\").to.equal(true);\n expect(await ran(unmarkedMarker), \"unmarked test ran\").to.equal(true);\n } finally {\n await rm(testDir, { recursive: true, force: true });\n }\n });\n});\n\ndescribe(\"supportsTestSkipPattern\", () => {\n // `--skip-filter` maps to Node's `--test-skip-pattern`, which landed in\n // v22.1.0 and was never backported. engines.node is \">=24.0.0\", so the gap is\n // no longer reachable by a supported user; these cases pin the guard's\n // behaviour so the boundary stays correct if the floor ever moves down.\n it(\"rejects release lines that never shipped the flag\", () => {\n for (const version of [\"20.17.0\", \"20.20.2\", \"21.7.3\", \"22.0.0\"]) {\n expect(supportsTestSkipPattern(version), version).to.equal(false);\n }\n });\n\n it(\"accepts v22.1.0 and later\", () => {\n for (const version of [\"22.1.0\", \"22.22.1\", \"23.0.0\", \"24.1.0\"]) {\n expect(supportsTestSkipPattern(version), version).to.equal(true);\n }\n });\n\n it(\"assumes support when the version string is unparseable\", () => {\n // Better to let Node itself reject an unknown flag than to block a valid\n // run because we could not read a version string.\n expect(supportsTestSkipPattern(\"not-a-version\")).to.equal(true);\n });\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuplo/core",
3
- "version": "6.74.14",
3
+ "version": "7.0.0",
4
4
  "repository": "https://github.com/zuplo/zuplo",
5
5
  "author": "Zuplo, Inc.",
6
6
  "type": "module",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zuplo/graphql",
3
3
  "type": "module",
4
- "version": "6.74.14",
4
+ "version": "7.0.0",
5
5
  "repository": "https://github.com/zuplo/zuplo",
6
6
  "author": "Zuplo, Inc.",
7
7
  "exports": {
@@ -2,7 +2,7 @@
2
2
  "name": "@zuplo/openapi-tools",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "6.74.14",
5
+ "version": "7.0.0",
6
6
  "description": "Tooling for OpenAPI files",
7
7
  "repository": {
8
8
  "type": "git",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zuplo/otel",
3
3
  "type": "module",
4
- "version": "6.74.14",
4
+ "version": "7.0.0",
5
5
  "repository": "https://github.com/zuplo/zuplo",
6
6
  "author": "Zuplo, Inc.",
7
7
  "exports": {