boss-css 0.0.14 → 0.0.16
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/LICENSE +21 -0
- package/README.md +146 -1
- package/dist/ai/server.cjs +1 -0
- package/dist/ai/server.mjs +1 -0
- package/dist/ai/skills.cjs +3 -0
- package/dist/ai/skills.mjs +3 -0
- package/dist/cli/tasks/init.cjs +54 -30
- package/dist/cli/tasks/init.mjs +54 -30
- package/dist/cli/templates/init.cjs +5 -5
- package/dist/cli/templates/init.mjs +5 -5
- package/dist/devtools-app/index.mjs +320 -0
- package/dist/devtools-app/monaco/vs/_commonjsHelpers-CT9FvmAN.js +1 -0
- package/dist/devtools-app/monaco/vs/abap-D-t0cyap.js +1 -0
- package/dist/devtools-app/monaco/vs/apex-CcIm7xu6.js +1 -0
- package/dist/devtools-app/monaco/vs/assets/css.worker-HnVq6Ewq.js +93 -0
- package/dist/devtools-app/monaco/vs/assets/editor.worker-Be8ye1pW.js +26 -0
- package/dist/devtools-app/monaco/vs/assets/html.worker-B51mlPHg.js +470 -0
- package/dist/devtools-app/monaco/vs/assets/json.worker-DKiEKt88.js +58 -0
- package/dist/devtools-app/monaco/vs/assets/ts.worker-CMbG-7ft.js +67731 -0
- package/dist/devtools-app/monaco/vs/azcli-BA0tQDCg.js +1 -0
- package/dist/devtools-app/monaco/vs/basic-languages/monaco.contribution.js +1 -0
- package/dist/devtools-app/monaco/vs/bat-C397hTD6.js +1 -0
- package/dist/devtools-app/monaco/vs/bicep-DF5aW17k.js +2 -0
- package/dist/devtools-app/monaco/vs/cameligo-plsz8qhj.js +1 -0
- package/dist/devtools-app/monaco/vs/clojure-Y2auQMzK.js +1 -0
- package/dist/devtools-app/monaco/vs/coffee-Bu45yuWE.js +1 -0
- package/dist/devtools-app/monaco/vs/cpp-CkKPQIni.js +1 -0
- package/dist/devtools-app/monaco/vs/csharp-CX28MZyh.js +1 -0
- package/dist/devtools-app/monaco/vs/csp-D8uWnyxW.js +1 -0
- package/dist/devtools-app/monaco/vs/css-CaeNmE3S.js +3 -0
- package/dist/devtools-app/monaco/vs/cssMode-CjiAH6dQ.js +1 -0
- package/dist/devtools-app/monaco/vs/cypher-DVThT8BS.js +1 -0
- package/dist/devtools-app/monaco/vs/dart-CmGfCvrO.js +1 -0
- package/dist/devtools-app/monaco/vs/dockerfile-CZqqYdch.js +1 -0
- package/dist/devtools-app/monaco/vs/ecl-30fUercY.js +1 -0
- package/dist/devtools-app/monaco/vs/editor/editor.main.css +1 -0
- package/dist/devtools-app/monaco/vs/editor/editor.main.js +5 -0
- package/dist/devtools-app/monaco/vs/editor.api-CalNCsUg.js +903 -0
- package/dist/devtools-app/monaco/vs/elixir-xjPaIfzF.js +1 -0
- package/dist/devtools-app/monaco/vs/flow9-DqtmStfK.js +1 -0
- package/dist/devtools-app/monaco/vs/freemarker2-Cz_sV6Md.js +3 -0
- package/dist/devtools-app/monaco/vs/fsharp-BOMdg4U1.js +1 -0
- package/dist/devtools-app/monaco/vs/go-D_hbi-Jt.js +1 -0
- package/dist/devtools-app/monaco/vs/graphql-CKUU4kLG.js +1 -0
- package/dist/devtools-app/monaco/vs/handlebars-OwglfO-1.js +1 -0
- package/dist/devtools-app/monaco/vs/hcl-DTaboeZW.js +1 -0
- package/dist/devtools-app/monaco/vs/html-Pa1xEWsY.js +1 -0
- package/dist/devtools-app/monaco/vs/htmlMode-Bz67EXwp.js +1 -0
- package/dist/devtools-app/monaco/vs/ini-CsNwO04R.js +1 -0
- package/dist/devtools-app/monaco/vs/java-CI4ZMsH9.js +1 -0
- package/dist/devtools-app/monaco/vs/javascript-PczUCGdz.js +1 -0
- package/dist/devtools-app/monaco/vs/jsonMode-DULH5oaX.js +7 -0
- package/dist/devtools-app/monaco/vs/julia-BwzEvaQw.js +1 -0
- package/dist/devtools-app/monaco/vs/kotlin-IUYPiTV8.js +1 -0
- package/dist/devtools-app/monaco/vs/language/css/monaco.contribution.js +1 -0
- package/dist/devtools-app/monaco/vs/language/html/monaco.contribution.js +1 -0
- package/dist/devtools-app/monaco/vs/language/json/monaco.contribution.js +1 -0
- package/dist/devtools-app/monaco/vs/language/typescript/monaco.contribution.js +1 -0
- package/dist/devtools-app/monaco/vs/less-C0eDYdqa.js +2 -0
- package/dist/devtools-app/monaco/vs/lexon-iON-Kj97.js +1 -0
- package/dist/devtools-app/monaco/vs/liquid-DqKjdPGy.js +1 -0
- package/dist/devtools-app/monaco/vs/loader.js +1368 -0
- package/dist/devtools-app/monaco/vs/lspLanguageFeatures-kM9O9rjY.js +4 -0
- package/dist/devtools-app/monaco/vs/lua-DtygF91M.js +1 -0
- package/dist/devtools-app/monaco/vs/m3-CsR4AuFi.js +1 -0
- package/dist/devtools-app/monaco/vs/markdown-C_rD0bIw.js +1 -0
- package/dist/devtools-app/monaco/vs/mdx-DEWtB1K5.js +1 -0
- package/dist/devtools-app/monaco/vs/mips-CiYP61RB.js +1 -0
- package/dist/devtools-app/monaco/vs/monaco.contribution-D2OdxNBt.js +1 -0
- package/dist/devtools-app/monaco/vs/monaco.contribution-DO3azKX8.js +1 -0
- package/dist/devtools-app/monaco/vs/monaco.contribution-EcChJV6a.js +1 -0
- package/dist/devtools-app/monaco/vs/monaco.contribution-qLAYrEOP.js +1 -0
- package/dist/devtools-app/monaco/vs/msdax-C38-sJlp.js +1 -0
- package/dist/devtools-app/monaco/vs/mysql-CdtbpvbG.js +1 -0
- package/dist/devtools-app/monaco/vs/nls.messages-loader.js +1 -0
- package/dist/devtools-app/monaco/vs/nls.messages.cs.js.js +17 -0
- package/dist/devtools-app/monaco/vs/nls.messages.de.js.js +17 -0
- package/dist/devtools-app/monaco/vs/nls.messages.es.js.js +17 -0
- package/dist/devtools-app/monaco/vs/nls.messages.fr.js.js +15 -0
- package/dist/devtools-app/monaco/vs/nls.messages.it.js.js +15 -0
- package/dist/devtools-app/monaco/vs/nls.messages.ja.js.js +17 -0
- package/dist/devtools-app/monaco/vs/nls.messages.js.js +10 -0
- package/dist/devtools-app/monaco/vs/nls.messages.ko.js.js +25 -0
- package/dist/devtools-app/monaco/vs/nls.messages.pl.js.js +17 -0
- package/dist/devtools-app/monaco/vs/nls.messages.pt-br.js.js +6 -0
- package/dist/devtools-app/monaco/vs/nls.messages.ru.js.js +17 -0
- package/dist/devtools-app/monaco/vs/nls.messages.tr.js.js +15 -0
- package/dist/devtools-app/monaco/vs/nls.messages.zh-cn.js.js +17 -0
- package/dist/devtools-app/monaco/vs/nls.messages.zh-tw.js.js +15 -0
- package/dist/devtools-app/monaco/vs/objective-c-CntZFaHX.js +1 -0
- package/dist/devtools-app/monaco/vs/pascal-r6kuqfl_.js +1 -0
- package/dist/devtools-app/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
- package/dist/devtools-app/monaco/vs/perl-DABw_TcH.js +1 -0
- package/dist/devtools-app/monaco/vs/pgsql-me_jFXeX.js +1 -0
- package/dist/devtools-app/monaco/vs/php-D_kh-9LK.js +1 -0
- package/dist/devtools-app/monaco/vs/pla-VfZjczW0.js +1 -0
- package/dist/devtools-app/monaco/vs/postiats-BBSzz8Pk.js +1 -0
- package/dist/devtools-app/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
- package/dist/devtools-app/monaco/vs/powershell-B-7ap1zc.js +1 -0
- package/dist/devtools-app/monaco/vs/protobuf-BmtuEB1A.js +2 -0
- package/dist/devtools-app/monaco/vs/pug-BRpRNeEb.js +1 -0
- package/dist/devtools-app/monaco/vs/python-Cr0UkIbn.js +1 -0
- package/dist/devtools-app/monaco/vs/qsharp-BzsFaUU9.js +1 -0
- package/dist/devtools-app/monaco/vs/r-f8dDdrp4.js +1 -0
- package/dist/devtools-app/monaco/vs/razor-BYAHOTkz.js +1 -0
- package/dist/devtools-app/monaco/vs/redis-fvZQY4PI.js +1 -0
- package/dist/devtools-app/monaco/vs/redshift-45Et0LQi.js +1 -0
- package/dist/devtools-app/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
- package/dist/devtools-app/monaco/vs/ruby-CZO8zYTz.js +1 -0
- package/dist/devtools-app/monaco/vs/rust-Bfetafyc.js +1 -0
- package/dist/devtools-app/monaco/vs/sb-3GYllVck.js +1 -0
- package/dist/devtools-app/monaco/vs/scala-foMgrKo1.js +1 -0
- package/dist/devtools-app/monaco/vs/scheme-CHdMtr7p.js +1 -0
- package/dist/devtools-app/monaco/vs/scss-C1cmLt9V.js +3 -0
- package/dist/devtools-app/monaco/vs/shell-ClXCKCEW.js +1 -0
- package/dist/devtools-app/monaco/vs/solidity-MZ6ExpPy.js +1 -0
- package/dist/devtools-app/monaco/vs/sophia-DWkuSsPQ.js +1 -0
- package/dist/devtools-app/monaco/vs/sparql-AUGFYSyk.js +1 -0
- package/dist/devtools-app/monaco/vs/sql-32GpJSV2.js +1 -0
- package/dist/devtools-app/monaco/vs/st-CuDFIVZ_.js +1 -0
- package/dist/devtools-app/monaco/vs/swift-n-2HociN.js +3 -0
- package/dist/devtools-app/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
- package/dist/devtools-app/monaco/vs/tcl-D74tq1nH.js +1 -0
- package/dist/devtools-app/monaco/vs/tsMode-CZz1Umrk.js +11 -0
- package/dist/devtools-app/monaco/vs/twig-C6taOxMV.js +1 -0
- package/dist/devtools-app/monaco/vs/typescript-DfOrAzoV.js +1 -0
- package/dist/devtools-app/monaco/vs/typespec-D-PIh9Xw.js +1 -0
- package/dist/devtools-app/monaco/vs/vb-Dyb2648j.js +1 -0
- package/dist/devtools-app/monaco/vs/wgsl-BhLXMOR0.js +298 -0
- package/dist/devtools-app/monaco/vs/workers-DcJshg-q.js +1 -0
- package/dist/devtools-app/monaco/vs/xml-CdsdnY8S.js +1 -0
- package/dist/devtools-app/monaco/vs/yaml-DYGvmE88.js +1 -0
- package/dist/eslint-plugin/index.cjs +5 -2
- package/dist/eslint-plugin/index.mjs +5 -2
- package/dist/eslint-plugin/rules/prefer-unitless-values.cjs +217 -0
- package/dist/eslint-plugin/rules/prefer-unitless-values.mjs +217 -0
- package/dist/eslint-plugin/utils/api.cjs +3 -4
- package/dist/eslint-plugin/utils/api.mjs +2 -2
- package/dist/native/server.cjs +4 -4
- package/dist/native/server.mjs +4 -4
- package/dist/parser/jsx/extractCode.cjs +3 -2
- package/dist/parser/jsx/extractCode.mjs +3 -2
- package/dist/parser/jsx/extractProps.cjs +7 -1
- package/dist/parser/jsx/extractProps.mjs +7 -1
- package/dist/parser/jsx/server.cjs +13 -7
- package/dist/parser/jsx/server.mjs +13 -7
- package/dist/prop/at/shared.cjs +3 -3
- package/dist/prop/at/shared.mjs +3 -3
- package/dist/tasks/postcss.cjs +16 -5
- package/dist/tasks/postcss.mjs +16 -5
- package/dist/transform/cache.cjs +0 -3
- package/dist/transform/cache.mjs +0 -2
- package/dist/use/token/browser.cjs +17 -9
- package/dist/use/token/browser.mjs +18 -10
- package/dist/use/token/normalize.cjs +474 -0
- package/dist/use/token/normalize.mjs +473 -0
- package/dist/use/token/propMap.cjs +34 -5
- package/dist/use/token/propMap.mjs +34 -6
- package/dist/use/token/runtime-only.cjs +36 -47
- package/dist/use/token/runtime-only.mjs +37 -48
- package/dist/use/token/server.cjs +82 -15
- package/dist/use/token/server.mjs +83 -17
- package/dist/use/token/vars.cjs +14 -2
- package/dist/use/token/vars.mjs +15 -2
- package/package.json +13 -13
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { collectClassLiteralsFromExpression, compilePatterns, getCalleeName, getJSXAttributeName, getLiteralInfo, matchesPattern } from "../utils/ast.mjs";
|
|
2
|
+
import { DEFAULT_ATTRIBUTE_PATTERNS, DEFAULT_CALLEE_PATTERNS, DEFAULT_TAG_PATTERNS, DEFAULT_VARIABLE_PATTERNS } from "../utils/defaults.mjs";
|
|
3
|
+
import { buildLiteralReplacement } from "../utils/format.mjs";
|
|
4
|
+
import { getApi } from "../utils/api.mjs";
|
|
5
|
+
import { isCssPropName, parseGroupedSelector, splitClassList, splitFragments } from "../utils/boss-classes.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/eslint-plugin/rules/prefer-unitless-values.js
|
|
8
|
+
const RULE_NAME = "prefer-unitless-values";
|
|
9
|
+
const defaultOptions = {
|
|
10
|
+
attributes: DEFAULT_ATTRIBUTE_PATTERNS,
|
|
11
|
+
callees: DEFAULT_CALLEE_PATTERNS,
|
|
12
|
+
variables: DEFAULT_VARIABLE_PATTERNS,
|
|
13
|
+
tags: DEFAULT_TAG_PATTERNS,
|
|
14
|
+
additionalProps: [],
|
|
15
|
+
unit: null
|
|
16
|
+
};
|
|
17
|
+
const createPatterns = (options) => ({
|
|
18
|
+
attributes: compilePatterns(options.attributes),
|
|
19
|
+
callees: compilePatterns(options.callees),
|
|
20
|
+
variables: compilePatterns(options.variables),
|
|
21
|
+
tags: compilePatterns(options.tags)
|
|
22
|
+
});
|
|
23
|
+
const normalizeUnit = (value) => {
|
|
24
|
+
if (typeof value !== "string") return null;
|
|
25
|
+
const trimmed = value.trim();
|
|
26
|
+
return trimmed.length ? trimmed : null;
|
|
27
|
+
};
|
|
28
|
+
const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
29
|
+
const createUnitValuePattern = (unit) => new RegExp(`(^|_)([+-]?(?:\\d*\\.\\d+|\\d+))${escapeRegExp(unit)}(?=(_|$))`, "g");
|
|
30
|
+
const stripDefaultUnitSuffixes = (rawValue, unit, pattern = createUnitValuePattern(unit)) => {
|
|
31
|
+
if (!rawValue || !unit) return null;
|
|
32
|
+
let changed = false;
|
|
33
|
+
const nextValue = rawValue.replace(pattern, (_, prefix, numberValue) => {
|
|
34
|
+
changed = true;
|
|
35
|
+
return `${prefix}${numberValue}`;
|
|
36
|
+
});
|
|
37
|
+
return changed ? nextValue : null;
|
|
38
|
+
};
|
|
39
|
+
const getSimpleTokenValueInfo = (token, extraProps) => {
|
|
40
|
+
const fragments = splitFragments(token);
|
|
41
|
+
if (!fragments.length) return null;
|
|
42
|
+
let propIndex = -1;
|
|
43
|
+
for (let i = 0; i < fragments.length; i += 1) if (isCssPropName(fragments[i], extraProps)) {
|
|
44
|
+
propIndex = i;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
if (propIndex === -1 || propIndex >= fragments.length - 1) return null;
|
|
48
|
+
return {
|
|
49
|
+
prop: fragments[propIndex],
|
|
50
|
+
value: fragments.slice(propIndex + 1).join(":"),
|
|
51
|
+
prefix: fragments.slice(0, propIndex + 1).join(":")
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const rewriteGroupedToken = (token, unit, extraProps, pattern) => {
|
|
55
|
+
const grouped = parseGroupedSelector(token);
|
|
56
|
+
if (!grouped) return null;
|
|
57
|
+
let changed = false;
|
|
58
|
+
const entries = [];
|
|
59
|
+
const issues = [];
|
|
60
|
+
for (const entry of grouped.entries) {
|
|
61
|
+
const current = entry.rawValue;
|
|
62
|
+
const nextValue = isCssPropName(entry.name, extraProps) ? stripDefaultUnitSuffixes(current, unit, pattern) : null;
|
|
63
|
+
if (!nextValue) {
|
|
64
|
+
entries.push(entry);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
changed = true;
|
|
68
|
+
entries.push({
|
|
69
|
+
...entry,
|
|
70
|
+
rawValue: nextValue
|
|
71
|
+
});
|
|
72
|
+
issues.push({
|
|
73
|
+
prop: entry.name,
|
|
74
|
+
value: current,
|
|
75
|
+
nextValue
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (!changed) return null;
|
|
79
|
+
return {
|
|
80
|
+
nextToken: `${grouped.prefix}:{${entries.map((entry) => `${entry.name}:${entry.rawValue}`).join(";")}}`,
|
|
81
|
+
issues
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
const rewriteSimpleToken = (token, unit, extraProps, pattern) => {
|
|
85
|
+
const valueInfo = getSimpleTokenValueInfo(token, extraProps);
|
|
86
|
+
if (!valueInfo) return null;
|
|
87
|
+
const nextValue = stripDefaultUnitSuffixes(valueInfo.value, unit, pattern);
|
|
88
|
+
if (!nextValue) return null;
|
|
89
|
+
return {
|
|
90
|
+
nextToken: `${valueInfo.prefix}:${nextValue}`,
|
|
91
|
+
issues: [{
|
|
92
|
+
prop: valueInfo.prop,
|
|
93
|
+
value: valueInfo.value,
|
|
94
|
+
nextValue
|
|
95
|
+
}]
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
const rewriteTokenUnitValues = (token, unit, extraProps, pattern = createUnitValuePattern(unit)) => rewriteGroupedToken(token, unit, extraProps, pattern) || rewriteSimpleToken(token, unit, extraProps, pattern);
|
|
99
|
+
const analyzeClassList = (classList, unit, extraProps) => {
|
|
100
|
+
const tokens = splitClassList(classList);
|
|
101
|
+
if (!tokens.length) return {
|
|
102
|
+
issues: [],
|
|
103
|
+
nextClassList: null
|
|
104
|
+
};
|
|
105
|
+
const pattern = createUnitValuePattern(unit);
|
|
106
|
+
let changed = false;
|
|
107
|
+
const issues = [];
|
|
108
|
+
const nextTokens = tokens.map((token) => {
|
|
109
|
+
const rewritten = rewriteTokenUnitValues(token, unit, extraProps, pattern);
|
|
110
|
+
if (!rewritten) return token;
|
|
111
|
+
changed = true;
|
|
112
|
+
issues.push(...rewritten.issues);
|
|
113
|
+
return rewritten.nextToken;
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
issues,
|
|
117
|
+
nextClassList: changed ? nextTokens.join(" ") : null
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
const create = (context) => {
|
|
121
|
+
const sourceCode = context.getSourceCode();
|
|
122
|
+
const options = {
|
|
123
|
+
...defaultOptions,
|
|
124
|
+
...context.options[0] || {}
|
|
125
|
+
};
|
|
126
|
+
const patterns = createPatterns(options);
|
|
127
|
+
const extraProps = options.additionalProps?.length ? new Set(options.additionalProps) : null;
|
|
128
|
+
const { api } = getApi();
|
|
129
|
+
const unit = normalizeUnit(options.unit) || normalizeUnit(api?.unit) || "px";
|
|
130
|
+
if (!unit) return {};
|
|
131
|
+
const reportLiteral = (literal) => {
|
|
132
|
+
if (!literal || !literal.value) return;
|
|
133
|
+
const { issues, nextClassList } = analyzeClassList(literal.value, unit, extraProps);
|
|
134
|
+
if (!issues.length) return;
|
|
135
|
+
const preview = issues.slice(0, 3).map((issue) => `${issue.prop}:${issue.value} -> ${issue.prop}:${issue.nextValue}`).join(", ");
|
|
136
|
+
const remainder = issues.length > 3 ? ` (+${issues.length - 3} more)` : "";
|
|
137
|
+
context.report({
|
|
138
|
+
node: literal.node,
|
|
139
|
+
messageId: "preferUnitlessValues",
|
|
140
|
+
data: {
|
|
141
|
+
unit,
|
|
142
|
+
values: preview + remainder
|
|
143
|
+
},
|
|
144
|
+
fix: literal.canFix && nextClassList ? (fixer) => fixer.replaceText(literal.node, buildLiteralReplacement(literal.node, sourceCode, nextClassList)) : null
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
return {
|
|
148
|
+
JSXAttribute(node) {
|
|
149
|
+
const name = getJSXAttributeName(node);
|
|
150
|
+
if (!name || !matchesPattern(patterns.attributes, name)) return;
|
|
151
|
+
if (!node.value) return;
|
|
152
|
+
const literals = [];
|
|
153
|
+
collectClassLiteralsFromExpression(node.value, sourceCode, literals);
|
|
154
|
+
for (const literal of literals) reportLiteral(literal);
|
|
155
|
+
},
|
|
156
|
+
CallExpression(node) {
|
|
157
|
+
const calleeName = getCalleeName(node.callee);
|
|
158
|
+
if (!calleeName || !matchesPattern(patterns.callees, calleeName)) return;
|
|
159
|
+
const literals = [];
|
|
160
|
+
for (const argument of node.arguments) collectClassLiteralsFromExpression(argument, sourceCode, literals);
|
|
161
|
+
for (const literal of literals) reportLiteral(literal);
|
|
162
|
+
},
|
|
163
|
+
VariableDeclarator(node) {
|
|
164
|
+
if (!node.id || node.id.type !== "Identifier") return;
|
|
165
|
+
if (!matchesPattern(patterns.variables, node.id.name)) return;
|
|
166
|
+
const literals = [];
|
|
167
|
+
collectClassLiteralsFromExpression(node.init, sourceCode, literals);
|
|
168
|
+
for (const literal of literals) reportLiteral(literal);
|
|
169
|
+
},
|
|
170
|
+
TaggedTemplateExpression(node) {
|
|
171
|
+
const tagName = getCalleeName(node.tag);
|
|
172
|
+
if (!tagName || !matchesPattern(patterns.tags, tagName)) return;
|
|
173
|
+
const literal = getLiteralInfo(node.quasi, sourceCode);
|
|
174
|
+
if (literal) reportLiteral(literal);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
var prefer_unitless_values_default = {
|
|
179
|
+
name: RULE_NAME,
|
|
180
|
+
meta: {
|
|
181
|
+
type: "suggestion",
|
|
182
|
+
docs: { description: "Prefer unitless numeric class values for the configured default unit (for example border:1_solid over border:1px_solid)." },
|
|
183
|
+
fixable: "code",
|
|
184
|
+
schema: [{
|
|
185
|
+
type: "object",
|
|
186
|
+
additionalProperties: false,
|
|
187
|
+
properties: {
|
|
188
|
+
attributes: {
|
|
189
|
+
type: "array",
|
|
190
|
+
items: { type: "string" }
|
|
191
|
+
},
|
|
192
|
+
callees: {
|
|
193
|
+
type: "array",
|
|
194
|
+
items: { type: "string" }
|
|
195
|
+
},
|
|
196
|
+
variables: {
|
|
197
|
+
type: "array",
|
|
198
|
+
items: { type: "string" }
|
|
199
|
+
},
|
|
200
|
+
tags: {
|
|
201
|
+
type: "array",
|
|
202
|
+
items: { type: "string" }
|
|
203
|
+
},
|
|
204
|
+
additionalProps: {
|
|
205
|
+
type: "array",
|
|
206
|
+
items: { type: "string" }
|
|
207
|
+
},
|
|
208
|
+
unit: { type: "string" }
|
|
209
|
+
}
|
|
210
|
+
}],
|
|
211
|
+
messages: { preferUnitlessValues: "Avoid hardcoded \"{{unit}}\" in Boss class values: {{values}}." }
|
|
212
|
+
},
|
|
213
|
+
create
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
//#endregion
|
|
217
|
+
export { prefer_unitless_values_default as default };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
let boss_css_api_config = require("boss-css/api/config");
|
|
1
|
+
const require_api_server = require('../../api/server.cjs');
|
|
2
|
+
const require_api_config = require('../../api/config.cjs');
|
|
4
3
|
|
|
5
4
|
//#region src/eslint-plugin/utils/api.js
|
|
6
5
|
let api = null;
|
|
@@ -10,7 +9,7 @@ const initApi = () => {
|
|
|
10
9
|
if (initPromise) return initPromise;
|
|
11
10
|
initPromise = (async () => {
|
|
12
11
|
try {
|
|
13
|
-
api = await
|
|
12
|
+
api = await require_api_server.createApi(await require_api_config.loadConfig(process.cwd()), true);
|
|
14
13
|
} catch (err) {
|
|
15
14
|
error = err;
|
|
16
15
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createApi } from "
|
|
2
|
-
import { loadConfig } from "
|
|
1
|
+
import { createApi } from "../../api/server.mjs";
|
|
2
|
+
import { loadConfig } from "../../api/config.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/eslint-plugin/utils/api.js
|
|
5
5
|
let api = null;
|
package/dist/native/server.cjs
CHANGED
|
@@ -134,10 +134,10 @@ type BaseFn<T extends React.ElementType = DefaultNativeElement> = {
|
|
|
134
134
|
api.file.native.dts.set("body", "jsx:proxy-start", `type ProxyCustomMembers = {
|
|
135
135
|
`).set("body", "jsx:proxy-utils", ` $: $$NoopFn
|
|
136
136
|
merge: (...inputs: import('boss-css/merge').MergeInput[]) => import('boss-css/merge').MergeOutput
|
|
137
|
-
cx: (...inputs: import('boss-css/
|
|
138
|
-
cv: typeof import('boss-css/
|
|
139
|
-
scv: typeof import('boss-css/
|
|
140
|
-
sv: typeof import('boss-css/
|
|
137
|
+
cx: (...inputs: import('boss-css/variants').CxValue[]) => string
|
|
138
|
+
cv: typeof import('boss-css/variants').cv
|
|
139
|
+
scv: typeof import('boss-css/variants').scv
|
|
140
|
+
sv: typeof import('boss-css/variants').sv
|
|
141
141
|
css: CssFn
|
|
142
142
|
style: StyleFn
|
|
143
143
|
`).set("body", "jsx:proxy-custom-members", ``).set("body", "jsx:proxy-custom-members-end", `}`).set("body", "jsx:proxy-type", `type Proxy = BaseFn & {
|
package/dist/native/server.mjs
CHANGED
|
@@ -133,10 +133,10 @@ type BaseFn<T extends React.ElementType = DefaultNativeElement> = {
|
|
|
133
133
|
api.file.native.dts.set("body", "jsx:proxy-start", `type ProxyCustomMembers = {
|
|
134
134
|
`).set("body", "jsx:proxy-utils", ` $: $$NoopFn
|
|
135
135
|
merge: (...inputs: import('boss-css/merge').MergeInput[]) => import('boss-css/merge').MergeOutput
|
|
136
|
-
cx: (...inputs: import('boss-css/
|
|
137
|
-
cv: typeof import('boss-css/
|
|
138
|
-
scv: typeof import('boss-css/
|
|
139
|
-
sv: typeof import('boss-css/
|
|
136
|
+
cx: (...inputs: import('boss-css/variants').CxValue[]) => string
|
|
137
|
+
cv: typeof import('boss-css/variants').cv
|
|
138
|
+
scv: typeof import('boss-css/variants').scv
|
|
139
|
+
sv: typeof import('boss-css/variants').sv
|
|
140
140
|
css: CssFn
|
|
141
141
|
style: StyleFn
|
|
142
142
|
`).set("body", "jsx:proxy-custom-members", ``).set("body", "jsx:proxy-custom-members-end", `}`).set("body", "jsx:proxy-type", `type Proxy = BaseFn & {
|
|
@@ -48,12 +48,13 @@ function extractCode(code) {
|
|
|
48
48
|
}
|
|
49
49
|
if (!isInside) continue;
|
|
50
50
|
if (type === "jsx") {
|
|
51
|
-
|
|
51
|
+
const openedCurrentContext = !isIgnored && openingRegexp.test(current);
|
|
52
|
+
if (openedCurrentContext) {
|
|
52
53
|
stack.push(current);
|
|
53
54
|
currentOpener = current;
|
|
54
55
|
isIgnored = Boolean(ignoredContexts[current]);
|
|
55
56
|
}
|
|
56
|
-
if (current === map[currentOpener]) {
|
|
57
|
+
if (!openedCurrentContext && current === map[currentOpener]) {
|
|
57
58
|
stack.pop();
|
|
58
59
|
currentOpener = stack.at(-1) || "";
|
|
59
60
|
isIgnored = false;
|
|
@@ -47,12 +47,13 @@ function extractCode(code) {
|
|
|
47
47
|
}
|
|
48
48
|
if (!isInside) continue;
|
|
49
49
|
if (type === "jsx") {
|
|
50
|
-
|
|
50
|
+
const openedCurrentContext = !isIgnored && openingRegexp.test(current);
|
|
51
|
+
if (openedCurrentContext) {
|
|
51
52
|
stack.push(current);
|
|
52
53
|
currentOpener = current;
|
|
53
54
|
isIgnored = Boolean(ignoredContexts[current]);
|
|
54
55
|
}
|
|
55
|
-
if (current === map[currentOpener]) {
|
|
56
|
+
if (!openedCurrentContext && current === map[currentOpener]) {
|
|
56
57
|
stack.pop();
|
|
57
58
|
currentOpener = stack.at(-1) || "";
|
|
58
59
|
isIgnored = false;
|
|
@@ -17,7 +17,13 @@ async function extractPropTrees(codes) {
|
|
|
17
17
|
return expressions.map(extractPropTreeFromExpression);
|
|
18
18
|
}
|
|
19
19
|
const normalizeCode = (code) => {
|
|
20
|
-
|
|
20
|
+
let end = code.length - 1;
|
|
21
|
+
while (end >= 0 && /\s/.test(code[end])) end -= 1;
|
|
22
|
+
if (end < 0 || code[end] !== ">") return code;
|
|
23
|
+
let prev = end - 1;
|
|
24
|
+
while (prev >= 0 && /\s/.test(code[prev])) prev -= 1;
|
|
25
|
+
if (prev >= 0 && code[prev] === "/") return code;
|
|
26
|
+
return `${code.slice(0, end)}/${code.slice(end)}`;
|
|
21
27
|
};
|
|
22
28
|
const extractPropTreeFromCode = async (code) => {
|
|
23
29
|
const { body } = await _swc_core.default.parse(normalizeCode(code), {
|
|
@@ -15,7 +15,13 @@ async function extractPropTrees(codes) {
|
|
|
15
15
|
return expressions.map(extractPropTreeFromExpression);
|
|
16
16
|
}
|
|
17
17
|
const normalizeCode = (code) => {
|
|
18
|
-
|
|
18
|
+
let end = code.length - 1;
|
|
19
|
+
while (end >= 0 && /\s/.test(code[end])) end -= 1;
|
|
20
|
+
if (end < 0 || code[end] !== ">") return code;
|
|
21
|
+
let prev = end - 1;
|
|
22
|
+
while (prev >= 0 && /\s/.test(code[prev])) prev -= 1;
|
|
23
|
+
if (prev >= 0 && code[prev] === "/") return code;
|
|
24
|
+
return `${code.slice(0, end)}/${code.slice(end)}`;
|
|
19
25
|
};
|
|
20
26
|
const extractPropTreeFromCode = async (code) => {
|
|
21
27
|
const { body } = await swc.parse(normalizeCode(code), {
|
|
@@ -23,6 +23,11 @@ const settings = new Map([
|
|
|
23
23
|
["types", true],
|
|
24
24
|
["emitRuntime", false]
|
|
25
25
|
]);
|
|
26
|
+
const resolveGlobals = (api) => {
|
|
27
|
+
const configValue = api.userConfig?.jsx?.globals;
|
|
28
|
+
if (typeof configValue === "boolean") return configValue;
|
|
29
|
+
return settings.get("globals") !== false;
|
|
30
|
+
};
|
|
26
31
|
/**
|
|
27
32
|
* Style:
|
|
28
33
|
*
|
|
@@ -90,6 +95,7 @@ const onBoot = async (api) => {
|
|
|
90
95
|
needsRuntime = false;
|
|
91
96
|
preparedComponents.clear();
|
|
92
97
|
const needsRuntimeTest = () => needsRuntime || settings.get("emitRuntime") === true;
|
|
98
|
+
const globalsEnabled = resolveGlobals(api);
|
|
93
99
|
const proxyVar = api.file.js.import({
|
|
94
100
|
name: "proxy",
|
|
95
101
|
from: "boss-css/runtime"
|
|
@@ -98,7 +104,7 @@ const onBoot = async (api) => {
|
|
|
98
104
|
name: "onBrowserObjectStart",
|
|
99
105
|
from: "boss-css/parser/jsx/browser"
|
|
100
106
|
}, needsRuntimeTest);
|
|
101
|
-
|
|
107
|
+
globalsEnabled && api.file.js.set("body", "jsx:globalThis", `globalThis.${settings.get("name")} = ${proxyVar}`, needsRuntimeTest);
|
|
102
108
|
api.file.js.set("body", "jsx:export-const", `export const ${settings.get("name")} = ${proxyVar}`, needsRuntimeTest);
|
|
103
109
|
api.file.js.set("foot", "jsx:export-default", `export default ${proxyVar}`, needsRuntimeTest);
|
|
104
110
|
const framework = await require_detect_fw_index.detectFramework({ config: api.userConfig ?? api });
|
|
@@ -177,20 +183,20 @@ type BaseFn<T extends BossElementType = 'div'> = {
|
|
|
177
183
|
api.file.js.dts.set("body", "jsx:proxy-start", `type ProxyCustomMembers = {
|
|
178
184
|
`).set("body", "jsx:proxy-utils", ` $: $$NoopFn
|
|
179
185
|
merge: (...inputs: import('boss-css/merge').MergeInput[]) => import('boss-css/merge').MergeOutput
|
|
180
|
-
cx: (...inputs: import('boss-css/
|
|
181
|
-
cv: typeof import('boss-css/
|
|
182
|
-
scv: typeof import('boss-css/
|
|
183
|
-
sv: typeof import('boss-css/
|
|
186
|
+
cx: (...inputs: import('boss-css/variants').CxValue[]) => string
|
|
187
|
+
cv: typeof import('boss-css/variants').cv
|
|
188
|
+
scv: typeof import('boss-css/variants').scv
|
|
189
|
+
sv: typeof import('boss-css/variants').sv
|
|
184
190
|
css: CssFn
|
|
185
191
|
style: StyleFn
|
|
186
192
|
`).set("body", "jsx:proxy-custom-members", ``).set("body", "jsx:proxy-custom-members-end", `}`).set("body", "jsx:proxy-type", `type Proxy = BaseFn & {
|
|
187
193
|
[T in keyof BossIntrinsicElements]: BaseFn<T>
|
|
188
194
|
} & $$Prepared & ProxyCustomMembers`);
|
|
189
195
|
api.file.js.dts.replace("body", "$$:FinalProps", (value) => {
|
|
190
|
-
return `${value} & { ${/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(classNameProp) ? classNameProp : JSON.stringify(classNameProp)}?: import('boss-css/
|
|
196
|
+
return `${value} & { ${/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(classNameProp) ? classNameProp : JSON.stringify(classNameProp)}?: import('boss-css/variants').CxValue }`;
|
|
191
197
|
});
|
|
192
198
|
api.file.js.dts.set("foot", "jsx:export", `export declare const $$: Proxy`);
|
|
193
|
-
if (
|
|
199
|
+
if (globalsEnabled) api.file.js.dts.set("foot", "jsx:globals", `declare global {
|
|
194
200
|
const $$: Proxy
|
|
195
201
|
}`);
|
|
196
202
|
api.file.js.dts.set("foot", "$$:default-export", `export default $$`);
|
|
@@ -22,6 +22,11 @@ const settings = new Map([
|
|
|
22
22
|
["types", true],
|
|
23
23
|
["emitRuntime", false]
|
|
24
24
|
]);
|
|
25
|
+
const resolveGlobals = (api) => {
|
|
26
|
+
const configValue = api.userConfig?.jsx?.globals;
|
|
27
|
+
if (typeof configValue === "boolean") return configValue;
|
|
28
|
+
return settings.get("globals") !== false;
|
|
29
|
+
};
|
|
25
30
|
/**
|
|
26
31
|
* Style:
|
|
27
32
|
*
|
|
@@ -89,6 +94,7 @@ const onBoot = async (api) => {
|
|
|
89
94
|
needsRuntime = false;
|
|
90
95
|
preparedComponents.clear();
|
|
91
96
|
const needsRuntimeTest = () => needsRuntime || settings.get("emitRuntime") === true;
|
|
97
|
+
const globalsEnabled = resolveGlobals(api);
|
|
92
98
|
const proxyVar = api.file.js.import({
|
|
93
99
|
name: "proxy",
|
|
94
100
|
from: "boss-css/runtime"
|
|
@@ -97,7 +103,7 @@ const onBoot = async (api) => {
|
|
|
97
103
|
name: "onBrowserObjectStart",
|
|
98
104
|
from: "boss-css/parser/jsx/browser"
|
|
99
105
|
}, needsRuntimeTest);
|
|
100
|
-
|
|
106
|
+
globalsEnabled && api.file.js.set("body", "jsx:globalThis", `globalThis.${settings.get("name")} = ${proxyVar}`, needsRuntimeTest);
|
|
101
107
|
api.file.js.set("body", "jsx:export-const", `export const ${settings.get("name")} = ${proxyVar}`, needsRuntimeTest);
|
|
102
108
|
api.file.js.set("foot", "jsx:export-default", `export default ${proxyVar}`, needsRuntimeTest);
|
|
103
109
|
const framework = await detectFramework({ config: api.userConfig ?? api });
|
|
@@ -176,20 +182,20 @@ type BaseFn<T extends BossElementType = 'div'> = {
|
|
|
176
182
|
api.file.js.dts.set("body", "jsx:proxy-start", `type ProxyCustomMembers = {
|
|
177
183
|
`).set("body", "jsx:proxy-utils", ` $: $$NoopFn
|
|
178
184
|
merge: (...inputs: import('boss-css/merge').MergeInput[]) => import('boss-css/merge').MergeOutput
|
|
179
|
-
cx: (...inputs: import('boss-css/
|
|
180
|
-
cv: typeof import('boss-css/
|
|
181
|
-
scv: typeof import('boss-css/
|
|
182
|
-
sv: typeof import('boss-css/
|
|
185
|
+
cx: (...inputs: import('boss-css/variants').CxValue[]) => string
|
|
186
|
+
cv: typeof import('boss-css/variants').cv
|
|
187
|
+
scv: typeof import('boss-css/variants').scv
|
|
188
|
+
sv: typeof import('boss-css/variants').sv
|
|
183
189
|
css: CssFn
|
|
184
190
|
style: StyleFn
|
|
185
191
|
`).set("body", "jsx:proxy-custom-members", ``).set("body", "jsx:proxy-custom-members-end", `}`).set("body", "jsx:proxy-type", `type Proxy = BaseFn & {
|
|
186
192
|
[T in keyof BossIntrinsicElements]: BaseFn<T>
|
|
187
193
|
} & $$Prepared & ProxyCustomMembers`);
|
|
188
194
|
api.file.js.dts.replace("body", "$$:FinalProps", (value) => {
|
|
189
|
-
return `${value} & { ${/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(classNameProp) ? classNameProp : JSON.stringify(classNameProp)}?: import('boss-css/
|
|
195
|
+
return `${value} & { ${/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(classNameProp) ? classNameProp : JSON.stringify(classNameProp)}?: import('boss-css/variants').CxValue }`;
|
|
190
196
|
});
|
|
191
197
|
api.file.js.dts.set("foot", "jsx:export", `export declare const $$: Proxy`);
|
|
192
|
-
if (
|
|
198
|
+
if (globalsEnabled) api.file.js.dts.set("foot", "jsx:globals", `declare global {
|
|
193
199
|
const $$: Proxy
|
|
194
200
|
}`);
|
|
195
201
|
api.file.js.dts.set("foot", "$$:default-export", `export default $$`);
|
package/dist/prop/at/shared.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
|
|
2
2
|
//#region src/prop/at/shared.ts
|
|
3
3
|
const defaultBreakpoints = {
|
|
4
|
-
micro: [
|
|
4
|
+
micro: [0, 375],
|
|
5
5
|
mobile: [376, 639],
|
|
6
6
|
tablet: [640, 1023],
|
|
7
7
|
small: [1024, 1439],
|
|
8
8
|
medium: [1440, 1919],
|
|
9
|
-
large: [1920,
|
|
10
|
-
device: [
|
|
9
|
+
large: [1920, 1e5],
|
|
10
|
+
device: [0, 1023]
|
|
11
11
|
};
|
|
12
12
|
const baseAtValues = [
|
|
13
13
|
["dark", "@media screen and (prefers-color-scheme: dark)"],
|
package/dist/prop/at/shared.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
//#region src/prop/at/shared.ts
|
|
2
2
|
const defaultBreakpoints = {
|
|
3
|
-
micro: [
|
|
3
|
+
micro: [0, 375],
|
|
4
4
|
mobile: [376, 639],
|
|
5
5
|
tablet: [640, 1023],
|
|
6
6
|
small: [1024, 1439],
|
|
7
7
|
medium: [1440, 1919],
|
|
8
|
-
large: [1920,
|
|
9
|
-
device: [
|
|
8
|
+
large: [1920, 1e5],
|
|
9
|
+
device: [0, 1023]
|
|
10
10
|
};
|
|
11
11
|
const baseAtValues = [
|
|
12
12
|
["dark", "@media screen and (prefers-color-scheme: dark)"],
|
package/dist/tasks/postcss.cjs
CHANGED
|
@@ -91,7 +91,7 @@ const runPostcss = async (root, result, options = {}) => {
|
|
|
91
91
|
promises.push(require_processFile.default(file));
|
|
92
92
|
});
|
|
93
93
|
const processedFiles = await Promise.allSettled(promises);
|
|
94
|
-
const
|
|
94
|
+
const onParseTasks = [];
|
|
95
95
|
for (const settled of processedFiles) {
|
|
96
96
|
if (settled.status !== "fulfilled") continue;
|
|
97
97
|
const processed = settled.value;
|
|
@@ -99,9 +99,20 @@ const runPostcss = async (root, result, options = {}) => {
|
|
|
99
99
|
if (!value || !processed?.changed) continue;
|
|
100
100
|
const changedPath = value.path ? node_path.default.resolve(value.path) : null;
|
|
101
101
|
if (changedPath) api.css?.removeSource?.(changedPath);
|
|
102
|
-
|
|
102
|
+
const sourcePath = changedPath ?? value.path ?? "(unknown file)";
|
|
103
|
+
onParseTasks.push({
|
|
104
|
+
filePath: sourcePath,
|
|
105
|
+
promise: api.trigger("onParse", value)
|
|
106
|
+
});
|
|
103
107
|
}
|
|
104
|
-
await Promise.allSettled(
|
|
108
|
+
(await Promise.allSettled(onParseTasks.map((task) => task.promise))).forEach((parseResult, index) => {
|
|
109
|
+
if (parseResult.status !== "rejected") return;
|
|
110
|
+
const task = onParseTasks[index];
|
|
111
|
+
const relativePath = node_path.default.relative(baseDir ?? process.cwd(), task.filePath);
|
|
112
|
+
const sourceLabel = relativePath && !relativePath.startsWith("..") ? relativePath : task.filePath;
|
|
113
|
+
const reason = parseResult.reason instanceof Error ? parseResult.reason.message : String(parseResult.reason ?? "Unknown parsing error");
|
|
114
|
+
result.warn(`[boss-css] Failed parsing ${sourceLabel}: ${reason}`, { plugin: "boss-postcss-plugin" });
|
|
115
|
+
});
|
|
105
116
|
const boundaryResult = await require_boundaries.resolveBoundaryOutputs(api, {
|
|
106
117
|
rootDir: baseDir ?? process.cwd(),
|
|
107
118
|
stylesheetPath,
|
|
@@ -119,8 +130,8 @@ const runPostcss = async (root, result, options = {}) => {
|
|
|
119
130
|
const outputText = new Map(boundaryResult.outputs.map((output) => [node_path.default.resolve(output.path), output.text])).get(resolvedFile ?? resolvedStylesheet);
|
|
120
131
|
if (outputText !== void 0) result.root = postcss.default.parse(outputText, result.opts);
|
|
121
132
|
if (api.strategy !== "classname-only") {
|
|
122
|
-
api.file.js.write();
|
|
123
|
-
if (api.file.native?.hasContent) api.file.native.write();
|
|
133
|
+
await api.file.js.write();
|
|
134
|
+
if (api.file.native?.hasContent) await api.file.native.write();
|
|
124
135
|
}
|
|
125
136
|
});
|
|
126
137
|
runQueues.set(queueKey, run);
|
package/dist/tasks/postcss.mjs
CHANGED
|
@@ -88,7 +88,7 @@ const runPostcss = async (root, result, options = {}) => {
|
|
|
88
88
|
promises.push(processFile(file));
|
|
89
89
|
});
|
|
90
90
|
const processedFiles = await Promise.allSettled(promises);
|
|
91
|
-
const
|
|
91
|
+
const onParseTasks = [];
|
|
92
92
|
for (const settled of processedFiles) {
|
|
93
93
|
if (settled.status !== "fulfilled") continue;
|
|
94
94
|
const processed = settled.value;
|
|
@@ -96,9 +96,20 @@ const runPostcss = async (root, result, options = {}) => {
|
|
|
96
96
|
if (!value || !processed?.changed) continue;
|
|
97
97
|
const changedPath = value.path ? path.resolve(value.path) : null;
|
|
98
98
|
if (changedPath) api.css?.removeSource?.(changedPath);
|
|
99
|
-
|
|
99
|
+
const sourcePath = changedPath ?? value.path ?? "(unknown file)";
|
|
100
|
+
onParseTasks.push({
|
|
101
|
+
filePath: sourcePath,
|
|
102
|
+
promise: api.trigger("onParse", value)
|
|
103
|
+
});
|
|
100
104
|
}
|
|
101
|
-
await Promise.allSettled(
|
|
105
|
+
(await Promise.allSettled(onParseTasks.map((task) => task.promise))).forEach((parseResult, index) => {
|
|
106
|
+
if (parseResult.status !== "rejected") return;
|
|
107
|
+
const task = onParseTasks[index];
|
|
108
|
+
const relativePath = path.relative(baseDir ?? process.cwd(), task.filePath);
|
|
109
|
+
const sourceLabel = relativePath && !relativePath.startsWith("..") ? relativePath : task.filePath;
|
|
110
|
+
const reason = parseResult.reason instanceof Error ? parseResult.reason.message : String(parseResult.reason ?? "Unknown parsing error");
|
|
111
|
+
result.warn(`[boss-css] Failed parsing ${sourceLabel}: ${reason}`, { plugin: "boss-postcss-plugin" });
|
|
112
|
+
});
|
|
102
113
|
const boundaryResult = await resolveBoundaryOutputs(api, {
|
|
103
114
|
rootDir: baseDir ?? process.cwd(),
|
|
104
115
|
stylesheetPath,
|
|
@@ -116,8 +127,8 @@ const runPostcss = async (root, result, options = {}) => {
|
|
|
116
127
|
const outputText = new Map(boundaryResult.outputs.map((output) => [path.resolve(output.path), output.text])).get(resolvedFile ?? resolvedStylesheet);
|
|
117
128
|
if (outputText !== void 0) result.root = postcss.parse(outputText, result.opts);
|
|
118
129
|
if (api.strategy !== "classname-only") {
|
|
119
|
-
api.file.js.write();
|
|
120
|
-
if (api.file.native?.hasContent) api.file.native.write();
|
|
130
|
+
await api.file.js.write();
|
|
131
|
+
if (api.file.native?.hasContent) await api.file.native.write();
|
|
121
132
|
}
|
|
122
133
|
});
|
|
123
134
|
runQueues.set(queueKey, run);
|
package/dist/transform/cache.cjs
CHANGED
package/dist/transform/cache.mjs
CHANGED
|
@@ -50,27 +50,35 @@ const isTokenFn = (value) => {
|
|
|
50
50
|
const onBrowserObjectStart = (api, { input }) => {
|
|
51
51
|
const isClassnameFirst = api.strategy === "classname-first";
|
|
52
52
|
const mutableInput = input;
|
|
53
|
+
const prefix = api.selectorPrefix ?? "";
|
|
54
|
+
const toTokenVar = (path) => `var(--${prefix}${path.replace(/\./g, "-")})`;
|
|
53
55
|
for (const prop in mutableInput) {
|
|
54
56
|
const value = mutableInput[prop];
|
|
55
57
|
if (isTokenFn(value)) {
|
|
56
58
|
const path = value().replace("$$.token.", "");
|
|
57
59
|
if (isClassnameFirst) mutableInput[prop] = path.split(".").slice(1).join(".");
|
|
58
|
-
else mutableInput[prop] =
|
|
60
|
+
else mutableInput[prop] = toTokenVar(path);
|
|
59
61
|
} else if (typeof value === "string" && value.startsWith("$$.token.")) {
|
|
60
62
|
const path = value.replace("$$.token.", "");
|
|
61
63
|
if (isClassnameFirst) mutableInput[prop] = path.split(".").slice(1).join(".");
|
|
62
|
-
else mutableInput[prop] =
|
|
64
|
+
else mutableInput[prop] = toTokenVar(path);
|
|
63
65
|
} else if (typeof prop === "string") {
|
|
64
66
|
const rawValue = mutableInput[prop];
|
|
65
67
|
if (typeof rawValue !== "string") continue;
|
|
66
68
|
const dashProp = api.camelCaseToDash?.(prop) ?? prop;
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
const groupCandidates = [];
|
|
70
|
+
const seen = /* @__PURE__ */ new Set();
|
|
71
|
+
const addCandidate = (group) => {
|
|
72
|
+
if (!group || seen.has(group)) return;
|
|
73
|
+
seen.add(group);
|
|
74
|
+
groupCandidates.push(group);
|
|
75
|
+
};
|
|
76
|
+
for (const group of require_propMap.getTokenGroupsForProp(prop)) addCandidate(group);
|
|
77
|
+
for (const group of require_propMap.getTokenGroupsForProp(dashProp)) addCandidate(group);
|
|
78
|
+
addCandidate(prop);
|
|
79
|
+
addCandidate(dashProp);
|
|
80
|
+
const groupName = groupCandidates.find((group) => tokenPaths.has(`${group}.${rawValue}`));
|
|
81
|
+
if (groupName && !isClassnameFirst) mutableInput[prop] = toTokenVar(`${groupName}.${rawValue.replace("$$.token.", "")}`);
|
|
74
82
|
}
|
|
75
83
|
}
|
|
76
84
|
};
|