@dsgraph/rules 0.2.0 → 0.4.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":"AAAA,OAAO,EAGL,YAAY,EAIZ,SAAS,EACT,UAAU,GACX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACtG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,GACX,MAAM,mBAAmB,CAAA;AAG1B,MAAM,CAAC,MAAM,KAAK,GAAoB;IACpC,mBAAmB;IACnB,mBAAmB;IACnB,WAAW;IACX,UAAU;IACV,mBAAmB;IACnB,cAAc;IACd,cAAc;IACd,UAAU;IACV,cAAc;IACd,cAAc;IACd,QAAQ;IACR,eAAe;IACf,YAAY;IACZ,WAAW;CACZ,CAAA;AAOD,MAAM,IAAI,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;AAExE,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,KAAK,GAAoB,KAAK;IAC5E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IAC3C,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IACvF,MAAM,KAAK,GAAG,CAAC,OAAgC,EAAE,EAAE;QACjD,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;YAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE;oBACf,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAwB;oBACzC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAI,KAAK,CAAC,CAAC,CAAY,EAAE;iBACtD,CAAC,CAAA;;gBACC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAA4B,EAAE,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACvG,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACzB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,KAAc,EACd,MAAM,GAAW,EAAE,EACnB,UAAU,GAAoB,EAAE,EAChC,IAAI,GAAyB,EAAE;IAE/B,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IACtB,MAAM,IAAI,GAAG,IAAI;QACf,CAAC,CAAC,IAAI,UAAU,CACZ,KAAK,EACL,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAC5B,MAAM,CAAC,IAAI,EAAE,MAAM,CACpB;QACH,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,MAAM,GAA+B,EAAE,CAAA;IAE7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC1C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAC1F,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAA;QAC7D,IAAI,QAAQ,KAAK,KAAK;YAAE,SAAQ;QAChC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/E,MAAM,CAAC,GAAwB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QACxG,IAAI,CAAC,CAAC,GAAG;YAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;QACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAA;QACtC,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK;YAAE,SAAQ;QACxC,MAAM,GAAG,GAAgB;YACvB,KAAK;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM;YACN,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,CAAC;gBACN,MAAM,CAAC,GAAwB;oBAC7B,IAAI,EAAE,IAAI,CAAC,EAAE;oBACb,QAAQ,EACN,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAoB,CAAC;wBACjE,CAAC,CAAC,CAAC,CAAC,QAAQ;wBACZ,CAAC,CAAE,OAAO,CAAC,QAAqB;oBACpC,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;iBACf,CAAA;gBACD,IAAI,CAAC,CAAC,QAAQ;oBAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAA;gBACvC,IAAI,CAAC,CAAC,IAAI;oBAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAA;gBAC3B,IAAI,CAAC,CAAC,GAAG;oBAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA;qBACnB,IAAI,CAAC,CAAC,KAAK;oBAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;gBACxC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,CAAC;SACF,CAAA;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACf,CAAC;IAED,MAAM,QAAQ,GAAc,EAAE,CAAA;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM;QACpB,QAAQ,CAAC,IAAI,CAAC;YACZ,iFAAiF;YACjF,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;YAC1K,GAAG,CAAC;SACL,CAAC,CAAA;IACJ,OAAO,QAAQ,CAAC,IAAI,CAClB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5B,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CACrC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAA4B;IAC1D,MAAM,GAAG,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IACvE,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC3C,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -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;AAyDpD,eAAO,MAAM,cAAc,EAAE,IA8B5B,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,IAmCtB,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,195 @@
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 pxOf = (v) => {
12
+ const d = v;
13
+ return d.unit === 'rem' ? d.value * 16 : d.value;
14
+ };
15
+ const locOf = (l) => ({
16
+ file: l.file,
17
+ line: l.line,
18
+ column: l.column,
19
+ });
20
+ /**
21
+ * Which scale a property takes values from, by token names. Spacing falls back to every dimension
22
+ * when names say nothing; radii and font sizes are not compared with spacing.
23
+ */
24
+ const FAMILIES = [
25
+ { property: /radius$/i, names: /(^|\.)(radius|radii|rounded|corner|round)(\.|$)/, strict: true },
26
+ { property: /^font-size$/i, names: /(^|\.)(font|text|type|typography)(\.|$)/, strict: true },
27
+ {
28
+ property: /.*/,
29
+ names: /(^|\.)(space|spacing|spacer|gap|gutter|inset|size|sizing|stack|layout)(\.|$)/,
30
+ strict: false,
31
+ },
32
+ ];
33
+ function scaleOf(graph, property, cache) {
34
+ const family = FAMILIES.find((f) => f.property.test(property));
35
+ let tokens = cache.get(family.names);
36
+ if (!tokens) {
37
+ const all = graph.tokens({ type: 'dimension' });
38
+ const named = all.filter((t) => family.names.test(normalizeName(t.id)));
39
+ tokens = named.length || family.strict ? named : all;
40
+ cache.set(family.names, tokens);
41
+ }
42
+ return tokens;
43
+ }
44
+ function nearestIn(graph, l, among) {
45
+ const all = nearestTokens(graph, { type: l.type, value: l.value }, graph.defaultInput(), among ? 10_000 : 1);
46
+ return among ? all.find((m) => among.has(m.token.id)) : all[0];
47
+ }
48
+ export const hardcodedColor = {
49
+ id: 'style/hardcoded-color',
50
+ description: 'A color in a style is written by hand instead of taken from a token.',
51
+ defaultSeverity: 'warning',
52
+ run({ graph, code, options, report }) {
53
+ if (!code || graph.tokens({ type: 'color' }).length === 0)
54
+ return;
55
+ const skip = excepted(options);
56
+ const memo = new Map();
57
+ for (const l of code.literals) {
58
+ if (l.type !== 'color' || skip(l))
59
+ continue;
60
+ const key = l.text.toLowerCase();
61
+ if (!memo.has(key))
62
+ memo.set(key, nearestIn(graph, l));
63
+ const near = memo.get(key);
64
+ if (!near)
65
+ continue;
66
+ report({
67
+ message: near.exact
68
+ ? `Color "${l.text}" in ${l.property} is written by hand; use "${near.token.id}"`
69
+ : `Color "${l.text}" in ${l.property} is not in the palette; closest is "${near.token.id}" (ΔE ${near.distance})`,
70
+ nodes: [near.token.id],
71
+ evidence: {
72
+ value: l.text,
73
+ property: l.property,
74
+ selector: l.selector,
75
+ token: near.token.id,
76
+ deltaE: near.distance,
77
+ },
78
+ loc: locOf(l),
79
+ });
80
+ }
81
+ },
82
+ };
83
+ export const offScale = {
84
+ id: 'style/off-scale',
85
+ description: 'A spacing, radius or font size in a style is written by hand: on the scale (use the token) or off it.',
86
+ defaultSeverity: 'warning',
87
+ run({ graph, code, options, report }) {
88
+ if (!code || graph.tokens({ type: 'dimension' }).length === 0)
89
+ return;
90
+ const skip = excepted(options);
91
+ const scales = new Map();
92
+ for (const l of code.literals) {
93
+ if (l.type !== 'dimension' || skip(l))
94
+ continue;
95
+ const scale = scaleOf(graph, l.property, scales);
96
+ const near = nearestIn(graph, l, new Set(scale.map((t) => t.id)));
97
+ if (!near)
98
+ continue;
99
+ // 999px, 9999px: a pill, not a step of the radius scale, unless the system has a token for it.
100
+ if (!near.exact && /radius$/i.test(l.property) && pxOf(l.value) >= 100)
101
+ continue;
102
+ const px = near.value;
103
+ report({
104
+ message: near.exact
105
+ ? `"${l.text}" in ${l.property} is on the scale; use "${near.token.id}"`
106
+ : `"${l.text}" in ${l.property} is off the scale; closest is "${near.token.id}" (${px.value}${px.unit})`,
107
+ nodes: [near.token.id],
108
+ evidence: {
109
+ value: l.text,
110
+ property: l.property,
111
+ selector: l.selector,
112
+ token: near.token.id,
113
+ distance: near.distance,
114
+ },
115
+ loc: locOf(l),
116
+ // A value that has a token is a quick fix; one that has none is a design question.
117
+ ...(near.exact ? { severity: 'info' } : {}),
118
+ });
119
+ }
120
+ },
121
+ };
122
+ export const deprecatedUsage = {
123
+ id: 'usage/deprecated',
124
+ description: 'The code uses a deprecated token.',
125
+ defaultSeverity: 'warning',
126
+ run({ code, vars, options, report }) {
127
+ if (!code || !vars)
128
+ return;
129
+ const skip = excepted(options);
130
+ for (const u of code.uses) {
131
+ if (skip(u))
132
+ continue;
133
+ const t = vars.token(u.name);
134
+ if (!t?.deprecated)
135
+ continue;
136
+ const replacement = t.deprecated.replacement;
137
+ report({
138
+ message: `"${u.name}" is deprecated${replacement ? `; use "${replacement}"` : ''}`,
139
+ nodes: [t.id],
140
+ evidence: { reason: t.deprecated.reason, replacement, property: u.property },
141
+ loc: locOf(u),
142
+ });
143
+ }
144
+ },
145
+ };
146
+ export const unknownToken = {
147
+ id: 'usage/unknown-token',
148
+ 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.",
149
+ defaultSeverity: 'error',
150
+ run({ code, vars, options, report }) {
151
+ if (!code || !vars)
152
+ return;
153
+ const skip = excepted(options);
154
+ for (const u of code.uses) {
155
+ if (skip(u) || !vars.isSystemName(u.name) || vars.token(u.name))
156
+ continue;
157
+ report({
158
+ message: `"${u.name}" is not a token${u.fallback ? `; the fallback "${u.fallback}" is used instead` : ''}`,
159
+ nodes: [],
160
+ evidence: { property: u.property, fallback: u.fallback },
161
+ loc: locOf(u),
162
+ });
163
+ }
164
+ },
165
+ };
166
+ /** Tokens the code reads, with everything they take their values from. */
167
+ export function usedTokens(ctx) {
168
+ const used = new Set();
169
+ for (const u of ctx.code?.uses ?? []) {
170
+ const t = ctx.vars?.token(u.name);
171
+ if (!t || used.has(t.id))
172
+ continue;
173
+ used.add(t.id);
174
+ for (const d of ctx.graph.dependencies(t.id, { transitive: true }))
175
+ used.add(d);
176
+ }
177
+ return used;
178
+ }
179
+ export const unusedToken = {
180
+ id: 'token/unused',
181
+ description: 'A token is not used by the code, directly or through another token.',
182
+ defaultSeverity: 'info',
183
+ run(ctx) {
184
+ const { graph, code, report } = ctx;
185
+ if (!code || code.uses.length === 0)
186
+ return;
187
+ const used = usedTokens(ctx);
188
+ for (const t of graph.tokens()) {
189
+ if (used.has(t.id) || t.deprecated)
190
+ continue;
191
+ report({ message: `"${t.id}" is not used in the code`, nodes: [t.id], token: t });
192
+ }
193
+ },
194
+ };
195
+ //# sourceMappingURL=code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/rules/code.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAET,aAAa,EACb,aAAa,GAGd,MAAM,eAAe,CAAA;AAGtB,MAAM,OAAO,GAAG,CAAC,CAAU,EAAY,EAAE,CACvC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAE7E,2EAA2E;AAC3E,SAAS,QAAQ,CAAC,OAAgC;IAChD,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAA;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACtE,OAAO,CAAC,CAAkC,EAAE,EAAE,CAC5C,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,CAAU,EAAU,EAAE;IAClC,MAAM,CAAC,GAAG,CAAoC,CAAA;IAC9C,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,CAAiD,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,MAAM,EAAE,CAAC,CAAC,MAAM;CACjB,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,QAAQ,GAAgE;IAC5E,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,iDAAiD,EAAE,MAAM,EAAE,IAAI,EAAE;IAChG,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,yCAAyC,EAAE,MAAM,EAAE,IAAI,EAAE;IAC5F;QACE,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,8EAA8E;QACrF,MAAM,EAAE,KAAK;KACd;CACF,CAAA;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,QAAgB,EAAE,KAA2B;IAC5E,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAE,CAAA;IAC/D,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACvE,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;QACpD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,CAAe,EAAE,KAAmB;IACrE,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5G,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,uBAAuB;IAC3B,WAAW,EAAE,sEAAsE;IACnF,eAAe,EAAE,SAAS;IAC1B,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QAClC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoC,CAAA;QACxD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;YAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC1B,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,MAAM,CAAC;gBACL,OAAO,EAAE,IAAI,CAAC,KAAK;oBACjB,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,QAAQ,6BAA6B,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG;oBACjF,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,QAAQ,uCAAuC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,IAAI,CAAC,QAAQ,GAAG;gBACnH,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,QAAQ,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,IAAI;oBACb,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;oBACpB,MAAM,EAAE,IAAI,CAAC,QAAQ;iBACtB;gBACD,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;aACd,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,iBAAiB;IACrB,WAAW,EACT,uGAAuG;IACzG,eAAe,EAAE,SAAS;IAC1B,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QAClC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAA;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YAChD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACjE,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,+FAA+F;YAC/F,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG;gBAAE,SAAQ;YAChF,MAAM,EAAE,GAAG,IAAI,CAAC,KAAwC,CAAA;YACxD,MAAM,CAAC;gBACL,OAAO,EAAE,IAAI,CAAC,KAAK;oBACjB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,QAAQ,0BAA0B,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG;oBACxE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,QAAQ,kCAAkC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG;gBAC1G,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,QAAQ,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,IAAI;oBACb,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;oBACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB;gBACD,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;gBACb,mFAAmF;gBACnF,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAS;IACnC,EAAE,EAAE,kBAAkB;IACtB,WAAW,EAAE,mCAAmC;IAChD,eAAe,EAAE,SAAS;IAC1B,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QACjC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAM;QAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,SAAQ;YACrB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAC5B,IAAI,CAAC,CAAC,EAAE,UAAU;gBAAE,SAAQ;YAC5B,MAAM,WAAW,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW,CAAA;YAC5C,MAAM,CAAC;gBACL,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,kBAAkB,WAAW,CAAC,CAAC,CAAC,UAAU,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClF,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACb,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAC5E,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;aACd,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,qBAAqB;IACzB,WAAW,EACT,sJAAsJ;IACxJ,eAAe,EAAE,OAAO;IACxB,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QACjC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAM;QAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAQ;YACzE,MAAM,CAAC;gBACL,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,QAAQ,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1G,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;gBACxD,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;aACd,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AAED,0EAA0E;AAC1E,MAAM,UAAU,UAAU,CAAC,GAAiD;IAC1E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,SAAQ;QAClC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACjF,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,EAAE,EAAE,cAAc;IAClB,WAAW,EAAE,qEAAqE;IAClF,eAAe,EAAE,MAAM;IACvB,GAAG,CAAC,GAAG;QACL,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;QACnC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;QAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU;gBAAE,SAAQ;YAC5C,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,2BAA2B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACnF,CAAC;IACH,CAAC;CACF,CAAA"}
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.4.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.4.0",
31
31
  "culori": "4.0.2"
32
32
  },
33
33
  "devDependencies": {