devhelm 0.1.3 → 0.1.5

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 (95) hide show
  1. package/dist/commands/alert-channels/test.js +2 -5
  2. package/dist/commands/alert-channels/test.js.map +1 -1
  3. package/dist/commands/api-keys/revoke.js +1 -2
  4. package/dist/commands/api-keys/revoke.js.map +1 -1
  5. package/dist/commands/auth/login.js +7 -12
  6. package/dist/commands/auth/login.js.map +1 -1
  7. package/dist/commands/auth/me.js +6 -8
  8. package/dist/commands/auth/me.js.map +1 -1
  9. package/dist/commands/data/services/status.js +2 -5
  10. package/dist/commands/data/services/status.js.map +1 -1
  11. package/dist/commands/data/services/uptime.js +5 -8
  12. package/dist/commands/data/services/uptime.js.map +1 -1
  13. package/dist/commands/dependencies/track.js +2 -5
  14. package/dist/commands/dependencies/track.js.map +1 -1
  15. package/dist/commands/deploy/force-unlock.js +57 -0
  16. package/dist/commands/deploy/force-unlock.js.map +1 -0
  17. package/dist/commands/deploy/index.js +234 -0
  18. package/dist/commands/deploy/index.js.map +1 -0
  19. package/dist/commands/incidents/resolve.js +2 -7
  20. package/dist/commands/incidents/resolve.js.map +1 -1
  21. package/dist/commands/init.js +102 -27
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/monitors/pause.js +2 -5
  24. package/dist/commands/monitors/pause.js.map +1 -1
  25. package/dist/commands/monitors/results.js +7 -10
  26. package/dist/commands/monitors/results.js.map +1 -1
  27. package/dist/commands/monitors/resume.js +2 -5
  28. package/dist/commands/monitors/resume.js.map +1 -1
  29. package/dist/commands/monitors/test.js +2 -5
  30. package/dist/commands/monitors/test.js.map +1 -1
  31. package/dist/commands/monitors/versions/get.js +22 -0
  32. package/dist/commands/monitors/versions/get.js.map +1 -0
  33. package/dist/commands/monitors/versions/list.js +29 -0
  34. package/dist/commands/monitors/versions/list.js.map +1 -0
  35. package/dist/commands/notification-policies/test.js +1 -2
  36. package/dist/commands/notification-policies/test.js.map +1 -1
  37. package/dist/commands/plan.js +96 -0
  38. package/dist/commands/plan.js.map +1 -0
  39. package/dist/commands/status.js +4 -6
  40. package/dist/commands/status.js.map +1 -1
  41. package/dist/commands/validate.js +79 -39
  42. package/dist/commands/validate.js.map +1 -1
  43. package/dist/commands/webhooks/test.js +2 -5
  44. package/dist/commands/webhooks/test.js.map +1 -1
  45. package/dist/lib/api-client.js +38 -4
  46. package/dist/lib/api-client.js.map +1 -1
  47. package/dist/lib/auth.js +6 -1
  48. package/dist/lib/auth.js.map +1 -1
  49. package/dist/lib/base-command.js +3 -0
  50. package/dist/lib/base-command.js.map +1 -1
  51. package/dist/lib/crud-commands.js +12 -23
  52. package/dist/lib/crud-commands.js.map +1 -1
  53. package/dist/lib/descriptions.generated.js +7 -3
  54. package/dist/lib/descriptions.generated.js.map +1 -1
  55. package/dist/lib/errors.js +2 -13
  56. package/dist/lib/errors.js.map +1 -1
  57. package/dist/lib/output.js.map +1 -1
  58. package/dist/lib/resource-types.js +2 -0
  59. package/dist/lib/resource-types.js.map +1 -0
  60. package/dist/lib/resources.js +24 -7
  61. package/dist/lib/resources.js.map +1 -1
  62. package/dist/lib/typed-api.js +15 -0
  63. package/dist/lib/typed-api.js.map +1 -0
  64. package/dist/lib/yaml/applier.js +117 -0
  65. package/dist/lib/yaml/applier.js.map +1 -0
  66. package/dist/lib/yaml/differ.js +166 -0
  67. package/dist/lib/yaml/differ.js.map +1 -0
  68. package/dist/lib/yaml/entitlements.js +69 -0
  69. package/dist/lib/yaml/entitlements.js.map +1 -0
  70. package/dist/lib/yaml/handlers.js +480 -0
  71. package/dist/lib/yaml/handlers.js.map +1 -0
  72. package/dist/lib/yaml/index.js +10 -0
  73. package/dist/lib/yaml/index.js.map +1 -0
  74. package/dist/lib/yaml/interpolation.js +77 -0
  75. package/dist/lib/yaml/interpolation.js.map +1 -0
  76. package/dist/lib/yaml/parser.js +140 -0
  77. package/dist/lib/yaml/parser.js.map +1 -0
  78. package/dist/lib/yaml/resolver.js +54 -0
  79. package/dist/lib/yaml/resolver.js.map +1 -0
  80. package/dist/lib/yaml/schema.js +42 -0
  81. package/dist/lib/yaml/schema.js.map +1 -0
  82. package/dist/lib/yaml/state.js +43 -0
  83. package/dist/lib/yaml/state.js.map +1 -0
  84. package/dist/lib/yaml/transform.js +182 -0
  85. package/dist/lib/yaml/transform.js.map +1 -0
  86. package/dist/lib/yaml/types.js +7 -0
  87. package/dist/lib/yaml/types.js.map +1 -0
  88. package/dist/lib/yaml/validator.js +433 -0
  89. package/dist/lib/yaml/validator.js.map +1 -0
  90. package/oclif.manifest.json +535 -264
  91. package/package.json +3 -1
  92. package/dist/commands/incidents/delete.js +0 -4
  93. package/dist/commands/incidents/delete.js.map +0 -1
  94. package/dist/commands/incidents/update.js +0 -4
  95. package/dist/commands/incidents/update.js.map +0 -1
@@ -0,0 +1,480 @@
1
+ /**
2
+ * Typed resource handlers — the single source of truth for each resource type's
3
+ * identity, semantic comparison, API operations, and list fetching.
4
+ *
5
+ * Every handler is defined with FULL TypeScript generics over its YAML input type
6
+ * (what the user writes in devhelm.yml), its API DTO type (what the API returns),
7
+ * and a Snapshot type used for drift detection.
8
+ *
9
+ * Drift detection uses "snapshot comparison":
10
+ * - toDesiredSnapshot(yaml, api, refs) → TSnapshot (what we WANT)
11
+ * - toCurrentSnapshot(api) → TSnapshot (what we HAVE)
12
+ * - hasChanged = !isEqual(desired, current)
13
+ *
14
+ * Snapshot types are derived from the OpenAPI-generated Update*Request schemas
15
+ * (via Required<Schemas['UpdateXRequest']>). This guarantees that when the API
16
+ * contract changes — a field is added, removed, or renamed — the TypeScript
17
+ * compiler immediately errors in the snapshot functions, preventing silent drift.
18
+ *
19
+ * Three resources use custom snapshot types because their update semantics
20
+ * don't map 1:1 to an UpdateXRequest schema:
21
+ * - secret: write-only value, compared by SHA-256 hash
22
+ * - alertChannel: complex config union, compared by content-addressed hash
23
+ * - dependency: no single update endpoint (split across two API calls)
24
+ *
25
+ * Adding a new resource type requires:
26
+ * 1. Adding it to HandledResourceType in types.ts
27
+ * 2. Implementing a handler here (with snapshot functions)
28
+ * 3. Adding it to HANDLER_MAP (TypeScript errors if you forget)
29
+ */
30
+ import { createHash } from 'node:crypto';
31
+ import isEqual from 'lodash-es/isEqual.js';
32
+ import { toCreateTagRequest, toCreateEnvironmentRequest, toCreateSecretRequest, toCreateAlertChannelRequest, toCreateNotificationPolicyRequest, toCreateWebhookRequest, toCreateResourceGroupRequest, toCreateMonitorRequest, toUpdateMonitorRequest, toAuthConfig, toCreateAssertionRequest, toIncidentPolicy, } from './transform.js';
33
+ import { fetchPaginated } from '../typed-api.js';
34
+ import { checkedFetch, apiPatch } from '../api-client.js';
35
+ /**
36
+ * Type-checking bridge: takes a handler definition with full generic types,
37
+ * derives hasChanged from snapshot comparison, then type-erases to
38
+ * ResourceHandler (defaults) for registry storage.
39
+ */
40
+ function defineHandler(h) {
41
+ const handler = {
42
+ resourceType: h.resourceType,
43
+ refType: h.refType,
44
+ configKey: h.configKey,
45
+ listPath: h.listPath,
46
+ getRefKey: h.getRefKey,
47
+ getApiRefKey: h.getApiRefKey,
48
+ getApiId: h.getApiId,
49
+ getManagedBy: h.getManagedBy,
50
+ hasChanged(yaml, api, refs) {
51
+ return !isEqual(h.toDesiredSnapshot(yaml, api, refs), h.toCurrentSnapshot(api));
52
+ },
53
+ fetchAll: h.fetchAll,
54
+ applyCreate: h.applyCreate,
55
+ applyUpdate: h.applyUpdate,
56
+ deletePath: h.deletePath,
57
+ };
58
+ return handler;
59
+ }
60
+ // ── Shared helpers ──────────────────────────────────────────────────────
61
+ function nonNullStrings(arr) {
62
+ return (arr ?? []).filter((v) => v !== null);
63
+ }
64
+ function sortedIds(ids) {
65
+ return [...ids].sort();
66
+ }
67
+ export function sha256Hex(input) {
68
+ return createHash('sha256').update(input, 'utf8').digest('hex');
69
+ }
70
+ /**
71
+ * Deterministic JSON serialization with alphabetically sorted keys at every
72
+ * nesting level. Produces the same output regardless of JS engine key
73
+ * insertion order, matching the Java-side TreeMap-based canonical JSON.
74
+ */
75
+ export function stableStringify(obj) {
76
+ if (obj === null || obj === undefined)
77
+ return 'null';
78
+ if (typeof obj !== 'object')
79
+ return JSON.stringify(obj);
80
+ if (Array.isArray(obj))
81
+ return '[' + obj.map(stableStringify).join(',') + ']';
82
+ const record = obj;
83
+ const keys = Object.keys(record).sort();
84
+ return '{' + keys.map((k) => JSON.stringify(k) + ':' + stableStringify(record[k])).join(',') + '}';
85
+ }
86
+ const tagHandler = defineHandler({
87
+ resourceType: 'tag',
88
+ refType: 'tags',
89
+ configKey: 'tags',
90
+ listPath: '/api/v1/tags',
91
+ getRefKey: (yaml) => yaml.name,
92
+ getApiRefKey: (api) => api.name ?? '',
93
+ getApiId: (api) => String(api.id ?? ''),
94
+ toDesiredSnapshot: (yaml, api) => ({
95
+ name: yaml.name,
96
+ color: yaml.color ?? api.color ?? null,
97
+ }),
98
+ toCurrentSnapshot: (api) => ({
99
+ name: api.name ?? null,
100
+ color: api.color ?? null,
101
+ }),
102
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/tags'),
103
+ async applyCreate(yaml, _refs, client) {
104
+ const resp = await checkedFetch(client.POST('/api/v1/tags', { body: toCreateTagRequest(yaml) }));
105
+ return resp.data?.id ?? undefined;
106
+ },
107
+ async applyUpdate(yaml, id, _refs, client) {
108
+ await checkedFetch(client.PUT('/api/v1/tags/{id}', { params: { path: { id } }, body: toCreateTagRequest(yaml) }));
109
+ },
110
+ deletePath: (id) => `/api/v1/tags/${id}`,
111
+ });
112
+ const environmentHandler = defineHandler({
113
+ resourceType: 'environment',
114
+ refType: 'environments',
115
+ configKey: 'environments',
116
+ listPath: '/api/v1/environments',
117
+ getRefKey: (yaml) => yaml.slug,
118
+ getApiRefKey: (api) => api.slug ?? '',
119
+ getApiId: (api) => String(api.id ?? ''),
120
+ toDesiredSnapshot: (yaml, api) => ({
121
+ name: yaml.name,
122
+ isDefault: yaml.isDefault ?? api.isDefault ?? null,
123
+ variables: yaml.variables ?? api.variables ?? null,
124
+ }),
125
+ toCurrentSnapshot: (api) => ({
126
+ name: api.name ?? null,
127
+ isDefault: api.isDefault ?? null,
128
+ variables: api.variables ?? null,
129
+ }),
130
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/environments'),
131
+ async applyCreate(yaml, _refs, client) {
132
+ const resp = await checkedFetch(client.POST('/api/v1/environments', { body: toCreateEnvironmentRequest(yaml) }));
133
+ return resp.data?.id ?? undefined;
134
+ },
135
+ async applyUpdate(yaml, _id, _refs, client) {
136
+ await checkedFetch(client.PUT('/api/v1/environments/{slug}', { params: { path: { slug: yaml.slug } }, body: {
137
+ name: yaml.name, variables: yaml.variables ?? null, isDefault: yaml.isDefault,
138
+ } }));
139
+ },
140
+ deletePath: (_id, refKey) => `/api/v1/environments/${refKey}`,
141
+ });
142
+ const secretHandler = defineHandler({
143
+ resourceType: 'secret',
144
+ refType: 'secrets',
145
+ configKey: 'secrets',
146
+ listPath: '/api/v1/secrets',
147
+ getRefKey: (yaml) => yaml.key,
148
+ getApiRefKey: (api) => api.key ?? '',
149
+ getApiId: (api) => String(api.id ?? ''),
150
+ toDesiredSnapshot: (yaml) => ({
151
+ key: yaml.key,
152
+ valueHash: sha256Hex(yaml.value),
153
+ }),
154
+ toCurrentSnapshot: (api) => ({
155
+ key: api.key ?? '',
156
+ valueHash: api.valueHash ?? '',
157
+ }),
158
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/secrets'),
159
+ async applyCreate(yaml, _refs, client) {
160
+ const resp = await checkedFetch(client.POST('/api/v1/secrets', { body: toCreateSecretRequest(yaml) }));
161
+ return resp.data?.id ?? undefined;
162
+ },
163
+ async applyUpdate(yaml, _id, _refs, client) {
164
+ await checkedFetch(client.PUT('/api/v1/secrets/{key}', { params: { path: { key: yaml.key } }, body: { value: yaml.value } }));
165
+ },
166
+ deletePath: (id) => `/api/v1/secrets/${id}`,
167
+ });
168
+ const alertChannelHandler = defineHandler({
169
+ resourceType: 'alertChannel',
170
+ refType: 'alertChannels',
171
+ configKey: 'alertChannels',
172
+ listPath: '/api/v1/alert-channels',
173
+ getRefKey: (yaml) => yaml.name,
174
+ getApiRefKey: (api) => api.name,
175
+ getApiId: (api) => api.id,
176
+ toDesiredSnapshot: (yaml) => {
177
+ const req = toCreateAlertChannelRequest(yaml);
178
+ return {
179
+ name: req.name,
180
+ channelType: yaml.type,
181
+ configHash: sha256Hex(stableStringify(req.config)),
182
+ };
183
+ },
184
+ toCurrentSnapshot: (api) => ({
185
+ name: api.name,
186
+ channelType: api.channelType?.toLowerCase?.() ?? '',
187
+ configHash: api.configHash ?? '',
188
+ }),
189
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/alert-channels'),
190
+ async applyCreate(yaml, _refs, client) {
191
+ const resp = await checkedFetch(client.POST('/api/v1/alert-channels', { body: toCreateAlertChannelRequest(yaml) }));
192
+ return resp.data?.id ?? undefined;
193
+ },
194
+ async applyUpdate(yaml, id, _refs, client) {
195
+ await checkedFetch(client.PUT('/api/v1/alert-channels/{id}', { params: { path: { id } }, body: toCreateAlertChannelRequest(yaml) }));
196
+ },
197
+ deletePath: (id) => `/api/v1/alert-channels/${id}`,
198
+ });
199
+ const notificationPolicyHandler = defineHandler({
200
+ resourceType: 'notificationPolicy',
201
+ refType: 'notificationPolicies',
202
+ configKey: 'notificationPolicies',
203
+ listPath: '/api/v1/notification-policies',
204
+ getRefKey: (yaml) => yaml.name,
205
+ getApiRefKey: (api) => api.name ?? '',
206
+ getApiId: (api) => String(api.id ?? ''),
207
+ toDesiredSnapshot: (yaml, api, refs) => {
208
+ const req = toCreateNotificationPolicyRequest(yaml, refs);
209
+ return {
210
+ name: req.name,
211
+ enabled: req.enabled ?? api.enabled ?? true,
212
+ priority: req.priority ?? api.priority ?? 0,
213
+ matchRules: req.matchRules ?? api.matchRules ?? [],
214
+ escalation: req.escalation,
215
+ };
216
+ },
217
+ toCurrentSnapshot: (api) => ({
218
+ name: api.name ?? '',
219
+ enabled: api.enabled ?? true,
220
+ priority: api.priority ?? 0,
221
+ matchRules: api.matchRules ?? [],
222
+ escalation: api.escalation ?? { steps: [], onResolve: null, onReopen: null },
223
+ }),
224
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/notification-policies'),
225
+ async applyCreate(yaml, refs, client) {
226
+ const resp = await checkedFetch(client.POST('/api/v1/notification-policies', { body: toCreateNotificationPolicyRequest(yaml, refs) }));
227
+ return resp.data?.id != null ? String(resp.data.id) : undefined;
228
+ },
229
+ async applyUpdate(yaml, id, refs, client) {
230
+ await checkedFetch(client.PUT('/api/v1/notification-policies/{id}', { params: { path: { id } }, body: toCreateNotificationPolicyRequest(yaml, refs) }));
231
+ },
232
+ deletePath: (id) => `/api/v1/notification-policies/${id}`,
233
+ });
234
+ const webhookHandler = defineHandler({
235
+ resourceType: 'webhook',
236
+ refType: 'webhooks',
237
+ configKey: 'webhooks',
238
+ listPath: '/api/v1/webhooks',
239
+ getRefKey: (yaml) => yaml.url,
240
+ getApiRefKey: (api) => api.url ?? '',
241
+ getApiId: (api) => String(api.id ?? ''),
242
+ toDesiredSnapshot: (yaml, api) => ({
243
+ url: yaml.url,
244
+ description: yaml.description ?? api.description ?? null,
245
+ subscribedEvents: sortedIds(yaml.events),
246
+ enabled: yaml.enabled ?? api.enabled ?? true,
247
+ }),
248
+ toCurrentSnapshot: (api) => ({
249
+ url: api.url ?? null,
250
+ description: api.description ?? null,
251
+ subscribedEvents: api.subscribedEvents ? sortedIds(api.subscribedEvents) : null,
252
+ enabled: api.enabled ?? null,
253
+ }),
254
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/webhooks'),
255
+ async applyCreate(yaml, _refs, client) {
256
+ const resp = await checkedFetch(client.POST('/api/v1/webhooks', { body: toCreateWebhookRequest(yaml) }));
257
+ return resp.data?.id ?? undefined;
258
+ },
259
+ async applyUpdate(yaml, id, _refs, client) {
260
+ await checkedFetch(client.PUT('/api/v1/webhooks/{id}', { params: { path: { id } }, body: {
261
+ ...toCreateWebhookRequest(yaml),
262
+ enabled: yaml.enabled ?? null,
263
+ } }));
264
+ },
265
+ deletePath: (id) => `/api/v1/webhooks/${id}`,
266
+ });
267
+ const resourceGroupHandler = defineHandler({
268
+ resourceType: 'resourceGroup',
269
+ refType: 'resourceGroups',
270
+ configKey: 'resourceGroups',
271
+ listPath: '/api/v1/resource-groups',
272
+ getRefKey: (yaml) => yaml.name,
273
+ getApiRefKey: (api) => api.name ?? '',
274
+ getApiId: (api) => String(api.id ?? ''),
275
+ toDesiredSnapshot: (yaml, api, refs) => ({
276
+ name: yaml.name,
277
+ description: yaml.description ?? api.description ?? null,
278
+ alertPolicyId: yaml.alertPolicy !== undefined
279
+ ? (refs.resolve('notificationPolicies', yaml.alertPolicy) ?? null)
280
+ : (api.alertPolicyId ?? null),
281
+ defaultFrequency: yaml.defaultFrequency ?? api.defaultFrequency ?? null,
282
+ defaultRegions: yaml.defaultRegions !== undefined
283
+ ? sortedIds(yaml.defaultRegions)
284
+ : (api.defaultRegions ? sortedIds(nonNullStrings(api.defaultRegions)) : null),
285
+ defaultRetryStrategy: yaml.defaultRetryStrategy ?? api.defaultRetryStrategy ?? null,
286
+ defaultAlertChannels: yaml.defaultAlertChannels !== undefined
287
+ ? sortedIds(yaml.defaultAlertChannels.map((n) => refs.resolve('alertChannels', n) ?? n))
288
+ : (api.defaultAlertChannels ? sortedIds(nonNullStrings(api.defaultAlertChannels)) : null),
289
+ defaultEnvironmentId: yaml.defaultEnvironment !== undefined
290
+ ? (refs.resolve('environments', yaml.defaultEnvironment) ?? null)
291
+ : (api.defaultEnvironmentId ?? null),
292
+ healthThresholdType: yaml.healthThresholdType ?? api.healthThresholdType ?? null,
293
+ healthThresholdValue: yaml.healthThresholdValue ?? api.healthThresholdValue ?? null,
294
+ suppressMemberAlerts: yaml.suppressMemberAlerts ?? api.suppressMemberAlerts ?? null,
295
+ confirmationDelaySeconds: yaml.confirmationDelaySeconds ?? api.confirmationDelaySeconds ?? null,
296
+ recoveryCooldownMinutes: yaml.recoveryCooldownMinutes ?? api.recoveryCooldownMinutes ?? null,
297
+ }),
298
+ toCurrentSnapshot: (api) => ({
299
+ name: api.name ?? '',
300
+ description: api.description ?? null,
301
+ alertPolicyId: api.alertPolicyId ?? null,
302
+ defaultFrequency: api.defaultFrequency ?? null,
303
+ defaultRegions: api.defaultRegions ? sortedIds(nonNullStrings(api.defaultRegions)) : null,
304
+ defaultRetryStrategy: api.defaultRetryStrategy ?? null,
305
+ defaultAlertChannels: api.defaultAlertChannels ? sortedIds(nonNullStrings(api.defaultAlertChannels)) : null,
306
+ defaultEnvironmentId: api.defaultEnvironmentId ?? null,
307
+ healthThresholdType: api.healthThresholdType ?? null,
308
+ healthThresholdValue: api.healthThresholdValue ?? null,
309
+ suppressMemberAlerts: api.suppressMemberAlerts ?? null,
310
+ confirmationDelaySeconds: api.confirmationDelaySeconds ?? null,
311
+ recoveryCooldownMinutes: api.recoveryCooldownMinutes ?? null,
312
+ }),
313
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/resource-groups'),
314
+ async applyCreate(yaml, refs, client) {
315
+ const resp = await checkedFetch(client.POST('/api/v1/resource-groups', { body: toCreateResourceGroupRequest(yaml, refs) }));
316
+ return resp.data?.id ?? undefined;
317
+ },
318
+ async applyUpdate(yaml, id, refs, client) {
319
+ await checkedFetch(client.PUT('/api/v1/resource-groups/{id}', { params: { path: { id } }, body: toCreateResourceGroupRequest(yaml, refs) }));
320
+ },
321
+ deletePath: (id) => `/api/v1/resource-groups/${id}`,
322
+ });
323
+ const monitorHandler = defineHandler({
324
+ resourceType: 'monitor',
325
+ refType: 'monitors',
326
+ configKey: 'monitors',
327
+ listPath: '/api/v1/monitors',
328
+ getRefKey: (yaml) => yaml.name,
329
+ getApiRefKey: (api) => api.name ?? '',
330
+ getApiId: (api) => String(api.id ?? ''),
331
+ getManagedBy: (api) => api.managedBy,
332
+ toDesiredSnapshot: (yaml, api, refs) => ({
333
+ name: yaml.name,
334
+ config: yaml.config,
335
+ frequencySeconds: yaml.frequency ?? api.frequencySeconds ?? null,
336
+ enabled: yaml.enabled ?? api.enabled ?? null,
337
+ regions: yaml.regions !== undefined
338
+ ? sortedIds(yaml.regions)
339
+ : (api.regions ? sortedIds(api.regions) : null),
340
+ environmentId: yaml.environment !== undefined
341
+ ? (refs.resolve('environments', yaml.environment) ?? null)
342
+ : (api.environment?.id ?? null),
343
+ assertions: yaml.assertions !== undefined
344
+ ? sortAssertions(yaml.assertions.map(toCreateAssertionRequest))
345
+ : apiAssertionsToSnapshot(api.assertions),
346
+ auth: yaml.auth !== undefined
347
+ ? (toAuthConfig(yaml.auth, refs) ?? null)
348
+ : (api.auth ?? null),
349
+ incidentPolicy: yaml.incidentPolicy !== undefined
350
+ ? toIncidentPolicy(yaml.incidentPolicy)
351
+ : apiIncidentPolicyToSnapshot(api.incidentPolicy),
352
+ alertChannelIds: yaml.alertChannels !== undefined
353
+ ? sortedIds(yaml.alertChannels.map((n) => refs.resolve('alertChannels', n) ?? n))
354
+ : (api.alertChannelIds ? sortedIds(nonNullStrings(api.alertChannelIds)) : null),
355
+ tags: yaml.tags !== undefined
356
+ ? {
357
+ tagIds: sortedIds(yaml.tags.map((n) => refs.resolve('tags', n)).filter((id) => id !== undefined)),
358
+ newTags: yaml.tags.filter((n) => !refs.resolve('tags', n)).map((n) => ({ name: n })),
359
+ }
360
+ : apiTagsToSnapshot(api),
361
+ }),
362
+ toCurrentSnapshot: (api) => ({
363
+ name: api.name ?? null,
364
+ config: api.config,
365
+ frequencySeconds: api.frequencySeconds ?? null,
366
+ enabled: api.enabled ?? null,
367
+ regions: api.regions ? sortedIds(api.regions) : null,
368
+ environmentId: api.environment?.id ?? null,
369
+ assertions: apiAssertionsToSnapshot(api.assertions),
370
+ auth: api.auth ?? null,
371
+ incidentPolicy: apiIncidentPolicyToSnapshot(api.incidentPolicy),
372
+ alertChannelIds: api.alertChannelIds ? sortedIds(nonNullStrings(api.alertChannelIds)) : null,
373
+ tags: apiTagsToSnapshot(api),
374
+ }),
375
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/monitors'),
376
+ async applyCreate(yaml, refs, client) {
377
+ const resp = await checkedFetch(client.POST('/api/v1/monitors', { body: toCreateMonitorRequest(yaml, refs) }));
378
+ return resp.data?.id ?? undefined;
379
+ },
380
+ async applyUpdate(yaml, id, refs, client) {
381
+ await checkedFetch(client.PUT('/api/v1/monitors/{id}', { params: { path: { id } }, body: toUpdateMonitorRequest(yaml, refs) }));
382
+ },
383
+ deletePath: (id) => `/api/v1/monitors/${id}`,
384
+ });
385
+ // ── Monitor snapshot helpers ─────────────────────────────────────────────
386
+ function sortAssertions(assertions) {
387
+ return [...assertions].sort((a, b) => {
388
+ const aType = a.config.type;
389
+ const bType = b.config.type;
390
+ return aType.localeCompare(bType);
391
+ });
392
+ }
393
+ function apiAssertionsToSnapshot(assertions) {
394
+ if (!assertions)
395
+ return null;
396
+ return sortAssertions(assertions.map((a) => ({
397
+ config: a.config,
398
+ severity: a.severity,
399
+ })));
400
+ }
401
+ function apiIncidentPolicyToSnapshot(policy) {
402
+ if (!policy)
403
+ return null;
404
+ return {
405
+ triggerRules: policy.triggerRules ?? [],
406
+ confirmation: policy.confirmation ?? { type: 'multi_region' },
407
+ recovery: policy.recovery ?? { consecutiveSuccesses: 1, minRegionsPassing: 1, cooldownMinutes: 0 },
408
+ };
409
+ }
410
+ function apiTagsToSnapshot(api) {
411
+ if (!api.tags)
412
+ return { tagIds: null, newTags: [] };
413
+ return {
414
+ tagIds: sortedIds(api.tags.map((t) => String(t.id ?? '')).filter(Boolean)),
415
+ newTags: [],
416
+ };
417
+ }
418
+ const dependencyHandler = defineHandler({
419
+ resourceType: 'dependency',
420
+ refType: 'dependencies',
421
+ configKey: 'dependencies',
422
+ listPath: '/api/v1/service-subscriptions',
423
+ getRefKey: (yaml) => yaml.service,
424
+ getApiRefKey: (api) => api.slug ?? '',
425
+ getApiId: (api) => String(api.subscriptionId ?? ''),
426
+ toDesiredSnapshot: (yaml, api) => ({
427
+ alertSensitivity: yaml.alertSensitivity ?? api.alertSensitivity ?? null,
428
+ component: yaml.component ?? api.componentId ?? null,
429
+ }),
430
+ toCurrentSnapshot: (api) => ({
431
+ alertSensitivity: api.alertSensitivity ?? null,
432
+ component: api.componentId ?? null,
433
+ }),
434
+ fetchAll: (client) => fetchPaginated(client, '/api/v1/service-subscriptions'),
435
+ async applyCreate(yaml, _refs, client) {
436
+ const resp = await checkedFetch(client.POST('/api/v1/service-subscriptions/{slug}', {
437
+ params: { path: { slug: yaml.service } },
438
+ body: {
439
+ alertSensitivity: yaml.alertSensitivity ?? null,
440
+ componentId: yaml.component ?? null,
441
+ },
442
+ }));
443
+ return resp.data?.subscriptionId ?? undefined;
444
+ },
445
+ async applyUpdate(yaml, id, _refs, client) {
446
+ if (yaml.alertSensitivity !== undefined) {
447
+ await checkedFetch(client.PATCH('/api/v1/service-subscriptions/{id}/alert-sensitivity', {
448
+ params: { path: { id } },
449
+ body: { alertSensitivity: yaml.alertSensitivity },
450
+ }));
451
+ }
452
+ if (yaml.component !== undefined) {
453
+ await apiPatch(client, `/api/v1/service-subscriptions/${id}`, { componentId: yaml.component });
454
+ }
455
+ },
456
+ deletePath: (id) => `/api/v1/service-subscriptions/${id}`,
457
+ });
458
+ // ── Handler registry ────────────────────────────────────────────────────
459
+ /**
460
+ * Compile-time complete map: TypeScript errors if any HandledResourceType is missing.
461
+ */
462
+ export const HANDLER_MAP = {
463
+ tag: tagHandler,
464
+ environment: environmentHandler,
465
+ secret: secretHandler,
466
+ alertChannel: alertChannelHandler,
467
+ notificationPolicy: notificationPolicyHandler,
468
+ webhook: webhookHandler,
469
+ resourceGroup: resourceGroupHandler,
470
+ monitor: monitorHandler,
471
+ dependency: dependencyHandler,
472
+ };
473
+ /** @internal – used by tests to look up a handler by resource type */
474
+ export function getHandler(type) {
475
+ return HANDLER_MAP[type];
476
+ }
477
+ export function allHandlers() {
478
+ return Object.values(HANDLER_MAP);
479
+ }
480
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/lib/yaml/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { YAML_SECTION_KEYS } from './schema.js';
2
+ export { parseConfigFile, loadConfig, ParseError } from './parser.js';
3
+ export { validate } from './validator.js';
4
+ export { interpolate, findMissingVariables, InterpolationError } from './interpolation.js';
5
+ export { fetchAllRefs, ResolvedRefs } from './resolver.js';
6
+ export { diff, formatPlan, changesetToJson } from './differ.js';
7
+ export { apply } from './applier.js';
8
+ export { readState, writeState, buildState } from './state.js';
9
+ export * from './transform.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/yaml/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAC,eAAe,EAAE,UAAU,EAAE,UAAU,EAAC,MAAM,aAAa,CAAA;AACnE,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAE,kBAAkB,EAAC,MAAM,oBAAoB,CAAA;AACxF,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,eAAe,CAAA;AACxD,OAAO,EAAC,IAAI,EAAE,UAAU,EAAE,eAAe,EAAC,MAAM,aAAa,CAAA;AAE7D,OAAO,EAAC,KAAK,EAAC,MAAM,cAAc,CAAA;AAElC,OAAO,EAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAC,MAAM,YAAY,CAAA;AAC5D,cAAc,gBAAgB,CAAA"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Environment variable interpolation for YAML config values.
3
+ *
4
+ * Supports:
5
+ * ${VAR} — required, fails if unset
6
+ * ${VAR:-default} — with fallback value
7
+ *
8
+ * Interpolation runs on the raw YAML string before parsing,
9
+ * so it works in any value position (strings, URLs, etc.).
10
+ */
11
+ const ENV_VAR_PATTERN = /\$\{([^}]+)\}/g;
12
+ export class InterpolationError extends Error {
13
+ variable;
14
+ constructor(variable, message) {
15
+ super(message);
16
+ this.variable = variable;
17
+ this.name = 'InterpolationError';
18
+ }
19
+ }
20
+ /**
21
+ * Interpolate all ${VAR} and ${VAR:-default} expressions in a string.
22
+ * Throws InterpolationError if a required variable is not set.
23
+ */
24
+ export function interpolate(input, env = process.env) {
25
+ return input.replace(ENV_VAR_PATTERN, (_match, expr) => {
26
+ const separatorIdx = expr.indexOf(':-');
27
+ if (separatorIdx !== -1) {
28
+ const varName = expr.slice(0, separatorIdx);
29
+ const fallback = expr.slice(separatorIdx + 2);
30
+ const value = env[varName];
31
+ return value !== undefined && value !== '' ? value : fallback;
32
+ }
33
+ const varName = expr.trim();
34
+ const value = env[varName];
35
+ if (value === undefined || value === '') {
36
+ throw new InterpolationError(varName, `Environment variable \${${varName}} is required but not set. ` +
37
+ `Set it in your environment or use \${${varName}:-default} for a fallback.`);
38
+ }
39
+ return value;
40
+ });
41
+ }
42
+ /**
43
+ * Find all ${VAR} references in a string without resolving them.
44
+ * Returns variable names (without fallback info).
45
+ */
46
+ export function findVariables(input) {
47
+ const vars = [];
48
+ let match;
49
+ const re = new RegExp(ENV_VAR_PATTERN.source, 'g');
50
+ while ((match = re.exec(input)) !== null) {
51
+ const expr = match[1];
52
+ const separatorIdx = expr.indexOf(':-');
53
+ vars.push(separatorIdx !== -1 ? expr.slice(0, separatorIdx) : expr.trim());
54
+ }
55
+ return vars;
56
+ }
57
+ /**
58
+ * Check which variables would fail during interpolation (no value, no default).
59
+ * Returns array of missing variable names.
60
+ */
61
+ export function findMissingVariables(input, env = process.env) {
62
+ const missing = [];
63
+ const re = new RegExp(ENV_VAR_PATTERN.source, 'g');
64
+ let match;
65
+ while ((match = re.exec(input)) !== null) {
66
+ const expr = match[1];
67
+ const separatorIdx = expr.indexOf(':-');
68
+ if (separatorIdx === -1) {
69
+ const varName = expr.trim();
70
+ if (env[varName] === undefined || env[varName] === '') {
71
+ missing.push(varName);
72
+ }
73
+ }
74
+ }
75
+ return missing;
76
+ }
77
+ //# sourceMappingURL=interpolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolation.js","sourceRoot":"","sources":["../../../src/lib/yaml/interpolation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,eAAe,GAAG,gBAAgB,CAAA;AAExC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB;IADlB,YACkB,QAAgB,EAChC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAHE,aAAQ,GAAR,QAAQ,CAAQ;QAIhC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAA0C,OAAO,CAAC,GAAG;IAC9F,OAAO,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE;QAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAA;YAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;YAC1B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,kBAAkB,CAC1B,OAAO,EACP,2BAA2B,OAAO,6BAA6B;gBAC/D,wCAAwC,OAAO,4BAA4B,CAC5E,CAAA;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,IAAI,KAA6B,CAAA;IACjC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAClD,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC5E,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,MAA0C,OAAO,CAAC,GAAG;IACvG,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAClD,IAAI,KAA6B,CAAA;IACjC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;YAC3B,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}