@async/api-contract 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 (64) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +150 -0
  3. package/dist/catalog.d.ts +4 -0
  4. package/dist/catalog.d.ts.map +1 -0
  5. package/dist/catalog.js +62 -0
  6. package/dist/catalog.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +106 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/compare.d.ts +4 -0
  12. package/dist/compare.d.ts.map +1 -0
  13. package/dist/compare.js +101 -0
  14. package/dist/compare.js.map +1 -0
  15. package/dist/derive.d.ts +3 -0
  16. package/dist/derive.d.ts.map +1 -0
  17. package/dist/derive.js +61 -0
  18. package/dist/derive.js.map +1 -0
  19. package/dist/diff.d.ts +3 -0
  20. package/dist/diff.d.ts.map +1 -0
  21. package/dist/diff.js +38 -0
  22. package/dist/diff.js.map +1 -0
  23. package/dist/hash.d.ts +8 -0
  24. package/dist/hash.d.ts.map +1 -0
  25. package/dist/hash.js +15 -0
  26. package/dist/hash.js.map +1 -0
  27. package/dist/impact.d.ts +7 -0
  28. package/dist/impact.d.ts.map +1 -0
  29. package/dist/impact.js +25 -0
  30. package/dist/impact.js.map +1 -0
  31. package/dist/index.d.ts +12 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +12 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/ledger.d.ts +3 -0
  36. package/dist/ledger.d.ts.map +1 -0
  37. package/dist/ledger.js +78 -0
  38. package/dist/ledger.js.map +1 -0
  39. package/dist/manifest.d.ts +3 -0
  40. package/dist/manifest.d.ts.map +1 -0
  41. package/dist/manifest.js +62 -0
  42. package/dist/manifest.js.map +1 -0
  43. package/dist/model.d.ts +125 -0
  44. package/dist/model.d.ts.map +1 -0
  45. package/dist/model.js +2 -0
  46. package/dist/model.js.map +1 -0
  47. package/dist/surface.d.ts +8 -0
  48. package/dist/surface.d.ts.map +1 -0
  49. package/dist/surface.js +26 -0
  50. package/dist/surface.js.map +1 -0
  51. package/dist/types.d.ts +20 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/usage-scan.d.ts +16 -0
  56. package/dist/usage-scan.d.ts.map +1 -0
  57. package/dist/usage-scan.js +66 -0
  58. package/dist/usage-scan.js.map +1 -0
  59. package/examples/claims/claim.json +13 -0
  60. package/examples/db-ledger/API_SURFACE.md +26 -0
  61. package/examples/db-ledger/api-contract.json +42 -0
  62. package/examples/pipeline/API_SURFACE.md +37 -0
  63. package/examples/pipeline/api-contract.json +53 -0
  64. package/package.json +58 -0
@@ -0,0 +1,7 @@
1
+ import type { ImpactReport, PackageContractManifest } from "./model.js";
2
+ export declare function createImpactReport(input: {
3
+ before: PackageContractManifest;
4
+ after: PackageContractManifest;
5
+ consumers: readonly PackageContractManifest[];
6
+ }): ImpactReport;
7
+ //# sourceMappingURL=impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../src/impact.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAgB,MAAM,YAAY,CAAC;AAEtF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,uBAAuB,CAAC;IAC/B,SAAS,EAAE,SAAS,uBAAuB,EAAE,CAAC;CAC/C,GAAG,YAAY,CAsBf"}
package/dist/impact.js ADDED
@@ -0,0 +1,25 @@
1
+ import { diffPackageContracts } from "./diff.js";
2
+ export function createImpactReport(input) {
3
+ const diff = diffPackageContracts(input.before, input.after);
4
+ const relevant = new Set([...diff.removedFeatures, ...diff.changedFeatures, ...diff.deprecatedFeatures]);
5
+ const impactedConsumers = [];
6
+ const unaffectedConsumers = [];
7
+ for (const consumer of input.consumers) {
8
+ for (const usage of consumer.usage ?? []) {
9
+ const impacted = usage.surface.features.some((feature) => relevant.has(feature));
10
+ if (impacted)
11
+ impactedConsumers.push(usage);
12
+ else
13
+ unaffectedConsumers.push(usage);
14
+ }
15
+ }
16
+ return {
17
+ ok: impactedConsumers.length === 0,
18
+ providerPackage: input.after.packageName,
19
+ removedFeatures: diff.removedFeatures,
20
+ changedFeatures: [...new Set([...diff.changedFeatures, ...diff.deprecatedFeatures])].sort(),
21
+ impactedConsumers,
22
+ unaffectedConsumers
23
+ };
24
+ }
25
+ //# sourceMappingURL=impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.js","sourceRoot":"","sources":["../src/impact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGjD,MAAM,UAAU,kBAAkB,CAAC,KAIlC;IACC,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACzG,MAAM,iBAAiB,GAAmB,EAAE,CAAC;IAC7C,MAAM,mBAAmB,GAAmB,EAAE,CAAC;IAE/C,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACjF,IAAI,QAAQ;gBAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBACvC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,iBAAiB,CAAC,MAAM,KAAK,CAAC;QAClC,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW;QACxC,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,eAAe,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAC3F,iBAAiB;QACjB,mBAAmB;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export * from "./model.js";
2
+ export * from "./catalog.js";
3
+ export * from "./hash.js";
4
+ export * from "./surface.js";
5
+ export * from "./compare.js";
6
+ export * from "./derive.js";
7
+ export * from "./manifest.js";
8
+ export * from "./ledger.js";
9
+ export * from "./diff.js";
10
+ export * from "./impact.js";
11
+ export * from "./usage-scan.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from "./model.js";
2
+ export * from "./catalog.js";
3
+ export * from "./hash.js";
4
+ export * from "./surface.js";
5
+ export * from "./compare.js";
6
+ export * from "./derive.js";
7
+ export * from "./manifest.js";
8
+ export * from "./ledger.js";
9
+ export * from "./diff.js";
10
+ export * from "./impact.js";
11
+ export * from "./usage-scan.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RenderLedgerInput } from "./model.js";
2
+ export declare function renderApiSurfaceMarkdown(input: RenderLedgerInput): string;
3
+ //# sourceMappingURL=ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,iBAAiB,EAAW,MAAM,YAAY,CAAC;AAE1E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAiCzE"}
package/dist/ledger.js ADDED
@@ -0,0 +1,78 @@
1
+ export function renderApiSurfaceMarkdown(input) {
2
+ const manifest = input.manifest;
3
+ const lines = [];
4
+ lines.push(`# ${input.title ?? `${manifest.packageName} API Surface Ledger`}`);
5
+ lines.push("");
6
+ lines.push(input.reviewRule ?? "This file is the generated review ledger for semantic API contract features. It is current-state contract documentation, not a changelog or tutorial.");
7
+ lines.push("");
8
+ for (const catalog of manifest.catalogs ?? []) {
9
+ lines.push(`## ${catalog.title ?? catalog.contractId}`);
10
+ lines.push("");
11
+ lines.push(`Contract: \`${catalog.contractId}\``);
12
+ lines.push("");
13
+ const grouped = groupFeatures(catalog.features);
14
+ for (const [group, features] of grouped) {
15
+ lines.push(`### ${titleCase(group)}`);
16
+ lines.push("");
17
+ lines.push("| Feature | Title | Release | Stability | Lifecycle | Replacement | Docs |");
18
+ lines.push("| --- | --- | --- | --- | --- | --- | --- |");
19
+ for (const feature of features) {
20
+ lines.push(`| \`${escapeCell(feature.id)}\` | ${escapeCell(feature.title)} | ${feature.releaseTag} | ${feature.stability ?? ""} | ${feature.lifecycle ?? "active"} | ${feature.replacedBy ? `\`${escapeCell(feature.replacedBy)}\`` : ""} | ${feature.docsUrl ? `[docs](${feature.docsUrl})` : ""} |`);
21
+ }
22
+ lines.push("");
23
+ }
24
+ }
25
+ pushSurfaceSection(lines, "Supported Surfaces", manifest.supported ?? []);
26
+ pushSurfaceSection(lines, "Required Surfaces", manifest.required ?? []);
27
+ pushSurfaceSection(lines, "Emitted Surfaces", manifest.emits ?? []);
28
+ pushLifecycleSummary(lines, manifest.catalogs?.flatMap((catalog) => [...catalog.features]) ?? []);
29
+ return `${lines.join("\n").trimEnd()}\n`;
30
+ }
31
+ function groupFeatures(features) {
32
+ const groups = new Map();
33
+ for (const feature of features) {
34
+ const group = feature.group ?? "features";
35
+ const current = groups.get(group) ?? [];
36
+ current.push(feature);
37
+ groups.set(group, current);
38
+ }
39
+ return [...groups.entries()]
40
+ .sort(([a], [b]) => a.localeCompare(b))
41
+ .map(([group, entries]) => [group, entries.sort((a, b) => a.id.localeCompare(b.id))]);
42
+ }
43
+ function pushSurfaceSection(lines, title, surfaces) {
44
+ if (surfaces.length === 0)
45
+ return;
46
+ lines.push(`## ${title}`);
47
+ lines.push("");
48
+ lines.push("| Contract | Hash | Features |");
49
+ lines.push("| --- | --- | --- |");
50
+ for (const surface of [...surfaces].sort((a, b) => a.contractId.localeCompare(b.contractId))) {
51
+ lines.push(`| \`${escapeCell(surface.contractId)}\` | \`${surface.hash}\` | ${surface.features.map((feature) => `\`${escapeCell(feature)}\``).join(", ")} |`);
52
+ }
53
+ lines.push("");
54
+ }
55
+ function pushLifecycleSummary(lines, features) {
56
+ const tracked = features.filter((feature) => feature.lifecycle === "deprecated" || feature.lifecycle === "removed");
57
+ if (tracked.length === 0)
58
+ return;
59
+ lines.push("## Deprecated And Removed Features");
60
+ lines.push("");
61
+ lines.push("| Feature | Lifecycle | Since | Replacement |");
62
+ lines.push("| --- | --- | --- | --- |");
63
+ for (const feature of tracked.sort((a, b) => a.id.localeCompare(b.id))) {
64
+ lines.push(`| \`${escapeCell(feature.id)}\` | ${feature.lifecycle ?? "active"} | ${feature.deprecatedSince ?? feature.removedSince ?? ""} | ${feature.replacedBy ? `\`${escapeCell(feature.replacedBy)}\`` : ""} |`);
65
+ }
66
+ lines.push("");
67
+ }
68
+ function titleCase(value) {
69
+ return value
70
+ .split(/[._ -]+/g)
71
+ .filter(Boolean)
72
+ .map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)
73
+ .join(" ");
74
+ }
75
+ function escapeCell(value) {
76
+ return value.replaceAll("|", "\\|");
77
+ }
78
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CAAC,KAAwB;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,GAAG,QAAQ,CAAC,WAAW,qBAAqB,EAAE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,uJAAuJ,CAAC,CAAC;IACxL,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC1D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,UAAU,MAAM,OAAO,CAAC,SAAS,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,IAAI,QAAQ,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACzS,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC1E,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACxE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACpE,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAElG,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa,CAAC,QAAgC;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAe,EAAE,KAAa,EAAE,QAA4B;IACtF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC7F,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,OAAO,CAAC,IAAI,QAAQ,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChK,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAe,EAAE,QAAgC;IAC7E,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,KAAK,YAAY,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IACpH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,OAAO,CAAC,SAAS,IAAI,QAAQ,MAAM,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvN,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,KAAK,CAAC,UAAU,CAAC;SACjB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PackageContractManifest } from "./model.js";
2
+ export declare function parsePackageContractManifest(value: unknown): PackageContractManifest;
3
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,uBAAuB,EAAyB,MAAM,YAAY,CAAC;AAEjG,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAiBpF"}
@@ -0,0 +1,62 @@
1
+ import { defineFeatureCatalog } from "./catalog.js";
2
+ import { createSurface } from "./surface.js";
3
+ export function parsePackageContractManifest(value) {
4
+ assertObject(value, "PackageContractManifest");
5
+ if (value.format !== "api-contract.package.v1") {
6
+ throw new Error("PackageContractManifest.format must be api-contract.package.v1");
7
+ }
8
+ assertNonEmptyString(value.packageName, "PackageContractManifest.packageName");
9
+ return {
10
+ ...copyExtensionFields(value),
11
+ format: "api-contract.package.v1",
12
+ packageName: value.packageName,
13
+ ...(value.catalogs === undefined ? {} : { catalogs: parseArray(value.catalogs, "catalogs").map((catalog) => defineFeatureCatalog(catalog)) }),
14
+ ...(value.supported === undefined ? {} : { supported: parseArray(value.supported, "supported").map(parseSurface) }),
15
+ ...(value.required === undefined ? {} : { required: parseArray(value.required, "required").map(parseSurface) }),
16
+ ...(value.emits === undefined ? {} : { emits: parseArray(value.emits, "emits").map(parseSurface) }),
17
+ ...(value.usage === undefined ? {} : { usage: parseArray(value.usage, "usage").map((usage) => usage) })
18
+ };
19
+ }
20
+ function parseSurface(value) {
21
+ assertObject(value, "Surface");
22
+ if (value.format !== "api-contract.surface.v1") {
23
+ throw new Error("Surface.format must be api-contract.surface.v1");
24
+ }
25
+ assertNonEmptyString(value.contractId, "Surface.contractId");
26
+ const features = parseArray(value.features, "Surface.features");
27
+ for (const feature of features)
28
+ assertNonEmptyString(feature, "Surface.features[]");
29
+ const meta = value.meta === undefined ? undefined : value.meta;
30
+ const surface = meta === undefined
31
+ ? createSurface({ contractId: value.contractId, features: features })
32
+ : createSurface({ contractId: value.contractId, features: features, meta });
33
+ if (typeof value.hash === "string" && value.hash !== surface.hash) {
34
+ throw new Error(`Surface.hash mismatch for ${value.contractId}: expected ${surface.hash}, got ${value.hash}`);
35
+ }
36
+ return surface;
37
+ }
38
+ function parseArray(value, label) {
39
+ if (!Array.isArray(value)) {
40
+ throw new Error(`${label} must be an array`);
41
+ }
42
+ return value;
43
+ }
44
+ function assertObject(value, label) {
45
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
46
+ throw new Error(`${label} must be an object`);
47
+ }
48
+ }
49
+ function assertNonEmptyString(value, label) {
50
+ if (typeof value !== "string" || value.length === 0) {
51
+ throw new Error(`${label} must be a non-empty string`);
52
+ }
53
+ }
54
+ function copyExtensionFields(value) {
55
+ const out = {};
56
+ for (const [key, entry] of Object.entries(value)) {
57
+ if (key.startsWith("x-"))
58
+ out[key] = entry;
59
+ }
60
+ return out;
61
+ }
62
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ export type ContractId = string;
2
+ export type FeatureId = string;
3
+ export type SurfaceHash = `sha256:${string}`;
4
+ export type ReleaseTag = "public" | "beta" | "alpha" | "internal";
5
+ export type KnownStabilityLabel = "stable" | "preview" | "experimental" | "generated" | "dev-only" | "internal";
6
+ export type StabilityLabel = KnownStabilityLabel | (string & {});
7
+ export type FeatureLifecycle = "active" | "deprecated" | "removed";
8
+ export type ExtensionFields = {
9
+ readonly [key: `x-${string}`]: unknown;
10
+ };
11
+ export interface FeatureSpec extends ExtensionFields {
12
+ id: FeatureId;
13
+ title: string;
14
+ releaseTag: ReleaseTag;
15
+ stability?: StabilityLabel;
16
+ lifecycle?: FeatureLifecycle;
17
+ description?: string;
18
+ docsUrl?: string;
19
+ since?: string;
20
+ deprecatedSince?: string;
21
+ removedSince?: string;
22
+ replacedBy?: FeatureId;
23
+ group?: string;
24
+ }
25
+ export interface FeatureCatalog extends ExtensionFields {
26
+ format: "api-contract.catalog.v1";
27
+ contractId: ContractId;
28
+ title?: string;
29
+ features: readonly FeatureSpec[];
30
+ }
31
+ export interface Surface extends ExtensionFields {
32
+ format: "api-contract.surface.v1";
33
+ contractId: ContractId;
34
+ features: readonly FeatureId[];
35
+ hash: SurfaceHash;
36
+ meta?: Record<string, unknown>;
37
+ }
38
+ export interface ContractSet extends ExtensionFields {
39
+ format: "api-contract.set.v1";
40
+ surfaces: readonly Surface[];
41
+ hash: SurfaceHash;
42
+ }
43
+ export interface PackageContractManifest extends ExtensionFields {
44
+ format: "api-contract.package.v1";
45
+ packageName: string;
46
+ catalogs?: readonly FeatureCatalog[];
47
+ supported?: readonly Surface[];
48
+ required?: readonly Surface[];
49
+ emits?: readonly Surface[];
50
+ usage?: readonly UsageSurface[];
51
+ }
52
+ export interface ComparePolicy extends ExtensionFields {
53
+ catalog?: FeatureCatalog;
54
+ catalogs?: readonly FeatureCatalog[];
55
+ allowedReleaseTags?: readonly ReleaseTag[];
56
+ deprecated?: "allow" | "warn" | "error";
57
+ removed?: "allow" | "warn" | "error";
58
+ unknownFeatures?: "allow" | "warn" | "error";
59
+ }
60
+ export interface SurfaceComparison {
61
+ ok: boolean;
62
+ missing: readonly FeatureId[];
63
+ unsupported: readonly FeatureId[];
64
+ warnings: readonly string[];
65
+ }
66
+ export interface DeriveRule {
67
+ name: string;
68
+ visit(value: unknown, context: DeriveContext): void;
69
+ children?(value: unknown, context: DeriveContext): Iterable<unknown>;
70
+ }
71
+ export interface DeriveContext {
72
+ path: readonly PropertyKey[];
73
+ add(feature: FeatureId): void;
74
+ }
75
+ export interface DeriveSurfaceOptions {
76
+ contractId: ContractId;
77
+ rules: readonly DeriveRule[];
78
+ catalog?: FeatureCatalog;
79
+ strictCatalog?: boolean;
80
+ }
81
+ export interface UsageLocation {
82
+ file: string;
83
+ line?: number;
84
+ importPath?: string;
85
+ symbol?: string;
86
+ feature?: FeatureId;
87
+ }
88
+ export interface UsageSurface {
89
+ packageName: string;
90
+ dependencyName: string;
91
+ surface: Surface;
92
+ evidence: "published-manifest" | "type-contract" | "runtime-derived" | "source-scan";
93
+ locations?: readonly UsageLocation[];
94
+ }
95
+ export interface ImpactReport {
96
+ ok: boolean;
97
+ providerPackage: string;
98
+ removedFeatures: readonly FeatureId[];
99
+ changedFeatures: readonly FeatureId[];
100
+ impactedConsumers: readonly UsageSurface[];
101
+ unaffectedConsumers: readonly UsageSurface[];
102
+ }
103
+ export interface ContractDiff {
104
+ addedFeatures: readonly FeatureId[];
105
+ removedFeatures: readonly FeatureId[];
106
+ changedFeatures: readonly FeatureId[];
107
+ deprecatedFeatures: readonly FeatureId[];
108
+ }
109
+ export interface LedgerConfig extends ExtensionFields {
110
+ title?: string;
111
+ reviewRule?: string;
112
+ sections?: readonly LedgerSection[];
113
+ }
114
+ export interface LedgerSection extends ExtensionFields {
115
+ id: string;
116
+ title: string;
117
+ type: "features" | "surfaces" | "package-exports" | "cli" | "runtime" | "http" | "generated" | "config" | "internal-boundaries";
118
+ groups?: readonly string[];
119
+ }
120
+ export interface RenderLedgerInput {
121
+ manifest: PackageContractManifest;
122
+ title?: string;
123
+ reviewRule?: string;
124
+ }
125
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { ContractSet, Surface } from "./model.js";
2
+ export declare function createSurface(input: {
3
+ contractId: string;
4
+ features: Iterable<string>;
5
+ meta?: Record<string, unknown>;
6
+ }): Surface;
7
+ export declare function createContractSet(surfaces: Iterable<Surface>): ContractSet;
8
+ //# sourceMappingURL=surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.d.ts","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGvD,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,GAAG,OAAO,CAaV;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,WAAW,CAY1E"}
@@ -0,0 +1,26 @@
1
+ import { hashJson, normalizeFeatureIds, surfaceHash } from "./hash.js";
2
+ export function createSurface(input) {
3
+ const surface = {
4
+ format: "api-contract.surface.v1",
5
+ contractId: input.contractId,
6
+ features: normalizeFeatureIds(input.features),
7
+ hash: surfaceHash({ contractId: input.contractId, features: input.features })
8
+ };
9
+ if (input.meta !== undefined) {
10
+ surface.meta = input.meta;
11
+ }
12
+ return surface;
13
+ }
14
+ export function createContractSet(surfaces) {
15
+ const normalized = [...surfaces]
16
+ .map((surface) => surface.meta === undefined
17
+ ? createSurface({ contractId: surface.contractId, features: surface.features })
18
+ : createSurface({ contractId: surface.contractId, features: surface.features, meta: surface.meta }))
19
+ .sort((a, b) => a.contractId.localeCompare(b.contractId));
20
+ return {
21
+ format: "api-contract.set.v1",
22
+ surfaces: normalized,
23
+ hash: hashJson(normalized.map((surface) => [surface.contractId, surface.hash]))
24
+ };
25
+ }
26
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEvE,MAAM,UAAU,aAAa,CAAC,KAI7B;IACC,MAAM,OAAO,GAAY;QACvB,MAAM,EAAE,yBAAyB;QACjC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC7C,IAAI,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;KAC9E,CAAC;IAEF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA2B;IAC3D,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,CAAC;SAC7B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;QAC1C,CAAC,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC/E,CAAC,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;SACrG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAE5D,OAAO;QACL,MAAM,EAAE,qBAAqB;QAC7B,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;KAChF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type ContractRef<Id extends string = string, Features extends string = string> = {
2
+ readonly __apiContract?: {
3
+ readonly id: Id;
4
+ readonly features: Features;
5
+ };
6
+ };
7
+ export type RequiresContract<Id extends string = string, Features extends string = string> = ContractRef<Id, Features> & {
8
+ readonly __requiresContract?: true;
9
+ };
10
+ export type SupportsContract<Id extends string = string, Features extends string = string> = ContractRef<Id, Features> & {
11
+ readonly __supportsContract?: true;
12
+ };
13
+ export type ContractIdOf<T> = T extends ContractRef<infer Id, string> ? Id : never;
14
+ export type FeaturesOf<T> = T extends ContractRef<string, infer Features> ? Features : never;
15
+ export type MissingFeatures<Required, Supported> = Exclude<FeaturesOf<Required>, FeaturesOf<Supported>>;
16
+ export type IsLooseFeatureSet<T> = string extends FeaturesOf<T> ? true : false;
17
+ export type IsCompatible<Required, Supported> = IsLooseFeatureSet<Required> extends true ? boolean : IsLooseFeatureSet<Supported> extends true ? boolean : ContractIdOf<Required> extends ContractIdOf<Supported> ? MissingFeatures<Required, Supported> extends never ? true : false : false;
18
+ export type AssertCompatible<Required, Supported> = IsCompatible<Required, Supported> extends true ? true : IsCompatible<Required, Supported> extends boolean ? true : ["Missing API contract features", MissingFeatures<Required, Supported>];
19
+ export type Expect<T extends true> = T;
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,CACrB,EAAE,SAAS,MAAM,GAAG,MAAM,EAC1B,QAAQ,SAAS,MAAM,GAAG,MAAM,IAC9B;IACF,QAAQ,CAAC,aAAa,CAAC,EAAE;QACvB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;QAChB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC7B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAC1B,EAAE,SAAS,MAAM,GAAG,MAAM,EAC1B,QAAQ,SAAS,MAAM,GAAG,MAAM,IAC9B,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG;IAC9B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAC1B,EAAE,SAAS,MAAM,GAAG,MAAM,EAC1B,QAAQ,SAAS,MAAM,GAAG,MAAM,IAC9B,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG;IAC9B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IACxB,CAAC,SAAS,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAEvD,MAAM,MAAM,UAAU,CAAC,CAAC,IACtB,CAAC,SAAS,WAAW,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEnE,MAAM,MAAM,eAAe,CAAC,QAAQ,EAAE,SAAS,IAC7C,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAEvD,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAC7B,MAAM,SAAS,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAE9C,MAAM,MAAM,YAAY,CAAC,QAAQ,EAAE,SAAS,IAC1C,iBAAiB,CAAC,QAAQ,CAAC,SAAS,IAAI,GAAG,OAAO,GAClD,iBAAiB,CAAC,SAAS,CAAC,SAAS,IAAI,GAAG,OAAO,GACnD,YAAY,CAAC,QAAQ,CAAC,SAAS,YAAY,CAAC,SAAS,CAAC,GAClD,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,KAAK,GAChD,IAAI,GACJ,KAAK,GACP,KAAK,CAAC;AAEZ,MAAM,MAAM,gBAAgB,CAAC,QAAQ,EAAE,SAAS,IAC9C,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,IAAI,GAC1C,IAAI,GACJ,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,OAAO,GAC/C,IAAI,GACJ,CAAC,+BAA+B,EAAE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAEhF,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { FeatureCatalog, UsageSurface } from "./model.js";
2
+ export declare function createUsageSurface(input: {
3
+ packageName: string;
4
+ dependencyName: string;
5
+ contractId: string;
6
+ features: Iterable<string>;
7
+ evidence: UsageSurface["evidence"];
8
+ locations?: UsageSurface["locations"];
9
+ }): UsageSurface;
10
+ export declare function scanUsageTarget(input: {
11
+ target: string;
12
+ packageName: string;
13
+ dependencyName: string;
14
+ catalog: FeatureCatalog;
15
+ }): UsageSurface;
16
+ //# sourceMappingURL=usage-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-scan.d.ts","sourceRoot":"","sources":["../src/usage-scan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;AAI9E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;CACvC,GAAG,YAAY,CAQf;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG,YAAY,CAkCf"}
@@ -0,0 +1,66 @@
1
+ import { readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { extname, join, relative } from "node:path";
3
+ import { createSurface } from "./surface.js";
4
+ const sourceExtensions = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"]);
5
+ export function createUsageSurface(input) {
6
+ return {
7
+ packageName: input.packageName,
8
+ dependencyName: input.dependencyName,
9
+ surface: createSurface({ contractId: input.contractId, features: input.features }),
10
+ evidence: input.evidence,
11
+ ...(input.locations === undefined ? {} : { locations: input.locations })
12
+ };
13
+ }
14
+ export function scanUsageTarget(input) {
15
+ const featureIds = input.catalog.features.map((feature) => feature.id);
16
+ const usedFeatures = new Set();
17
+ const locations = [];
18
+ for (const file of listSourceFiles(input.target)) {
19
+ const text = readFileSync(file, "utf8");
20
+ const lines = text.split(/\r?\n/g);
21
+ for (const [index, line] of lines.entries()) {
22
+ const hasDependency = line.includes(input.dependencyName);
23
+ const lineFeatures = featureIds.filter((feature) => line.includes(feature));
24
+ for (const feature of lineFeatures)
25
+ usedFeatures.add(feature);
26
+ if (hasDependency || lineFeatures.length > 0) {
27
+ const baseLocation = { file: relative(input.target, file), line: index + 1 };
28
+ const importPath = hasDependency ? { importPath: input.dependencyName } : {};
29
+ if (lineFeatures.length === 0) {
30
+ locations.push({ ...baseLocation, ...importPath });
31
+ }
32
+ else {
33
+ for (const feature of lineFeatures) {
34
+ locations.push({ ...baseLocation, ...importPath, feature });
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ return createUsageSurface({
41
+ packageName: input.packageName,
42
+ dependencyName: input.dependencyName,
43
+ contractId: input.catalog.contractId,
44
+ features: usedFeatures,
45
+ evidence: "source-scan",
46
+ locations
47
+ });
48
+ }
49
+ function listSourceFiles(target) {
50
+ const stat = statSync(target);
51
+ if (stat.isFile())
52
+ return sourceExtensions.has(extname(target)) ? [target] : [];
53
+ const out = [];
54
+ for (const entry of readdirSync(target)) {
55
+ if (entry === "node_modules" || entry === "dist" || entry === ".git")
56
+ continue;
57
+ const full = join(target, entry);
58
+ const entryStat = statSync(full);
59
+ if (entryStat.isDirectory())
60
+ out.push(...listSourceFiles(full));
61
+ else if (entryStat.isFile() && sourceExtensions.has(extname(full)))
62
+ out.push(full);
63
+ }
64
+ return out.sort();
65
+ }
66
+ //# sourceMappingURL=usage-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-scan.js","sourceRoot":"","sources":["../src/usage-scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjG,MAAM,UAAU,kBAAkB,CAAC,KAOlC;IACC,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,OAAO,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClF,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;KACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAK/B;IACC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,SAAS,GAAoB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5E,KAAK,MAAM,OAAO,IAAI,YAAY;gBAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,aAAa,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC7E,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9B,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;gBACrD,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;wBACnC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,kBAAkB,CAAC;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU;QACpC,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,aAAa;QACvB,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,MAAM,EAAE;QAAE,OAAO,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM;YAAE,SAAS;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,SAAS,CAAC,WAAW,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;aAC3D,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,13 @@
1
+ {
2
+ "subject": "npm:@async/claims-pipeline@1.0.0",
3
+ "claim": "requires-api-contract",
4
+ "surface": {
5
+ "format": "api-contract.surface.v1",
6
+ "contractId": "@async/pipeline.declaration",
7
+ "features": ["step.shell", "task.run"],
8
+ "hash": "sha256:6ed689db2412e486f7b1c57ba255d8ab244e9d1a801ebc143049449bc4b21a95"
9
+ },
10
+ "evidence": "published-manifest",
11
+ "issuer": "npm:@async/claims-pipeline",
12
+ "issuedAt": "2026-06-14T00:00:00Z"
13
+ }
@@ -0,0 +1,26 @@
1
+ # @async/db API Surface Ledger
2
+
3
+ This file is the generated review ledger for semantic API contract features. It is current-state contract documentation, not a changelog or tutorial.
4
+
5
+ ## Async DB Package Surface
6
+
7
+ Contract: `@async/db.package`
8
+
9
+ ### Cli
10
+
11
+ | Feature | Title | Release | Stability | Lifecycle | Replacement | Docs |
12
+ | --- | --- | --- | --- | --- | --- | --- |
13
+ | `cli.sync` | async-db sync command | public | stable | active | | |
14
+
15
+ ### Package Exports
16
+
17
+ | Feature | Title | Release | Stability | Lifecycle | Replacement | Docs |
18
+ | --- | --- | --- | --- | --- | --- | --- |
19
+ | `export.hono` | Optional Hono integration export | beta | preview | active | | |
20
+ | `export.root` | Root package export | public | stable | active | | |
21
+
22
+ ## Supported Surfaces
23
+
24
+ | Contract | Hash | Features |
25
+ | --- | --- | --- |
26
+ | `@async/db.package` | `sha256:30ee7f5f65023461567b6de4e3bd81370207de1231e5d85c6153d4161dc43a36` | `cli.sync`, `export.hono`, `export.root` |