apiwatcher-cli 0.1.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 (109) hide show
  1. package/changesets/stripe/2025-09-30.clover__2026-08-26.dahlia.json +4576 -0
  2. package/changesets/stripe/index.json +16 -0
  3. package/data/stripe/events.json +271 -0
  4. package/data/stripe/method-map.json +5718 -0
  5. package/dist/changeset/index-file.d.ts +30 -0
  6. package/dist/changeset/index-file.d.ts.map +1 -0
  7. package/dist/changeset/index-file.js +34 -0
  8. package/dist/changeset/index-file.js.map +1 -0
  9. package/dist/changeset/load.d.ts +21 -0
  10. package/dist/changeset/load.d.ts.map +1 -0
  11. package/dist/changeset/load.js +113 -0
  12. package/dist/changeset/load.js.map +1 -0
  13. package/dist/changeset/types.d.ts +97 -0
  14. package/dist/changeset/types.d.ts.map +1 -0
  15. package/dist/changeset/types.js +18 -0
  16. package/dist/changeset/types.js.map +1 -0
  17. package/dist/changeset/version.d.ts +17 -0
  18. package/dist/changeset/version.d.ts.map +1 -0
  19. package/dist/changeset/version.js +33 -0
  20. package/dist/changeset/version.js.map +1 -0
  21. package/dist/cli/args.d.ts +15 -0
  22. package/dist/cli/args.d.ts.map +1 -0
  23. package/dist/cli/args.js +82 -0
  24. package/dist/cli/args.js.map +1 -0
  25. package/dist/cli/index.d.ts +5 -0
  26. package/dist/cli/index.d.ts.map +1 -0
  27. package/dist/cli/index.js +333 -0
  28. package/dist/cli/index.js.map +1 -0
  29. package/dist/config.d.ts +26 -0
  30. package/dist/config.d.ts.map +1 -0
  31. package/dist/config.js +92 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/index.d.ts +14 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +14 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/report/impact.d.ts +40 -0
  38. package/dist/report/impact.d.ts.map +1 -0
  39. package/dist/report/impact.js +331 -0
  40. package/dist/report/impact.js.map +1 -0
  41. package/dist/report/impact.test.d.ts +2 -0
  42. package/dist/report/impact.test.d.ts.map +1 -0
  43. package/dist/report/impact.test.js +247 -0
  44. package/dist/report/impact.test.js.map +1 -0
  45. package/dist/report/render.d.ts +9 -0
  46. package/dist/report/render.d.ts.map +1 -0
  47. package/dist/report/render.js +211 -0
  48. package/dist/report/render.js.map +1 -0
  49. package/dist/scanner/ast.d.ts +74 -0
  50. package/dist/scanner/ast.d.ts.map +1 -0
  51. package/dist/scanner/ast.js +930 -0
  52. package/dist/scanner/ast.js.map +1 -0
  53. package/dist/scanner/paths.d.ts +42 -0
  54. package/dist/scanner/paths.d.ts.map +1 -0
  55. package/dist/scanner/paths.js +179 -0
  56. package/dist/scanner/paths.js.map +1 -0
  57. package/dist/scanner/scan.d.ts +11 -0
  58. package/dist/scanner/scan.d.ts.map +1 -0
  59. package/dist/scanner/scan.js +268 -0
  60. package/dist/scanner/scan.js.map +1 -0
  61. package/dist/scanner/scan.test.d.ts +2 -0
  62. package/dist/scanner/scan.test.d.ts.map +1 -0
  63. package/dist/scanner/scan.test.js +134 -0
  64. package/dist/scanner/scan.test.js.map +1 -0
  65. package/dist/scanner/types.d.ts +74 -0
  66. package/dist/scanner/types.d.ts.map +1 -0
  67. package/dist/scanner/types.js +7 -0
  68. package/dist/scanner/types.js.map +1 -0
  69. package/dist/scanner/version.d.ts +23 -0
  70. package/dist/scanner/version.d.ts.map +1 -0
  71. package/dist/scanner/version.js +155 -0
  72. package/dist/scanner/version.js.map +1 -0
  73. package/dist/scanner/walk.d.ts +26 -0
  74. package/dist/scanner/walk.d.ts.map +1 -0
  75. package/dist/scanner/walk.js +117 -0
  76. package/dist/scanner/walk.js.map +1 -0
  77. package/dist/scanner/wrapper.test.d.ts +2 -0
  78. package/dist/scanner/wrapper.test.d.ts.map +1 -0
  79. package/dist/scanner/wrapper.test.js +92 -0
  80. package/dist/scanner/wrapper.test.js.map +1 -0
  81. package/dist/specdiff/build-method-map.d.ts +6 -0
  82. package/dist/specdiff/build-method-map.d.ts.map +1 -0
  83. package/dist/specdiff/build-method-map.js +231 -0
  84. package/dist/specdiff/build-method-map.js.map +1 -0
  85. package/dist/specdiff/compat.d.ts +20 -0
  86. package/dist/specdiff/compat.d.ts.map +1 -0
  87. package/dist/specdiff/compat.js +58 -0
  88. package/dist/specdiff/compat.js.map +1 -0
  89. package/dist/specdiff/diff.d.ts +28 -0
  90. package/dist/specdiff/diff.d.ts.map +1 -0
  91. package/dist/specdiff/diff.js +529 -0
  92. package/dist/specdiff/diff.js.map +1 -0
  93. package/dist/specdiff/diff.test.d.ts +2 -0
  94. package/dist/specdiff/diff.test.d.ts.map +1 -0
  95. package/dist/specdiff/diff.test.js +260 -0
  96. package/dist/specdiff/diff.test.js.map +1 -0
  97. package/dist/specdiff/fetch.d.ts +28 -0
  98. package/dist/specdiff/fetch.d.ts.map +1 -0
  99. package/dist/specdiff/fetch.js +68 -0
  100. package/dist/specdiff/fetch.js.map +1 -0
  101. package/dist/specdiff/methodmap.d.ts +45 -0
  102. package/dist/specdiff/methodmap.d.ts.map +1 -0
  103. package/dist/specdiff/methodmap.js +109 -0
  104. package/dist/specdiff/methodmap.js.map +1 -0
  105. package/dist/specdiff/openapi.d.ts +166 -0
  106. package/dist/specdiff/openapi.d.ts.map +1 -0
  107. package/dist/specdiff/openapi.js +282 -0
  108. package/dist/specdiff/openapi.js.map +1 -0
  109. package/package.json +33 -0
@@ -0,0 +1,529 @@
1
+ import { SCHEMA_VERSION } from '../changeset/types.js';
2
+ import { buildReadSites, deref, eventTypes, flattenOwnFields, operations, requestSchema, typeSignature, } from './openapi.js';
3
+ import { classifyTypeChange } from './compat.js';
4
+ import { lookupSdkMethods } from './methodmap.js';
5
+ const UPGRADE_GUIDE = 'https://docs.stripe.com/upgrades';
6
+ const DOCS_BASE = 'https://docs.stripe.com/api';
7
+ const EVENTS_DOCS = 'https://docs.stripe.com/api/events/types';
8
+ /**
9
+ * Diffs two Stripe OpenAPI specs into a changeset.
10
+ *
11
+ * Requests are diffed per operation, because Stripe inlines request shapes.
12
+ * Responses are diffed per component schema with `$ref` as a boundary, then
13
+ * attributed to the endpoints that return them — expanding refs per endpoint
14
+ * produces unstable field sets and duplicates one real change across hundreds of
15
+ * paths.
16
+ *
17
+ * The only inference is rename detection, kept deliberately conservative: a
18
+ * wrong `replacement` sends someone to the wrong field, which is worse than
19
+ * reporting a removal and an addition separately.
20
+ */
21
+ export function diffSpecs(oldSpec, newSpec, options = {}) {
22
+ const from = oldSpec.info?.version;
23
+ const to = newSpec.info?.version;
24
+ if (!from || !to)
25
+ throw new Error('Both specs must declare info.version');
26
+ const maxDepth = options.maxDepth ?? 3;
27
+ const maxAttribution = options.maxAttribution ?? 12;
28
+ const changes = [];
29
+ const ids = new IdAllocator(to);
30
+ const oldOps = indexOperations(oldSpec);
31
+ const newOps = indexOperations(newSpec);
32
+ // --- endpoints that disappeared or arrived -------------------------------
33
+ for (const [key, entry] of oldOps) {
34
+ if (newOps.has(key))
35
+ continue;
36
+ changes.push({
37
+ id: ids.next(),
38
+ kind: 'removed',
39
+ severity: 'breaking',
40
+ location: 'operation',
41
+ path: entry.path,
42
+ method: entry.method,
43
+ note: `Endpoint ${entry.method.toUpperCase()} ${entry.path} no longer exists.`,
44
+ docsUrl: UPGRADE_GUIDE,
45
+ ...withSdk(options.methodMap, entry.method, entry.path),
46
+ });
47
+ }
48
+ if (options.includeAdditive) {
49
+ for (const [key, entry] of newOps) {
50
+ if (oldOps.has(key))
51
+ continue;
52
+ changes.push({
53
+ id: ids.next(),
54
+ kind: 'added',
55
+ severity: 'additive',
56
+ location: 'operation',
57
+ path: entry.path,
58
+ method: entry.method,
59
+ note: `New endpoint ${entry.method.toUpperCase()} ${entry.path}.`,
60
+ docsUrl: DOCS_BASE,
61
+ ...withSdk(options.methodMap, entry.method, entry.path),
62
+ });
63
+ }
64
+ }
65
+ // --- requests, per operation --------------------------------------------
66
+ for (const [key, oldEntry] of oldOps) {
67
+ const newEntry = newOps.get(key);
68
+ if (!newEntry)
69
+ continue;
70
+ const sdk = withSdk(options.methodMap, oldEntry.method, oldEntry.path);
71
+ if (oldEntry.op.deprecated !== true && newEntry.op.deprecated === true) {
72
+ changes.push({
73
+ id: ids.next(),
74
+ kind: 'deprecated',
75
+ severity: 'deprecating',
76
+ location: 'operation',
77
+ path: oldEntry.path,
78
+ method: oldEntry.method,
79
+ note: `Endpoint ${oldEntry.method.toUpperCase()} ${oldEntry.path} is now deprecated.`,
80
+ docsUrl: UPGRADE_GUIDE,
81
+ ...sdk,
82
+ });
83
+ }
84
+ diffFields({
85
+ before: flattenOwnFields(oldSpec, requestSchema(oldSpec, oldEntry.op), { maxDepth }),
86
+ after: flattenOwnFields(newSpec, requestSchema(newSpec, newEntry.op), { maxDepth }),
87
+ location: 'requestBody',
88
+ direction: 'request',
89
+ path: oldEntry.path,
90
+ method: oldEntry.method,
91
+ extra: sdk,
92
+ }, changes, ids, options);
93
+ diffFields({
94
+ before: parameterFields(oldSpec, oldEntry.op, 'query'),
95
+ after: parameterFields(newSpec, newEntry.op, 'query'),
96
+ location: 'queryParam',
97
+ direction: 'request',
98
+ path: oldEntry.path,
99
+ method: oldEntry.method,
100
+ extra: sdk,
101
+ }, changes, ids, options);
102
+ }
103
+ // --- responses, per component schema ------------------------------------
104
+ const readSites = buildReadSites(newSpec, maxDepth);
105
+ const oldSchemas = oldSpec.components?.schemas ?? {};
106
+ const newSchemas = newSpec.components?.schemas ?? {};
107
+ for (const name of Object.keys(oldSchemas)) {
108
+ const oldSchema = oldSchemas[name];
109
+ const newSchema = newSchemas[name];
110
+ // A schema that vanished entirely is reported through whatever referenced
111
+ // it (an endpoint removal or a type change), not as its own entry.
112
+ if (!oldSchema || !newSchema)
113
+ continue;
114
+ const sites = readSites.get(name) ?? [];
115
+ if (sites.length === 0)
116
+ continue; // unreachable from any response
117
+ const attribution = attributeSites(sites, options.methodMap, maxAttribution);
118
+ diffFields({
119
+ before: flattenOwnFields(oldSpec, oldSchema, { maxDepth }),
120
+ after: flattenOwnFields(newSpec, newSchema, { maxDepth }),
121
+ location: 'response',
122
+ direction: 'response',
123
+ resource: name,
124
+ sites,
125
+ maxAttribution,
126
+ extra: attribution,
127
+ }, changes, ids, options);
128
+ }
129
+ // --- webhook events ------------------------------------------------------
130
+ const oldEvents = eventTypes(oldSpec);
131
+ const newEvents = eventTypes(newSpec);
132
+ for (const event of oldEvents.keys()) {
133
+ if (newEvents.has(event))
134
+ continue;
135
+ changes.push({
136
+ id: ids.next(),
137
+ kind: 'removed',
138
+ severity: 'breaking',
139
+ location: 'event',
140
+ event,
141
+ note: `Webhook event "${event}" is no longer sent.`,
142
+ docsUrl: EVENTS_DOCS,
143
+ });
144
+ }
145
+ if (options.includeAdditive) {
146
+ for (const event of newEvents.keys()) {
147
+ if (oldEvents.has(event))
148
+ continue;
149
+ changes.push({
150
+ id: ids.next(),
151
+ kind: 'added',
152
+ severity: 'additive',
153
+ location: 'event',
154
+ event,
155
+ note: `New webhook event "${event}".`,
156
+ docsUrl: EVENTS_DOCS,
157
+ });
158
+ }
159
+ }
160
+ changes.sort(byImpact);
161
+ return {
162
+ schemaVersion: SCHEMA_VERSION,
163
+ api: 'stripe',
164
+ from,
165
+ to,
166
+ generatedAt: new Date().toISOString(),
167
+ ...(options.source ? { source: options.source } : {}),
168
+ changes,
169
+ };
170
+ }
171
+ function indexOperations(spec) {
172
+ const out = new Map();
173
+ for (const { path, method, op } of operations(spec)) {
174
+ out.set(`${method} ${path}`, { path, method, op });
175
+ }
176
+ return out;
177
+ }
178
+ function withSdk(map, method, path) {
179
+ if (!map)
180
+ return {};
181
+ const refs = lookupSdkMethods(map, method, path);
182
+ return refs.length > 0 ? { sdkMethods: refs } : {};
183
+ }
184
+ /** Collapse read sites into a capped list of endpoints plus their SDK calls. */
185
+ function attributeSites(sites, map, maxAttribution) {
186
+ const endpoints = [];
187
+ const sdkMethods = [];
188
+ const seenEndpoint = new Set();
189
+ const seenCall = new Set();
190
+ for (const site of sites) {
191
+ const key = `${site.method} ${site.path}`;
192
+ if (seenEndpoint.has(key))
193
+ continue;
194
+ seenEndpoint.add(key);
195
+ if (endpoints.length < maxAttribution)
196
+ endpoints.push({ method: site.method, path: site.path });
197
+ for (const ref of map ? lookupSdkMethods(map, site.method, site.path) : []) {
198
+ const callKeyStr = `${ref.namespace}.${ref.method}`;
199
+ if (seenCall.has(callKeyStr))
200
+ continue;
201
+ seenCall.add(callKeyStr);
202
+ if (sdkMethods.length < maxAttribution)
203
+ sdkMethods.push(ref);
204
+ }
205
+ }
206
+ return {
207
+ ...(endpoints.length > 0 ? { endpoints } : {}),
208
+ ...(sdkMethods.length > 0 ? { sdkMethods } : {}),
209
+ };
210
+ }
211
+ /** The dotted paths a caller reads `field` through, across all read sites. */
212
+ function readPathsFor(sites, field, max) {
213
+ const out = new Set();
214
+ for (const site of sites) {
215
+ out.add(site.prefix === '' ? field : `${site.prefix}.${field}`);
216
+ if (out.size >= max)
217
+ break;
218
+ }
219
+ return [...out];
220
+ }
221
+ /** Query/path parameters, shaped like flattened fields so one differ handles both. */
222
+ function parameterFields(spec, op, where) {
223
+ const out = new Map();
224
+ for (const param of op.parameters ?? []) {
225
+ if (param.in !== where || !param.name)
226
+ continue;
227
+ out.set(param.name, {
228
+ path: param.name,
229
+ typeSig: typeSignature(spec, param.schema ?? deref(spec, param.schema)),
230
+ required: param.required === true,
231
+ // Query parameters sit at the top level, so required means required.
232
+ requiredPath: param.required === true,
233
+ deprecated: param.deprecated === true,
234
+ });
235
+ }
236
+ return out;
237
+ }
238
+ function diffFields(input, out, ids, options) {
239
+ const { before, after, location, direction } = input;
240
+ const base = () => ({
241
+ ...(input.path ? { path: input.path } : {}),
242
+ ...(input.method ? { method: input.method } : {}),
243
+ ...(input.resource ? { resource: input.resource } : {}),
244
+ });
245
+ const paths = (field) => {
246
+ if (!input.sites)
247
+ return {};
248
+ const cited = readPathsFor(input.sites, field, input.maxAttribution ?? 12);
249
+ return cited.length > 0 ? { fieldPaths: cited } : {};
250
+ };
251
+ const subject = input.resource ? `${input.resource}.` : '';
252
+ const removed = [...before.keys()].filter((k) => !after.has(k));
253
+ const added = [...after.keys()].filter((k) => !before.has(k));
254
+ const renames = detectRenames(removed, added, before, after);
255
+ const renamedTargets = new Set(renames.values());
256
+ // When `tipping.bgn` goes, so do all its children. Reporting each one
257
+ // separately turns a single removal into five findings on the same line.
258
+ const removedSet = new Set(removed);
259
+ const topLevelRemovals = removed.filter((key) => !hasRemovedAncestor(key, removedSet));
260
+ for (const key of topLevelRemovals) {
261
+ if (!before.get(key))
262
+ continue;
263
+ const replacement = renames.get(key);
264
+ out.push({
265
+ id: ids.next(),
266
+ kind: replacement === undefined ? 'removed' : 'renamed',
267
+ severity: 'breaking',
268
+ location,
269
+ ...base(),
270
+ field: key,
271
+ ...(replacement === undefined ? {} : { replacement }),
272
+ note: replacement === undefined
273
+ ? `${describe(location)} "${subject}${key}" was removed.`
274
+ : `${describe(location)} "${subject}${key}" was renamed to "${replacement}".`,
275
+ docsUrl: UPGRADE_GUIDE,
276
+ ...paths(key),
277
+ ...input.extra,
278
+ });
279
+ }
280
+ for (const key of added) {
281
+ const field = after.get(key);
282
+ if (!field || renamedTargets.has(key))
283
+ continue;
284
+ // A newly required request field breaks existing calls — but only those that
285
+ // reach it. A required field inside an optional object binds conditionally.
286
+ if (field.required && direction === 'request') {
287
+ out.push({
288
+ id: ids.next(),
289
+ kind: 'required',
290
+ severity: 'breaking',
291
+ location,
292
+ ...base(),
293
+ field: key,
294
+ note: requiredNote(describe(location), `${subject}${key}`, field.requiredPath, key, true),
295
+ docsUrl: UPGRADE_GUIDE,
296
+ ...input.extra,
297
+ });
298
+ continue;
299
+ }
300
+ if (options.includeAdditive) {
301
+ out.push({
302
+ id: ids.next(),
303
+ kind: 'added',
304
+ severity: 'additive',
305
+ location,
306
+ ...base(),
307
+ field: key,
308
+ note: `${describe(location)} "${subject}${key}" was added.`,
309
+ docsUrl: DOCS_BASE,
310
+ ...paths(key),
311
+ ...input.extra,
312
+ });
313
+ }
314
+ }
315
+ for (const [key, oldField] of before) {
316
+ const newField = after.get(key);
317
+ if (!newField)
318
+ continue;
319
+ const verdict = classifyTypeChange(oldField.typeSig, newField.typeSig, direction);
320
+ if (verdict.changed && (verdict.severity === 'breaking' || options.includeAdditive)) {
321
+ out.push({
322
+ id: ids.next(),
323
+ kind: 'typeChanged',
324
+ severity: verdict.severity,
325
+ location,
326
+ ...base(),
327
+ field: key,
328
+ fromType: oldField.typeSig,
329
+ toType: newField.typeSig,
330
+ note: `${describe(location)} "${subject}${key}" ${verdict.detail}.`,
331
+ docsUrl: UPGRADE_GUIDE,
332
+ ...paths(key),
333
+ ...input.extra,
334
+ });
335
+ }
336
+ if (!oldField.required && newField.required && direction === 'request') {
337
+ out.push({
338
+ id: ids.next(),
339
+ kind: 'required',
340
+ severity: 'breaking',
341
+ location,
342
+ ...base(),
343
+ field: key,
344
+ note: requiredNote(describe(location), `${subject}${key}`, newField.requiredPath, key, false),
345
+ docsUrl: UPGRADE_GUIDE,
346
+ ...input.extra,
347
+ });
348
+ }
349
+ if (!oldField.deprecated && newField.deprecated) {
350
+ out.push({
351
+ id: ids.next(),
352
+ kind: 'deprecated',
353
+ severity: 'deprecating',
354
+ location,
355
+ ...base(),
356
+ field: key,
357
+ note: `${describe(location)} "${subject}${key}" is now deprecated.`,
358
+ docsUrl: UPGRADE_GUIDE,
359
+ ...paths(key),
360
+ ...input.extra,
361
+ });
362
+ }
363
+ }
364
+ }
365
+ /**
366
+ * Pair a removed field with an added one when the evidence is strong.
367
+ *
368
+ * Strong means: same parent object, identical type signature, and no competing
369
+ * candidate. Anything less is reported as a removal plus an addition.
370
+ */
371
+ function detectRenames(removed, added, before, after) {
372
+ const out = new Map();
373
+ if (removed.length === 0 || added.length === 0)
374
+ return out;
375
+ const byParent = (keys) => {
376
+ const m = new Map();
377
+ for (const key of keys) {
378
+ const idx = key.lastIndexOf('.');
379
+ const parent = idx === -1 ? '' : key.slice(0, idx);
380
+ let bucket = m.get(parent);
381
+ if (!bucket) {
382
+ bucket = [];
383
+ m.set(parent, bucket);
384
+ }
385
+ bucket.push(key);
386
+ }
387
+ return m;
388
+ };
389
+ const removedByParent = byParent(removed);
390
+ const addedByParent = byParent(added);
391
+ const claimed = new Set();
392
+ for (const [parent, gone] of removedByParent) {
393
+ const arrived = addedByParent.get(parent);
394
+ if (!arrived)
395
+ continue;
396
+ for (const from of gone) {
397
+ const fromInfo = before.get(from);
398
+ if (!fromInfo)
399
+ continue;
400
+ const matches = arrived.filter((to) => {
401
+ if (claimed.has(to))
402
+ return false;
403
+ const toInfo = after.get(to);
404
+ if (toInfo === undefined || toInfo.typeSig !== fromInfo.typeSig)
405
+ return false;
406
+ return namesLookRelated(leaf(from), leaf(to));
407
+ });
408
+ // One type-compatible candidate, and the swap is unambiguous at this
409
+ // parent — otherwise we would be guessing which field became which.
410
+ if (matches.length === 1 && (gone.length === 1 || arrived.length === 1)) {
411
+ const to = matches[0];
412
+ out.set(from, to);
413
+ claimed.add(to);
414
+ }
415
+ }
416
+ }
417
+ return out;
418
+ }
419
+ /**
420
+ * Phrase a "now required" note honestly.
421
+ *
422
+ * Most newly-required Stripe parameters live inside an optional object, so they
423
+ * are only mandatory for callers who send that object. Saying "is now required"
424
+ * flat out would be a false alarm for everyone else; naming the condition lets
425
+ * the reader tell instantly whether it applies to them.
426
+ */
427
+ function requiredNote(label, display, requiredPath, fieldPath, isNew) {
428
+ const verb = isNew ? 'is new and required' : 'is now required';
429
+ if (requiredPath)
430
+ return `${label} "${display}" ${verb}.`;
431
+ const idx = fieldPath.lastIndexOf('.');
432
+ const parent = idx === -1 ? null : fieldPath.slice(0, idx).replace(/\[\]$/, '');
433
+ return parent === null
434
+ ? `${label} "${display}" ${verb}.`
435
+ : `${label} "${display}" ${verb} whenever "${parent}" is provided.`;
436
+ }
437
+ /** True when some ancestor of `path` is also in the removed set. */
438
+ function hasRemovedAncestor(path, removed) {
439
+ let cursor = path;
440
+ for (;;) {
441
+ const idx = cursor.lastIndexOf('.');
442
+ if (idx === -1)
443
+ return false;
444
+ cursor = cursor.slice(0, idx);
445
+ // A parent may be recorded with or without its array marker.
446
+ if (removed.has(cursor) || removed.has(cursor.replace(/\[\]$/, '')))
447
+ return true;
448
+ }
449
+ }
450
+ function leaf(path) {
451
+ const idx = path.lastIndexOf('.');
452
+ return idx === -1 ? path : path.slice(idx + 1);
453
+ }
454
+ /**
455
+ * Guard against pairing two unrelated fields that merely share a type.
456
+ *
457
+ * Without this, a tipping config dropping the `bgn` currency and adding `gip`
458
+ * reads as "rename bgn to gip", which is nonsense and would send someone to the
459
+ * wrong field. A real rename keeps most of the name: either one contains the
460
+ * other (`risk_level` -> `level`) or they differ by a small edit.
461
+ */
462
+ function namesLookRelated(a, b) {
463
+ if (a === b)
464
+ return true;
465
+ const x = a.toLowerCase();
466
+ const y = b.toLowerCase();
467
+ if (x.includes(y) || y.includes(x))
468
+ return true;
469
+ // Shared token, e.g. `card_expiry_year` -> `expiry_year_card`.
470
+ const tokens = (s) => new Set(s.split(/[._-]/).filter((t) => t.length > 2));
471
+ const ta = tokens(x);
472
+ const tb = tokens(y);
473
+ for (const t of ta)
474
+ if (tb.has(t))
475
+ return true;
476
+ const longer = Math.max(x.length, y.length);
477
+ if (longer < 5)
478
+ return false; // too short for edit distance to mean anything
479
+ return editDistance(x, y) / longer <= 0.34;
480
+ }
481
+ function editDistance(a, b) {
482
+ let prev = Array.from({ length: b.length + 1 }, (_, i) => i);
483
+ for (let i = 1; i <= a.length; i++) {
484
+ const row = [i];
485
+ for (let j = 1; j <= b.length; j++) {
486
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
487
+ row[j] = Math.min(row[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
488
+ }
489
+ prev = row;
490
+ }
491
+ return prev[b.length];
492
+ }
493
+ function describe(location) {
494
+ switch (location) {
495
+ case 'requestBody':
496
+ return 'Request parameter';
497
+ case 'queryParam':
498
+ return 'Query parameter';
499
+ case 'pathParam':
500
+ return 'Path parameter';
501
+ case 'response':
502
+ return 'Response field';
503
+ case 'event':
504
+ return 'Webhook event';
505
+ case 'operation':
506
+ return 'Endpoint';
507
+ }
508
+ }
509
+ function byImpact(a, b) {
510
+ const rank = { breaking: 0, deprecating: 1, additive: 2 };
511
+ if (rank[a.severity] !== rank[b.severity])
512
+ return rank[a.severity] - rank[b.severity];
513
+ const aKey = a.path ?? a.resource ?? a.event ?? '';
514
+ const bKey = b.path ?? b.resource ?? b.event ?? '';
515
+ return aKey.localeCompare(bKey) || (a.field ?? '').localeCompare(b.field ?? '');
516
+ }
517
+ /** Sequential, stable ids scoped to the target version. */
518
+ class IdAllocator {
519
+ version;
520
+ n = 0;
521
+ constructor(version) {
522
+ this.version = version;
523
+ }
524
+ next() {
525
+ this.n += 1;
526
+ return `stripe-${this.version}-${String(this.n).padStart(4, '0')}`;
527
+ }
528
+ }
529
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/specdiff/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=diff.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.test.d.ts","sourceRoot":"","sources":["../../src/specdiff/diff.test.ts"],"names":[],"mappings":""}