@dsgraph/rules 0.2.0 → 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.
package/dist/check.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type Config, type DsGraph, type Finding, type Severity } from '@dsgraph/core';
1
+ import { type CodeIndex, type Config, type DsGraph, type Finding, type Severity } from '@dsgraph/core';
2
2
  import type { Rule } from './types.js';
3
3
  export declare const RULES: readonly Rule[];
4
4
  export interface Setting {
@@ -11,6 +11,8 @@ export declare function resolveSettings(config: Config, rules?: readonly Rule[])
11
11
  * Runs the rules over a graph. Parse diagnostics of the snapshot are reported as findings too;
12
12
  * their severity can be overridden (or turned off) by code in `rules`.
13
13
  */
14
- export declare function check(graph: DsGraph, config?: Config, extraRules?: readonly Rule[]): Promise<Finding[]>;
14
+ export declare function check(graph: DsGraph, config?: Config, extraRules?: readonly Rule[], opts?: {
15
+ code?: CodeIndex;
16
+ }): Promise<Finding[]>;
15
17
  export declare function countBySeverity(findings: readonly Finding[]): Record<Severity, number>;
16
18
  //# sourceMappingURL=check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAEX,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,QAAQ,EAEd,MAAM,eAAe,CAAA;AAYtB,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,YAAY,CAAA;AAEnD,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAUhC,CAAA;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAID,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,IAAI,EAAU,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBpG;AAED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,MAAW,EACnB,UAAU,GAAE,SAAS,IAAI,EAAO,GAC/B,OAAO,CAAC,OAAO,EAAE,CAAC,CAsDpB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAItF"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,MAAM,EAEX,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,QAAQ,EAGd,MAAM,eAAe,CAAA;AAatB,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,YAAY,CAAA;AAEnD,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAehC,CAAA;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAID,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,IAAI,EAAU,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBpG;AAED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,MAAW,EACnB,UAAU,GAAE,SAAS,IAAI,EAAO,EAChC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,SAAS,CAAA;CAAO,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC,CAiEpB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAItF"}
package/dist/check.js CHANGED
@@ -1,5 +1,6 @@
1
- import { canonicalize, sha256Hex, } from '@dsgraph/core';
1
+ import { canonicalize, sha256Hex, VarMatcher, } from '@dsgraph/core';
2
2
  import { PRESETS } from './presets.js';
3
+ import { deprecatedUsage, hardcodedColor, offScale, unknownToken, unusedToken } from './rules/code.js';
3
4
  import { aliasDepth, allowedSources } from './rules/layers.js';
4
5
  import { contrastMatrix, deprecatedReference, duplicateStops, hexMismatch, nonMonotonicPalette, normalizedCollision, outOfGamut, } from './rules/tokens.js';
5
6
  export const RULES = [
@@ -12,6 +13,11 @@ export const RULES = [
12
13
  contrastMatrix,
13
14
  aliasDepth,
14
15
  allowedSources,
16
+ hardcodedColor,
17
+ offScale,
18
+ deprecatedUsage,
19
+ unknownToken,
20
+ unusedToken,
15
21
  ];
16
22
  const RANK = { error: 3, warning: 2, info: 1 };
17
23
  /** Rule defaults → presets from `extends` (in order) → `rules` from the config. */
@@ -44,9 +50,13 @@ export function resolveSettings(config, rules = RULES) {
44
50
  * Runs the rules over a graph. Parse diagnostics of the snapshot are reported as findings too;
45
51
  * their severity can be overridden (or turned off) by code in `rules`.
46
52
  */
47
- export async function check(graph, config = {}, extraRules = []) {
53
+ export async function check(graph, config = {}, extraRules = [], opts = {}) {
48
54
  const rules = [...RULES, ...extraRules];
49
55
  const settings = resolveSettings(config, rules);
56
+ const code = opts.code;
57
+ const vars = code
58
+ ? new VarMatcher(graph, code.uses.map((u) => u.name), config.code?.prefix)
59
+ : undefined;
50
60
  const drafts = [];
51
61
  const byOrigin = new Map();
52
62
  for (const t of graph.tokens())
@@ -69,6 +79,7 @@ export async function check(graph, config = {}, extraRules = []) {
69
79
  graph,
70
80
  options: setting.options,
71
81
  config,
82
+ ...(code && vars ? { code, vars } : {}),
72
83
  report(r) {
73
84
  const f = {
74
85
  rule: rule.id,
@@ -82,7 +93,9 @@ export async function check(graph, config = {}, extraRules = []) {
82
93
  f.evidence = r.evidence;
83
94
  if (r.when)
84
95
  f.when = r.when;
85
- if (r.token)
96
+ if (r.loc)
97
+ f.loc = r.loc;
98
+ else if (r.token)
86
99
  f.loc = r.token.origin;
87
100
  drafts.push(f);
88
101
  },
@@ -92,7 +105,8 @@ export async function check(graph, config = {}, extraRules = []) {
92
105
  const findings = [];
93
106
  for (const d of drafts)
94
107
  findings.push({
95
- id: `${d.rule}#${(await sha256Hex(canonicalize({ n: d.nodes, w: d.when, m: d.message }))).slice(0, 12)}`,
108
+ // Findings in code differ by position; findings on tokens keep the ids they had.
109
+ id: `${d.rule}#${(await sha256Hex(canonicalize(d.loc?.line ? { n: d.nodes, w: d.when, m: d.message, l: d.loc } : { n: d.nodes, w: d.when, m: d.message }))).slice(0, 12)}`,
96
110
  ...d,
97
111
  });
98
112
  return findings.sort((a, b) => RANK[b.severity] - RANK[a.severity] ||
package/dist/check.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Rule, RuleContext } from '../types.js';
2
+ export declare const hardcodedColor: Rule;
3
+ export declare const offScale: Rule;
4
+ export declare const deprecatedUsage: Rule;
5
+ export declare const unknownToken: Rule;
6
+ /** Tokens the code reads, with everything they take their values from. */
7
+ export declare function usedTokens(ctx: Pick<RuleContext, 'graph' | 'code' | 'vars'>): Set<string>;
8
+ export declare const unusedToken: Rule;
9
+ //# sourceMappingURL=code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.d.ts","sourceRoot":"","sources":["../../src/rules/code.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAoDpD,eAAO,MAAM,cAAc,EAAE,IA8B5B,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,IAiCtB,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,IAoB7B,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,IAkB1B,CAAA;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CASzF;AAED,eAAO,MAAM,WAAW,EAAE,IAazB,CAAA"}
@@ -0,0 +1,188 @@
1
+ import { matchGlob, nearestTokens, normalizeName, } from '@dsgraph/core';
2
+ const asArray = (v) => Array.isArray(v) ? v.filter((x) => typeof x === 'string') : [];
3
+ /** `exceptions: { files: ["src/legacy/**"], values: ["#000", "100%"] }` */
4
+ function excepted(options) {
5
+ const ex = (options.exceptions ?? {});
6
+ const files = asArray(ex.files);
7
+ const values = new Set(asArray(ex.values).map((v) => v.toLowerCase()));
8
+ return (l) => (files.length > 0 && matchGlob(l.file, files)) ||
9
+ (l.text !== undefined && values.has(l.text.toLowerCase()));
10
+ }
11
+ const locOf = (l) => ({
12
+ file: l.file,
13
+ line: l.line,
14
+ column: l.column,
15
+ });
16
+ /**
17
+ * Which scale a property takes values from, by token names. Spacing falls back to every dimension
18
+ * when names say nothing; radii and font sizes are not compared with spacing.
19
+ */
20
+ const FAMILIES = [
21
+ { property: /radius$/i, names: /(^|\.)(radius|radii|rounded|corner|round)(\.|$)/, strict: true },
22
+ { property: /^font-size$/i, names: /(^|\.)(font|text|type|typography)(\.|$)/, strict: true },
23
+ {
24
+ property: /.*/,
25
+ names: /(^|\.)(space|spacing|spacer|gap|gutter|inset|size|sizing|stack|layout)(\.|$)/,
26
+ strict: false,
27
+ },
28
+ ];
29
+ function scaleOf(graph, property, cache) {
30
+ const family = FAMILIES.find((f) => f.property.test(property));
31
+ let tokens = cache.get(family.names);
32
+ if (!tokens) {
33
+ const all = graph.tokens({ type: 'dimension' });
34
+ const named = all.filter((t) => family.names.test(normalizeName(t.id)));
35
+ tokens = named.length || family.strict ? named : all;
36
+ cache.set(family.names, tokens);
37
+ }
38
+ return tokens;
39
+ }
40
+ function nearestIn(graph, l, among) {
41
+ const all = nearestTokens(graph, { type: l.type, value: l.value }, graph.defaultInput(), among ? 10_000 : 1);
42
+ return among ? all.find((m) => among.has(m.token.id)) : all[0];
43
+ }
44
+ export const hardcodedColor = {
45
+ id: 'style/hardcoded-color',
46
+ description: 'A color in a style is written by hand instead of taken from a token.',
47
+ defaultSeverity: 'warning',
48
+ run({ graph, code, options, report }) {
49
+ if (!code || graph.tokens({ type: 'color' }).length === 0)
50
+ return;
51
+ const skip = excepted(options);
52
+ const memo = new Map();
53
+ for (const l of code.literals) {
54
+ if (l.type !== 'color' || skip(l))
55
+ continue;
56
+ const key = l.text.toLowerCase();
57
+ if (!memo.has(key))
58
+ memo.set(key, nearestIn(graph, l));
59
+ const near = memo.get(key);
60
+ if (!near)
61
+ continue;
62
+ report({
63
+ message: near.exact
64
+ ? `Color "${l.text}" in ${l.property} is written by hand; use "${near.token.id}"`
65
+ : `Color "${l.text}" in ${l.property} is not in the palette; closest is "${near.token.id}" (ΔE ${near.distance})`,
66
+ nodes: [near.token.id],
67
+ evidence: {
68
+ value: l.text,
69
+ property: l.property,
70
+ selector: l.selector,
71
+ token: near.token.id,
72
+ deltaE: near.distance,
73
+ },
74
+ loc: locOf(l),
75
+ });
76
+ }
77
+ },
78
+ };
79
+ export const offScale = {
80
+ id: 'style/off-scale',
81
+ description: 'A spacing, radius or font size in a style is written by hand: on the scale (use the token) or off it.',
82
+ defaultSeverity: 'warning',
83
+ run({ graph, code, options, report }) {
84
+ if (!code || graph.tokens({ type: 'dimension' }).length === 0)
85
+ return;
86
+ const skip = excepted(options);
87
+ const scales = new Map();
88
+ for (const l of code.literals) {
89
+ if (l.type !== 'dimension' || skip(l))
90
+ continue;
91
+ const scale = scaleOf(graph, l.property, scales);
92
+ const near = nearestIn(graph, l, new Set(scale.map((t) => t.id)));
93
+ if (!near)
94
+ continue;
95
+ const px = near.value;
96
+ report({
97
+ message: near.exact
98
+ ? `"${l.text}" in ${l.property} is on the scale; use "${near.token.id}"`
99
+ : `"${l.text}" in ${l.property} is off the scale; closest is "${near.token.id}" (${px.value}${px.unit})`,
100
+ nodes: [near.token.id],
101
+ evidence: {
102
+ value: l.text,
103
+ property: l.property,
104
+ selector: l.selector,
105
+ token: near.token.id,
106
+ distance: near.distance,
107
+ },
108
+ loc: locOf(l),
109
+ // A value that has a token is a quick fix; one that has none is a design question.
110
+ ...(near.exact ? { severity: 'info' } : {}),
111
+ });
112
+ }
113
+ },
114
+ };
115
+ export const deprecatedUsage = {
116
+ id: 'usage/deprecated',
117
+ description: 'The code uses a deprecated token.',
118
+ defaultSeverity: 'warning',
119
+ run({ code, vars, options, report }) {
120
+ if (!code || !vars)
121
+ return;
122
+ const skip = excepted(options);
123
+ for (const u of code.uses) {
124
+ if (skip(u))
125
+ continue;
126
+ const t = vars.token(u.name);
127
+ if (!t?.deprecated)
128
+ continue;
129
+ const replacement = t.deprecated.replacement;
130
+ report({
131
+ message: `"${u.name}" is deprecated${replacement ? `; use "${replacement}"` : ''}`,
132
+ nodes: [t.id],
133
+ evidence: { reason: t.deprecated.reason, replacement, property: u.property },
134
+ loc: locOf(u),
135
+ });
136
+ }
137
+ },
138
+ };
139
+ export const unknownToken = {
140
+ id: 'usage/unknown-token',
141
+ description: "The code uses a design-system variable that is not in the tokens (removed, renamed or misspelled). Needs the system's prefix, configured or learned.",
142
+ defaultSeverity: 'error',
143
+ run({ code, vars, options, report }) {
144
+ if (!code || !vars)
145
+ return;
146
+ const skip = excepted(options);
147
+ for (const u of code.uses) {
148
+ if (skip(u) || !vars.isSystemName(u.name) || vars.token(u.name))
149
+ continue;
150
+ report({
151
+ message: `"${u.name}" is not a token${u.fallback ? `; the fallback "${u.fallback}" is used instead` : ''}`,
152
+ nodes: [],
153
+ evidence: { property: u.property, fallback: u.fallback },
154
+ loc: locOf(u),
155
+ });
156
+ }
157
+ },
158
+ };
159
+ /** Tokens the code reads, with everything they take their values from. */
160
+ export function usedTokens(ctx) {
161
+ const used = new Set();
162
+ for (const u of ctx.code?.uses ?? []) {
163
+ const t = ctx.vars?.token(u.name);
164
+ if (!t || used.has(t.id))
165
+ continue;
166
+ used.add(t.id);
167
+ for (const d of ctx.graph.dependencies(t.id, { transitive: true }))
168
+ used.add(d);
169
+ }
170
+ return used;
171
+ }
172
+ export const unusedToken = {
173
+ id: 'token/unused',
174
+ description: 'A token is not used by the code, directly or through another token.',
175
+ defaultSeverity: 'info',
176
+ run(ctx) {
177
+ const { graph, code, report } = ctx;
178
+ if (!code || code.uses.length === 0)
179
+ return;
180
+ const used = usedTokens(ctx);
181
+ for (const t of graph.tokens()) {
182
+ if (used.has(t.id) || t.deprecated)
183
+ continue;
184
+ report({ message: `"${t.id}" is not used in the code`, nodes: [t.id], token: t });
185
+ }
186
+ },
187
+ };
188
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/rules/code.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,14 +1,20 @@
1
- import type { Config, DsGraph, Finding, Severity, Token, When } from '@dsgraph/core';
1
+ import type { CodeIndex, Config, DsGraph, Finding, Loc, Severity, Token, VarMatcher, When } from '@dsgraph/core';
2
2
  export interface RuleContext {
3
3
  graph: DsGraph;
4
4
  options: Record<string, unknown>;
5
5
  config: Config;
6
+ /** The project's code, when checked with it (`--code`, `code` in the config). */
7
+ code?: CodeIndex;
8
+ /** Custom property names in the code to tokens; present with `code`. */
9
+ vars?: VarMatcher;
6
10
  report(finding: {
7
11
  message: string;
8
12
  nodes: string[];
9
13
  evidence?: Record<string, unknown>;
10
14
  when?: When;
11
15
  token?: Token;
16
+ /** Where in the code; takes precedence over the token's origin. */
17
+ loc?: Loc;
12
18
  severity?: Severity;
13
19
  }): void;
14
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEpF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,OAAO,EAAE;QACd,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAClC,IAAI,CAAC,EAAE,IAAI,CAAA;QACX,KAAK,CAAC,EAAE,KAAK,CAAA;QACb,QAAQ,CAAC,EAAE,QAAQ,CAAA;KACpB,GAAG,IAAI,CAAA;CACT;AAED,iFAAiF;AACjF,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,QAAQ,GAAG,KAAK,CAAA;IACjC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAA;CAC5B;AAED,YAAY,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,GAAG,EACH,QAAQ,EACR,KAAK,EACL,UAAU,EACV,IAAI,EACL,MAAM,eAAe,CAAA;AAEtB,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,iFAAiF;IACjF,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,wEAAwE;IACxE,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,MAAM,CAAC,OAAO,EAAE;QACd,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAClC,IAAI,CAAC,EAAE,IAAI,CAAA;QACX,KAAK,CAAC,EAAE,KAAK,CAAA;QACb,mEAAmE;QACnE,GAAG,CAAC,EAAE,GAAG,CAAA;QACT,QAAQ,CAAC,EAAE,QAAQ,CAAA;KACpB,GAAG,IAAI,CAAA;CACT;AAED,iFAAiF;AACjF,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,QAAQ,GAAG,KAAK,CAAA;IACjC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAA;CAC5B;AAED,YAAY,EAAE,OAAO,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsgraph/rules",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Rule engine and built-in rules for dsgraph: layers, contrast, palettes, deprecations, naming.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,7 +27,7 @@
27
27
  "node": ">=20.19"
28
28
  },
29
29
  "dependencies": {
30
- "@dsgraph/core": "0.2.0",
30
+ "@dsgraph/core": "0.3.0",
31
31
  "culori": "4.0.2"
32
32
  },
33
33
  "devDependencies": {