@quenty/nevermore-cli 4.41.1 → 4.42.1-canary.783.30683193716.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.
Files changed (207) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/args/global-args.d.ts +13 -0
  3. package/dist/args/global-args.d.ts.map +1 -1
  4. package/dist/commands/batch-command/batch-deploy-command.d.ts +3 -0
  5. package/dist/commands/batch-command/batch-deploy-command.d.ts.map +1 -1
  6. package/dist/commands/batch-command/batch-deploy-command.js +90 -1
  7. package/dist/commands/batch-command/batch-deploy-command.js.map +1 -1
  8. package/dist/commands/batch-command/batch-test-command.d.ts.map +1 -1
  9. package/dist/commands/batch-command/batch-test-command.js +25 -4
  10. package/dist/commands/batch-command/batch-test-command.js.map +1 -1
  11. package/dist/commands/deploy-command/deploy-init.js +1 -1
  12. package/dist/commands/deploy-command/deploy-init.js.map +1 -1
  13. package/dist/commands/deploy-command/index.d.ts +3 -0
  14. package/dist/commands/deploy-command/index.d.ts.map +1 -1
  15. package/dist/commands/deploy-command/index.js +297 -60
  16. package/dist/commands/deploy-command/index.js.map +1 -1
  17. package/dist/commands/deploy-command/select-target.js +1 -1
  18. package/dist/commands/deploy-command/select-target.js.map +1 -1
  19. package/dist/commands/deploy-command/version-command.d.ts.map +1 -1
  20. package/dist/commands/deploy-command/version-command.js +138 -12
  21. package/dist/commands/deploy-command/version-command.js.map +1 -1
  22. package/dist/commands/test-command/test-command.d.ts.map +1 -1
  23. package/dist/commands/test-command/test-command.js +23 -11
  24. package/dist/commands/test-command/test-command.js.map +1 -1
  25. package/dist/nevermore.js +17 -0
  26. package/dist/nevermore.js.map +1 -1
  27. package/dist/utils/batch/changed-packages-utils.d.ts +1 -1
  28. package/dist/utils/batch/changed-packages-utils.d.ts.map +1 -1
  29. package/dist/utils/batch/changed-packages-utils.js +1 -1
  30. package/dist/utils/batch/changed-packages-utils.js.map +1 -1
  31. package/dist/utils/build/base-place-resolver-factory.d.ts +25 -0
  32. package/dist/utils/build/base-place-resolver-factory.d.ts.map +1 -0
  33. package/dist/utils/build/base-place-resolver-factory.js +40 -0
  34. package/dist/utils/build/base-place-resolver-factory.js.map +1 -0
  35. package/dist/utils/build/build.d.ts +13 -2
  36. package/dist/utils/build/build.d.ts.map +1 -1
  37. package/dist/utils/build/build.js.map +1 -1
  38. package/dist/utils/build/upload.d.ts +1 -1
  39. package/dist/utils/build/upload.d.ts.map +1 -1
  40. package/dist/utils/deploy/deploy-metadata.d.ts +1 -1
  41. package/dist/utils/deploy/deploy-metadata.d.ts.map +1 -1
  42. package/dist/utils/job-context/base-job-context.d.ts +3 -1
  43. package/dist/utils/job-context/base-job-context.d.ts.map +1 -1
  44. package/dist/utils/job-context/base-job-context.js +45 -6
  45. package/dist/utils/job-context/base-job-context.js.map +1 -1
  46. package/dist/utils/job-context/batch-script-job-context.d.ts +6 -0
  47. package/dist/utils/job-context/batch-script-job-context.d.ts.map +1 -1
  48. package/dist/utils/job-context/batch-script-job-context.js +13 -0
  49. package/dist/utils/job-context/batch-script-job-context.js.map +1 -1
  50. package/dist/utils/job-context/cloud-job-context.d.ts +2 -1
  51. package/dist/utils/job-context/cloud-job-context.d.ts.map +1 -1
  52. package/dist/utils/job-context/cloud-job-context.js +2 -2
  53. package/dist/utils/job-context/cloud-job-context.js.map +1 -1
  54. package/dist/utils/job-context/local-job-context.d.ts +2 -1
  55. package/dist/utils/job-context/local-job-context.d.ts.map +1 -1
  56. package/dist/utils/job-context/local-job-context.js +2 -2
  57. package/dist/utils/job-context/local-job-context.js.map +1 -1
  58. package/dist/utils/open-cloud/open-cloud-client.d.ts +20 -2
  59. package/dist/utils/open-cloud/open-cloud-client.d.ts.map +1 -1
  60. package/dist/utils/open-cloud/open-cloud-client.js +78 -21
  61. package/dist/utils/open-cloud/open-cloud-client.js.map +1 -1
  62. package/dist/utils/open-cloud/open-cloud-client.test.js +89 -12
  63. package/dist/utils/open-cloud/open-cloud-client.test.js.map +1 -1
  64. package/dist/utils/testing/parsers/batch-log-parser.d.ts +13 -5
  65. package/dist/utils/testing/parsers/batch-log-parser.d.ts.map +1 -1
  66. package/dist/utils/testing/parsers/batch-log-parser.js +114 -68
  67. package/dist/utils/testing/parsers/batch-log-parser.js.map +1 -1
  68. package/dist/utils/testing/parsers/batch-log-parser.test.js +57 -5
  69. package/dist/utils/testing/parsers/batch-log-parser.test.js.map +1 -1
  70. package/dist/utils/testing/parsers/traceback-parser.d.ts +31 -0
  71. package/dist/utils/testing/parsers/traceback-parser.d.ts.map +1 -0
  72. package/dist/utils/testing/parsers/traceback-parser.js +91 -0
  73. package/dist/utils/testing/parsers/traceback-parser.js.map +1 -0
  74. package/dist/utils/testing/parsers/traceback-parser.test.d.ts +2 -0
  75. package/dist/utils/testing/parsers/traceback-parser.test.d.ts.map +1 -0
  76. package/dist/utils/testing/parsers/traceback-parser.test.js +45 -0
  77. package/dist/utils/testing/parsers/traceback-parser.test.js.map +1 -0
  78. package/dist/utils/testing/runner/combined-project-generator.d.ts +1 -1
  79. package/dist/utils/testing/runner/combined-project-generator.d.ts.map +1 -1
  80. package/dist/utils/testing/runner/test-runner.d.ts +9 -1
  81. package/dist/utils/testing/runner/test-runner.d.ts.map +1 -1
  82. package/dist/utils/testing/runner/test-runner.js +28 -3
  83. package/dist/utils/testing/runner/test-runner.js.map +1 -1
  84. package/dist/utils/testing/runner/test-runner.test.d.ts +2 -0
  85. package/dist/utils/testing/runner/test-runner.test.d.ts.map +1 -0
  86. package/dist/utils/testing/runner/test-runner.test.js +18 -0
  87. package/dist/utils/testing/runner/test-runner.test.js.map +1 -0
  88. package/dist/utils/testing/test-log-parser.d.ts +32 -1
  89. package/dist/utils/testing/test-log-parser.d.ts.map +1 -1
  90. package/dist/utils/testing/test-log-parser.js +53 -9
  91. package/dist/utils/testing/test-log-parser.js.map +1 -1
  92. package/dist/utils/testing/test-log-parser.test.d.ts +2 -0
  93. package/dist/utils/testing/test-log-parser.test.d.ts.map +1 -0
  94. package/dist/utils/testing/test-log-parser.test.js +56 -0
  95. package/dist/utils/testing/test-log-parser.test.js.map +1 -0
  96. package/dist/utils/watch/github-context.d.ts +50 -0
  97. package/dist/utils/watch/github-context.d.ts.map +1 -0
  98. package/dist/utils/watch/github-context.js +125 -0
  99. package/dist/utils/watch/github-context.js.map +1 -0
  100. package/dist/utils/watch/github-context.test.d.ts +2 -0
  101. package/dist/utils/watch/github-context.test.d.ts.map +1 -0
  102. package/dist/utils/watch/github-context.test.js +112 -0
  103. package/dist/utils/watch/github-context.test.js.map +1 -0
  104. package/dist/utils/watch/http-watch-registry.d.ts +40 -0
  105. package/dist/utils/watch/http-watch-registry.d.ts.map +1 -0
  106. package/dist/utils/watch/http-watch-registry.js +262 -0
  107. package/dist/utils/watch/http-watch-registry.js.map +1 -0
  108. package/dist/utils/watch/http-watch-registry.test.d.ts +2 -0
  109. package/dist/utils/watch/http-watch-registry.test.d.ts.map +1 -0
  110. package/dist/utils/watch/http-watch-registry.test.js +211 -0
  111. package/dist/utils/watch/http-watch-registry.test.js.map +1 -0
  112. package/dist/utils/watch/local-watch-loop.d.ts +50 -0
  113. package/dist/utils/watch/local-watch-loop.d.ts.map +1 -0
  114. package/dist/utils/watch/local-watch-loop.js +103 -0
  115. package/dist/utils/watch/local-watch-loop.js.map +1 -0
  116. package/dist/utils/watch/local-watch-loop.test.d.ts +2 -0
  117. package/dist/utils/watch/local-watch-loop.test.d.ts.map +1 -0
  118. package/dist/utils/watch/local-watch-loop.test.js +170 -0
  119. package/dist/utils/watch/local-watch-loop.test.js.map +1 -0
  120. package/dist/utils/watch/register-notify-watches.d.ts +41 -0
  121. package/dist/utils/watch/register-notify-watches.d.ts.map +1 -0
  122. package/dist/utils/watch/register-notify-watches.js +159 -0
  123. package/dist/utils/watch/register-notify-watches.js.map +1 -0
  124. package/dist/utils/watch/register-notify-watches.test.d.ts +2 -0
  125. package/dist/utils/watch/register-notify-watches.test.d.ts.map +1 -0
  126. package/dist/utils/watch/register-notify-watches.test.js +225 -0
  127. package/dist/utils/watch/register-notify-watches.test.js.map +1 -0
  128. package/dist/utils/watch/register-watches.d.ts +68 -0
  129. package/dist/utils/watch/register-watches.d.ts.map +1 -0
  130. package/dist/utils/watch/register-watches.js +221 -0
  131. package/dist/utils/watch/register-watches.js.map +1 -0
  132. package/dist/utils/watch/register-watches.test.d.ts +2 -0
  133. package/dist/utils/watch/register-watches.test.d.ts.map +1 -0
  134. package/dist/utils/watch/register-watches.test.js +576 -0
  135. package/dist/utils/watch/register-watches.test.js.map +1 -0
  136. package/dist/utils/watch/stream-watch-loop.d.ts +54 -0
  137. package/dist/utils/watch/stream-watch-loop.d.ts.map +1 -0
  138. package/dist/utils/watch/stream-watch-loop.js +282 -0
  139. package/dist/utils/watch/stream-watch-loop.js.map +1 -0
  140. package/dist/utils/watch/stream-watch-loop.test.d.ts +2 -0
  141. package/dist/utils/watch/stream-watch-loop.test.d.ts.map +1 -0
  142. package/dist/utils/watch/stream-watch-loop.test.js +392 -0
  143. package/dist/utils/watch/stream-watch-loop.test.js.map +1 -0
  144. package/dist/utils/watch/websocket-watch-stream.d.ts +25 -0
  145. package/dist/utils/watch/websocket-watch-stream.d.ts.map +1 -0
  146. package/dist/utils/watch/websocket-watch-stream.js +306 -0
  147. package/dist/utils/watch/websocket-watch-stream.js.map +1 -0
  148. package/dist/utils/watch/websocket-watch-stream.test.d.ts +2 -0
  149. package/dist/utils/watch/websocket-watch-stream.test.d.ts.map +1 -0
  150. package/dist/utils/watch/websocket-watch-stream.test.js +475 -0
  151. package/dist/utils/watch/websocket-watch-stream.test.js.map +1 -0
  152. package/package.json +7 -4
  153. package/src/args/global-args.ts +13 -0
  154. package/src/commands/batch-command/batch-deploy-command.ts +105 -1
  155. package/src/commands/batch-command/batch-test-command.ts +86 -60
  156. package/src/commands/deploy-command/deploy-init.ts +1 -1
  157. package/src/commands/deploy-command/index.ts +327 -32
  158. package/src/commands/deploy-command/select-target.ts +1 -1
  159. package/src/commands/deploy-command/version-command.ts +215 -21
  160. package/src/commands/test-command/test-command.ts +31 -22
  161. package/src/nevermore.ts +19 -0
  162. package/src/utils/batch/changed-packages-utils.ts +1 -1
  163. package/src/utils/build/base-place-resolver-factory.ts +49 -0
  164. package/src/utils/build/build.ts +13 -2
  165. package/src/utils/build/upload.ts +1 -1
  166. package/src/utils/deploy/deploy-metadata.ts +1 -1
  167. package/src/utils/job-context/base-job-context.ts +68 -6
  168. package/src/utils/job-context/batch-script-job-context.ts +18 -0
  169. package/src/utils/job-context/cloud-job-context.ts +7 -2
  170. package/src/utils/job-context/local-job-context.ts +7 -2
  171. package/src/utils/open-cloud/open-cloud-client.test.ts +133 -14
  172. package/src/utils/open-cloud/open-cloud-client.ts +131 -35
  173. package/src/utils/testing/parsers/batch-log-parser.test.ts +70 -5
  174. package/src/utils/testing/parsers/batch-log-parser.ts +141 -80
  175. package/src/utils/testing/parsers/traceback-parser.test.ts +64 -0
  176. package/src/utils/testing/parsers/traceback-parser.ts +122 -0
  177. package/src/utils/testing/runner/combined-project-generator.ts +1 -1
  178. package/src/utils/testing/runner/test-runner.test.ts +29 -0
  179. package/src/utils/testing/runner/test-runner.ts +36 -4
  180. package/src/utils/testing/test-log-parser.test.ts +70 -0
  181. package/src/utils/testing/test-log-parser.ts +80 -10
  182. package/src/utils/watch/github-context.test.ts +154 -0
  183. package/src/utils/watch/github-context.ts +184 -0
  184. package/src/utils/watch/http-watch-registry.test.ts +330 -0
  185. package/src/utils/watch/http-watch-registry.ts +341 -0
  186. package/src/utils/watch/local-watch-loop.test.ts +197 -0
  187. package/src/utils/watch/local-watch-loop.ts +190 -0
  188. package/src/utils/watch/register-notify-watches.test.ts +282 -0
  189. package/src/utils/watch/register-notify-watches.ts +226 -0
  190. package/src/utils/watch/register-watches.test.ts +696 -0
  191. package/src/utils/watch/register-watches.ts +369 -0
  192. package/src/utils/watch/stream-watch-loop.test.ts +625 -0
  193. package/src/utils/watch/stream-watch-loop.ts +411 -0
  194. package/src/utils/watch/websocket-watch-stream.test.ts +581 -0
  195. package/src/utils/watch/websocket-watch-stream.ts +403 -0
  196. package/tsconfig.json +19 -6
  197. package/tsconfig.tsbuildinfo +1 -1
  198. package/dist/utils/build/deploy-config.d.ts +0 -71
  199. package/dist/utils/build/deploy-config.d.ts.map +0 -1
  200. package/dist/utils/build/deploy-config.js +0 -164
  201. package/dist/utils/build/deploy-config.js.map +0 -1
  202. package/dist/utils/build/deploy-config.test.d.ts +0 -2
  203. package/dist/utils/build/deploy-config.test.d.ts.map +0 -1
  204. package/dist/utils/build/deploy-config.test.js +0 -126
  205. package/dist/utils/build/deploy-config.test.js.map +0 -1
  206. package/src/utils/build/deploy-config.test.ts +0 -149
  207. package/src/utils/build/deploy-config.ts +0 -259
@@ -1,71 +0,0 @@
1
- export interface BasePlaceConfig {
2
- universeId: number;
3
- placeId: number;
4
- /**
5
- * Pin the base place to a specific published version. When set, the deploy
6
- * downloads exactly this version instead of whatever is currently live, so
7
- * builds are reproducible and a broken Studio edit can't leak into a deploy.
8
- * Omit to always pull the latest version. Bump it with
9
- * `nevermore deploy version upgrade`.
10
- */
11
- version?: number;
12
- }
13
- export interface DeployTarget {
14
- /** Set on places that belong to a multi-place target (e.g. "chapter0"). */
15
- name?: string;
16
- universeId: number;
17
- placeId: number;
18
- project: string;
19
- scriptTemplate?: string;
20
- basePlace?: BasePlaceConfig;
21
- }
22
- /** Wire-format shape: a target may be a single place or a `{ places: [...] }` group. */
23
- export interface MultiPlaceTargetConfig {
24
- places: DeployTarget[];
25
- }
26
- export type DeployTargetConfig = DeployTarget | MultiPlaceTargetConfig;
27
- export interface DeployConfig {
28
- universeId?: number;
29
- targets: Record<string, DeployTargetConfig>;
30
- }
31
- /**
32
- * The subset of a resolved place that gets baked into the runtime manifest
33
- * (see the nevermore-cli-manifest package). A deployed place carries the whole
34
- * target's place table so it can resolve its siblings' IDs at runtime — e.g. a
35
- * chapter place teleporting to another chapter without hard-coding place IDs.
36
- */
37
- export interface ManifestPlaceInfo {
38
- /** Place name from a multi-place target (e.g. "chapter0"); absent for single-place targets. */
39
- name?: string;
40
- placeId: number;
41
- universeId: number;
42
- }
43
- /** Project a resolved deploy place down to the fields stamped into the manifest. */
44
- export declare function toManifestPlaceInfo(place: DeployTarget): ManifestPlaceInfo;
45
- export declare function loadDeployConfigAsync(configPath: string): Promise<DeployConfig>;
46
- /**
47
- * Expand a target into one DeployTarget per place. Single-place targets resolve
48
- * to a 1-element array; multi-place targets expand to one entry per `places[]`.
49
- */
50
- export declare function resolveDeployTargetPlaces(config: DeployConfig, targetName: string): DeployTarget[];
51
- /**
52
- * Like `resolveDeployTarget`, but throws when the target is multi-place. Use
53
- * in single-shot commands (`nevermore deploy`, `nevermore test`) where it is
54
- * not meaningful to deploy to "the first place" of a multi-chapter target —
55
- * the caller should pick one explicitly or use the batch commands.
56
- */
57
- export declare function resolveSingleDeployTarget(config: DeployConfig, targetName: string, commandHint?: string): DeployTarget;
58
- /**
59
- * Pick a target name when the user did not specify one and we cannot prompt
60
- * (non-TTY / CI). Single target wins; otherwise prefer "integration" over
61
- * "test" so `--publish` does not silently target the test place. Throws when
62
- * neither is present.
63
- */
64
- export declare function resolveDefaultTargetName(config: DeployConfig): string;
65
- export declare function resolveDeployConfigPath(packagePath: string): string;
66
- /**
67
- * Walk up from startPath looking for a deploy.nevermore.json with a universeId.
68
- * Returns the first universeId found, or undefined.
69
- */
70
- export declare function discoverUniverseIdAsync(startPath: string): Promise<number | undefined>;
71
- //# sourceMappingURL=deploy-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deploy-config.d.ts","sourceRoot":"","sources":["../../../src/utils/build/deploy-config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,wFAAwF;AACxF,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,sBAAsB,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAM1E;AAuCD,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,CAmCvB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,GACjB,YAAY,EAAE,CAchB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,WAAW,SAA2B,GACrC,YAAY,CAcd;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAmBrE;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoC7B"}
@@ -1,164 +0,0 @@
1
- import * as fs from 'fs/promises';
2
- import * as path from 'path';
3
- /** Project a resolved deploy place down to the fields stamped into the manifest. */
4
- export function toManifestPlaceInfo(place) {
5
- return {
6
- name: place.name,
7
- placeId: place.placeId,
8
- universeId: place.universeId,
9
- };
10
- }
11
- function _isMultiPlace(target) {
12
- return Array.isArray(target.places);
13
- }
14
- function _validatePlace(label, place) {
15
- if (typeof place.universeId !== 'number') {
16
- throw new Error(`${label} is missing or has invalid "universeId"`);
17
- }
18
- if (typeof place.placeId !== 'number') {
19
- throw new Error(`${label} is missing or has invalid "placeId"`);
20
- }
21
- if (typeof place.project !== 'string') {
22
- throw new Error(`${label} is missing or has invalid "project"`);
23
- }
24
- if (place.basePlace != null) {
25
- if (typeof place.basePlace.universeId !== 'number') {
26
- throw new Error(`${label} basePlace is missing or has invalid "universeId"`);
27
- }
28
- if (typeof place.basePlace.placeId !== 'number') {
29
- throw new Error(`${label} basePlace is missing or has invalid "placeId"`);
30
- }
31
- if (place.basePlace.version != null &&
32
- (!Number.isInteger(place.basePlace.version) ||
33
- place.basePlace.version < 1)) {
34
- throw new Error(`${label} basePlace "version" must be a positive integer when set`);
35
- }
36
- }
37
- }
38
- export async function loadDeployConfigAsync(configPath) {
39
- let content;
40
- try {
41
- content = await fs.readFile(configPath, 'utf-8');
42
- }
43
- catch {
44
- throw new Error(`deploy.nevermore.json not found at ${configPath}\nRun "nevermore deploy init" to create one.`);
45
- }
46
- const config = JSON.parse(content);
47
- if (!config.targets || typeof config.targets !== 'object') {
48
- throw new Error(`deploy.nevermore.json at ${configPath} is missing "targets" field`);
49
- }
50
- for (const [name, target] of Object.entries(config.targets)) {
51
- if (_isMultiPlace(target)) {
52
- if (target.places.length === 0) {
53
- throw new Error(`Target "${name}" has an empty "places" array`);
54
- }
55
- for (const [i, place] of target.places.entries()) {
56
- const placeLabel = place.name
57
- ? `Target "${name}" place "${place.name}"`
58
- : `Target "${name}" places[${i}]`;
59
- _validatePlace(placeLabel, place);
60
- }
61
- }
62
- else {
63
- _validatePlace(`Target "${name}"`, target);
64
- }
65
- }
66
- return config;
67
- }
68
- /**
69
- * Expand a target into one DeployTarget per place. Single-place targets resolve
70
- * to a 1-element array; multi-place targets expand to one entry per `places[]`.
71
- */
72
- export function resolveDeployTargetPlaces(config, targetName) {
73
- const availableTargets = Object.keys(config.targets);
74
- const target = config.targets[targetName];
75
- if (!target) {
76
- throw new Error([
77
- `Target "${targetName}" not found in deploy.nevermore.json.`,
78
- `Available targets: ${availableTargets.join(', ')}`,
79
- ].join('\n'));
80
- }
81
- return _isMultiPlace(target) ? target.places : [target];
82
- }
83
- /**
84
- * Like `resolveDeployTarget`, but throws when the target is multi-place. Use
85
- * in single-shot commands (`nevermore deploy`, `nevermore test`) where it is
86
- * not meaningful to deploy to "the first place" of a multi-chapter target —
87
- * the caller should pick one explicitly or use the batch commands.
88
- */
89
- export function resolveSingleDeployTarget(config, targetName, commandHint = 'nevermore batch deploy') {
90
- const places = resolveDeployTargetPlaces(config, targetName);
91
- if (places.length > 1) {
92
- const placeNames = places
93
- .map((p, i) => p.name ?? `places[${i}]`)
94
- .join(', ');
95
- throw new Error([
96
- `Target "${targetName}" has multiple places (${placeNames}); cannot deploy to it as a single place.`,
97
- `Use \`${commandHint} --target ${targetName}\` to fan out across every place.`,
98
- ].join('\n'));
99
- }
100
- return places[0];
101
- }
102
- /**
103
- * Pick a target name when the user did not specify one and we cannot prompt
104
- * (non-TTY / CI). Single target wins; otherwise prefer "integration" over
105
- * "test" so `--publish` does not silently target the test place. Throws when
106
- * neither is present.
107
- */
108
- export function resolveDefaultTargetName(config) {
109
- const availableTargets = Object.keys(config.targets);
110
- if (availableTargets.length === 1) {
111
- return availableTargets[0];
112
- }
113
- if (config.targets['integration']) {
114
- return 'integration';
115
- }
116
- if (config.targets['test']) {
117
- return 'test';
118
- }
119
- throw new Error([
120
- 'No --target specified and no default could be inferred.',
121
- `Available targets: ${availableTargets.join(', ')}`,
122
- ].join('\n'));
123
- }
124
- export function resolveDeployConfigPath(packagePath) {
125
- return path.resolve(packagePath, 'deploy.nevermore.json');
126
- }
127
- /**
128
- * Walk up from startPath looking for a deploy.nevermore.json with a universeId.
129
- * Returns the first universeId found, or undefined.
130
- */
131
- export async function discoverUniverseIdAsync(startPath) {
132
- let current = path.resolve(startPath);
133
- while (true) {
134
- const configPath = path.join(current, 'deploy.nevermore.json');
135
- try {
136
- const content = await fs.readFile(configPath, 'utf-8');
137
- const config = JSON.parse(content);
138
- if (typeof config.universeId === 'number') {
139
- return config.universeId;
140
- }
141
- // Check if any target (or any place within a multi-place target) has a universeId
142
- if (config.targets) {
143
- for (const target of Object.values(config.targets)) {
144
- const places = _isMultiPlace(target) ? target.places : [target];
145
- for (const place of places) {
146
- if (typeof place.universeId === 'number') {
147
- return place.universeId;
148
- }
149
- }
150
- }
151
- }
152
- }
153
- catch {
154
- // No deploy.nevermore.json here, keep walking up
155
- }
156
- const parent = path.dirname(current);
157
- if (parent === current) {
158
- break;
159
- }
160
- current = parent;
161
- }
162
- return undefined;
163
- }
164
- //# sourceMappingURL=deploy-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deploy-config.js","sourceRoot":"","sources":["../../../src/utils/build/deploy-config.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=deploy-config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deploy-config.test.d.ts","sourceRoot":"","sources":["../../../src/utils/build/deploy-config.test.ts"],"names":[],"mappings":""}
@@ -1,126 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import * as fs from 'fs/promises';
3
- import * as os from 'os';
4
- import * as path from 'path';
5
- import { loadDeployConfigAsync, resolveDefaultTargetName, } from './deploy-config.js';
6
- async function writeTempConfigAsync(config) {
7
- const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'deploy-config-test-'));
8
- const configPath = path.join(dir, 'deploy.nevermore.json');
9
- await fs.writeFile(configPath, JSON.stringify(config));
10
- return configPath;
11
- }
12
- function makeTarget(placeId) {
13
- return {
14
- universeId: 1,
15
- placeId,
16
- project: 'default.project.json',
17
- };
18
- }
19
- function makeConfig(targets) {
20
- return { targets };
21
- }
22
- describe('resolveDefaultTargetName', () => {
23
- it('returns the only target when there is just one', () => {
24
- const config = makeConfig({ prod: makeTarget(1) });
25
- expect(resolveDefaultTargetName(config)).toBe('prod');
26
- });
27
- it('prefers integration over test when both exist', () => {
28
- const config = makeConfig({
29
- test: makeTarget(1),
30
- integration: makeTarget(2),
31
- });
32
- expect(resolveDefaultTargetName(config)).toBe('integration');
33
- });
34
- it('falls back to test when integration is absent', () => {
35
- const config = makeConfig({ test: makeTarget(1), dev: makeTarget(2) });
36
- expect(resolveDefaultTargetName(config)).toBe('test');
37
- });
38
- it('returns integration when present alongside non-test targets', () => {
39
- const config = makeConfig({
40
- integration: makeTarget(1),
41
- dev: makeTarget(2),
42
- });
43
- expect(resolveDefaultTargetName(config)).toBe('integration');
44
- });
45
- it('throws when no preferred target exists and multiple options are present', () => {
46
- const config = makeConfig({ foo: makeTarget(1), bar: makeTarget(2) });
47
- expect(() => resolveDefaultTargetName(config)).toThrowError(/foo, bar/);
48
- });
49
- });
50
- describe('loadDeployConfigAsync basePlace.version', () => {
51
- it('accepts an omitted version pin', async () => {
52
- const configPath = await writeTempConfigAsync({
53
- targets: {
54
- test: {
55
- universeId: 1,
56
- placeId: 2,
57
- project: 'default.project.json',
58
- basePlace: { universeId: 1, placeId: 3 },
59
- },
60
- },
61
- });
62
- const config = await loadDeployConfigAsync(configPath);
63
- const target = config.targets['test'];
64
- expect(target.basePlace?.version).toBeUndefined();
65
- });
66
- it('accepts a positive integer version pin', async () => {
67
- const configPath = await writeTempConfigAsync({
68
- targets: {
69
- test: {
70
- universeId: 1,
71
- placeId: 2,
72
- project: 'default.project.json',
73
- basePlace: { universeId: 1, placeId: 3, version: 42 },
74
- },
75
- },
76
- });
77
- const config = await loadDeployConfigAsync(configPath);
78
- const target = config.targets['test'];
79
- expect(target.basePlace?.version).toBe(42);
80
- });
81
- it('rejects a non-integer version pin', async () => {
82
- const configPath = await writeTempConfigAsync({
83
- targets: {
84
- test: {
85
- universeId: 1,
86
- placeId: 2,
87
- project: 'default.project.json',
88
- basePlace: { universeId: 1, placeId: 3, version: 1.5 },
89
- },
90
- },
91
- });
92
- await expect(loadDeployConfigAsync(configPath)).rejects.toThrowError(/version.*positive integer/);
93
- });
94
- it('rejects a zero or negative version pin', async () => {
95
- const configPath = await writeTempConfigAsync({
96
- targets: {
97
- test: {
98
- universeId: 1,
99
- placeId: 2,
100
- project: 'default.project.json',
101
- basePlace: { universeId: 1, placeId: 3, version: 0 },
102
- },
103
- },
104
- });
105
- await expect(loadDeployConfigAsync(configPath)).rejects.toThrowError(/version.*positive integer/);
106
- });
107
- it('validates version pins on multi-place targets too', async () => {
108
- const configPath = await writeTempConfigAsync({
109
- targets: {
110
- prod: {
111
- places: [
112
- {
113
- name: 'chapter0',
114
- universeId: 1,
115
- placeId: 2,
116
- project: 'default.project.json',
117
- basePlace: { universeId: 1, placeId: 3, version: -1 },
118
- },
119
- ],
120
- },
121
- },
122
- });
123
- await expect(loadDeployConfigAsync(configPath)).rejects.toThrowError(/chapter0.*version.*positive integer/);
124
- });
125
- });
126
- //# sourceMappingURL=deploy-config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deploy-config.test.js","sourceRoot":"","sources":["../../../src/utils/build/deploy-config.test.ts"],"names":[],"mappings":"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"}
@@ -1,149 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import * as fs from 'fs/promises';
3
- import * as os from 'os';
4
- import * as path from 'path';
5
- import {
6
- type DeployConfig,
7
- type DeployTarget,
8
- loadDeployConfigAsync,
9
- resolveDefaultTargetName,
10
- } from './deploy-config.js';
11
-
12
- async function writeTempConfigAsync(config: unknown): Promise<string> {
13
- const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'deploy-config-test-'));
14
- const configPath = path.join(dir, 'deploy.nevermore.json');
15
- await fs.writeFile(configPath, JSON.stringify(config));
16
- return configPath;
17
- }
18
-
19
- function makeTarget(placeId: number): DeployTarget {
20
- return {
21
- universeId: 1,
22
- placeId,
23
- project: 'default.project.json',
24
- };
25
- }
26
-
27
- function makeConfig(targets: Record<string, DeployTarget>): DeployConfig {
28
- return { targets };
29
- }
30
-
31
- describe('resolveDefaultTargetName', () => {
32
- it('returns the only target when there is just one', () => {
33
- const config = makeConfig({ prod: makeTarget(1) });
34
- expect(resolveDefaultTargetName(config)).toBe('prod');
35
- });
36
-
37
- it('prefers integration over test when both exist', () => {
38
- const config = makeConfig({
39
- test: makeTarget(1),
40
- integration: makeTarget(2),
41
- });
42
- expect(resolveDefaultTargetName(config)).toBe('integration');
43
- });
44
-
45
- it('falls back to test when integration is absent', () => {
46
- const config = makeConfig({ test: makeTarget(1), dev: makeTarget(2) });
47
- expect(resolveDefaultTargetName(config)).toBe('test');
48
- });
49
-
50
- it('returns integration when present alongside non-test targets', () => {
51
- const config = makeConfig({
52
- integration: makeTarget(1),
53
- dev: makeTarget(2),
54
- });
55
- expect(resolveDefaultTargetName(config)).toBe('integration');
56
- });
57
-
58
- it('throws when no preferred target exists and multiple options are present', () => {
59
- const config = makeConfig({ foo: makeTarget(1), bar: makeTarget(2) });
60
- expect(() => resolveDefaultTargetName(config)).toThrowError(/foo, bar/);
61
- });
62
- });
63
-
64
- describe('loadDeployConfigAsync basePlace.version', () => {
65
- it('accepts an omitted version pin', async () => {
66
- const configPath = await writeTempConfigAsync({
67
- targets: {
68
- test: {
69
- universeId: 1,
70
- placeId: 2,
71
- project: 'default.project.json',
72
- basePlace: { universeId: 1, placeId: 3 },
73
- },
74
- },
75
- });
76
- const config = await loadDeployConfigAsync(configPath);
77
- const target = config.targets['test'] as DeployTarget;
78
- expect(target.basePlace?.version).toBeUndefined();
79
- });
80
-
81
- it('accepts a positive integer version pin', async () => {
82
- const configPath = await writeTempConfigAsync({
83
- targets: {
84
- test: {
85
- universeId: 1,
86
- placeId: 2,
87
- project: 'default.project.json',
88
- basePlace: { universeId: 1, placeId: 3, version: 42 },
89
- },
90
- },
91
- });
92
- const config = await loadDeployConfigAsync(configPath);
93
- const target = config.targets['test'] as DeployTarget;
94
- expect(target.basePlace?.version).toBe(42);
95
- });
96
-
97
- it('rejects a non-integer version pin', async () => {
98
- const configPath = await writeTempConfigAsync({
99
- targets: {
100
- test: {
101
- universeId: 1,
102
- placeId: 2,
103
- project: 'default.project.json',
104
- basePlace: { universeId: 1, placeId: 3, version: 1.5 },
105
- },
106
- },
107
- });
108
- await expect(loadDeployConfigAsync(configPath)).rejects.toThrowError(
109
- /version.*positive integer/
110
- );
111
- });
112
-
113
- it('rejects a zero or negative version pin', async () => {
114
- const configPath = await writeTempConfigAsync({
115
- targets: {
116
- test: {
117
- universeId: 1,
118
- placeId: 2,
119
- project: 'default.project.json',
120
- basePlace: { universeId: 1, placeId: 3, version: 0 },
121
- },
122
- },
123
- });
124
- await expect(loadDeployConfigAsync(configPath)).rejects.toThrowError(
125
- /version.*positive integer/
126
- );
127
- });
128
-
129
- it('validates version pins on multi-place targets too', async () => {
130
- const configPath = await writeTempConfigAsync({
131
- targets: {
132
- prod: {
133
- places: [
134
- {
135
- name: 'chapter0',
136
- universeId: 1,
137
- placeId: 2,
138
- project: 'default.project.json',
139
- basePlace: { universeId: 1, placeId: 3, version: -1 },
140
- },
141
- ],
142
- },
143
- },
144
- });
145
- await expect(loadDeployConfigAsync(configPath)).rejects.toThrowError(
146
- /chapter0.*version.*positive integer/
147
- );
148
- });
149
- });