@zuplo/cli 6.69.10 → 6.69.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/dist/__tests__/integration/jest-mocks-setup.js +3 -0
  2. package/dist/__tests__/integration/jest-mocks-setup.js.map +1 -1
  3. package/dist/cli.js +4 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cmds/bucket/list.d.ts.map +1 -1
  6. package/dist/cmds/bucket/list.js +1 -8
  7. package/dist/cmds/bucket/list.js.map +1 -1
  8. package/dist/cmds/build.d.ts.map +1 -1
  9. package/dist/cmds/build.js +1 -2
  10. package/dist/cmds/build.js.map +1 -1
  11. package/dist/cmds/compile.d.ts.map +1 -1
  12. package/dist/cmds/compile.js +1 -2
  13. package/dist/cmds/compile.js.map +1 -1
  14. package/dist/cmds/custom-domain/create.d.ts.map +1 -1
  15. package/dist/cmds/custom-domain/create.js +1 -8
  16. package/dist/cmds/custom-domain/create.js.map +1 -1
  17. package/dist/cmds/custom-domain/delete.d.ts.map +1 -1
  18. package/dist/cmds/custom-domain/delete.js +1 -8
  19. package/dist/cmds/custom-domain/delete.js.map +1 -1
  20. package/dist/cmds/custom-domain/list.d.ts.map +1 -1
  21. package/dist/cmds/custom-domain/list.js +1 -8
  22. package/dist/cmds/custom-domain/list.js.map +1 -1
  23. package/dist/cmds/custom-domain/update.d.ts.map +1 -1
  24. package/dist/cmds/custom-domain/update.js +1 -8
  25. package/dist/cmds/custom-domain/update.js.map +1 -1
  26. package/dist/cmds/delete.d.ts.map +1 -1
  27. package/dist/cmds/delete.js +0 -2
  28. package/dist/cmds/delete.js.map +1 -1
  29. package/dist/cmds/deploy.d.ts.map +1 -1
  30. package/dist/cmds/deploy.js +0 -2
  31. package/dist/cmds/deploy.js.map +1 -1
  32. package/dist/cmds/dev.d.ts.map +1 -1
  33. package/dist/cmds/dev.js +1 -2
  34. package/dist/cmds/dev.js.map +1 -1
  35. package/dist/cmds/docs.d.ts.map +1 -1
  36. package/dist/cmds/docs.js +1 -2
  37. package/dist/cmds/docs.js.map +1 -1
  38. package/dist/cmds/editor.d.ts.map +1 -1
  39. package/dist/cmds/editor.js +1 -2
  40. package/dist/cmds/editor.js.map +1 -1
  41. package/dist/cmds/init.d.ts.map +1 -1
  42. package/dist/cmds/init.js +1 -3
  43. package/dist/cmds/init.js.map +1 -1
  44. package/dist/cmds/link.d.ts.map +1 -1
  45. package/dist/cmds/link.js +0 -2
  46. package/dist/cmds/link.js.map +1 -1
  47. package/dist/cmds/list.d.ts.map +1 -1
  48. package/dist/cmds/list.js +0 -2
  49. package/dist/cmds/list.js.map +1 -1
  50. package/dist/cmds/login.d.ts.map +1 -1
  51. package/dist/cmds/login.js +2 -2
  52. package/dist/cmds/login.js.map +1 -1
  53. package/dist/cmds/logout.d.ts.map +1 -1
  54. package/dist/cmds/logout.js +2 -3
  55. package/dist/cmds/logout.js.map +1 -1
  56. package/dist/cmds/mtls-certificates/create.d.ts.map +1 -1
  57. package/dist/cmds/mtls-certificates/create.js +0 -2
  58. package/dist/cmds/mtls-certificates/create.js.map +1 -1
  59. package/dist/cmds/mtls-certificates/delete.d.ts.map +1 -1
  60. package/dist/cmds/mtls-certificates/delete.js +0 -2
  61. package/dist/cmds/mtls-certificates/delete.js.map +1 -1
  62. package/dist/cmds/mtls-certificates/describe.d.ts.map +1 -1
  63. package/dist/cmds/mtls-certificates/describe.js +0 -2
  64. package/dist/cmds/mtls-certificates/describe.js.map +1 -1
  65. package/dist/cmds/mtls-certificates/disable.d.ts.map +1 -1
  66. package/dist/cmds/mtls-certificates/disable.js +0 -2
  67. package/dist/cmds/mtls-certificates/disable.js.map +1 -1
  68. package/dist/cmds/mtls-certificates/list.d.ts.map +1 -1
  69. package/dist/cmds/mtls-certificates/list.js +0 -2
  70. package/dist/cmds/mtls-certificates/list.js.map +1 -1
  71. package/dist/cmds/mtls-certificates/update.d.ts.map +1 -1
  72. package/dist/cmds/mtls-certificates/update.js +0 -2
  73. package/dist/cmds/mtls-certificates/update.js.map +1 -1
  74. package/dist/cmds/project/create.d.ts.map +1 -1
  75. package/dist/cmds/project/create.js +1 -8
  76. package/dist/cmds/project/create.js.map +1 -1
  77. package/dist/cmds/project/info.d.ts.map +1 -1
  78. package/dist/cmds/project/info.js +1 -2
  79. package/dist/cmds/project/info.js.map +1 -1
  80. package/dist/cmds/proxies/create.d.ts.map +1 -1
  81. package/dist/cmds/proxies/create.js +0 -2
  82. package/dist/cmds/proxies/create.js.map +1 -1
  83. package/dist/cmds/proxies/delete.d.ts.map +1 -1
  84. package/dist/cmds/proxies/delete.js +0 -2
  85. package/dist/cmds/proxies/delete.js.map +1 -1
  86. package/dist/cmds/proxies/describe.d.ts.map +1 -1
  87. package/dist/cmds/proxies/describe.js +0 -2
  88. package/dist/cmds/proxies/describe.js.map +1 -1
  89. package/dist/cmds/proxies/update.d.ts.map +1 -1
  90. package/dist/cmds/proxies/update.js +0 -2
  91. package/dist/cmds/proxies/update.js.map +1 -1
  92. package/dist/cmds/source/migrate.d.ts.map +1 -1
  93. package/dist/cmds/source/migrate.js +1 -2
  94. package/dist/cmds/source/migrate.js.map +1 -1
  95. package/dist/cmds/source/upgrade.d.ts.map +1 -1
  96. package/dist/cmds/source/upgrade.js +1 -2
  97. package/dist/cmds/source/upgrade.js.map +1 -1
  98. package/dist/cmds/test.d.ts.map +1 -1
  99. package/dist/cmds/test.js +1 -2
  100. package/dist/cmds/test.js.map +1 -1
  101. package/dist/cmds/tunnel/create.d.ts.map +1 -1
  102. package/dist/cmds/tunnel/create.js +1 -8
  103. package/dist/cmds/tunnel/create.js.map +1 -1
  104. package/dist/cmds/tunnel/delete.d.ts.map +1 -1
  105. package/dist/cmds/tunnel/delete.js +1 -8
  106. package/dist/cmds/tunnel/delete.js.map +1 -1
  107. package/dist/cmds/tunnel/describe.d.ts.map +1 -1
  108. package/dist/cmds/tunnel/describe.js +1 -8
  109. package/dist/cmds/tunnel/describe.js.map +1 -1
  110. package/dist/cmds/tunnel/list.d.ts.map +1 -1
  111. package/dist/cmds/tunnel/list.js +1 -8
  112. package/dist/cmds/tunnel/list.js.map +1 -1
  113. package/dist/cmds/tunnel/rotate-token.d.ts.map +1 -1
  114. package/dist/cmds/tunnel/rotate-token.js +1 -8
  115. package/dist/cmds/tunnel/rotate-token.js.map +1 -1
  116. package/dist/cmds/tunnel/services/describe.d.ts.map +1 -1
  117. package/dist/cmds/tunnel/services/describe.js +1 -8
  118. package/dist/cmds/tunnel/services/describe.js.map +1 -1
  119. package/dist/cmds/tunnel/services/update.d.ts.map +1 -1
  120. package/dist/cmds/tunnel/services/update.js +1 -8
  121. package/dist/cmds/tunnel/services/update.js.map +1 -1
  122. package/dist/cmds/variable/create.d.ts.map +1 -1
  123. package/dist/cmds/variable/create.js +0 -2
  124. package/dist/cmds/variable/create.js.map +1 -1
  125. package/dist/cmds/variable/update.d.ts.map +1 -1
  126. package/dist/cmds/variable/update.js +0 -2
  127. package/dist/cmds/variable/update.js.map +1 -1
  128. package/dist/cmds/whoami.d.ts.map +1 -1
  129. package/dist/cmds/whoami.js +1 -2
  130. package/dist/cmds/whoami.js.map +1 -1
  131. package/dist/common/middleware/check-pnpm-lifecycle.d.ts +17 -0
  132. package/dist/common/middleware/check-pnpm-lifecycle.d.ts.map +1 -0
  133. package/dist/common/middleware/check-pnpm-lifecycle.js +96 -0
  134. package/dist/common/middleware/check-pnpm-lifecycle.js.map +1 -0
  135. package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts +2 -0
  136. package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts.map +1 -0
  137. package/dist/common/middleware/check-pnpm-lifecycle.test.js +125 -0
  138. package/dist/common/middleware/check-pnpm-lifecycle.test.js.map +1 -0
  139. package/dist/common/utils/pnpm-lifecycle.d.ts +13 -0
  140. package/dist/common/utils/pnpm-lifecycle.d.ts.map +1 -0
  141. package/dist/common/utils/pnpm-lifecycle.js +100 -0
  142. package/dist/common/utils/pnpm-lifecycle.js.map +1 -0
  143. package/dist/common/utils/pnpm-lifecycle.test.d.ts +2 -0
  144. package/dist/common/utils/pnpm-lifecycle.test.d.ts.map +1 -0
  145. package/dist/common/utils/pnpm-lifecycle.test.js +177 -0
  146. package/dist/common/utils/pnpm-lifecycle.test.js.map +1 -0
  147. package/dist/tsconfig.tsbuildinfo +1 -1
  148. package/node_modules/@zuplo/core/package.json +1 -1
  149. package/node_modules/@zuplo/graphql/out/esm/index.js.map +1 -1
  150. package/node_modules/@zuplo/graphql/out/types/index.d.ts +3 -0
  151. package/node_modules/@zuplo/graphql/package.json +1 -1
  152. package/node_modules/@zuplo/openapi-tools/package.json +2 -2
  153. package/node_modules/@zuplo/otel/package.json +1 -1
  154. package/node_modules/@zuplo/runtime/out/esm/index.js +94 -94
  155. package/node_modules/@zuplo/runtime/out/esm/index.js.map +1 -1
  156. package/node_modules/@zuplo/runtime/out/types/index.d.ts +72 -0
  157. package/node_modules/@zuplo/runtime/package.json +2 -2
  158. package/node_modules/pino-http/node_modules/thread-stream/.github/workflows/ci.yml +4 -4
  159. package/node_modules/pino-http/node_modules/thread-stream/README.md +4 -1
  160. package/node_modules/pino-http/node_modules/thread-stream/index.d.ts +7 -0
  161. package/node_modules/pino-http/node_modules/thread-stream/index.js +120 -21
  162. package/node_modules/pino-http/node_modules/thread-stream/lib/worker.js +101 -0
  163. package/node_modules/pino-http/node_modules/thread-stream/node_modules/real-require/LICENSE.md +21 -0
  164. package/node_modules/pino-http/node_modules/thread-stream/node_modules/real-require/README.md +51 -0
  165. package/node_modules/pino-http/node_modules/thread-stream/node_modules/real-require/package.json +38 -0
  166. package/node_modules/pino-http/node_modules/thread-stream/node_modules/real-require/src/index.js +14 -0
  167. package/node_modules/pino-http/node_modules/thread-stream/package.json +10 -12
  168. package/node_modules/pino-http/node_modules/thread-stream/test/flush-worker.js +68 -0
  169. package/node_modules/pino-http/node_modules/thread-stream/test/flush.test.js +112 -0
  170. package/node_modules/pino-http/node_modules/thread-stream/test/message-without-code.js +19 -0
  171. package/node_modules/pino-http/node_modules/thread-stream/test/report-thread-name.js +16 -0
  172. package/node_modules/pino-http/node_modules/thread-stream/test/thread-management.test.js +12 -0
  173. package/node_modules/pino-http/node_modules/thread-stream/test/watch-mode.test.js +30 -0
  174. package/node_modules/pino-http/node_modules/thread-stream/test/worker-name.test.js +43 -0
  175. package/node_modules/protobufjs/dist/light/protobuf.js +5 -3
  176. package/node_modules/protobufjs/dist/light/protobuf.js.map +1 -1
  177. package/node_modules/protobufjs/dist/light/protobuf.min.js +3 -3
  178. package/node_modules/protobufjs/dist/light/protobuf.min.js.map +1 -1
  179. package/node_modules/protobufjs/dist/minimal/protobuf.js +2 -2
  180. package/node_modules/protobufjs/dist/minimal/protobuf.min.js +2 -2
  181. package/node_modules/protobufjs/dist/protobuf.js +5 -3
  182. package/node_modules/protobufjs/dist/protobuf.js.map +1 -1
  183. package/node_modules/protobufjs/dist/protobuf.min.js +3 -3
  184. package/node_modules/protobufjs/dist/protobuf.min.js.map +1 -1
  185. package/node_modules/protobufjs/package.json +1 -1
  186. package/node_modules/protobufjs/src/namespace.js +3 -1
  187. package/package.json +7 -7
  188. package/node_modules/pino-http/node_modules/thread-stream/.husky/pre-commit +0 -4
  189. package/node_modules/pino-http/node_modules/thread-stream/CLAUDE.md +0 -53
@@ -0,0 +1,125 @@
1
+ import assert from "node:assert";
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { afterEach, beforeEach, describe, it } from "node:test";
6
+ import { buildDlxMessage, buildProjectMessage, decideAction, } from "./check-pnpm-lifecycle.js";
7
+ const SKIP_ENV_VAR = "ZUPLO_SKIP_PNPM_LIFECYCLE_CHECK";
8
+ const BLOCKED_MODULES_YAML = [
9
+ "ignoredBuilds:",
10
+ " - deno@2.3.1",
11
+ " - workerd@1.20241230.0",
12
+ " - esbuild@0.25.2",
13
+ "pendingBuilds: []",
14
+ "",
15
+ ].join("\n");
16
+ const CLEAN_MODULES_YAML = "ignoredBuilds: []\npendingBuilds: []\n";
17
+ function writeModulesYaml(dir, contents) {
18
+ const nm = path.join(dir, "node_modules");
19
+ mkdirSync(nm, { recursive: true });
20
+ writeFileSync(path.join(nm, ".modules.yaml"), contents);
21
+ }
22
+ describe("buildDlxMessage", () => {
23
+ it("includes the --allow-build flags and the user's command", () => {
24
+ const msg = buildDlxMessage("deno, workerd", "deploy");
25
+ assert.match(msg, /--allow-build=deno/);
26
+ assert.match(msg, /--allow-build=workerd/);
27
+ assert.match(msg, /--allow-build=esbuild/);
28
+ assert.match(msg, /--allow-build=@swc\/core/);
29
+ assert.match(msg, /--allow-build=protobufjs/);
30
+ assert.match(msg, /pnpm zuplo deploy/);
31
+ });
32
+ it("preserves nested subcommand paths in suggestion", () => {
33
+ const msg = buildDlxMessage("deno", "project create my-app");
34
+ assert.match(msg, /pnpx .* zuplo project create my-app/);
35
+ assert.match(msg, /pnpm zuplo project create my-app/);
36
+ });
37
+ it("includes the onlyBuiltDependencies block as a prerequisite", () => {
38
+ const msg = buildDlxMessage("deno", "deploy");
39
+ assert.match(msg, /onlyBuiltDependencies:/);
40
+ assert.match(msg, /- deno/);
41
+ assert.match(msg, /- esbuild/);
42
+ assert.match(msg, /- workerd/);
43
+ assert.match(msg, /- "@swc\/core"/);
44
+ assert.match(msg, /- protobufjs/);
45
+ });
46
+ it("places onlyBuiltDependencies at column 0 for paste-safety", () => {
47
+ const msg = buildDlxMessage("deno", "deploy");
48
+ assert.match(msg, /^onlyBuiltDependencies:$/m);
49
+ });
50
+ it("includes the package.json alternative", () => {
51
+ const msg = buildDlxMessage("deno", "deploy");
52
+ assert.match(msg, /^"pnpm": \{$/m);
53
+ assert.match(msg, /"onlyBuiltDependencies": \[.*"deno".*\]/);
54
+ });
55
+ });
56
+ describe("buildProjectMessage", () => {
57
+ it("includes the onlyBuiltDependencies block and pnpm install", () => {
58
+ const msg = buildProjectMessage("deno, workerd");
59
+ assert.match(msg, /onlyBuiltDependencies:/);
60
+ assert.match(msg, /- deno/);
61
+ assert.match(msg, /- workerd/);
62
+ assert.match(msg, /pnpm install/);
63
+ });
64
+ it("places onlyBuiltDependencies at column 0 for paste-safety", () => {
65
+ const msg = buildProjectMessage("deno");
66
+ assert.match(msg, /^onlyBuiltDependencies:$/m);
67
+ });
68
+ it("includes the package.json alternative", () => {
69
+ const msg = buildProjectMessage("deno");
70
+ assert.match(msg, /^"pnpm": \{$/m);
71
+ assert.match(msg, /"onlyBuiltDependencies": \[.*"deno".*\]/);
72
+ });
73
+ it("does NOT include --allow-build (that's only for dlx)", () => {
74
+ const msg = buildProjectMessage("deno");
75
+ assert.doesNotMatch(msg, /--allow-build/);
76
+ });
77
+ });
78
+ describe("decideAction", () => {
79
+ let tmp;
80
+ let prevSkip;
81
+ beforeEach(() => {
82
+ tmp = mkdtempSync(path.join(os.tmpdir(), "zup-decide-"));
83
+ prevSkip = process.env[SKIP_ENV_VAR];
84
+ delete process.env[SKIP_ENV_VAR];
85
+ });
86
+ afterEach(() => {
87
+ rmSync(tmp, { recursive: true, force: true });
88
+ if (prevSkip === undefined) {
89
+ delete process.env[SKIP_ENV_VAR];
90
+ }
91
+ else {
92
+ process.env[SKIP_ENV_VAR] = prevSkip;
93
+ }
94
+ });
95
+ it("returns null when no .modules.yaml is found", () => {
96
+ assert.strictEqual(decideAction({ _: ["deploy"] }, tmp), null);
97
+ });
98
+ it("returns null when no critical builds are blocked", () => {
99
+ writeModulesYaml(tmp, CLEAN_MODULES_YAML);
100
+ assert.strictEqual(decideAction({ _: ["deploy"] }, tmp), null);
101
+ });
102
+ it("returns project message when blocked deps exist outside dlx", () => {
103
+ writeModulesYaml(tmp, BLOCKED_MODULES_YAML);
104
+ const result = decideAction({ _: ["deploy"] }, tmp);
105
+ assert.notStrictEqual(result, null);
106
+ assert.match(result.message, /onlyBuiltDependencies:/);
107
+ assert.doesNotMatch(result.message, /--allow-build/);
108
+ });
109
+ it("returns dlx message when blocked deps exist in pnpm dlx tree", () => {
110
+ const dlxDir = path.join(tmp, "pnpm", "dlx", "fake-hash", "subdir");
111
+ mkdirSync(dlxDir, { recursive: true });
112
+ writeModulesYaml(dlxDir, BLOCKED_MODULES_YAML);
113
+ const result = decideAction({ _: ["project", "create"] }, dlxDir);
114
+ assert.notStrictEqual(result, null);
115
+ assert.match(result.message, /--allow-build=deno/);
116
+ assert.match(result.message, /pnpm zuplo project create/);
117
+ });
118
+ it("returns null when bypass env var is set, even with blocked deps", () => {
119
+ writeModulesYaml(tmp, BLOCKED_MODULES_YAML);
120
+ assert.notStrictEqual(decideAction({ _: ["deploy"] }, tmp), null);
121
+ process.env[SKIP_ENV_VAR] = "1";
122
+ assert.strictEqual(decideAction({ _: ["deploy"] }, tmp), null);
123
+ });
124
+ });
125
+ //# sourceMappingURL=check-pnpm-lifecycle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-pnpm-lifecycle.test.js","sourceRoot":"","sources":["../../../src/common/middleware/check-pnpm-lifecycle.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport {\n buildDlxMessage,\n buildProjectMessage,\n decideAction,\n} from \"./check-pnpm-lifecycle.js\";\n\nconst SKIP_ENV_VAR = \"ZUPLO_SKIP_PNPM_LIFECYCLE_CHECK\";\n\nconst BLOCKED_MODULES_YAML = [\n \"ignoredBuilds:\",\n \" - deno@2.3.1\",\n \" - workerd@1.20241230.0\",\n \" - esbuild@0.25.2\",\n \"pendingBuilds: []\",\n \"\",\n].join(\"\\n\");\n\nconst CLEAN_MODULES_YAML = \"ignoredBuilds: []\\npendingBuilds: []\\n\";\n\nfunction writeModulesYaml(dir: string, contents: string): void {\n const nm = path.join(dir, \"node_modules\");\n mkdirSync(nm, { recursive: true });\n writeFileSync(path.join(nm, \".modules.yaml\"), contents);\n}\n\ndescribe(\"buildDlxMessage\", () => {\n it(\"includes the --allow-build flags and the user's command\", () => {\n const msg = buildDlxMessage(\"deno, workerd\", \"deploy\");\n assert.match(msg, /--allow-build=deno/);\n assert.match(msg, /--allow-build=workerd/);\n assert.match(msg, /--allow-build=esbuild/);\n assert.match(msg, /--allow-build=@swc\\/core/);\n assert.match(msg, /--allow-build=protobufjs/);\n assert.match(msg, /pnpm zuplo deploy/);\n });\n\n it(\"preserves nested subcommand paths in suggestion\", () => {\n const msg = buildDlxMessage(\"deno\", \"project create my-app\");\n assert.match(msg, /pnpx .* zuplo project create my-app/);\n assert.match(msg, /pnpm zuplo project create my-app/);\n });\n\n it(\"includes the onlyBuiltDependencies block as a prerequisite\", () => {\n const msg = buildDlxMessage(\"deno\", \"deploy\");\n assert.match(msg, /onlyBuiltDependencies:/);\n assert.match(msg, /- deno/);\n assert.match(msg, /- esbuild/);\n assert.match(msg, /- workerd/);\n assert.match(msg, /- \"@swc\\/core\"/);\n assert.match(msg, /- protobufjs/);\n });\n\n it(\"places onlyBuiltDependencies at column 0 for paste-safety\", () => {\n const msg = buildDlxMessage(\"deno\", \"deploy\");\n assert.match(msg, /^onlyBuiltDependencies:$/m);\n });\n\n it(\"includes the package.json alternative\", () => {\n const msg = buildDlxMessage(\"deno\", \"deploy\");\n assert.match(msg, /^\"pnpm\": \\{$/m);\n assert.match(msg, /\"onlyBuiltDependencies\": \\[.*\"deno\".*\\]/);\n });\n});\n\ndescribe(\"buildProjectMessage\", () => {\n it(\"includes the onlyBuiltDependencies block and pnpm install\", () => {\n const msg = buildProjectMessage(\"deno, workerd\");\n assert.match(msg, /onlyBuiltDependencies:/);\n assert.match(msg, /- deno/);\n assert.match(msg, /- workerd/);\n assert.match(msg, /pnpm install/);\n });\n\n it(\"places onlyBuiltDependencies at column 0 for paste-safety\", () => {\n const msg = buildProjectMessage(\"deno\");\n assert.match(msg, /^onlyBuiltDependencies:$/m);\n });\n\n it(\"includes the package.json alternative\", () => {\n const msg = buildProjectMessage(\"deno\");\n assert.match(msg, /^\"pnpm\": \\{$/m);\n assert.match(msg, /\"onlyBuiltDependencies\": \\[.*\"deno\".*\\]/);\n });\n\n it(\"does NOT include --allow-build (that's only for dlx)\", () => {\n const msg = buildProjectMessage(\"deno\");\n assert.doesNotMatch(msg, /--allow-build/);\n });\n});\n\ndescribe(\"decideAction\", () => {\n let tmp: string;\n let prevSkip: string | undefined;\n\n beforeEach(() => {\n tmp = mkdtempSync(path.join(os.tmpdir(), \"zup-decide-\"));\n // biome-ignore lint/style/noProcessEnv: test setup\n prevSkip = process.env[SKIP_ENV_VAR];\n // biome-ignore lint/style/noProcessEnv: test setup\n delete process.env[SKIP_ENV_VAR];\n });\n\n afterEach(() => {\n rmSync(tmp, { recursive: true, force: true });\n if (prevSkip === undefined) {\n // biome-ignore lint/style/noProcessEnv: test teardown\n delete process.env[SKIP_ENV_VAR];\n } else {\n // biome-ignore lint/style/noProcessEnv: test teardown\n process.env[SKIP_ENV_VAR] = prevSkip;\n }\n });\n\n it(\"returns null when no .modules.yaml is found\", () => {\n assert.strictEqual(decideAction({ _: [\"deploy\"] }, tmp), null);\n });\n\n it(\"returns null when no critical builds are blocked\", () => {\n writeModulesYaml(tmp, CLEAN_MODULES_YAML);\n assert.strictEqual(decideAction({ _: [\"deploy\"] }, tmp), null);\n });\n\n it(\"returns project message when blocked deps exist outside dlx\", () => {\n writeModulesYaml(tmp, BLOCKED_MODULES_YAML);\n const result = decideAction({ _: [\"deploy\"] }, tmp);\n assert.notStrictEqual(result, null);\n assert.match(result!.message, /onlyBuiltDependencies:/);\n assert.doesNotMatch(result!.message, /--allow-build/);\n });\n\n it(\"returns dlx message when blocked deps exist in pnpm dlx tree\", () => {\n const dlxDir = path.join(tmp, \"pnpm\", \"dlx\", \"fake-hash\", \"subdir\");\n mkdirSync(dlxDir, { recursive: true });\n writeModulesYaml(dlxDir, BLOCKED_MODULES_YAML);\n const result = decideAction({ _: [\"project\", \"create\"] }, dlxDir);\n assert.notStrictEqual(result, null);\n assert.match(result!.message, /--allow-build=deno/);\n assert.match(result!.message, /pnpm zuplo project create/);\n });\n\n it(\"returns null when bypass env var is set, even with blocked deps\", () => {\n // This is the critical regression test: with blocked deps in the\n // fixture, the ONLY way to get null is if the bypass branch fires\n // before getBlockedCriticalDeps runs. A typo in SKIP_ENV_VAR or a\n // removed early-return would cause this assertion to fail.\n writeModulesYaml(tmp, BLOCKED_MODULES_YAML);\n // Sanity: confirm the fixture is actually broken without bypass\n assert.notStrictEqual(decideAction({ _: [\"deploy\"] }, tmp), null);\n\n // biome-ignore lint/style/noProcessEnv: explicit bypass under test\n process.env[SKIP_ENV_VAR] = \"1\";\n assert.strictEqual(decideAction({ _: [\"deploy\"] }, tmp), null);\n });\n});\n"]}
@@ -0,0 +1,13 @@
1
+ export declare const CRITICAL_BUILD_DEPS: readonly [
2
+ "deno",
3
+ "workerd",
4
+ "esbuild",
5
+ "@swc/core",
6
+ "protobufjs",
7
+ ];
8
+ export declare function isPnpmDlx(somePath: string): boolean;
9
+ export declare function formatCommand(argv: { _?: unknown[] }): string;
10
+ export declare function findCliModulesYaml(startDir: string): string | null;
11
+ export declare function readBlockedBuilds(modulesYamlPath: string): string[];
12
+ export declare function getBlockedCriticalDeps(cliModuleDir: string): string[];
13
+ //# sourceMappingURL=pnpm-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/common/utils/pnpm-lifecycle.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,oEAMtB,CAAC;AAIX,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG,MAAM,CAK7D;AAkBD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAalE;AAED,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAqCnE;AAED,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAYrE"}
@@ -0,0 +1,100 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import yaml from "js-yaml";
4
+ import { logger } from "../logger.js";
5
+ export const CRITICAL_BUILD_DEPS = [
6
+ "deno",
7
+ "workerd",
8
+ "esbuild",
9
+ "@swc/core",
10
+ "protobufjs",
11
+ ];
12
+ const MODULES_YAML = path.join("node_modules", ".modules.yaml");
13
+ export function isPnpmDlx(somePath) {
14
+ const normalized = somePath.replace(/\\/g, "/");
15
+ return (normalized.includes("/pnpm/dlx/") || normalized.includes("/pnpm-cache/dlx/"));
16
+ }
17
+ export function formatCommand(argv) {
18
+ if (!Array.isArray(argv._) || argv._.length === 0) {
19
+ return "<cmd>";
20
+ }
21
+ return argv._.map(String).map(shellQuote).join(" ");
22
+ }
23
+ function shellQuote(arg) {
24
+ if (/^[a-zA-Z0-9_./@:=+-]+$/.test(arg)) {
25
+ return arg;
26
+ }
27
+ return JSON.stringify(arg);
28
+ }
29
+ export function findCliModulesYaml(startDir) {
30
+ let current = path.resolve(startDir);
31
+ while (true) {
32
+ const candidate = path.join(current, MODULES_YAML);
33
+ if (existsSync(candidate)) {
34
+ return candidate;
35
+ }
36
+ const parent = path.dirname(current);
37
+ if (parent === current) {
38
+ return null;
39
+ }
40
+ current = parent;
41
+ }
42
+ }
43
+ export function readBlockedBuilds(modulesYamlPath) {
44
+ let raw;
45
+ try {
46
+ raw = readFileSync(modulesYamlPath, "utf-8");
47
+ }
48
+ catch (cause) {
49
+ logger.debug({ cause, modulesYamlPath }, "Could not read .modules.yaml");
50
+ return [];
51
+ }
52
+ let parsed;
53
+ try {
54
+ parsed = yaml.load(raw);
55
+ }
56
+ catch (cause) {
57
+ logger.debug({ cause, modulesYamlPath }, "Could not parse .modules.yaml");
58
+ return [];
59
+ }
60
+ if (!parsed || typeof parsed !== "object") {
61
+ return [];
62
+ }
63
+ const record = parsed;
64
+ const ignored = Array.isArray(record.ignoredBuilds)
65
+ ? record.ignoredBuilds
66
+ : [];
67
+ const pending = Array.isArray(record.pendingBuilds)
68
+ ? record.pendingBuilds
69
+ : [];
70
+ const names = new Set();
71
+ for (const entry of [...ignored, ...pending]) {
72
+ if (typeof entry !== "string") {
73
+ continue;
74
+ }
75
+ names.add(stripVersion(entry));
76
+ }
77
+ return [...names];
78
+ }
79
+ export function getBlockedCriticalDeps(cliModuleDir) {
80
+ try {
81
+ const modulesYaml = findCliModulesYaml(cliModuleDir);
82
+ if (!modulesYaml) {
83
+ return [];
84
+ }
85
+ const blocked = new Set(readBlockedBuilds(modulesYaml));
86
+ return CRITICAL_BUILD_DEPS.filter((name) => blocked.has(name));
87
+ }
88
+ catch (cause) {
89
+ logger.debug({ cause, cliModuleDir }, "pnpm lifecycle detection failed");
90
+ return [];
91
+ }
92
+ }
93
+ function stripVersion(entry) {
94
+ const at = entry.lastIndexOf("@");
95
+ if (at <= 0) {
96
+ return entry;
97
+ }
98
+ return entry.slice(0, at);
99
+ }
100
+ //# sourceMappingURL=pnpm-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm-lifecycle.js","sourceRoot":"","sources":["../../../src/common/utils/pnpm-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"js-yaml\";\nimport { logger } from \"../logger.js\";\n\nexport const CRITICAL_BUILD_DEPS = [\n \"deno\",\n \"workerd\",\n \"esbuild\",\n \"@swc/core\",\n \"protobufjs\",\n] as const;\n\nconst MODULES_YAML = path.join(\"node_modules\", \".modules.yaml\");\n\nexport function isPnpmDlx(somePath: string): boolean {\n const normalized = somePath.replace(/\\\\/g, \"/\");\n return (\n normalized.includes(\"/pnpm/dlx/\") || normalized.includes(\"/pnpm-cache/dlx/\")\n );\n}\n\nexport function formatCommand(argv: { _?: unknown[] }): string {\n if (!Array.isArray(argv._) || argv._.length === 0) {\n return \"<cmd>\";\n }\n return argv._.map(String).map(shellQuote).join(\" \");\n}\n\n// Cross-platform quoting: leaves safe-character tokens untouched and wraps\n// anything else in JSON-style double quotes. JSON.stringify handles embedded\n// quotes and control chars consistently. Round-trips in bash/zsh; on\n// cmd.exe / PowerShell the doubled backslashes JSON emits pass through\n// verbatim (their escape chars are caret/backtick, not backslash), but\n// Windows path APIs and path.resolve collapse consecutive separators, so\n// any path positional the CLI accepts still lands at the right directory.\n// POSIX-only edge case: $VAR / backticks inside double quotes would expand\n// on paste — rare in CLI positionals, accepted trade-off.\nfunction shellQuote(arg: string): string {\n if (/^[a-zA-Z0-9_./@:=+-]+$/.test(arg)) {\n return arg;\n }\n return JSON.stringify(arg);\n}\n\nexport function findCliModulesYaml(startDir: string): string | null {\n let current = path.resolve(startDir);\n while (true) {\n const candidate = path.join(current, MODULES_YAML);\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nexport function readBlockedBuilds(modulesYamlPath: string): string[] {\n let raw: string;\n try {\n raw = readFileSync(modulesYamlPath, \"utf-8\");\n } catch (cause) {\n logger.debug({ cause, modulesYamlPath }, \"Could not read .modules.yaml\");\n return [];\n }\n\n let parsed: unknown;\n try {\n parsed = yaml.load(raw);\n } catch (cause) {\n logger.debug({ cause, modulesYamlPath }, \"Could not parse .modules.yaml\");\n return [];\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n return [];\n }\n\n const record = parsed as Record<string, unknown>;\n const ignored = Array.isArray(record.ignoredBuilds)\n ? record.ignoredBuilds\n : [];\n const pending = Array.isArray(record.pendingBuilds)\n ? record.pendingBuilds\n : [];\n\n const names = new Set<string>();\n for (const entry of [...ignored, ...pending]) {\n if (typeof entry !== \"string\") {\n continue;\n }\n names.add(stripVersion(entry));\n }\n return [...names];\n}\n\nexport function getBlockedCriticalDeps(cliModuleDir: string): string[] {\n try {\n const modulesYaml = findCliModulesYaml(cliModuleDir);\n if (!modulesYaml) {\n return [];\n }\n const blocked = new Set(readBlockedBuilds(modulesYaml));\n return CRITICAL_BUILD_DEPS.filter((name) => blocked.has(name));\n } catch (cause) {\n logger.debug({ cause, cliModuleDir }, \"pnpm lifecycle detection failed\");\n return [];\n }\n}\n\nfunction stripVersion(entry: string): string {\n // Scoped packages keep their leading \"@\", so split on the LAST \"@\".\n const at = entry.lastIndexOf(\"@\");\n if (at <= 0) {\n return entry;\n }\n return entry.slice(0, at);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pnpm-lifecycle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm-lifecycle.test.d.ts","sourceRoot":"","sources":["../../../src/common/utils/pnpm-lifecycle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,177 @@
1
+ import assert from "node:assert";
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { afterEach, beforeEach, describe, it } from "node:test";
6
+ import { findCliModulesYaml, formatCommand, getBlockedCriticalDeps, isPnpmDlx, readBlockedBuilds, } from "./pnpm-lifecycle.js";
7
+ describe("pnpm-lifecycle", () => {
8
+ let tmp;
9
+ beforeEach(() => {
10
+ tmp = mkdtempSync(path.join(os.tmpdir(), "zup-pnpm-"));
11
+ });
12
+ afterEach(() => {
13
+ rmSync(tmp, { recursive: true, force: true });
14
+ });
15
+ function writeModulesYaml(contents, dir = tmp) {
16
+ const nm = path.join(dir, "node_modules");
17
+ mkdirSync(nm, { recursive: true });
18
+ const file = path.join(nm, ".modules.yaml");
19
+ writeFileSync(file, contents);
20
+ return file;
21
+ }
22
+ describe("findCliModulesYaml", () => {
23
+ it("finds .modules.yaml in the start directory", () => {
24
+ const file = writeModulesYaml("ignoredBuilds: []\n");
25
+ assert.strictEqual(findCliModulesYaml(tmp), file);
26
+ });
27
+ it("walks up to find .modules.yaml in an ancestor", () => {
28
+ const file = writeModulesYaml("ignoredBuilds: []\n");
29
+ const nested = path.join(tmp, "a", "b", "c");
30
+ mkdirSync(nested, { recursive: true });
31
+ assert.strictEqual(findCliModulesYaml(nested), file);
32
+ });
33
+ it("returns null when no .modules.yaml exists in tree", () => {
34
+ const nested = path.join(tmp, "a", "b");
35
+ mkdirSync(nested, { recursive: true });
36
+ assert.strictEqual(findCliModulesYaml(nested), null);
37
+ });
38
+ });
39
+ describe("readBlockedBuilds", () => {
40
+ it("returns [] when file is missing", () => {
41
+ const missing = path.join(tmp, "does-not-exist.yaml");
42
+ assert.deepStrictEqual(readBlockedBuilds(missing), []);
43
+ });
44
+ it("returns [] for malformed YAML", () => {
45
+ const file = writeModulesYaml("not: valid: yaml: [\n");
46
+ assert.deepStrictEqual(readBlockedBuilds(file), []);
47
+ });
48
+ it("strips @version suffix from package names", () => {
49
+ const file = writeModulesYaml("ignoredBuilds:\n - deno@2.3.1\n - workerd@1.20241230.0\n");
50
+ const result = readBlockedBuilds(file).sort();
51
+ assert.deepStrictEqual(result, ["deno", "workerd"]);
52
+ });
53
+ it("preserves leading @ on scoped packages", () => {
54
+ const file = writeModulesYaml("ignoredBuilds:\n - '@swc/core@1.10.18'\n");
55
+ assert.deepStrictEqual(readBlockedBuilds(file), ["@swc/core"]);
56
+ });
57
+ it("merges and dedupes ignoredBuilds and pendingBuilds", () => {
58
+ const file = writeModulesYaml([
59
+ "ignoredBuilds:",
60
+ " - deno@2.3.1",
61
+ " - esbuild@0.25.2",
62
+ "pendingBuilds:",
63
+ " - deno@2.3.1",
64
+ " - workerd@1.20241230.0",
65
+ "",
66
+ ].join("\n"));
67
+ const result = readBlockedBuilds(file).sort();
68
+ assert.deepStrictEqual(result, ["deno", "esbuild", "workerd"]);
69
+ });
70
+ it("returns [] when both lists are empty", () => {
71
+ const file = writeModulesYaml("ignoredBuilds: []\npendingBuilds: []\n");
72
+ assert.deepStrictEqual(readBlockedBuilds(file), []);
73
+ });
74
+ });
75
+ describe("isPnpmDlx", () => {
76
+ it("detects macOS pnpm dlx cache paths", () => {
77
+ assert.strictEqual(isPnpmDlx("/Users/me/Library/Caches/pnpm/dlx/abc/node_modules/foo"), true);
78
+ });
79
+ it("detects Linux pnpm dlx cache paths", () => {
80
+ assert.strictEqual(isPnpmDlx("/home/me/.local/share/pnpm/dlx/abc/node_modules/foo"), true);
81
+ });
82
+ it("detects Windows pnpm-cache dlx paths", () => {
83
+ assert.strictEqual(isPnpmDlx("C:\\Users\\me\\AppData\\Local\\pnpm-cache\\dlx\\abc\\node_modules\\foo"), true);
84
+ });
85
+ it("returns false for ordinary project paths", () => {
86
+ assert.strictEqual(isPnpmDlx("/Users/me/projects/foo/node_modules/.pnpm/bar"), false);
87
+ });
88
+ it("returns false for paths that contain dlx without pnpm", () => {
89
+ assert.strictEqual(isPnpmDlx("/Users/me/dlx/something/node_modules"), false);
90
+ });
91
+ });
92
+ describe("getBlockedCriticalDeps", () => {
93
+ it("returns [] when no .modules.yaml is found", () => {
94
+ assert.deepStrictEqual(getBlockedCriticalDeps(tmp), []);
95
+ });
96
+ it("returns all matching critical deps", () => {
97
+ writeModulesYaml([
98
+ "ignoredBuilds:",
99
+ " - deno@2.3.1",
100
+ " - protobufjs@7.5.6",
101
+ " - workerd@1.20241230.0",
102
+ " - esbuild@0.25.2",
103
+ " - '@swc/core@1.10.18'",
104
+ " - esbuild@0.25.12",
105
+ "pendingBuilds: []",
106
+ "",
107
+ ].join("\n"));
108
+ const result = getBlockedCriticalDeps(tmp);
109
+ assert.deepStrictEqual(result, [
110
+ "deno",
111
+ "workerd",
112
+ "esbuild",
113
+ "@swc/core",
114
+ "protobufjs",
115
+ ]);
116
+ });
117
+ it("returns subset when only some criticals are blocked", () => {
118
+ writeModulesYaml([
119
+ "ignoredBuilds:",
120
+ " - '@swc/core@1.10.18'",
121
+ " - protobufjs@7.5.6",
122
+ "pendingBuilds: []",
123
+ "",
124
+ ].join("\n"));
125
+ assert.deepStrictEqual(getBlockedCriticalDeps(tmp), [
126
+ "@swc/core",
127
+ "protobufjs",
128
+ ]);
129
+ });
130
+ it("ignores unrelated packages", () => {
131
+ writeModulesYaml([
132
+ "ignoredBuilds:",
133
+ " - some-other-pkg@1.0.0",
134
+ "pendingBuilds: []",
135
+ "",
136
+ ].join("\n"));
137
+ assert.deepStrictEqual(getBlockedCriticalDeps(tmp), []);
138
+ });
139
+ });
140
+ describe("formatCommand", () => {
141
+ it("returns <cmd> for empty positionals", () => {
142
+ assert.strictEqual(formatCommand({ _: [] }), "<cmd>");
143
+ });
144
+ it("returns <cmd> when _ is missing entirely", () => {
145
+ assert.strictEqual(formatCommand({}), "<cmd>");
146
+ });
147
+ it("returns the single command unchanged", () => {
148
+ assert.strictEqual(formatCommand({ _: ["deploy"] }), "deploy");
149
+ });
150
+ it("preserves the full subcommand path", () => {
151
+ assert.strictEqual(formatCommand({ _: ["project", "create", "my-app"] }), "project create my-app");
152
+ });
153
+ it("stringifies non-string entries", () => {
154
+ assert.strictEqual(formatCommand({ _: [123, "create"] }), "123 create");
155
+ });
156
+ it("double-quotes positionals containing whitespace", () => {
157
+ assert.strictEqual(formatCommand({ _: ["init", "my project"] }), 'init "my project"');
158
+ });
159
+ it("double-quotes positionals with shell metacharacters", () => {
160
+ assert.strictEqual(formatCommand({
161
+ _: ["delete", "https://api.example.com/foo?bar=1&baz=2"],
162
+ }), 'delete "https://api.example.com/foo?bar=1&baz=2"');
163
+ });
164
+ it("escapes embedded double quotes via JSON encoding", () => {
165
+ assert.strictEqual(formatCommand({ _: ["init", 'say "hi"'] }), 'init "say \\"hi\\""');
166
+ });
167
+ it("leaves embedded single quotes alone (JSON doesn't need to escape them)", () => {
168
+ assert.strictEqual(formatCommand({ _: ["init", "don't"] }), `init "don't"`);
169
+ });
170
+ it("leaves dotted/URL-safe tokens unquoted", () => {
171
+ assert.strictEqual(formatCommand({
172
+ _: ["init", "./my-dir", "v1.2.3", "user@example.com"],
173
+ }), "init ./my-dir v1.2.3 user@example.com");
174
+ });
175
+ });
176
+ });
177
+ //# sourceMappingURL=pnpm-lifecycle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm-lifecycle.test.js","sourceRoot":"","sources":["../../../src/common/utils/pnpm-lifecycle.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert\";\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport {\n findCliModulesYaml,\n formatCommand,\n getBlockedCriticalDeps,\n isPnpmDlx,\n readBlockedBuilds,\n} from \"./pnpm-lifecycle.js\";\n\ndescribe(\"pnpm-lifecycle\", () => {\n let tmp: string;\n\n beforeEach(() => {\n tmp = mkdtempSync(path.join(os.tmpdir(), \"zup-pnpm-\"));\n });\n\n afterEach(() => {\n rmSync(tmp, { recursive: true, force: true });\n });\n\n function writeModulesYaml(contents: string, dir = tmp): string {\n const nm = path.join(dir, \"node_modules\");\n mkdirSync(nm, { recursive: true });\n const file = path.join(nm, \".modules.yaml\");\n writeFileSync(file, contents);\n return file;\n }\n\n describe(\"findCliModulesYaml\", () => {\n it(\"finds .modules.yaml in the start directory\", () => {\n const file = writeModulesYaml(\"ignoredBuilds: []\\n\");\n assert.strictEqual(findCliModulesYaml(tmp), file);\n });\n\n it(\"walks up to find .modules.yaml in an ancestor\", () => {\n const file = writeModulesYaml(\"ignoredBuilds: []\\n\");\n const nested = path.join(tmp, \"a\", \"b\", \"c\");\n mkdirSync(nested, { recursive: true });\n assert.strictEqual(findCliModulesYaml(nested), file);\n });\n\n it(\"returns null when no .modules.yaml exists in tree\", () => {\n const nested = path.join(tmp, \"a\", \"b\");\n mkdirSync(nested, { recursive: true });\n assert.strictEqual(findCliModulesYaml(nested), null);\n });\n });\n\n describe(\"readBlockedBuilds\", () => {\n it(\"returns [] when file is missing\", () => {\n const missing = path.join(tmp, \"does-not-exist.yaml\");\n assert.deepStrictEqual(readBlockedBuilds(missing), []);\n });\n\n it(\"returns [] for malformed YAML\", () => {\n const file = writeModulesYaml(\"not: valid: yaml: [\\n\");\n assert.deepStrictEqual(readBlockedBuilds(file), []);\n });\n\n it(\"strips @version suffix from package names\", () => {\n const file = writeModulesYaml(\n \"ignoredBuilds:\\n - deno@2.3.1\\n - workerd@1.20241230.0\\n\"\n );\n const result = readBlockedBuilds(file).sort();\n assert.deepStrictEqual(result, [\"deno\", \"workerd\"]);\n });\n\n it(\"preserves leading @ on scoped packages\", () => {\n const file = writeModulesYaml(\n \"ignoredBuilds:\\n - '@swc/core@1.10.18'\\n\"\n );\n assert.deepStrictEqual(readBlockedBuilds(file), [\"@swc/core\"]);\n });\n\n it(\"merges and dedupes ignoredBuilds and pendingBuilds\", () => {\n const file = writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - deno@2.3.1\",\n \" - esbuild@0.25.2\",\n \"pendingBuilds:\",\n \" - deno@2.3.1\",\n \" - workerd@1.20241230.0\",\n \"\",\n ].join(\"\\n\")\n );\n const result = readBlockedBuilds(file).sort();\n assert.deepStrictEqual(result, [\"deno\", \"esbuild\", \"workerd\"]);\n });\n\n it(\"returns [] when both lists are empty\", () => {\n const file = writeModulesYaml(\"ignoredBuilds: []\\npendingBuilds: []\\n\");\n assert.deepStrictEqual(readBlockedBuilds(file), []);\n });\n });\n\n describe(\"isPnpmDlx\", () => {\n it(\"detects macOS pnpm dlx cache paths\", () => {\n assert.strictEqual(\n isPnpmDlx(\"/Users/me/Library/Caches/pnpm/dlx/abc/node_modules/foo\"),\n true\n );\n });\n\n it(\"detects Linux pnpm dlx cache paths\", () => {\n assert.strictEqual(\n isPnpmDlx(\"/home/me/.local/share/pnpm/dlx/abc/node_modules/foo\"),\n true\n );\n });\n\n it(\"detects Windows pnpm-cache dlx paths\", () => {\n assert.strictEqual(\n isPnpmDlx(\n \"C:\\\\Users\\\\me\\\\AppData\\\\Local\\\\pnpm-cache\\\\dlx\\\\abc\\\\node_modules\\\\foo\"\n ),\n true\n );\n });\n\n it(\"returns false for ordinary project paths\", () => {\n assert.strictEqual(\n isPnpmDlx(\"/Users/me/projects/foo/node_modules/.pnpm/bar\"),\n false\n );\n });\n\n it(\"returns false for paths that contain dlx without pnpm\", () => {\n assert.strictEqual(\n isPnpmDlx(\"/Users/me/dlx/something/node_modules\"),\n false\n );\n });\n });\n\n describe(\"getBlockedCriticalDeps\", () => {\n it(\"returns [] when no .modules.yaml is found\", () => {\n assert.deepStrictEqual(getBlockedCriticalDeps(tmp), []);\n });\n\n it(\"returns all matching critical deps\", () => {\n writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - deno@2.3.1\",\n \" - protobufjs@7.5.6\",\n \" - workerd@1.20241230.0\",\n \" - esbuild@0.25.2\",\n \" - '@swc/core@1.10.18'\",\n \" - esbuild@0.25.12\",\n \"pendingBuilds: []\",\n \"\",\n ].join(\"\\n\")\n );\n const result = getBlockedCriticalDeps(tmp);\n assert.deepStrictEqual(result, [\n \"deno\",\n \"workerd\",\n \"esbuild\",\n \"@swc/core\",\n \"protobufjs\",\n ]);\n });\n\n it(\"returns subset when only some criticals are blocked\", () => {\n writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - '@swc/core@1.10.18'\",\n \" - protobufjs@7.5.6\",\n \"pendingBuilds: []\",\n \"\",\n ].join(\"\\n\")\n );\n assert.deepStrictEqual(getBlockedCriticalDeps(tmp), [\n \"@swc/core\",\n \"protobufjs\",\n ]);\n });\n\n it(\"ignores unrelated packages\", () => {\n writeModulesYaml(\n [\n \"ignoredBuilds:\",\n \" - some-other-pkg@1.0.0\",\n \"pendingBuilds: []\",\n \"\",\n ].join(\"\\n\")\n );\n assert.deepStrictEqual(getBlockedCriticalDeps(tmp), []);\n });\n });\n\n describe(\"formatCommand\", () => {\n it(\"returns <cmd> for empty positionals\", () => {\n assert.strictEqual(formatCommand({ _: [] }), \"<cmd>\");\n });\n\n it(\"returns <cmd> when _ is missing entirely\", () => {\n assert.strictEqual(formatCommand({}), \"<cmd>\");\n });\n\n it(\"returns the single command unchanged\", () => {\n assert.strictEqual(formatCommand({ _: [\"deploy\"] }), \"deploy\");\n });\n\n it(\"preserves the full subcommand path\", () => {\n assert.strictEqual(\n formatCommand({ _: [\"project\", \"create\", \"my-app\"] }),\n \"project create my-app\"\n );\n });\n\n it(\"stringifies non-string entries\", () => {\n assert.strictEqual(formatCommand({ _: [123, \"create\"] }), \"123 create\");\n });\n\n it(\"double-quotes positionals containing whitespace\", () => {\n assert.strictEqual(\n formatCommand({ _: [\"init\", \"my project\"] }),\n 'init \"my project\"'\n );\n });\n\n it(\"double-quotes positionals with shell metacharacters\", () => {\n assert.strictEqual(\n formatCommand({\n _: [\"delete\", \"https://api.example.com/foo?bar=1&baz=2\"],\n }),\n 'delete \"https://api.example.com/foo?bar=1&baz=2\"'\n );\n });\n\n it(\"escapes embedded double quotes via JSON encoding\", () => {\n assert.strictEqual(\n formatCommand({ _: [\"init\", 'say \"hi\"'] }),\n 'init \"say \\\\\"hi\\\\\"\"'\n );\n });\n\n it(\"leaves embedded single quotes alone (JSON doesn't need to escape them)\", () => {\n assert.strictEqual(\n formatCommand({ _: [\"init\", \"don't\"] }),\n `init \"don't\"`\n );\n });\n\n it(\"leaves dotted/URL-safe tokens unquoted\", () => {\n assert.strictEqual(\n formatCommand({\n _: [\"init\", \"./my-dir\", \"v1.2.3\", \"user@example.com\"],\n }),\n \"init ./my-dir v1.2.3 user@example.com\"\n );\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"root":["../src/cli.ts","../src/internal.ts","../src/types.d.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/outdated.test.ts","../src/__tests__/populate.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/__tests__/integration/confirm-linked-config.integration.test.ts","../src/__tests__/integration/confirm-production-deploy.integration.test.ts","../src/__tests__/integration/custom-domain.integration.test.ts","../src/__tests__/integration/delete.integration.test.ts","../src/__tests__/integration/deploy.integration.test.ts","../src/__tests__/integration/get-project-param.integration.test.ts","../src/__tests__/integration/info.integration.test.ts","../src/__tests__/integration/jest-mocks-setup.ts","../src/__tests__/integration/jest-setup.ts","../src/__tests__/integration/link.integration.test.ts","../src/__tests__/integration/linked-config-cascade.integration.test.ts","../src/__tests__/integration/list.integration.test.ts","../src/__tests__/integration/test-utils.ts","../src/__tests__/integration/tunnel.integration.test.ts","../src/__tests__/integration/variable.integration.test.ts","../src/__tests__/integration/whoami.integration.test.ts","../src/bucket/models.ts","../src/bucket/list/handler.ts","../src/build/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/docs.ts","../src/cmds/editor.ts","../src/cmds/info.ts","../src/cmds/init.ts","../src/cmds/link.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/logout.ts","../src/cmds/test.ts","../src/cmds/whoami.ts","../src/cmds/bucket/index.ts","../src/cmds/bucket/list.ts","../src/cmds/custom-domain/create.ts","../src/cmds/custom-domain/delete.ts","../src/cmds/custom-domain/index.ts","../src/cmds/custom-domain/list.ts","../src/cmds/custom-domain/update.ts","../src/cmds/mtls-certificates/create.ts","../src/cmds/mtls-certificates/delete.ts","../src/cmds/mtls-certificates/describe.ts","../src/cmds/mtls-certificates/disable.ts","../src/cmds/mtls-certificates/index.ts","../src/cmds/mtls-certificates/list.ts","../src/cmds/mtls-certificates/update.ts","../src/cmds/open-api/convert.ts","../src/cmds/open-api/index.ts","../src/cmds/open-api/merge.ts","../src/cmds/open-api/overlay.ts","../src/cmds/project/create.ts","../src/cmds/project/index.ts","../src/cmds/project/info.ts","../src/cmds/proxies/create.ts","../src/cmds/proxies/delete.ts","../src/cmds/proxies/describe.ts","../src/cmds/proxies/index.ts","../src/cmds/proxies/update.ts","../src/cmds/source/import-openapi.ts","../src/cmds/source/index.ts","../src/cmds/source/migrate.ts","../src/cmds/source/upgrade.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/populate.ts","../src/common/read-linked-config.test.ts","../src/common/read-linked-config.ts","../src/common/runner.ts","../src/common/settings.ts","../src/common/terminal.test.ts","../src/common/terminal.ts","../src/common/worker-output.ts","../src/common/analytics/lib.ts","../src/common/api/client.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/authentication.ts","../src/common/middleware/confirm-linked-config.ts","../src/common/middleware/confirm-production-deploy.ts","../src/common/middleware/get-account-param.ts","../src/common/middleware/get-environment-param.test.ts","../src/common/middleware/get-environment-param.ts","../src/common/middleware/get-project-param.ts","../src/common/middleware/logging.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/middleware/validate-fleet.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/branch.ts","../src/common/utils/build-environment-prompt-choices.test.ts","../src/common/utils/build-environment-prompt-choices.ts","../src/common/utils/format-environment-type.test.ts","../src/common/utils/format-environment-type.ts","../src/common/utils/ports.ts","../src/common/utils/prefixed-output.ts","../src/common/utils/pretty-print-environment-prompt.test.ts","../src/common/utils/pretty-print-environment-prompt.ts","../src/common/utils/sort-environments-for-prompt.test.ts","../src/common/utils/sort-environments-for-prompt.ts","../src/common/utils/stringify-config.test.ts","../src/common/utils/stringify-config.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/argument-validators.spec.ts","../src/common/validators/argument-validators.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/custom-domain/models.ts","../src/custom-domain/create/handler.ts","../src/custom-domain/delete/handler.ts","../src/custom-domain/list/handler.ts","../src/custom-domain/update/handler.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.local-registry.test.ts","../src/deploy/archive.test.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/docs/handler.ts","../src/editor/handler.ts","../src/editor/e2e/editor.spec.ts","../src/init/handler.ts","../src/link/handler.ts","../src/list/handler.ts","../src/login/login.ts","../src/login/logout.ts","../src/login/tokens.ts","../src/mtls-certificates/models.ts","../src/mtls-certificates/create/handler.ts","../src/mtls-certificates/delete/handler.ts","../src/mtls-certificates/describe/handler.ts","../src/mtls-certificates/disable/handler.ts","../src/mtls-certificates/list/handler.ts","../src/mtls-certificates/update/handler.ts","../src/open-api/convert/handler.spec.ts","../src/open-api/convert/handler.ts","../src/open-api/merge/handler.spec.ts","../src/open-api/merge/handler.ts","../src/open-api/overlay/handler.spec.ts","../src/open-api/overlay/handler.ts","../src/project/create/handler.ts","../src/project/info/handler.ts","../src/proxies/models.ts","../src/proxies/create/handler.ts","../src/proxies/delete/handler.ts","../src/proxies/describe/handler.ts","../src/proxies/update/handler.ts","../src/source/migrate/dev-portal/handler.ts","../src/source/migrate/dev-portal/types.ts","../src/source/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.ts","../src/test/test-files.test.ts","../src/test/test-files.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","../src/whoami/handler.ts"],"version":"5.8.2"}
1
+ {"root":["../src/cli.ts","../src/internal.ts","../src/types.d.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/outdated.test.ts","../src/__tests__/populate.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/__tests__/integration/confirm-linked-config.integration.test.ts","../src/__tests__/integration/confirm-production-deploy.integration.test.ts","../src/__tests__/integration/custom-domain.integration.test.ts","../src/__tests__/integration/delete.integration.test.ts","../src/__tests__/integration/deploy.integration.test.ts","../src/__tests__/integration/get-project-param.integration.test.ts","../src/__tests__/integration/info.integration.test.ts","../src/__tests__/integration/jest-mocks-setup.ts","../src/__tests__/integration/jest-setup.ts","../src/__tests__/integration/link.integration.test.ts","../src/__tests__/integration/linked-config-cascade.integration.test.ts","../src/__tests__/integration/list.integration.test.ts","../src/__tests__/integration/test-utils.ts","../src/__tests__/integration/tunnel.integration.test.ts","../src/__tests__/integration/variable.integration.test.ts","../src/__tests__/integration/whoami.integration.test.ts","../src/bucket/models.ts","../src/bucket/list/handler.ts","../src/build/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/docs.ts","../src/cmds/editor.ts","../src/cmds/info.ts","../src/cmds/init.ts","../src/cmds/link.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/logout.ts","../src/cmds/test.ts","../src/cmds/whoami.ts","../src/cmds/bucket/index.ts","../src/cmds/bucket/list.ts","../src/cmds/custom-domain/create.ts","../src/cmds/custom-domain/delete.ts","../src/cmds/custom-domain/index.ts","../src/cmds/custom-domain/list.ts","../src/cmds/custom-domain/update.ts","../src/cmds/mtls-certificates/create.ts","../src/cmds/mtls-certificates/delete.ts","../src/cmds/mtls-certificates/describe.ts","../src/cmds/mtls-certificates/disable.ts","../src/cmds/mtls-certificates/index.ts","../src/cmds/mtls-certificates/list.ts","../src/cmds/mtls-certificates/update.ts","../src/cmds/open-api/convert.ts","../src/cmds/open-api/index.ts","../src/cmds/open-api/merge.ts","../src/cmds/open-api/overlay.ts","../src/cmds/project/create.ts","../src/cmds/project/index.ts","../src/cmds/project/info.ts","../src/cmds/proxies/create.ts","../src/cmds/proxies/delete.ts","../src/cmds/proxies/describe.ts","../src/cmds/proxies/index.ts","../src/cmds/proxies/update.ts","../src/cmds/source/import-openapi.ts","../src/cmds/source/index.ts","../src/cmds/source/migrate.ts","../src/cmds/source/upgrade.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/populate.ts","../src/common/read-linked-config.test.ts","../src/common/read-linked-config.ts","../src/common/runner.ts","../src/common/settings.ts","../src/common/terminal.test.ts","../src/common/terminal.ts","../src/common/worker-output.ts","../src/common/analytics/lib.ts","../src/common/api/client.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/authentication.ts","../src/common/middleware/check-pnpm-lifecycle.test.ts","../src/common/middleware/check-pnpm-lifecycle.ts","../src/common/middleware/confirm-linked-config.ts","../src/common/middleware/confirm-production-deploy.ts","../src/common/middleware/get-account-param.ts","../src/common/middleware/get-environment-param.test.ts","../src/common/middleware/get-environment-param.ts","../src/common/middleware/get-project-param.ts","../src/common/middleware/logging.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/middleware/validate-fleet.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/branch.ts","../src/common/utils/build-environment-prompt-choices.test.ts","../src/common/utils/build-environment-prompt-choices.ts","../src/common/utils/format-environment-type.test.ts","../src/common/utils/format-environment-type.ts","../src/common/utils/pnpm-lifecycle.test.ts","../src/common/utils/pnpm-lifecycle.ts","../src/common/utils/ports.ts","../src/common/utils/prefixed-output.ts","../src/common/utils/pretty-print-environment-prompt.test.ts","../src/common/utils/pretty-print-environment-prompt.ts","../src/common/utils/sort-environments-for-prompt.test.ts","../src/common/utils/sort-environments-for-prompt.ts","../src/common/utils/stringify-config.test.ts","../src/common/utils/stringify-config.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/argument-validators.spec.ts","../src/common/validators/argument-validators.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/custom-domain/models.ts","../src/custom-domain/create/handler.ts","../src/custom-domain/delete/handler.ts","../src/custom-domain/list/handler.ts","../src/custom-domain/update/handler.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.local-registry.test.ts","../src/deploy/archive.test.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/docs/handler.ts","../src/editor/handler.ts","../src/editor/e2e/editor.spec.ts","../src/init/handler.ts","../src/link/handler.ts","../src/list/handler.ts","../src/login/login.ts","../src/login/logout.ts","../src/login/tokens.ts","../src/mtls-certificates/models.ts","../src/mtls-certificates/create/handler.ts","../src/mtls-certificates/delete/handler.ts","../src/mtls-certificates/describe/handler.ts","../src/mtls-certificates/disable/handler.ts","../src/mtls-certificates/list/handler.ts","../src/mtls-certificates/update/handler.ts","../src/open-api/convert/handler.spec.ts","../src/open-api/convert/handler.ts","../src/open-api/merge/handler.spec.ts","../src/open-api/merge/handler.ts","../src/open-api/overlay/handler.spec.ts","../src/open-api/overlay/handler.ts","../src/project/create/handler.ts","../src/project/info/handler.ts","../src/proxies/models.ts","../src/proxies/create/handler.ts","../src/proxies/delete/handler.ts","../src/proxies/describe/handler.ts","../src/proxies/update/handler.ts","../src/source/migrate/dev-portal/handler.ts","../src/source/migrate/dev-portal/types.ts","../src/source/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.ts","../src/test/test-files.test.ts","../src/test/test-files.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","../src/whoami/handler.ts"],"version":"5.8.2"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zuplo/core",
3
- "version": "6.69.10",
3
+ "version": "6.69.11",
4
4
  "repository": "https://github.com/zuplo/zuplo",
5
5
  "author": "Zuplo, Inc.",
6
6
  "type": "module",