@quenty/nevermore-cli 4.42.0 → 4.42.1-canary.783.30683606415.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 (172) hide show
  1. package/CHANGELOG.md +22 -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 +7 -2
  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 +301 -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 +17 -7
  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 +74 -20
  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/runner/combined-project-generator.d.ts +1 -1
  65. package/dist/utils/testing/runner/combined-project-generator.d.ts.map +1 -1
  66. package/dist/utils/testing/runner/test-runner.d.ts +1 -1
  67. package/dist/utils/testing/runner/test-runner.d.ts.map +1 -1
  68. package/dist/utils/watch/github-context.d.ts +50 -0
  69. package/dist/utils/watch/github-context.d.ts.map +1 -0
  70. package/dist/utils/watch/github-context.js +125 -0
  71. package/dist/utils/watch/github-context.js.map +1 -0
  72. package/dist/utils/watch/github-context.test.d.ts +2 -0
  73. package/dist/utils/watch/github-context.test.d.ts.map +1 -0
  74. package/dist/utils/watch/github-context.test.js +112 -0
  75. package/dist/utils/watch/github-context.test.js.map +1 -0
  76. package/dist/utils/watch/http-watch-registry.d.ts +40 -0
  77. package/dist/utils/watch/http-watch-registry.d.ts.map +1 -0
  78. package/dist/utils/watch/http-watch-registry.js +262 -0
  79. package/dist/utils/watch/http-watch-registry.js.map +1 -0
  80. package/dist/utils/watch/http-watch-registry.test.d.ts +2 -0
  81. package/dist/utils/watch/http-watch-registry.test.d.ts.map +1 -0
  82. package/dist/utils/watch/http-watch-registry.test.js +211 -0
  83. package/dist/utils/watch/http-watch-registry.test.js.map +1 -0
  84. package/dist/utils/watch/local-watch-loop.d.ts +50 -0
  85. package/dist/utils/watch/local-watch-loop.d.ts.map +1 -0
  86. package/dist/utils/watch/local-watch-loop.js +103 -0
  87. package/dist/utils/watch/local-watch-loop.js.map +1 -0
  88. package/dist/utils/watch/local-watch-loop.test.d.ts +2 -0
  89. package/dist/utils/watch/local-watch-loop.test.d.ts.map +1 -0
  90. package/dist/utils/watch/local-watch-loop.test.js +170 -0
  91. package/dist/utils/watch/local-watch-loop.test.js.map +1 -0
  92. package/dist/utils/watch/register-notify-watches.d.ts +41 -0
  93. package/dist/utils/watch/register-notify-watches.d.ts.map +1 -0
  94. package/dist/utils/watch/register-notify-watches.js +159 -0
  95. package/dist/utils/watch/register-notify-watches.js.map +1 -0
  96. package/dist/utils/watch/register-notify-watches.test.d.ts +2 -0
  97. package/dist/utils/watch/register-notify-watches.test.d.ts.map +1 -0
  98. package/dist/utils/watch/register-notify-watches.test.js +225 -0
  99. package/dist/utils/watch/register-notify-watches.test.js.map +1 -0
  100. package/dist/utils/watch/register-watches.d.ts +68 -0
  101. package/dist/utils/watch/register-watches.d.ts.map +1 -0
  102. package/dist/utils/watch/register-watches.js +221 -0
  103. package/dist/utils/watch/register-watches.js.map +1 -0
  104. package/dist/utils/watch/register-watches.test.d.ts +2 -0
  105. package/dist/utils/watch/register-watches.test.d.ts.map +1 -0
  106. package/dist/utils/watch/register-watches.test.js +576 -0
  107. package/dist/utils/watch/register-watches.test.js.map +1 -0
  108. package/dist/utils/watch/stream-watch-loop.d.ts +54 -0
  109. package/dist/utils/watch/stream-watch-loop.d.ts.map +1 -0
  110. package/dist/utils/watch/stream-watch-loop.js +282 -0
  111. package/dist/utils/watch/stream-watch-loop.js.map +1 -0
  112. package/dist/utils/watch/stream-watch-loop.test.d.ts +2 -0
  113. package/dist/utils/watch/stream-watch-loop.test.d.ts.map +1 -0
  114. package/dist/utils/watch/stream-watch-loop.test.js +392 -0
  115. package/dist/utils/watch/stream-watch-loop.test.js.map +1 -0
  116. package/dist/utils/watch/websocket-watch-stream.d.ts +25 -0
  117. package/dist/utils/watch/websocket-watch-stream.d.ts.map +1 -0
  118. package/dist/utils/watch/websocket-watch-stream.js +306 -0
  119. package/dist/utils/watch/websocket-watch-stream.js.map +1 -0
  120. package/dist/utils/watch/websocket-watch-stream.test.d.ts +2 -0
  121. package/dist/utils/watch/websocket-watch-stream.test.d.ts.map +1 -0
  122. package/dist/utils/watch/websocket-watch-stream.test.js +475 -0
  123. package/dist/utils/watch/websocket-watch-stream.test.js.map +1 -0
  124. package/package.json +7 -4
  125. package/src/args/global-args.ts +13 -0
  126. package/src/commands/batch-command/batch-deploy-command.ts +105 -1
  127. package/src/commands/batch-command/batch-test-command.ts +8 -2
  128. package/src/commands/deploy-command/deploy-init.ts +1 -1
  129. package/src/commands/deploy-command/index.ts +331 -32
  130. package/src/commands/deploy-command/select-target.ts +1 -1
  131. package/src/commands/deploy-command/version-command.ts +215 -21
  132. package/src/commands/test-command/test-command.ts +24 -18
  133. package/src/nevermore.ts +19 -0
  134. package/src/utils/batch/changed-packages-utils.ts +1 -1
  135. package/src/utils/build/base-place-resolver-factory.ts +49 -0
  136. package/src/utils/build/build.ts +13 -2
  137. package/src/utils/build/upload.ts +1 -1
  138. package/src/utils/deploy/deploy-metadata.ts +1 -1
  139. package/src/utils/job-context/base-job-context.ts +68 -6
  140. package/src/utils/job-context/batch-script-job-context.ts +18 -0
  141. package/src/utils/job-context/cloud-job-context.ts +7 -2
  142. package/src/utils/job-context/local-job-context.ts +7 -2
  143. package/src/utils/open-cloud/open-cloud-client.test.ts +133 -14
  144. package/src/utils/open-cloud/open-cloud-client.ts +127 -34
  145. package/src/utils/testing/runner/combined-project-generator.ts +1 -1
  146. package/src/utils/testing/runner/test-runner.ts +1 -1
  147. package/src/utils/watch/github-context.test.ts +154 -0
  148. package/src/utils/watch/github-context.ts +184 -0
  149. package/src/utils/watch/http-watch-registry.test.ts +330 -0
  150. package/src/utils/watch/http-watch-registry.ts +341 -0
  151. package/src/utils/watch/local-watch-loop.test.ts +197 -0
  152. package/src/utils/watch/local-watch-loop.ts +190 -0
  153. package/src/utils/watch/register-notify-watches.test.ts +282 -0
  154. package/src/utils/watch/register-notify-watches.ts +226 -0
  155. package/src/utils/watch/register-watches.test.ts +696 -0
  156. package/src/utils/watch/register-watches.ts +369 -0
  157. package/src/utils/watch/stream-watch-loop.test.ts +625 -0
  158. package/src/utils/watch/stream-watch-loop.ts +411 -0
  159. package/src/utils/watch/websocket-watch-stream.test.ts +581 -0
  160. package/src/utils/watch/websocket-watch-stream.ts +403 -0
  161. package/tsconfig.json +19 -6
  162. package/tsconfig.tsbuildinfo +1 -1
  163. package/dist/utils/build/deploy-config.d.ts +0 -71
  164. package/dist/utils/build/deploy-config.d.ts.map +0 -1
  165. package/dist/utils/build/deploy-config.js +0 -164
  166. package/dist/utils/build/deploy-config.js.map +0 -1
  167. package/dist/utils/build/deploy-config.test.d.ts +0 -2
  168. package/dist/utils/build/deploy-config.test.d.ts.map +0 -1
  169. package/dist/utils/build/deploy-config.test.js +0 -126
  170. package/dist/utils/build/deploy-config.test.js.map +0 -1
  171. package/src/utils/build/deploy-config.test.ts +0 -149
  172. package/src/utils/build/deploy-config.ts +0 -259
@@ -1,259 +0,0 @@
1
- import * as fs from 'fs/promises';
2
- import * as path from 'path';
3
-
4
- export interface BasePlaceConfig {
5
- universeId: number;
6
- placeId: number;
7
- /**
8
- * Pin the base place to a specific published version. When set, the deploy
9
- * downloads exactly this version instead of whatever is currently live, so
10
- * builds are reproducible and a broken Studio edit can't leak into a deploy.
11
- * Omit to always pull the latest version. Bump it with
12
- * `nevermore deploy version upgrade`.
13
- */
14
- version?: number;
15
- }
16
-
17
- export interface DeployTarget {
18
- /** Set on places that belong to a multi-place target (e.g. "chapter0"). */
19
- name?: string;
20
- universeId: number;
21
- placeId: number;
22
- project: string;
23
- scriptTemplate?: string;
24
- basePlace?: BasePlaceConfig;
25
- }
26
-
27
- /** Wire-format shape: a target may be a single place or a `{ places: [...] }` group. */
28
- export interface MultiPlaceTargetConfig {
29
- places: DeployTarget[];
30
- }
31
-
32
- export type DeployTargetConfig = DeployTarget | MultiPlaceTargetConfig;
33
-
34
- export interface DeployConfig {
35
- universeId?: number;
36
- targets: Record<string, DeployTargetConfig>;
37
- }
38
-
39
- /**
40
- * The subset of a resolved place that gets baked into the runtime manifest
41
- * (see the nevermore-cli-manifest package). A deployed place carries the whole
42
- * target's place table so it can resolve its siblings' IDs at runtime — e.g. a
43
- * chapter place teleporting to another chapter without hard-coding place IDs.
44
- */
45
- export interface ManifestPlaceInfo {
46
- /** Place name from a multi-place target (e.g. "chapter0"); absent for single-place targets. */
47
- name?: string;
48
- placeId: number;
49
- universeId: number;
50
- }
51
-
52
- /** Project a resolved deploy place down to the fields stamped into the manifest. */
53
- export function toManifestPlaceInfo(place: DeployTarget): ManifestPlaceInfo {
54
- return {
55
- name: place.name,
56
- placeId: place.placeId,
57
- universeId: place.universeId,
58
- };
59
- }
60
-
61
- function _isMultiPlace(
62
- target: DeployTargetConfig
63
- ): target is MultiPlaceTargetConfig {
64
- return Array.isArray((target as MultiPlaceTargetConfig).places);
65
- }
66
-
67
- function _validatePlace(label: string, place: DeployTarget): void {
68
- if (typeof place.universeId !== 'number') {
69
- throw new Error(`${label} is missing or has invalid "universeId"`);
70
- }
71
- if (typeof place.placeId !== 'number') {
72
- throw new Error(`${label} is missing or has invalid "placeId"`);
73
- }
74
- if (typeof place.project !== 'string') {
75
- throw new Error(`${label} is missing or has invalid "project"`);
76
- }
77
- if (place.basePlace != null) {
78
- if (typeof place.basePlace.universeId !== 'number') {
79
- throw new Error(
80
- `${label} basePlace is missing or has invalid "universeId"`
81
- );
82
- }
83
- if (typeof place.basePlace.placeId !== 'number') {
84
- throw new Error(`${label} basePlace is missing or has invalid "placeId"`);
85
- }
86
- if (
87
- place.basePlace.version != null &&
88
- (!Number.isInteger(place.basePlace.version) ||
89
- place.basePlace.version < 1)
90
- ) {
91
- throw new Error(
92
- `${label} basePlace "version" must be a positive integer when set`
93
- );
94
- }
95
- }
96
- }
97
-
98
- export async function loadDeployConfigAsync(
99
- configPath: string
100
- ): Promise<DeployConfig> {
101
- let content: string;
102
- try {
103
- content = await fs.readFile(configPath, 'utf-8');
104
- } catch {
105
- throw new Error(
106
- `deploy.nevermore.json not found at ${configPath}\nRun "nevermore deploy init" to create one.`
107
- );
108
- }
109
-
110
- const config = JSON.parse(content) as DeployConfig;
111
-
112
- if (!config.targets || typeof config.targets !== 'object') {
113
- throw new Error(
114
- `deploy.nevermore.json at ${configPath} is missing "targets" field`
115
- );
116
- }
117
-
118
- for (const [name, target] of Object.entries(config.targets)) {
119
- if (_isMultiPlace(target)) {
120
- if (target.places.length === 0) {
121
- throw new Error(`Target "${name}" has an empty "places" array`);
122
- }
123
- for (const [i, place] of target.places.entries()) {
124
- const placeLabel = place.name
125
- ? `Target "${name}" place "${place.name}"`
126
- : `Target "${name}" places[${i}]`;
127
- _validatePlace(placeLabel, place);
128
- }
129
- } else {
130
- _validatePlace(`Target "${name}"`, target);
131
- }
132
- }
133
-
134
- return config;
135
- }
136
-
137
- /**
138
- * Expand a target into one DeployTarget per place. Single-place targets resolve
139
- * to a 1-element array; multi-place targets expand to one entry per `places[]`.
140
- */
141
- export function resolveDeployTargetPlaces(
142
- config: DeployConfig,
143
- targetName: string
144
- ): DeployTarget[] {
145
- const availableTargets = Object.keys(config.targets);
146
- const target = config.targets[targetName];
147
-
148
- if (!target) {
149
- throw new Error(
150
- [
151
- `Target "${targetName}" not found in deploy.nevermore.json.`,
152
- `Available targets: ${availableTargets.join(', ')}`,
153
- ].join('\n')
154
- );
155
- }
156
-
157
- return _isMultiPlace(target) ? target.places : [target];
158
- }
159
-
160
- /**
161
- * Like `resolveDeployTarget`, but throws when the target is multi-place. Use
162
- * in single-shot commands (`nevermore deploy`, `nevermore test`) where it is
163
- * not meaningful to deploy to "the first place" of a multi-chapter target —
164
- * the caller should pick one explicitly or use the batch commands.
165
- */
166
- export function resolveSingleDeployTarget(
167
- config: DeployConfig,
168
- targetName: string,
169
- commandHint = 'nevermore batch deploy'
170
- ): DeployTarget {
171
- const places = resolveDeployTargetPlaces(config, targetName);
172
- if (places.length > 1) {
173
- const placeNames = places
174
- .map((p, i) => p.name ?? `places[${i}]`)
175
- .join(', ');
176
- throw new Error(
177
- [
178
- `Target "${targetName}" has multiple places (${placeNames}); cannot deploy to it as a single place.`,
179
- `Use \`${commandHint} --target ${targetName}\` to fan out across every place.`,
180
- ].join('\n')
181
- );
182
- }
183
- return places[0]!;
184
- }
185
-
186
- /**
187
- * Pick a target name when the user did not specify one and we cannot prompt
188
- * (non-TTY / CI). Single target wins; otherwise prefer "integration" over
189
- * "test" so `--publish` does not silently target the test place. Throws when
190
- * neither is present.
191
- */
192
- export function resolveDefaultTargetName(config: DeployConfig): string {
193
- const availableTargets = Object.keys(config.targets);
194
-
195
- if (availableTargets.length === 1) {
196
- return availableTargets[0]!;
197
- }
198
- if (config.targets['integration']) {
199
- return 'integration';
200
- }
201
- if (config.targets['test']) {
202
- return 'test';
203
- }
204
-
205
- throw new Error(
206
- [
207
- 'No --target specified and no default could be inferred.',
208
- `Available targets: ${availableTargets.join(', ')}`,
209
- ].join('\n')
210
- );
211
- }
212
-
213
- export function resolveDeployConfigPath(packagePath: string): string {
214
- return path.resolve(packagePath, 'deploy.nevermore.json');
215
- }
216
-
217
- /**
218
- * Walk up from startPath looking for a deploy.nevermore.json with a universeId.
219
- * Returns the first universeId found, or undefined.
220
- */
221
- export async function discoverUniverseIdAsync(
222
- startPath: string
223
- ): Promise<number | undefined> {
224
- let current = path.resolve(startPath);
225
-
226
- while (true) {
227
- const configPath = path.join(current, 'deploy.nevermore.json');
228
- try {
229
- const content = await fs.readFile(configPath, 'utf-8');
230
- const config = JSON.parse(content) as Partial<DeployConfig>;
231
-
232
- if (typeof config.universeId === 'number') {
233
- return config.universeId;
234
- }
235
-
236
- // Check if any target (or any place within a multi-place target) has a universeId
237
- if (config.targets) {
238
- for (const target of Object.values(config.targets)) {
239
- const places = _isMultiPlace(target) ? target.places : [target];
240
- for (const place of places) {
241
- if (typeof place.universeId === 'number') {
242
- return place.universeId;
243
- }
244
- }
245
- }
246
- }
247
- } catch {
248
- // No deploy.nevermore.json here, keep walking up
249
- }
250
-
251
- const parent = path.dirname(current);
252
- if (parent === current) {
253
- break;
254
- }
255
- current = parent;
256
- }
257
-
258
- return undefined;
259
- }