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,211 @@
1
+ /** Cap the call sites listed per finding so a big repo still produces a readable report. */
2
+ const SITES_PER_FINDING = 8;
3
+ const COLORS = {
4
+ reset: '\u001b[0m',
5
+ bold: '\u001b[1m',
6
+ dim: '\u001b[2m',
7
+ red: '\u001b[31m',
8
+ yellow: '\u001b[33m',
9
+ cyan: '\u001b[36m',
10
+ green: '\u001b[32m',
11
+ grey: '\u001b[90m',
12
+ };
13
+ export function supportsColor() {
14
+ if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== '')
15
+ return false;
16
+ if (process.env.FORCE_COLOR !== undefined && process.env.FORCE_COLOR !== '0')
17
+ return true;
18
+ return process.stdout.isTTY === true;
19
+ }
20
+ function makePaint(enabled) {
21
+ return (text, ...styles) => {
22
+ if (!enabled)
23
+ return text;
24
+ return `${styles.map((s) => COLORS[s]).join('')}${text}${COLORS.reset}`;
25
+ };
26
+ }
27
+ const SEVERITY_LABEL = {
28
+ breaking: 'BREAKING',
29
+ deprecating: 'DEPRECATED',
30
+ additive: 'ADDED',
31
+ };
32
+ function severityStyle(severity) {
33
+ if (severity === 'breaking')
34
+ return ['red', 'bold'];
35
+ if (severity === 'deprecating')
36
+ return ['yellow'];
37
+ return ['green'];
38
+ }
39
+ function versionLine(report) {
40
+ if (report.currentVersion === null) {
41
+ return 'current version: unknown (no apiVersion pin and no installed SDK found)';
42
+ }
43
+ const how = report.currentVersionSource === 'pinned'
44
+ ? 'pinned in code'
45
+ : 'the installed SDK default — no explicit apiVersion pin';
46
+ return `current version: ${report.currentVersion} (${how})`;
47
+ }
48
+ export function renderTerminal(report, options = {}) {
49
+ const paint = makePaint(options.color ?? supportsColor());
50
+ const out = [];
51
+ out.push(paint('apiwatcher · Stripe', 'bold'));
52
+ out.push(paint(versionLine(report), 'grey'));
53
+ out.push(paint(`target version: ${report.targetVersion}`, 'grey'));
54
+ out.push(paint(`scanned ${report.filesScanned} file(s) under ${report.root}`, 'grey'));
55
+ out.push('');
56
+ if (report.findings.length === 0) {
57
+ out.push(paint('✓ Nothing in this repo is affected by changes in that range.', 'green', 'bold'));
58
+ if (report.unaffectedChanges > 0) {
59
+ out.push(paint(` (${report.unaffectedChanges} change(s) in range touch code you do not use)`, 'grey'));
60
+ }
61
+ out.push(...renderWarnings(report, paint));
62
+ return `${out.join('\n')}\n`;
63
+ }
64
+ const summary = [
65
+ report.totals.breaking > 0
66
+ ? paint(`${report.totals.breaking} breaking`, ...severityStyle('breaking'))
67
+ : null,
68
+ report.totals.deprecating > 0
69
+ ? paint(`${report.totals.deprecating} deprecating`, ...severityStyle('deprecating'))
70
+ : null,
71
+ report.totals.additive > 0 ? paint(`${report.totals.additive} additive`, 'green') : null,
72
+ ].filter((s) => s !== null);
73
+ out.push(`${paint('Impact:', 'bold')} ${summary.join(paint(' · ', 'grey'))}`);
74
+ out.push('');
75
+ for (const finding of report.findings) {
76
+ out.push(renderFindingTerminal(finding, paint));
77
+ out.push('');
78
+ }
79
+ if (report.unaffectedChanges > 0) {
80
+ out.push(paint(`${report.unaffectedChanges} other change(s) in range do not touch this repo.`, 'grey'));
81
+ }
82
+ out.push(...renderWarnings(report, paint));
83
+ return `${out.join('\n')}\n`;
84
+ }
85
+ function renderWarnings(report, paint) {
86
+ if (report.warnings.length === 0)
87
+ return [];
88
+ const out = ['', paint('Notes:', 'dim')];
89
+ for (const w of report.warnings)
90
+ out.push(paint(` · ${w}`, 'grey'));
91
+ return out;
92
+ }
93
+ function renderFindingTerminal(finding, paint) {
94
+ const { change, sites } = finding;
95
+ const lines = [];
96
+ const tag = paint(SEVERITY_LABEL[finding.severity], ...severityStyle(finding.severity));
97
+ const where = change.path
98
+ ? `${String(change.method ?? '').toUpperCase()} ${change.path}`
99
+ : (change.event ?? '');
100
+ lines.push(`${tag} ${paint(where, 'cyan')} ${paint(change.id, 'grey')}`);
101
+ lines.push(` ${change.note}`);
102
+ lines.push(` ${paint('→', 'bold')} ${finding.suggestion}`);
103
+ if (finding.confidence < 0.9) {
104
+ lines.push(paint(` confidence ${finding.confidence.toFixed(2)} — verify before changing`, 'yellow'));
105
+ }
106
+ const shown = sites.slice(0, SITES_PER_FINDING);
107
+ for (const site of shown) {
108
+ lines.push(` ${paint(`${site.evidence.file}:${site.evidence.line}:${site.evidence.column}`, 'dim')} ${site.evidence.snippet}`);
109
+ }
110
+ if (sites.length > shown.length) {
111
+ lines.push(paint(` … and ${sites.length - shown.length} more call site(s)`, 'grey'));
112
+ }
113
+ if (change.docsUrl)
114
+ lines.push(paint(` docs: ${change.docsUrl}`, 'grey'));
115
+ return lines.join('\n');
116
+ }
117
+ // --------------------------------------------------------------------------
118
+ export function renderMarkdown(report) {
119
+ const out = [];
120
+ out.push('# Stripe API impact report');
121
+ out.push('');
122
+ out.push(`- **${versionLine(report).replace('current version: ', 'Current version:** ')}`);
123
+ out.push(`- **Target version:** ${report.targetVersion}`);
124
+ out.push(`- **Files scanned:** ${report.filesScanned}`);
125
+ out.push(`- **Generated:** ${report.scannedAt}`);
126
+ out.push('');
127
+ if (report.findings.length === 0) {
128
+ out.push('Nothing in this repo is affected by changes in that range.');
129
+ if (report.unaffectedChanges > 0) {
130
+ out.push('');
131
+ out.push(`${report.unaffectedChanges} change(s) in range touch code this repo does not use.`);
132
+ }
133
+ out.push(...markdownWarnings(report));
134
+ return `${out.join('\n')}\n`;
135
+ }
136
+ out.push(`**${report.totals.breaking} breaking**, ${report.totals.deprecating} deprecating, ${report.totals.additive} additive.`);
137
+ out.push('');
138
+ out.push('| Severity | Change | Where | Sites |');
139
+ out.push('| --- | --- | --- | --- |');
140
+ for (const f of report.findings) {
141
+ const where = f.change.path
142
+ ? `\`${String(f.change.method ?? '').toUpperCase()} ${f.change.path}\``
143
+ : `\`${f.change.event ?? ''}\``;
144
+ out.push(`| ${SEVERITY_LABEL[f.severity]} | ${escapePipes(f.change.note)} | ${where} | ${f.sites.length} |`);
145
+ }
146
+ out.push('');
147
+ for (const group of ['breaking', 'deprecating', 'additive']) {
148
+ const findings = report.findings.filter((f) => f.severity === group);
149
+ if (findings.length === 0)
150
+ continue;
151
+ out.push(`## ${group === 'breaking' ? 'Breaking' : group === 'deprecating' ? 'Deprecated' : 'Additive'}`);
152
+ out.push('');
153
+ for (const f of findings)
154
+ out.push(...markdownFinding(f));
155
+ }
156
+ if (report.unaffectedChanges > 0) {
157
+ out.push(`<sub>${report.unaffectedChanges} other change(s) in range do not touch this repo.</sub>`);
158
+ out.push('');
159
+ }
160
+ out.push(...markdownWarnings(report));
161
+ return `${out.join('\n')}\n`;
162
+ }
163
+ function markdownFinding(finding) {
164
+ const { change, sites } = finding;
165
+ const out = [];
166
+ const where = change.path
167
+ ? `${String(change.method ?? '').toUpperCase()} ${change.path}`
168
+ : (change.event ?? '');
169
+ out.push(`### \`${where}\` — ${change.note}`);
170
+ out.push('');
171
+ out.push(`**Fix:** ${finding.suggestion}`);
172
+ out.push('');
173
+ if (finding.confidence < 0.9) {
174
+ out.push(`> Confidence ${finding.confidence.toFixed(2)}. The call site was matched by shape rather than a resolved client binding — verify before changing.`);
175
+ out.push('');
176
+ }
177
+ const shown = sites.slice(0, SITES_PER_FINDING);
178
+ for (const site of shown) {
179
+ out.push(`- \`${site.evidence.file}:${site.evidence.line}\``);
180
+ out.push(' ```ts');
181
+ out.push(` ${site.evidence.snippet}`);
182
+ out.push(' ```');
183
+ }
184
+ if (sites.length > shown.length) {
185
+ out.push(`- … and ${sites.length - shown.length} more call site(s)`);
186
+ }
187
+ out.push('');
188
+ const meta = [`id: \`${change.id}\``];
189
+ if (change.docsUrl)
190
+ meta.push(`[docs](${change.docsUrl})`);
191
+ out.push(`<sub>${meta.join(' · ')}</sub>`);
192
+ out.push('');
193
+ return out;
194
+ }
195
+ function markdownWarnings(report) {
196
+ if (report.warnings.length === 0)
197
+ return [];
198
+ const out = ['## Notes', ''];
199
+ for (const w of report.warnings)
200
+ out.push(`- ${w}`);
201
+ out.push('');
202
+ return out;
203
+ }
204
+ function escapePipes(text) {
205
+ return text.replace(/\|/g, '\\|');
206
+ }
207
+ /** Machine-readable output, for the GitHub App and for piping into other tools. */
208
+ export function renderJson(report) {
209
+ return `${JSON.stringify(report, null, 2)}\n`;
210
+ }
211
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import ts from 'typescript';
2
+ import type { ClientBinding, Usage } from './types.js';
3
+ import { normalizePath, type MethodMap } from '../specdiff/methodmap.js';
4
+ import type { SourceFile } from './walk.js';
5
+ /**
6
+ * What a module hands out.
7
+ *
8
+ * Values and factories need different treatment at the import site: a value
9
+ * *is* the client, a factory *returns* one. Lazy `getStripeClient()` init is the
10
+ * recommended pattern in serverless frameworks, so both are common.
11
+ */
12
+ export interface ClientExports {
13
+ /** Exported names bound directly to a client. */
14
+ values: ReadonlySet<string>;
15
+ /** Exported functions that return a client. */
16
+ factories: ReadonlySet<string>;
17
+ }
18
+ export interface FileScanInput {
19
+ file: SourceFile;
20
+ methodMap: MethodMap;
21
+ /**
22
+ * Given an import specifier as written in `file`, return what that module
23
+ * exports — or undefined if it exports no Stripe client. Resolution lives in
24
+ * the caller because it needs the whole file list and the tsconfig paths.
25
+ */
26
+ resolveClientExports: (specifier: string) => ClientExports | undefined;
27
+ /** Known Stripe webhook event types, used to filter event-shaped strings. */
28
+ knownEvents?: ReadonlySet<string>;
29
+ /** True when package.json declares a stripe dependency. Raises confidence. */
30
+ stripeInManifest: boolean;
31
+ /**
32
+ * Repo-wide constants whose value is a Stripe API version, e.g.
33
+ * `STRIPE_API_VERSION` -> `2026-02-25.clover`. Lets `apiVersion:
34
+ * STRIPE_API_VERSION` resolve, which is how most repos pin it.
35
+ */
36
+ versionConstants?: ReadonlyMap<string, string>;
37
+ }
38
+ export interface FileScanOutput {
39
+ usages: Usage[];
40
+ clients: ClientBinding[];
41
+ /** Names this file exports that are bound to a Stripe client. */
42
+ exportedClients: Set<string>;
43
+ /** Exported functions in this file that return a Stripe client. */
44
+ exportedClientFactories: Set<string>;
45
+ /** True when this file imports the `stripe` package. */
46
+ importsStripePackage: boolean;
47
+ }
48
+ export declare function parseSource(file: SourceFile): ts.SourceFile;
49
+ export interface ResolvedCall {
50
+ namespace: string;
51
+ method: string;
52
+ httpMethod: string;
53
+ path: string;
54
+ /** How many leading chain segments were consumed as a wrapper prefix. */
55
+ droppedPrefix: number;
56
+ }
57
+ /**
58
+ * Match a call chain against the method map.
59
+ *
60
+ * Tries the longest namespace first and walks inward, so `payments.client.
61
+ * checkout.sessions.create` still resolves to `checkout.sessions.create`. The
62
+ * map is the oracle here: a chain that matches a real Stripe endpoint is strong
63
+ * evidence on its own, which is how wrapped clients get unmasked without
64
+ * needing a model.
65
+ */
66
+ export declare function resolveCall(map: MethodMap, segments: readonly string[]): ResolvedCall | null;
67
+ export declare function scanFile(input: FileScanInput, parsed?: ts.SourceFile): FileScanOutput;
68
+ /** Pull a Stripe REST path out of a string, whether it is a full URL or not. */
69
+ export declare function extractStripePath(text: string): {
70
+ path: string;
71
+ viaHost: boolean;
72
+ } | null;
73
+ export { normalizePath };
74
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/scanner/ast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAE,aAAa,EAAY,KAAK,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAW,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAY5C;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B,+CAA+C;IAC/C,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IACvE,6EAA6E;IAC7E,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,8EAA8E;IAC9E,gBAAgB,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,iEAAiE;IACjE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,mEAAmE;IACnE,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,wDAAwD;IACxD,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,CAAC,UAAU,CAS3D;AA+DD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;CACvB;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CAa5F;AAsBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,cAAc,CA8arF;AAgYD,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAazF;AA+DD,OAAO,EAAE,aAAa,EAAE,CAAC"}