@terrazzo/parser 0.1.3 → 0.2.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 (118) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +23 -0
  3. package/CONTRIBUTING.md +0 -12
  4. package/dist/build/index.d.ts +19 -0
  5. package/dist/build/index.js +165 -0
  6. package/dist/build/index.js.map +1 -0
  7. package/dist/config.d.ts +7 -0
  8. package/dist/config.js +269 -0
  9. package/dist/config.js.map +1 -0
  10. package/{index.d.ts → dist/index.d.ts} +1 -5
  11. package/dist/index.js +13 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/code-frame.d.ts +30 -0
  14. package/dist/lib/code-frame.js +108 -0
  15. package/dist/lib/code-frame.js.map +1 -0
  16. package/dist/lint/index.d.ts +11 -0
  17. package/dist/lint/index.js +102 -0
  18. package/dist/lint/index.js.map +1 -0
  19. package/dist/lint/plugin-core/index.d.ts +12 -0
  20. package/dist/lint/plugin-core/index.js +40 -0
  21. package/dist/lint/plugin-core/index.js.map +1 -0
  22. package/dist/lint/plugin-core/lib/docs.d.ts +1 -0
  23. package/dist/lint/plugin-core/lib/docs.js +4 -0
  24. package/dist/lint/plugin-core/lib/docs.js.map +1 -0
  25. package/dist/lint/plugin-core/rules/a11y-min-contrast.d.ts +39 -0
  26. package/dist/lint/plugin-core/rules/a11y-min-contrast.js +58 -0
  27. package/dist/lint/plugin-core/rules/a11y-min-contrast.js.map +1 -0
  28. package/dist/lint/plugin-core/rules/a11y-min-font-size.d.ts +13 -0
  29. package/dist/lint/plugin-core/rules/a11y-min-font-size.js +45 -0
  30. package/dist/lint/plugin-core/rules/a11y-min-font-size.js.map +1 -0
  31. package/dist/lint/plugin-core/rules/colorspace.d.ts +14 -0
  32. package/dist/lint/plugin-core/rules/colorspace.js +85 -0
  33. package/dist/lint/plugin-core/rules/colorspace.js.map +1 -0
  34. package/dist/lint/plugin-core/rules/consistent-naming.d.ts +11 -0
  35. package/dist/lint/plugin-core/rules/consistent-naming.js +49 -0
  36. package/dist/lint/plugin-core/rules/consistent-naming.js.map +1 -0
  37. package/dist/lint/plugin-core/rules/descriptions.d.ts +9 -0
  38. package/dist/lint/plugin-core/rules/descriptions.js +32 -0
  39. package/dist/lint/plugin-core/rules/descriptions.js.map +1 -0
  40. package/dist/lint/plugin-core/rules/duplicate-values.d.ts +9 -0
  41. package/dist/lint/plugin-core/rules/duplicate-values.js +65 -0
  42. package/dist/lint/plugin-core/rules/duplicate-values.js.map +1 -0
  43. package/dist/lint/plugin-core/rules/max-gamut.d.ts +14 -0
  44. package/dist/lint/plugin-core/rules/max-gamut.js +101 -0
  45. package/dist/lint/plugin-core/rules/max-gamut.js.map +1 -0
  46. package/dist/lint/plugin-core/rules/required-children.d.ts +18 -0
  47. package/dist/lint/plugin-core/rules/required-children.js +78 -0
  48. package/dist/lint/plugin-core/rules/required-children.js.map +1 -0
  49. package/dist/lint/plugin-core/rules/required-modes.d.ts +13 -0
  50. package/dist/lint/plugin-core/rules/required-modes.js +52 -0
  51. package/dist/lint/plugin-core/rules/required-modes.js.map +1 -0
  52. package/dist/lint/plugin-core/rules/required-typography-properties.d.ts +10 -0
  53. package/dist/lint/plugin-core/rules/required-typography-properties.js +38 -0
  54. package/dist/lint/plugin-core/rules/required-typography-properties.js.map +1 -0
  55. package/dist/logger.d.ts +76 -0
  56. package/dist/logger.js +123 -0
  57. package/dist/logger.js.map +1 -0
  58. package/dist/parse/alias.d.ts +51 -0
  59. package/dist/parse/alias.js +188 -0
  60. package/dist/parse/alias.js.map +1 -0
  61. package/dist/parse/index.d.ts +27 -0
  62. package/dist/parse/index.js +379 -0
  63. package/dist/parse/index.js.map +1 -0
  64. package/dist/parse/json.d.ts +36 -0
  65. package/dist/parse/json.js +88 -0
  66. package/dist/parse/json.js.map +1 -0
  67. package/dist/parse/normalize.d.ts +23 -0
  68. package/dist/parse/normalize.js +163 -0
  69. package/dist/parse/normalize.js.map +1 -0
  70. package/dist/parse/validate.d.ts +45 -0
  71. package/dist/parse/validate.js +601 -0
  72. package/dist/parse/validate.js.map +1 -0
  73. package/dist/types.d.ts +264 -0
  74. package/dist/types.js +2 -0
  75. package/dist/types.js.map +1 -0
  76. package/package.json +7 -7
  77. package/{build/index.js → src/build/index.ts} +47 -63
  78. package/src/config.ts +280 -0
  79. package/src/index.ts +18 -0
  80. package/{lib/code-frame.js → src/lib/code-frame.ts} +41 -8
  81. package/src/lint/index.ts +135 -0
  82. package/src/lint/plugin-core/index.ts +47 -0
  83. package/src/lint/plugin-core/lib/docs.ts +3 -0
  84. package/src/lint/plugin-core/rules/a11y-min-contrast.ts +91 -0
  85. package/src/lint/plugin-core/rules/a11y-min-font-size.ts +64 -0
  86. package/src/lint/plugin-core/rules/colorspace.ts +101 -0
  87. package/src/lint/plugin-core/rules/consistent-naming.ts +65 -0
  88. package/src/lint/plugin-core/rules/descriptions.ts +41 -0
  89. package/src/lint/plugin-core/rules/duplicate-values.ts +80 -0
  90. package/src/lint/plugin-core/rules/max-gamut.ts +121 -0
  91. package/src/lint/plugin-core/rules/required-children.ts +104 -0
  92. package/src/lint/plugin-core/rules/required-modes.ts +71 -0
  93. package/src/lint/plugin-core/rules/required-typography-properties.ts +53 -0
  94. package/{logger.js → src/logger.ts} +55 -16
  95. package/src/parse/alias.ts +224 -0
  96. package/src/parse/index.ts +457 -0
  97. package/src/parse/json.ts +106 -0
  98. package/{parse/normalize.js → src/parse/normalize.ts} +70 -24
  99. package/{parse/validate.js → src/parse/validate.ts} +154 -236
  100. package/src/types.ts +310 -0
  101. package/build/index.d.ts +0 -113
  102. package/config.d.ts +0 -64
  103. package/config.js +0 -206
  104. package/index.js +0 -35
  105. package/lib/code-frame.d.ts +0 -56
  106. package/lint/index.d.ts +0 -44
  107. package/lint/index.js +0 -59
  108. package/lint/plugin-core/index.d.ts +0 -3
  109. package/lint/plugin-core/index.js +0 -12
  110. package/lint/plugin-core/rules/duplicate-values.d.ts +0 -10
  111. package/lint/plugin-core/rules/duplicate-values.js +0 -68
  112. package/logger.d.ts +0 -71
  113. package/parse/index.d.ts +0 -45
  114. package/parse/index.js +0 -592
  115. package/parse/json.d.ts +0 -30
  116. package/parse/json.js +0 -94
  117. package/parse/normalize.d.ts +0 -3
  118. package/parse/validate.d.ts +0 -43
@@ -0,0 +1,4 @@
1
+
2
+ > @terrazzo/parser@0.2.1 build /home/runner/work/terrazzo/terrazzo/packages/parser
3
+ > tsc -p tsconfig.build.json
4
+
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @terrazzo/parser
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#358](https://github.com/terrazzoapp/terrazzo/pull/358) [`6b3c543`](https://github.com/terrazzoapp/terrazzo/commit/6b3c543a3356c582522f6e2d9b2948a0634a66df) Thanks [@christoph-fricke](https://github.com/christoph-fricke)! - Fix npm error when invoking the Terrazzo CLI through npm
8
+
9
+ ## 0.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [#353](https://github.com/terrazzoapp/terrazzo/pull/353) [`80e04c3`](https://github.com/terrazzoapp/terrazzo/commit/80e04c36a354234e04153a8332ebddd5360247aa) Thanks [@drwpow](https://github.com/drwpow)! - Add lint API
14
+
15
+ ### Patch Changes
16
+
17
+ - [#353](https://github.com/terrazzoapp/terrazzo/pull/353) [`80e04c3`](https://github.com/terrazzoapp/terrazzo/commit/80e04c36a354234e04153a8332ebddd5360247aa) Thanks [@drwpow](https://github.com/drwpow)! - Add support for $deprecated tokens
18
+
19
+ - [#353](https://github.com/terrazzoapp/terrazzo/pull/353) [`80e04c3`](https://github.com/terrazzoapp/terrazzo/commit/80e04c36a354234e04153a8332ebddd5360247aa) Thanks [@drwpow](https://github.com/drwpow)! - Fix bug in alias resolution
20
+
21
+ - [#353](https://github.com/terrazzoapp/terrazzo/pull/353) [`80e04c3`](https://github.com/terrazzoapp/terrazzo/commit/80e04c36a354234e04153a8332ebddd5360247aa) Thanks [@drwpow](https://github.com/drwpow)! - Fix type error with parser output
22
+
23
+ - Updated dependencies [[`80e04c3`](https://github.com/terrazzoapp/terrazzo/commit/80e04c36a354234e04153a8332ebddd5360247aa), [`80e04c3`](https://github.com/terrazzoapp/terrazzo/commit/80e04c36a354234e04153a8332ebddd5360247aa), [`80e04c3`](https://github.com/terrazzoapp/terrazzo/commit/80e04c36a354234e04153a8332ebddd5360247aa)]:
24
+ - @terrazzo/token-tools@0.2.0
25
+
3
26
  ## 0.1.3
4
27
 
5
28
  ### Patch Changes
package/CONTRIBUTING.md CHANGED
@@ -11,15 +11,3 @@ This document contains developer notes and context for @terrazzo/parser. For gen
11
11
  ## What this package DOES NOT do
12
12
 
13
13
  - Write files to disk (that’s a job for Node.js; this can be run in a browser)
14
-
15
- ## Manual JS and DTS
16
-
17
- This package is unique in its manual handling of `.js` and `.d.ts` files (TypeScript definitions). The expected norm is to write `.ts`, and have `.js` and `.d.ts` be generated automatically from source. But in this project, we write `.js` by hand because this specific module has several unique concerns:
18
-
19
- 1. **It’s dealing with external (possibly invalid) code.** Now, you’d think that `.ts` would be better at handling this, but the reality when dealing with user-submitted code is if you type it too strongly, TS lulls you into a false sense of security and misses necessary assertions. If you type it weakly, then TS requires _too many_ assertions and you end up with boilerplate and noise. Or if you don’t type it at all, then TS doesn’t really provide any value in the first place, and you might as well skip it.
20
-
21
- 2. **It’s dealing with ASTs.** We’re parsing JSON ASTs using Momoa, and building ad hoc structures on-the-fly. ASTs usually trip TS up because the discrimination isn’t clear (e.g. if `.type == 'foo'`, then `[property]` exists). Most ASTs don’t have perfect types out-of-the-box, and attempting to re-type an AST yourself is overkill. Further, to the previous point, we may be dealing with invalid code, and the AST may not always be in predictable shapes! When faced with these problems, TS at best requires extra boilerplate; at worst guides you into incorrect decisions.
22
-
23
- Given both of these, you usually end up with so many `// @ts-ignore`s or `as any`s that TS doesn’t provide benefit.
24
-
25
- But this package is unique! Look in any other package in this monorepo, and you’ll see it’s fully written in `.ts` source files. Different concerns require different approaches.
@@ -0,0 +1,19 @@
1
+ import type { DocumentNode } from '@humanwhocodes/momoa';
2
+ import { type TokenNormalized } from '@terrazzo/token-tools';
3
+ import Logger from '../logger.js';
4
+ import type { BuildRunnerResult, ConfigInit } from '../types.js';
5
+ export interface BuildRunnerOptions {
6
+ sources: {
7
+ filename?: URL;
8
+ src: string;
9
+ document: DocumentNode;
10
+ }[];
11
+ config: ConfigInit;
12
+ logger?: Logger;
13
+ }
14
+ export declare const SINGLE_VALUE = "SINGLE_VALUE";
15
+ export declare const MULTI_VALUE = "MULTI_VALUE";
16
+ /**
17
+ * Run build stage
18
+ */
19
+ export default function build(tokens: Record<string, TokenNormalized>, { sources, logger, config }: BuildRunnerOptions): Promise<BuildRunnerResult>;
@@ -0,0 +1,165 @@
1
+ import { isTokenMatch } from '@terrazzo/token-tools';
2
+ import wcmatch from 'wildcard-match';
3
+ import Logger from '../logger.js';
4
+ export const SINGLE_VALUE = 'SINGLE_VALUE';
5
+ export const MULTI_VALUE = 'MULTI_VALUE';
6
+ /** Validate plugin setTransform() calls for immediate feedback */
7
+ function validateTransformParams({ params, logger, pluginName, }) {
8
+ const baseEntry = { group: 'plugin', label: pluginName, message: '' };
9
+ // validate value is valid for SINGLE_VALUE or MULTI_VALUE
10
+ if (!params.value ||
11
+ (typeof params.value !== 'string' && typeof params.value !== 'object') ||
12
+ Array.isArray(params.value)) {
13
+ logger.error({
14
+ ...baseEntry,
15
+ message: `setTransform() value expected string or object of strings, received ${Array.isArray(params.value) ? 'Array' : typeof params.value}`,
16
+ });
17
+ }
18
+ if (typeof params.value === 'object' && Object.values(params.value).some((v) => typeof v !== 'string')) {
19
+ logger.error({
20
+ ...baseEntry,
21
+ message: 'setTransform() value expected object of strings, received some non-string values',
22
+ });
23
+ }
24
+ }
25
+ /**
26
+ * Run build stage
27
+ */
28
+ export default async function build(tokens, { sources, logger = new Logger(), config }) {
29
+ const formats = {};
30
+ const result = { outputFiles: [] };
31
+ function getTransforms(params) {
32
+ return (formats[params.format] ?? []).filter((token) => {
33
+ if (params.$type) {
34
+ if (typeof params.$type === 'string' && token.token.$type !== params.$type) {
35
+ return false;
36
+ }
37
+ else if (Array.isArray(params.$type) && !params.$type.some(($type) => token.token.$type === $type)) {
38
+ return false;
39
+ }
40
+ }
41
+ if (params.id &&
42
+ params.id !== '*' &&
43
+ !isTokenMatch(token.token.id, Array.isArray(params.id) ? params.id : [params.id])) {
44
+ return false;
45
+ }
46
+ if (params.mode && !wcmatch(params.mode)(token.mode)) {
47
+ return false;
48
+ }
49
+ return true;
50
+ });
51
+ }
52
+ // transform()
53
+ let transformsLocked = false; // prevent plugins from transforming after stage has ended
54
+ const startTransform = performance.now();
55
+ logger.debug({ group: 'parser', label: 'transform', message: 'Start transform' });
56
+ for (const plugin of config.plugins) {
57
+ if (typeof plugin.transform === 'function') {
58
+ await plugin.transform({
59
+ tokens,
60
+ sources,
61
+ getTransforms,
62
+ setTransform(id, params) {
63
+ if (transformsLocked) {
64
+ logger.warn({
65
+ message: 'Attempted to call setTransform() after transform step has completed.',
66
+ group: 'plugin',
67
+ label: plugin.name,
68
+ });
69
+ return;
70
+ }
71
+ const token = tokens[id];
72
+ // allow `undefined` values, but remove them here
73
+ const cleanValue = typeof params.value === 'string' ? params.value : { ...params.value };
74
+ if (typeof cleanValue === 'object') {
75
+ for (const k of Object.keys(cleanValue)) {
76
+ if (Object.hasOwn(cleanValue, k)) {
77
+ if (cleanValue[k] === undefined) {
78
+ delete cleanValue[k];
79
+ }
80
+ }
81
+ }
82
+ }
83
+ validateTransformParams({
84
+ logger,
85
+ params: { ...params, value: cleanValue },
86
+ pluginName: plugin.name,
87
+ });
88
+ // upsert
89
+ if (!formats[params.format]) {
90
+ formats[params.format] = [];
91
+ }
92
+ const foundTokenI = formats[params.format].findIndex((t) => id === t.id && params.localID === t.localID && (!params.mode || params.mode === t.mode));
93
+ if (foundTokenI === -1) {
94
+ formats[params.format].push({
95
+ ...params,
96
+ id,
97
+ value: cleanValue,
98
+ type: typeof cleanValue === 'string' ? SINGLE_VALUE : MULTI_VALUE,
99
+ mode: params.mode || '.',
100
+ token: structuredClone(token),
101
+ });
102
+ }
103
+ else {
104
+ formats[params.format][foundTokenI].value = cleanValue;
105
+ formats[params.format][foundTokenI].type = typeof cleanValue === 'string' ? SINGLE_VALUE : MULTI_VALUE;
106
+ }
107
+ },
108
+ });
109
+ }
110
+ }
111
+ transformsLocked = true;
112
+ logger.debug({
113
+ group: 'parser',
114
+ label: 'transform',
115
+ message: 'Finish transform',
116
+ timing: performance.now() - startTransform,
117
+ });
118
+ // build()
119
+ const startBuild = performance.now();
120
+ logger.debug({ group: 'parser', label: 'build', message: 'Start build' });
121
+ for (const plugin of config.plugins) {
122
+ if (typeof plugin.build === 'function') {
123
+ const pluginBuildStart = performance.now();
124
+ await plugin.build({
125
+ tokens,
126
+ sources,
127
+ getTransforms,
128
+ outputFile(filename, contents) {
129
+ const resolved = new URL(filename, config.outDir);
130
+ if (result.outputFiles.some((f) => new URL(f.filename, config.outDir).href === resolved.href)) {
131
+ logger.error({ message: `Can’t overwrite file "${filename}"`, label: plugin.name });
132
+ }
133
+ result.outputFiles.push({
134
+ filename,
135
+ contents,
136
+ plugin: plugin.name,
137
+ time: performance.now() - pluginBuildStart,
138
+ });
139
+ },
140
+ });
141
+ }
142
+ }
143
+ logger.debug({
144
+ group: 'parser',
145
+ label: 'build',
146
+ message: 'Finish build',
147
+ timing: performance.now() - startBuild,
148
+ });
149
+ // buildEnd()
150
+ const startBuildEnd = performance.now();
151
+ logger.debug({ group: 'parser', label: 'build', message: 'Start buildEnd' });
152
+ for (const plugin of config.plugins) {
153
+ if (typeof plugin.buildEnd === 'function') {
154
+ await plugin.buildEnd({ outputFiles: structuredClone(result.outputFiles) });
155
+ }
156
+ }
157
+ logger.debug({
158
+ group: 'parser',
159
+ label: 'build',
160
+ message: 'Finish buildEnd',
161
+ timing: performance.now() - startBuildEnd,
162
+ });
163
+ return result;
164
+ }
165
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/build/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Config, ConfigInit, ConfigOptions } from './types.js';
2
+ /**
3
+ * Validate and normalize a config
4
+ */
5
+ export default function defineConfig(rawConfig: Config, { logger, cwd }?: ConfigOptions): ConfigInit;
6
+ /** Merge configs */
7
+ export declare function mergeConfigs(a: Config, b: Config): Config;
package/dist/config.js ADDED
@@ -0,0 +1,269 @@
1
+ import { merge } from 'merge-anything';
2
+ import coreLintPlugin from './lint/plugin-core/index.js';
3
+ import Logger from './logger.js';
4
+ const TRAILING_SLASH_RE = /\/*$/;
5
+ /**
6
+ * Validate and normalize a config
7
+ */
8
+ export default function defineConfig(rawConfig, { logger = new Logger(), cwd } = {}) {
9
+ const configStart = performance.now();
10
+ if (!cwd) {
11
+ logger.error({ label: 'core', message: 'defineConfig() missing `cwd` for JS API' });
12
+ }
13
+ logger.debug({ group: 'parser', label: 'config', message: 'Start config validation' });
14
+ const config = merge({}, rawConfig);
15
+ // 1. normalize and init
16
+ normalizeTokens({ rawConfig, config, logger, cwd });
17
+ normalizeOutDir({ config, cwd, logger });
18
+ normalizePlugins({ config, logger });
19
+ normalizeLint({ config, logger });
20
+ normalizeIgnore({ config, logger });
21
+ // 2. Start build by calling config()
22
+ for (const plugin of config.plugins) {
23
+ plugin.config?.({ ...config });
24
+ }
25
+ // 3. finish
26
+ logger.debug({
27
+ group: 'parser',
28
+ label: 'config',
29
+ message: 'Finish config validation',
30
+ timing: performance.now() - configStart,
31
+ });
32
+ return config;
33
+ }
34
+ /** Normalize config.tokens */
35
+ function normalizeTokens({ rawConfig, config, logger, cwd, }) {
36
+ if (rawConfig.tokens === undefined) {
37
+ config.tokens = [
38
+ // @ts-ignore we’ll normalize in next step
39
+ './tokens.json',
40
+ ];
41
+ }
42
+ else if (typeof rawConfig.tokens === 'string') {
43
+ config.tokens = [
44
+ // @ts-ignore we’ll normalize in next step
45
+ rawConfig.tokens,
46
+ ];
47
+ }
48
+ else if (Array.isArray(rawConfig.tokens)) {
49
+ config.tokens = [];
50
+ for (const file of rawConfig.tokens) {
51
+ if (typeof file === 'string' || file instanceof URL) {
52
+ config.tokens.push(
53
+ // @ts-ignore we’ll normalize in next step
54
+ file);
55
+ }
56
+ else {
57
+ logger.error({
58
+ label: '[config] tokens',
59
+ message: `Expected array of strings, encountered ${JSON.stringify(file)}`,
60
+ });
61
+ }
62
+ }
63
+ }
64
+ else {
65
+ logger.error({
66
+ label: '[config] tokens',
67
+ message: `Expected string or array of strings, received ${typeof rawConfig.tokens}`,
68
+ });
69
+ }
70
+ for (let i = 0; i < config.tokens.length; i++) {
71
+ const filepath = config.tokens[i];
72
+ if (filepath instanceof URL) {
73
+ continue; // skip if already resolved
74
+ }
75
+ try {
76
+ config.tokens[i] = new URL(filepath, cwd);
77
+ }
78
+ catch (err) {
79
+ logger.error({ label: '[config] tokens', message: `Invalid URL ${filepath}` });
80
+ }
81
+ }
82
+ }
83
+ /** Normalize config.outDir */
84
+ function normalizeOutDir({ config, cwd, logger }) {
85
+ if (config.outDir instanceof URL) {
86
+ // noop
87
+ }
88
+ else if (typeof config.outDir === 'undefined') {
89
+ config.outDir = new URL('./tokens/', cwd);
90
+ }
91
+ else if (typeof config.outDir !== 'string') {
92
+ logger.error({ label: '[config] outDir', message: `Expected string, received ${JSON.stringify(config.outDir)}` });
93
+ }
94
+ else {
95
+ config.outDir = new URL(config.outDir, cwd);
96
+ // always add trailing slash so URL treats it as a directory.
97
+ // do AFTER it has been normalized to POSIX paths with `href` (don’t use Node internals here! This may run in the browser)
98
+ config.outDir = new URL(config.outDir.href.replace(TRAILING_SLASH_RE, '/'));
99
+ }
100
+ }
101
+ /** Normalize config.plugins */
102
+ function normalizePlugins({ config, logger }) {
103
+ if (typeof config.plugins === 'undefined') {
104
+ config.plugins = [];
105
+ }
106
+ if (!Array.isArray(config.plugins)) {
107
+ logger.error({
108
+ label: '[config] plugins',
109
+ message: `Expected array of plugins, received ${JSON.stringify(config.plugins)}`,
110
+ });
111
+ }
112
+ config.plugins.push(coreLintPlugin());
113
+ for (let n = 0; n < config.plugins.length; n++) {
114
+ const plugin = config.plugins[n];
115
+ if (typeof plugin !== 'object') {
116
+ logger.error({ label: `plugin[${n}]`, message: `Expected output plugin, received ${JSON.stringify(plugin)}` });
117
+ }
118
+ else if (!plugin.name) {
119
+ logger.error({ label: `plugin[${n}]`, message: `Missing "name"` });
120
+ }
121
+ }
122
+ // order plugins with "enforce"
123
+ config.plugins.sort((a, b) => {
124
+ if (a.enforce === 'pre' && b.enforce !== 'pre') {
125
+ return -1;
126
+ }
127
+ else if (a.enforce === 'post' && b.enforce !== 'post') {
128
+ return 1;
129
+ }
130
+ return 0;
131
+ });
132
+ }
133
+ function normalizeLint({ config, logger }) {
134
+ if (config.lint !== undefined) {
135
+ if (config.lint === null || typeof config.lint !== 'object' || Array.isArray(config.lint)) {
136
+ logger.error({ label: '[config] lint', message: 'Must be an object' });
137
+ }
138
+ if (!config.lint.build) {
139
+ config.lint.build = { enabled: true };
140
+ }
141
+ if (config.lint.build.enabled !== undefined) {
142
+ if (typeof config.lint.build.enabled !== 'boolean') {
143
+ logger.error({
144
+ label: '[config] lint › build › enabled',
145
+ message: `Expected boolean, received ${JSON.stringify(config.lint.build)}`,
146
+ });
147
+ }
148
+ }
149
+ else {
150
+ config.lint.build.enabled = true;
151
+ }
152
+ if (config.lint.rules === undefined) {
153
+ config.lint.rules = {};
154
+ }
155
+ else {
156
+ if (config.lint.rules === null || typeof config.lint.rules !== 'object' || Array.isArray(config.lint.rules)) {
157
+ logger.error({
158
+ label: '[config] lint › rules',
159
+ message: `Expected object, received ${JSON.stringify(config.lint.rules)}`,
160
+ });
161
+ return;
162
+ }
163
+ const allRules = new Map();
164
+ for (const plugin of config.plugins) {
165
+ if (typeof plugin.lint !== 'function') {
166
+ continue;
167
+ }
168
+ const pluginRules = plugin.lint();
169
+ if (!pluginRules || Array.isArray(pluginRules) || typeof pluginRules !== 'object') {
170
+ logger.error({
171
+ label: `[config] plugin › ${plugin.name}`,
172
+ message: `Expected object for lint() received ${JSON.stringify(pluginRules)}`,
173
+ });
174
+ continue;
175
+ }
176
+ for (const rule of Object.keys(pluginRules)) {
177
+ // Note: sometimes plugins will be loaded multiple times, in which case it’s expected
178
+ // they’re register rules again for lint(). Only throw an error if plugin A and plugin B’s
179
+ // rules conflict.
180
+ if (allRules.get(rule) && allRules.get(rule) !== plugin.name) {
181
+ logger.error({
182
+ label: `[config] plugin › ${plugin.name}`,
183
+ message: `Duplicate rule ${rule} already registered by plugin ${allRules.get(rule)}`,
184
+ });
185
+ }
186
+ allRules.set(rule, plugin.name);
187
+ }
188
+ }
189
+ for (const id of Object.keys(config.lint.rules)) {
190
+ if (!allRules.has(id)) {
191
+ logger.error({
192
+ label: `[config] lint › rule › ${id}`,
193
+ message: 'Unknown rule. Is the plugin installed?',
194
+ });
195
+ }
196
+ const value = config.lint.rules[id];
197
+ let severity = 'off';
198
+ let options;
199
+ if (typeof value === 'number' || typeof value === 'string') {
200
+ severity = value;
201
+ }
202
+ else if (Array.isArray(value)) {
203
+ severity = value[0];
204
+ options = value[1];
205
+ }
206
+ else if (value !== undefined) {
207
+ logger.error({
208
+ label: `[config] lint › rule › ${id}`,
209
+ message: `Invalid eyntax. Expected \`string | number | Array\`, received ${JSON.stringify(value)}}`,
210
+ });
211
+ }
212
+ config.lint.rules[id] = [severity, options];
213
+ if (typeof severity === 'number') {
214
+ if (severity !== 0 && severity !== 1 && severity !== 2) {
215
+ logger.error({
216
+ label: `[config] lint › rule › ${id}`,
217
+ message: `Invalid number ${severity}. Specify 0 (off), 1 (warn), or 2 (error).`,
218
+ });
219
+ }
220
+ config.lint.rules[id][0] = ['off', 'warn', 'error'][severity];
221
+ }
222
+ else if (typeof severity === 'string') {
223
+ if (severity !== 'off' && severity !== 'warn' && severity !== 'error') {
224
+ logger.error({
225
+ label: `[config] lint › rule › ${id}`,
226
+ message: `Invalid string ${JSON.stringify(severity)}. Specify "off", "warn", or "error".`,
227
+ });
228
+ }
229
+ }
230
+ else if (value !== null) {
231
+ logger.error({
232
+ label: `[config] lint › rule › ${id}`,
233
+ message: `Expected string or number, received ${JSON.stringify(value)}`,
234
+ });
235
+ }
236
+ }
237
+ }
238
+ }
239
+ else {
240
+ config.lint = {
241
+ build: { enabled: true },
242
+ rules: {},
243
+ };
244
+ }
245
+ }
246
+ function normalizeIgnore({ config, logger }) {
247
+ if (!config.ignore) {
248
+ config.ignore = {};
249
+ }
250
+ config.ignore.tokens ??= [];
251
+ config.ignore.deprecated ??= false;
252
+ if (!Array.isArray(config.ignore.tokens) || config.ignore.tokens.some((x) => typeof x !== 'string')) {
253
+ logger.error({
254
+ label: '[config] ignore › tokens',
255
+ message: `Expected array of strings, received ${JSON.stringify(config.ignore.tokens)}`,
256
+ });
257
+ }
258
+ if (typeof config.ignore.deprecated !== 'boolean') {
259
+ logger.error({
260
+ label: '[config] ignore › deprecated',
261
+ message: `Expected boolean, received ${JSON.stringify(config.ignore.deprecated)}`,
262
+ });
263
+ }
264
+ }
265
+ /** Merge configs */
266
+ export function mergeConfigs(a, b) {
267
+ return merge(a, b);
268
+ }
269
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,12 @@
1
1
  export { default as build } from './build/index.js';
2
2
  export * from './build/index.js';
3
-
4
3
  export { default as defineConfig } from './config.js';
5
4
  export * from './config.js';
6
-
7
5
  export { default as lintRunner } from './lint/index.js';
8
6
  export * from './lint/index.js';
9
-
10
7
  export { default as Logger } from './logger.js';
11
8
  export * from './logger.js';
12
-
13
9
  export { default as parse } from './parse/index.js';
14
10
  export * from './parse/index.js';
15
-
11
+ export * from './types.js';
16
12
  export * from '@terrazzo/token-tools/dist/types.js';
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { default as build } from './build/index.js';
2
+ export * from './build/index.js';
3
+ export { default as defineConfig } from './config.js';
4
+ export * from './config.js';
5
+ export { default as lintRunner } from './lint/index.js';
6
+ export * from './lint/index.js';
7
+ export { default as Logger } from './logger.js';
8
+ export * from './logger.js';
9
+ export { default as parse } from './parse/index.js';
10
+ export * from './parse/index.js';
11
+ export * from './types.js';
12
+ export * from '@terrazzo/token-tools/dist/types.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,cAAc,kBAAkB,CAAC;AAEjC,cAAc,YAAY,CAAC;AAE3B,cAAc,qCAAqC,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface Location {
2
+ line: number;
3
+ column: number;
4
+ }
5
+ export interface NodeLocation {
6
+ end?: Location;
7
+ start: Location;
8
+ }
9
+ export interface Options {
10
+ /** Syntax highlight the code as JavaScript for terminals. default: false */
11
+ highlightCode?: boolean;
12
+ /** The number of lines to show above the error. default: 2 */
13
+ linesAbove?: number;
14
+ /** The number of lines to show below the error. default: 3 */
15
+ linesBelow?: number;
16
+ /**
17
+ * Forcibly syntax highlight the code as JavaScript (for non-terminals);
18
+ * overrides highlightCode.
19
+ * default: false
20
+ */
21
+ forceColor?: boolean;
22
+ /**
23
+ * Pass in a string to be displayed inline (if possible) next to the
24
+ * highlighted location in the code. If it can't be positioned inline,
25
+ * it will be placed above the code frame.
26
+ * default: nothing
27
+ */
28
+ message?: string;
29
+ }
30
+ export declare function codeFrameColumns(rawLines: string, loc: NodeLocation, opts?: Options): string;