@terrazzo/parser 0.7.3 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/index.d.ts +705 -12
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4603 -12
  5. package/dist/index.js.map +1 -1
  6. package/package.json +11 -7
  7. package/src/build/index.ts +8 -6
  8. package/src/index.ts +76 -1
  9. package/dist/build/index.d.ts +0 -20
  10. package/dist/build/index.d.ts.map +0 -1
  11. package/dist/build/index.js +0 -166
  12. package/dist/build/index.js.map +0 -1
  13. package/dist/config.d.ts +0 -8
  14. package/dist/config.d.ts.map +0 -1
  15. package/dist/config.js +0 -290
  16. package/dist/config.js.map +0 -1
  17. package/dist/lib/code-frame.d.ts +0 -31
  18. package/dist/lib/code-frame.d.ts.map +0 -1
  19. package/dist/lib/code-frame.js +0 -108
  20. package/dist/lib/code-frame.js.map +0 -1
  21. package/dist/lint/index.d.ts +0 -12
  22. package/dist/lint/index.d.ts.map +0 -1
  23. package/dist/lint/index.js +0 -105
  24. package/dist/lint/index.js.map +0 -1
  25. package/dist/lint/plugin-core/index.d.ts +0 -13
  26. package/dist/lint/plugin-core/index.d.ts.map +0 -1
  27. package/dist/lint/plugin-core/index.js +0 -40
  28. package/dist/lint/plugin-core/index.js.map +0 -1
  29. package/dist/lint/plugin-core/lib/docs.d.ts +0 -2
  30. package/dist/lint/plugin-core/lib/docs.d.ts.map +0 -1
  31. package/dist/lint/plugin-core/lib/docs.js +0 -4
  32. package/dist/lint/plugin-core/lib/docs.js.map +0 -1
  33. package/dist/lint/plugin-core/rules/a11y-min-contrast.d.ts +0 -40
  34. package/dist/lint/plugin-core/rules/a11y-min-contrast.d.ts.map +0 -1
  35. package/dist/lint/plugin-core/rules/a11y-min-contrast.js +0 -58
  36. package/dist/lint/plugin-core/rules/a11y-min-contrast.js.map +0 -1
  37. package/dist/lint/plugin-core/rules/a11y-min-font-size.d.ts +0 -14
  38. package/dist/lint/plugin-core/rules/a11y-min-font-size.d.ts.map +0 -1
  39. package/dist/lint/plugin-core/rules/a11y-min-font-size.js +0 -45
  40. package/dist/lint/plugin-core/rules/a11y-min-font-size.js.map +0 -1
  41. package/dist/lint/plugin-core/rules/colorspace.d.ts +0 -15
  42. package/dist/lint/plugin-core/rules/colorspace.d.ts.map +0 -1
  43. package/dist/lint/plugin-core/rules/colorspace.js +0 -85
  44. package/dist/lint/plugin-core/rules/colorspace.js.map +0 -1
  45. package/dist/lint/plugin-core/rules/consistent-naming.d.ts +0 -12
  46. package/dist/lint/plugin-core/rules/consistent-naming.d.ts.map +0 -1
  47. package/dist/lint/plugin-core/rules/consistent-naming.js +0 -49
  48. package/dist/lint/plugin-core/rules/consistent-naming.js.map +0 -1
  49. package/dist/lint/plugin-core/rules/descriptions.d.ts +0 -10
  50. package/dist/lint/plugin-core/rules/descriptions.d.ts.map +0 -1
  51. package/dist/lint/plugin-core/rules/descriptions.js +0 -32
  52. package/dist/lint/plugin-core/rules/descriptions.js.map +0 -1
  53. package/dist/lint/plugin-core/rules/duplicate-values.d.ts +0 -10
  54. package/dist/lint/plugin-core/rules/duplicate-values.d.ts.map +0 -1
  55. package/dist/lint/plugin-core/rules/duplicate-values.js +0 -65
  56. package/dist/lint/plugin-core/rules/duplicate-values.js.map +0 -1
  57. package/dist/lint/plugin-core/rules/max-gamut.d.ts +0 -15
  58. package/dist/lint/plugin-core/rules/max-gamut.d.ts.map +0 -1
  59. package/dist/lint/plugin-core/rules/max-gamut.js +0 -101
  60. package/dist/lint/plugin-core/rules/max-gamut.js.map +0 -1
  61. package/dist/lint/plugin-core/rules/required-children.d.ts +0 -19
  62. package/dist/lint/plugin-core/rules/required-children.d.ts.map +0 -1
  63. package/dist/lint/plugin-core/rules/required-children.js +0 -78
  64. package/dist/lint/plugin-core/rules/required-children.js.map +0 -1
  65. package/dist/lint/plugin-core/rules/required-modes.d.ts +0 -14
  66. package/dist/lint/plugin-core/rules/required-modes.d.ts.map +0 -1
  67. package/dist/lint/plugin-core/rules/required-modes.js +0 -52
  68. package/dist/lint/plugin-core/rules/required-modes.js.map +0 -1
  69. package/dist/lint/plugin-core/rules/required-typography-properties.d.ts +0 -11
  70. package/dist/lint/plugin-core/rules/required-typography-properties.d.ts.map +0 -1
  71. package/dist/lint/plugin-core/rules/required-typography-properties.js +0 -38
  72. package/dist/lint/plugin-core/rules/required-typography-properties.js.map +0 -1
  73. package/dist/logger.d.ts +0 -77
  74. package/dist/logger.d.ts.map +0 -1
  75. package/dist/logger.js +0 -136
  76. package/dist/logger.js.map +0 -1
  77. package/dist/parse/alias.d.ts +0 -34
  78. package/dist/parse/alias.d.ts.map +0 -1
  79. package/dist/parse/alias.js +0 -302
  80. package/dist/parse/alias.js.map +0 -1
  81. package/dist/parse/index.d.ts +0 -41
  82. package/dist/parse/index.d.ts.map +0 -1
  83. package/dist/parse/index.js +0 -273
  84. package/dist/parse/index.js.map +0 -1
  85. package/dist/parse/json.d.ts +0 -52
  86. package/dist/parse/json.d.ts.map +0 -1
  87. package/dist/parse/json.js +0 -168
  88. package/dist/parse/json.js.map +0 -1
  89. package/dist/parse/normalize.d.ts +0 -24
  90. package/dist/parse/normalize.d.ts.map +0 -1
  91. package/dist/parse/normalize.js +0 -176
  92. package/dist/parse/normalize.js.map +0 -1
  93. package/dist/parse/validate.d.ts +0 -90
  94. package/dist/parse/validate.d.ts.map +0 -1
  95. package/dist/parse/validate.js +0 -787
  96. package/dist/parse/validate.js.map +0 -1
  97. package/dist/types.d.ts +0 -265
  98. package/dist/types.d.ts.map +0 -1
  99. package/dist/types.js +0 -2
  100. package/dist/types.js.map +0 -1
@@ -1,85 +0,0 @@
1
- import { isTokenMatch } from '@terrazzo/token-tools';
2
- import { docsLink } from '../lib/docs.js';
3
- export const COLORSPACE = 'core/colorspace';
4
- const ERROR_COLOR = 'COLOR';
5
- const ERROR_BORDER = 'BORDER';
6
- const ERROR_GRADIENT = 'GRADIENT';
7
- const ERROR_SHADOW = 'SHADOW';
8
- const rule = {
9
- meta: {
10
- messages: {
11
- [ERROR_COLOR]: 'Color {{ id }} not in colorspace {{ colorSpace }}',
12
- [ERROR_BORDER]: 'Border {{ id }} not in colorspace {{ colorSpace }}',
13
- [ERROR_GRADIENT]: 'Gradient {{ id }} not in colorspace {{ colorSpace }}',
14
- [ERROR_SHADOW]: 'Shadow {{ id }} not in colorspace {{ colorSpace }}',
15
- },
16
- docs: {
17
- description: 'Enforce that all colors are in a specific colorspace.',
18
- url: docsLink(COLORSPACE),
19
- },
20
- },
21
- defaultOptions: { colorSpace: 'srgb' },
22
- create({ tokens, options, report }) {
23
- if (!options.colorSpace) {
24
- return;
25
- }
26
- for (const t of Object.values(tokens)) {
27
- // skip ignored tokens
28
- if (options?.ignore && isTokenMatch(t.id, options.ignore)) {
29
- continue;
30
- }
31
- // skip aliases
32
- if (t.aliasOf) {
33
- continue;
34
- }
35
- switch (t.$type) {
36
- case 'color': {
37
- if (t.$value.colorSpace !== options.colorSpace) {
38
- report({
39
- messageId: ERROR_COLOR,
40
- data: { id: t.id, colorSpace: options.colorSpace },
41
- node: t.source.node,
42
- });
43
- }
44
- break;
45
- }
46
- case 'border': {
47
- if (!t.partialAliasOf?.color && t.$value.color.colorSpace !== options.colorSpace) {
48
- report({
49
- messageId: ERROR_BORDER,
50
- data: { id: t.id, colorSpace: options.colorSpace },
51
- node: t.source.node,
52
- });
53
- }
54
- break;
55
- }
56
- case 'gradient': {
57
- for (let stopI = 0; stopI < t.$value.length; stopI++) {
58
- if (!t.partialAliasOf?.[stopI]?.color && t.$value[stopI].color.colorSpace !== options.colorSpace) {
59
- report({
60
- messageId: ERROR_GRADIENT,
61
- data: { id: t.id, colorSpace: options.colorSpace },
62
- node: t.source.node,
63
- });
64
- }
65
- }
66
- break;
67
- }
68
- case 'shadow': {
69
- for (let shadowI = 0; shadowI < t.$value.length; shadowI++) {
70
- if (!t.partialAliasOf?.[shadowI]?.color && t.$value[shadowI].color.colorSpace !== options.colorSpace) {
71
- report({
72
- messageId: ERROR_SHADOW,
73
- data: { id: t.id, colorSpace: options.colorSpace },
74
- node: t.source.node,
75
- });
76
- }
77
- }
78
- break;
79
- }
80
- }
81
- }
82
- },
83
- };
84
- export default rule;
85
- //# sourceMappingURL=colorspace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"colorspace.js","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/colorspace.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { LintRule } from '../../../types.js';
2
- export declare const CONSISTENT_NAMING = "core/consistent-naming";
3
- export declare const ERROR_WRONG_FORMAT = "ERROR_WRONG_FORMAT";
4
- export interface RuleConsistentNamingOptions {
5
- /** Specify format, or custom naming validator */
6
- format: 'kebab-case' | 'camelCase' | 'PascalCase' | 'snake_case' | 'SCREAMING_SNAKE_CASE' | ((tokenID: string) => boolean);
7
- /** Token IDs to ignore. Supports globs (`*`). */
8
- ignore?: string[];
9
- }
10
- declare const rule: LintRule<typeof ERROR_WRONG_FORMAT, RuleConsistentNamingOptions>;
11
- export default rule;
12
- //# sourceMappingURL=consistent-naming.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"consistent-naming.d.ts","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/consistent-naming.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,eAAO,MAAM,iBAAiB,2BAA2B,CAAC;AAC1D,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD,MAAM,WAAW,2BAA2B;IAC1C,iDAAiD;IACjD,MAAM,EACF,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,sBAAsB,GACtB,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACnC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,QAAA,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,kBAAkB,EAAE,2BAA2B,CA0C1E,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,49 +0,0 @@
1
- import { camelCase, kebabCase, pascalCase, snakeCase } from 'scule';
2
- import { docsLink } from '../lib/docs.js';
3
- export const CONSISTENT_NAMING = 'core/consistent-naming';
4
- export const ERROR_WRONG_FORMAT = 'ERROR_WRONG_FORMAT';
5
- const rule = {
6
- meta: {
7
- messages: {
8
- [ERROR_WRONG_FORMAT]: '{{ id }} doesn’t match format {{ format }}',
9
- },
10
- docs: {
11
- description: 'Enforce consistent naming for tokens.',
12
- url: docsLink(CONSISTENT_NAMING),
13
- },
14
- },
15
- defaultOptions: { format: 'kebab-case' },
16
- create({ tokens, options, report }) {
17
- const basicFormatter = {
18
- 'kebab-case': kebabCase,
19
- camelCase,
20
- PascalCase: pascalCase,
21
- snake_case: snakeCase,
22
- SCREAMING_SNAKE_CASE: (name) => snakeCase(name).toLocaleUpperCase(),
23
- }[String(options.format)];
24
- for (const t of Object.values(tokens)) {
25
- if (basicFormatter) {
26
- const parts = t.id.split('.');
27
- if (!parts.every((part) => basicFormatter(part) === part)) {
28
- report({
29
- messageId: ERROR_WRONG_FORMAT,
30
- data: { id: t.id, format: options.format },
31
- node: t.source.node,
32
- });
33
- }
34
- }
35
- else if (typeof options.format === 'function') {
36
- const result = options.format(t.id);
37
- if (result) {
38
- report({
39
- messageId: ERROR_WRONG_FORMAT,
40
- data: { id: t.id, format: '(custom)' },
41
- node: t.source.node,
42
- });
43
- }
44
- }
45
- }
46
- },
47
- };
48
- export default rule;
49
- //# sourceMappingURL=consistent-naming.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"consistent-naming.js","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/consistent-naming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AAC1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAevD,MAAM,IAAI,GAAqE;IAC7E,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,CAAC,kBAAkB,CAAC,EAAE,4CAA4C;SACnE;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,uCAAuC;YACpD,GAAG,EAAE,QAAQ,CAAC,iBAAiB,CAAC;SACjC;KACF;IACD,cAAc,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;IACxC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;QAChC,MAAM,cAAc,GAAG;YACrB,YAAY,EAAE,SAAS;YACvB,SAAS;YACT,UAAU,EAAE,UAAU;YACtB,UAAU,EAAE,SAAS;YACrB,oBAAoB,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE;SAC5E,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAE1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;oBAC1D,MAAM,CAAC;wBACL,SAAS,EAAE,kBAAkB;wBAC7B,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;wBAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC;wBACL,SAAS,EAAE,kBAAkB;wBAC7B,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;wBACtC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { LintRule } from '../../../types.js';
2
- export declare const DESCRIPTIONS = "core/descriptions";
3
- export interface RuleDescriptionsOptions {
4
- /** Token IDs to ignore. Supports globs (`*`). */
5
- ignore?: string[];
6
- }
7
- declare const ERROR_MISSING_DESCRIPTION = "MISSING_DESCRIPTION";
8
- declare const rule: LintRule<typeof ERROR_MISSING_DESCRIPTION, RuleDescriptionsOptions>;
9
- export default rule;
10
- //# sourceMappingURL=descriptions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"descriptions.d.ts","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/descriptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAEhD,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,QAAA,MAAM,yBAAyB,wBAAwB,CAAC;AAExD,QAAA,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,yBAAyB,EAAE,uBAAuB,CAyB7E,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,32 +0,0 @@
1
- import { isTokenMatch } from '@terrazzo/token-tools';
2
- import { docsLink } from '../lib/docs.js';
3
- export const DESCRIPTIONS = 'core/descriptions';
4
- const ERROR_MISSING_DESCRIPTION = 'MISSING_DESCRIPTION';
5
- const rule = {
6
- meta: {
7
- messages: {
8
- [ERROR_MISSING_DESCRIPTION]: '{{ id }} missing description',
9
- },
10
- docs: {
11
- description: 'Enforce tokens have descriptions.',
12
- url: docsLink(DESCRIPTIONS),
13
- },
14
- },
15
- defaultOptions: {},
16
- create({ tokens, options, report }) {
17
- for (const t of Object.values(tokens)) {
18
- if (options.ignore && isTokenMatch(t.id, options.ignore)) {
19
- continue;
20
- }
21
- if (!t.$description) {
22
- report({
23
- messageId: ERROR_MISSING_DESCRIPTION,
24
- data: { id: t.id },
25
- node: t.source.node,
26
- });
27
- }
28
- }
29
- },
30
- };
31
- export default rule;
32
- //# sourceMappingURL=descriptions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"descriptions.js","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/descriptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAOhD,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAExD,MAAM,IAAI,GAAwE;IAChF,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,CAAC,yBAAyB,CAAC,EAAE,8BAA8B;SAC5D;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,mCAAmC;YAChD,GAAG,EAAE,QAAQ,CAAC,YAAY,CAAC;SAC5B;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;QAChC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,SAAS;YACX,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;gBACpB,MAAM,CAAC;oBACL,SAAS,EAAE,yBAAyB;oBACpC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;oBAClB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { LintRule } from '../../../types.js';
2
- export declare const DUPLICATE_VALUES = "core/duplicate-values";
3
- export interface RuleDuplicateValueOptions {
4
- /** Token IDs to ignore. Supports globs (`*`). */
5
- ignore?: string[];
6
- }
7
- declare const ERROR_DUPLICATE_VALUE = "ERROR_DUPLICATE_VALUE";
8
- declare const rule: LintRule<typeof ERROR_DUPLICATE_VALUE, RuleDuplicateValueOptions>;
9
- export default rule;
10
- //# sourceMappingURL=duplicate-values.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"duplicate-values.d.ts","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/duplicate-values.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,QAAA,MAAM,qBAAqB,0BAA0B,CAAC;AAEtD,QAAA,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,qBAAqB,EAAE,yBAAyB,CAgE3E,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,65 +0,0 @@
1
- import { isAlias, isTokenMatch } from '@terrazzo/token-tools';
2
- import { docsLink } from '../lib/docs.js';
3
- export const DUPLICATE_VALUES = 'core/duplicate-values';
4
- const ERROR_DUPLICATE_VALUE = 'ERROR_DUPLICATE_VALUE';
5
- const rule = {
6
- meta: {
7
- messages: {
8
- [ERROR_DUPLICATE_VALUE]: '{{ id }} declared a duplicate value',
9
- },
10
- docs: {
11
- description: 'Enforce tokens can’t redeclare the same value (excludes aliases).',
12
- url: docsLink(DUPLICATE_VALUES),
13
- },
14
- },
15
- defaultOptions: {},
16
- create({ report, tokens, options }) {
17
- const values = {};
18
- for (const t of Object.values(tokens)) {
19
- // skip ignored tokens
20
- if (options.ignore && isTokenMatch(t.id, options.ignore)) {
21
- continue;
22
- }
23
- if (!values[t.$type]) {
24
- values[t.$type] = new Set();
25
- }
26
- // primitives: direct comparison is easy
27
- if (t.$type === 'boolean' ||
28
- t.$type === 'duration' ||
29
- t.$type === 'fontWeight' ||
30
- t.$type === 'link' ||
31
- t.$type === 'number' ||
32
- t.$type === 'string') {
33
- // skip aliases (note: $value will be resolved)
34
- if (typeof t.aliasOf === 'string' && isAlias(t.aliasOf)) {
35
- continue;
36
- }
37
- if (values[t.$type]?.has(t.$value)) {
38
- report({
39
- messageId: ERROR_DUPLICATE_VALUE,
40
- data: { id: t.id },
41
- node: t.source.node,
42
- });
43
- }
44
- values[t.$type]?.add(t.$value);
45
- }
46
- else {
47
- // everything else: use deepEqual
48
- for (const v of values[t.$type].values() ?? []) {
49
- // TODO: don’t JSON.stringify
50
- if (JSON.stringify(t.$value) === JSON.stringify(v)) {
51
- report({
52
- messageId: ERROR_DUPLICATE_VALUE,
53
- data: { id: t.id },
54
- node: t.source.node,
55
- });
56
- break;
57
- }
58
- }
59
- values[t.$type].add(t.$value);
60
- }
61
- }
62
- },
63
- };
64
- export default rule;
65
- //# sourceMappingURL=duplicate-values.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"duplicate-values.js","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/duplicate-values.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import type { LintRule } from '../../../types.js';
2
- export declare const MAX_GAMUT = "core/max-gamut";
3
- export interface RuleMaxGamutOptions {
4
- /** Gamut to constrain color tokens to. */
5
- gamut: 'srgb' | 'p3' | 'rec2020';
6
- /** (optional) Token IDs to ignore. Supports globs (`*`). */
7
- ignore?: string[];
8
- }
9
- declare const ERROR_COLOR = "COLOR";
10
- declare const ERROR_BORDER = "BORDER";
11
- declare const ERROR_GRADIENT = "GRADIENT";
12
- declare const ERROR_SHADOW = "SHADOW";
13
- declare const rule: LintRule<typeof ERROR_COLOR | typeof ERROR_BORDER | typeof ERROR_GRADIENT | typeof ERROR_SHADOW, RuleMaxGamutOptions>;
14
- export default rule;
15
- //# sourceMappingURL=max-gamut.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"max-gamut.d.ts","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/max-gamut.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAiCD,QAAA,MAAM,WAAW,UAAU,CAAC;AAC5B,QAAA,MAAM,YAAY,WAAW,CAAC;AAC9B,QAAA,MAAM,cAAc,aAAa,CAAC;AAClC,QAAA,MAAM,YAAY,WAAW,CAAC;AAE9B,QAAA,MAAM,IAAI,EAAE,QAAQ,CAClB,OAAO,WAAW,GAAG,OAAO,YAAY,GAAG,OAAO,cAAc,GAAG,OAAO,YAAY,EACtF,mBAAmB,CAkEpB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,101 +0,0 @@
1
- import { isTokenMatch, tokenToCulori } from '@terrazzo/token-tools';
2
- import { clampChroma } from 'culori';
3
- import { docsLink } from '../lib/docs.js';
4
- export const MAX_GAMUT = 'core/max-gamut';
5
- const TOLERANCE = 0.000001; // threshold above which it counts as an error (take rounding errors into account)
6
- /** is a Culori-parseable color within the specified gamut? */
7
- function isWithinGamut(color, gamut) {
8
- const parsed = tokenToCulori(color);
9
- if (!parsed) {
10
- return false;
11
- }
12
- if (['rgb', 'hsl', 'hsv', 'hwb'].includes(parsed.mode)) {
13
- return true;
14
- }
15
- const clamped = clampChroma(parsed, parsed.mode, gamut === 'srgb' ? 'rgb' : gamut);
16
- return isWithinThreshold(parsed, clamped);
17
- }
18
- /** is Color A close enough to Color B? */
19
- function isWithinThreshold(a, b, tolerance = TOLERANCE) {
20
- for (const k in a) {
21
- if (k === 'mode' || k === 'alpha') {
22
- continue;
23
- }
24
- if (!(k in b)) {
25
- throw new Error(`Can’t compare ${a.mode} to ${b.mode}`);
26
- }
27
- if (Math.abs(a[k] - b[k]) > tolerance) {
28
- return false;
29
- }
30
- }
31
- return true;
32
- }
33
- const ERROR_COLOR = 'COLOR';
34
- const ERROR_BORDER = 'BORDER';
35
- const ERROR_GRADIENT = 'GRADIENT';
36
- const ERROR_SHADOW = 'SHADOW';
37
- const rule = {
38
- meta: {
39
- messages: {
40
- [ERROR_COLOR]: 'Color {{ id }} is outside {{ gamut }} gamut',
41
- [ERROR_BORDER]: 'Border {{ id }} is outside {{ gamut }} gamut',
42
- [ERROR_GRADIENT]: 'Gradient {{ id }} is outside {{ gamut }} gamut',
43
- [ERROR_SHADOW]: 'Shadow {{ id }} is outside {{ gamut }} gamut',
44
- },
45
- docs: {
46
- description: 'Enforce colors are within the specified gamut.',
47
- url: docsLink(MAX_GAMUT),
48
- },
49
- },
50
- defaultOptions: { gamut: 'rec2020' },
51
- create({ tokens, options, report }) {
52
- if (!options?.gamut) {
53
- return;
54
- }
55
- if (options.gamut !== 'srgb' && options.gamut !== 'p3' && options.gamut !== 'rec2020') {
56
- throw new Error(`Unknown gamut "${options.gamut}". Options are "srgb", "p3", or "rec2020"`);
57
- }
58
- for (const t of Object.values(tokens)) {
59
- // skip ignored tokens
60
- if (options.ignore && isTokenMatch(t.id, options.ignore)) {
61
- continue;
62
- }
63
- // skip aliases
64
- if (t.aliasOf) {
65
- continue;
66
- }
67
- switch (t.$type) {
68
- case 'color': {
69
- if (!isWithinGamut(t.$value, options.gamut)) {
70
- report({ messageId: ERROR_COLOR, data: { id: t.id, gamut: options.gamut }, node: t.source.node });
71
- }
72
- break;
73
- }
74
- case 'border': {
75
- if (!t.partialAliasOf?.color && !isWithinGamut(t.$value.color, options.gamut)) {
76
- report({ messageId: ERROR_BORDER, data: { id: t.id, gamut: options.gamut }, node: t.source.node });
77
- }
78
- break;
79
- }
80
- case 'gradient': {
81
- for (let stopI = 0; stopI < t.$value.length; stopI++) {
82
- if (!t.partialAliasOf?.[stopI]?.color && !isWithinGamut(t.$value[stopI].color, options.gamut)) {
83
- report({ messageId: ERROR_GRADIENT, data: { id: t.id, gamut: options.gamut }, node: t.source.node });
84
- }
85
- }
86
- break;
87
- }
88
- case 'shadow': {
89
- for (let shadowI = 0; shadowI < t.$value.length; shadowI++) {
90
- if (!t.partialAliasOf?.[shadowI]?.color && !isWithinGamut(t.$value[shadowI].color, options.gamut)) {
91
- report({ messageId: ERROR_SHADOW, data: { id: t.id, gamut: options.gamut }, node: t.source.node });
92
- }
93
- }
94
- break;
95
- }
96
- }
97
- }
98
- },
99
- };
100
- export default rule;
101
- //# sourceMappingURL=max-gamut.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"max-gamut.js","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/max-gamut.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAc,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAS1C,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,kFAAkF;AAE9G,8DAA8D;AAC9D,SAAS,aAAa,CAAC,KAA2B,EAAE,KAAmC;IACrF,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnF,OAAO,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,0CAA0C;AAC1C,SAAS,iBAAiB,CAAC,CAAQ,EAAE,CAAQ,EAAE,SAAS,GAAG,SAAS;IAClE,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;YAClC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAE,CAAS,CAAC,CAAC,CAAC,GAAI,CAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC;AAC9B,MAAM,cAAc,GAAG,UAAU,CAAC;AAClC,MAAM,YAAY,GAAG,QAAQ,CAAC;AAE9B,MAAM,IAAI,GAGN;IACF,IAAI,EAAE;QACJ,QAAQ,EAAE;YACR,CAAC,WAAW,CAAC,EAAE,6CAA6C;YAC5D,CAAC,YAAY,CAAC,EAAE,8CAA8C;YAC9D,CAAC,cAAc,CAAC,EAAE,gDAAgD;YAClE,CAAC,YAAY,CAAC,EAAE,8CAA8C;SAC/D;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,gDAAgD;YAC7D,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC;SACzB;KACF;IACD,cAAc,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;IACpC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;QAChC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACtF,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,CAAC,KAAK,2CAA2C,CAAC,CAAC;QAC9F,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,sBAAsB;YACtB,IAAI,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,SAAS;YACX,CAAC;YAED,eAAe;YACf,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACd,SAAS;YACX,CAAC;YAED,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC5C,MAAM,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpG,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC9E,MAAM,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBACrG,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;wBACrD,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC/F,MAAM,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;wBACvG,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;wBAC3D,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAE,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;4BACnG,MAAM,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;wBACrG,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,19 +0,0 @@
1
- import type { LintRule } from '../../../types.js';
2
- export declare const REQUIRED_CHILDREN = "core/required-children";
3
- export interface RequiredChildrenMatch {
4
- /** Glob of tokens/groups to match */
5
- match: string[];
6
- /** Required token IDs to match (this only looks at the very last segment of a token ID!) */
7
- requiredTokens?: string[];
8
- /** Required groups to match (this only looks at the beginning/middle segments of a token ID!) */
9
- requiredGroups?: string[];
10
- }
11
- export interface RuleRequiredChildrenOptions {
12
- matches: RequiredChildrenMatch[];
13
- }
14
- export declare const ERROR_EMPTY_MATCH = "EMPTY_MATCH";
15
- export declare const ERROR_MISSING_REQUIRED_TOKENS = "MISSING_REQUIRED_TOKENS";
16
- export declare const ERROR_MISSING_REQUIRED_GROUP = "MISSING_REQUIRED_GROUP";
17
- declare const rule: LintRule<typeof ERROR_EMPTY_MATCH | typeof ERROR_MISSING_REQUIRED_TOKENS | typeof ERROR_MISSING_REQUIRED_GROUP, RuleRequiredChildrenOptions>;
18
- export default rule;
19
- //# sourceMappingURL=required-children.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"required-children.d.ts","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/required-children.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,eAAO,MAAM,iBAAiB,2BAA2B,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iGAAiG;IACjG,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAC/C,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AACvE,eAAO,MAAM,4BAA4B,2BAA2B,CAAC;AAErE,QAAA,MAAM,IAAI,EAAE,QAAQ,CAClB,OAAO,iBAAiB,GAAG,OAAO,6BAA6B,GAAG,OAAO,4BAA4B,EACrG,2BAA2B,CA4E5B,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,78 +0,0 @@
1
- import { isTokenMatch } from '@terrazzo/token-tools';
2
- import { docsLink } from '../lib/docs.js';
3
- export const REQUIRED_CHILDREN = 'core/required-children';
4
- export const ERROR_EMPTY_MATCH = 'EMPTY_MATCH';
5
- export const ERROR_MISSING_REQUIRED_TOKENS = 'MISSING_REQUIRED_TOKENS';
6
- export const ERROR_MISSING_REQUIRED_GROUP = 'MISSING_REQUIRED_GROUP';
7
- const rule = {
8
- meta: {
9
- messages: {
10
- [ERROR_EMPTY_MATCH]: 'No tokens matched {{ matcher }}',
11
- [ERROR_MISSING_REQUIRED_TOKENS]: 'Match {{ index }}: some groups missing required token "{{ token }}"',
12
- [ERROR_MISSING_REQUIRED_GROUP]: 'Match {{ index }}: some tokens missing required group "{{ group }}"',
13
- },
14
- docs: {
15
- description: 'Enforce token groups have specific children, whether tokens and/or groups.',
16
- url: docsLink(REQUIRED_CHILDREN),
17
- },
18
- },
19
- defaultOptions: { matches: [] },
20
- create({ tokens, options, report }) {
21
- if (!options.matches?.length) {
22
- throw new Error('Invalid config. Missing `matches: […]`');
23
- }
24
- // note: in many other rules, the operation can be completed in one iteration through all tokens
25
- // in this rule, however, we have to scan all tokens every time per-match, because they may overlap
26
- for (let matchI = 0; matchI < options.matches.length; matchI++) {
27
- const { match, requiredTokens, requiredGroups } = options.matches[matchI];
28
- // validate
29
- if (!match.length) {
30
- throw new Error(`Match ${matchI}: must declare \`match: […]\``);
31
- }
32
- if (!requiredTokens?.length && !requiredGroups?.length) {
33
- throw new Error(`Match ${matchI}: must declare either \`requiredTokens: […]\` or \`requiredGroups: […]\``);
34
- }
35
- const matchGroups = [];
36
- const matchTokens = [];
37
- let tokensMatched = false;
38
- for (const t of Object.values(tokens)) {
39
- if (!isTokenMatch(t.id, match)) {
40
- continue;
41
- }
42
- tokensMatched = true;
43
- const groups = t.id.split('.');
44
- matchTokens.push(groups.pop());
45
- matchGroups.push(...groups);
46
- }
47
- if (!tokensMatched) {
48
- report({
49
- messageId: ERROR_EMPTY_MATCH,
50
- data: { matcher: JSON.stringify(match) },
51
- });
52
- continue;
53
- }
54
- if (requiredTokens) {
55
- for (const id of requiredTokens) {
56
- if (!matchTokens.includes(id)) {
57
- report({
58
- messageId: ERROR_MISSING_REQUIRED_TOKENS,
59
- data: { index: matchI, token: id },
60
- });
61
- }
62
- }
63
- }
64
- if (requiredGroups) {
65
- for (const groupName of requiredGroups) {
66
- if (!matchGroups.includes(groupName)) {
67
- report({
68
- messageId: ERROR_MISSING_REQUIRED_GROUP,
69
- data: { index: matchI, group: groupName },
70
- });
71
- }
72
- }
73
- }
74
- }
75
- },
76
- };
77
- export default rule;
78
- //# sourceMappingURL=required-children.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"required-children.js","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/required-children.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { LintRule } from '../../../types.js';
2
- export declare const REQUIRED_MODES = "core/required-modes";
3
- export type RequiredModesMatch = {
4
- /** Glob of tokens/groups to match */
5
- match: string[];
6
- /** Required modes */
7
- modes: string[];
8
- };
9
- export interface RuleRequiredModesOptions {
10
- matches: RequiredModesMatch[];
11
- }
12
- declare const rule: LintRule<never, RuleRequiredModesOptions>;
13
- export default rule;
14
- //# sourceMappingURL=required-modes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"required-modes.d.ts","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/required-modes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,eAAO,MAAM,cAAc,wBAAwB,CAAC;AAEpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qCAAqC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qBAAqB;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,QAAA,MAAM,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAmDnD,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,52 +0,0 @@
1
- import { isTokenMatch } from '@terrazzo/token-tools';
2
- import { docsLink } from '../lib/docs.js';
3
- export const REQUIRED_MODES = 'core/required-modes';
4
- const rule = {
5
- meta: {
6
- docs: {
7
- description: 'Enforce certain tokens have specific modes.',
8
- url: docsLink(REQUIRED_MODES),
9
- },
10
- },
11
- defaultOptions: { matches: [] },
12
- create({ tokens, options, report }) {
13
- if (!options?.matches?.length) {
14
- throw new Error('Invalid config. Missing `matches: […]`');
15
- }
16
- // note: in many other rules, the operation can be completed in one iteration through all tokens
17
- // in this rule, however, we have to scan all tokens every time per-match, because they may overlap
18
- for (let matchI = 0; matchI < options.matches.length; matchI++) {
19
- const { match, modes } = options.matches[matchI];
20
- // validate
21
- if (!match.length) {
22
- throw new Error(`Match ${matchI}: must declare \`match: […]\``);
23
- }
24
- if (!modes?.length) {
25
- throw new Error(`Match ${matchI}: must declare \`modes: […]\``);
26
- }
27
- let tokensMatched = false;
28
- for (const t of Object.values(tokens)) {
29
- if (!isTokenMatch(t.id, match)) {
30
- continue;
31
- }
32
- tokensMatched = true;
33
- for (const mode of modes) {
34
- if (!t.mode?.[mode]) {
35
- report({
36
- message: `Token ${t.id}: missing required mode "${mode}"`,
37
- node: t.source.node,
38
- });
39
- }
40
- }
41
- if (!tokensMatched) {
42
- report({
43
- message: `Match "${matchI}": no tokens matched ${JSON.stringify(match)}`,
44
- node: t.source.node,
45
- });
46
- }
47
- }
48
- }
49
- },
50
- };
51
- export default rule;
52
- //# sourceMappingURL=required-modes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"required-modes.js","sourceRoot":"","sources":["../../../../src/lint/plugin-core/rules/required-modes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAapD,MAAM,IAAI,GAA8C;IACtD,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EAAE,6CAA6C;YAC1D,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC;SAC9B;KACF;IACD,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;QAChC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,gGAAgG;QAChG,mGAAmG;QACnG,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;YAC/D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAE,CAAC;YAElD,WAAW;YACX,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,+BAA+B,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,+BAA+B,CAAC,CAAC;YAClE,CAAC;YAED,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC/B,SAAS;gBACX,CAAC;gBACD,aAAa,GAAG,IAAI,CAAC;gBAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;wBACpB,MAAM,CAAC;4BACL,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,4BAA4B,IAAI,GAAG;4BACzD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;yBACpB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,MAAM,CAAC;wBACL,OAAO,EAAE,UAAU,MAAM,wBAAwB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;wBACxE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}