@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 +4 -2
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +18 -4
- package/dist/check.js.map +1 -1
- package/dist/rules/code.d.ts +9 -0
- package/dist/rules/code.d.ts.map +1 -0
- package/dist/rules/code.js +195 -0
- package/dist/rules/code.js.map +1 -0
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
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[]
|
|
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
|
package/dist/check.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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
|
-
|
|
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":"AAAA,OAAO,
|
|
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;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":"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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
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
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.
|
|
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.
|
|
30
|
+
"@dsgraph/core": "0.4.0",
|
|
31
31
|
"culori": "4.0.2"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|