@terrazzo/parser 2.0.0-beta.3 → 2.0.0-beta.4
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/CHANGELOG.md +8 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -47
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## 2.0.0
|
|
4
4
|
|
|
5
|
+
The 2.0.0 release is full of new features:
|
|
6
|
+
|
|
7
|
+
- Full support for the DTCG v2025.10 spec, including resolvers
|
|
8
|
+
- New and improved [native Figma import](https://terrazzo.app/docs/guides/import-from-figma)
|
|
9
|
+
- `@terrazzo/plugin-js` was reimagined as a resolver API to build your own token machine (server-side)
|
|
10
|
+
- `@terrazzo/plugin-css-in-js` was added as the missing solution for type-safe JS to use in any CSS-in-JS library
|
|
11
|
+
- And of course dozens of bugfixes and quality of life improvements
|
|
12
|
+
|
|
5
13
|
### Minor Changes
|
|
6
14
|
|
|
7
15
|
- [#530](https://github.com/terrazzoapp/terrazzo/pull/530) [`370ed7b`](https://github.com/terrazzoapp/terrazzo/commit/370ed7b0f578a64824124145d7f4936536b37bb3) Thanks [@drwpow](https://github.com/drwpow)! - ⚠️ Breaking change; DTCG 2nd Editors draft format will throw errors by default. This means converting all colors and dimensions to the new object format.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as momoa from "@humanwhocodes/momoa";
|
|
2
1
|
import { AliasToken, AliasValue, BooleanToken, BooleanTokenNormalized, BooleanValue, BorderToken, BorderTokenNormalized, BorderValue, BorderValueNormalized, ColorSpace, ColorToken, ColorTokenNormalized, ColorValue, ColorValueNormalized, CubicBezierToken, CubicBezierTokenNormalized, CubicBezierValue, CustomTransformOptions, DimensionToken, DimensionTokenNormalized, DimensionValue, DurationToken, DurationTokenNormalized, DurationValue, FontFamilyToken, FontFamilyTokenNormalized, FontFamilyValue, FontFamilyValueNormalized, FontWeightToken, FontWeightTokenNormalized, FontWeightValue, FontWeightValueNormalized, GradientStop, GradientStopNormalized, GradientToken, GradientTokenNormalized, GradientValue, GradientValueNormalized, Group, Group as Group$1, GroupCore, GroupOrToken, LinkToken, LinkTokenNormalized, LinkValue, ModeMap, NumberToken, NumberTokenNormalized, NumberValue, ShadowToken, ShadowTokenNormalized, ShadowValue, ShadowValueNormalized, StringToken, StringTokenNormalized, StringValue, StrokeStyleToken, StrokeStyleTokenNormalized, StrokeStyleValue, StrokeStyleValueExpanded, Token, TokenCore, TokenMode, TokenNormalized, TokenNormalized as TokenNormalized$1, TokenNormalizedCore, TokenNormalizedSet, TokenNormalizedSet as TokenNormalizedSet$1, TokenTransformed, TokenTransformed as TokenTransformed$1, TokenTransformedBase, TokenTransformedBase as TokenTransformedBase$1, TokensSet, TransitionToken, TransitionTokenNormalized, TransitionValue, TransitionValueNormalized, TypographyToken, TypographyTokenNormalized, TypographyValue, TypographyValueNormalized } from "@terrazzo/token-tools";
|
|
2
|
+
import * as momoa from "@humanwhocodes/momoa";
|
|
3
3
|
import { InputSource, InputSourceWithDocument } from "@terrazzo/json-schema-tools";
|
|
4
4
|
import ytm from "yaml-to-momoa";
|
|
5
5
|
|
|
@@ -7,7 +7,7 @@ import ytm from "yaml-to-momoa";
|
|
|
7
7
|
declare const LOG_ORDER: readonly ["error", "warn", "info", "debug"];
|
|
8
8
|
type LogSeverity = 'error' | 'warn' | 'info' | 'debug';
|
|
9
9
|
type LogLevel = LogSeverity | 'silent';
|
|
10
|
-
type LogGroup = 'config' | '
|
|
10
|
+
type LogGroup = 'config' | 'import' | 'lint' | 'parser' | 'plugin' | 'resolver' | 'server';
|
|
11
11
|
interface LogEntry {
|
|
12
12
|
/** Originator of log message */
|
|
13
13
|
group: LogGroup;
|
|
@@ -383,8 +383,8 @@ interface ResolverSourceNormalized {
|
|
|
383
383
|
name: string | undefined;
|
|
384
384
|
version: '2025.10';
|
|
385
385
|
description: string | undefined;
|
|
386
|
-
sets: Record<string,
|
|
387
|
-
modifiers: Record<string,
|
|
386
|
+
sets: Record<string, ResolverSetNormalized> | undefined;
|
|
387
|
+
modifiers: Record<string, ResolverModifierNormalized> | undefined;
|
|
388
388
|
/**
|
|
389
389
|
* Array of all sets and modifiers that have been converted to inline,
|
|
390
390
|
* regardless of original declaration. In a normalized resolver, only a single
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/logger.ts","../src/types.ts","../src/build/index.ts","../src/config.ts","../src/lint/plugin-core/index.ts","../src/lint/index.ts","../src/parse/index.ts","../src/resolver/load.ts","../src/resolver/normalize.ts","../src/resolver/validate.ts"],"mappings":";;;;;;cAKa,SAAA;AAAA,KACD,WAAA;AAAA,KACA,QAAA,GAAW,WAAA;AAAA,KACX,QAAA;AAAA,UAEK,QAAA;EALJ;EAOX,KAAA,EAAO,QAAA;;EAEP,OAAA;EATkE;EAWlE,KAAA;EAVqB;EAYrB,QAAA,GAAW,GAAA;EAZU;;AACvB;;EAgBE,eAAA;EAhBqB;EAkBrB,IAAA,GAAO,KAAA,CAAM,OAAA;EAjBH;EAmBV,GAAA;;EAEA,MAAA;AAAA;AAAA,UAGe,UAAA;EACf,KAAA,EAAO,QAAA;;EAEP,OAAA;EAjBW;EAmBX,KAAA;EAZoB;EAcpB,SAAA;IAAc,GAAA;IAAa,IAAA;IAAc,MAAA;EAAA;EArBzC;EAuBA,MAAA;AAAA;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/logger.ts","../src/types.ts","../src/build/index.ts","../src/config.ts","../src/lint/plugin-core/index.ts","../src/lint/index.ts","../src/parse/index.ts","../src/resolver/load.ts","../src/resolver/normalize.ts","../src/resolver/validate.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { BORDER_REQUIRED_PROPERTIES, COLOR_SPACE, FONT_WEIGHTS, GRADIENT_REQUIRED_STOP_PROPERTIES, SHADOW_REQUIRED_PROPERTIES, STROKE_STYLE_LINE_CAP_VALUES, STROKE_STYLE_OBJECT_REQUIRED_PROPERTIES, STROKE_STYLE_STRING_VALUES, TRANSITION_REQUIRED_PROPERTIES, getTokenMatcher, isAlias, parseAlias, parseColor, pluralize, tokenToColor } from "@terrazzo/token-tools";
|
|
1
2
|
import wcmatch from "wildcard-match";
|
|
2
3
|
import * as momoa from "@humanwhocodes/momoa";
|
|
3
4
|
import pc from "picocolors";
|
|
4
5
|
import { merge } from "merge-anything";
|
|
5
|
-
import { BORDER_REQUIRED_PROPERTIES, COLOR_SPACE, FONT_WEIGHTS, GRADIENT_REQUIRED_STOP_PROPERTIES, SHADOW_REQUIRED_PROPERTIES, STROKE_STYLE_LINE_CAP_VALUES, STROKE_STYLE_OBJECT_REQUIRED_PROPERTIES, STROKE_STYLE_STRING_VALUES, TRANSITION_REQUIRED_PROPERTIES, isAlias, parseAlias, parseColor, pluralize, tokenToColor } from "@terrazzo/token-tools";
|
|
6
6
|
import { contrastWCAG21, inGamut } from "colorjs.io/fn";
|
|
7
7
|
import { camelCase, kebabCase, pascalCase, snakeCase } from "scule";
|
|
8
8
|
import { bundle, encodeFragment, findNode, getObjMember, getObjMembers, isPure$ref, maybeRawJSON, mergeObjects, parseRef, replaceNode, traverse } from "@terrazzo/json-schema-tools";
|
|
@@ -96,9 +96,20 @@ const LOG_ORDER = [
|
|
|
96
96
|
"info",
|
|
97
97
|
"debug"
|
|
98
98
|
];
|
|
99
|
+
const GROUP_COLOR = {
|
|
100
|
+
config: pc.cyan,
|
|
101
|
+
import: pc.green,
|
|
102
|
+
lint: pc.yellowBright,
|
|
103
|
+
parser: pc.magenta,
|
|
104
|
+
plugin: pc.greenBright,
|
|
105
|
+
resolver: pc.magentaBright,
|
|
106
|
+
server: pc.gray
|
|
107
|
+
};
|
|
99
108
|
const MESSAGE_COLOR = {
|
|
100
109
|
error: pc.red,
|
|
101
|
-
warn: pc.yellow
|
|
110
|
+
warn: pc.yellow,
|
|
111
|
+
info: (msg) => msg,
|
|
112
|
+
debug: pc.gray
|
|
102
113
|
};
|
|
103
114
|
const timeFormatter = new Intl.DateTimeFormat("en-us", {
|
|
104
115
|
hour: "numeric",
|
|
@@ -113,9 +124,10 @@ const timeFormatter = new Intl.DateTimeFormat("en-us", {
|
|
|
113
124
|
* @return {string}
|
|
114
125
|
*/
|
|
115
126
|
function formatMessage(entry, severity) {
|
|
127
|
+
const groupColor = GROUP_COLOR[entry.group];
|
|
128
|
+
const messageColor = MESSAGE_COLOR[severity];
|
|
116
129
|
let message = entry.message;
|
|
117
|
-
message =
|
|
118
|
-
if (severity in MESSAGE_COLOR) message = MESSAGE_COLOR[severity](message);
|
|
130
|
+
message = `${groupColor(`${entry.group}${entry.label ? `:${entry.label}` : ""}:`)} ${messageColor(message)}`;
|
|
119
131
|
if (typeof entry.timing === "number") message = `${message} ${formatTiming(entry.timing)}`;
|
|
120
132
|
if (entry.node) {
|
|
121
133
|
const start = entry.node?.loc?.start ?? {
|
|
@@ -245,7 +257,7 @@ async function build(tokens, { resolver, sources, logger = new Logger(), config
|
|
|
245
257
|
});
|
|
246
258
|
return [];
|
|
247
259
|
}
|
|
248
|
-
const tokenMatcher = params.id && params.id !== "*" ?
|
|
260
|
+
const tokenMatcher = params.id && params.id !== "*" ? getTokenMatcher(params.id) : null;
|
|
249
261
|
const modeMatcher = params.mode ? wcmatch(params.mode) : null;
|
|
250
262
|
const permutationID = params.input ? resolver.getPermutationID(params.input) : JSON.stringify({ tzMode: "*" });
|
|
251
263
|
return (formats[params.format]?.[permutationID] ?? []).filter((token) => {
|
|
@@ -438,7 +450,7 @@ const rule$25 = {
|
|
|
438
450
|
defaultOptions: {},
|
|
439
451
|
create({ tokens, options, report }) {
|
|
440
452
|
if (!options.minSizePx && !options.minSizeRem) throw new Error("Must specify at least one of minSizePx or minSizeRem");
|
|
441
|
-
const shouldIgnore = options.ignore ?
|
|
453
|
+
const shouldIgnore = options.ignore ? getTokenMatcher(options.ignore) : null;
|
|
442
454
|
for (const t of Object.values(tokens)) {
|
|
443
455
|
if (shouldIgnore?.(t.id)) continue;
|
|
444
456
|
if (t.aliasOf) continue;
|
|
@@ -479,7 +491,7 @@ const rule$24 = {
|
|
|
479
491
|
defaultOptions: { colorSpace: "srgb" },
|
|
480
492
|
create({ tokens, options, report }) {
|
|
481
493
|
if (!options.colorSpace) return;
|
|
482
|
-
const shouldIgnore = options.ignore ?
|
|
494
|
+
const shouldIgnore = options.ignore ? getTokenMatcher(options.ignore) : null;
|
|
483
495
|
for (const t of Object.values(tokens)) {
|
|
484
496
|
if (shouldIgnore?.(t.id)) continue;
|
|
485
497
|
if (t.aliasOf) continue;
|
|
@@ -590,7 +602,7 @@ const rule$22 = {
|
|
|
590
602
|
},
|
|
591
603
|
defaultOptions: {},
|
|
592
604
|
create({ tokens, options, report }) {
|
|
593
|
-
const shouldIgnore = options.ignore ?
|
|
605
|
+
const shouldIgnore = options.ignore ? getTokenMatcher(options.ignore) : null;
|
|
594
606
|
for (const t of Object.values(tokens)) {
|
|
595
607
|
if (shouldIgnore?.(t.id)) continue;
|
|
596
608
|
if (!t.$description) report({
|
|
@@ -617,7 +629,7 @@ const rule$21 = {
|
|
|
617
629
|
defaultOptions: {},
|
|
618
630
|
create({ report, tokens, options }) {
|
|
619
631
|
const values = {};
|
|
620
|
-
const shouldIgnore = options.ignore ?
|
|
632
|
+
const shouldIgnore = options.ignore ? getTokenMatcher(options.ignore) : null;
|
|
621
633
|
for (const t of Object.values(tokens)) {
|
|
622
634
|
if (shouldIgnore?.(t.id)) continue;
|
|
623
635
|
if (!values[t.$type]) values[t.$type] = /* @__PURE__ */ new Set();
|
|
@@ -670,7 +682,7 @@ const rule$20 = {
|
|
|
670
682
|
create({ tokens, options, report }) {
|
|
671
683
|
if (!options?.gamut) return;
|
|
672
684
|
if (options.gamut !== "srgb" && options.gamut !== "p3" && options.gamut !== "rec2020") throw new Error(`Unknown gamut "${options.gamut}". Options are "srgb", "p3", or "rec2020"`);
|
|
673
|
-
const shouldIgnore = options.ignore ?
|
|
685
|
+
const shouldIgnore = options.ignore ? getTokenMatcher(options.ignore) : null;
|
|
674
686
|
for (const t of Object.values(tokens)) {
|
|
675
687
|
if (shouldIgnore?.(t.id)) continue;
|
|
676
688
|
if (t.aliasOf) continue;
|
|
@@ -749,7 +761,7 @@ const rule$19 = {
|
|
|
749
761
|
const { match, requiredTokens, requiredGroups } = options.matches[matchI];
|
|
750
762
|
if (!match.length) throw new Error(`Match ${matchI}: must declare \`match: […]\``);
|
|
751
763
|
if (!requiredTokens?.length && !requiredGroups?.length) throw new Error(`Match ${matchI}: must declare either \`requiredTokens: […]\` or \`requiredGroups: […]\``);
|
|
752
|
-
const matcher =
|
|
764
|
+
const matcher = getTokenMatcher(match);
|
|
753
765
|
const matchGroups = [];
|
|
754
766
|
const matchTokens = [];
|
|
755
767
|
let tokensMatched = false;
|
|
@@ -804,7 +816,7 @@ const rule$18 = {
|
|
|
804
816
|
const { match, modes } = options.matches[matchI];
|
|
805
817
|
if (!match.length) throw new Error(`Match ${matchI}: must declare \`match: […]\``);
|
|
806
818
|
if (!modes?.length) throw new Error(`Match ${matchI}: must declare \`modes: […]\``);
|
|
807
|
-
const matcher =
|
|
819
|
+
const matcher = getTokenMatcher(match);
|
|
808
820
|
let tokensMatched = false;
|
|
809
821
|
for (const t of Object.values(tokens)) {
|
|
810
822
|
if (!matcher(t.id)) continue;
|
|
@@ -865,7 +877,7 @@ const rule$16 = {
|
|
|
865
877
|
create({ tokens, options, report }) {
|
|
866
878
|
if (!options) return;
|
|
867
879
|
if (!options.properties.length) throw new Error(`"properties" can’t be empty`);
|
|
868
|
-
const shouldIgnore = options.ignore ?
|
|
880
|
+
const shouldIgnore = options.ignore ? getTokenMatcher(options.ignore) : null;
|
|
869
881
|
for (const t of Object.values(tokens)) {
|
|
870
882
|
if (shouldIgnore?.(t.id)) continue;
|
|
871
883
|
if (t.$type !== "typography") continue;
|
|
@@ -1376,7 +1388,7 @@ const rule$6 = {
|
|
|
1376
1388
|
"lineHeight"
|
|
1377
1389
|
] },
|
|
1378
1390
|
create({ tokens, options, report }) {
|
|
1379
|
-
const isIgnored = options.ignore ?
|
|
1391
|
+
const isIgnored = options.ignore ? getTokenMatcher(options.ignore) : () => false;
|
|
1380
1392
|
for (const t of Object.values(tokens)) {
|
|
1381
1393
|
if (t.aliasOf || !t.originalValue || t.$type !== "typography" || isIgnored(t.id)) continue;
|
|
1382
1394
|
validateTypography(t.originalValue.$value, {
|
|
@@ -2100,13 +2112,11 @@ function normalizeTokens({ rawConfig, config, logger, cwd }) {
|
|
|
2100
2112
|
for (const file of rawConfig.tokens) if (typeof file === "string" || file instanceof URL) config.tokens.push(file);
|
|
2101
2113
|
else logger.error({
|
|
2102
2114
|
group: "config",
|
|
2103
|
-
|
|
2104
|
-
message: `Expected array of strings, encountered ${JSON.stringify(file)}`
|
|
2115
|
+
message: `tokens: Expected array of strings, encountered ${JSON.stringify(file)}`
|
|
2105
2116
|
});
|
|
2106
2117
|
} else logger.error({
|
|
2107
2118
|
group: "config",
|
|
2108
|
-
|
|
2109
|
-
message: `Expected string or array of strings, received ${typeof rawConfig.tokens}`
|
|
2119
|
+
message: `tokens: Expected string or array of strings, received ${typeof rawConfig.tokens}`
|
|
2110
2120
|
});
|
|
2111
2121
|
for (let i = 0; i < config.tokens.length; i++) {
|
|
2112
2122
|
const filepath = config.tokens[i];
|
|
@@ -2128,8 +2138,7 @@ function normalizeOutDir({ config, cwd, logger }) {
|
|
|
2128
2138
|
if (config.outDir instanceof URL) {} else if (typeof config.outDir === "undefined") config.outDir = new URL("./tokens/", cwd);
|
|
2129
2139
|
else if (typeof config.outDir !== "string") logger.error({
|
|
2130
2140
|
group: "config",
|
|
2131
|
-
|
|
2132
|
-
message: `Expected string, received ${JSON.stringify(config.outDir)}`
|
|
2141
|
+
message: `outDir: Expected string, received ${JSON.stringify(config.outDir)}`
|
|
2133
2142
|
});
|
|
2134
2143
|
else {
|
|
2135
2144
|
config.outDir = new URL(config.outDir, cwd);
|
|
@@ -2141,16 +2150,14 @@ function normalizePlugins({ config, logger }) {
|
|
|
2141
2150
|
if (typeof config.plugins === "undefined") config.plugins = [];
|
|
2142
2151
|
if (!Array.isArray(config.plugins)) logger.error({
|
|
2143
2152
|
group: "config",
|
|
2144
|
-
|
|
2145
|
-
message: `Expected array of plugins, received ${JSON.stringify(config.plugins)}`
|
|
2153
|
+
message: `plugins: Expected array of plugins, received ${JSON.stringify(config.plugins)}`
|
|
2146
2154
|
});
|
|
2147
2155
|
config.plugins.push(coreLintPlugin());
|
|
2148
2156
|
for (let n = 0; n < config.plugins.length; n++) {
|
|
2149
2157
|
const plugin = config.plugins[n];
|
|
2150
2158
|
if (typeof plugin !== "object") logger.error({
|
|
2151
2159
|
group: "config",
|
|
2152
|
-
|
|
2153
|
-
message: `Expected output plugin, received ${JSON.stringify(plugin)}`
|
|
2160
|
+
message: `plugin#${n}: Expected output plugin, received ${JSON.stringify(plugin)}`
|
|
2154
2161
|
});
|
|
2155
2162
|
else if (!plugin.name) logger.error({
|
|
2156
2163
|
group: "config",
|
|
@@ -2175,8 +2182,7 @@ function normalizeLint({ config, logger }) {
|
|
|
2175
2182
|
if (config.lint.build.enabled !== void 0) {
|
|
2176
2183
|
if (typeof config.lint.build.enabled !== "boolean") logger.error({
|
|
2177
2184
|
group: "config",
|
|
2178
|
-
|
|
2179
|
-
message: `Expected boolean, received ${JSON.stringify(config.lint.build)}`
|
|
2185
|
+
message: `lint.build.enabled: Expected boolean, received ${JSON.stringify(config.lint.build)}`
|
|
2180
2186
|
});
|
|
2181
2187
|
} else config.lint.build.enabled = true;
|
|
2182
2188
|
if (config.lint.rules === void 0) config.lint.rules = { ...RECOMMENDED_CONFIG };
|
|
@@ -2184,8 +2190,7 @@ function normalizeLint({ config, logger }) {
|
|
|
2184
2190
|
if (config.lint.rules === null || typeof config.lint.rules !== "object" || Array.isArray(config.lint.rules)) {
|
|
2185
2191
|
logger.error({
|
|
2186
2192
|
group: "config",
|
|
2187
|
-
|
|
2188
|
-
message: `Expected object, received ${JSON.stringify(config.lint.rules)}`
|
|
2193
|
+
message: `lint.rules: Expected object, received ${JSON.stringify(config.lint.rules)}`
|
|
2189
2194
|
});
|
|
2190
2195
|
return;
|
|
2191
2196
|
}
|
|
@@ -2196,16 +2201,14 @@ function normalizeLint({ config, logger }) {
|
|
|
2196
2201
|
if (!pluginRules || Array.isArray(pluginRules) || typeof pluginRules !== "object") {
|
|
2197
2202
|
logger.error({
|
|
2198
2203
|
group: "config",
|
|
2199
|
-
|
|
2200
|
-
message: `Expected object for lint() received ${JSON.stringify(pluginRules)}`
|
|
2204
|
+
message: `${plugin.name}: Expected object for lint() received ${JSON.stringify(pluginRules)}`
|
|
2201
2205
|
});
|
|
2202
2206
|
continue;
|
|
2203
2207
|
}
|
|
2204
2208
|
for (const rule of Object.keys(pluginRules)) {
|
|
2205
2209
|
if (allRules.get(rule) && allRules.get(rule) !== plugin.name) logger.error({
|
|
2206
2210
|
group: "config",
|
|
2207
|
-
|
|
2208
|
-
message: `Duplicate rule ${rule} already registered by plugin ${allRules.get(rule)}`
|
|
2211
|
+
message: `${plugin.name}: Duplicate rule ${rule} already registered by plugin ${allRules.get(rule)}`
|
|
2209
2212
|
});
|
|
2210
2213
|
allRules.set(rule, plugin.name);
|
|
2211
2214
|
}
|
|
@@ -2213,8 +2216,7 @@ function normalizeLint({ config, logger }) {
|
|
|
2213
2216
|
for (const id of Object.keys(config.lint.rules)) {
|
|
2214
2217
|
if (!allRules.has(id)) logger.error({
|
|
2215
2218
|
group: "config",
|
|
2216
|
-
|
|
2217
|
-
message: "Unknown rule. Is the plugin installed?"
|
|
2219
|
+
message: `lint.rules.${id}: Unknown rule. Is the plugin installed?`
|
|
2218
2220
|
});
|
|
2219
2221
|
const value = config.lint.rules[id];
|
|
2220
2222
|
let severity = "off";
|
|
@@ -2225,15 +2227,13 @@ function normalizeLint({ config, logger }) {
|
|
|
2225
2227
|
options = value[1];
|
|
2226
2228
|
} else if (value !== void 0) logger.error({
|
|
2227
2229
|
group: "config",
|
|
2228
|
-
|
|
2229
|
-
message: `Invalid eyntax. Expected \`string | number | Array\`, received ${JSON.stringify(value)}}`
|
|
2230
|
+
message: `lint.rules.${id}: Invalid syntax. Expected \`string | number | Array\`, received ${JSON.stringify(value)}}`
|
|
2230
2231
|
});
|
|
2231
2232
|
config.lint.rules[id] = [severity, options];
|
|
2232
2233
|
if (typeof severity === "number") {
|
|
2233
2234
|
if (severity !== 0 && severity !== 1 && severity !== 2) logger.error({
|
|
2234
2235
|
group: "config",
|
|
2235
|
-
|
|
2236
|
-
message: `Invalid number ${severity}. Specify 0 (off), 1 (warn), or 2 (error).`
|
|
2236
|
+
message: `lint.rules.${id}: Invalid number ${severity}. Specify 0 (off), 1 (warn), or 2 (error).`
|
|
2237
2237
|
});
|
|
2238
2238
|
config.lint.rules[id][0] = [
|
|
2239
2239
|
"off",
|
|
@@ -2243,13 +2243,11 @@ function normalizeLint({ config, logger }) {
|
|
|
2243
2243
|
} else if (typeof severity === "string") {
|
|
2244
2244
|
if (severity !== "off" && severity !== "warn" && severity !== "error") logger.error({
|
|
2245
2245
|
group: "config",
|
|
2246
|
-
|
|
2247
|
-
message: `Invalid string ${JSON.stringify(severity)}. Specify "off", "warn", or "error".`
|
|
2246
|
+
message: `lint.rules.${id}: Invalid string ${JSON.stringify(severity)}. Specify "off", "warn", or "error".`
|
|
2248
2247
|
});
|
|
2249
2248
|
} else if (value !== null) logger.error({
|
|
2250
2249
|
group: "config",
|
|
2251
|
-
|
|
2252
|
-
message: `Expected string or number, received ${JSON.stringify(value)}`
|
|
2250
|
+
message: `lint.rules.${id}: Expected string or number, received ${JSON.stringify(value)}`
|
|
2253
2251
|
});
|
|
2254
2252
|
}
|
|
2255
2253
|
}
|
|
@@ -2264,13 +2262,11 @@ function normalizeIgnore({ config, logger }) {
|
|
|
2264
2262
|
config.ignore.deprecated ??= false;
|
|
2265
2263
|
if (!Array.isArray(config.ignore.tokens) || config.ignore.tokens.some((x) => typeof x !== "string")) logger.error({
|
|
2266
2264
|
group: "config",
|
|
2267
|
-
|
|
2268
|
-
message: `Expected array of strings, received ${JSON.stringify(config.ignore.tokens)}`
|
|
2265
|
+
message: `ignore.tokens: Expected array of strings, received ${JSON.stringify(config.ignore.tokens)}`
|
|
2269
2266
|
});
|
|
2270
2267
|
if (typeof config.ignore.deprecated !== "boolean") logger.error({
|
|
2271
2268
|
group: "config",
|
|
2272
|
-
|
|
2273
|
-
message: `Expected boolean, received ${JSON.stringify(config.ignore.deprecated)}`
|
|
2269
|
+
message: `ignore.deprecated: Expected boolean, received ${JSON.stringify(config.ignore.deprecated)}`
|
|
2274
2270
|
});
|
|
2275
2271
|
}
|
|
2276
2272
|
/** Merge configs */
|
|
@@ -2579,7 +2575,7 @@ function tokenFromNode(node, { groups, path, source, ignore }) {
|
|
|
2579
2575
|
}
|
|
2580
2576
|
} }
|
|
2581
2577
|
};
|
|
2582
|
-
if (ignore?.deprecated && token.$deprecated || ignore?.tokens &&
|
|
2578
|
+
if (ignore?.deprecated && token.$deprecated || ignore?.tokens && getTokenMatcher(ignore.tokens)(token.id)) return;
|
|
2583
2579
|
const $extensions = getObjMember(node, "$extensions");
|
|
2584
2580
|
if ($extensions) {
|
|
2585
2581
|
const modeNode = getObjMember($extensions, "mode");
|