@dsgraph/core 0.0.0-stage → 0.3.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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -2
  3. package/dist/code.d.ts +80 -0
  4. package/dist/code.d.ts.map +1 -0
  5. package/dist/code.js +119 -0
  6. package/dist/code.js.map +1 -0
  7. package/dist/diagnostics.d.ts +14 -0
  8. package/dist/diagnostics.d.ts.map +1 -0
  9. package/dist/diagnostics.js +38 -0
  10. package/dist/diagnostics.js.map +1 -0
  11. package/dist/diff/diff.d.ts +19 -0
  12. package/dist/diff/diff.d.ts.map +1 -0
  13. package/dist/diff/diff.js +260 -0
  14. package/dist/diff/diff.js.map +1 -0
  15. package/dist/diff/rename.d.ts +32 -0
  16. package/dist/diff/rename.d.ts.map +1 -0
  17. package/dist/diff/rename.js +153 -0
  18. package/dist/diff/rename.js.map +1 -0
  19. package/dist/diff/semver.d.ts +23 -0
  20. package/dist/diff/semver.d.ts.map +1 -0
  21. package/dist/diff/semver.js +58 -0
  22. package/dist/diff/semver.js.map +1 -0
  23. package/dist/dtcg/flatten.d.ts +32 -0
  24. package/dist/dtcg/flatten.d.ts.map +1 -0
  25. package/dist/dtcg/flatten.js +109 -0
  26. package/dist/dtcg/flatten.js.map +1 -0
  27. package/dist/dtcg/merge.d.ts +15 -0
  28. package/dist/dtcg/merge.d.ts.map +1 -0
  29. package/dist/dtcg/merge.js +158 -0
  30. package/dist/dtcg/merge.js.map +1 -0
  31. package/dist/dtcg/resolve.d.ts +36 -0
  32. package/dist/dtcg/resolve.d.ts.map +1 -0
  33. package/dist/dtcg/resolve.js +345 -0
  34. package/dist/dtcg/resolve.js.map +1 -0
  35. package/dist/graph.d.ts +56 -0
  36. package/dist/graph.d.ts.map +1 -0
  37. package/dist/graph.js +139 -0
  38. package/dist/graph.js.map +1 -0
  39. package/dist/impact.d.ts +34 -0
  40. package/dist/impact.d.ts.map +1 -0
  41. package/dist/impact.js +83 -0
  42. package/dist/impact.js.map +1 -0
  43. package/dist/index.d.ts +27 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +27 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/json.d.ts +9 -0
  48. package/dist/json.d.ts.map +1 -0
  49. package/dist/json.js +58 -0
  50. package/dist/json.js.map +1 -0
  51. package/dist/not-tokens.d.ts +6 -0
  52. package/dist/not-tokens.d.ts.map +1 -0
  53. package/dist/not-tokens.js +6 -0
  54. package/dist/not-tokens.js.map +1 -0
  55. package/dist/path.d.ts +20 -0
  56. package/dist/path.d.ts.map +1 -0
  57. package/dist/path.js +121 -0
  58. package/dist/path.js.map +1 -0
  59. package/dist/pointer.d.ts +11 -0
  60. package/dist/pointer.d.ts.map +1 -0
  61. package/dist/pointer.js +38 -0
  62. package/dist/pointer.js.map +1 -0
  63. package/dist/resolver/modes.d.ts +16 -0
  64. package/dist/resolver/modes.d.ts.map +1 -0
  65. package/dist/resolver/modes.js +183 -0
  66. package/dist/resolver/modes.js.map +1 -0
  67. package/dist/resolver/resolve.d.ts +14 -0
  68. package/dist/resolver/resolve.d.ts.map +1 -0
  69. package/dist/resolver/resolve.js +34 -0
  70. package/dist/resolver/resolve.js.map +1 -0
  71. package/dist/resolver/system.d.ts +48 -0
  72. package/dist/resolver/system.d.ts.map +1 -0
  73. package/dist/resolver/system.js +312 -0
  74. package/dist/resolver/system.js.map +1 -0
  75. package/dist/scan.d.ts +38 -0
  76. package/dist/scan.d.ts.map +1 -0
  77. package/dist/scan.js +135 -0
  78. package/dist/scan.js.map +1 -0
  79. package/dist/snapshot.d.ts +20 -0
  80. package/dist/snapshot.d.ts.map +1 -0
  81. package/dist/snapshot.js +152 -0
  82. package/dist/snapshot.js.map +1 -0
  83. package/dist/source.d.ts +14 -0
  84. package/dist/source.d.ts.map +1 -0
  85. package/dist/source.js +15 -0
  86. package/dist/source.js.map +1 -0
  87. package/dist/values/canonical.d.ts +14 -0
  88. package/dist/values/canonical.d.ts.map +1 -0
  89. package/dist/values/canonical.js +301 -0
  90. package/dist/values/canonical.js.map +1 -0
  91. package/dist/values/color.d.ts +30 -0
  92. package/dist/values/color.d.ts.map +1 -0
  93. package/dist/values/color.js +196 -0
  94. package/dist/values/color.js.map +1 -0
  95. package/dist/values/compare.d.ts +17 -0
  96. package/dist/values/compare.d.ts.map +1 -0
  97. package/dist/values/compare.js +136 -0
  98. package/dist/values/compare.js.map +1 -0
  99. package/dist/values/context.d.ts +15 -0
  100. package/dist/values/context.d.ts.map +1 -0
  101. package/dist/values/context.js +16 -0
  102. package/dist/values/context.js.map +1 -0
  103. package/dist/values/dimension.d.ts +9 -0
  104. package/dist/values/dimension.d.ts.map +1 -0
  105. package/dist/values/dimension.js +44 -0
  106. package/dist/values/dimension.js.map +1 -0
  107. package/dist/values/expression.d.ts +38 -0
  108. package/dist/values/expression.d.ts.map +1 -0
  109. package/dist/values/expression.js +219 -0
  110. package/dist/values/expression.js.map +1 -0
  111. package/package.json +42 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Adam Reznik
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 CHANGED
@@ -1,3 +1,9 @@
1
- # Temporary Holding Version
1
+ # @dsgraph/core
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Design-system graph core. Isomorphic: runs in the browser and in Node.
4
+
5
+ - DTCG 2025.10 Format, Color and Resolver modules, with a lenient mode for legacy files
6
+ - `scan(source, config)` → snapshot; `buildSnapshot(system, options)`
7
+ - `DsGraph` — `value`, `entry`, `chain`, `dependencies`, `dependents`, `byValue`, `byCssVar`, `tokens(filter)`
8
+ - `diff(base, head, options)` → changeset with renames, per-context changes, causes and semver levels
9
+ - `compareValues`, `canonicalValue`, color helpers (`deltaEOK`, `toOklab`, `colorToHex`, `isInSrgbGamut`)
package/dist/code.d.ts ADDED
@@ -0,0 +1,80 @@
1
+ import { type Token } from '@dsgraph/schema';
2
+ import type { DsGraph } from './graph.js';
3
+ import type { Input } from './resolver/system.js';
4
+ /**
5
+ * What a project's code does with the design system: where it reads tokens (`var(--…)`) and where
6
+ * it writes values by hand. Built by a code scanner (`scanStyles` in `@dsgraph/adapters`) and kept
7
+ * apart from the token snapshot: the same code is checked against several versions of the tokens.
8
+ */
9
+ export interface CodeIndex {
10
+ /** Files that were read, relative to the project root. */
11
+ files: string[];
12
+ uses: TokenUse[];
13
+ literals: StyleLiteral[];
14
+ /** Files that could not be read or parsed. */
15
+ skipped: Array<{
16
+ file: string;
17
+ message: string;
18
+ }>;
19
+ }
20
+ export interface CodeLoc {
21
+ file: string;
22
+ line: number;
23
+ column: number;
24
+ }
25
+ /** One `var(--name)` in a style. */
26
+ export interface TokenUse extends CodeLoc {
27
+ /** The custom property as written, `--color-accent`. */
28
+ name: string;
29
+ /** CSS property it is used in (`color`, `padding`, or a custom property it defines). */
30
+ property: string;
31
+ selector?: string;
32
+ /** Fallback written after the name, `var(--x, #fff)`. */
33
+ fallback?: string;
34
+ }
35
+ /** A value written by hand where a token could be used. */
36
+ export interface StyleLiteral extends CodeLoc {
37
+ property: string;
38
+ selector?: string;
39
+ /** The value as written, `#3366ff`, `12px`. */
40
+ text: string;
41
+ type: 'color' | 'dimension';
42
+ /** Canonical DTCG value. */
43
+ value: unknown;
44
+ }
45
+ /**
46
+ * Matches custom property names from code to tokens. Ids of CSS tokens match as written; DTCG paths
47
+ * match by normalized name (`--color-blue-500` ↔ `color.blue.500`). A prefix (`--ds-`) is taken from
48
+ * `prefix`, or learned: a leading segment that several names share and that, removed, names tokens.
49
+ */
50
+ export declare class VarMatcher {
51
+ private readonly graph;
52
+ private readonly prefixes;
53
+ constructor(graph: DsGraph, names?: Iterable<string>, prefix?: string);
54
+ /** The token a custom property names, or undefined. */
55
+ token(name: string): Token | undefined;
56
+ /** Whether a custom property is meant to be a design-system variable (carries a known prefix). */
57
+ isSystemName(name: string): boolean;
58
+ get prefix(): string | undefined;
59
+ private byName;
60
+ }
61
+ /** How far apart two values of a type are, in the unit people think in; undefined when not comparable. */
62
+ export declare function valueDistance(type: string, a: unknown, b: unknown, remBase?: number): number | undefined;
63
+ export interface NearestToken {
64
+ token: Token;
65
+ value: unknown;
66
+ /** ΔE for colors, px for dimensions, ms for durations. */
67
+ distance: number;
68
+ /** Within what people cannot tell apart: ΔE < 1, < 0.5px; equal otherwise. */
69
+ exact: boolean;
70
+ }
71
+ /**
72
+ * Tokens nearest to a value in one context. Deprecated ones go last; among equally close tokens,
73
+ * the ones that reference another token (semantic tokens, which follow themes) come before the
74
+ * primitives that hold the value.
75
+ */
76
+ export declare function nearestTokens(graph: DsGraph, parsed: {
77
+ type: string;
78
+ value: unknown;
79
+ }, input: Input, limit: number): NearestToken[];
80
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../src/code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAIjD;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,8CAA8C;IAC9C,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,oCAAoC;AACpC,MAAM,WAAW,QAAS,SAAQ,OAAO;IACvC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAa,SAAQ,OAAO;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,GAAG,WAAW,CAAA;IAC3B,4BAA4B;IAC5B,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;GAIG;AACH,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAEnC,YACmB,KAAK,EAAE,OAAO,EAC/B,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAM,EAC5B,MAAM,CAAC,EAAE,MAAM,EAGhB;IAED,uDAAuD;IACvD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CASrC;IAED,kGAAkG;IAClG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlC;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,OAAO,CAAC,MAAM;CAIf;AAwBD,0GAA0G;AAC1G,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,SAAM,GAAG,MAAM,GAAG,SAAS,CAcrG;AAQD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EACxC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,GACZ,YAAY,EAAE,CAuBhB"}
package/dist/code.js ADDED
@@ -0,0 +1,119 @@
1
+ import { canonicalize } from '@dsgraph/schema';
2
+ import { normalizeName } from './path.js';
3
+ import { deltaEOK } from './values/color.js';
4
+ import { toPx } from './values/dimension.js';
5
+ /**
6
+ * Matches custom property names from code to tokens. Ids of CSS tokens match as written; DTCG paths
7
+ * match by normalized name (`--color-blue-500` ↔ `color.blue.500`). A prefix (`--ds-`) is taken from
8
+ * `prefix`, or learned: a leading segment that several names share and that, removed, names tokens.
9
+ */
10
+ export class VarMatcher {
11
+ graph;
12
+ prefixes;
13
+ constructor(graph, names = [], prefix) {
14
+ this.graph = graph;
15
+ this.prefixes = prefix ? [normalizeName(prefix.replace(/^--/, ''))] : learnPrefixes(graph, names);
16
+ }
17
+ /** The token a custom property names, or undefined. */
18
+ token(name) {
19
+ const bare = name.replace(/^--/, '');
20
+ const exact = this.graph.token(bare);
21
+ if (exact)
22
+ return exact;
23
+ const n = normalizeName(bare);
24
+ const direct = this.byName(n);
25
+ if (direct)
26
+ return direct;
27
+ for (const p of this.prefixes)
28
+ if (n.startsWith(`${p}.`))
29
+ return this.byName(n.slice(p.length + 1));
30
+ return undefined;
31
+ }
32
+ /** Whether a custom property is meant to be a design-system variable (carries a known prefix). */
33
+ isSystemName(name) {
34
+ const n = normalizeName(name.replace(/^--/, ''));
35
+ return this.prefixes.some((p) => n.startsWith(`${p}.`));
36
+ }
37
+ get prefix() {
38
+ return this.prefixes[0];
39
+ }
40
+ byName(n) {
41
+ const hits = this.graph.byCssVar(`--${n}`);
42
+ return hits.length === 1 ? hits[0] : undefined;
43
+ }
44
+ }
45
+ /** Leading segments that, removed, turn most names that carry them into token names. */
46
+ function learnPrefixes(graph, names) {
47
+ const stats = new Map();
48
+ for (const name of new Set(names)) {
49
+ const n = normalizeName(name.replace(/^--/, ''));
50
+ if (graph.token(name.replace(/^--/, '')) || graph.byCssVar(`--${n}`).length)
51
+ continue;
52
+ const dot = n.indexOf('.');
53
+ if (dot < 0)
54
+ continue;
55
+ const head = n.slice(0, dot);
56
+ const s = stats.get(head) ?? { total: 0, hits: 0 };
57
+ s.total++;
58
+ if (graph.byCssVar(`--${n.slice(dot + 1)}`).length === 1)
59
+ s.hits++;
60
+ stats.set(head, s);
61
+ }
62
+ return [...stats]
63
+ .filter(([, s]) => s.hits >= 2 && s.hits / s.total >= 0.5)
64
+ .sort((a, b) => b[1].hits - a[1].hits || a[0].localeCompare(b[0]))
65
+ .map(([p]) => p);
66
+ }
67
+ const REM = 16;
68
+ /** How far apart two values of a type are, in the unit people think in; undefined when not comparable. */
69
+ export function valueDistance(type, a, b, remBase = REM) {
70
+ if (type === 'color')
71
+ return deltaEOK(a, b);
72
+ if (type === 'dimension') {
73
+ const pa = toPx(a, remBase);
74
+ const pb = toPx(b, remBase);
75
+ return pa !== undefined && pb !== undefined ? Math.abs(pa - pb) : undefined;
76
+ }
77
+ if (type === 'duration') {
78
+ const ms = (d) => (d.unit === 's' ? d.value * 1000 : d.value);
79
+ return Math.abs(ms(a) - ms(b));
80
+ }
81
+ if (typeof a === 'number' && typeof b === 'number')
82
+ return Math.abs(a - b);
83
+ // Font families, cubic béziers and the like are either the same or not comparable.
84
+ return canonicalize(a) === canonicalize(b) ? 0 : undefined;
85
+ }
86
+ /** Types a value can stand for: a bare number may be a font weight. */
87
+ const COMPATIBLE = {
88
+ number: ['number', 'fontWeight'],
89
+ fontWeight: ['fontWeight', 'number'],
90
+ };
91
+ /**
92
+ * Tokens nearest to a value in one context. Deprecated ones go last; among equally close tokens,
93
+ * the ones that reference another token (semantic tokens, which follow themes) come before the
94
+ * primitives that hold the value.
95
+ */
96
+ export function nearestTokens(graph, parsed, input, limit) {
97
+ const types = COMPATIBLE[parsed.type] ?? [parsed.type];
98
+ const out = [];
99
+ const depth = new Map();
100
+ for (const token of graph.tokens({ type: types })) {
101
+ const value = graph.value(token.id, input);
102
+ if (value === undefined || value === null)
103
+ continue;
104
+ const d = valueDistance(token.type === parsed.type ? parsed.type : token.type, parsed.value, value);
105
+ if (d === undefined)
106
+ continue;
107
+ const exact = parsed.type === 'color' ? d < 1 : parsed.type === 'dimension' ? d < 0.5 : d === 0;
108
+ const m = { token, value, distance: Math.round(d * 100) / 100, exact };
109
+ out.push(m);
110
+ depth.set(m, graph.chain(token.id, input).length);
111
+ }
112
+ return out
113
+ .sort((a, b) => Number(a.token.deprecated !== null) - Number(b.token.deprecated !== null) ||
114
+ a.distance - b.distance ||
115
+ depth.get(b) - depth.get(a) ||
116
+ a.token.id.localeCompare(b.token.id))
117
+ .slice(0, limit);
118
+ }
119
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../src/code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type Diagnostic, type Loc, type Severity } from '@dsgraph/schema';
2
+ /** Collects diagnostics, deduplicating identical entries. */
3
+ export declare class DiagnosticBag {
4
+ private readonly items;
5
+ add(code: string, severity: Severity, message: string, loc?: Loc): void;
6
+ error(code: string, message: string, loc?: Loc): void;
7
+ warn(code: string, message: string, loc?: Loc): void;
8
+ info(code: string, message: string, loc?: Loc): void;
9
+ merge(other: DiagnosticBag): void;
10
+ hasErrors(): boolean;
11
+ /** Sorted by file, pointer, code, message for deterministic output. */
12
+ list(): Diagnostic[];
13
+ }
14
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAExF,6DAA6D;AAC7D,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEtD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAItE;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAEpD;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAEnD;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAEnD;IAED,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEhC;IAED,SAAS,IAAI,OAAO,CAGnB;IAED,uEAAuE;IACvE,IAAI,IAAI,UAAU,EAAE,CAQnB;CACF"}
@@ -0,0 +1,38 @@
1
+ import { canonicalize } from '@dsgraph/schema';
2
+ /** Collects diagnostics, deduplicating identical entries. */
3
+ export class DiagnosticBag {
4
+ items = new Map();
5
+ add(code, severity, message, loc) {
6
+ const d = loc ? { code, severity, message, loc } : { code, severity, message };
7
+ const key = canonicalize(d);
8
+ if (!this.items.has(key))
9
+ this.items.set(key, d);
10
+ }
11
+ error(code, message, loc) {
12
+ this.add(code, 'error', message, loc);
13
+ }
14
+ warn(code, message, loc) {
15
+ this.add(code, 'warning', message, loc);
16
+ }
17
+ info(code, message, loc) {
18
+ this.add(code, 'info', message, loc);
19
+ }
20
+ merge(other) {
21
+ for (const d of other.list())
22
+ this.add(d.code, d.severity, d.message, d.loc);
23
+ }
24
+ hasErrors() {
25
+ for (const d of this.items.values())
26
+ if (d.severity === 'error')
27
+ return true;
28
+ return false;
29
+ }
30
+ /** Sorted by file, pointer, code, message for deterministic output. */
31
+ list() {
32
+ return [...this.items.values()].sort((a, b) => (a.loc?.file ?? '').localeCompare(b.loc?.file ?? '') ||
33
+ (a.loc?.pointer ?? '').localeCompare(b.loc?.pointer ?? '') ||
34
+ a.code.localeCompare(b.code) ||
35
+ a.message.localeCompare(b.message));
36
+ }
37
+ }
38
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA4C,MAAM,iBAAiB,CAAA;AAExF,6DAA6D;AAC7D,MAAM,OAAO,aAAa;IACP,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAA;IAEtD,GAAG,CAAC,IAAY,EAAE,QAAkB,EAAE,OAAe,EAAE,GAAS;QAC9D,MAAM,CAAC,GAAe,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;QAC1F,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,OAAe,EAAE,GAAS;QAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,OAAe,EAAE,GAAS;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,OAAe,EAAE,GAAS;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,KAAoB;QACxB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;IAC9E,CAAC;IAED,SAAS;QACP,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAA;QAC5E,OAAO,KAAK,CAAA;IACd,CAAC;IAED,uEAAuE;IACvE,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;YACpD,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC;YAC1D,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5B,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CACrC,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { type Changeset } from '@dsgraph/schema';
2
+ import type { DsGraph } from '../graph.js';
3
+ import { type CompareOptions } from '../values/compare.js';
4
+ import { mergePolicy } from './semver.js';
5
+ export interface DiffOptions {
6
+ compare?: Partial<CompareOptions>;
7
+ /** Explicit renames: old path → new path. */
8
+ renames?: Record<string, string>;
9
+ /** `$extensions` keys ignored when comparing (e.g. volatile timestamps). */
10
+ ignoreExtensions?: string[];
11
+ semver?: Parameters<typeof mergePolicy>[0];
12
+ /** Layers with `public: false` are capped at patch. */
13
+ layers?: Record<string, {
14
+ public?: boolean;
15
+ }>;
16
+ }
17
+ /** Compares two snapshots (spec section 5) and classifies every change (section 6). */
18
+ export declare function diff(base: DsGraph, head: DsGraph, opts?: DiffOptions): Promise<Changeset>;
19
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EAMf,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,KAAK,cAAc,EAAkC,MAAM,sBAAsB,CAAA;AAE1F,OAAO,EAAiC,WAAW,EAAqB,MAAM,aAAa,CAAA;AAE3F,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IACjC,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1C,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAC9C;AAID,uFAAuF;AACvF,wBAAsB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAuLnG"}
@@ -0,0 +1,260 @@
1
+ import { CHANGESET_SCHEMA, canonicalize, sha256Hex, } from '@dsgraph/schema';
2
+ import { enumerateInputs } from '../resolver/system.js';
3
+ import { compareValues, DEFAULT_COMPARE } from '../values/compare.js';
4
+ import { detectRenames } from './rename.js';
5
+ import { LEVEL_RANK, levelOf, maxLevel, mergePolicy } from './semver.js';
6
+ /** Compares two snapshots (spec section 5) and classifies every change (section 6). */
7
+ export async function diff(base, head, opts = {}) {
8
+ const compare = { ...DEFAULT_COMPARE, ...opts.compare };
9
+ const policy = mergePolicy(opts.semver);
10
+ const drafts = [];
11
+ const draft = (d) => {
12
+ const full = { when: null, origin: 'direct', cause: [], confidence: 1, ...d };
13
+ drafts.push(full);
14
+ return full;
15
+ };
16
+ // 1. Contexts.
17
+ const bm = new Map(base.modifiers.map((m) => [m.name, m]));
18
+ const hm = new Map(head.modifiers.map((m) => [m.name, m]));
19
+ for (const name of bm.keys())
20
+ if (!hm.has(name))
21
+ draft({ kind: 'modifier.removed', target: name });
22
+ for (const name of hm.keys())
23
+ if (!bm.has(name))
24
+ draft({ kind: 'modifier.added', target: name });
25
+ const common = [...bm.keys()].filter((n) => hm.has(n));
26
+ for (const name of common) {
27
+ const bc = bm.get(name).contexts;
28
+ const hc = hm.get(name).contexts;
29
+ for (const c of bc)
30
+ if (!hc.includes(c))
31
+ draft({ kind: 'context.removed', target: `${name}:${c}` });
32
+ for (const c of hc)
33
+ if (!bc.includes(c))
34
+ draft({ kind: 'context.added', target: `${name}:${c}` });
35
+ }
36
+ const shared = common.map((name) => ({
37
+ name,
38
+ contexts: bm.get(name).contexts.filter((c) => hm.get(name).contexts.includes(c)),
39
+ }));
40
+ const extra = {};
41
+ for (const m of [...base.modifiers, ...head.modifiers])
42
+ if (!common.includes(m.name))
43
+ extra[m.name] = m.default ?? m.contexts[0];
44
+ const inputs = enumerateInputs(shared).map((i) => ({ ...extra, ...i }));
45
+ const sharedNames = shared.map((m) => m.name);
46
+ // 2–3. Match by id, then renames.
47
+ const baseIds = new Set(base.snapshot.nodes.tokens.map((t) => t.id));
48
+ const headIds = new Set(head.snapshot.nodes.tokens.map((t) => t.id));
49
+ const removed = [...baseIds].filter((id) => !headIds.has(id)).sort();
50
+ const added = [...headIds].filter((id) => !baseIds.has(id)).sort();
51
+ const { renames, ambiguous } = detectRenames(base, head, removed, added, inputs, {
52
+ hints: opts.renames,
53
+ compare,
54
+ });
55
+ const renamedFrom = new Map(renames.map((r) => [r.from, r]));
56
+ const renamedTo = new Set(renames.map((r) => r.to));
57
+ for (const id of removed) {
58
+ if (renamedFrom.has(id))
59
+ continue;
60
+ const d = draft({ kind: 'token.removed', target: id, before: summarize(base.token(id)) });
61
+ const possible = ambiguous.get(id);
62
+ if (possible) {
63
+ d.possibleRenames = possible;
64
+ d.note = 'Several tokens with equal values and similar paths were added; rename not assumed.';
65
+ }
66
+ }
67
+ for (const id of added)
68
+ if (!renamedTo.has(id))
69
+ draft({ kind: 'token.added', target: id, after: summarize(head.token(id)) });
70
+ for (const r of renames)
71
+ draft({ kind: 'token.renamed', target: r.to, from: r.from, confidence: r.confidence });
72
+ // 4. Common and renamed tokens.
73
+ const pairs = [
74
+ ...[...baseIds].filter((id) => headIds.has(id)).map((id) => [id, id]),
75
+ ...renames.map((r) => [r.from, r.to]),
76
+ ];
77
+ // dsgraph's own metadata (`dev.dsgraph`) describes the source, not the token; never a change.
78
+ const ignore = new Set(['dev.dsgraph', ...(opts.ignoreExtensions ?? [])]);
79
+ for (const [bid, hid] of pairs.sort((a, b) => a[1].localeCompare(b[1]))) {
80
+ const b = base.token(bid);
81
+ const h = head.token(hid);
82
+ if (b.type !== h.type)
83
+ draft({ kind: 'token.type-changed', target: hid, before: b.type, after: h.type });
84
+ const perInput = [];
85
+ for (const input of inputs) {
86
+ const bv = base.entry(bid, input);
87
+ const hv = head.entry(hid, input);
88
+ if (bv && !hv) {
89
+ perInput.push({ input, sig: 'missing', d: { kind: 'token.missing-in-context', before: bv.value } });
90
+ continue;
91
+ }
92
+ if (!bv || !hv)
93
+ continue;
94
+ const rawSame = canonicalize(bv.raw) === canonicalize(hv.raw);
95
+ const r = b.type === h.type
96
+ ? compareValues(h.type, bv.value, hv.value, compare)
97
+ : { result: 'changed' };
98
+ let d;
99
+ if (r.result === 'changed') {
100
+ d = {
101
+ kind: 'token.value-changed',
102
+ origin: rawSame ? 'propagated' : 'direct',
103
+ before: { raw: bv.raw, value: bv.value },
104
+ after: { raw: hv.raw, value: hv.value },
105
+ };
106
+ if ('delta' in r && r.delta)
107
+ d.delta = r.delta;
108
+ }
109
+ else if (!rawSame) {
110
+ const refsSame = canonicalize(bv.refs) === canonicalize(hv.refs);
111
+ d = refsSame
112
+ ? { kind: 'token.notation-changed', before: { raw: bv.raw }, after: { raw: hv.raw } }
113
+ : { kind: 'token.alias-retargeted', before: { raw: bv.raw }, after: { raw: hv.raw } };
114
+ }
115
+ if (d)
116
+ perInput.push({ input, sig: canonicalize(d), d });
117
+ }
118
+ for (const { when, d } of compressByWhen(perInput, inputs, sharedNames))
119
+ draft({ ...d, target: hid, when });
120
+ const bInfl = influencing(b);
121
+ const hInfl = influencing(h);
122
+ if (canonicalize(bInfl) !== canonicalize(hInfl))
123
+ draft({ kind: 'token.contexts-changed', target: hid, before: bInfl, after: hInfl });
124
+ if (!b.deprecated && h.deprecated)
125
+ draft({ kind: 'token.deprecated', target: hid, after: h.deprecated });
126
+ if (b.deprecated && !h.deprecated)
127
+ draft({ kind: 'token.undeprecated', target: hid, before: b.deprecated });
128
+ if ((b.description ?? '') !== (h.description ?? ''))
129
+ draft({ kind: 'token.description-changed', target: hid, before: b.description, after: h.description });
130
+ if (canonicalize(stripExt(b.extensions, ignore)) !== canonicalize(stripExt(h.extensions, ignore)))
131
+ draft({ kind: 'token.extensions-changed', target: hid });
132
+ }
133
+ // 6. Groups: $extends.
134
+ const bg = new Map(base.snapshot.nodes.groups.map((g) => [g.id, g]));
135
+ for (const g of head.snapshot.nodes.groups) {
136
+ const prev = bg.get(g.id);
137
+ if (prev && (prev.extends ?? null) !== (g.extends ?? null))
138
+ draft({ kind: 'group.extends-changed', target: g.id, before: prev.extends, after: g.extends });
139
+ }
140
+ // 5. Causes of propagated value changes.
141
+ const directValue = new Map();
142
+ for (const d of drafts)
143
+ if (d.kind === 'token.value-changed' && d.origin === 'direct')
144
+ directValue.set(d.target, [...(directValue.get(d.target) ?? []), d]);
145
+ // 7. Ids and levels.
146
+ const changes = [];
147
+ const idOf = new Map();
148
+ for (const d of drafts)
149
+ idOf.set(d, `chg_${(await sha256Hex(canonicalize({ k: d.kind, t: d.target, w: d.when, f: d.from }))).slice(0, 12)}`);
150
+ for (const d of drafts) {
151
+ if (d.kind === 'token.value-changed' && d.origin === 'propagated') {
152
+ const deps = head.dependencies(d.target, { transitive: true });
153
+ d.cause = deps.flatMap((dep) => (directValue.get(dep) ?? []).map((c) => idOf.get(c))).sort();
154
+ }
155
+ const token = d.kind.startsWith('token.') ? (head.token(d.target) ?? base.token(d.target)) : undefined;
156
+ const isPublic = token?.layer ? opts.layers?.[token.layer]?.public !== false : true;
157
+ changes.push({ ...d, id: idOf.get(d), level: levelOf(d, policy, isPublic) });
158
+ }
159
+ changes.sort((a, b) => LEVEL_RANK[b.level] - LEVEL_RANK[a.level] ||
160
+ a.target.localeCompare(b.target) ||
161
+ a.kind.localeCompare(b.kind) ||
162
+ canonicalize(a.when).localeCompare(canonicalize(b.when)));
163
+ const counts = {
164
+ added: 0,
165
+ removed: 0,
166
+ renamed: 0,
167
+ changed: 0,
168
+ propagated: 0,
169
+ deprecated: 0,
170
+ };
171
+ for (const c of changes) {
172
+ if (c.kind === 'token.added')
173
+ counts.added++;
174
+ else if (c.kind === 'token.removed')
175
+ counts.removed++;
176
+ else if (c.kind === 'token.renamed')
177
+ counts.renamed++;
178
+ else if (c.kind === 'token.value-changed')
179
+ c.origin === 'direct' ? counts.changed++ : counts.propagated++;
180
+ else if (c.kind === 'token.deprecated')
181
+ counts.deprecated++;
182
+ }
183
+ const level = maxLevel(changes.map((c) => c.level));
184
+ return {
185
+ schema: CHANGESET_SCHEMA,
186
+ base: { hash: base.snapshot.hash, source: base.snapshot.source },
187
+ head: { hash: head.snapshot.hash, source: head.snapshot.source },
188
+ contexts: { compared: inputs, partial: base.snapshot.contexts.partial || head.snapshot.contexts.partial },
189
+ summary: { counts, level, reasons: reasons(changes, level) },
190
+ changes,
191
+ diagnostics: [],
192
+ };
193
+ }
194
+ function summarize(t) {
195
+ return { type: t.type, values: t.values.map((v) => ({ when: v.when, raw: v.raw, value: v.value })) };
196
+ }
197
+ function influencing(t) {
198
+ const names = new Set();
199
+ for (const v of t.values)
200
+ for (const k of Object.keys(v.when))
201
+ names.add(k);
202
+ return [...names].sort();
203
+ }
204
+ function stripExt(ext, ignore) {
205
+ if (!ext)
206
+ return {};
207
+ return Object.fromEntries(Object.entries(ext).filter(([k]) => !ignore.has(k)));
208
+ }
209
+ /**
210
+ * Collapses identical per-input changes into the smallest `when` that covers exactly
211
+ * the inputs where they occur; falls back to full inputs otherwise.
212
+ */
213
+ function compressByWhen(perInput, inputs, names) {
214
+ const groups = new Map();
215
+ for (const p of perInput) {
216
+ const g = groups.get(p.sig) ?? { d: p.d, inputs: [] };
217
+ g.inputs.push(p.input);
218
+ groups.set(p.sig, g);
219
+ }
220
+ const out = [];
221
+ for (const g of groups.values()) {
222
+ const when = {};
223
+ for (const n of names) {
224
+ const values = new Set(g.inputs.map((i) => i[n]));
225
+ if (values.size === 1)
226
+ when[n] = [...values][0];
227
+ }
228
+ const covered = inputs.filter((i) => Object.entries(when).every(([k, v]) => i[k] === v));
229
+ if (covered.length === g.inputs.length)
230
+ out.push({ when: Object.keys(when).length ? when : null, d: g.d });
231
+ else
232
+ for (const i of g.inputs)
233
+ out.push({ when: Object.fromEntries(names.map((n) => [n, i[n]])), d: g.d });
234
+ }
235
+ return out;
236
+ }
237
+ const KIND_LABEL = {
238
+ 'token.removed': 'removed',
239
+ 'token.renamed': 'renamed',
240
+ 'token.type-changed': 'changed type',
241
+ 'token.missing-in-context': 'missing in a context',
242
+ 'context.removed': 'context removed',
243
+ 'modifier.removed': 'modifier removed',
244
+ 'token.added': 'added',
245
+ 'token.value-changed': 'value changed',
246
+ 'token.deprecated': 'deprecated',
247
+ 'context.added': 'context added',
248
+ 'modifier.added': 'modifier added',
249
+ };
250
+ function reasons(changes, level) {
251
+ const counts = new Map();
252
+ for (const c of changes) {
253
+ if (c.level !== level || level === 'none')
254
+ continue;
255
+ const label = KIND_LABEL[c.kind] ?? c.kind;
256
+ counts.set(label, (counts.get(label) ?? 0) + 1);
257
+ }
258
+ return [...counts].map(([label, n]) => `${n} ${label}`);
259
+ }
260
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/diff/diff.ts"],"names":[],"mappings":"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"}