@apexops/renderers 0.10.0-next.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 (38) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/document-registry.d.ts +17 -0
  3. package/dist/document-registry.d.ts.map +1 -0
  4. package/dist/document-registry.js +138 -0
  5. package/dist/document-registry.js.map +1 -0
  6. package/dist/index.d.ts +6 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +6 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/markdown.d.ts +5 -0
  11. package/dist/markdown.d.ts.map +1 -0
  12. package/dist/markdown.js +30 -0
  13. package/dist/markdown.js.map +1 -0
  14. package/dist/renderers.d.ts +7 -0
  15. package/dist/renderers.d.ts.map +1 -0
  16. package/dist/renderers.js +154 -0
  17. package/dist/renderers.js.map +1 -0
  18. package/dist/scorecard.d.ts +19 -0
  19. package/dist/scorecard.d.ts.map +1 -0
  20. package/dist/scorecard.js +70 -0
  21. package/dist/scorecard.js.map +1 -0
  22. package/dist/semantic-diff.d.ts +17 -0
  23. package/dist/semantic-diff.d.ts.map +1 -0
  24. package/dist/semantic-diff.js +80 -0
  25. package/dist/semantic-diff.js.map +1 -0
  26. package/dist/test/renderers.test.d.ts +2 -0
  27. package/dist/test/renderers.test.d.ts.map +1 -0
  28. package/dist/test/renderers.test.js +182 -0
  29. package/dist/test/renderers.test.js.map +1 -0
  30. package/dist/test/scorecard.test.d.ts +2 -0
  31. package/dist/test/scorecard.test.d.ts.map +1 -0
  32. package/dist/test/scorecard.test.js +129 -0
  33. package/dist/test/scorecard.test.js.map +1 -0
  34. package/dist/test/semantic-diff.test.d.ts +2 -0
  35. package/dist/test/semantic-diff.test.d.ts.map +1 -0
  36. package/dist/test/semantic-diff.test.js +19 -0
  37. package/dist/test/semantic-diff.test.js.map +1 -0
  38. package/package.json +38 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorecard.test.d.ts","sourceRoot":"","sources":["../../src/test/scorecard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { evaluateQualityScorecard, renderQualityScorecardEvaluation } from "../index.js";
4
+ const scorecard = {
5
+ schemaVersion: "1.0.0",
6
+ frozenAt: "2026-07-01T00:00:00Z",
7
+ rules: [
8
+ {
9
+ metric: "minimum",
10
+ direction: "min",
11
+ target: 90,
12
+ tolerance: 2,
13
+ scenario: "base",
14
+ minimumSamples: 2,
15
+ source: "kernel",
16
+ owner: "quality",
17
+ unavailable: "block",
18
+ },
19
+ {
20
+ metric: "maximum",
21
+ direction: "max",
22
+ target: 10,
23
+ tolerance: 1,
24
+ scenario: "base",
25
+ minimumSamples: 1,
26
+ source: "kernel",
27
+ owner: "quality",
28
+ unavailable: "block",
29
+ },
30
+ {
31
+ metric: "exact-pass",
32
+ direction: "exact",
33
+ target: 5,
34
+ tolerance: 0.5,
35
+ scenario: "base",
36
+ minimumSamples: 1,
37
+ source: "vscode",
38
+ owner: "quality",
39
+ unavailable: "block",
40
+ },
41
+ {
42
+ metric: "exact-fail",
43
+ direction: "exact",
44
+ target: 5,
45
+ tolerance: 0.5,
46
+ scenario: "base",
47
+ minimumSamples: 1,
48
+ source: "vscode",
49
+ owner: "quality",
50
+ unavailable: "block",
51
+ },
52
+ {
53
+ metric: "undersampled-block",
54
+ direction: "min",
55
+ target: 1,
56
+ tolerance: 0,
57
+ scenario: "base",
58
+ minimumSamples: 3,
59
+ source: "estimated",
60
+ owner: "quality",
61
+ unavailable: "block",
62
+ },
63
+ {
64
+ metric: "undersampled-omit",
65
+ direction: "min",
66
+ target: 1,
67
+ tolerance: 0,
68
+ scenario: "base",
69
+ minimumSamples: 3,
70
+ source: "estimated",
71
+ owner: "quality",
72
+ unavailable: "omit-claim",
73
+ },
74
+ {
75
+ metric: "missing-block",
76
+ direction: "max",
77
+ target: 1,
78
+ tolerance: 0,
79
+ scenario: "base",
80
+ minimumSamples: 1,
81
+ source: "kernel",
82
+ owner: "quality",
83
+ unavailable: "block",
84
+ },
85
+ {
86
+ metric: "missing-omit",
87
+ direction: "max",
88
+ target: 1,
89
+ tolerance: 0,
90
+ scenario: "base",
91
+ minimumSamples: 1,
92
+ source: "kernel",
93
+ owner: "quality",
94
+ unavailable: "omit-claim",
95
+ },
96
+ ],
97
+ };
98
+ test("scorecard applies direction, tolerance, sample, and unavailable rules mechanically", () => {
99
+ const measurements = [
100
+ { metric: "minimum", scenario: "base", value: 88, samples: 2 },
101
+ { metric: "maximum", scenario: "base", value: 11, samples: 1 },
102
+ { metric: "exact-pass", scenario: "base", value: 5.5, samples: 1 },
103
+ { metric: "exact-fail", scenario: "base", value: 5.51, samples: 1 },
104
+ { metric: "undersampled-block", scenario: "base", value: 2, samples: 2 },
105
+ { metric: "undersampled-omit", scenario: "base", value: 2, samples: 2 },
106
+ ];
107
+ const byMetric = new Map(evaluateQualityScorecard(scorecard, measurements).map((item) => [item.metric, item]));
108
+ assert.equal(byMetric.get("minimum")?.decision, "pass");
109
+ assert.equal(byMetric.get("maximum")?.decision, "pass");
110
+ assert.equal(byMetric.get("exact-pass")?.decision, "pass");
111
+ assert.equal(byMetric.get("exact-fail")?.decision, "fail");
112
+ assert.equal(byMetric.get("undersampled-block")?.decision, "fail");
113
+ assert.equal(byMetric.get("undersampled-omit")?.decision, "omitted");
114
+ assert.equal(byMetric.get("missing-block")?.decision, "fail");
115
+ assert.equal(byMetric.get("missing-omit")?.decision, "omitted");
116
+ });
117
+ test("scorecard evaluation and Markdown ordering are deterministic", () => {
118
+ const measurements = [
119
+ { metric: "maximum", scenario: "base", value: 12, samples: 1 },
120
+ { metric: "minimum", scenario: "base", value: 87.99, samples: 2 },
121
+ ];
122
+ const reversed = { ...scorecard, rules: [...scorecard.rules].reverse() };
123
+ assert.deepEqual(evaluateQualityScorecard(scorecard, measurements), evaluateQualityScorecard(reversed, measurements));
124
+ const rendered = renderQualityScorecardEvaluation(scorecard, measurements);
125
+ assert.equal(rendered, renderQualityScorecardEvaluation(reversed, [...measurements].reverse()));
126
+ assert.match(rendered, /\| maximum \| base \| max \| 10 \| 1 \| 12 \| 1\/1 \| FAIL \|/);
127
+ assert.match(rendered, /\| minimum \| base \| min \| 90 \| 2 \| 87.99 \| 2\/2 \| FAIL \|/);
128
+ });
129
+ //# sourceMappingURL=scorecard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorecard.test.js","sourceRoot":"","sources":["../../src/test/scorecard.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAEzF,MAAM,SAAS,GAAuB;IACpC,aAAa,EAAE,OAAO;IACtB,QAAQ,EAAE,sBAAsB;IAChC,KAAK,EAAE;QACL;YACE,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,OAAO;SACrB;QACD;YACE,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,OAAO;SACrB;QACD;YACE,MAAM,EAAE,YAAY;YACpB,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,OAAO;SACrB;QACD;YACE,MAAM,EAAE,YAAY;YACpB,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,OAAO;SACrB;QACD;YACE,MAAM,EAAE,oBAAoB;YAC5B,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,OAAO;SACrB;QACD;YACE,MAAM,EAAE,mBAAmB;YAC3B,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,YAAY;SAC1B;QACD;YACE,MAAM,EAAE,eAAe;YACvB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,OAAO;SACrB;QACD;YACE,MAAM,EAAE,cAAc;YACtB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,MAAM;YAChB,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,YAAY;SAC1B;KACF;CACF,CAAC;AAEF,IAAI,CAAC,oFAAoF,EAAE,GAAG,EAAE;IAC9F,MAAM,YAAY,GAAG;QACnB,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;QAC9D,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;QAC9D,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE;QAClE,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;QACnE,EAAE,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QACxE,EAAE,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;KAC/D,CAAC;IAEX,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,wBAAwB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IACxE,MAAM,YAAY,GAAG;QACnB,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;QAC9D,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;KAClE,CAAC;IACF,MAAM,QAAQ,GAAuB,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;IAE7F,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,wBAAwB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACtH,MAAM,QAAQ,GAAG,gCAAgC,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC3E,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,gCAAgC,CAAC,QAAQ,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,+DAA+D,CAAC,CAAC;IACxF,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,kEAAkE,CAAC,CAAC;AAC7F,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=semantic-diff.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-diff.test.d.ts","sourceRoot":"","sources":["../../src/test/semantic-diff.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { renderSemanticDiff, semanticDiff } from "../index.js";
4
+ test("semantic diff returns sorted JSON Pointer leaf paths", () => {
5
+ const result = semanticDiff({ retained: 1, removed: { "a/b": true }, changed: "old", array: [1] }, { retained: 1, added: { "x~y": true }, changed: "new", array: [1, 2] });
6
+ assert.deepEqual(result.added, ["/added/x~0y", "/array/1"]);
7
+ assert.deepEqual(result.removed, ["/removed/a~1b"]);
8
+ assert.deepEqual(result.changed, [{ path: "/changed", before: "old", after: "new" }]);
9
+ });
10
+ test("semantic diff Markdown is stable and escapes table content", () => {
11
+ const diff = semanticDiff({ value: "left|\u0001" }, { value: "right\nline" });
12
+ const first = renderSemanticDiff(diff);
13
+ const second = renderSemanticDiff(diff);
14
+ assert.equal(first, second);
15
+ assert.match(first, /left\\\|\\\\u0001/);
16
+ assert.match(first, /right\\\\nline/);
17
+ assert.doesNotMatch(first, /\u0001/);
18
+ });
19
+ //# sourceMappingURL=semantic-diff.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-diff.test.js","sourceRoot":"","sources":["../../src/test/semantic-diff.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,MAAM,GAAG,YAAY,CACzB,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EACrE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CACvE,CAAC;IAEF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5D,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACxF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4DAA4D,EAAE,GAAG,EAAE;IACtE,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACtC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@apexops/renderers",
3
+ "version": "0.10.0-next.0",
4
+ "description": "Deterministic Markdown renderers for APEX vNext contracts",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/jonathan-vella/apex-vnext.git",
9
+ "directory": "packages/renderers"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public",
13
+ "provenance": true,
14
+ "tag": "next"
15
+ },
16
+ "type": "module",
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "dependencies": {
29
+ "@apexops/contracts": "0.10.0-next.0"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc -b",
33
+ "test": "node --test dist/test/*.test.js"
34
+ },
35
+ "engines": {
36
+ "node": ">=24"
37
+ }
38
+ }