@codefast/cli 0.5.0-canary.5 → 0.5.0-canary.6

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 (274) hide show
  1. package/README.md +106 -480
  2. package/dist/arrange/analyze.js +25 -0
  3. package/dist/arrange/analyze.js.map +1 -0
  4. package/dist/arrange/cli-schema.js +29 -0
  5. package/dist/arrange/cli-schema.js.map +1 -0
  6. package/dist/arrange/command.js +170 -0
  7. package/dist/arrange/command.js.map +1 -0
  8. package/dist/arrange/domain/analyze-service.js +122 -0
  9. package/dist/arrange/domain/analyze-service.js.map +1 -0
  10. package/dist/arrange/domain/ast/ast-node.js +240 -0
  11. package/dist/arrange/domain/ast/ast-node.js.map +1 -0
  12. package/dist/arrange/domain/ast/collectors-cn.js +81 -0
  13. package/dist/arrange/domain/ast/collectors-cn.js.map +1 -0
  14. package/dist/arrange/domain/ast/collectors-jsx.js +24 -0
  15. package/dist/arrange/domain/ast/collectors-jsx.js.map +1 -0
  16. package/dist/arrange/domain/ast/collectors-tv.js +319 -0
  17. package/dist/arrange/domain/ast/collectors-tv.js.map +1 -0
  18. package/dist/arrange/domain/ast/helpers.js +151 -0
  19. package/dist/arrange/domain/ast/helpers.js.map +1 -0
  20. package/dist/arrange/domain/ast/simplify-targets.js +161 -0
  21. package/dist/arrange/domain/ast/simplify-targets.js.map +1 -0
  22. package/dist/arrange/domain/ast/targets.js +182 -0
  23. package/dist/arrange/domain/ast/targets.js.map +1 -0
  24. package/dist/arrange/domain/constants.js +225 -0
  25. package/dist/arrange/domain/constants.js.map +1 -0
  26. package/dist/arrange/domain/grouping-service.js +128 -0
  27. package/dist/arrange/domain/grouping-service.js.map +1 -0
  28. package/dist/arrange/domain/grouping.js +435 -0
  29. package/dist/arrange/domain/grouping.js.map +1 -0
  30. package/dist/arrange/domain/imports.js +160 -0
  31. package/dist/arrange/domain/imports.js.map +1 -0
  32. package/dist/arrange/domain/source-text-formatters.js +100 -0
  33. package/dist/arrange/domain/source-text-formatters.js.map +1 -0
  34. package/dist/arrange/domain/tailwind-token.js +50 -0
  35. package/dist/arrange/domain/tailwind-token.js.map +1 -0
  36. package/dist/arrange/domain/token-classifier.js +448 -0
  37. package/dist/arrange/domain/token-classifier.js.map +1 -0
  38. package/dist/arrange/domain/types.js +11 -0
  39. package/dist/arrange/domain/types.js.map +1 -0
  40. package/dist/arrange/output.js +120 -0
  41. package/dist/arrange/output.js.map +1 -0
  42. package/dist/arrange/process-file.js +44 -0
  43. package/dist/arrange/process-file.js.map +1 -0
  44. package/dist/arrange/resolve-target.js +33 -0
  45. package/dist/arrange/resolve-target.js.map +1 -0
  46. package/dist/arrange/scan-target.js +30 -0
  47. package/dist/arrange/scan-target.js.map +1 -0
  48. package/dist/arrange/simplify-process-file.js +29 -0
  49. package/dist/arrange/simplify-process-file.js.map +1 -0
  50. package/dist/arrange/simplify-sync.js +29 -0
  51. package/dist/arrange/simplify-sync.js.map +1 -0
  52. package/dist/arrange/source-parse.js +17 -0
  53. package/dist/arrange/source-parse.js.map +1 -0
  54. package/dist/arrange/suggest.js +14 -0
  55. package/dist/arrange/suggest.js.map +1 -0
  56. package/dist/arrange/sync.js +48 -0
  57. package/dist/arrange/sync.js.map +1 -0
  58. package/dist/arrange/typescript-ast-translator.js +455 -0
  59. package/dist/arrange/typescript-ast-translator.js.map +1 -0
  60. package/dist/arrange/workspace.js +31 -0
  61. package/dist/arrange/workspace.js.map +1 -0
  62. package/dist/audit/cli-schema.js +22 -0
  63. package/dist/audit/cli-schema.js.map +1 -0
  64. package/dist/audit/command.js +60 -0
  65. package/dist/audit/command.js.map +1 -0
  66. package/dist/audit/domain/audit-file.js +101 -0
  67. package/dist/audit/domain/audit-file.js.map +1 -0
  68. package/dist/audit/domain/mappings.js +103 -0
  69. package/dist/audit/domain/mappings.js.map +1 -0
  70. package/dist/audit/domain/tokenize.js +83 -0
  71. package/dist/audit/domain/tokenize.js.map +1 -0
  72. package/dist/audit/domain/types.js +2 -0
  73. package/dist/audit/domain/types.js.map +1 -0
  74. package/dist/audit/output.js +44 -0
  75. package/dist/audit/output.js.map +1 -0
  76. package/dist/audit/prepare.js +42 -0
  77. package/dist/audit/prepare.js.map +1 -0
  78. package/dist/audit/run.js +57 -0
  79. package/dist/audit/run.js.map +1 -0
  80. package/dist/{bin.mjs → bin.js} +2 -4
  81. package/dist/bin.js.map +1 -0
  82. package/dist/cli.js +45 -0
  83. package/dist/cli.js.map +1 -0
  84. package/dist/core/cli/format-error.js +19 -0
  85. package/dist/core/cli/format-error.js.map +1 -0
  86. package/dist/core/cli/global-options.js +10 -0
  87. package/dist/core/cli/global-options.js.map +1 -0
  88. package/dist/core/cli/positional.js +9 -0
  89. package/dist/core/cli/positional.js.map +1 -0
  90. package/dist/core/cli/result-handle.js +69 -0
  91. package/dist/core/cli/result-handle.js.map +1 -0
  92. package/dist/core/config/loader.js +88 -0
  93. package/dist/core/config/loader.js.map +1 -0
  94. package/dist/core/config/schema.js +97 -0
  95. package/dist/core/config/schema.js.map +1 -0
  96. package/dist/core/config/warnings.js +12 -0
  97. package/dist/core/config/warnings.js.map +1 -0
  98. package/dist/core/config.js +18 -0
  99. package/dist/core/config.js.map +1 -0
  100. package/dist/core/errors.js +58 -0
  101. package/dist/core/errors.js.map +1 -0
  102. package/dist/core/exit-codes.js +15 -0
  103. package/dist/core/exit-codes.js.map +1 -0
  104. package/dist/core/filesystem/node.js +33 -0
  105. package/dist/core/filesystem/node.js.map +1 -0
  106. package/dist/core/filesystem/port.js +2 -0
  107. package/dist/core/filesystem/port.js.map +1 -0
  108. package/dist/core/glob.js +20 -0
  109. package/dist/core/glob.js.map +1 -0
  110. package/dist/core/logger.js +13 -0
  111. package/dist/core/logger.js.map +1 -0
  112. package/dist/core/result.js +16 -0
  113. package/dist/core/result.js.map +1 -0
  114. package/dist/core/schema-parse.js +21 -0
  115. package/dist/core/schema-parse.js.map +1 -0
  116. package/dist/core/source-text-edit.js +62 -0
  117. package/dist/core/source-text-edit.js.map +1 -0
  118. package/dist/core/verbose-diagnostics.js +9 -0
  119. package/dist/core/verbose-diagnostics.js.map +1 -0
  120. package/dist/core/workspace/resolver.js +208 -0
  121. package/dist/core/workspace/resolver.js.map +1 -0
  122. package/dist/core/workspace/typescript-walk.js +41 -0
  123. package/dist/core/workspace/typescript-walk.js.map +1 -0
  124. package/dist/mirror/cli-result.js +20 -0
  125. package/dist/mirror/cli-result.js.map +1 -0
  126. package/dist/mirror/cli-schema.js +11 -0
  127. package/dist/mirror/cli-schema.js.map +1 -0
  128. package/dist/mirror/command.js +73 -0
  129. package/dist/mirror/command.js.map +1 -0
  130. package/dist/mirror/dist-filesystem-impl.js +53 -0
  131. package/dist/mirror/dist-filesystem-impl.js.map +1 -0
  132. package/dist/mirror/domain/constants.js +21 -0
  133. package/dist/mirror/domain/constants.js.map +1 -0
  134. package/dist/mirror/domain/dirent-guard.js +16 -0
  135. package/dist/mirror/domain/dirent-guard.js.map +1 -0
  136. package/dist/mirror/domain/dist-filesystem.js +2 -0
  137. package/dist/mirror/domain/dist-filesystem.js.map +1 -0
  138. package/dist/mirror/domain/errors.js +19 -0
  139. package/dist/mirror/domain/errors.js.map +1 -0
  140. package/dist/mirror/domain/exports.js +284 -0
  141. package/dist/mirror/domain/exports.js.map +1 -0
  142. package/dist/mirror/domain/package-display-name.js +10 -0
  143. package/dist/mirror/domain/package-display-name.js.map +1 -0
  144. package/dist/mirror/domain/path-normalizer.js +8 -0
  145. package/dist/mirror/domain/path-normalizer.js.map +1 -0
  146. package/dist/mirror/domain/types.js +2 -0
  147. package/dist/mirror/domain/types.js.map +1 -0
  148. package/dist/mirror/output.js +47 -0
  149. package/dist/mirror/output.js.map +1 -0
  150. package/dist/mirror/package-path.js +40 -0
  151. package/dist/mirror/package-path.js.map +1 -0
  152. package/dist/mirror/prepare.js +37 -0
  153. package/dist/mirror/prepare.js.map +1 -0
  154. package/dist/mirror/supplement-exports.js +157 -0
  155. package/dist/mirror/supplement-exports.js.map +1 -0
  156. package/dist/mirror/sync-reporter.js +125 -0
  157. package/dist/mirror/sync-reporter.js.map +1 -0
  158. package/dist/mirror/sync-types.js +2 -0
  159. package/dist/mirror/sync-types.js.map +1 -0
  160. package/dist/mirror/sync-workspace-package.js +117 -0
  161. package/dist/mirror/sync-workspace-package.js.map +1 -0
  162. package/dist/mirror/sync.js +90 -0
  163. package/dist/mirror/sync.js.map +1 -0
  164. package/dist/mirror/write-exports.js +145 -0
  165. package/dist/mirror/write-exports.js.map +1 -0
  166. package/dist/tag/cli-result.js +12 -0
  167. package/dist/tag/cli-result.js.map +1 -0
  168. package/dist/tag/cli-schema.js +13 -0
  169. package/dist/tag/cli-schema.js.map +1 -0
  170. package/dist/tag/command.js +69 -0
  171. package/dist/tag/command.js.map +1 -0
  172. package/dist/tag/domain/types.js +2 -0
  173. package/dist/tag/domain/types.js.map +1 -0
  174. package/dist/tag/output.js +101 -0
  175. package/dist/tag/output.js.map +1 -0
  176. package/dist/tag/prepare.js +30 -0
  177. package/dist/tag/prepare.js.map +1 -0
  178. package/dist/tag/resolve-target-path.js +14 -0
  179. package/dist/tag/resolve-target-path.js.map +1 -0
  180. package/dist/tag/since-writer.js +231 -0
  181. package/dist/tag/since-writer.js.map +1 -0
  182. package/dist/tag/sync.js +166 -0
  183. package/dist/tag/sync.js.map +1 -0
  184. package/dist/tag/target-candidates.js +79 -0
  185. package/dist/tag/target-candidates.js.map +1 -0
  186. package/dist/tag/target-runner.js +25 -0
  187. package/dist/tag/target-runner.js.map +1 -0
  188. package/dist/tag/version-resolver.js +28 -0
  189. package/dist/tag/version-resolver.js.map +1 -0
  190. package/package.json +25 -20
  191. package/dist/arrange/analyze.mjs +0 -24
  192. package/dist/arrange/cli-schema.mjs +0 -27
  193. package/dist/arrange/command.mjs +0 -130
  194. package/dist/arrange/domain/analyze-service.mjs +0 -102
  195. package/dist/arrange/domain/ast/ast-node.mjs +0 -215
  196. package/dist/arrange/domain/ast/collectors-cn.mjs +0 -64
  197. package/dist/arrange/domain/ast/collectors-jsx.mjs +0 -23
  198. package/dist/arrange/domain/ast/collectors-tv.mjs +0 -189
  199. package/dist/arrange/domain/ast/helpers.mjs +0 -108
  200. package/dist/arrange/domain/ast/simplify-targets.mjs +0 -109
  201. package/dist/arrange/domain/ast/targets.mjs +0 -134
  202. package/dist/arrange/domain/constants.mjs +0 -213
  203. package/dist/arrange/domain/grouping-service.mjs +0 -121
  204. package/dist/arrange/domain/grouping.mjs +0 -338
  205. package/dist/arrange/domain/imports.mjs +0 -107
  206. package/dist/arrange/domain/source-text-formatters.mjs +0 -88
  207. package/dist/arrange/domain/tailwind-token.mjs +0 -40
  208. package/dist/arrange/domain/token-classifier.mjs +0 -218
  209. package/dist/arrange/domain/types.mjs +0 -1
  210. package/dist/arrange/output.mjs +0 -87
  211. package/dist/arrange/process-file.mjs +0 -42
  212. package/dist/arrange/resolve-target.mjs +0 -24
  213. package/dist/arrange/scan-target.mjs +0 -29
  214. package/dist/arrange/simplify-process-file.mjs +0 -35
  215. package/dist/arrange/simplify-sync.mjs +0 -32
  216. package/dist/arrange/source-parse.mjs +0 -18
  217. package/dist/arrange/suggest.mjs +0 -15
  218. package/dist/arrange/sync.mjs +0 -51
  219. package/dist/arrange/typescript-ast-translator.mjs +0 -354
  220. package/dist/arrange/workspace.mjs +0 -31
  221. package/dist/cli.mjs +0 -34
  222. package/dist/core/cli/format-error.mjs +0 -15
  223. package/dist/core/cli/global-options.mjs +0 -10
  224. package/dist/core/cli/positional.mjs +0 -11
  225. package/dist/core/cli/result-handle.mjs +0 -51
  226. package/dist/core/config/loader.mjs +0 -79
  227. package/dist/core/config/schema.mjs +0 -60
  228. package/dist/core/config/warnings.mjs +0 -12
  229. package/dist/core/config.mjs +0 -19
  230. package/dist/core/errors.mjs +0 -35
  231. package/dist/core/exit-codes.mjs +0 -17
  232. package/dist/core/filesystem/node.mjs +0 -32
  233. package/dist/core/filesystem/port.mjs +0 -1
  234. package/dist/core/glob.mjs +0 -20
  235. package/dist/core/logger.mjs +0 -15
  236. package/dist/core/result.mjs +0 -21
  237. package/dist/core/schema-parse.mjs +0 -18
  238. package/dist/core/source-text-edit.mjs +0 -56
  239. package/dist/core/verbose-diagnostics.mjs +0 -11
  240. package/dist/core/workspace/resolver.mjs +0 -177
  241. package/dist/core/workspace/typescript-walk.mjs +0 -36
  242. package/dist/mirror/cli-result.mjs +0 -22
  243. package/dist/mirror/cli-schema.mjs +0 -13
  244. package/dist/mirror/command.mjs +0 -58
  245. package/dist/mirror/dist-filesystem-impl.mjs +0 -42
  246. package/dist/mirror/domain/constants.mjs +0 -31
  247. package/dist/mirror/domain/dirent-guard.mjs +0 -16
  248. package/dist/mirror/domain/dist-filesystem.mjs +0 -1
  249. package/dist/mirror/domain/errors.mjs +0 -21
  250. package/dist/mirror/domain/exports.mjs +0 -226
  251. package/dist/mirror/domain/package-display-name.mjs +0 -12
  252. package/dist/mirror/domain/path-normalizer.mjs +0 -10
  253. package/dist/mirror/domain/types.mjs +0 -1
  254. package/dist/mirror/output.mjs +0 -48
  255. package/dist/mirror/package-path.mjs +0 -32
  256. package/dist/mirror/prepare.mjs +0 -33
  257. package/dist/mirror/supplement-exports.mjs +0 -114
  258. package/dist/mirror/sync-reporter.mjs +0 -107
  259. package/dist/mirror/sync-types.mjs +0 -1
  260. package/dist/mirror/sync-workspace-package.mjs +0 -109
  261. package/dist/mirror/sync.mjs +0 -88
  262. package/dist/mirror/write-exports.mjs +0 -94
  263. package/dist/tag/cli-result.mjs +0 -11
  264. package/dist/tag/cli-schema.mjs +0 -15
  265. package/dist/tag/command.mjs +0 -56
  266. package/dist/tag/domain/types.mjs +0 -1
  267. package/dist/tag/output.mjs +0 -87
  268. package/dist/tag/prepare.mjs +0 -29
  269. package/dist/tag/resolve-target-path.mjs +0 -12
  270. package/dist/tag/since-writer.mjs +0 -131
  271. package/dist/tag/sync.mjs +0 -149
  272. package/dist/tag/target-candidates.mjs +0 -68
  273. package/dist/tag/target-runner.mjs +0 -26
  274. package/dist/tag/version-resolver.mjs +0 -25
@@ -0,0 +1,160 @@
1
+ import { forEachDomainChild, isDomainIdentifier, isDomainImportDeclaration, isDomainNamedImports, isDomainStringLiteral, } from "#/arrange/domain/ast/ast-node";
2
+ import { endAfterOptionalCommaFollowingInSource } from "#/core/source-text-edit";
3
+ function sourceFileImportsCn(sourceFile) {
4
+ for (const statement of sourceFile.statements) {
5
+ if (!isDomainImportDeclaration(statement) || !statement.importClause) {
6
+ continue;
7
+ }
8
+ const clause = statement.importClause;
9
+ if (clause.name?.text === "cn") {
10
+ return true;
11
+ }
12
+ if (clause.namedBindings && isDomainNamedImports(clause.namedBindings)) {
13
+ for (const importedBinding of clause.namedBindings.elements) {
14
+ if (importedBinding.name.text === "cn") {
15
+ return true;
16
+ }
17
+ }
18
+ }
19
+ }
20
+ return false;
21
+ }
22
+ /**
23
+ * Resolve the module specifier used when injecting a `cn` import into a file.
24
+ */
25
+ function cnModuleSpecifierForFile(filePath, override) {
26
+ void filePath;
27
+ if (override) {
28
+ return override;
29
+ }
30
+ return "@codefast/tailwind-variants";
31
+ }
32
+ function findImportDeclarationFromModule(sourceFile, moduleSpecifier) {
33
+ for (const statement of sourceFile.statements) {
34
+ if (!isDomainImportDeclaration(statement)) {
35
+ continue;
36
+ }
37
+ const spec = statement.moduleSpecifier;
38
+ if (isDomainStringLiteral(spec) && spec.text === moduleSpecifier) {
39
+ return statement;
40
+ }
41
+ }
42
+ return undefined;
43
+ }
44
+ function cnIsUsedInBody(node) {
45
+ if (isDomainIdentifier(node) && node.text === "cn") {
46
+ return true;
47
+ }
48
+ let found = false;
49
+ forEachDomainChild(node, (child) => {
50
+ if (!found) {
51
+ found = cnIsUsedInBody(child);
52
+ }
53
+ });
54
+ return found;
55
+ }
56
+ function removeCnSpecifier(sourceText, specifier, allSpecifiers) {
57
+ const idx = allSpecifiers.indexOf(specifier);
58
+ if (idx === 0) {
59
+ // First specifier: remove "cn, " up to the start of the next one
60
+ const next = allSpecifiers[1];
61
+ if (!next) {
62
+ return sourceText;
63
+ }
64
+ return sourceText.slice(0, specifier.pos) + sourceText.slice(next.pos);
65
+ }
66
+ // Non-first specifier: remove from end of previous specifier to end of cn specifier
67
+ // (covers the ", cn" including any trailing comma)
68
+ const prev = allSpecifiers[idx - 1];
69
+ if (!prev) {
70
+ return sourceText;
71
+ }
72
+ const endWithTrailingComma = endAfterOptionalCommaFollowingInSource(sourceText, specifier.end);
73
+ return sourceText.slice(0, prev.end) + sourceText.slice(endWithTrailingComma);
74
+ }
75
+ /**
76
+ * After simplify rewrites, drop the `cn` import specifier when `cn` is no
77
+ * longer referenced anywhere outside the import declarations.
78
+ *
79
+ * @since 0.3.16-canary.0
80
+ */
81
+ export function dropCnImportIfUnused(sourceFile) {
82
+ const sourceText = sourceFile.text;
83
+ // Check if cn is still used in the file body (skip import statements)
84
+ for (const stmt of sourceFile.statements) {
85
+ if (isDomainImportDeclaration(stmt)) {
86
+ continue;
87
+ }
88
+ if (cnIsUsedInBody(stmt)) {
89
+ return sourceText;
90
+ }
91
+ }
92
+ // Find the import declaration that contains cn
93
+ for (const stmt of sourceFile.statements) {
94
+ if (!isDomainImportDeclaration(stmt) || !stmt.importClause) {
95
+ continue;
96
+ }
97
+ const clause = stmt.importClause;
98
+ if (!clause.namedBindings || !isDomainNamedImports(clause.namedBindings)) {
99
+ continue;
100
+ }
101
+ const elements = clause.namedBindings.elements;
102
+ const cnSpecifier = elements.find((el) => el.name.text === "cn");
103
+ if (!cnSpecifier) {
104
+ continue;
105
+ }
106
+ if (elements.length === 1) {
107
+ // cn is the only named import — remove the entire import line (including trailing newline)
108
+ const lineEnd = sourceText.indexOf("\n", stmt.end);
109
+ return (sourceText.slice(0, stmt.pos) + (lineEnd !== -1 ? sourceText.slice(lineEnd + 1) : sourceText.slice(stmt.end)));
110
+ }
111
+ return removeCnSpecifier(sourceText, cnSpecifier, elements);
112
+ }
113
+ return sourceText;
114
+ }
115
+ /**
116
+ * @since 0.3.16-canary.0
117
+ */
118
+ export function ensureCnImport(sourceFile, cnImportOverride) {
119
+ const sourceText = sourceFile.text;
120
+ if (sourceFileImportsCn(sourceFile)) {
121
+ return sourceText;
122
+ }
123
+ const moduleSpecifier = cnModuleSpecifierForFile(sourceFile.fileName, cnImportOverride);
124
+ const decl = findImportDeclarationFromModule(sourceFile, moduleSpecifier);
125
+ if (decl?.importClause &&
126
+ !decl.importClause.isTypeOnly &&
127
+ decl.importClause.namedBindings &&
128
+ isDomainNamedImports(decl.importClause.namedBindings)) {
129
+ const elements = decl.importClause.namedBindings.elements;
130
+ if (elements.length > 0) {
131
+ const firstElement = elements[0];
132
+ if (firstElement === undefined) {
133
+ return sourceText;
134
+ }
135
+ const pos = firstElement.pos;
136
+ return `${sourceText.slice(0, pos)}cn, ${sourceText.slice(pos)}`;
137
+ }
138
+ }
139
+ const importLine = `import { cn } from "${moduleSpecifier}";`;
140
+ let firstImport = -1;
141
+ for (const statement of sourceFile.statements) {
142
+ if (isDomainImportDeclaration(statement)) {
143
+ firstImport = statement.pos;
144
+ break;
145
+ }
146
+ }
147
+ const useClient = /^["']use client["'];?\s*\r?\n/.exec(sourceText);
148
+ let insertAt;
149
+ if (useClient) {
150
+ insertAt = useClient[0].length;
151
+ }
152
+ else if (firstImport !== -1) {
153
+ insertAt = firstImport;
154
+ }
155
+ else {
156
+ insertAt = 0;
157
+ }
158
+ return `${sourceText.slice(0, insertAt)}${importLine}\n${sourceText.slice(insertAt)}`;
159
+ }
160
+ //# sourceMappingURL=imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../../src/arrange/domain/imports.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,sCAAsC,EAAE,MAAM,yBAAyB,CAAC;AAEjF,SAAS,mBAAmB,CAAC,UAA4B;IACvD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YACrE,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC;QACtC,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,IAAI,oBAAoB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACvE,KAAK,MAAM,eAAe,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;gBAC5D,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACvC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,QAAgB,EAAE,QAAiB;IACnE,KAAK,QAAQ,CAAC;IACd,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,6BAA6B,CAAC;AACvC,CAAC;AAED,SAAS,+BAA+B,CAAC,UAA4B,EAAE,eAAuB;IAC5F,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,eAAe,CAAC;QACvC,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACjE,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,IAAmB;IACzC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,kBAAkB,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CACxB,UAAkB,EAClB,SAAgC,EAChC,aAAmD;IAEnD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,iEAAiE;QACjE,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzE,CAAC;IACD,oFAAoF;IACpF,mDAAmD;IACnD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,oBAAoB,GAAG,sCAAsC,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/F,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAChF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAA4B;IAC/D,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC;IAEnC,sEAAsE;IACtE,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QACzC,IAAI,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,SAAS;QACX,CAAC;QACD,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QACzC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACzE,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;QAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,2FAA2F;YAC3F,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACnD,OAAO,CACL,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAC9G,CAAC;QACJ,CAAC;QAED,OAAO,iBAAiB,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAA4B,EAAE,gBAAyB;IACpF,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC;IACnC,IAAI,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,eAAe,GAAG,wBAAwB,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACxF,MAAM,IAAI,GAAG,+BAA+B,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAE1E,IACE,IAAI,EAAE,YAAY;QAClB,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU;QAC7B,IAAI,CAAC,YAAY,CAAC,aAAa;QAC/B,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EACrD,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC;QAC1D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;YAC7B,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnE,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,uBAAuB,eAAe,IAAI,CAAC;IAE9D,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC;YAC5B,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,+BAA+B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnE,IAAI,QAAgB,CAAC;IACrB,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjC,CAAC;SAAM,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QAC9B,QAAQ,GAAG,WAAW,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,UAAU,KAAK,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;AACxF,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { indentOfLineContaining } from "#/core/source-text-edit";
2
+ /**
3
+ * @since 0.3.16-canary.0
4
+ */
5
+ export function escapeTsStringLiteralContent(group) {
6
+ return group.replaceAll("\\", "\\\\").replaceAll('"', '\\"');
7
+ }
8
+ /** Trailing comma on multiline Tailwind group lists (matches prior `cn` / `tv` array style). */
9
+ function commaAfterTailwindGroupLine(groupIndex, groupCount) {
10
+ return groupIndex < groupCount - 1 || groupCount > 1 ? "," : "";
11
+ }
12
+ /**
13
+ * Multiline fragment for use *inside* an existing `cn(...)` — replaces one
14
+ * string argument with several, without producing `cn(cn(...))`.
15
+ */
16
+ function formatCnArguments(groups, options) {
17
+ const indent = options?.indent ?? " ";
18
+ const commaAfterLast = options?.commaAfterLastGroup ?? options?.trailingClassName ?? false;
19
+ const lines = [];
20
+ for (let i = 0; i < groups.length; i++) {
21
+ const group = groups[i];
22
+ if (group === undefined) {
23
+ throw new Error("invariant: formatCnArguments group missing");
24
+ }
25
+ const comma = i < groups.length - 1 || commaAfterLast ? "," : "";
26
+ lines.push(`${indent}"${escapeTsStringLiteralContent(group)}"${comma}`);
27
+ }
28
+ if (options?.trailingClassName) {
29
+ lines.push(`${indent}className,`);
30
+ }
31
+ return lines.join("\n");
32
+ }
33
+ /**
34
+ * @since 0.3.16-canary.0
35
+ */
36
+ export function formatCnCall(groups, options) {
37
+ const lines = ["cn("];
38
+ const commaOnEachStringLine = groups.length > 1 || Boolean(options?.trailingClassName);
39
+ for (let i = 0; i < groups.length; i++) {
40
+ const group = groups[i];
41
+ if (group === undefined) {
42
+ throw new Error("invariant: formatCnCall group missing");
43
+ }
44
+ const comma = commaOnEachStringLine ? "," : "";
45
+ lines.push(` "${escapeTsStringLiteralContent(group)}"${comma}`);
46
+ }
47
+ if (options?.trailingClassName) {
48
+ lines.push(" className,");
49
+ }
50
+ lines.push(")");
51
+ return lines.join("\n");
52
+ }
53
+ /**
54
+ * @since 0.3.16-canary.0
55
+ */
56
+ export function formatArray(groups) {
57
+ const lines = ["["];
58
+ for (let i = 0; i < groups.length; i++) {
59
+ const group = groups[i];
60
+ if (group === undefined) {
61
+ throw new Error("invariant: formatArray group missing");
62
+ }
63
+ const comma = commaAfterTailwindGroupLine(i, groups.length);
64
+ lines.push(` "${escapeTsStringLiteralContent(group)}"${comma}`);
65
+ }
66
+ lines.push("]");
67
+ return lines.join("\n");
68
+ }
69
+ /**
70
+ * Multiple string literals as sequential lines for insertion **inside** an existing array
71
+ * (e.g. `tv({ base: [ … ] })` — avoids `[[ "a", "b" ]]` when replacing one long string).
72
+ *
73
+ * @since 0.3.16-canary.0
74
+ */
75
+ export function formatArrayElementsAsSiblingLines(groups, continuationPrefix) {
76
+ const segments = [];
77
+ for (let i = 0; i < groups.length; i++) {
78
+ const group = groups[i];
79
+ if (group === undefined) {
80
+ throw new Error("invariant: formatArrayElementsAsSiblingLines group missing");
81
+ }
82
+ const comma = commaAfterTailwindGroupLine(i, groups.length);
83
+ const segment = `"${escapeTsStringLiteralContent(group)}"${comma}`;
84
+ segments.push(i === 0 ? segment : `\n${continuationPrefix}${segment}`);
85
+ }
86
+ return segments.join("");
87
+ }
88
+ /**
89
+ * @since 0.3.16-canary.0
90
+ */
91
+ export function formatJsxCnAttributeValue(groups, source, valueNodeStart) {
92
+ const baseIndent = indentOfLineContaining(source, valueNodeStart);
93
+ const argIndent = `${baseIndent} `;
94
+ const cnArgumentsBlock = formatCnArguments(groups, {
95
+ indent: argIndent,
96
+ commaAfterLastGroup: groups.length > 1,
97
+ });
98
+ return `{cn(\n${cnArgumentsBlock}\n${baseIndent})}`;
99
+ }
100
+ //# sourceMappingURL=source-text-formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-text-formatters.js","sourceRoot":"","sources":["../../../src/arrange/domain/source-text-formatters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,gGAAgG;AAChG,SAAS,2BAA2B,CAAC,UAAkB,EAAE,UAAkB;IACzE,OAAO,UAAU,GAAG,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,MAAqB,EACrB,OAIC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC;IACvC,MAAM,cAAc,GAAG,OAAO,EAAE,mBAAmB,IAAI,OAAO,EAAE,iBAAiB,IAAI,KAAK,CAAC;IAC3F,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,4BAA4B,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,OAAyC;IAC3F,MAAM,KAAK,GAAkB,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACvF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,MAAM,4BAA4B,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC/C,MAAM,KAAK,GAAkB,CAAC,GAAG,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,KAAK,GAAG,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,MAAM,4BAA4B,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,MAAqB,EAAE,kBAA0B;IACjG,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,KAAK,GAAG,2BAA2B,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACnE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,kBAAkB,GAAG,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAqB,EAAE,MAAc,EAAE,cAAsB;IACrG,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,GAAG,UAAU,IAAI,CAAC;IACpC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,EAAE;QACjD,MAAM,EAAE,SAAS;QACjB,mBAAmB,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;KACvC,CAAC,CAAC;IACH,OAAO,SAAS,gBAAgB,KAAK,UAAU,IAAI,CAAC;AACtD,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { MAX_STRIP_VARIANT_PASSES } from "#/arrange/domain/constants";
2
+ /**
3
+ * @since 0.3.16-canary.0
4
+ */
5
+ export function tokenizeClassString(classString) {
6
+ return classString.trim().split(/\s+/).filter(Boolean);
7
+ }
8
+ /**
9
+ * Index of the first `:` that separates a Tailwind variant segment from the rest.
10
+ * Colons inside `[...]` (at positive bracket depth) are ignored so selectors like
11
+ * `[&_a:hover]:text-red-500` split as `[&_a:hover]:` + `text-red-500`.
12
+ *
13
+ * @since 0.3.16-canary.0
14
+ */
15
+ export function indexOfFirstVariantColon(text) {
16
+ let depth = 0;
17
+ for (let i = 0; i < text.length; i++) {
18
+ const ch = text[i];
19
+ if (ch === "[") {
20
+ depth++;
21
+ }
22
+ else if (ch === "]") {
23
+ depth = Math.max(0, depth - 1);
24
+ }
25
+ else if (ch === ":" && depth === 0) {
26
+ return i;
27
+ }
28
+ }
29
+ return -1;
30
+ }
31
+ // Strip all variant prefixes to get the bare utility name.
32
+ // e.g. "hover:dark:md:text-sm" → "text-sm"
33
+ // e.g. "@min-[600px]:flex" → "flex"
34
+ // e.g. "[&_a:hover]:text-red-500" → "text-red-500"
35
+ /**
36
+ * @since 0.3.16-canary.0
37
+ */
38
+ export function stripVariants(token) {
39
+ let withoutVariants = token;
40
+ const maxStripVariantPasses = MAX_STRIP_VARIANT_PASSES;
41
+ for (let i = 0; i < maxStripVariantPasses; i++) {
42
+ const colonIdx = indexOfFirstVariantColon(withoutVariants);
43
+ if (colonIdx === -1) {
44
+ break;
45
+ }
46
+ withoutVariants = withoutVariants.slice(colonIdx + 1);
47
+ }
48
+ return withoutVariants;
49
+ }
50
+ //# sourceMappingURL=tailwind-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-token.js","sourceRoot":"","sources":["../../../src/arrange/domain/tailwind-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,2DAA2D;AAC3D,2CAA2C;AAC3C,oCAAoC;AACpC,mDAAmD;AACnD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,qBAAqB,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;QAC3D,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;QACD,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC"}