@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.
- package/CHANGELOG.md +22 -0
- package/dist/args/global-args.d.ts +13 -0
- package/dist/args/global-args.d.ts.map +1 -1
- package/dist/commands/batch-command/batch-deploy-command.d.ts +3 -0
- package/dist/commands/batch-command/batch-deploy-command.d.ts.map +1 -1
- package/dist/commands/batch-command/batch-deploy-command.js +90 -1
- package/dist/commands/batch-command/batch-deploy-command.js.map +1 -1
- package/dist/commands/batch-command/batch-test-command.d.ts.map +1 -1
- package/dist/commands/batch-command/batch-test-command.js +7 -2
- package/dist/commands/batch-command/batch-test-command.js.map +1 -1
- package/dist/commands/deploy-command/deploy-init.js +1 -1
- package/dist/commands/deploy-command/deploy-init.js.map +1 -1
- package/dist/commands/deploy-command/index.d.ts +3 -0
- package/dist/commands/deploy-command/index.d.ts.map +1 -1
- package/dist/commands/deploy-command/index.js +301 -60
- package/dist/commands/deploy-command/index.js.map +1 -1
- package/dist/commands/deploy-command/select-target.js +1 -1
- package/dist/commands/deploy-command/select-target.js.map +1 -1
- package/dist/commands/deploy-command/version-command.d.ts.map +1 -1
- package/dist/commands/deploy-command/version-command.js +138 -12
- package/dist/commands/deploy-command/version-command.js.map +1 -1
- package/dist/commands/test-command/test-command.d.ts.map +1 -1
- package/dist/commands/test-command/test-command.js +17 -7
- package/dist/commands/test-command/test-command.js.map +1 -1
- package/dist/nevermore.js +17 -0
- package/dist/nevermore.js.map +1 -1
- package/dist/utils/batch/changed-packages-utils.d.ts +1 -1
- package/dist/utils/batch/changed-packages-utils.d.ts.map +1 -1
- package/dist/utils/batch/changed-packages-utils.js +1 -1
- package/dist/utils/batch/changed-packages-utils.js.map +1 -1
- package/dist/utils/build/base-place-resolver-factory.d.ts +25 -0
- package/dist/utils/build/base-place-resolver-factory.d.ts.map +1 -0
- package/dist/utils/build/base-place-resolver-factory.js +40 -0
- package/dist/utils/build/base-place-resolver-factory.js.map +1 -0
- package/dist/utils/build/build.d.ts +13 -2
- package/dist/utils/build/build.d.ts.map +1 -1
- package/dist/utils/build/build.js.map +1 -1
- package/dist/utils/build/upload.d.ts +1 -1
- package/dist/utils/build/upload.d.ts.map +1 -1
- package/dist/utils/deploy/deploy-metadata.d.ts +1 -1
- package/dist/utils/deploy/deploy-metadata.d.ts.map +1 -1
- package/dist/utils/job-context/base-job-context.d.ts +3 -1
- package/dist/utils/job-context/base-job-context.d.ts.map +1 -1
- package/dist/utils/job-context/base-job-context.js +45 -6
- package/dist/utils/job-context/base-job-context.js.map +1 -1
- package/dist/utils/job-context/batch-script-job-context.d.ts +6 -0
- package/dist/utils/job-context/batch-script-job-context.d.ts.map +1 -1
- package/dist/utils/job-context/batch-script-job-context.js +13 -0
- package/dist/utils/job-context/batch-script-job-context.js.map +1 -1
- package/dist/utils/job-context/cloud-job-context.d.ts +2 -1
- package/dist/utils/job-context/cloud-job-context.d.ts.map +1 -1
- package/dist/utils/job-context/cloud-job-context.js +2 -2
- package/dist/utils/job-context/cloud-job-context.js.map +1 -1
- package/dist/utils/job-context/local-job-context.d.ts +2 -1
- package/dist/utils/job-context/local-job-context.d.ts.map +1 -1
- package/dist/utils/job-context/local-job-context.js +2 -2
- package/dist/utils/job-context/local-job-context.js.map +1 -1
- package/dist/utils/open-cloud/open-cloud-client.d.ts +20 -2
- package/dist/utils/open-cloud/open-cloud-client.d.ts.map +1 -1
- package/dist/utils/open-cloud/open-cloud-client.js +74 -20
- package/dist/utils/open-cloud/open-cloud-client.js.map +1 -1
- package/dist/utils/open-cloud/open-cloud-client.test.js +89 -12
- package/dist/utils/open-cloud/open-cloud-client.test.js.map +1 -1
- package/dist/utils/testing/runner/combined-project-generator.d.ts +1 -1
- package/dist/utils/testing/runner/combined-project-generator.d.ts.map +1 -1
- package/dist/utils/testing/runner/test-runner.d.ts +1 -1
- package/dist/utils/testing/runner/test-runner.d.ts.map +1 -1
- package/dist/utils/watch/github-context.d.ts +50 -0
- package/dist/utils/watch/github-context.d.ts.map +1 -0
- package/dist/utils/watch/github-context.js +125 -0
- package/dist/utils/watch/github-context.js.map +1 -0
- package/dist/utils/watch/github-context.test.d.ts +2 -0
- package/dist/utils/watch/github-context.test.d.ts.map +1 -0
- package/dist/utils/watch/github-context.test.js +112 -0
- package/dist/utils/watch/github-context.test.js.map +1 -0
- package/dist/utils/watch/http-watch-registry.d.ts +40 -0
- package/dist/utils/watch/http-watch-registry.d.ts.map +1 -0
- package/dist/utils/watch/http-watch-registry.js +262 -0
- package/dist/utils/watch/http-watch-registry.js.map +1 -0
- package/dist/utils/watch/http-watch-registry.test.d.ts +2 -0
- package/dist/utils/watch/http-watch-registry.test.d.ts.map +1 -0
- package/dist/utils/watch/http-watch-registry.test.js +211 -0
- package/dist/utils/watch/http-watch-registry.test.js.map +1 -0
- package/dist/utils/watch/local-watch-loop.d.ts +50 -0
- package/dist/utils/watch/local-watch-loop.d.ts.map +1 -0
- package/dist/utils/watch/local-watch-loop.js +103 -0
- package/dist/utils/watch/local-watch-loop.js.map +1 -0
- package/dist/utils/watch/local-watch-loop.test.d.ts +2 -0
- package/dist/utils/watch/local-watch-loop.test.d.ts.map +1 -0
- package/dist/utils/watch/local-watch-loop.test.js +170 -0
- package/dist/utils/watch/local-watch-loop.test.js.map +1 -0
- package/dist/utils/watch/register-notify-watches.d.ts +41 -0
- package/dist/utils/watch/register-notify-watches.d.ts.map +1 -0
- package/dist/utils/watch/register-notify-watches.js +159 -0
- package/dist/utils/watch/register-notify-watches.js.map +1 -0
- package/dist/utils/watch/register-notify-watches.test.d.ts +2 -0
- package/dist/utils/watch/register-notify-watches.test.d.ts.map +1 -0
- package/dist/utils/watch/register-notify-watches.test.js +225 -0
- package/dist/utils/watch/register-notify-watches.test.js.map +1 -0
- package/dist/utils/watch/register-watches.d.ts +68 -0
- package/dist/utils/watch/register-watches.d.ts.map +1 -0
- package/dist/utils/watch/register-watches.js +221 -0
- package/dist/utils/watch/register-watches.js.map +1 -0
- package/dist/utils/watch/register-watches.test.d.ts +2 -0
- package/dist/utils/watch/register-watches.test.d.ts.map +1 -0
- package/dist/utils/watch/register-watches.test.js +576 -0
- package/dist/utils/watch/register-watches.test.js.map +1 -0
- package/dist/utils/watch/stream-watch-loop.d.ts +54 -0
- package/dist/utils/watch/stream-watch-loop.d.ts.map +1 -0
- package/dist/utils/watch/stream-watch-loop.js +282 -0
- package/dist/utils/watch/stream-watch-loop.js.map +1 -0
- package/dist/utils/watch/stream-watch-loop.test.d.ts +2 -0
- package/dist/utils/watch/stream-watch-loop.test.d.ts.map +1 -0
- package/dist/utils/watch/stream-watch-loop.test.js +392 -0
- package/dist/utils/watch/stream-watch-loop.test.js.map +1 -0
- package/dist/utils/watch/websocket-watch-stream.d.ts +25 -0
- package/dist/utils/watch/websocket-watch-stream.d.ts.map +1 -0
- package/dist/utils/watch/websocket-watch-stream.js +306 -0
- package/dist/utils/watch/websocket-watch-stream.js.map +1 -0
- package/dist/utils/watch/websocket-watch-stream.test.d.ts +2 -0
- package/dist/utils/watch/websocket-watch-stream.test.d.ts.map +1 -0
- package/dist/utils/watch/websocket-watch-stream.test.js +475 -0
- package/dist/utils/watch/websocket-watch-stream.test.js.map +1 -0
- package/package.json +7 -4
- package/src/args/global-args.ts +13 -0
- package/src/commands/batch-command/batch-deploy-command.ts +105 -1
- package/src/commands/batch-command/batch-test-command.ts +8 -2
- package/src/commands/deploy-command/deploy-init.ts +1 -1
- package/src/commands/deploy-command/index.ts +331 -32
- package/src/commands/deploy-command/select-target.ts +1 -1
- package/src/commands/deploy-command/version-command.ts +215 -21
- package/src/commands/test-command/test-command.ts +24 -18
- package/src/nevermore.ts +19 -0
- package/src/utils/batch/changed-packages-utils.ts +1 -1
- package/src/utils/build/base-place-resolver-factory.ts +49 -0
- package/src/utils/build/build.ts +13 -2
- package/src/utils/build/upload.ts +1 -1
- package/src/utils/deploy/deploy-metadata.ts +1 -1
- package/src/utils/job-context/base-job-context.ts +68 -6
- package/src/utils/job-context/batch-script-job-context.ts +18 -0
- package/src/utils/job-context/cloud-job-context.ts +7 -2
- package/src/utils/job-context/local-job-context.ts +7 -2
- package/src/utils/open-cloud/open-cloud-client.test.ts +133 -14
- package/src/utils/open-cloud/open-cloud-client.ts +127 -34
- package/src/utils/testing/runner/combined-project-generator.ts +1 -1
- package/src/utils/testing/runner/test-runner.ts +1 -1
- package/src/utils/watch/github-context.test.ts +154 -0
- package/src/utils/watch/github-context.ts +184 -0
- package/src/utils/watch/http-watch-registry.test.ts +330 -0
- package/src/utils/watch/http-watch-registry.ts +341 -0
- package/src/utils/watch/local-watch-loop.test.ts +197 -0
- package/src/utils/watch/local-watch-loop.ts +190 -0
- package/src/utils/watch/register-notify-watches.test.ts +282 -0
- package/src/utils/watch/register-notify-watches.ts +226 -0
- package/src/utils/watch/register-watches.test.ts +696 -0
- package/src/utils/watch/register-watches.ts +369 -0
- package/src/utils/watch/stream-watch-loop.test.ts +625 -0
- package/src/utils/watch/stream-watch-loop.ts +411 -0
- package/src/utils/watch/websocket-watch-stream.test.ts +581 -0
- package/src/utils/watch/websocket-watch-stream.ts +403 -0
- package/tsconfig.json +19 -6
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/build/deploy-config.d.ts +0 -71
- package/dist/utils/build/deploy-config.d.ts.map +0 -1
- package/dist/utils/build/deploy-config.js +0 -164
- package/dist/utils/build/deploy-config.js.map +0 -1
- package/dist/utils/build/deploy-config.test.d.ts +0 -2
- package/dist/utils/build/deploy-config.test.d.ts.map +0 -1
- package/dist/utils/build/deploy-config.test.js +0 -126
- package/dist/utils/build/deploy-config.test.js.map +0 -1
- package/src/utils/build/deploy-config.test.ts +0 -149
- package/src/utils/build/deploy-config.ts +0 -259
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { parseWatchOption, } from '@quenty/nevermore-deploy';
|
|
3
|
+
import { describeNotifyWatchFallback, tryRegisterNotifyWatchesAsync, } from './register-notify-watches.js';
|
|
4
|
+
const REGISTER_BASE = 'https://watch.example.com/v1/register/';
|
|
5
|
+
const watchOption = () => parseWatchOption(`${REGISTER_BASE}30m`);
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
vi.stubEnv('GITHUB_REPOSITORY', 'Quenty/egg-hunt-2026');
|
|
8
|
+
vi.stubEnv('GITHUB_REF_NAME', 'release');
|
|
9
|
+
vi.stubEnv('NEVERMORE_WATCH_TOKEN', 'token-value');
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
vi.unstubAllEnvs();
|
|
13
|
+
});
|
|
14
|
+
function makeEntry(overrides = {}) {
|
|
15
|
+
return {
|
|
16
|
+
label: 'integration.places.hub',
|
|
17
|
+
universeId: 10,
|
|
18
|
+
placeId: 20,
|
|
19
|
+
versionType: 'published',
|
|
20
|
+
...overrides,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function makeRecordingRegistry(monitorId) {
|
|
24
|
+
const requests = [];
|
|
25
|
+
const create = () => ({
|
|
26
|
+
registerAsync: async (request) => {
|
|
27
|
+
requests.push(request);
|
|
28
|
+
return { monitorId: monitorId ?? 'mon_1', changed: true };
|
|
29
|
+
},
|
|
30
|
+
triggerAsync: async () => ({ results: [] }),
|
|
31
|
+
});
|
|
32
|
+
return { requests, create };
|
|
33
|
+
}
|
|
34
|
+
function notifyAction(request, index = 0) {
|
|
35
|
+
const action = request.watches[index].action;
|
|
36
|
+
expect(action.type).toBe('notify');
|
|
37
|
+
return action;
|
|
38
|
+
}
|
|
39
|
+
describe('tryRegisterNotifyWatchesAsync', () => {
|
|
40
|
+
it('registers notify actions carrying the selector', async () => {
|
|
41
|
+
const registry = makeRecordingRegistry();
|
|
42
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
43
|
+
option: watchOption(),
|
|
44
|
+
monitorName: 'egg-hunt/integration',
|
|
45
|
+
entries: [makeEntry({ baseline: 158 })],
|
|
46
|
+
createRegistry: registry.create,
|
|
47
|
+
});
|
|
48
|
+
expect(result.success).toBe(true);
|
|
49
|
+
const request = registry.requests[0];
|
|
50
|
+
// No baseline: the service compares its own token (an asset-delivery
|
|
51
|
+
// content hash) by string equality, so the lock's Open Cloud version number
|
|
52
|
+
// would read as drift on the first poll. The `ready` reconcile covers it.
|
|
53
|
+
expect(request.watches[0].baselineVersion).toBeUndefined();
|
|
54
|
+
expect(request.watches[0].baselineVersionKind).toBeUndefined();
|
|
55
|
+
expect(request.watches[0].source).toEqual({
|
|
56
|
+
type: 'roblox-place',
|
|
57
|
+
universeId: 10,
|
|
58
|
+
placeId: 20,
|
|
59
|
+
versionType: 'published',
|
|
60
|
+
});
|
|
61
|
+
expect(notifyAction(request).payload).toEqual({
|
|
62
|
+
target: 'integration.places.hub',
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
// Re-registering replaces a monitor's whole watch list, so a local watch that
|
|
66
|
+
// shared CI's monitor name would silently disarm the workflow dispatch.
|
|
67
|
+
it('registers under a monitor name distinct from the dispatching one', async () => {
|
|
68
|
+
const registry = makeRecordingRegistry();
|
|
69
|
+
await tryRegisterNotifyWatchesAsync({
|
|
70
|
+
option: watchOption(),
|
|
71
|
+
monitorName: 'egg-hunt/integration',
|
|
72
|
+
entries: [makeEntry()],
|
|
73
|
+
createRegistry: registry.create,
|
|
74
|
+
});
|
|
75
|
+
expect(registry.requests[0].monitorName).toBe('egg-hunt/integration/local');
|
|
76
|
+
});
|
|
77
|
+
it('hands back stream entries keyed by the registered watch name', async () => {
|
|
78
|
+
const registry = makeRecordingRegistry();
|
|
79
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
80
|
+
option: watchOption(),
|
|
81
|
+
monitorName: 'egg-hunt/integration',
|
|
82
|
+
entries: [makeEntry()],
|
|
83
|
+
createRegistry: registry.create,
|
|
84
|
+
});
|
|
85
|
+
expect(result.success && result.entries[0].watchName).toBe(registry.requests[0].watches[0].name);
|
|
86
|
+
expect(result.success && result.monitorId).toBe('mon_1');
|
|
87
|
+
expect(result.success && result.credential).toBe('token-value');
|
|
88
|
+
});
|
|
89
|
+
// Places are only optionally named, so a multi-place target with unnamed
|
|
90
|
+
// places produces the same selector twice. The service resolves a duplicate
|
|
91
|
+
// name by dropping a watch rather than failing.
|
|
92
|
+
it('separates watches that would share a name', async () => {
|
|
93
|
+
const registry = makeRecordingRegistry();
|
|
94
|
+
await tryRegisterNotifyWatchesAsync({
|
|
95
|
+
option: watchOption(),
|
|
96
|
+
monitorName: 'egg-hunt/integration',
|
|
97
|
+
entries: [makeEntry({ placeId: 20 }), makeEntry({ placeId: 21 })],
|
|
98
|
+
createRegistry: registry.create,
|
|
99
|
+
});
|
|
100
|
+
const names = registry.requests[0].watches.map((w) => w.name);
|
|
101
|
+
expect(new Set(names).size).toBe(2);
|
|
102
|
+
expect(names).toEqual([
|
|
103
|
+
'integration.places.hub/20',
|
|
104
|
+
'integration.places.hub/21',
|
|
105
|
+
]);
|
|
106
|
+
});
|
|
107
|
+
it('shares the Open Cloud key only when asked', async () => {
|
|
108
|
+
const registry = makeRecordingRegistry();
|
|
109
|
+
await tryRegisterNotifyWatchesAsync({
|
|
110
|
+
option: watchOption(),
|
|
111
|
+
monitorName: 'egg-hunt/integration',
|
|
112
|
+
entries: [makeEntry()],
|
|
113
|
+
createRegistry: registry.create,
|
|
114
|
+
});
|
|
115
|
+
expect(registry.requests[0].robloxApiKey).toBeUndefined();
|
|
116
|
+
await tryRegisterNotifyWatchesAsync({
|
|
117
|
+
option: watchOption(),
|
|
118
|
+
monitorName: 'egg-hunt/integration',
|
|
119
|
+
entries: [makeEntry()],
|
|
120
|
+
robloxApiKey: 'secret',
|
|
121
|
+
createRegistry: registry.create,
|
|
122
|
+
});
|
|
123
|
+
expect(registry.requests[1].robloxApiKey).toBe('secret');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('tryRegisterNotifyWatchesAsync falling back', () => {
|
|
127
|
+
// Every failure here has a working answer already — poll Open Cloud from this
|
|
128
|
+
// machine — so none of them may throw.
|
|
129
|
+
it('watches a "saved" place when a key is shared', async () => {
|
|
130
|
+
const registry = makeRecordingRegistry();
|
|
131
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
132
|
+
option: watchOption(),
|
|
133
|
+
monitorName: 'egg-hunt/integration',
|
|
134
|
+
entries: [makeEntry({ versionType: 'saved', baseline: 158 })],
|
|
135
|
+
robloxApiKey: 'secret',
|
|
136
|
+
createRegistry: registry.create,
|
|
137
|
+
});
|
|
138
|
+
expect(result.success).toBe(true);
|
|
139
|
+
const watch = registry.requests[0].watches[0];
|
|
140
|
+
expect(watch.source.versionType).toBe('saved');
|
|
141
|
+
// Same vocabulary once a key is in play, so the lock value is sendable.
|
|
142
|
+
expect(watch.baselineVersion).toBe('158');
|
|
143
|
+
expect(watch.baselineVersionKind).toBe('roblox-place-version');
|
|
144
|
+
});
|
|
145
|
+
it('declines a "saved" base place the service cannot poll', async () => {
|
|
146
|
+
const registry = makeRecordingRegistry();
|
|
147
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
148
|
+
option: watchOption(),
|
|
149
|
+
monitorName: 'egg-hunt/integration',
|
|
150
|
+
entries: [makeEntry({ versionType: 'saved' })],
|
|
151
|
+
createRegistry: registry.create,
|
|
152
|
+
});
|
|
153
|
+
expect(result).toMatchObject({
|
|
154
|
+
success: false,
|
|
155
|
+
reason: 'unwatchable_version_type',
|
|
156
|
+
});
|
|
157
|
+
expect(registry.requests).toEqual([]);
|
|
158
|
+
});
|
|
159
|
+
// Splitting the run — streaming the published places and polling the saved
|
|
160
|
+
// one — would leave two watch loops disagreeing about what is current.
|
|
161
|
+
it('declines the whole run when only some places are unwatchable', async () => {
|
|
162
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
163
|
+
option: watchOption(),
|
|
164
|
+
monitorName: 'egg-hunt/integration',
|
|
165
|
+
entries: [
|
|
166
|
+
makeEntry({ label: 'integration.places.hub' }),
|
|
167
|
+
makeEntry({ label: 'integration.places.lobby', versionType: 'saved' }),
|
|
168
|
+
],
|
|
169
|
+
createRegistry: makeRecordingRegistry().create,
|
|
170
|
+
});
|
|
171
|
+
expect(result).toMatchObject({ success: false });
|
|
172
|
+
expect(result.success === false && describeNotifyWatchFallback(result)).toMatch(/integration\.places\.lobby/);
|
|
173
|
+
});
|
|
174
|
+
it('declines without a token, since registration has no identity', async () => {
|
|
175
|
+
vi.stubEnv('NEVERMORE_WATCH_TOKEN', '');
|
|
176
|
+
vi.stubEnv('GITHUB_TOKEN', '');
|
|
177
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
178
|
+
option: watchOption(),
|
|
179
|
+
monitorName: 'egg-hunt/integration',
|
|
180
|
+
entries: [makeEntry()],
|
|
181
|
+
createRegistry: makeRecordingRegistry().create,
|
|
182
|
+
});
|
|
183
|
+
expect(result).toMatchObject({ success: false, reason: 'no_token' });
|
|
184
|
+
});
|
|
185
|
+
it('declines when the service refuses the registration', async () => {
|
|
186
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
187
|
+
option: watchOption(),
|
|
188
|
+
monitorName: 'egg-hunt/integration',
|
|
189
|
+
entries: [makeEntry()],
|
|
190
|
+
createRegistry: () => ({
|
|
191
|
+
registerAsync: async () => {
|
|
192
|
+
throw new Error('503 Service Unavailable');
|
|
193
|
+
},
|
|
194
|
+
triggerAsync: async () => ({ results: [] }),
|
|
195
|
+
}),
|
|
196
|
+
});
|
|
197
|
+
expect(result).toMatchObject({
|
|
198
|
+
success: false,
|
|
199
|
+
reason: 'register_failed',
|
|
200
|
+
});
|
|
201
|
+
expect(result.success === false && describeNotifyWatchFallback(result)).toMatch(/503 Service Unavailable/);
|
|
202
|
+
});
|
|
203
|
+
it('declines when the service returns no monitor to stream', async () => {
|
|
204
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
205
|
+
option: watchOption(),
|
|
206
|
+
monitorName: 'egg-hunt/integration',
|
|
207
|
+
entries: [makeEntry()],
|
|
208
|
+
createRegistry: () => ({
|
|
209
|
+
registerAsync: async () => ({ changed: true }),
|
|
210
|
+
triggerAsync: async () => ({ results: [] }),
|
|
211
|
+
}),
|
|
212
|
+
});
|
|
213
|
+
expect(result).toMatchObject({ success: false, reason: 'no_monitor_id' });
|
|
214
|
+
});
|
|
215
|
+
it('declines when there is nothing to watch', async () => {
|
|
216
|
+
const result = await tryRegisterNotifyWatchesAsync({
|
|
217
|
+
option: watchOption(),
|
|
218
|
+
monitorName: 'egg-hunt/integration',
|
|
219
|
+
entries: [],
|
|
220
|
+
createRegistry: makeRecordingRegistry().create,
|
|
221
|
+
});
|
|
222
|
+
expect(result).toMatchObject({ success: false, reason: 'no_entries' });
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=register-notify-watches.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-notify-watches.test.js","sourceRoot":"","sources":["../../../src/utils/watch/register-notify-watches.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type BasePlaceResolver, type DeployTarget, type WatchOption, type WatchRegistry } from '@quenty/nevermore-deploy';
|
|
2
|
+
/** One place `--watch` should consider registering. */
|
|
3
|
+
export interface WatchCandidate {
|
|
4
|
+
/**
|
|
5
|
+
* Deploy target the place belongs to. A selector (`integration.places.hub`)
|
|
6
|
+
* is accepted and narrowed to its target, since the dispatch selector is
|
|
7
|
+
* rebuilt from the target and the place — appending to a selector that
|
|
8
|
+
* already names a place would produce `integration.places.hub.places.hub`,
|
|
9
|
+
* which nothing can re-resolve.
|
|
10
|
+
*/
|
|
11
|
+
targetName: string;
|
|
12
|
+
/** npm package name, used to keep watch names unique across a batch. */
|
|
13
|
+
packageName: string;
|
|
14
|
+
/** Package directory, used to read the base place version out of the lock. */
|
|
15
|
+
packagePath: string;
|
|
16
|
+
place: DeployTarget;
|
|
17
|
+
}
|
|
18
|
+
export interface RegisterWatchesOptions {
|
|
19
|
+
option: WatchOption;
|
|
20
|
+
/**
|
|
21
|
+
* Lease key within the repository. Every watch this invocation is
|
|
22
|
+
* responsible for goes under this one name, and re-registering replaces the
|
|
23
|
+
* whole list — so the candidates must be the complete set, not just what
|
|
24
|
+
* deployed.
|
|
25
|
+
*/
|
|
26
|
+
monitorName: string;
|
|
27
|
+
candidates: WatchCandidate[];
|
|
28
|
+
/**
|
|
29
|
+
* Open Cloud key to share, so the service can read private base places, see
|
|
30
|
+
* `"saved"` versions, and report versions in the same vocabulary as the lock.
|
|
31
|
+
*/
|
|
32
|
+
robloxApiKey?: string;
|
|
33
|
+
/** Reads base place versions out of the lock, for baselines. */
|
|
34
|
+
resolver: BasePlaceResolver;
|
|
35
|
+
/** Let the GitHub CLI supply the token when no env var does. */
|
|
36
|
+
useGhAuth?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Force a dispatch immediately after registering, ignoring drift.
|
|
39
|
+
*
|
|
40
|
+
* Registering only proves the service accepted the config. Firing proves the
|
|
41
|
+
* workflow actually receives the selector, which is the half that has
|
|
42
|
+
* historically broken — so a dryrun asks for it.
|
|
43
|
+
*/
|
|
44
|
+
triggerAfterRegister?: boolean;
|
|
45
|
+
/** Injected in tests; defaults to the HTTP registry. */
|
|
46
|
+
createRegistry?: (registerUrl: string) => WatchRegistry;
|
|
47
|
+
}
|
|
48
|
+
export interface RegisterWatchesResult {
|
|
49
|
+
/** Watches in the registered monitor. Zero means nothing was sent. */
|
|
50
|
+
registered: number;
|
|
51
|
+
/** True when the service reported the config differing from what it held. */
|
|
52
|
+
changed?: boolean;
|
|
53
|
+
/** Watches that dispatched, when a trigger was requested. */
|
|
54
|
+
triggered?: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Register every watch this invocation owns, in one call.
|
|
58
|
+
*
|
|
59
|
+
* One call is not just an efficiency: the service replaces a monitor's entire
|
|
60
|
+
* watch list on re-apply, so splitting a run across several registrations under
|
|
61
|
+
* one name would leave only the last one standing. The caller decides what the
|
|
62
|
+
* complete set is; this turns it into a request.
|
|
63
|
+
*
|
|
64
|
+
* Runs after the deploy so the monitor only exists once the build it is meant
|
|
65
|
+
* to keep fresh has actually shipped.
|
|
66
|
+
*/
|
|
67
|
+
export declare function registerWatchesAsync(options: RegisterWatchesOptions): Promise<RegisterWatchesResult>;
|
|
68
|
+
//# sourceMappingURL=register-watches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-watches.d.ts","sourceRoot":"","sources":["../../../src/utils/watch/register-watches.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAEjB,KAAK,WAAW,EAEhB,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAiBlC,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,WAAW,CAAC;IACpB;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,gEAAgE;IAChE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wDAAwD;IACxD,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,aAAa,CAAC;CACzD;AAED,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA2HhC"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { OutputHelper } from '@quenty/cli-output-helpers';
|
|
2
|
+
import { WATCH_BASELINE_KIND, WATCH_INPUT_NAME, buildWatchPlan, describeWatchPlanSkip, parseTargetSelector, sanitizeWatchName, } from '@quenty/nevermore-deploy';
|
|
3
|
+
import { HttpWatchRegistry } from './http-watch-registry.js';
|
|
4
|
+
import { describeGithubContextFailure, describeMissingWatchToken, tryResolveGithubDispatchContext, } from './github-context.js';
|
|
5
|
+
/**
|
|
6
|
+
* Register every watch this invocation owns, in one call.
|
|
7
|
+
*
|
|
8
|
+
* One call is not just an efficiency: the service replaces a monitor's entire
|
|
9
|
+
* watch list on re-apply, so splitting a run across several registrations under
|
|
10
|
+
* one name would leave only the last one standing. The caller decides what the
|
|
11
|
+
* complete set is; this turns it into a request.
|
|
12
|
+
*
|
|
13
|
+
* Runs after the deploy so the monitor only exists once the build it is meant
|
|
14
|
+
* to keep fresh has actually shipped.
|
|
15
|
+
*/
|
|
16
|
+
export async function registerWatchesAsync(options) {
|
|
17
|
+
const { option, candidates, resolver } = options;
|
|
18
|
+
// What the service can see, and what language it will answer in.
|
|
19
|
+
const credentialed = options.robloxApiKey != null;
|
|
20
|
+
const watches = [];
|
|
21
|
+
const skipped = [];
|
|
22
|
+
// A place that declared `watch` and then got left out is worth saying out
|
|
23
|
+
// loud — the user asked for it. A place that never declared one is just
|
|
24
|
+
// ordinary config, and there are usually many, so that stays verbose-only.
|
|
25
|
+
const unmet = [];
|
|
26
|
+
for (const candidate of candidates) {
|
|
27
|
+
const { targetName } = parseTargetSelector(candidate.targetName);
|
|
28
|
+
const plan = buildWatchPlan(targetName, [candidate.place], {
|
|
29
|
+
credentialed,
|
|
30
|
+
});
|
|
31
|
+
for (const skip of plan.skipped) {
|
|
32
|
+
const described = describeWatchPlanSkip(skip);
|
|
33
|
+
skipped.push(described);
|
|
34
|
+
if (skip.reason !== 'no-watch-field') {
|
|
35
|
+
unmet.push(described);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const entry of plan.entries) {
|
|
39
|
+
watches.push(await _buildWatchEntryAsync(resolver, candidate, targetName, entry, credentialed));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
_disambiguateWatchNames(watches);
|
|
43
|
+
if (skipped.length > 0) {
|
|
44
|
+
OutputHelper.verbose(`Not watching ${skipped.length} place(s):`);
|
|
45
|
+
for (const line of skipped) {
|
|
46
|
+
OutputHelper.verbose(` ${line}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (watches.length === 0) {
|
|
50
|
+
OutputHelper.warn([
|
|
51
|
+
'--watch was requested, but no place is watchable.',
|
|
52
|
+
...skipped.map((line) => ` ${line}`),
|
|
53
|
+
'Add a "watch" path and a "published" basePlace to the place you want ' +
|
|
54
|
+
'hot-reloaded.',
|
|
55
|
+
].join('\n'));
|
|
56
|
+
return { registered: 0 };
|
|
57
|
+
}
|
|
58
|
+
if (unmet.length > 0) {
|
|
59
|
+
OutputHelper.warn([
|
|
60
|
+
`${unmet.length} place(s) asked to be watched but could not be:`,
|
|
61
|
+
...unmet.map((line) => ` ${line}`),
|
|
62
|
+
].join('\n'));
|
|
63
|
+
}
|
|
64
|
+
const contextResult = tryResolveGithubDispatchContext({
|
|
65
|
+
useGhAuth: options.useGhAuth,
|
|
66
|
+
});
|
|
67
|
+
if (!contextResult.success) {
|
|
68
|
+
throw new Error(describeGithubContextFailure(contextResult.reason));
|
|
69
|
+
}
|
|
70
|
+
const context = contextResult.context;
|
|
71
|
+
if (!context.token) {
|
|
72
|
+
throw new Error(describeMissingWatchToken());
|
|
73
|
+
}
|
|
74
|
+
// The ref is baked into each action rather than left to the service's
|
|
75
|
+
// default-branch fallback: a watch registered from a branch should rebuild
|
|
76
|
+
// that branch, not whatever main happens to hold.
|
|
77
|
+
for (const watch of watches) {
|
|
78
|
+
watch.action.ref = context.ref;
|
|
79
|
+
}
|
|
80
|
+
const request = {
|
|
81
|
+
// The ref is part of the monitor's identity because it is part of what the
|
|
82
|
+
// monitor does: every action dispatches at `context.ref`. Without it, a
|
|
83
|
+
// `batch deploy --watch` from any branch would re-point the production
|
|
84
|
+
// monitor's whole watch list at that branch, and the next base place edit
|
|
85
|
+
// would rebuild the wrong ref — or a deleted one.
|
|
86
|
+
monitorName: sanitizeWatchName(`${options.monitorName}/${context.ref}`),
|
|
87
|
+
repository: context.repository,
|
|
88
|
+
githubToken: context.token,
|
|
89
|
+
robloxApiKey: options.robloxApiKey,
|
|
90
|
+
watches,
|
|
91
|
+
};
|
|
92
|
+
const registry = (options.createRegistry ?? _defaultRegistry)(option.registerUrl);
|
|
93
|
+
const result = await registry.registerAsync(request);
|
|
94
|
+
const label = result.changed === false ? 'Renewed' : 'Registered';
|
|
95
|
+
OutputHelper.info(`${label} watch monitor "${request.monitorName}" — ${watches.length} ` +
|
|
96
|
+
`watch${watches.length === 1 ? '' : 'es'}, lease ${option.lease}` +
|
|
97
|
+
(result.leaseExpiresAt ? ` (expires ${result.leaseExpiresAt})` : ''));
|
|
98
|
+
for (const watch of watches) {
|
|
99
|
+
OutputHelper.verbose(` ${watch.name}: base place ${watch.source.placeId} → ` +
|
|
100
|
+
`${watch.action.inputs?.[WATCH_INPUT_NAME] ?? watch.action.workflow}`);
|
|
101
|
+
}
|
|
102
|
+
let triggered;
|
|
103
|
+
if (options.triggerAfterRegister) {
|
|
104
|
+
triggered = await _triggerAsync(registry, result, context.token);
|
|
105
|
+
}
|
|
106
|
+
return { registered: watches.length, changed: result.changed, triggered };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Force a dispatch and report what each watch did.
|
|
110
|
+
*
|
|
111
|
+
* Reported rather than thrown: the registration succeeded, and a monitor that
|
|
112
|
+
* exists is worth keeping even if the demonstration dispatch failed. The
|
|
113
|
+
* per-watch `ok` is what actually proves routing, so a failure there is
|
|
114
|
+
* surfaced loudly.
|
|
115
|
+
*/
|
|
116
|
+
async function _triggerAsync(registry, result, token) {
|
|
117
|
+
if (!result.monitorId) {
|
|
118
|
+
OutputHelper.warn('Registered, but the service returned no monitorId — cannot force a ' +
|
|
119
|
+
'dispatch to prove routing.');
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
let outcome;
|
|
123
|
+
try {
|
|
124
|
+
outcome = await registry.triggerAsync(result.monitorId, token);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
OutputHelper.error(`Registered, but forcing a dispatch failed: ` +
|
|
128
|
+
(err instanceof Error ? err.message : String(err)));
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
const ok = outcome.results.filter((r) => r.ok !== false);
|
|
132
|
+
const failed = outcome.results.filter((r) => r.ok === false);
|
|
133
|
+
OutputHelper.info(`Forced a dispatch: ${ok.length} of ${outcome.results.length} watch` +
|
|
134
|
+
`${outcome.results.length === 1 ? '' : 'es'} fired.`);
|
|
135
|
+
for (const r of outcome.results) {
|
|
136
|
+
const line = ` ${r.watchName ?? '(unnamed)'}: ${r.ok === false ? 'FAILED' : 'dispatched'}${r.detail ? ` — ${r.detail}` : ''}`;
|
|
137
|
+
if (r.ok === false) {
|
|
138
|
+
OutputHelper.warn(line);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
OutputHelper.info(line);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (failed.length > 0) {
|
|
145
|
+
OutputHelper.warn('A watch registered but could not dispatch. The routing is not working ' +
|
|
146
|
+
'end to end yet — check the workflow path and the ref.');
|
|
147
|
+
}
|
|
148
|
+
return ok.length;
|
|
149
|
+
}
|
|
150
|
+
function _defaultRegistry(registerUrl) {
|
|
151
|
+
return new HttpWatchRegistry({ registerUrl });
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Make every watch name unique within the monitor.
|
|
155
|
+
*
|
|
156
|
+
* `Watch.name` is documented as unique per monitor but the schema does not
|
|
157
|
+
* enforce it, so a collision is resolved server-side — silently dropping a
|
|
158
|
+
* watch rather than failing. Places are only *optionally* named, so a
|
|
159
|
+
* multi-place target with unnamed places collides by construction. Appending
|
|
160
|
+
* the base place id disambiguates without failing a deploy that already
|
|
161
|
+
* shipped, and only touches the names that actually clash.
|
|
162
|
+
*/
|
|
163
|
+
function _disambiguateWatchNames(watches) {
|
|
164
|
+
const byName = new Map();
|
|
165
|
+
for (const watch of watches) {
|
|
166
|
+
const group = byName.get(watch.name);
|
|
167
|
+
if (group) {
|
|
168
|
+
group.push(watch);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
byName.set(watch.name, [watch]);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
for (const group of byName.values()) {
|
|
175
|
+
if (group.length === 1) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
for (const watch of group) {
|
|
179
|
+
watch.name = sanitizeWatchName(`${watch.name}/${watch.source.placeId}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function _buildWatchEntryAsync(resolver, candidate, targetName, entry, credentialed) {
|
|
184
|
+
const basePlace = candidate.place.basePlace;
|
|
185
|
+
// From the lock, not the network: this is the version the build we just
|
|
186
|
+
// shipped was made from. A package that did not deploy this run still has a
|
|
187
|
+
// lock entry, which is exactly the right baseline for it — it is how the
|
|
188
|
+
// service notices a change that happened while that package was untouched.
|
|
189
|
+
//
|
|
190
|
+
// Only when a key is shared. Reading anonymously, the service compares
|
|
191
|
+
// asset-delivery content hashes, and a place version number could never match
|
|
192
|
+
// one — it would read as drift and rebuild on the first poll.
|
|
193
|
+
const baseline = credentialed
|
|
194
|
+
? await resolver.peekAsync(candidate.packagePath, basePlace)
|
|
195
|
+
: undefined;
|
|
196
|
+
return {
|
|
197
|
+
name: sanitizeWatchName(`${candidate.packageName}/${candidate.place.name ?? targetName}`),
|
|
198
|
+
source: {
|
|
199
|
+
type: 'roblox-place',
|
|
200
|
+
universeId: basePlace.universeId,
|
|
201
|
+
placeId: basePlace.placeId,
|
|
202
|
+
// An omitted pin resolves as "published", the same default the resolver
|
|
203
|
+
// builds with, so the watch observes exactly what the build used.
|
|
204
|
+
versionType: basePlace.version === 'saved' ? 'saved' : 'published',
|
|
205
|
+
},
|
|
206
|
+
...(baseline == null
|
|
207
|
+
? {}
|
|
208
|
+
: {
|
|
209
|
+
baselineVersion: String(baseline),
|
|
210
|
+
// Declared so a vocabulary mismatch is a 422 at the moment the
|
|
211
|
+
// manifest changed, rather than one silent rebuild later.
|
|
212
|
+
baselineVersionKind: WATCH_BASELINE_KIND,
|
|
213
|
+
}),
|
|
214
|
+
action: {
|
|
215
|
+
type: 'github-workflow-dispatch',
|
|
216
|
+
workflow: entry.workflow,
|
|
217
|
+
inputs: { [WATCH_INPUT_NAME]: entry.selector },
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=register-watches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-watches.js","sourceRoot":"","sources":["../../../src/utils/watch/register-watches.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-watches.test.d.ts","sourceRoot":"","sources":["../../../src/utils/watch/register-watches.test.ts"],"names":[],"mappings":""}
|