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,166 @@
1
+ /**
2
+ * Just enough OpenAPI to diff Stripe's spec. Deliberately not a general-purpose
3
+ * OpenAPI library: Stripe's spec is consistent, so the narrow reader stays
4
+ * small and fast over a 10MB document.
5
+ */
6
+ export interface SchemaNode {
7
+ $ref?: string;
8
+ type?: string | string[];
9
+ properties?: Record<string, SchemaNode>;
10
+ required?: string[];
11
+ items?: SchemaNode;
12
+ enum?: unknown[];
13
+ anyOf?: SchemaNode[];
14
+ oneOf?: SchemaNode[];
15
+ allOf?: SchemaNode[];
16
+ nullable?: boolean;
17
+ deprecated?: boolean;
18
+ format?: string;
19
+ description?: string;
20
+ additionalProperties?: boolean | SchemaNode;
21
+ 'x-expandableFields'?: string[];
22
+ 'x-resourceId'?: string;
23
+ 'x-stripeOperations'?: StripeOperation[];
24
+ 'x-stripeResource'?: {
25
+ class_name?: string;
26
+ in_package?: string;
27
+ };
28
+ 'x-stripeEvent'?: {
29
+ type?: string;
30
+ };
31
+ }
32
+ export interface StripeOperation {
33
+ method_name?: string;
34
+ method_on?: string;
35
+ method_type?: string;
36
+ operation?: string;
37
+ path?: string;
38
+ }
39
+ export interface ParameterNode {
40
+ name?: string;
41
+ in?: 'query' | 'path' | 'header' | 'cookie';
42
+ required?: boolean;
43
+ deprecated?: boolean;
44
+ schema?: SchemaNode;
45
+ description?: string;
46
+ }
47
+ export interface OperationNode {
48
+ operationId?: string;
49
+ summary?: string;
50
+ description?: string;
51
+ deprecated?: boolean;
52
+ parameters?: ParameterNode[];
53
+ requestBody?: {
54
+ required?: boolean;
55
+ content?: Record<string, {
56
+ schema?: SchemaNode;
57
+ }>;
58
+ };
59
+ responses?: Record<string, {
60
+ content?: Record<string, {
61
+ schema?: SchemaNode;
62
+ }>;
63
+ }>;
64
+ }
65
+ export interface OpenApiSpec {
66
+ openapi?: string;
67
+ info?: {
68
+ version?: string;
69
+ title?: string;
70
+ };
71
+ paths: Record<string, Record<string, OperationNode | unknown>>;
72
+ components?: {
73
+ schemas?: Record<string, SchemaNode>;
74
+ };
75
+ }
76
+ export declare const HTTP_METHODS: readonly ["get", "post", "put", "patch", "delete", "head", "options"];
77
+ export type HttpMethod = (typeof HTTP_METHODS)[number];
78
+ export declare function isHttpMethod(key: string): key is HttpMethod;
79
+ /** Every (path, method, operation) triple in the spec. */
80
+ export declare function operations(spec: OpenApiSpec): Generator<{
81
+ path: string;
82
+ method: HttpMethod;
83
+ op: OperationNode;
84
+ }>;
85
+ export declare function refName(ref: string): string | null;
86
+ export declare function deref(spec: OpenApiSpec, node: SchemaNode | undefined): SchemaNode | undefined;
87
+ /** Stripe uses form encoding for requests and JSON for responses. */
88
+ export declare function requestSchema(spec: OpenApiSpec, op: OperationNode): SchemaNode | undefined;
89
+ export declare function responseSchema(spec: OpenApiSpec, op: OperationNode): SchemaNode | undefined;
90
+ /**
91
+ * A stable, comparable description of a schema's type.
92
+ *
93
+ * Two fields with equal signatures are wire-compatible for our purposes. Object
94
+ * children are not inlined — the flattener emits them as their own entries — so
95
+ * a nested rename shows up at its own path rather than as a type change on the
96
+ * parent.
97
+ */
98
+ export declare function typeSignature(spec: OpenApiSpec, node: SchemaNode | undefined, refStack?: ReadonlySet<string>, depth?: number): string;
99
+ export interface FieldInfo {
100
+ /** Dotted path, e.g. `card.exp_year` or `lines.data[].amount`. */
101
+ path: string;
102
+ typeSig: string;
103
+ /** Listed in its immediate parent's `required` array. */
104
+ required: boolean;
105
+ /**
106
+ * Required *and* every ancestor is too — i.e. genuinely mandatory on every
107
+ * request. A field marked required inside an optional object only binds when
108
+ * the caller sends that object, which is a much weaker claim.
109
+ */
110
+ requiredPath: boolean;
111
+ deprecated: boolean;
112
+ /** Name of the resource schema the field was reached through, if any. */
113
+ viaResource?: string;
114
+ }
115
+ export interface FlattenOptions {
116
+ /** How deep to descend into nested objects. Stripe responses nest a long way. */
117
+ maxDepth?: number;
118
+ /** Hard cap so one pathological schema cannot stall a diff. */
119
+ maxFields?: number;
120
+ }
121
+ /**
122
+ * Flatten a schema into dotted field paths.
123
+ *
124
+ * Arrays contribute a `[]` segment so `lines.data[].amount` is distinguishable
125
+ * from `lines.data.amount`. Recursion through a `$ref` already on the current
126
+ * branch stops, which is what keeps Stripe's mutually recursive resources finite.
127
+ */
128
+ export declare function flattenSchema(spec: OpenApiSpec, root: SchemaNode | undefined, options?: FlattenOptions): Map<string, FieldInfo>;
129
+ /**
130
+ * Flatten a schema treating every `$ref` as a boundary.
131
+ *
132
+ * This is what makes the diff stable. Expanding refs produces field sets that
133
+ * depend on traversal order and on which refs happen to be on the current
134
+ * branch, so two independently expanded trees disagree in thousands of places
135
+ * for reasons that have nothing to do with the API changing. Stopping at refs
136
+ * means every component schema is diffed exactly once, on its own terms, and a
137
+ * nested resource's changes are reported against that resource.
138
+ */
139
+ export declare function flattenOwnFields(spec: OpenApiSpec, root: SchemaNode | undefined, options?: {
140
+ maxDepth?: number;
141
+ }): Map<string, FieldInfo>;
142
+ /** A place in a response where some schema shows up. */
143
+ export interface ReadSite {
144
+ method: HttpMethod;
145
+ path: string;
146
+ /** Dotted prefix from the response root, `''` when the schema is the root. */
147
+ prefix: string;
148
+ }
149
+ /**
150
+ * For every component schema, where a caller would read it from.
151
+ *
152
+ * Computed on a single spec — it is attribution metadata, never a diff input —
153
+ * so it can follow refs freely without destabilising anything. This is what lets
154
+ * "`refund.foo` was removed" cite `charge.refunds.data[].foo` at the call site
155
+ * that actually reads it.
156
+ */
157
+ export declare function buildReadSites(spec: OpenApiSpec, maxDepth?: number): Map<string, ReadSite[]>;
158
+ /**
159
+ * Webhook event types -> the schema that declares them.
160
+ *
161
+ * In Stripe's SDK spec the schema name and the event type are the same string
162
+ * (`invoice.payment_failed`), but read `x-stripeEvent.type` as the authority and
163
+ * fall back to the key.
164
+ */
165
+ export declare function eventTypes(spec: OpenApiSpec): Map<string, string>;
166
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/specdiff/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * Just enough OpenAPI to diff Stripe's spec. Deliberately not a general-purpose
3
+ * OpenAPI library: Stripe's spec is consistent, so the narrow reader stays
4
+ * small and fast over a 10MB document.
5
+ */
6
+ export const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'];
7
+ export function isHttpMethod(key) {
8
+ return HTTP_METHODS.includes(key);
9
+ }
10
+ /** Every (path, method, operation) triple in the spec. */
11
+ export function* operations(spec) {
12
+ for (const [path, item] of Object.entries(spec.paths ?? {})) {
13
+ if (!item || typeof item !== 'object')
14
+ continue;
15
+ for (const [key, value] of Object.entries(item)) {
16
+ if (!isHttpMethod(key))
17
+ continue;
18
+ if (!value || typeof value !== 'object')
19
+ continue;
20
+ yield { path, method: key, op: value };
21
+ }
22
+ }
23
+ }
24
+ export function refName(ref) {
25
+ const prefix = '#/components/schemas/';
26
+ return ref.startsWith(prefix) ? ref.slice(prefix.length) : null;
27
+ }
28
+ export function deref(spec, node) {
29
+ let current = node;
30
+ // Chained refs are rare but cheap to guard against.
31
+ for (let i = 0; current?.$ref && i < 10; i++) {
32
+ const name = refName(current.$ref);
33
+ if (name === null)
34
+ return undefined;
35
+ current = spec.components?.schemas?.[name];
36
+ }
37
+ return current;
38
+ }
39
+ /** Stripe uses form encoding for requests and JSON for responses. */
40
+ export function requestSchema(spec, op) {
41
+ const content = op.requestBody?.content;
42
+ if (!content)
43
+ return undefined;
44
+ const media = content['application/x-www-form-urlencoded'] ??
45
+ content['application/json'] ??
46
+ content['multipart/form-data'] ??
47
+ Object.values(content)[0];
48
+ return deref(spec, media?.schema);
49
+ }
50
+ export function responseSchema(spec, op) {
51
+ const ok = op.responses?.['200'] ?? op.responses?.['201'] ?? op.responses?.['default'];
52
+ const media = ok?.content?.['application/json'] ?? Object.values(ok?.content ?? {})[0];
53
+ return deref(spec, media?.schema);
54
+ }
55
+ /**
56
+ * A stable, comparable description of a schema's type.
57
+ *
58
+ * Two fields with equal signatures are wire-compatible for our purposes. Object
59
+ * children are not inlined — the flattener emits them as their own entries — so
60
+ * a nested rename shows up at its own path rather than as a type change on the
61
+ * parent.
62
+ */
63
+ export function typeSignature(spec, node, refStack = new Set(), depth = 0) {
64
+ if (!node)
65
+ return 'unknown';
66
+ if (depth > 6)
67
+ return 'deep';
68
+ if (node.$ref) {
69
+ const name = refName(node.$ref);
70
+ if (name === null)
71
+ return 'unknown';
72
+ if (refStack.has(name))
73
+ return `ref(${name})`;
74
+ const next = new Set(refStack);
75
+ next.add(name);
76
+ const target = spec.components?.schemas?.[name];
77
+ // Name the ref rather than inlining it: a resource swapping identity is a
78
+ // change we want to see, and inlining 1000 properties is pointless here.
79
+ const inner = typeSignature(spec, target, next, depth + 1);
80
+ return inner === 'object' ? `object(${name})` : inner;
81
+ }
82
+ const union = node.anyOf ?? node.oneOf;
83
+ if (union && union.length > 0) {
84
+ const parts = union.map((m) => typeSignature(spec, m, refStack, depth + 1)).sort();
85
+ return parts.length === 1 ? parts[0] : `union(${[...new Set(parts)].join('|')})`;
86
+ }
87
+ if (node.allOf && node.allOf.length > 0) {
88
+ const parts = node.allOf.map((m) => typeSignature(spec, m, refStack, depth + 1)).sort();
89
+ return `all(${[...new Set(parts)].join('&')})`;
90
+ }
91
+ if (node.enum && node.enum.length > 0) {
92
+ const values = node.enum.map((v) => String(v)).sort();
93
+ return `enum(${values.join('|')})`;
94
+ }
95
+ const type = Array.isArray(node.type) ? node.type.slice().sort().join('|') : node.type;
96
+ if (type === 'array')
97
+ return `array<${typeSignature(spec, node.items, refStack, depth + 1)}>`;
98
+ if (type === 'object' || node.properties)
99
+ return 'object';
100
+ if (type === undefined)
101
+ return 'unknown';
102
+ return node.format ? `${type}:${node.format}` : type;
103
+ }
104
+ /**
105
+ * Flatten a schema into dotted field paths.
106
+ *
107
+ * Arrays contribute a `[]` segment so `lines.data[].amount` is distinguishable
108
+ * from `lines.data.amount`. Recursion through a `$ref` already on the current
109
+ * branch stops, which is what keeps Stripe's mutually recursive resources finite.
110
+ */
111
+ export function flattenSchema(spec, root, options = {}) {
112
+ const maxDepth = options.maxDepth ?? 4;
113
+ const maxFields = options.maxFields ?? 4000;
114
+ const out = new Map();
115
+ if (!root)
116
+ return out;
117
+ const visit = (node, prefix, depth, refStack, viaResource) => {
118
+ if (!node || depth > maxDepth || out.size >= maxFields)
119
+ return;
120
+ if (node.$ref) {
121
+ const name = refName(node.$ref);
122
+ if (name === null || refStack.has(name))
123
+ return;
124
+ const next = new Set(refStack);
125
+ next.add(name);
126
+ visit(spec.components?.schemas?.[name], prefix, depth, next, viaResource ?? name);
127
+ return;
128
+ }
129
+ for (const member of [...(node.allOf ?? []), ...(node.anyOf ?? []), ...(node.oneOf ?? [])]) {
130
+ visit(member, prefix, depth, refStack, viaResource);
131
+ }
132
+ const itemType = Array.isArray(node.type) ? node.type : node.type ? [node.type] : [];
133
+ if (itemType.includes('array') && node.items) {
134
+ visit(node.items, `${prefix}[]`, depth, refStack, viaResource);
135
+ }
136
+ const props = node.properties;
137
+ if (!props)
138
+ return;
139
+ const required = new Set(node.required ?? []);
140
+ for (const [name, child] of Object.entries(props)) {
141
+ if (out.size >= maxFields)
142
+ return;
143
+ const path = prefix === '' ? name : `${prefix}.${name}`;
144
+ const resolved = child.$ref ? deref(spec, child) : child;
145
+ if (!out.has(path)) {
146
+ out.set(path, {
147
+ path,
148
+ typeSig: typeSignature(spec, child, refStack),
149
+ required: required.has(name),
150
+ requiredPath: required.has(name),
151
+ deprecated: child.deprecated === true || resolved?.deprecated === true,
152
+ ...(viaResource ? { viaResource } : {}),
153
+ });
154
+ }
155
+ visit(child, path, depth + 1, refStack, viaResource);
156
+ }
157
+ };
158
+ visit(root, '', 0, new Set(), root['x-resourceId']);
159
+ return out;
160
+ }
161
+ /**
162
+ * Flatten a schema treating every `$ref` as a boundary.
163
+ *
164
+ * This is what makes the diff stable. Expanding refs produces field sets that
165
+ * depend on traversal order and on which refs happen to be on the current
166
+ * branch, so two independently expanded trees disagree in thousands of places
167
+ * for reasons that have nothing to do with the API changing. Stopping at refs
168
+ * means every component schema is diffed exactly once, on its own terms, and a
169
+ * nested resource's changes are reported against that resource.
170
+ */
171
+ export function flattenOwnFields(spec, root, options = {}) {
172
+ const maxDepth = options.maxDepth ?? 3;
173
+ const out = new Map();
174
+ if (!root)
175
+ return out;
176
+ const visit = (node, prefix, depth, parentRequired) => {
177
+ if (!node || depth > maxDepth)
178
+ return;
179
+ // Only compose in-place members; a `$ref` child is someone else's schema.
180
+ for (const member of [...(node.allOf ?? []), ...(node.anyOf ?? []), ...(node.oneOf ?? [])]) {
181
+ if (member.$ref)
182
+ continue;
183
+ visit(member, prefix, depth, parentRequired);
184
+ }
185
+ const types = Array.isArray(node.type) ? node.type : node.type ? [node.type] : [];
186
+ if (types.includes('array') && node.items && !node.items.$ref) {
187
+ visit(node.items, `${prefix}[]`, depth, parentRequired);
188
+ }
189
+ const props = node.properties;
190
+ if (!props)
191
+ return;
192
+ const required = new Set(node.required ?? []);
193
+ for (const [name, child] of Object.entries(props)) {
194
+ const path = prefix === '' ? name : `${prefix}.${name}`;
195
+ const requiredHere = required.has(name);
196
+ if (!out.has(path)) {
197
+ out.set(path, {
198
+ path,
199
+ typeSig: typeSignature(spec, child),
200
+ required: requiredHere,
201
+ requiredPath: parentRequired && requiredHere,
202
+ deprecated: child.deprecated === true,
203
+ });
204
+ }
205
+ if (!child.$ref)
206
+ visit(child, path, depth + 1, parentRequired && requiredHere);
207
+ }
208
+ };
209
+ visit(root, '', 0, true);
210
+ return out;
211
+ }
212
+ /**
213
+ * For every component schema, where a caller would read it from.
214
+ *
215
+ * Computed on a single spec — it is attribution metadata, never a diff input —
216
+ * so it can follow refs freely without destabilising anything. This is what lets
217
+ * "`refund.foo` was removed" cite `charge.refunds.data[].foo` at the call site
218
+ * that actually reads it.
219
+ */
220
+ export function buildReadSites(spec, maxDepth = 3) {
221
+ const out = new Map();
222
+ const add = (schemaName, site) => {
223
+ let bucket = out.get(schemaName);
224
+ if (!bucket) {
225
+ bucket = [];
226
+ out.set(schemaName, bucket);
227
+ }
228
+ // Many endpoints return the same resource at the same prefix; keep it small.
229
+ if (bucket.length < 40)
230
+ bucket.push(site);
231
+ };
232
+ for (const { path, method, op } of operations(spec)) {
233
+ const rootNode = op.responses?.['200']?.content?.['application/json']?.schema;
234
+ if (!rootNode)
235
+ continue;
236
+ const walk = (node, prefix, depth, seen) => {
237
+ if (!node || depth > maxDepth)
238
+ return;
239
+ if (node.$ref) {
240
+ const name = refName(node.$ref);
241
+ if (name === null || seen.has(name))
242
+ return;
243
+ add(name, { method, path, prefix });
244
+ const next = new Set(seen);
245
+ next.add(name);
246
+ walk(spec.components?.schemas?.[name], prefix, depth, next);
247
+ return;
248
+ }
249
+ for (const member of [...(node.allOf ?? []), ...(node.anyOf ?? []), ...(node.oneOf ?? [])]) {
250
+ walk(member, prefix, depth, seen);
251
+ }
252
+ const types = Array.isArray(node.type) ? node.type : node.type ? [node.type] : [];
253
+ if (types.includes('array') && node.items)
254
+ walk(node.items, `${prefix}[]`, depth, seen);
255
+ for (const [name, child] of Object.entries(node.properties ?? {})) {
256
+ walk(child, prefix === '' ? name : `${prefix}.${name}`, depth + 1, seen);
257
+ }
258
+ };
259
+ walk(rootNode, '', 0, new Set());
260
+ }
261
+ return out;
262
+ }
263
+ /**
264
+ * Webhook event types -> the schema that declares them.
265
+ *
266
+ * In Stripe's SDK spec the schema name and the event type are the same string
267
+ * (`invoice.payment_failed`), but read `x-stripeEvent.type` as the authority and
268
+ * fall back to the key.
269
+ */
270
+ export function eventTypes(spec) {
271
+ const out = new Map();
272
+ const schemas = spec.components?.schemas ?? {};
273
+ for (const [name, schema] of Object.entries(schemas)) {
274
+ const ev = schema['x-stripeEvent'];
275
+ if (!ev || typeof ev !== 'object')
276
+ continue;
277
+ const type = typeof ev.type === 'string' && ev.type !== '' ? ev.type : name;
278
+ out.set(type, name);
279
+ }
280
+ return out;
281
+ }
282
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/specdiff/openapi.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "apiwatcher-cli",
3
+ "version": "0.1.0",
4
+ "description": "Find every call site a breaking API change affects. Stripe + TypeScript.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "apiwatcher": "dist/cli/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": "./dist/index.js"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "data",
18
+ "changesets"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "typecheck": "tsc -p tsconfig.json --noEmit",
23
+ "test": "node --test \"dist/**/*.test.js\"",
24
+ "prepack": "node ../../scripts/stage-package-data.mjs"
25
+ },
26
+ "dependencies": {
27
+ "typescript": "^5.6.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.0.0",
31
+ "stripe": "^22.6.2"
32
+ }
33
+ }