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,30 @@
1
+ import type { Changeset } from './types.js';
2
+ /**
3
+ * A tiny manifest of everything the spec watcher has published.
4
+ *
5
+ * The GitHub App reads only this file to learn whether a new Stripe version
6
+ * exists, so the worker never has to download a 10MB spec or enumerate a
7
+ * directory over the API.
8
+ */
9
+ export interface ChangesetIndex {
10
+ api: 'stripe';
11
+ /** Newest `to` version across all changesets. */
12
+ latest: string | null;
13
+ generatedAt: string;
14
+ entries: Array<{
15
+ from: string;
16
+ to: string;
17
+ file: string;
18
+ breaking: number;
19
+ deprecating: number;
20
+ additive: number;
21
+ /** Spec commit this changeset ended at, so the watcher can diff forward. */
22
+ toRef?: string;
23
+ }>;
24
+ }
25
+ export declare function buildIndex(changesets: ReadonlyArray<{
26
+ changeset: Changeset;
27
+ file: string;
28
+ }>): ChangesetIndex;
29
+ export declare function writeIndex(index: ChangesetIndex, dir: string): Promise<string>;
30
+ //# sourceMappingURL=index-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-file.d.ts","sourceRoot":"","sources":["../../src/changeset/index-file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,QAAQ,CAAC;IACd,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,4EAA4E;QAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED,wBAAgB,UAAU,CACxB,UAAU,EAAE,aAAa,CAAC;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAChE,cAAc,CAwBhB;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpF"}
@@ -0,0 +1,34 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { compareApiVersions } from './version.js';
4
+ export function buildIndex(changesets) {
5
+ const entries = changesets
6
+ .map(({ changeset, file }) => {
7
+ const count = (severity) => changeset.changes.filter((c) => c.severity === severity).length;
8
+ return {
9
+ from: changeset.from,
10
+ to: changeset.to,
11
+ file,
12
+ breaking: count('breaking'),
13
+ deprecating: count('deprecating'),
14
+ additive: count('additive'),
15
+ ...(changeset.source?.toRef ? { toRef: changeset.source.toRef } : {}),
16
+ };
17
+ })
18
+ .sort((a, b) => compareApiVersions(a.to, b.to));
19
+ const last = entries[entries.length - 1];
20
+ return {
21
+ api: 'stripe',
22
+ latest: last?.to ?? null,
23
+ generatedAt: new Date().toISOString(),
24
+ entries,
25
+ };
26
+ }
27
+ export async function writeIndex(index, dir) {
28
+ const target = resolve(dir);
29
+ await mkdir(target, { recursive: true });
30
+ const file = join(target, 'index.json');
31
+ await writeFile(file, `${JSON.stringify(index, null, 2)}\n`, 'utf8');
32
+ return file;
33
+ }
34
+ //# sourceMappingURL=index-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-file.js","sourceRoot":"","sources":["../../src/changeset/index-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AA0BlD,MAAM,UAAU,UAAU,CACxB,UAAiE;IAEjE,MAAM,OAAO,GAAG,UAAU;SACvB,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAU,EAAE,CACzC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QAClE,OAAO;YACL,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,EAAE,EAAE,SAAS,CAAC,EAAE;YAChB,IAAI;YACJ,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;YAC3B,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC;YACjC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;YAC3B,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAElD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;QACxB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAqB,EAAE,GAAW;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Changeset, SpecChange } from './types.js';
2
+ /**
3
+ * Changesets ship inside the package, but during development they live at the
4
+ * repo root. Walk up until we find a `changesets/` directory so both work.
5
+ */
6
+ export declare function defaultChangesetDir(): string;
7
+ /** Narrow, explicit validation. A malformed changeset should fail loudly at load. */
8
+ export declare function validateChangeset(raw: unknown, origin: string): Changeset;
9
+ export declare function loadChangeset(file: string): Promise<Changeset>;
10
+ /** Every changeset for one API, oldest `to` version first. */
11
+ export declare function loadChangesets(dir?: string, api?: string): Promise<Changeset[]>;
12
+ /**
13
+ * Flatten every change that sits strictly after `from` and at or before `to`.
14
+ *
15
+ * Changesets are per-version-pair, so upgrading across three releases means
16
+ * unioning three changesets. Ids are globally unique, which makes dedupe free.
17
+ */
18
+ export declare function changesBetween(sets: Changeset[], from: string, to: string): SpecChange[];
19
+ /** The newest `to` version across all known changesets — i.e. "latest we know about". */
20
+ export declare function latestKnownVersion(sets: Changeset[]): string | null;
21
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/changeset/load.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAMxD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CA+BzE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CASpE;AAKD,8DAA8D;AAC9D,wBAAsB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,SAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAQvF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,EAAE,CAcxF;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,GAAG,IAAI,CAMnE"}
@@ -0,0 +1,113 @@
1
+ import { readdir, readFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { join, dirname, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { SCHEMA_VERSION } from './types.js';
6
+ import { compareApiVersions, isApiVersion } from './version.js';
7
+ const HERE = dirname(fileURLToPath(import.meta.url));
8
+ /**
9
+ * Changesets ship inside the package, but during development they live at the
10
+ * repo root. Walk up until we find a `changesets/` directory so both work.
11
+ */
12
+ export function defaultChangesetDir() {
13
+ let dir = HERE;
14
+ for (let i = 0; i < 8; i++) {
15
+ const candidate = join(dir, 'changesets');
16
+ if (existsSync(candidate))
17
+ return candidate;
18
+ const parent = dirname(dir);
19
+ if (parent === dir)
20
+ break;
21
+ dir = parent;
22
+ }
23
+ throw new Error('Could not locate a changesets/ directory. Pass --changesets <dir>.');
24
+ }
25
+ /** Narrow, explicit validation. A malformed changeset should fail loudly at load. */
26
+ export function validateChangeset(raw, origin) {
27
+ if (typeof raw !== 'object' || raw === null) {
28
+ throw new Error(`${origin}: changeset is not an object`);
29
+ }
30
+ const cs = raw;
31
+ if (cs.schemaVersion !== SCHEMA_VERSION) {
32
+ throw new Error(`${origin}: unsupported schemaVersion ${String(cs.schemaVersion)} (this build reads ${SCHEMA_VERSION})`);
33
+ }
34
+ if (cs.api !== 'stripe')
35
+ throw new Error(`${origin}: unsupported api ${String(cs.api)}`);
36
+ for (const key of ['from', 'to']) {
37
+ const v = cs[key];
38
+ if (typeof v !== 'string' || !isApiVersion(v)) {
39
+ throw new Error(`${origin}: invalid "${key}" version: ${String(v)}`);
40
+ }
41
+ }
42
+ if (!Array.isArray(cs.changes))
43
+ throw new Error(`${origin}: "changes" must be an array`);
44
+ const seen = new Set();
45
+ for (const ch of cs.changes) {
46
+ if (!ch || typeof ch.id !== 'string' || ch.id === '') {
47
+ throw new Error(`${origin}: a change is missing an id`);
48
+ }
49
+ if (seen.has(ch.id))
50
+ throw new Error(`${origin}: duplicate change id ${ch.id}`);
51
+ seen.add(ch.id);
52
+ if (typeof ch.note !== 'string' || ch.note === '') {
53
+ throw new Error(`${origin}: change ${ch.id} is missing a note`);
54
+ }
55
+ }
56
+ return cs;
57
+ }
58
+ export async function loadChangeset(file) {
59
+ const text = await readFile(file, 'utf8');
60
+ let parsed;
61
+ try {
62
+ parsed = JSON.parse(text);
63
+ }
64
+ catch (err) {
65
+ throw new Error(`${file}: invalid JSON (${err.message})`);
66
+ }
67
+ return validateChangeset(parsed, file);
68
+ }
69
+ /** Files that live beside changesets but are not changesets. */
70
+ const NON_CHANGESET_FILES = new Set(['index.json']);
71
+ /** Every changeset for one API, oldest `to` version first. */
72
+ export async function loadChangesets(dir, api = 'stripe') {
73
+ const root = resolve(dir ?? defaultChangesetDir(), api);
74
+ if (!existsSync(root))
75
+ return [];
76
+ const names = (await readdir(root)).filter((n) => n.endsWith('.json') && !NON_CHANGESET_FILES.has(n));
77
+ const sets = await Promise.all(names.map((n) => loadChangeset(join(root, n))));
78
+ return sets.sort((a, b) => compareApiVersions(a.to, b.to));
79
+ }
80
+ /**
81
+ * Flatten every change that sits strictly after `from` and at or before `to`.
82
+ *
83
+ * Changesets are per-version-pair, so upgrading across three releases means
84
+ * unioning three changesets. Ids are globally unique, which makes dedupe free.
85
+ */
86
+ export function changesBetween(sets, from, to) {
87
+ const out = [];
88
+ const seen = new Set();
89
+ for (const cs of sets) {
90
+ // Include a changeset when its window overlaps (from, to].
91
+ if (compareApiVersions(cs.to, from) <= 0)
92
+ continue;
93
+ if (compareApiVersions(cs.from, to) >= 0)
94
+ continue;
95
+ for (const ch of cs.changes) {
96
+ if (seen.has(ch.id))
97
+ continue;
98
+ seen.add(ch.id);
99
+ out.push(ch);
100
+ }
101
+ }
102
+ return out;
103
+ }
104
+ /** The newest `to` version across all known changesets — i.e. "latest we know about". */
105
+ export function latestKnownVersion(sets) {
106
+ let latest = null;
107
+ for (const cs of sets) {
108
+ if (latest === null || compareApiVersions(cs.to, latest) > 0)
109
+ latest = cs.to;
110
+ }
111
+ return latest;
112
+ }
113
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/changeset/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * The changeset is the contract between the spec watcher and the scanner.
3
+ * Everything else in this repo either produces one of these or consumes one.
4
+ *
5
+ * Keep it boring and additive. A changeset committed today must still parse in
6
+ * a year, because customers pin old versions of the CLI.
7
+ */
8
+ export declare const SCHEMA_VERSION: 1;
9
+ /** What kind of change happened in the spec. */
10
+ export type ChangeKind = 'removed' | 'renamed' | 'typeChanged' | 'required' | 'deprecated' | 'added';
11
+ /**
12
+ * How much the change can hurt.
13
+ *
14
+ * `breaking` means existing correct code becomes incorrect. `deprecating` means
15
+ * it still works today. `additive` never breaks anything and is reported only
16
+ * so the changelog is complete.
17
+ */
18
+ export type Severity = 'breaking' | 'deprecating' | 'additive';
19
+ /** Where in the request/response the changed field lives. */
20
+ export type Location = 'requestBody' | 'queryParam' | 'pathParam' | 'response' | 'operation' | 'event';
21
+ export interface SpecChange {
22
+ /** Stable id: `<api>-<toVersion>-<nnn>`. Used to dedupe and to ignore. */
23
+ id: string;
24
+ kind: ChangeKind;
25
+ severity: Severity;
26
+ location: Location;
27
+ /** Endpoint path, e.g. `/v1/customers/{customer}`. Absent for event changes. */
28
+ path?: string;
29
+ /** Lowercase HTTP method, e.g. `post`. Absent for event changes. */
30
+ method?: string;
31
+ /** Resource schema this change belongs to, e.g. `payment_intent`. */
32
+ resource?: string;
33
+ /**
34
+ * Dotted field path within `location`, e.g. `card.exp_year`. Absent when the
35
+ * change is to the operation itself.
36
+ */
37
+ field?: string;
38
+ /** For `renamed`, the new name. For `removed`, a suggested stand-in if one exists. */
39
+ replacement?: string;
40
+ /** For `typeChanged`. Free-form OpenAPI type descriptions. */
41
+ fromType?: string;
42
+ toType?: string;
43
+ /** Webhook event type, e.g. `invoice.payment_failed`. Only for `location: 'event'`. */
44
+ event?: string;
45
+ /** One line, human-readable. Shown verbatim in the report. */
46
+ note: string;
47
+ docsUrl?: string;
48
+ /**
49
+ * SDK call sites this change can reach, precomputed at diff time so the
50
+ * scanner never has to resolve endpoints itself.
51
+ */
52
+ sdkMethods?: SdkMethodRef[];
53
+ /**
54
+ * Response changes are diffed once per resource schema, then attributed to
55
+ * every endpoint that returns it. These are the endpoints affected.
56
+ */
57
+ endpoints?: EndpointRef[];
58
+ /**
59
+ * Dotted paths a caller would actually read the changed field through, e.g.
60
+ * `refunds.data[].destination_details` for a change on the `refund` schema.
61
+ * `field` stays relative to the owning resource; these are what call sites
62
+ * look like.
63
+ */
64
+ fieldPaths?: string[];
65
+ }
66
+ export interface EndpointRef {
67
+ /** Lowercase HTTP method. */
68
+ method: string;
69
+ path: string;
70
+ }
71
+ export interface SdkMethodRef {
72
+ /** Dotted accessor on the client, e.g. `paymentIntents` or `checkout.sessions`. */
73
+ namespace: string;
74
+ /** Method name, e.g. `create`. */
75
+ method: string;
76
+ }
77
+ export interface Changeset {
78
+ schemaVersion: typeof SCHEMA_VERSION;
79
+ api: 'stripe';
80
+ /** Version the diff starts from, e.g. `2025-09-30.clover`. */
81
+ from: string;
82
+ /** Version the diff ends at. */
83
+ to: string;
84
+ /** ISO date the changeset was generated. */
85
+ generatedAt: string;
86
+ /** Provenance, so a suspicious entry can be traced back to a spec commit. */
87
+ source?: {
88
+ repo: string;
89
+ fromRef: string;
90
+ toRef: string;
91
+ };
92
+ changes: SpecChange[];
93
+ }
94
+ /** Ordering used everywhere a list of changes is displayed. */
95
+ export declare const SEVERITY_RANK: Record<Severity, number>;
96
+ export declare function compareSeverity(a: Severity, b: Severity): number;
97
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/changeset/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,cAAc,EAAG,CAAU,CAAC;AAEzC,gDAAgD;AAChD,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,aAAa,GACb,UAAU,GACV,YAAY,GACZ,OAAO,CAAC;AAEZ;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;AAE/D,6DAA6D;AAC7D,MAAM,MAAM,QAAQ,GAChB,aAAa,GACb,YAAY,GACZ,WAAW,GACX,UAAU,GACV,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAE5B;;;OAGG;IACH,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAE1B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,OAAO,cAAc,CAAC;IACrC,GAAG,EAAE,QAAQ,CAAC;IACd,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,+DAA+D;AAC/D,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAIlD,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAEhE"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The changeset is the contract between the spec watcher and the scanner.
3
+ * Everything else in this repo either produces one of these or consumes one.
4
+ *
5
+ * Keep it boring and additive. A changeset committed today must still parse in
6
+ * a year, because customers pin old versions of the CLI.
7
+ */
8
+ export const SCHEMA_VERSION = 1;
9
+ /** Ordering used everywhere a list of changes is displayed. */
10
+ export const SEVERITY_RANK = {
11
+ breaking: 0,
12
+ deprecating: 1,
13
+ additive: 2,
14
+ };
15
+ export function compareSeverity(a, b) {
16
+ return SEVERITY_RANK[a] - SEVERITY_RANK[b];
17
+ }
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/changeset/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAU,CAAC;AAkHzC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,QAAQ,EAAE,CAAC;IACX,WAAW,EAAE,CAAC;IACd,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,CAAW,EAAE,CAAW;IACtD,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Stripe API versions are dated, optionally with a release-train name:
3
+ * `2025-09-30.clover`, `2026-08-26.dahlia`, or bare `2024-06-20`.
4
+ *
5
+ * The date is what orders them; the name is cosmetic. Comparing the date
6
+ * lexicographically is correct because it is zero-padded ISO.
7
+ */
8
+ export interface ParsedVersion {
9
+ raw: string;
10
+ date: string;
11
+ train?: string;
12
+ }
13
+ export declare function parseApiVersion(raw: string): ParsedVersion | null;
14
+ /** Negative if `a` is older. Throws on unparseable input so bad config is loud. */
15
+ export declare function compareApiVersions(a: string, b: string): number;
16
+ export declare function isApiVersion(raw: string): boolean;
17
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/changeset/version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAKjE;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Stripe API versions are dated, optionally with a release-train name:
3
+ * `2025-09-30.clover`, `2026-08-26.dahlia`, or bare `2024-06-20`.
4
+ *
5
+ * The date is what orders them; the name is cosmetic. Comparing the date
6
+ * lexicographically is correct because it is zero-padded ISO.
7
+ */
8
+ const VERSION_RE = /^(\d{4})-(\d{2})-(\d{2})(?:\.([a-z0-9_]+))?$/i;
9
+ export function parseApiVersion(raw) {
10
+ const m = VERSION_RE.exec(raw.trim());
11
+ if (!m)
12
+ return null;
13
+ const [, y, mo, d, train] = m;
14
+ return { raw: raw.trim(), date: `${y}-${mo}-${d}`, ...(train ? { train } : {}) };
15
+ }
16
+ /** Negative if `a` is older. Throws on unparseable input so bad config is loud. */
17
+ export function compareApiVersions(a, b) {
18
+ const pa = parseApiVersion(a);
19
+ const pb = parseApiVersion(b);
20
+ if (!pa)
21
+ throw new Error(`Unrecognized Stripe API version: ${a}`);
22
+ if (!pb)
23
+ throw new Error(`Unrecognized Stripe API version: ${b}`);
24
+ if (pa.date < pb.date)
25
+ return -1;
26
+ if (pa.date > pb.date)
27
+ return 1;
28
+ return 0;
29
+ }
30
+ export function isApiVersion(raw) {
31
+ return parseApiVersion(raw) !== null;
32
+ }
33
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/changeset/version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,UAAU,GAAG,+CAA+C,CAAC;AAQnE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,CAAS,EAAE,CAAS;IACrD,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC;IAClE,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AACvC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A tiny flag parser. The CLI surface is small and stable, so a dependency
3
+ * would cost more than it saves — and `npx apiwatcher` should install fast.
4
+ */
5
+ export interface ParsedArgs {
6
+ command: string | null;
7
+ positionals: string[];
8
+ flags: Map<string, string | boolean>;
9
+ }
10
+ export declare function parseArgs(argv: readonly string[]): ParsedArgs;
11
+ export declare function flagString(args: ParsedArgs, name: string): string | undefined;
12
+ export declare function flagBool(args: ParsedArgs, name: string): boolean | undefined;
13
+ export declare function flagNumber(args: ParsedArgs, name: string): number | undefined;
14
+ export declare function flagList(args: ParsedArgs, name: string): string[] | undefined;
15
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACtC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CA8C7D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG7E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAM5E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAO7E"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * A tiny flag parser. The CLI surface is small and stable, so a dependency
3
+ * would cost more than it saves — and `npx apiwatcher` should install fast.
4
+ */
5
+ export function parseArgs(argv) {
6
+ const flags = new Map();
7
+ const positionals = [];
8
+ let command = null;
9
+ for (let i = 0; i < argv.length; i++) {
10
+ const token = argv[i];
11
+ if (token === undefined)
12
+ continue;
13
+ if (token === '--') {
14
+ positionals.push(...argv.slice(i + 1).filter((t) => t !== undefined));
15
+ break;
16
+ }
17
+ if (token.startsWith('--')) {
18
+ const body = token.slice(2);
19
+ const eq = body.indexOf('=');
20
+ if (eq !== -1) {
21
+ flags.set(body.slice(0, eq), body.slice(eq + 1));
22
+ continue;
23
+ }
24
+ if (body.startsWith('no-')) {
25
+ flags.set(body.slice(3), false);
26
+ continue;
27
+ }
28
+ const next = argv[i + 1];
29
+ if (next !== undefined && !next.startsWith('-')) {
30
+ flags.set(body, next);
31
+ i += 1;
32
+ }
33
+ else {
34
+ flags.set(body, true);
35
+ }
36
+ continue;
37
+ }
38
+ if (token.startsWith('-') && token.length > 1) {
39
+ // Short flags are only used for -h and -v.
40
+ flags.set(token.slice(1), true);
41
+ continue;
42
+ }
43
+ if (command === null)
44
+ command = token;
45
+ else
46
+ positionals.push(token);
47
+ }
48
+ return { command, positionals, flags };
49
+ }
50
+ export function flagString(args, name) {
51
+ const value = args.flags.get(name);
52
+ return typeof value === 'string' ? value : undefined;
53
+ }
54
+ export function flagBool(args, name) {
55
+ const value = args.flags.get(name);
56
+ if (typeof value === 'boolean')
57
+ return value;
58
+ if (value === 'true')
59
+ return true;
60
+ if (value === 'false')
61
+ return false;
62
+ return undefined;
63
+ }
64
+ export function flagNumber(args, name) {
65
+ const value = flagString(args, name);
66
+ if (value === undefined)
67
+ return undefined;
68
+ const n = Number(value);
69
+ if (Number.isNaN(n))
70
+ throw new Error(`--${name} must be a number, got "${value}"`);
71
+ return n;
72
+ }
73
+ export function flagList(args, name) {
74
+ const value = flagString(args, name);
75
+ if (value === undefined)
76
+ return undefined;
77
+ return value
78
+ .split(',')
79
+ .map((s) => s.trim())
80
+ .filter((s) => s !== '');
81
+ }
82
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { listSpecCommits } from '../specdiff/fetch.js';
3
+ /** Useful for the spec watcher: which spec commits exist. */
4
+ export { listSpecCommits };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAgBA,OAAO,EAGL,eAAe,EAIhB,MAAM,sBAAsB,CAAC;AAiZ9B,6DAA6D;AAC7D,OAAO,EAAE,eAAe,EAAE,CAAC"}