@duro-app/eslint-plugin 2.0.1 → 3.1.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/README.md CHANGED
@@ -35,7 +35,8 @@ another key — you'd get two live namespaces and confusing config.
35
35
  | `duro/no-raw-html-element` | error | suggestion |
36
36
  | `duro/no-tokens-barrel-import` | error | autofix |
37
37
  | `duro/no-deprecated-table-parts` | error | autofix / suggestion |
38
- | `duro/no-raw-design-values` | warn | suggestion |
38
+ | `duro/no-raw-design-values` | error | suggestion |
39
+ | `duro/no-raw-breakpoint-query` | error | autofix |
39
40
 
40
41
  ### no-raw-html-element
41
42
 
@@ -67,20 +68,47 @@ default) — configure via `tableIdentifiers`.
67
68
 
68
69
  ### no-raw-design-values
69
70
 
70
- Inside `css.create()` objects: hex colors report everywhere (palette matches
71
- suggest the `colors.*` token; off-palette hexes report without a fix), and
72
- numeric/`px` values matching the spacing or radius scale report on the
73
- properties where that mapping is unambiguous (padding/margin/gap families →
74
- `spacing.*`, border radius family → `radii.*`). `width: 16` or `fontSize: 16`
75
- never report — same number, different meaning. Ships as `warn`: it informs,
76
- it doesn't gate.
71
+ Inside `css.create()` objects, a raw design value is the finding — anything
72
+ with a token equivalent, and anything on a tokenised property that is off the
73
+ scale:
74
+
75
+ - **colors** — a hex / `rgb()` / `hsl()` literal anywhere. A palette value
76
+ suggests its `colors.*` token; an off-palette one reports without a fix.
77
+ - **spacing and radius** — a number or `'Npx'` on the padding/margin/gap
78
+ families → `spacing.*`, on the border-radius family → `radii.*`. On the
79
+ scale it suggests the token; off the scale (`marginTop: 23`) it reports —
80
+ "not a token" is the point.
81
+ - **breakpoints** — a px inside a `'@media …'` / `'@container …'` condition
82
+ key. On the scale it suggests the computed key
83
+ ``[`@media (min-width: ${breakpoints.md})`]`` and the import.
84
+ - **font size** (number, `px` or `rem`) → `typography.fontSize*` or, for the
85
+ steps typography lacks, `typeScale.fontSizeN`; **font weight** 400–700 →
86
+ `typography.fontWeight*`; **`boxShadow`** → `shadows.*` on an exact match,
87
+ otherwise a report; **`transitionDuration` / `animationDuration`** `'Nms'` →
88
+ `duration.*`; **timing functions** → `easing.*`.
89
+
90
+ Skipped on purpose: `0`, negatives, shorthands (`'8px 16px'`,
91
+ `'opacity 150ms'`), identifiers, member expressions, template literals, and
92
+ `width` / `top` / `lineHeight` — same numbers, different meaning. Since 3.0 it
93
+ ships as `error`: a raw value is the drift the design system exists to stop.
77
94
 
78
95
  Options: `{factories?: string[], spacingProperties?: string[], radiiProperties?: string[]}`
79
96
  (property lists replace the defaults, they don't merge)
80
97
 
98
+ ### no-raw-breakpoint-query
99
+
100
+ A media-query string anywhere in a file — `useMediaQuery('(min-width:
101
+ 768px)')`, `matchMedia(...)`, a constant — carries a raw breakpoint that
102
+ `no-raw-design-values` never sees (it only reads `css.create`). On the scale
103
+ the autofix rewrites the literal to `` `(min-width: ${breakpoints.md})` `` and
104
+ adds the import (a `css.defineConsts` string, so it interpolates to
105
+ `'768px'`); off the scale it reports. Skips `css.create` keys, and skips the
106
+ fix when a local `breakpoints` binding would shadow the import.
107
+
81
108
  ## Token data
82
109
 
83
- The rule data (deep-path map, spacing/radius px values, color palette) is
84
- mirrored from `@duro-app/tokens` as literals so the published plugin stays
110
+ The rule data (deep-path map, spacing/radius/breakpoint px values, font
111
+ sizes and weights, shadows, durations, easings, color palette) is mirrored
112
+ from `@duro-app/tokens` as literals so the published plugin stays
85
113
  dependency-free. `test/token-drift.test.ts` rebuilds every table from the real
86
114
  tokens package and fails CI when they drift.
package/dist/index.d.ts CHANGED
@@ -16,11 +16,12 @@ declare const plugin: {
16
16
  'no-deprecated-table-parts': TSESLint.RuleModule<"deprecatedContainer" | "deprecatedIsActions" | "removeIsActions", [({
17
17
  tableIdentifiers?: string[];
18
18
  } | undefined)?], unknown, TSESLint.RuleListener>;
19
- 'no-raw-design-values': TSESLint.RuleModule<"rawColorToken" | "rawColor" | "rawSpacing" | "rawRadius" | "replaceWithToken", [({
19
+ 'no-raw-design-values': TSESLint.RuleModule<"rawColorToken" | "rawColor" | "rawSpacing" | "rawRadius" | "offScaleSpacing" | "offScaleRadius" | "rawBreakpoint" | "rawFontSize" | "rawFontWeight" | "rawShadow" | "rawDuration" | "rawEasing" | "replaceWithToken", [({
20
20
  factories?: string[];
21
21
  spacingProperties?: string[];
22
22
  radiiProperties?: string[];
23
23
  } | undefined)?], unknown, TSESLint.RuleListener>;
24
+ 'no-raw-breakpoint-query': TSESLint.RuleModule<"rawBreakpointQuery", [], unknown, TSESLint.RuleListener>;
24
25
  'no-flex-grow-web': TSESLint.RuleModule<"flexGrowForced", [({
25
26
  factories?: string[];
26
27
  } | undefined)?], unknown, TSESLint.RuleListener>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAA;AAEtC,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAGK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;CAC1D,CAAA;AAmBD,eAAe,MAAM,CAAA;AACrB,OAAO,EAAC,KAAK,EAAC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAA;AAEtC,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAGK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;CAC1D,CAAA;AAwBD,eAAe,MAAM,CAAA;AACrB,OAAO,EAAC,KAAK,EAAC,CAAA"}
package/dist/index.js CHANGED
@@ -14,7 +14,12 @@ Object.assign(plugin.configs, {
14
14
  'duro/no-raw-html-element': 'error',
15
15
  'duro/no-tokens-barrel-import': 'error',
16
16
  'duro/no-deprecated-table-parts': 'error',
17
- 'duro/no-raw-design-values': 'warn',
17
+ // Errors since 3.0: a raw design value is the drift the system exists
18
+ // to prevent. Consumers with debt ratchet with an explicit-file
19
+ // baseline block (see @duro-app/eslint-config README), never a glob
20
+ // and never --max-warnings.
21
+ 'duro/no-raw-design-values': 'error',
22
+ 'duro/no-raw-breakpoint-query': 'error',
18
23
  'duro/no-flex-grow-web': 'warn',
19
24
  'duro/prefer-ds-form-components': 'error',
20
25
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAA;AAEtC,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,EAAC,IAAI,EAAE,MAAM,EAAC;IACpB,KAAK;IACL,OAAO,EAAE,EAAgD;CAC1D,CAAA;AAED,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;IAC5B,WAAW,EAAE;QACX,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,EAAC,IAAI,EAAE,MAAM,EAAC;QACvB,KAAK,EAAE;YACL,0BAA0B,EAAE,OAAO;YACnC,8BAA8B,EAAE,OAAO;YACvC,gCAAgC,EAAE,OAAO;YACzC,2BAA2B,EAAE,MAAM;YACnC,uBAAuB,EAAE,MAAM;YAC/B,gCAAgC,EAAE,OAAO;SAC1C;KACmC;CACvC,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA;AACrB,OAAO,EAAC,KAAK,EAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAA;AAEtC,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,EAAC,IAAI,EAAE,MAAM,EAAC;IACpB,KAAK;IACL,OAAO,EAAE,EAAgD;CAC1D,CAAA;AAED,2EAA2E;AAC3E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;IAC5B,WAAW,EAAE;QACX,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,EAAC,IAAI,EAAE,MAAM,EAAC;QACvB,KAAK,EAAE;YACL,0BAA0B,EAAE,OAAO;YACnC,8BAA8B,EAAE,OAAO;YACvC,gCAAgC,EAAE,OAAO;YACzC,sEAAsE;YACtE,gEAAgE;YAChE,oEAAoE;YACpE,4BAA4B;YAC5B,2BAA2B,EAAE,OAAO;YACpC,8BAA8B,EAAE,OAAO;YACvC,uBAAuB,EAAE,MAAM;YAC/B,gCAAgC,EAAE,OAAO;SAC1C;KACmC;CACvC,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA;AACrB,OAAO,EAAC,KAAK,EAAC,CAAA"}
@@ -10,11 +10,12 @@ export declare const rules: {
10
10
  'no-deprecated-table-parts': import("@typescript-eslint/utils/ts-eslint").RuleModule<"deprecatedContainer" | "deprecatedIsActions" | "removeIsActions", [({
11
11
  tableIdentifiers?: string[];
12
12
  } | undefined)?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
13
- 'no-raw-design-values': import("@typescript-eslint/utils/ts-eslint").RuleModule<"rawColorToken" | "rawColor" | "rawSpacing" | "rawRadius" | "replaceWithToken", [({
13
+ 'no-raw-design-values': import("@typescript-eslint/utils/ts-eslint").RuleModule<"rawColorToken" | "rawColor" | "rawSpacing" | "rawRadius" | "offScaleSpacing" | "offScaleRadius" | "rawBreakpoint" | "rawFontSize" | "rawFontWeight" | "rawShadow" | "rawDuration" | "rawEasing" | "replaceWithToken", [({
14
14
  factories?: string[];
15
15
  spacingProperties?: string[];
16
16
  radiiProperties?: string[];
17
17
  } | undefined)?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
18
+ 'no-raw-breakpoint-query': import("@typescript-eslint/utils/ts-eslint").RuleModule<"rawBreakpointQuery", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
18
19
  'no-flex-grow-web': import("@typescript-eslint/utils/ts-eslint").RuleModule<"flexGrowForced", [({
19
20
  factories?: string[];
20
21
  } | undefined)?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;CAOjB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;CAQjB,CAAA"}
@@ -2,6 +2,7 @@ import { noRawHtmlElement } from './no-raw-html-element.js';
2
2
  import { noTokensBarrelImport } from './no-tokens-barrel-import.js';
3
3
  import { noDeprecatedTableParts } from './no-deprecated-table-parts.js';
4
4
  import { noRawDesignValues } from './no-raw-design-values.js';
5
+ import { noRawBreakpointQuery } from './no-raw-breakpoint-query.js';
5
6
  import { noFlexGrowWeb } from './no-flex-grow-web.js';
6
7
  import { preferDsFormComponents } from './prefer-ds-form-components.js';
7
8
  export const rules = {
@@ -9,6 +10,7 @@ export const rules = {
9
10
  'no-tokens-barrel-import': noTokensBarrelImport,
10
11
  'no-deprecated-table-parts': noDeprecatedTableParts,
11
12
  'no-raw-design-values': noRawDesignValues,
13
+ 'no-raw-breakpoint-query': noRawBreakpointQuery,
12
14
  'no-flex-grow-web': noFlexGrowWeb,
13
15
  'prefer-ds-form-components': preferDsFormComponents,
14
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAA;AACrE,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAA;AAErE,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,qBAAqB,EAAE,gBAAgB;IACvC,yBAAyB,EAAE,oBAAoB;IAC/C,2BAA2B,EAAE,sBAAsB;IACnD,sBAAsB,EAAE,iBAAiB;IACzC,kBAAkB,EAAE,aAAa;IACjC,2BAA2B,EAAE,sBAAsB;CACpD,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAA;AACrE,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAA;AAErE,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,qBAAqB,EAAE,gBAAgB;IACvC,yBAAyB,EAAE,oBAAoB;IAC/C,2BAA2B,EAAE,sBAAsB;IACnD,sBAAsB,EAAE,iBAAiB;IACzC,yBAAyB,EAAE,oBAAoB;IAC/C,kBAAkB,EAAE,aAAa;IACjC,2BAA2B,EAAE,sBAAsB;CACpD,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { TSESLint } from '@typescript-eslint/utils';
2
+ type MessageIds = 'rawBreakpointQuery';
3
+ type Options = [];
4
+ /**
5
+ * A media-query string anywhere in a file — `useMediaQuery("(min-width:
6
+ * 768px)")`, `matchMedia(...)`, a hook's constant — carries a raw breakpoint.
7
+ * `no-raw-design-values` covers the `@media` keys inside css.create; this
8
+ * covers the strings that never reach a style object and so slipped past it.
9
+ *
10
+ * On the scale the fix rewrites the literal to a template literal reading
11
+ * `breakpoints.<key>` (a css.defineConsts string, so `${breakpoints.md}`
12
+ * interpolates to '768px') and adds the import. Off the scale it reports.
13
+ */
14
+ export declare const noRawBreakpointQuery: TSESLint.RuleModule<MessageIds, Options>;
15
+ export {};
16
+ //# sourceMappingURL=no-raw-breakpoint-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-raw-breakpoint-query.d.ts","sourceRoot":"","sources":["../../src/rules/no-raw-breakpoint-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAW,MAAM,0BAA0B,CAAA;AAIhE,KAAK,UAAU,GAAG,oBAAoB,CAAA;AACtC,KAAK,OAAO,GAAG,EAAE,CAAA;AAUjB;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CA+DzE,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { BREAKPOINT_TOKENS_BY_PX } from '../util/tokens.js';
2
+ import { ensureNamedImport, isShadowed } from '../util/imports.js';
3
+ const QUERY_RE = /\((?:min|max)-(?:width|height)\s*:\s*(\d+)px\)/;
4
+ const BREAKPOINTS_MODULE = '@duro-app/tokens/tokens/breakpoints.css';
5
+ const SCALE = Object.keys(BREAKPOINT_TOKENS_BY_PX)
6
+ .map(Number)
7
+ .sort((a, b) => a - b)
8
+ .join(' / ');
9
+ /**
10
+ * A media-query string anywhere in a file — `useMediaQuery("(min-width:
11
+ * 768px)")`, `matchMedia(...)`, a hook's constant — carries a raw breakpoint.
12
+ * `no-raw-design-values` covers the `@media` keys inside css.create; this
13
+ * covers the strings that never reach a style object and so slipped past it.
14
+ *
15
+ * On the scale the fix rewrites the literal to a template literal reading
16
+ * `breakpoints.<key>` (a css.defineConsts string, so `${breakpoints.md}`
17
+ * interpolates to '768px') and adds the import. Off the scale it reports.
18
+ */
19
+ export const noRawBreakpointQuery = {
20
+ defaultOptions: [],
21
+ meta: {
22
+ type: 'suggestion',
23
+ docs: {
24
+ description: 'Disallow raw px breakpoints in media-query strings; use breakpoints.<key>',
25
+ },
26
+ fixable: 'code',
27
+ schema: [],
28
+ messages: {
29
+ rawBreakpointQuery: '{{value}}px is a raw breakpoint in a media query. Use `breakpoints.{{token}}` from @duro-app/tokens/tokens/breakpoints.css (the scale is {{scale}}px).',
30
+ },
31
+ },
32
+ create(context) {
33
+ const sourceCode = context.sourceCode;
34
+ function isStyleKey(node) {
35
+ return node.parent?.type === 'Property' && node.parent.key === node;
36
+ }
37
+ function check(node, text) {
38
+ const match = QUERY_RE.exec(text);
39
+ if (!match)
40
+ return;
41
+ // css.create condition keys belong to no-raw-design-values.
42
+ if (isStyleKey(node))
43
+ return;
44
+ const px = Number(match[1]);
45
+ const token = BREAKPOINT_TOKENS_BY_PX[px];
46
+ const data = { value: String(px), token: token ?? '*', scale: SCALE };
47
+ if (!token) {
48
+ context.report({ node, messageId: 'rawBreakpointQuery', data });
49
+ return;
50
+ }
51
+ const shadowed = isShadowed(sourceCode.getScope(node), 'breakpoints', BREAKPOINTS_MODULE);
52
+ context.report({
53
+ node,
54
+ messageId: 'rawBreakpointQuery',
55
+ data,
56
+ fix: shadowed
57
+ ? null
58
+ : (fixer) => {
59
+ const { local, fixes } = ensureNamedImport(sourceCode, fixer, BREAKPOINTS_MODULE, 'breakpoints');
60
+ const rewritten = text.replace(`${px}px`, `\${${local}.${token}}`);
61
+ return [...fixes, fixer.replaceText(node, '`' + rewritten.replace(/`/g, '\\`') + '`')];
62
+ },
63
+ });
64
+ }
65
+ return {
66
+ Literal(node) {
67
+ if (typeof node.value === 'string')
68
+ check(node, node.value);
69
+ },
70
+ TemplateLiteral(node) {
71
+ if (node.expressions.length > 0)
72
+ return;
73
+ check(node, node.quasis.map((q) => q.value.cooked ?? '').join(''));
74
+ },
75
+ };
76
+ },
77
+ };
78
+ //# sourceMappingURL=no-raw-breakpoint-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-raw-breakpoint-query.js","sourceRoot":"","sources":["../../src/rules/no-raw-breakpoint-query.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { TSESLint } from '@typescript-eslint/utils';
2
- type MessageIds = 'rawColorToken' | 'rawColor' | 'rawSpacing' | 'rawRadius' | 'replaceWithToken';
2
+ type MessageIds = 'rawColorToken' | 'rawColor' | 'rawSpacing' | 'rawRadius' | 'offScaleSpacing' | 'offScaleRadius' | 'rawBreakpoint' | 'rawFontSize' | 'rawFontWeight' | 'rawShadow' | 'rawDuration' | 'rawEasing' | 'replaceWithToken';
3
3
  type Options = [
4
4
  {
5
5
  factories?: string[];
@@ -8,12 +8,24 @@ type Options = [
8
8
  }?
9
9
  ];
10
10
  /**
11
- * Inside css.create() style objects, flag raw design values that have a token
12
- * equivalent: hex colors (anywhere — a hex is never right in this system) and
13
- * spacing/radius px values on the properties where that mapping is unambiguous.
14
- * Values with no token equivalent (0, negatives, rem, shorthands, off-scale
15
- * numbers) are skipped, except off-palette hex colors, which report without a
16
- * fix — surfacing them is the point.
11
+ * Inside css.create() style objects, flag raw design values — anything with a
12
+ * token equivalent, and anything on a tokenised property that is off the
13
+ * scale:
14
+ *
15
+ * - colors: a hex / rgb() / hsl() literal anywhere. A palette value suggests
16
+ * its token; an off-palette one reports without a fix.
17
+ * - spacing and radius: a px value on the properties where that mapping is
18
+ * unambiguous. On the scale → suggest the token; off the scale (`marginTop:
19
+ * 23`) → report, because "not a token" is the finding.
20
+ * - breakpoints: a px inside a `@media` / `@container` condition key. On the
21
+ * scale → suggest the `breakpoints.<key>` template-literal key.
22
+ * - font size (px or rem), font weight, box-shadow, transition/animation
23
+ * duration and timing function: a literal suggests its token when one
24
+ * matches, else reports.
25
+ *
26
+ * Skipped on purpose: 0, negatives (UnaryExpression), shorthands ('8px 16px',
27
+ * 'opacity 150ms'), identifiers, member expressions, template literals and
28
+ * calls — the rule reads literals, not expressions.
17
29
  */
18
30
  export declare const noRawDesignValues: TSESLint.RuleModule<MessageIds, Options>;
19
31
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"no-raw-design-values.d.ts","sourceRoot":"","sources":["../../src/rules/no-raw-design-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAW,MAAM,0BAA0B,CAAA;AAWhE,KAAK,UAAU,GAAG,eAAe,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,kBAAkB,CAAA;AAChG,KAAK,OAAO,GAAG;IACb;QACE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;QACpB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;QAC5B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;KAC3B,CAAC;CACH,CAAA;AAKD;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAgLtE,CAAA"}
1
+ {"version":3,"file":"no-raw-design-values.d.ts","sourceRoot":"","sources":["../../src/rules/no-raw-design-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAW,MAAM,0BAA0B,CAAA;AAmBhE,KAAK,UAAU,GACX,eAAe,GACf,UAAU,GACV,YAAY,GACZ,WAAW,GACX,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,eAAe,GACf,WAAW,GACX,aAAa,GACb,WAAW,GACX,kBAAkB,CAAA;AACtB,KAAK,OAAO,GAAG;IACb;QACE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;QACpB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;QAC5B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;KAC3B,CAAC;CACH,CAAA;AAmBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CA0VtE,CAAA"}
@@ -1,21 +1,44 @@
1
- import { COLOR_TOKENS, RADII_PROPERTIES, RADII_TOKENS_BY_PX, SPACING_PROPERTIES, SPACING_TOKENS_BY_PX, normalizeHex, } from '../util/tokens.js';
1
+ import { BREAKPOINT_TOKENS_BY_PX, COLOR_TOKENS, COLOR_TOKENS_NORMALIZED, DURATION_TOKENS_BY_MS, EASING_TOKENS, FONT_SIZE_TOKENS_BY_REM, FONT_WEIGHT_TOKENS, RADII_PROPERTIES, RADII_TOKENS_BY_PX, SHADOW_TOKENS, SPACING_PROPERTIES, SPACING_TOKENS_BY_PX, normalizeHex, normalizeValue, } from '../util/tokens.js';
2
2
  import { ensureNamedImport } from '../util/imports.js';
3
3
  const HEX_RE = /#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\b/;
4
+ const FUNC_COLOR_RE = /\b(?:rgba?|hsla?)\([^)]*\)/;
5
+ const BREAKPOINT_KEY_RE = /^@(?:media|container)\b.*\b(?:min|max)-(?:width|height)\s*:\s*(\d+)px/;
4
6
  const TOKENS_PKG = '@duro-app/tokens';
7
+ const FONT_SIZE_PROPERTIES = new Set(['fontSize']);
8
+ const FONT_WEIGHT_PROPERTIES = new Set(['fontWeight']);
9
+ const SHADOW_PROPERTIES = new Set(['boxShadow']);
10
+ const DURATION_PROPERTIES = new Set(['transitionDuration', 'animationDuration']);
11
+ const EASING_PROPERTIES = new Set(['transitionTimingFunction', 'animationTimingFunction']);
12
+ const scale = (table) => Object.keys(table)
13
+ .map(Number)
14
+ .sort((a, b) => a - b)
15
+ .join(' / ');
5
16
  /**
6
- * Inside css.create() style objects, flag raw design values that have a token
7
- * equivalent: hex colors (anywhere — a hex is never right in this system) and
8
- * spacing/radius px values on the properties where that mapping is unambiguous.
9
- * Values with no token equivalent (0, negatives, rem, shorthands, off-scale
10
- * numbers) are skipped, except off-palette hex colors, which report without a
11
- * fix — surfacing them is the point.
17
+ * Inside css.create() style objects, flag raw design values — anything with a
18
+ * token equivalent, and anything on a tokenised property that is off the
19
+ * scale:
20
+ *
21
+ * - colors: a hex / rgb() / hsl() literal anywhere. A palette value suggests
22
+ * its token; an off-palette one reports without a fix.
23
+ * - spacing and radius: a px value on the properties where that mapping is
24
+ * unambiguous. On the scale → suggest the token; off the scale (`marginTop:
25
+ * 23`) → report, because "not a token" is the finding.
26
+ * - breakpoints: a px inside a `@media` / `@container` condition key. On the
27
+ * scale → suggest the `breakpoints.<key>` template-literal key.
28
+ * - font size (px or rem), font weight, box-shadow, transition/animation
29
+ * duration and timing function: a literal suggests its token when one
30
+ * matches, else reports.
31
+ *
32
+ * Skipped on purpose: 0, negatives (UnaryExpression), shorthands ('8px 16px',
33
+ * 'opacity 150ms'), identifiers, member expressions, template literals and
34
+ * calls — the rule reads literals, not expressions.
12
35
  */
13
36
  export const noRawDesignValues = {
14
37
  defaultOptions: [{}],
15
38
  meta: {
16
39
  type: 'suggestion',
17
40
  docs: {
18
- description: 'Prefer design tokens over raw hex colors and px values in css.create styles',
41
+ description: 'Prefer design tokens over raw colors, lengths, breakpoints, type, shadows and motion in css.create styles',
19
42
  },
20
43
  hasSuggestions: true,
21
44
  schema: [
@@ -34,6 +57,14 @@ export const noRawDesignValues = {
34
57
  rawColor: "'{{value}}' is not in the palette. Use a semantic token from {{pkg}}/tokens/colors.css instead of a raw color.",
35
58
  rawSpacing: '{{value}} on `{{property}}` is the {{token}} spacing token. Use `spacing.{{token}}` from {{pkg}}/tokens/spacing.css.',
36
59
  rawRadius: '{{value}} on `{{property}}` is the {{token}} radius token. Use `radii.{{token}}` from {{pkg}}/tokens/spacing.css.',
60
+ offScaleSpacing: '{{value}} on `{{property}}` is off the spacing scale ({{scale}}px). Use the nearest `spacing.*` token from {{pkg}}/tokens/spacing.css, or disable this line with the reason.',
61
+ offScaleRadius: '{{value}} on `{{property}}` is off the radius scale ({{scale}}px). Use the nearest `radii.*` token from {{pkg}}/tokens/spacing.css, or disable this line with the reason.',
62
+ rawBreakpoint: '{{value}}px in `{{key}}` is a raw breakpoint. Use `breakpoints.{{token}}` from {{pkg}}/tokens/breakpoints.css in a template-literal key (the scale is {{scale}}px).',
63
+ rawFontSize: '{{value}} on `fontSize` is the {{group}}.{{token}} token. Use it from {{pkg}}/tokens/typography.css.',
64
+ rawFontWeight: '{{value}} on `fontWeight` is the typography.{{token}} token. Use it from {{pkg}}/tokens/typography.css.',
65
+ rawShadow: "'{{value}}' on `boxShadow` is a raw shadow. Use `shadows.{{token}}` from {{pkg}}/tokens/shadows.css.",
66
+ rawDuration: "'{{value}}' on `{{property}}` is a raw duration. Use `duration.{{token}}` from {{pkg}}/tokens/motion.css.",
67
+ rawEasing: "'{{value}}' on `{{property}}` is a raw easing. Use `easing.{{token}}` from {{pkg}}/tokens/motion.css.",
37
68
  replaceWithToken: 'Replace with {{replacement}}',
38
69
  },
39
70
  },
@@ -50,47 +81,55 @@ export const noRawDesignValues = {
50
81
  function calleeText(node) {
51
82
  return sourceCode.getText(node.callee);
52
83
  }
53
- function suggestReplacement(node, replacement, importName, importPath) {
84
+ /** A suggestion that swaps `node` for `<importName>.<token>`, importing it. */
85
+ function suggestReplacement(node, replacement, importName, importPath, render = (local) => replacement.replace(`${importName}.`, `${local}.`)) {
54
86
  return [
55
87
  {
56
88
  messageId: 'replaceWithToken',
57
89
  data: { replacement },
58
90
  fix(fixer) {
59
91
  const { local, fixes } = ensureNamedImport(sourceCode, fixer, `${TOKENS_PKG}/${importPath}`, importName);
60
- const target = replacement.replace(`${importName}.`, `${local}.`);
61
- return [...fixes, fixer.replaceText(node, target)];
92
+ return [...fixes, fixer.replaceText(node, render(local))];
62
93
  },
63
94
  },
64
95
  ];
65
96
  }
66
97
  function checkColorValue(node, raw) {
67
- const match = HEX_RE.exec(raw);
98
+ const match = HEX_RE.exec(raw) ?? FUNC_COLOR_RE.exec(raw);
68
99
  if (!match)
69
100
  return;
70
- const hex = normalizeHex(match[0]);
71
- const token = COLOR_TOKENS[hex] ?? COLOR_TOKENS[raw.toLowerCase()];
101
+ const literal = match[0];
102
+ const token = literal.startsWith('#')
103
+ ? COLOR_TOKENS[normalizeHex(literal)]
104
+ : COLOR_TOKENS_NORMALIZED[normalizeValue(literal)];
72
105
  if (token) {
73
106
  // Only suggest a direct replacement when the literal IS the color —
74
107
  // inside a compound value (a boxShadow) the rewrite would be wrong.
75
- const isWholeValue = raw.trim() === match[0];
108
+ const isWholeValue = raw.trim() === literal;
76
109
  context.report({
77
110
  node,
78
111
  messageId: 'rawColorToken',
79
- data: { value: match[0], token, pkg: TOKENS_PKG },
112
+ data: { value: literal, token, pkg: TOKENS_PKG },
80
113
  suggest: isWholeValue
81
114
  ? suggestReplacement(node, `colors.${token}`, 'colors', 'tokens/colors.css')
82
115
  : [],
83
116
  });
84
117
  }
85
118
  else {
86
- context.report({ node, messageId: 'rawColor', data: { value: match[0], pkg: TOKENS_PKG } });
119
+ context.report({ node, messageId: 'rawColor', data: { value: literal, pkg: TOKENS_PKG } });
87
120
  }
88
121
  }
89
- function checkLengthValue(node, property, px, display) {
122
+ function checkPxValue(node, property, px, display) {
90
123
  if (spacingProperties.has(property)) {
91
124
  const token = SPACING_TOKENS_BY_PX[px];
92
- if (!token)
125
+ if (!token) {
126
+ context.report({
127
+ node,
128
+ messageId: 'offScaleSpacing',
129
+ data: { value: display, property, scale: scale(SPACING_TOKENS_BY_PX), pkg: TOKENS_PKG },
130
+ });
93
131
  return;
132
+ }
94
133
  context.report({
95
134
  node,
96
135
  messageId: 'rawSpacing',
@@ -100,8 +139,14 @@ export const noRawDesignValues = {
100
139
  }
101
140
  else if (radiiProperties.has(property)) {
102
141
  const token = RADII_TOKENS_BY_PX[px];
103
- if (!token)
142
+ if (!token) {
143
+ context.report({
144
+ node,
145
+ messageId: 'offScaleRadius',
146
+ data: { value: display, property, scale: scale(RADII_TOKENS_BY_PX), pkg: TOKENS_PKG },
147
+ });
104
148
  return;
149
+ }
105
150
  context.report({
106
151
  node,
107
152
  messageId: 'rawRadius',
@@ -109,19 +154,109 @@ export const noRawDesignValues = {
109
154
  suggest: suggestReplacement(node, `radii.${token}`, 'radii', 'tokens/spacing.css'),
110
155
  });
111
156
  }
157
+ else if (FONT_SIZE_PROPERTIES.has(property)) {
158
+ checkFontSize(node, px / 16, display);
159
+ }
160
+ }
161
+ function checkFontSize(node, rem, display) {
162
+ const hit = FONT_SIZE_TOKENS_BY_REM[rem];
163
+ if (!hit)
164
+ return;
165
+ context.report({
166
+ node,
167
+ messageId: 'rawFontSize',
168
+ data: { value: display, group: hit.group, token: hit.token, pkg: TOKENS_PKG },
169
+ suggest: suggestReplacement(node, `${hit.group}.${hit.token}`, hit.group, 'tokens/typography.css'),
170
+ });
171
+ }
172
+ function checkFontWeight(node, weight, display) {
173
+ const token = FONT_WEIGHT_TOKENS[weight];
174
+ if (!token)
175
+ return;
176
+ context.report({
177
+ node,
178
+ messageId: 'rawFontWeight',
179
+ data: { value: display, token, pkg: TOKENS_PKG },
180
+ suggest: suggestReplacement(node, `typography.${token}`, 'typography', 'tokens/typography.css'),
181
+ });
182
+ }
183
+ function checkStringValue(node, property, value) {
184
+ const px = /^(\d+(?:\.\d+)?)px$/.exec(value);
185
+ const rem = /^(\d+(?:\.\d+)?)rem$/.exec(value);
186
+ const ms = /^(\d+(?:\.\d+)?)ms$/.exec(value);
187
+ const display = `'${value}'`;
188
+ if (px) {
189
+ checkPxValue(node, property, Number(px[1]), display);
190
+ return;
191
+ }
192
+ if (rem && FONT_SIZE_PROPERTIES.has(property)) {
193
+ checkFontSize(node, Number(rem[1]), display);
194
+ return;
195
+ }
196
+ if (FONT_WEIGHT_PROPERTIES.has(property) && /^\d{3}$/.test(value)) {
197
+ checkFontWeight(node, Number(value), display);
198
+ return;
199
+ }
200
+ if (SHADOW_PROPERTIES.has(property)) {
201
+ if (value === 'none')
202
+ return;
203
+ const token = SHADOW_TOKENS[normalizeValue(value)];
204
+ context.report({
205
+ node,
206
+ messageId: 'rawShadow',
207
+ data: { value, token: token ?? '*', pkg: TOKENS_PKG },
208
+ suggest: token
209
+ ? suggestReplacement(node, `shadows.${token}`, 'shadows', 'tokens/shadows.css')
210
+ : [],
211
+ });
212
+ // A palette shadow's own rgba() is the token, not a second finding.
213
+ if (!token)
214
+ checkColorValue(node, value);
215
+ return;
216
+ }
217
+ if (DURATION_PROPERTIES.has(property) && ms) {
218
+ const token = DURATION_TOKENS_BY_MS[Number(ms[1])];
219
+ context.report({
220
+ node,
221
+ messageId: 'rawDuration',
222
+ data: { value, property, token: token ?? '*', pkg: TOKENS_PKG },
223
+ suggest: token
224
+ ? suggestReplacement(node, `duration.${token}`, 'duration', 'tokens/motion.css')
225
+ : [],
226
+ });
227
+ return;
228
+ }
229
+ if (EASING_PROPERTIES.has(property)) {
230
+ const token = EASING_TOKENS[normalizeValue(value)];
231
+ context.report({
232
+ node,
233
+ messageId: 'rawEasing',
234
+ data: { value, property, token: token ?? '*', pkg: TOKENS_PKG },
235
+ suggest: token
236
+ ? suggestReplacement(node, `easing.${token}`, 'easing', 'tokens/motion.css')
237
+ : [],
238
+ });
239
+ }
112
240
  }
113
241
  function checkValue(node, property) {
114
242
  if (node.type === 'Literal') {
115
243
  if (typeof node.value === 'string') {
116
- checkColorValue(node, node.value);
117
- if (property) {
118
- const pxMatch = /^(\d+)px$/.exec(node.value);
119
- if (pxMatch)
120
- checkLengthValue(node, property, Number(pxMatch[1]), `'${node.value}'`);
244
+ if (property && SHADOW_PROPERTIES.has(property)) {
245
+ checkStringValue(node, property, node.value);
246
+ }
247
+ else {
248
+ checkColorValue(node, node.value);
249
+ if (property)
250
+ checkStringValue(node, property, node.value);
121
251
  }
122
252
  }
123
253
  else if (typeof node.value === 'number' && property && node.value > 0) {
124
- checkLengthValue(node, property, node.value, String(node.value));
254
+ if (FONT_WEIGHT_PROPERTIES.has(property)) {
255
+ checkFontWeight(node, node.value, String(node.value));
256
+ }
257
+ else {
258
+ checkPxValue(node, property, node.value, String(node.value));
259
+ }
125
260
  }
126
261
  return;
127
262
  }
@@ -131,6 +266,37 @@ export const noRawDesignValues = {
131
266
  // Everything else (identifiers, member expressions, template literals,
132
267
  // calls, negatives via UnaryExpression) is deliberately skipped.
133
268
  }
269
+ /** A `@media (min-width: 768px)` key: report, and offer the const key. */
270
+ function checkConditionKey(prop, key) {
271
+ const match = BREAKPOINT_KEY_RE.exec(key);
272
+ if (!match)
273
+ return;
274
+ const px = Number(match[1]);
275
+ const token = BREAKPOINT_TOKENS_BY_PX[px];
276
+ const data = {
277
+ value: String(px),
278
+ key,
279
+ token: token ?? '*',
280
+ scale: scale(BREAKPOINT_TOKENS_BY_PX),
281
+ pkg: TOKENS_PKG,
282
+ };
283
+ if (!token) {
284
+ context.report({ node: prop.key, messageId: 'rawBreakpoint', data });
285
+ return;
286
+ }
287
+ // css.create needs a computed key for a const; brackets included so a
288
+ // plain string key becomes `[`@media (... ${breakpoints.md})`]`.
289
+ const template = key.replace(`${px}px`, `\${%LOCAL%.${token}}`);
290
+ context.report({
291
+ node: prop.key,
292
+ messageId: 'rawBreakpoint',
293
+ data,
294
+ suggest: suggestReplacement(prop.key, `breakpoints.${token}`, 'breakpoints', 'tokens/breakpoints.css', (local) => {
295
+ const inner = '`' + template.replace('%LOCAL%', local) + '`';
296
+ return prop.computed ? inner : `[${inner}]`;
297
+ }),
298
+ });
299
+ }
134
300
  function walkStyleObject(obj, property) {
135
301
  for (const prop of obj.properties) {
136
302
  if (prop.type !== 'Property')
@@ -148,6 +314,8 @@ export const noRawDesignValues = {
148
314
  // Condition keys (default, :hover, @media …) keep the enclosing
149
315
  // property; anything else IS the property.
150
316
  const isCondition = key === 'default' || /^[:@]/.test(key);
317
+ if (isCondition)
318
+ checkConditionKey(prop, key);
151
319
  checkValue(prop.value, isCondition ? property : key);
152
320
  }
153
321
  }
@@ -1 +1 @@
1
- {"version":3,"file":"no-raw-design-values.js","sourceRoot":"","sources":["../../src/rules/no-raw-design-values.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"no-raw-design-values.js","sourceRoot":"","sources":["../../src/rules/no-raw-design-values.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,30 @@ export declare const RADII_TOKENS_BY_PX: Record<number, string>;
11
11
  * (e.g. #6aaffc is both `accent` and `info` in the dark palette → `accent`).
12
12
  */
13
13
  export declare const COLOR_TOKENS: Record<string, string>;
14
+ /** px value → breakpoint token name (`breakpoints.md` is the '768px' const). */
15
+ export declare const BREAKPOINT_TOKENS_BY_PX: Record<number, string>;
16
+ /**
17
+ * rem value → font-size token. Built from typeScale.fontSize1..9 first, then
18
+ * typography.fontSize* on top — so a size both scales carry suggests the
19
+ * named `typography` token, and only the steps typography lacks (13px, 30px,
20
+ * 36px) fall back to the numbered typeScale one.
21
+ */
22
+ export declare const FONT_SIZE_TOKENS_BY_REM: Record<number, {
23
+ group: string;
24
+ token: string;
25
+ }>;
26
+ /** numeric weight → typography token. */
27
+ export declare const FONT_WEIGHT_TOKENS: Record<number, string>;
28
+ /** Shadow value (base palette, whitespace-normalized) → shadows token. */
29
+ export declare const SHADOW_TOKENS: Record<string, string>;
30
+ /** ms value → duration token. */
31
+ export declare const DURATION_TOKENS_BY_MS: Record<number, string>;
32
+ /** Easing value (whitespace-normalized) → easing token. */
33
+ export declare const EASING_TOKENS: Record<string, string>;
34
+ /** Collapse whitespace so `rgba(0, 0, 0, .3)` and `rgba(0,0,0,.3)` compare equal. */
35
+ export declare function normalizeValue(value: string): string;
36
+ /** COLOR_TOKENS keyed by normalized value, so rgba() entries are reachable. */
37
+ export declare const COLOR_TOKENS_NORMALIZED: Record<string, string>;
14
38
  /** Expand #abc / #abcd to the 6/8-digit form, lowercased. */
15
39
  export declare function normalizeHex(hex: string): string;
16
40
  /** Style properties whose numeric values map to the spacing scale. */
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/util/tokens.ts"],"names":[],"mappings":"AAKA,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAmCnD,CAAA;AAED,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASvD,CAAA;AAED,oCAAoC;AACpC,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4D/C,CAAA;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,aA0B7B,CAAA;AAEF,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,aAU3B,CAAA"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/util/tokens.ts"],"names":[],"mappings":"AAKA,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0CnD,CAAA;AAED,qCAAqC;AACrC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASvD,CAAA;AAED,oCAAoC;AACpC,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4D/C,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM1D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAUlF,CAAA;AAED,yCAAyC;AACzC,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKrD,CAAA;AAED,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIhD,CAAA;AAED,iCAAiC;AACjC,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKxD,CAAA;AAED,2DAA2D;AAC3D,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIhD,CAAA;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE1D,CAAA;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,aA0B7B,CAAA;AAEF,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,aAU3B,CAAA"}
@@ -33,6 +33,13 @@ export const TOKEN_DEEP_PATHS = {
33
33
  DurationToken: 'keys',
34
34
  ICON_SIZES: 'keys',
35
35
  IconSize: 'keys',
36
+ BREAKPOINT_KEYS: 'keys',
37
+ BREAKPOINTS_PX: 'keys',
38
+ FONT_SIZE_REM: 'keys',
39
+ FONT_WEIGHTS: 'keys',
40
+ TYPE_SCALE_FONT_SIZE_REM: 'keys',
41
+ SHADOWS: 'keys',
42
+ EASINGS: 'keys',
36
43
  ColorToken: 'keys',
37
44
  RawColors: 'raw',
38
45
  darkColors: 'raw',
@@ -125,6 +132,63 @@ export const COLOR_TOKENS = {
125
132
  'rgba(96, 165, 250, 0.5)': 'infoBorder',
126
133
  '#bfdbfe': 'infoText',
127
134
  };
135
+ /** px value → breakpoint token name (`breakpoints.md` is the '768px' const). */
136
+ export const BREAKPOINT_TOKENS_BY_PX = {
137
+ 480: 'xs',
138
+ 640: 'sm',
139
+ 768: 'md',
140
+ 1024: 'lg',
141
+ 1280: 'xl',
142
+ };
143
+ /**
144
+ * rem value → font-size token. Built from typeScale.fontSize1..9 first, then
145
+ * typography.fontSize* on top — so a size both scales carry suggests the
146
+ * named `typography` token, and only the steps typography lacks (13px, 30px,
147
+ * 36px) fall back to the numbered typeScale one.
148
+ */
149
+ export const FONT_SIZE_TOKENS_BY_REM = {
150
+ 0.75: { group: 'typography', token: 'fontSizeXs' },
151
+ 0.8125: { group: 'typeScale', token: 'fontSize2' },
152
+ 0.875: { group: 'typography', token: 'fontSizeSm' },
153
+ 1: { group: 'typography', token: 'fontSizeMd' },
154
+ 1.125: { group: 'typography', token: 'fontSizeLg' },
155
+ 1.25: { group: 'typography', token: 'fontSizeXl' },
156
+ 1.5: { group: 'typography', token: 'fontSizeHeading' },
157
+ 1.875: { group: 'typeScale', token: 'fontSize8' },
158
+ 2.25: { group: 'typeScale', token: 'fontSize9' },
159
+ };
160
+ /** numeric weight → typography token. */
161
+ export const FONT_WEIGHT_TOKENS = {
162
+ 400: 'fontWeightNormal',
163
+ 500: 'fontWeightMedium',
164
+ 600: 'fontWeightSemibold',
165
+ 700: 'fontWeightBold',
166
+ };
167
+ /** Shadow value (base palette, whitespace-normalized) → shadows token. */
168
+ export const SHADOW_TOKENS = {
169
+ '02px4pxrgba(0,0,0,0.3)': 'sm',
170
+ '04px12pxrgba(0,0,0,0.4)': 'md',
171
+ '08px24pxrgba(0,0,0,0.5)': 'lg',
172
+ };
173
+ /** ms value → duration token. */
174
+ export const DURATION_TOKENS_BY_MS = {
175
+ 0: 'instant',
176
+ 150: 'fast',
177
+ 200: 'base',
178
+ 280: 'slow',
179
+ };
180
+ /** Easing value (whitespace-normalized) → easing token. */
181
+ export const EASING_TOKENS = {
182
+ ease: 'standard',
183
+ 'cubic-bezier(0.32,0.72,0,1)': 'easeOut',
184
+ 'cubic-bezier(0.72,0,0.68,0.28)': 'easeIn',
185
+ };
186
+ /** Collapse whitespace so `rgba(0, 0, 0, .3)` and `rgba(0,0,0,.3)` compare equal. */
187
+ export function normalizeValue(value) {
188
+ return value.trim().replace(/\s+/g, '');
189
+ }
190
+ /** COLOR_TOKENS keyed by normalized value, so rgba() entries are reachable. */
191
+ export const COLOR_TOKENS_NORMALIZED = Object.fromEntries(Object.entries(COLOR_TOKENS).map(([value, token]) => [normalizeValue(value), token]));
128
192
  /** Expand #abc / #abcd to the 6/8-digit form, lowercased. */
129
193
  export function normalizeHex(hex) {
130
194
  const lower = hex.toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/util/tokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/util/tokens.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duro-app/eslint-plugin",
3
- "version": "2.0.1",
3
+ "version": "3.1.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "ESLint rules enforcing the Duro design system conventions: react-strict-dom html.* elements, deep token imports, token values over raw px/hex, and no deprecated Table parts.",
@@ -48,7 +48,7 @@
48
48
  "@typescript-eslint/utils": "^8.0.0",
49
49
  "eslint": "^9.20.0",
50
50
  "typescript": "^5.7.0",
51
- "@duro-app/tokens": "^2.0.1"
51
+ "@duro-app/tokens": "^3.1.0"
52
52
  },
53
53
  "scripts": {
54
54
  "build": "tsc -p tsconfig.build.json",