ts-semver-checks-core 0.2.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ardenden
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,18 @@
1
+ # ts-semver-checks-core
2
+
3
+ The pure library behind [`ts-semver-checks`](https://www.npmjs.com/package/ts-semver-checks):
4
+ extract, diff, and classify the exported type surface of a TypeScript package.
5
+
6
+ ```ts
7
+ import { extractSurface, checkSurfaces } from "ts-semver-checks-core";
8
+
9
+ const before = extractSurface({ entryPoint: "baseline/index.d.ts" });
10
+ const after = extractSurface({ entryPoint: "src/index.ts" });
11
+ const { level, findings } = checkSurfaces(before, after);
12
+ // level: "major" | "minor" | "patch"
13
+ ```
14
+
15
+ See the [monorepo README](https://github.com/ardenden/ts-semver-checks#readme) for the
16
+ surface model, rule set, and known limitations.
17
+
18
+ MIT © ardenden
@@ -0,0 +1,13 @@
1
+ import type { ApiSurface, SemverLevel } from "./model.js";
2
+ import { type Finding } from "./findings.js";
3
+ export interface CheckResult {
4
+ /** The highest-impact semver level across all findings. */
5
+ level: SemverLevel;
6
+ /** All findings, sorted most-severe first. */
7
+ findings: Finding[];
8
+ }
9
+ /**
10
+ * Convenience: diff two surfaces and classify the result in one step.
11
+ */
12
+ export declare function checkSurfaces(before: ApiSurface, after: ApiSurface): CheckResult;
13
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAA0B,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,KAAK,EAAE,WAAW,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,WAAW,CAGhF"}
package/dist/check.js ADDED
@@ -0,0 +1,10 @@
1
+ import { diffSurfaces } from "./diff.js";
2
+ import { classify, sortFindings } from "./findings.js";
3
+ /**
4
+ * Convenience: diff two surfaces and classify the result in one step.
5
+ */
6
+ export function checkSurfaces(before, after) {
7
+ const findings = sortFindings(diffSurfaces(before, after));
8
+ return { level: classify(findings), findings };
9
+ }
10
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AASrE;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAkB,EAAE,KAAiB;IACjE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;AACjD,CAAC"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { ApiSurface } from "./model.js";
2
+ import type { Finding } from "./findings.js";
3
+ /**
4
+ * Compare two extracted surfaces and produce a list of findings.
5
+ *
6
+ * LIMITATION: types are compared as normalized strings, not via the compiler's
7
+ * assignability relation. So "did this type widen or narrow?" cannot be answered
8
+ * precisely across two independent builds. Where a change *could* be breaking, we
9
+ * classify it as `major` — a checker meant to fail CI should err toward safety.
10
+ * Cases where structure alone proves the direction (adding an optional param,
11
+ * relaxing `required` to `optional`) are classified precisely.
12
+ */
13
+ export declare function diffSurfaces(before: ApiSurface, after: ApiSurface): Finding[];
14
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAYX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,CA4C7E"}
package/dist/diff.js ADDED
@@ -0,0 +1,474 @@
1
+ /**
2
+ * Compare two extracted surfaces and produce a list of findings.
3
+ *
4
+ * LIMITATION: types are compared as normalized strings, not via the compiler's
5
+ * assignability relation. So "did this type widen or narrow?" cannot be answered
6
+ * precisely across two independent builds. Where a change *could* be breaking, we
7
+ * classify it as `major` — a checker meant to fail CI should err toward safety.
8
+ * Cases where structure alone proves the direction (adding an optional param,
9
+ * relaxing `required` to `optional`) are classified precisely.
10
+ */
11
+ export function diffSurfaces(before, after) {
12
+ const findings = [];
13
+ const beforeNames = new Set(Object.keys(before.exports));
14
+ const afterNames = new Set(Object.keys(after.exports));
15
+ for (const name of beforeNames) {
16
+ if (!afterNames.has(name)) {
17
+ findings.push({
18
+ level: "major",
19
+ code: "export.removed",
20
+ path: name,
21
+ message: `Exported symbol '${name}' was removed.`,
22
+ });
23
+ }
24
+ }
25
+ for (const name of afterNames) {
26
+ if (!beforeNames.has(name)) {
27
+ findings.push({
28
+ level: "minor",
29
+ code: "export.added",
30
+ path: name,
31
+ message: `New exported symbol '${name}' was added.`,
32
+ });
33
+ }
34
+ }
35
+ for (const name of beforeNames) {
36
+ if (!afterNames.has(name))
37
+ continue;
38
+ const oldSym = before.exports[name];
39
+ const newSym = after.exports[name];
40
+ if (oldSym.kind !== newSym.kind) {
41
+ findings.push({
42
+ level: "major",
43
+ code: "export.kindChanged",
44
+ path: name,
45
+ message: `'${name}' changed from ${oldSym.kind} to ${newSym.kind}.`,
46
+ });
47
+ continue;
48
+ }
49
+ diffSymbol(name, oldSym, newSym, findings);
50
+ }
51
+ return findings;
52
+ }
53
+ function diffSymbol(name, before, after, findings) {
54
+ switch (before.kind) {
55
+ case "function":
56
+ diffFunction(name, before, after, findings);
57
+ break;
58
+ case "interface":
59
+ diffInterface(name, before, after, findings);
60
+ break;
61
+ case "class":
62
+ diffClass(name, before, after, findings);
63
+ break;
64
+ case "enum":
65
+ diffEnum(name, before, after, findings);
66
+ break;
67
+ case "typeAlias":
68
+ diffTypeAlias(name, before, after, findings);
69
+ break;
70
+ case "variable":
71
+ diffVariable(name, before, after, findings);
72
+ break;
73
+ }
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Shared helpers
77
+ // ---------------------------------------------------------------------------
78
+ function renderSignature(sig) {
79
+ const tp = sig.typeParameters.length > 0
80
+ ? `<${sig.typeParameters.map(renderTypeParam).join(", ")}>`
81
+ : "";
82
+ const params = sig.parameters
83
+ .map((p) => `${p.rest ? "..." : ""}${p.name}${p.optional ? "?" : ""}: ${p.type}`)
84
+ .join(", ");
85
+ return `${tp}(${params}) => ${sig.returnType}`;
86
+ }
87
+ function renderTypeParam(tp) {
88
+ let s = tp.name;
89
+ if (tp.constraint)
90
+ s += ` extends ${tp.constraint}`;
91
+ if (tp.default)
92
+ s += ` = ${tp.default}`;
93
+ return s;
94
+ }
95
+ function diffTypeParameters(path, before, after, findings) {
96
+ const beforeStr = before.map(renderTypeParam).join(", ");
97
+ const afterStr = after.map(renderTypeParam).join(", ");
98
+ if (beforeStr === afterStr)
99
+ return;
100
+ if (after.length > before.length && after.slice(before.length).every((tp) => tp.default)) {
101
+ // Added type parameters all have defaults -> existing usages still compile.
102
+ findings.push({
103
+ level: "minor",
104
+ code: "generics.typeParamAdded",
105
+ path,
106
+ message: `Type parameters added with defaults: <${afterStr}>.`,
107
+ });
108
+ return;
109
+ }
110
+ findings.push({
111
+ level: "major",
112
+ code: "generics.changed",
113
+ path,
114
+ message: `Type parameters changed from <${beforeStr}> to <${afterStr}>.`,
115
+ });
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // Functions
119
+ // ---------------------------------------------------------------------------
120
+ function diffFunction(name, before, after, findings) {
121
+ // Single signature on each side is the common case; diff it at parameter level
122
+ // so we can distinguish "added optional param" (minor) from "added required".
123
+ if (before.signatures.length === 1 && after.signatures.length === 1) {
124
+ diffSignature(name, before.signatures[0], after.signatures[0], findings, "param");
125
+ return;
126
+ }
127
+ // Overloaded: compare the set of rendered signatures.
128
+ const beforeSigs = new Map(before.signatures.map((s) => [renderSignature(s), s]));
129
+ const afterSigs = new Set(after.signatures.map(renderSignature));
130
+ for (const [rendered] of beforeSigs) {
131
+ if (!afterSigs.has(rendered)) {
132
+ findings.push({
133
+ level: "major",
134
+ code: "overload.removedOrChanged",
135
+ path: name,
136
+ message: `Call signature no longer present: ${rendered}`,
137
+ });
138
+ }
139
+ }
140
+ for (const rendered of afterSigs) {
141
+ if (!beforeSigs.has(rendered)) {
142
+ findings.push({
143
+ level: "minor",
144
+ code: "overload.added",
145
+ path: name,
146
+ message: `New call signature added: ${rendered}`,
147
+ });
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Diff two call signatures at the parameter level.
153
+ * `role` distinguishes plain parameters from constructor parameters for messaging.
154
+ */
155
+ function diffSignature(path, before, after, findings, role) {
156
+ diffTypeParameters(path, before.typeParameters, after.typeParameters, findings);
157
+ const max = Math.max(before.parameters.length, after.parameters.length);
158
+ for (let i = 0; i < max; i++) {
159
+ const b = before.parameters[i];
160
+ const a = after.parameters[i];
161
+ const paramPath = `${path}.${role === "ctor" ? "ctor." : ""}params[${i}]`;
162
+ if (b && !a) {
163
+ findings.push({
164
+ level: "major",
165
+ code: "param.removed",
166
+ path: paramPath,
167
+ message: `Parameter '${b.name}' was removed.`,
168
+ });
169
+ continue;
170
+ }
171
+ if (!b && a) {
172
+ if (a.optional || a.rest) {
173
+ findings.push({
174
+ level: "minor",
175
+ code: "param.addedOptional",
176
+ path: paramPath,
177
+ message: `New optional parameter '${a.name}: ${a.type}' was added.`,
178
+ });
179
+ }
180
+ else {
181
+ findings.push({
182
+ level: "major",
183
+ code: "param.addedRequired",
184
+ path: paramPath,
185
+ message: `New required parameter '${a.name}: ${a.type}' was added.`,
186
+ });
187
+ }
188
+ continue;
189
+ }
190
+ if (b && a)
191
+ diffParameter(paramPath, b, a, findings);
192
+ }
193
+ if (before.returnType !== after.returnType) {
194
+ findings.push({
195
+ level: "major",
196
+ code: "returnType.changed",
197
+ path: `${path}.returnType`,
198
+ message: `Return type changed from '${before.returnType}' to '${after.returnType}'.`,
199
+ });
200
+ }
201
+ }
202
+ function diffParameter(path, before, after, findings) {
203
+ if (before.type !== after.type) {
204
+ findings.push({
205
+ level: "major",
206
+ code: "param.typeChanged",
207
+ path,
208
+ message: `Parameter '${before.name}' type changed from '${before.type}' to '${after.type}'.`,
209
+ });
210
+ }
211
+ if (before.optional && !after.optional) {
212
+ findings.push({
213
+ level: "major",
214
+ code: "param.madeRequired",
215
+ path,
216
+ message: `Parameter '${before.name}' changed from optional to required.`,
217
+ });
218
+ }
219
+ else if (!before.optional && after.optional) {
220
+ findings.push({
221
+ level: "minor",
222
+ code: "param.madeOptional",
223
+ path,
224
+ message: `Parameter '${before.name}' changed from required to optional.`,
225
+ });
226
+ }
227
+ }
228
+ // ---------------------------------------------------------------------------
229
+ // Interfaces & classes (structural members)
230
+ // ---------------------------------------------------------------------------
231
+ function diffInterface(name, before, after, findings) {
232
+ diffTypeParameters(name, before.typeParameters, after.typeParameters, findings);
233
+ // For interfaces, adding a required member is breaking (implementers/object
234
+ // literals must now provide it).
235
+ diffProperties(name, before.properties, after.properties, findings, "interface");
236
+ diffMethods(name, before.methods, after.methods, findings, "interface");
237
+ }
238
+ function diffClass(name, before, after, findings) {
239
+ diffTypeParameters(name, before.typeParameters, after.typeParameters, findings);
240
+ if (!before.abstract && after.abstract) {
241
+ findings.push({
242
+ level: "major",
243
+ code: "class.madeAbstract",
244
+ path: name,
245
+ message: `Class '${name}' was made abstract and can no longer be instantiated directly.`,
246
+ });
247
+ }
248
+ else if (before.abstract && !after.abstract) {
249
+ findings.push({
250
+ level: "minor",
251
+ code: "class.madeConcrete",
252
+ path: name,
253
+ message: `Class '${name}' is no longer abstract.`,
254
+ });
255
+ }
256
+ // For classes, adding a public member is non-breaking (consumers don't implement
257
+ // classes structurally in practice); removing/changing is breaking.
258
+ diffProperties(name, before.properties, after.properties, findings, "class");
259
+ diffMethods(name, before.methods, after.methods, findings, "class");
260
+ diffConstructors(name, before.constructors, after.constructors, findings);
261
+ }
262
+ function diffConstructors(name, before, after, findings) {
263
+ if (before.length === 0 && after.length === 0)
264
+ return;
265
+ // Compare the primary construct signature at parameter level.
266
+ const b = before[0];
267
+ const a = after[0];
268
+ if (b && a) {
269
+ diffSignature(name, b, a, findings, "ctor");
270
+ }
271
+ else if (b && !a) {
272
+ findings.push({
273
+ level: "major",
274
+ code: "constructor.removed",
275
+ path: `${name}.ctor`,
276
+ message: `Constructor of '${name}' was removed.`,
277
+ });
278
+ }
279
+ }
280
+ function diffProperties(owner, before, after, findings, kind) {
281
+ for (const [propName, b] of Object.entries(before)) {
282
+ const a = after[propName];
283
+ const path = `${owner}.${propName}`;
284
+ if (!a) {
285
+ findings.push({
286
+ level: "major",
287
+ code: "property.removed",
288
+ path,
289
+ message: `Property '${propName}' was removed from '${owner}'.`,
290
+ });
291
+ continue;
292
+ }
293
+ if (b.type !== a.type) {
294
+ findings.push({
295
+ level: "major",
296
+ code: "property.typeChanged",
297
+ path,
298
+ message: `Property '${propName}' type changed from '${b.type}' to '${a.type}'.`,
299
+ });
300
+ }
301
+ if (b.optional && !a.optional) {
302
+ findings.push({
303
+ level: "major",
304
+ code: "property.madeRequired",
305
+ path,
306
+ message: `Property '${propName}' changed from optional to required.`,
307
+ });
308
+ }
309
+ else if (!b.optional && a.optional) {
310
+ findings.push({
311
+ level: "minor",
312
+ code: "property.madeOptional",
313
+ path,
314
+ message: `Property '${propName}' changed from required to optional.`,
315
+ });
316
+ }
317
+ if (!b.readonly && a.readonly) {
318
+ findings.push({
319
+ level: "major",
320
+ code: "property.madeReadonly",
321
+ path,
322
+ message: `Property '${propName}' was made readonly.`,
323
+ });
324
+ }
325
+ else if (b.readonly && !a.readonly) {
326
+ findings.push({
327
+ level: "minor",
328
+ code: "property.readonlyRemoved",
329
+ path,
330
+ message: `Property '${propName}' is no longer readonly.`,
331
+ });
332
+ }
333
+ }
334
+ for (const [propName, a] of Object.entries(after)) {
335
+ if (before[propName])
336
+ continue;
337
+ const path = `${owner}.${propName}`;
338
+ if (kind === "class") {
339
+ findings.push({
340
+ level: "minor",
341
+ code: "property.added",
342
+ path,
343
+ message: `New property '${propName}: ${a.type}' was added to class '${owner}'.`,
344
+ });
345
+ }
346
+ else if (a.optional) {
347
+ findings.push({
348
+ level: "minor",
349
+ code: "property.addedOptional",
350
+ path,
351
+ message: `New optional property '${propName}?: ${a.type}' was added.`,
352
+ });
353
+ }
354
+ else {
355
+ findings.push({
356
+ level: "major",
357
+ code: "property.addedRequired",
358
+ path,
359
+ message: `New required property '${propName}: ${a.type}' was added to interface '${owner}'.`,
360
+ });
361
+ }
362
+ }
363
+ }
364
+ function diffMethods(owner, before, after, findings, kind) {
365
+ for (const [methodName, b] of Object.entries(before)) {
366
+ const a = after[methodName];
367
+ const path = `${owner}.${methodName}()`;
368
+ if (!a) {
369
+ findings.push({
370
+ level: "major",
371
+ code: "method.removed",
372
+ path,
373
+ message: `Method '${methodName}' was removed from '${owner}'.`,
374
+ });
375
+ continue;
376
+ }
377
+ const beforeStr = b.map(renderSignature).join(" | ");
378
+ const afterStr = a.map(renderSignature).join(" | ");
379
+ if (beforeStr !== afterStr) {
380
+ findings.push({
381
+ level: "major",
382
+ code: "method.signatureChanged",
383
+ path,
384
+ message: `Method '${methodName}' signature changed from '${beforeStr}' to '${afterStr}'.`,
385
+ });
386
+ }
387
+ }
388
+ for (const methodName of Object.keys(after)) {
389
+ if (before[methodName])
390
+ continue;
391
+ const path = `${owner}.${methodName}()`;
392
+ if (kind === "class") {
393
+ findings.push({
394
+ level: "minor",
395
+ code: "method.added",
396
+ path,
397
+ message: `New method '${methodName}' was added to class '${owner}'.`,
398
+ });
399
+ }
400
+ else {
401
+ findings.push({
402
+ level: "major",
403
+ code: "method.addedRequired",
404
+ path,
405
+ message: `New method '${methodName}' was added to interface '${owner}' (implementers must provide it).`,
406
+ });
407
+ }
408
+ }
409
+ }
410
+ // ---------------------------------------------------------------------------
411
+ // Enums, type aliases, variables
412
+ // ---------------------------------------------------------------------------
413
+ function diffEnum(name, before, after, findings) {
414
+ if (before.const !== after.const) {
415
+ findings.push({
416
+ level: "major",
417
+ code: "enum.constnessChanged",
418
+ path: name,
419
+ message: `Enum '${name}' ${after.const ? "became" : "is no longer"} a const enum.`,
420
+ });
421
+ }
422
+ for (const [member, value] of Object.entries(before.members)) {
423
+ const newValue = after.members[member];
424
+ const path = `${name}.${member}`;
425
+ if (newValue === undefined) {
426
+ findings.push({
427
+ level: "major",
428
+ code: "enum.memberRemoved",
429
+ path,
430
+ message: `Enum member '${member}' was removed.`,
431
+ });
432
+ }
433
+ else if (newValue !== value) {
434
+ findings.push({
435
+ level: "major",
436
+ code: "enum.valueChanged",
437
+ path,
438
+ message: `Enum member '${member}' value changed from '${value}' to '${newValue}'.`,
439
+ });
440
+ }
441
+ }
442
+ for (const member of Object.keys(after.members)) {
443
+ if (before.members[member] !== undefined)
444
+ continue;
445
+ findings.push({
446
+ level: "minor",
447
+ code: "enum.memberAdded",
448
+ path: `${name}.${member}`,
449
+ message: `New enum member '${member}' was added.`,
450
+ });
451
+ }
452
+ }
453
+ function diffTypeAlias(name, before, after, findings) {
454
+ diffTypeParameters(name, before.typeParameters, after.typeParameters, findings);
455
+ if (before.type !== after.type) {
456
+ findings.push({
457
+ level: "major",
458
+ code: "typeAlias.changed",
459
+ path: name,
460
+ message: `Type alias '${name}' changed from '${before.type}' to '${after.type}'.`,
461
+ });
462
+ }
463
+ }
464
+ function diffVariable(name, before, after, findings) {
465
+ if (before.type !== after.type) {
466
+ findings.push({
467
+ level: "major",
468
+ code: "variable.typeChanged",
469
+ path: name,
470
+ message: `Exported value '${name}' type changed from '${before.type}' to '${after.type}'.`,
471
+ });
472
+ }
473
+ }
474
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import ts from "typescript";
2
+ import type { ApiSurface } from "./model.js";
3
+ export interface ExtractOptions {
4
+ /** Path to the entry file (`.ts` or `.d.ts`) whose exports form the surface. */
5
+ entryPoint: string;
6
+ /** Compiler options to use. Sensible strict defaults are applied when omitted. */
7
+ compilerOptions?: ts.CompilerOptions;
8
+ /**
9
+ * Pre-built program to reuse (e.g. one created over a whole package). When
10
+ * provided, `compilerOptions` is ignored.
11
+ */
12
+ program?: ts.Program;
13
+ }
14
+ /**
15
+ * Extract the exported type surface reachable from a single entry point.
16
+ *
17
+ * NOTE: Types are captured as normalized strings produced by the compiler's
18
+ * printer. Diffing therefore compares structure, not assignability — see
19
+ * `diff.ts` for how that shapes classification and its known limitations.
20
+ */
21
+ export declare function extractSurface(options: ExtractOptions): ApiSurface;
22
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EACV,UAAU,EAYX,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,eAAe,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;CACtB;AAiBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CA2ClE"}
@@ -0,0 +1,256 @@
1
+ import * as path from "node:path";
2
+ import ts from "typescript";
3
+ // NOTE: deliberately NOT using UseFullyQualifiedType — it renders local types
4
+ // as their absolute import path (which differs between two builds/checkouts of
5
+ // the same package), producing false "type changed" findings.
6
+ const TYPE_FORMAT_FLAGS = ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.WriteArrayAsGenericType;
7
+ const DEFAULT_COMPILER_OPTIONS = {
8
+ target: ts.ScriptTarget.ES2022,
9
+ module: ts.ModuleKind.NodeNext,
10
+ moduleResolution: ts.ModuleResolutionKind.NodeNext,
11
+ strict: true,
12
+ skipLibCheck: true,
13
+ noEmit: true,
14
+ };
15
+ /**
16
+ * Extract the exported type surface reachable from a single entry point.
17
+ *
18
+ * NOTE: Types are captured as normalized strings produced by the compiler's
19
+ * printer. Diffing therefore compares structure, not assignability — see
20
+ * `diff.ts` for how that shapes classification and its known limitations.
21
+ */
22
+ export function extractSurface(options) {
23
+ const entryPoint = path.resolve(options.entryPoint);
24
+ const program = options.program ??
25
+ ts.createProgram({
26
+ rootNames: [entryPoint],
27
+ options: { ...DEFAULT_COMPILER_OPTIONS, ...options.compilerOptions },
28
+ });
29
+ const checker = program.getTypeChecker();
30
+ const sourceFile = program.getSourceFile(entryPoint);
31
+ if (!sourceFile) {
32
+ throw new Error(`Could not load entry point as a source file: ${entryPoint}`);
33
+ }
34
+ const moduleSymbol = checker.getSymbolAtLocation(sourceFile);
35
+ if (!moduleSymbol) {
36
+ // A source file with no exports still yields an empty, valid surface.
37
+ return { entryPoint: options.entryPoint, exports: {} };
38
+ }
39
+ const exports = {};
40
+ for (const exportSymbol of checker.getExportsOfModule(moduleSymbol)) {
41
+ const resolved = resolveAlias(exportSymbol, checker);
42
+ const serialized = serializeSymbol(exportSymbol.getName(), resolved, checker);
43
+ if (serialized) {
44
+ exports[exportSymbol.getName()] = serialized;
45
+ }
46
+ }
47
+ // CommonJS `export = X` (TypeScript export-assignment) is not returned by
48
+ // getExportsOfModule; it lives on the module symbol under "export=". This is
49
+ // how packages like `mri` expose their main function.
50
+ const exportEquals = moduleSymbol.exports?.get("export=");
51
+ if (exportEquals) {
52
+ const resolved = resolveAlias(exportEquals, checker);
53
+ const serialized = serializeSymbol("export=", resolved, checker);
54
+ if (serialized) {
55
+ exports["export="] = serialized;
56
+ }
57
+ }
58
+ return { entryPoint: options.entryPoint, exports };
59
+ }
60
+ function resolveAlias(symbol, checker) {
61
+ return symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol;
62
+ }
63
+ function serializeSymbol(name, symbol, checker) {
64
+ const flags = symbol.getFlags();
65
+ if (flags & ts.SymbolFlags.TypeAlias)
66
+ return serializeTypeAlias(name, symbol, checker);
67
+ if (flags & ts.SymbolFlags.Interface)
68
+ return serializeInterface(name, symbol, checker);
69
+ if (flags & ts.SymbolFlags.Class)
70
+ return serializeClass(name, symbol, checker);
71
+ if (flags & ts.SymbolFlags.Enum || flags & ts.SymbolFlags.ConstEnum)
72
+ return serializeEnum(name, symbol, checker);
73
+ if (flags & ts.SymbolFlags.Function)
74
+ return serializeFunction(name, symbol, checker);
75
+ if (flags & (ts.SymbolFlags.Variable | ts.SymbolFlags.BlockScopedVariable))
76
+ return serializeVariable(name, symbol, checker);
77
+ return undefined;
78
+ }
79
+ function firstDeclaration(symbol) {
80
+ return symbol.getDeclarations()?.[0] ?? symbol.valueDeclaration;
81
+ }
82
+ function typeToString(type, checker, enclosing) {
83
+ return checker.typeToString(type, enclosing, TYPE_FORMAT_FLAGS);
84
+ }
85
+ /**
86
+ * Render the type of a declared member. Prefers the author's written type
87
+ * annotation when present, because the compiler's resolved type for optional
88
+ * parameters/properties includes a synthetic `| undefined` that would otherwise
89
+ * make `foo?: string` and `foo: string` look like unrelated types.
90
+ */
91
+ function annotatedTypeString(decl, fallback, checker) {
92
+ if (decl &&
93
+ (ts.isParameter(decl) || ts.isPropertySignature(decl) || ts.isPropertyDeclaration(decl)) &&
94
+ decl.type) {
95
+ return decl.type.getText();
96
+ }
97
+ return typeToString(fallback, checker, decl);
98
+ }
99
+ function serializeTypeParameters(params, checker) {
100
+ if (!params)
101
+ return [];
102
+ return params.map((tp) => {
103
+ const result = { name: tp.name.text };
104
+ if (tp.constraint)
105
+ result.constraint = tp.constraint.getText();
106
+ if (tp.default)
107
+ result.default = tp.default.getText();
108
+ return result;
109
+ });
110
+ }
111
+ function serializeSignature(sig, checker) {
112
+ const parameters = sig.getParameters().map((paramSymbol) => {
113
+ const decl = paramSymbol.valueDeclaration;
114
+ const paramType = checker.getTypeOfSymbolAtLocation(paramSymbol, decl ?? paramSymbol.declarations[0]);
115
+ return {
116
+ name: paramSymbol.getName(),
117
+ type: annotatedTypeString(decl, paramType, checker),
118
+ optional: decl ? checker.isOptionalParameter(decl) : false,
119
+ rest: decl?.dotDotDotToken !== undefined,
120
+ };
121
+ });
122
+ const typeParameters = (sig.getTypeParameters() ?? []).map((tp) => {
123
+ const result = { name: tp.symbol.getName() };
124
+ const constraint = tp.getConstraint();
125
+ if (constraint)
126
+ result.constraint = typeToString(constraint, checker);
127
+ const dflt = tp.getDefault();
128
+ if (dflt)
129
+ result.default = typeToString(dflt, checker);
130
+ return result;
131
+ });
132
+ return {
133
+ typeParameters,
134
+ parameters,
135
+ returnType: typeToString(sig.getReturnType(), checker),
136
+ };
137
+ }
138
+ function serializeFunction(name, symbol, checker) {
139
+ const decl = firstDeclaration(symbol);
140
+ const type = checker.getTypeOfSymbolAtLocation(symbol, decl ?? symbol.valueDeclaration);
141
+ const signatures = type.getCallSignatures().map((sig) => serializeSignature(sig, checker));
142
+ return { kind: "function", name, signatures };
143
+ }
144
+ function isMethodSymbol(member) {
145
+ return (member.getFlags() & ts.SymbolFlags.Method) !== 0;
146
+ }
147
+ function isReadonlyMember(member) {
148
+ const decl = member.getDeclarations()?.[0];
149
+ if (!decl || !ts.canHaveModifiers(decl))
150
+ return false;
151
+ return (ts
152
+ .getModifiers(decl)
153
+ ?.some((m) => m.kind === ts.SyntaxKind.ReadonlyKeyword) ?? false);
154
+ }
155
+ function serializeProperty(member, checker) {
156
+ const decl = member.getDeclarations()?.[0];
157
+ const type = decl
158
+ ? checker.getTypeOfSymbolAtLocation(member, decl)
159
+ : checker.getTypeOfSymbol(member);
160
+ return {
161
+ name: member.getName(),
162
+ type: annotatedTypeString(decl, type, checker),
163
+ optional: (member.getFlags() & ts.SymbolFlags.Optional) !== 0,
164
+ readonly: isReadonlyMember(member),
165
+ };
166
+ }
167
+ function serializeMembers(type, checker) {
168
+ const properties = {};
169
+ const methods = {};
170
+ for (const member of type.getProperties()) {
171
+ const memberName = member.getName();
172
+ // Skip private / internal members (leading underscore is a common convention,
173
+ // and truly private class members are excluded from the apparent type already).
174
+ if (isMethodSymbol(member)) {
175
+ const decl = member.getDeclarations()?.[0];
176
+ const memberType = decl
177
+ ? checker.getTypeOfSymbolAtLocation(member, decl)
178
+ : checker.getTypeOfSymbol(member);
179
+ const sigs = memberType.getCallSignatures().map((s) => serializeSignature(s, checker));
180
+ methods[memberName] = sigs;
181
+ }
182
+ else {
183
+ properties[memberName] = serializeProperty(member, checker);
184
+ }
185
+ }
186
+ return { properties, methods };
187
+ }
188
+ function serializeTypeAlias(name, symbol, checker) {
189
+ const decl = symbol.getDeclarations()?.find(ts.isTypeAliasDeclaration);
190
+ const type = checker.getDeclaredTypeOfSymbol(symbol);
191
+ // Prefer the written type text when available; fall back to the resolved type.
192
+ const rendered = decl?.type ? decl.type.getText() : typeToString(type, checker, decl);
193
+ return {
194
+ kind: "typeAlias",
195
+ name,
196
+ typeParameters: serializeTypeParameters(decl?.typeParameters, checker),
197
+ type: rendered,
198
+ };
199
+ }
200
+ function serializeInterface(name, symbol, checker) {
201
+ const type = checker.getDeclaredTypeOfSymbol(symbol);
202
+ const decl = symbol.getDeclarations()?.find(ts.isInterfaceDeclaration);
203
+ const { properties, methods } = serializeMembers(type, checker);
204
+ return {
205
+ kind: "interface",
206
+ name,
207
+ typeParameters: serializeTypeParameters(decl?.typeParameters, checker),
208
+ properties,
209
+ methods,
210
+ };
211
+ }
212
+ function serializeClass(name, symbol, checker) {
213
+ const instanceType = checker.getDeclaredTypeOfSymbol(symbol);
214
+ const decl = symbol.getDeclarations()?.find(ts.isClassDeclaration);
215
+ const { properties, methods } = serializeMembers(instanceType, checker);
216
+ // Construct signatures live on the static (constructor) side of the class.
217
+ const staticType = checker.getTypeOfSymbolAtLocation(symbol, decl ?? symbol.valueDeclaration);
218
+ const constructors = staticType
219
+ .getConstructSignatures()
220
+ .map((sig) => serializeSignature(sig, checker));
221
+ const abstract = decl?.modifiers?.some((m) => m.kind === ts.SyntaxKind.AbstractKeyword) ?? false;
222
+ return {
223
+ kind: "class",
224
+ name,
225
+ abstract,
226
+ typeParameters: serializeTypeParameters(decl?.typeParameters, checker),
227
+ constructors,
228
+ properties,
229
+ methods,
230
+ };
231
+ }
232
+ function serializeEnum(name, symbol, checker) {
233
+ const members = {};
234
+ const isConst = (symbol.getFlags() & ts.SymbolFlags.ConstEnum) !== 0;
235
+ for (const decl of symbol.getDeclarations() ?? []) {
236
+ if (!ts.isEnumDeclaration(decl))
237
+ continue;
238
+ for (const member of decl.members) {
239
+ const memberName = member.name.getText();
240
+ const value = checker.getConstantValue(member);
241
+ members[memberName] = value === undefined ? "<computed>" : String(value);
242
+ }
243
+ }
244
+ return { kind: "enum", name, const: isConst, members };
245
+ }
246
+ function serializeVariable(name, symbol, checker) {
247
+ const decl = firstDeclaration(symbol);
248
+ const type = checker.getTypeOfSymbolAtLocation(symbol, decl ?? symbol.valueDeclaration);
249
+ const isConst = decl !== undefined &&
250
+ ts.isVariableDeclaration(decl) &&
251
+ decl.parent !== undefined &&
252
+ ts.isVariableDeclarationList(decl.parent) &&
253
+ (decl.parent.flags & ts.NodeFlags.Const) !== 0;
254
+ return { kind: "variable", name, const: isConst, type: typeToString(type, checker, decl) };
255
+ }
256
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,YAAY,CAAC;AA4B5B,8EAA8E;AAC9E,+EAA+E;AAC/E,8DAA8D;AAC9D,MAAM,iBAAiB,GACrB,EAAE,CAAC,eAAe,CAAC,YAAY,GAAG,EAAE,CAAC,eAAe,CAAC,uBAAuB,CAAC;AAE/E,MAAM,wBAAwB,GAAuB;IACnD,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;IAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ;IAC9B,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ;IAClD,MAAM,EAAE,IAAI;IACZ,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,IAAI;CACb,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAuB;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;QACf,EAAE,CAAC,aAAa,CAAC;YACf,SAAS,EAAE,CAAC,UAAU,CAAC;YACvB,OAAO,EAAE,EAAE,GAAG,wBAAwB,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE;SACrE,CAAC,CAAC;IAEL,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,UAAU,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,sEAAsE;QACtE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,KAAK,MAAM,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,6EAA6E;IAC7E,sDAAsD;IACtD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,SAAwB,CAAC,CAAC;IACzE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CAAC,MAAiB,EAAE,OAAuB;IAC9D,OAAO,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACzF,CAAC;AAED,SAAS,eAAe,CACtB,IAAY,EACZ,MAAiB,EACjB,OAAuB;IAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAEhC,IAAI,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS;QAAE,OAAO,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACvF,IAAI,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS;QAAE,OAAO,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACvF,IAAI,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK;QAAE,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/E,IAAI,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS;QACjE,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ;QAAE,OAAO,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACrF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,mBAAmB,CAAC;QACxE,OAAO,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAElD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAiB;IACzC,OAAO,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC;AAClE,CAAC;AAED,SAAS,YAAY,CAAC,IAAa,EAAE,OAAuB,EAAE,SAAmB;IAC/E,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,IAAgC,EAChC,QAAiB,EACjB,OAAuB;IAEvB,IACE,IAAI;QACJ,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,EACT,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAA0D,EAC1D,OAAuB;IAEvB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACvB,MAAM,MAAM,GAAkB,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,EAAE,CAAC,UAAU;YAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC/D,IAAI,EAAE,CAAC,OAAO;YAAE,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAiB,EAAE,OAAuB;IACpE,MAAM,UAAU,GAAgB,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;QACtE,MAAM,IAAI,GAAG,WAAW,CAAC,gBAAuD,CAAC;QACjF,MAAM,SAAS,GAAG,OAAO,CAAC,yBAAyB,CACjD,WAAW,EACX,IAAI,IAAI,WAAW,CAAC,YAAa,CAAC,CAAC,CAAE,CACtC,CAAC;QACF,OAAO;YACL,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE;YAC3B,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC;YACnD,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;YAC1D,IAAI,EAAE,IAAI,EAAE,cAAc,KAAK,SAAS;SACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAiB,EAAE;QAC/E,MAAM,MAAM,GAAkB,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QACtC,IAAI,UAAU;YAAE,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC;QAC7B,IAAI,IAAI;YAAE,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,cAAc;QACd,UAAU;QACV,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAY,EACZ,MAAiB,EACjB,OAAuB;IAEvB,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,gBAAiB,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3F,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,MAAiB;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAiB;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,CACL,EAAE;SACC,YAAY,CAAC,IAAI,CAAC;QACnB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,KAAK,CACnE,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAiB,EAAE,OAAuB;IACnE,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI;QACf,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC;QACjD,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE;QACtB,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;QAC9C,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC7D,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAa,EACb,OAAuB;IAEvB,MAAM,UAAU,GAAmC,EAAE,CAAC;IACtD,MAAM,OAAO,GAAoC,EAAE,CAAC;IAEpD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,8EAA8E;QAC9E,gFAAgF;QAChF,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,IAAI;gBACrB,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC;gBACjD,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,UAAU,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YACvF,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,UAAU,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAY,EACZ,MAAiB,EACjB,OAAuB;IAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACrD,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACtF,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI;QACJ,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC;QACtE,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAY,EACZ,MAAiB,EACjB,OAAuB;IAEvB,MAAM,IAAI,GAAG,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC;IACvE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI;QACJ,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC;QACtE,UAAU;QACV,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,MAAiB,EAAE,OAAuB;IAC9E,MAAM,YAAY,GAAG,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;IACnE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAExE,2EAA2E;IAC3E,MAAM,UAAU,GAAG,OAAO,CAAC,yBAAyB,CAClD,MAAM,EACN,IAAI,IAAI,MAAM,CAAC,gBAAiB,CACjC,CAAC;IACF,MAAM,YAAY,GAAG,UAAU;SAC5B,sBAAsB,EAAE;SACxB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAElD,MAAM,QAAQ,GACZ,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC;IAElF,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI;QACJ,QAAQ;QACR,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC;QACtE,YAAY;QACZ,UAAU;QACV,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,MAAiB,EAAE,OAAuB;IAC7E,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAErE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC;QAClD,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC/C,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAY,EACZ,MAAiB,EACjB,OAAuB;IAEvB,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,gBAAiB,CAAC,CAAC;IACzF,MAAM,OAAO,GACX,IAAI,KAAK,SAAS;QAClB,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,MAAM,KAAK,SAAS;QACzB,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC;QACzC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEjD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { SemverLevel } from "./model.js";
2
+ export interface Finding {
3
+ /** The semver impact of this single change. */
4
+ level: SemverLevel;
5
+ /** Stable machine-readable code, e.g. `export.removed`, `param.typeChanged`. */
6
+ code: string;
7
+ /** Dotted path to the affected surface location, e.g. `parseConfig.params[0]`. */
8
+ path: string;
9
+ /** Human-readable one-line explanation. */
10
+ message: string;
11
+ }
12
+ /** Reduce a set of findings to the single highest-impact semver level. */
13
+ export declare function classify(findings: readonly Finding[]): SemverLevel;
14
+ /** Sort findings most-severe first, then by path for stable output. */
15
+ export declare function sortFindings(findings: Finding[]): Finding[];
16
+ //# sourceMappingURL=findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../src/findings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,+CAA+C;IAC/C,KAAK,EAAE,WAAW,CAAC;IACnB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,WAAW,CAMlE;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAM3D"}
@@ -0,0 +1,20 @@
1
+ const ORDER = { patch: 0, minor: 1, major: 2 };
2
+ /** Reduce a set of findings to the single highest-impact semver level. */
3
+ export function classify(findings) {
4
+ let level = "patch";
5
+ for (const f of findings) {
6
+ if (ORDER[f.level] > ORDER[level])
7
+ level = f.level;
8
+ }
9
+ return level;
10
+ }
11
+ /** Sort findings most-severe first, then by path for stable output. */
12
+ export function sortFindings(findings) {
13
+ return [...findings].sort((a, b) => {
14
+ const byLevel = ORDER[b.level] - ORDER[a.level];
15
+ if (byLevel !== 0)
16
+ return byLevel;
17
+ return a.path.localeCompare(b.path);
18
+ });
19
+ }
20
+ //# sourceMappingURL=findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.js","sourceRoot":"","sources":["../src/findings.ts"],"names":[],"mappings":"AAaA,MAAM,KAAK,GAAgC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAE5E,0EAA0E;AAC1E,MAAM,UAAU,QAAQ,CAAC,QAA4B;IACnD,IAAI,KAAK,GAAgB,OAAO,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,QAAmB;IAC9C,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAClC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type { ApiSurface, CallSignature, ClassSymbol, EnumSymbol, ExportedSymbol, FunctionSymbol, InterfaceSymbol, Parameter, PropertyMember, SemverLevel, SymbolKind, TypeAliasSymbol, TypeParameter, VariableSymbol, } from "./model.js";
2
+ export { extractSurface } from "./extract.js";
3
+ export type { ExtractOptions } from "./extract.js";
4
+ export { diffSurfaces } from "./diff.js";
5
+ export { classify, sortFindings } from "./findings.js";
6
+ export type { Finding } from "./findings.js";
7
+ export { checkSurfaces } from "./check.js";
8
+ export type { CheckResult } from "./check.js";
9
+ export { renderReport } from "./report.js";
10
+ export type { RenderOptions } from "./report.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,SAAS,EACT,cAAc,EACd,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { extractSurface } from "./extract.js";
2
+ export { diffSurfaces } from "./diff.js";
3
+ export { classify, sortFindings } from "./findings.js";
4
+ export { checkSurfaces } from "./check.js";
5
+ export { renderReport } from "./report.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Serializable model of a package's exported type surface.
3
+ *
4
+ * The whole point of this model is that it is plain JSON: a surface can be
5
+ * written to disk (an "API lockfile"), committed, and diffed later against a
6
+ * freshly extracted surface without needing the original TypeScript program.
7
+ */
8
+ export type SemverLevel = "major" | "minor" | "patch";
9
+ export interface ApiSurface {
10
+ /** Logical identifier of the entry point that produced this surface. */
11
+ entryPoint: string;
12
+ /** Exported symbols keyed by their exported name. */
13
+ exports: Record<string, ExportedSymbol>;
14
+ }
15
+ export type ExportedSymbol = FunctionSymbol | InterfaceSymbol | TypeAliasSymbol | ClassSymbol | EnumSymbol | VariableSymbol;
16
+ export type SymbolKind = ExportedSymbol["kind"];
17
+ export interface TypeParameter {
18
+ name: string;
19
+ constraint?: string;
20
+ default?: string;
21
+ }
22
+ export interface Parameter {
23
+ name: string;
24
+ /** Rendered type string (normalized via the compiler's printer). */
25
+ type: string;
26
+ optional: boolean;
27
+ rest: boolean;
28
+ }
29
+ export interface CallSignature {
30
+ typeParameters: TypeParameter[];
31
+ parameters: Parameter[];
32
+ returnType: string;
33
+ }
34
+ export interface PropertyMember {
35
+ name: string;
36
+ type: string;
37
+ optional: boolean;
38
+ readonly: boolean;
39
+ }
40
+ export interface FunctionSymbol {
41
+ kind: "function";
42
+ name: string;
43
+ signatures: CallSignature[];
44
+ }
45
+ export interface InterfaceSymbol {
46
+ kind: "interface";
47
+ name: string;
48
+ typeParameters: TypeParameter[];
49
+ properties: Record<string, PropertyMember>;
50
+ methods: Record<string, CallSignature[]>;
51
+ }
52
+ export interface TypeAliasSymbol {
53
+ kind: "typeAlias";
54
+ name: string;
55
+ typeParameters: TypeParameter[];
56
+ type: string;
57
+ }
58
+ export interface ClassSymbol {
59
+ kind: "class";
60
+ name: string;
61
+ abstract: boolean;
62
+ typeParameters: TypeParameter[];
63
+ constructors: CallSignature[];
64
+ properties: Record<string, PropertyMember>;
65
+ methods: Record<string, CallSignature[]>;
66
+ }
67
+ export interface EnumSymbol {
68
+ kind: "enum";
69
+ name: string;
70
+ const: boolean;
71
+ /** Member name -> constant value rendered as a string (or `undefined` if computed). */
72
+ members: Record<string, string>;
73
+ }
74
+ export interface VariableSymbol {
75
+ kind: "variable";
76
+ name: string;
77
+ const: boolean;
78
+ type: string;
79
+ }
80
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACzC;AAED,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,eAAe,GACf,eAAe,GACf,WAAW,GACX,UAAU,GACV,cAAc,CAAC;AAEnB,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd"}
package/dist/model.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Serializable model of a package's exported type surface.
3
+ *
4
+ * The whole point of this model is that it is plain JSON: a surface can be
5
+ * written to disk (an "API lockfile"), committed, and diffed later against a
6
+ * freshly extracted surface without needing the original TypeScript program.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,8 @@
1
+ import type { CheckResult } from "./check.js";
2
+ export interface RenderOptions {
3
+ /** Emit ANSI colors. Default: false (caller decides based on TTY). */
4
+ color?: boolean;
5
+ }
6
+ /** Render a check result as a human-readable, optionally colored report. */
7
+ export declare function renderReport(result: CheckResult, options?: RenderOptions): string;
8
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAiBD,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CA6BrF"}
package/dist/report.js ADDED
@@ -0,0 +1,38 @@
1
+ const LEVEL_LABEL = {
2
+ major: "MAJOR",
3
+ minor: "MINOR",
4
+ patch: "PATCH",
5
+ };
6
+ const ANSI = {
7
+ major: "\x1b[31m", // red
8
+ minor: "\x1b[33m", // yellow
9
+ patch: "\x1b[32m", // green
10
+ dim: "\x1b[2m",
11
+ bold: "\x1b[1m",
12
+ reset: "\x1b[0m",
13
+ };
14
+ /** Render a check result as a human-readable, optionally colored report. */
15
+ export function renderReport(result, options = {}) {
16
+ const paint = (code, text) => options.color ? `${ANSI[code]}${text}${ANSI.reset}` : text;
17
+ const lines = [];
18
+ const counts = { major: 0, minor: 0, patch: 0 };
19
+ for (const f of result.findings)
20
+ counts[f.level]++;
21
+ if (result.findings.length === 0) {
22
+ lines.push(paint("patch", "No public API changes detected."));
23
+ lines.push("");
24
+ lines.push(`Required version bump: ${paint("patch", LEVEL_LABEL.patch)}`);
25
+ return lines.join("\n");
26
+ }
27
+ for (const f of result.findings) {
28
+ const badge = paint(f.level, LEVEL_LABEL[f.level].padEnd(5));
29
+ lines.push(`${badge} ${f.message}`);
30
+ lines.push(` ${paint("dim", `${f.code} @ ${f.path}`)}`);
31
+ }
32
+ lines.push("");
33
+ const summary = `${counts.major} major, ${counts.minor} minor`;
34
+ lines.push(paint("dim", summary));
35
+ lines.push(`Required version bump: ${paint("bold", "")}${paint(result.level, LEVEL_LABEL[result.level])}`);
36
+ return lines.join("\n");
37
+ }
38
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,GAAgC;IAC/C,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,IAAI,GAA2D;IACnE,KAAK,EAAE,UAAU,EAAE,MAAM;IACzB,KAAK,EAAE,UAAU,EAAE,SAAS;IAC5B,KAAK,EAAE,UAAU,EAAE,QAAQ;IAC3B,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,UAAyB,EAAE;IAC3E,MAAM,KAAK,GAAG,CAAC,IAAuB,EAAE,IAAY,EAAE,EAAE,CACtD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAgC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC7E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;QAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IAEnD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,iCAAiC,CAAC,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,KAAK,QAAQ,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CACR,0BAA0B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAC/F,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "ts-semver-checks-core",
3
+ "version": "0.2.0",
4
+ "description": "Core library: extract, diff and classify the exported type surface of a TypeScript package.",
5
+ "keywords": [
6
+ "semver",
7
+ "typescript",
8
+ "api",
9
+ "breaking-change",
10
+ "types",
11
+ "diff"
12
+ ],
13
+ "homepage": "https://github.com/ardenden/ts-semver-checks#readme",
14
+ "bugs": "https://github.com/ardenden/ts-semver-checks/issues",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/ardenden/ts-semver-checks.git",
18
+ "directory": "packages/core"
19
+ },
20
+ "author": "ardenden",
21
+ "license": "MIT",
22
+ "type": "module",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.js"
27
+ }
28
+ },
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "files": [
32
+ "dist"
33
+ ],
34
+ "peerDependencies": {
35
+ "typescript": ">=5.0.0"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.json",
42
+ "typecheck": "tsc -p tsconfig.json --noEmit"
43
+ }
44
+ }