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.
Files changed (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -1
  3. package/dist/ai/server.cjs +1 -0
  4. package/dist/ai/server.mjs +1 -0
  5. package/dist/ai/skills.cjs +3 -0
  6. package/dist/ai/skills.mjs +3 -0
  7. package/dist/cli/tasks/init.cjs +54 -30
  8. package/dist/cli/tasks/init.mjs +54 -30
  9. package/dist/cli/templates/init.cjs +5 -5
  10. package/dist/cli/templates/init.mjs +5 -5
  11. package/dist/devtools-app/index.mjs +320 -0
  12. package/dist/devtools-app/monaco/vs/_commonjsHelpers-CT9FvmAN.js +1 -0
  13. package/dist/devtools-app/monaco/vs/abap-D-t0cyap.js +1 -0
  14. package/dist/devtools-app/monaco/vs/apex-CcIm7xu6.js +1 -0
  15. package/dist/devtools-app/monaco/vs/assets/css.worker-HnVq6Ewq.js +93 -0
  16. package/dist/devtools-app/monaco/vs/assets/editor.worker-Be8ye1pW.js +26 -0
  17. package/dist/devtools-app/monaco/vs/assets/html.worker-B51mlPHg.js +470 -0
  18. package/dist/devtools-app/monaco/vs/assets/json.worker-DKiEKt88.js +58 -0
  19. package/dist/devtools-app/monaco/vs/assets/ts.worker-CMbG-7ft.js +67731 -0
  20. package/dist/devtools-app/monaco/vs/azcli-BA0tQDCg.js +1 -0
  21. package/dist/devtools-app/monaco/vs/basic-languages/monaco.contribution.js +1 -0
  22. package/dist/devtools-app/monaco/vs/bat-C397hTD6.js +1 -0
  23. package/dist/devtools-app/monaco/vs/bicep-DF5aW17k.js +2 -0
  24. package/dist/devtools-app/monaco/vs/cameligo-plsz8qhj.js +1 -0
  25. package/dist/devtools-app/monaco/vs/clojure-Y2auQMzK.js +1 -0
  26. package/dist/devtools-app/monaco/vs/coffee-Bu45yuWE.js +1 -0
  27. package/dist/devtools-app/monaco/vs/cpp-CkKPQIni.js +1 -0
  28. package/dist/devtools-app/monaco/vs/csharp-CX28MZyh.js +1 -0
  29. package/dist/devtools-app/monaco/vs/csp-D8uWnyxW.js +1 -0
  30. package/dist/devtools-app/monaco/vs/css-CaeNmE3S.js +3 -0
  31. package/dist/devtools-app/monaco/vs/cssMode-CjiAH6dQ.js +1 -0
  32. package/dist/devtools-app/monaco/vs/cypher-DVThT8BS.js +1 -0
  33. package/dist/devtools-app/monaco/vs/dart-CmGfCvrO.js +1 -0
  34. package/dist/devtools-app/monaco/vs/dockerfile-CZqqYdch.js +1 -0
  35. package/dist/devtools-app/monaco/vs/ecl-30fUercY.js +1 -0
  36. package/dist/devtools-app/monaco/vs/editor/editor.main.css +1 -0
  37. package/dist/devtools-app/monaco/vs/editor/editor.main.js +5 -0
  38. package/dist/devtools-app/monaco/vs/editor.api-CalNCsUg.js +903 -0
  39. package/dist/devtools-app/monaco/vs/elixir-xjPaIfzF.js +1 -0
  40. package/dist/devtools-app/monaco/vs/flow9-DqtmStfK.js +1 -0
  41. package/dist/devtools-app/monaco/vs/freemarker2-Cz_sV6Md.js +3 -0
  42. package/dist/devtools-app/monaco/vs/fsharp-BOMdg4U1.js +1 -0
  43. package/dist/devtools-app/monaco/vs/go-D_hbi-Jt.js +1 -0
  44. package/dist/devtools-app/monaco/vs/graphql-CKUU4kLG.js +1 -0
  45. package/dist/devtools-app/monaco/vs/handlebars-OwglfO-1.js +1 -0
  46. package/dist/devtools-app/monaco/vs/hcl-DTaboeZW.js +1 -0
  47. package/dist/devtools-app/monaco/vs/html-Pa1xEWsY.js +1 -0
  48. package/dist/devtools-app/monaco/vs/htmlMode-Bz67EXwp.js +1 -0
  49. package/dist/devtools-app/monaco/vs/ini-CsNwO04R.js +1 -0
  50. package/dist/devtools-app/monaco/vs/java-CI4ZMsH9.js +1 -0
  51. package/dist/devtools-app/monaco/vs/javascript-PczUCGdz.js +1 -0
  52. package/dist/devtools-app/monaco/vs/jsonMode-DULH5oaX.js +7 -0
  53. package/dist/devtools-app/monaco/vs/julia-BwzEvaQw.js +1 -0
  54. package/dist/devtools-app/monaco/vs/kotlin-IUYPiTV8.js +1 -0
  55. package/dist/devtools-app/monaco/vs/language/css/monaco.contribution.js +1 -0
  56. package/dist/devtools-app/monaco/vs/language/html/monaco.contribution.js +1 -0
  57. package/dist/devtools-app/monaco/vs/language/json/monaco.contribution.js +1 -0
  58. package/dist/devtools-app/monaco/vs/language/typescript/monaco.contribution.js +1 -0
  59. package/dist/devtools-app/monaco/vs/less-C0eDYdqa.js +2 -0
  60. package/dist/devtools-app/monaco/vs/lexon-iON-Kj97.js +1 -0
  61. package/dist/devtools-app/monaco/vs/liquid-DqKjdPGy.js +1 -0
  62. package/dist/devtools-app/monaco/vs/loader.js +1368 -0
  63. package/dist/devtools-app/monaco/vs/lspLanguageFeatures-kM9O9rjY.js +4 -0
  64. package/dist/devtools-app/monaco/vs/lua-DtygF91M.js +1 -0
  65. package/dist/devtools-app/monaco/vs/m3-CsR4AuFi.js +1 -0
  66. package/dist/devtools-app/monaco/vs/markdown-C_rD0bIw.js +1 -0
  67. package/dist/devtools-app/monaco/vs/mdx-DEWtB1K5.js +1 -0
  68. package/dist/devtools-app/monaco/vs/mips-CiYP61RB.js +1 -0
  69. package/dist/devtools-app/monaco/vs/monaco.contribution-D2OdxNBt.js +1 -0
  70. package/dist/devtools-app/monaco/vs/monaco.contribution-DO3azKX8.js +1 -0
  71. package/dist/devtools-app/monaco/vs/monaco.contribution-EcChJV6a.js +1 -0
  72. package/dist/devtools-app/monaco/vs/monaco.contribution-qLAYrEOP.js +1 -0
  73. package/dist/devtools-app/monaco/vs/msdax-C38-sJlp.js +1 -0
  74. package/dist/devtools-app/monaco/vs/mysql-CdtbpvbG.js +1 -0
  75. package/dist/devtools-app/monaco/vs/nls.messages-loader.js +1 -0
  76. package/dist/devtools-app/monaco/vs/nls.messages.cs.js.js +17 -0
  77. package/dist/devtools-app/monaco/vs/nls.messages.de.js.js +17 -0
  78. package/dist/devtools-app/monaco/vs/nls.messages.es.js.js +17 -0
  79. package/dist/devtools-app/monaco/vs/nls.messages.fr.js.js +15 -0
  80. package/dist/devtools-app/monaco/vs/nls.messages.it.js.js +15 -0
  81. package/dist/devtools-app/monaco/vs/nls.messages.ja.js.js +17 -0
  82. package/dist/devtools-app/monaco/vs/nls.messages.js.js +10 -0
  83. package/dist/devtools-app/monaco/vs/nls.messages.ko.js.js +25 -0
  84. package/dist/devtools-app/monaco/vs/nls.messages.pl.js.js +17 -0
  85. package/dist/devtools-app/monaco/vs/nls.messages.pt-br.js.js +6 -0
  86. package/dist/devtools-app/monaco/vs/nls.messages.ru.js.js +17 -0
  87. package/dist/devtools-app/monaco/vs/nls.messages.tr.js.js +15 -0
  88. package/dist/devtools-app/monaco/vs/nls.messages.zh-cn.js.js +17 -0
  89. package/dist/devtools-app/monaco/vs/nls.messages.zh-tw.js.js +15 -0
  90. package/dist/devtools-app/monaco/vs/objective-c-CntZFaHX.js +1 -0
  91. package/dist/devtools-app/monaco/vs/pascal-r6kuqfl_.js +1 -0
  92. package/dist/devtools-app/monaco/vs/pascaligo-BiXoTmXh.js +1 -0
  93. package/dist/devtools-app/monaco/vs/perl-DABw_TcH.js +1 -0
  94. package/dist/devtools-app/monaco/vs/pgsql-me_jFXeX.js +1 -0
  95. package/dist/devtools-app/monaco/vs/php-D_kh-9LK.js +1 -0
  96. package/dist/devtools-app/monaco/vs/pla-VfZjczW0.js +1 -0
  97. package/dist/devtools-app/monaco/vs/postiats-BBSzz8Pk.js +1 -0
  98. package/dist/devtools-app/monaco/vs/powerquery-Dt-g_2cc.js +1 -0
  99. package/dist/devtools-app/monaco/vs/powershell-B-7ap1zc.js +1 -0
  100. package/dist/devtools-app/monaco/vs/protobuf-BmtuEB1A.js +2 -0
  101. package/dist/devtools-app/monaco/vs/pug-BRpRNeEb.js +1 -0
  102. package/dist/devtools-app/monaco/vs/python-Cr0UkIbn.js +1 -0
  103. package/dist/devtools-app/monaco/vs/qsharp-BzsFaUU9.js +1 -0
  104. package/dist/devtools-app/monaco/vs/r-f8dDdrp4.js +1 -0
  105. package/dist/devtools-app/monaco/vs/razor-BYAHOTkz.js +1 -0
  106. package/dist/devtools-app/monaco/vs/redis-fvZQY4PI.js +1 -0
  107. package/dist/devtools-app/monaco/vs/redshift-45Et0LQi.js +1 -0
  108. package/dist/devtools-app/monaco/vs/restructuredtext-C7UUFKFD.js +1 -0
  109. package/dist/devtools-app/monaco/vs/ruby-CZO8zYTz.js +1 -0
  110. package/dist/devtools-app/monaco/vs/rust-Bfetafyc.js +1 -0
  111. package/dist/devtools-app/monaco/vs/sb-3GYllVck.js +1 -0
  112. package/dist/devtools-app/monaco/vs/scala-foMgrKo1.js +1 -0
  113. package/dist/devtools-app/monaco/vs/scheme-CHdMtr7p.js +1 -0
  114. package/dist/devtools-app/monaco/vs/scss-C1cmLt9V.js +3 -0
  115. package/dist/devtools-app/monaco/vs/shell-ClXCKCEW.js +1 -0
  116. package/dist/devtools-app/monaco/vs/solidity-MZ6ExpPy.js +1 -0
  117. package/dist/devtools-app/monaco/vs/sophia-DWkuSsPQ.js +1 -0
  118. package/dist/devtools-app/monaco/vs/sparql-AUGFYSyk.js +1 -0
  119. package/dist/devtools-app/monaco/vs/sql-32GpJSV2.js +1 -0
  120. package/dist/devtools-app/monaco/vs/st-CuDFIVZ_.js +1 -0
  121. package/dist/devtools-app/monaco/vs/swift-n-2HociN.js +3 -0
  122. package/dist/devtools-app/monaco/vs/systemverilog-Ch4vA8Yt.js +1 -0
  123. package/dist/devtools-app/monaco/vs/tcl-D74tq1nH.js +1 -0
  124. package/dist/devtools-app/monaco/vs/tsMode-CZz1Umrk.js +11 -0
  125. package/dist/devtools-app/monaco/vs/twig-C6taOxMV.js +1 -0
  126. package/dist/devtools-app/monaco/vs/typescript-DfOrAzoV.js +1 -0
  127. package/dist/devtools-app/monaco/vs/typespec-D-PIh9Xw.js +1 -0
  128. package/dist/devtools-app/monaco/vs/vb-Dyb2648j.js +1 -0
  129. package/dist/devtools-app/monaco/vs/wgsl-BhLXMOR0.js +298 -0
  130. package/dist/devtools-app/monaco/vs/workers-DcJshg-q.js +1 -0
  131. package/dist/devtools-app/monaco/vs/xml-CdsdnY8S.js +1 -0
  132. package/dist/devtools-app/monaco/vs/yaml-DYGvmE88.js +1 -0
  133. package/dist/eslint-plugin/index.cjs +5 -2
  134. package/dist/eslint-plugin/index.mjs +5 -2
  135. package/dist/eslint-plugin/rules/prefer-unitless-values.cjs +217 -0
  136. package/dist/eslint-plugin/rules/prefer-unitless-values.mjs +217 -0
  137. package/dist/eslint-plugin/utils/api.cjs +3 -4
  138. package/dist/eslint-plugin/utils/api.mjs +2 -2
  139. package/dist/native/server.cjs +4 -4
  140. package/dist/native/server.mjs +4 -4
  141. package/dist/parser/jsx/extractCode.cjs +3 -2
  142. package/dist/parser/jsx/extractCode.mjs +3 -2
  143. package/dist/parser/jsx/extractProps.cjs +7 -1
  144. package/dist/parser/jsx/extractProps.mjs +7 -1
  145. package/dist/parser/jsx/server.cjs +13 -7
  146. package/dist/parser/jsx/server.mjs +13 -7
  147. package/dist/prop/at/shared.cjs +3 -3
  148. package/dist/prop/at/shared.mjs +3 -3
  149. package/dist/tasks/postcss.cjs +16 -5
  150. package/dist/tasks/postcss.mjs +16 -5
  151. package/dist/transform/cache.cjs +0 -3
  152. package/dist/transform/cache.mjs +0 -2
  153. package/dist/use/token/browser.cjs +17 -9
  154. package/dist/use/token/browser.mjs +18 -10
  155. package/dist/use/token/normalize.cjs +474 -0
  156. package/dist/use/token/normalize.mjs +473 -0
  157. package/dist/use/token/propMap.cjs +34 -5
  158. package/dist/use/token/propMap.mjs +34 -6
  159. package/dist/use/token/runtime-only.cjs +36 -47
  160. package/dist/use/token/runtime-only.mjs +37 -48
  161. package/dist/use/token/server.cjs +82 -15
  162. package/dist/use/token/server.mjs +83 -17
  163. package/dist/use/token/vars.cjs +14 -2
  164. package/dist/use/token/vars.mjs +15 -2
  165. 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 require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
- let boss_css_api_server = require("boss-css/api/server");
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 (0, boss_css_api_server.createApi)(await (0, boss_css_api_config.loadConfig)(process.cwd()), true);
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 "boss-css/api/server";
2
- import { loadConfig } from "boss-css/api/config";
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;
@@ -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/cx').CxValue[]) => string
138
- cv: typeof import('boss-css/cx').cv
139
- scv: typeof import('boss-css/cx').scv
140
- sv: typeof import('boss-css/cx').sv
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 & {
@@ -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/cx').CxValue[]) => string
137
- cv: typeof import('boss-css/cx').cv
138
- scv: typeof import('boss-css/cx').scv
139
- sv: typeof import('boss-css/cx').sv
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
- if (!isIgnored && openingRegexp.test(current)) {
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
- if (!isIgnored && openingRegexp.test(current)) {
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
- return code.replace(/(.)>$/, (_, char) => char === "/" ? "/>" : `${char}/>`);
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
- return code.replace(/(.)>$/, (_, char) => char === "/" ? "/>" : `${char}/>`);
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
- settings.get("globals") && api.file.js.set("body", "jsx:globalThis", `globalThis.${settings.get("name")} = ${proxyVar}`, needsRuntimeTest);
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/cx').CxValue[]) => string
181
- cv: typeof import('boss-css/cx').cv
182
- scv: typeof import('boss-css/cx').scv
183
- sv: typeof import('boss-css/cx').sv
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/cx').CxValue }`;
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 (settings.get("globals")) api.file.js.dts.set("foot", "jsx:globals", `declare global {
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
- settings.get("globals") && api.file.js.set("body", "jsx:globalThis", `globalThis.${settings.get("name")} = ${proxyVar}`, needsRuntimeTest);
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/cx').CxValue[]) => string
180
- cv: typeof import('boss-css/cx').cv
181
- scv: typeof import('boss-css/cx').scv
182
- sv: typeof import('boss-css/cx').sv
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/cx').CxValue }`;
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 (settings.get("globals")) api.file.js.dts.set("foot", "jsx:globals", `declare global {
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 $$`);
@@ -1,13 +1,13 @@
1
1
 
2
2
  //#region src/prop/at/shared.ts
3
3
  const defaultBreakpoints = {
4
- micro: [null, 375],
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, null],
10
- device: [null, 1023]
9
+ large: [1920, 1e5],
10
+ device: [0, 1023]
11
11
  };
12
12
  const baseAtValues = [
13
13
  ["dark", "@media screen and (prefers-color-scheme: dark)"],
@@ -1,12 +1,12 @@
1
1
  //#region src/prop/at/shared.ts
2
2
  const defaultBreakpoints = {
3
- micro: [null, 375],
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, null],
9
- device: [null, 1023]
8
+ large: [1920, 1e5],
9
+ device: [0, 1023]
10
10
  };
11
11
  const baseAtValues = [
12
12
  ["dark", "@media screen and (prefers-color-scheme: dark)"],
@@ -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 onParsePromises = [];
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
- onParsePromises.push(api.trigger("onParse", value));
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(onParsePromises);
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);
@@ -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 onParsePromises = [];
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
- onParsePromises.push(api.trigger("onParse", value));
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(onParsePromises);
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);
@@ -1,6 +1,3 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- let node_fs = require("node:fs");
3
- node_fs = require_rolldown_runtime.__toESM(node_fs);
4
1
 
5
2
  //#region src/transform/cache.ts
6
3
  const cache = /* @__PURE__ */ new Map();
@@ -1,5 +1,3 @@
1
- import fs from "node:fs";
2
-
3
1
  //#region src/transform/cache.ts
4
2
  const cache = /* @__PURE__ */ new Map();
5
3
  const setCache = (path, data) => {
@@ -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] = `var(--${path.replace(/\./g, "-")})`;
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] = `var(--${path.replace(/\./g, "-")})`;
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 groupName = [
68
- require_propMap.getTokenGroupForProp(prop),
69
- require_propMap.getTokenGroupForProp(dashProp),
70
- prop,
71
- dashProp
72
- ].filter(Boolean).find((group) => tokenPaths.has(`${group}.${rawValue}`));
73
- if (groupName && !isClassnameFirst) mutableInput[prop] = `var(--${groupName}-${rawValue.replace("$$.token.", "").replace(/\./g, "-")})`;
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
  };