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

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,128 @@
1
+ /**
2
+ * Rich domain: plan Tailwind class grouping / cn-in-tv unwrap for a single file.
3
+ * Pure: only DomainSourceFile, source strings, and options — no I/O.
4
+ */
5
+ import { listAllCnCallsInsideTvInSourceFile } from "#/arrange/domain/ast/collectors-tv";
6
+ import { applyEditsDescending, buildKnownCnTvBindings, unwrapCnInsideTvCallReplacement, } from "#/arrange/domain/ast/helpers";
7
+ import { collectGroupTargets, planGroupEditForTarget, targetReplaceStart } from "#/arrange/domain/ast/targets";
8
+ function toUnwrapPlans(cnInTvCalls, sourceText) {
9
+ return cnInTvCalls
10
+ .map((call) => {
11
+ const replacement = unwrapCnInsideTvCallReplacement(call, sourceText);
12
+ if (replacement === undefined) {
13
+ return undefined;
14
+ }
15
+ return { start: call.pos, end: call.end, replacement, call };
16
+ })
17
+ .filter((plan) => plan !== undefined);
18
+ }
19
+ /**
20
+ * @since 0.3.16-canary.0
21
+ */
22
+ export function buildGroupFileUnwrapState(domainSfInitial, sourceText) {
23
+ const knownBindings = buildKnownCnTvBindings(domainSfInitial);
24
+ const cnInTvCalls = listAllCnCallsInsideTvInSourceFile(domainSfInitial, knownBindings);
25
+ const unwrapPlans = toUnwrapPlans(cnInTvCalls, sourceText);
26
+ const unwrapReplacementByCall = new Map(unwrapPlans.map((unwrapPlan) => [unwrapPlan.call, unwrapPlan.replacement]));
27
+ const unwrapEdits = unwrapPlans.filter((unwrapPlan) => sourceText.slice(unwrapPlan.start, unwrapPlan.end) !== unwrapPlan.replacement);
28
+ const textAfterUnwrap = unwrapEdits.length > 0 ? applyEditsDescending(sourceText, [...unwrapEdits]) : sourceText;
29
+ const cnInTvNoReplacement = cnInTvCalls.length - unwrapPlans.length;
30
+ return {
31
+ cnInTvCalls,
32
+ unwrapReplacementByCall,
33
+ unwrapEdits,
34
+ textAfterUnwrap,
35
+ cnInTvNoReplacement,
36
+ };
37
+ }
38
+ /**
39
+ * `domainSfGrouped` must be a parse of `unwrap.textAfterUnwrap` (same `text` as source).
40
+ * Returns `null` when there is no cn-in-tv and no grouping targets.
41
+ *
42
+ * @since 0.3.16-canary.0
43
+ */
44
+ export function tryBuildGroupFileWorkPlan(input) {
45
+ const { filePath, sourceText, domainSfInitial, domainSfGrouped, withClassName, unwrap } = input;
46
+ if (domainSfGrouped.text !== unwrap.textAfterUnwrap) {
47
+ throw new Error("Domain invariant: domainSfGrouped.text must match unwrap phase textAfterUnwrap");
48
+ }
49
+ const groupTargets = collectGroupTargets(domainSfGrouped, filePath);
50
+ if (unwrap.cnInTvCalls.length === 0 && groupTargets.length === 0) {
51
+ return null;
52
+ }
53
+ const sortedTargets = [...groupTargets].toSorted((leftTarget, rightTarget) => targetReplaceStart(rightTarget) - targetReplaceStart(leftTarget));
54
+ const plannedGroupEdits = [];
55
+ for (const groupTarget of sortedTargets) {
56
+ const plan = planGroupEditForTarget(groupTarget, unwrap.textAfterUnwrap, withClassName);
57
+ if (plan === undefined) {
58
+ continue;
59
+ }
60
+ if (unwrap.textAfterUnwrap.slice(plan.start, plan.end) === plan.replacement) {
61
+ continue;
62
+ }
63
+ plannedGroupEdits.push(plan);
64
+ }
65
+ const editSitesCount = unwrap.unwrapEdits.length + plannedGroupEdits.length;
66
+ const reportTotal = editSitesCount + unwrap.cnInTvNoReplacement;
67
+ return {
68
+ filePath,
69
+ sourceText,
70
+ textAfterUnwrap: unwrap.textAfterUnwrap,
71
+ domainSfForLineNumbers: domainSfInitial,
72
+ domainSfGrouped,
73
+ cnInTvCalls: unwrap.cnInTvCalls,
74
+ unwrapReplacementByCall: unwrap.unwrapReplacementByCall,
75
+ unwrapEdits: unwrap.unwrapEdits,
76
+ plannedGroupEdits,
77
+ cnInTvNoReplacement: unwrap.cnInTvNoReplacement,
78
+ reportTotal,
79
+ editSitesCount,
80
+ };
81
+ }
82
+ /**
83
+ * @since 0.3.16-canary.0
84
+ */
85
+ export function groupFileDryRunNoEdits(filePath) {
86
+ return { filePath, totalFound: 0, changed: 0 };
87
+ }
88
+ /**
89
+ * @since 0.3.16-canary.0
90
+ */
91
+ export function groupFilePreviewTotals(work) {
92
+ return {
93
+ filePath: work.filePath,
94
+ totalFound: work.reportTotal,
95
+ changed: 0,
96
+ };
97
+ }
98
+ /**
99
+ * @since 0.3.16-canary.0
100
+ */
101
+ export function mergeGroupFileBodyText(work) {
102
+ const groupEdits = work.plannedGroupEdits.map((plannedEdit) => ({
103
+ start: plannedEdit.start,
104
+ end: plannedEdit.end,
105
+ replacement: plannedEdit.replacement,
106
+ jsxCn: plannedEdit.jsxCn,
107
+ }));
108
+ return groupEdits.length > 0 ? applyEditsDescending(work.textAfterUnwrap, groupEdits) : work.textAfterUnwrap;
109
+ }
110
+ /**
111
+ * @since 0.3.16-canary.0
112
+ */
113
+ export function groupFileEditsTouchJsxCn(work) {
114
+ return work.plannedGroupEdits.some((plannedEdit) => plannedEdit.jsxCn);
115
+ }
116
+ /**
117
+ * @since 0.3.16-canary.0
118
+ */
119
+ export function countPersistedGroupFileEdits(work) {
120
+ return work.unwrapEdits.length + work.plannedGroupEdits.length;
121
+ }
122
+ /**
123
+ * @since 0.3.16-canary.0
124
+ */
125
+ export function groupFileWorkHasNothingToReport(work) {
126
+ return work.editSitesCount === 0 && work.cnInTvNoReplacement === 0;
127
+ }
128
+ //# sourceMappingURL=grouping-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouping-service.js","sourceRoot":"","sources":["../../../src/arrange/domain/grouping-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,435 @@
1
+ import { BUCKET_ORDER, MAX_GROUPS_BASE, MAX_GROUPS_CAP, MAX_GROUPS_HEADROOM, MIN_GROUP_TOKENS, } from "#/arrange/domain/constants";
2
+ import { stripVariants, tokenizeClassString } from "#/arrange/domain/tailwind-token";
3
+ import { bucketsCompatible, bucketsMergeCompatible, classifyToken, compositeSecondaryOrder, selectorKey, stateKey, } from "#/arrange/domain/token-classifier";
4
+ /**
5
+ * `cn()` grouping: bucket sequence is {@link BUCKET_ORDER} only; tokens are classified with
6
+ * {@link classifyToken}. Comparators here (`compareClassifiedTailwindTokensForCnGrouping`, …)
7
+ * are the single place for variant-aware sort — do not reintroduce parallel bucket ordering.
8
+ */
9
+ /**
10
+ * Separates bucket id from variant key in {@link buildFirstVariantKeySourceIndex} map keys.
11
+ */
12
+ const VARIANT_BUCKET_KEY_SEP = "\u0000";
13
+ function isVariantKeyedBucket(bucket) {
14
+ return bucket === "selector" || bucket === "state" || bucket === "starting";
15
+ }
16
+ function variantGroupKey(bucket, classToken) {
17
+ return bucket === "selector" ? selectorKey(classToken) : stateKey(classToken);
18
+ }
19
+ function variantKeyedBlockMapKey(bucket, classToken) {
20
+ return `${bucket}${VARIANT_BUCKET_KEY_SEP}${variantGroupKey(bucket, classToken)}`;
21
+ }
22
+ /**
23
+ * Deterministic lexicographic order for Tailwind class tokens (and token-space signatures).
24
+ * Used wherever we need stable, locale-agnostic ASCII ordering of utility strings.
25
+ */
26
+ function compareClassTokensCanonically(left, right) {
27
+ return left.localeCompare(right);
28
+ }
29
+ /**
30
+ * First source index where each `(bucket, variantGroupKey)` appears — drives stable clustering
31
+ * in {@link suggestCnGroups} without reordering unrelated variant blocks by alphabet alone.
32
+ */
33
+ function buildFirstVariantKeySourceIndex(classified) {
34
+ const firstVariantKeySourceIndex = new Map();
35
+ for (const item of classified) {
36
+ if (!isVariantKeyedBucket(item.bucket)) {
37
+ continue;
38
+ }
39
+ const mapKey = variantKeyedBlockMapKey(item.bucket, item.classToken);
40
+ const prior = firstVariantKeySourceIndex.get(mapKey);
41
+ if (prior === undefined || item.index < prior) {
42
+ firstVariantKeySourceIndex.set(mapKey, item.index);
43
+ }
44
+ }
45
+ return firstVariantKeySourceIndex;
46
+ }
47
+ function compareClassifiedTailwindTokensForCnGrouping(left, right, firstVariantKeySourceIndex) {
48
+ const bucketOrderDiff = BUCKET_ORDER[left.bucket] - BUCKET_ORDER[right.bucket];
49
+ if (bucketOrderDiff !== 0) {
50
+ return bucketOrderDiff;
51
+ }
52
+ if (left.bucket === "composite" && right.bucket === "composite") {
53
+ const compositeOrderDiff = compositeSecondaryOrder(stripVariants(left.classToken)) -
54
+ compositeSecondaryOrder(stripVariants(right.classToken));
55
+ if (compositeOrderDiff !== 0) {
56
+ return compositeOrderDiff;
57
+ }
58
+ return left.index - right.index;
59
+ }
60
+ if (isVariantKeyedBucket(left.bucket) && isVariantKeyedBucket(right.bucket)) {
61
+ const leftMapKey = variantKeyedBlockMapKey(left.bucket, left.classToken);
62
+ const rightMapKey = variantKeyedBlockMapKey(right.bucket, right.classToken);
63
+ const leftBlockStart = firstVariantKeySourceIndex.get(leftMapKey);
64
+ const rightBlockStart = firstVariantKeySourceIndex.get(rightMapKey);
65
+ if (leftBlockStart === undefined || rightBlockStart === undefined) {
66
+ throw new Error("invariant: variant-keyed token missing block start index");
67
+ }
68
+ if (leftBlockStart !== rightBlockStart) {
69
+ return leftBlockStart - rightBlockStart;
70
+ }
71
+ const variantKeyCompare = compareClassTokensCanonically(variantGroupKey(left.bucket, left.classToken), variantGroupKey(right.bucket, right.classToken));
72
+ if (variantKeyCompare !== 0) {
73
+ return variantKeyCompare;
74
+ }
75
+ return compareClassTokensCanonically(left.classToken, right.classToken);
76
+ }
77
+ return left.index - right.index;
78
+ }
79
+ /**
80
+ * True when `staticLiteralTexts` carries the **same partition** of Tailwind tokens as
81
+ * `suggestedGroups` from {@link suggestCnGroups}, ignoring order of arguments and
82
+ * order of tokens within each chunk.
83
+ *
84
+ * @since 0.3.16-canary.0
85
+ */
86
+ export function areCnTailwindPartitionsEquivalent(staticLiteralTexts, suggestedGroups) {
87
+ const partitionSignatures = (chunks) => chunks
88
+ .map((chunk) => {
89
+ const classTokens = tokenizeClassString(chunk);
90
+ return classTokens.length === 0 ? "" : [...classTokens].toSorted(compareClassTokensCanonically).join(" ");
91
+ })
92
+ .filter((s) => s.length > 0)
93
+ .sort(compareClassTokensCanonically);
94
+ const staticPartitionSigs = partitionSignatures(staticLiteralTexts);
95
+ const suggestedPartitionSigs = partitionSignatures(suggestedGroups);
96
+ if (staticPartitionSigs.length !== suggestedPartitionSigs.length) {
97
+ return false;
98
+ }
99
+ for (let i = 0; i < staticPartitionSigs.length; i++) {
100
+ if (staticPartitionSigs[i] !== suggestedPartitionSigs[i]) {
101
+ return false;
102
+ }
103
+ }
104
+ return true;
105
+ }
106
+ /**
107
+ * Dominant bucket of a whitespace-delimited class group (for merge heuristics).
108
+ */
109
+ function dominantBucketOfGroup(groupStr) {
110
+ const counts = new Map();
111
+ for (const classToken of tokenizeClassString(groupStr)) {
112
+ const tokenBucket = classifyToken(classToken);
113
+ counts.set(tokenBucket, (counts.get(tokenBucket) ?? 0) + 1);
114
+ }
115
+ let best = "other";
116
+ let bestN = 0;
117
+ for (const [bucket, count] of counts) {
118
+ if (count > bestN) {
119
+ best = bucket;
120
+ bestN = count;
121
+ continue;
122
+ }
123
+ // Deterministic tie-break: prefer earlier render-pipeline bucket.
124
+ if (count === bestN && BUCKET_ORDER[bucket] < BUCKET_ORDER[best]) {
125
+ best = bucket;
126
+ }
127
+ }
128
+ return best;
129
+ }
130
+ /**
131
+ * Dynamic cap: more tokens → allow more groups, within [BASE, CAP].
132
+ */
133
+ function dynamicMaxGroups(tokenCount) {
134
+ const byTokens = Math.ceil(tokenCount / 2) + MAX_GROUPS_HEADROOM;
135
+ return Math.max(MAX_GROUPS_BASE, Math.min(MAX_GROUPS_CAP, byTokens));
136
+ }
137
+ /**
138
+ * Merge singleton groups (< MIN_GROUP_TOKENS tokens) into their nearest
139
+ * neighbour. Prefers merging toward a bucket-compatible neighbor.
140
+ *
141
+ * Loop termination: each iteration either splices one element (shrinking the
142
+ * array, guaranteeing progress) or finds no singleton that can merge and exits
143
+ * via `changed = false`. Two mutually-incompatible singletons both hit
144
+ * `continue` and `changed` stays false, so the loop exits without spinning.
145
+ */
146
+ function mergeSingletons(groups) {
147
+ if (groups.length <= 1) {
148
+ return groups;
149
+ }
150
+ const result = [...groups];
151
+ let changed = true;
152
+ while (changed) {
153
+ changed = false;
154
+ for (let i = 0; i < result.length; i++) {
155
+ const groupAtI = result[i];
156
+ if (groupAtI === undefined) {
157
+ throw new Error("invariant: mergeSingletons group missing");
158
+ }
159
+ if (tokenizeClassString(groupAtI).length < MIN_GROUP_TOKENS) {
160
+ if (result.length === 1) {
161
+ break;
162
+ }
163
+ const myBucket = dominantBucketOfGroup(groupAtI);
164
+ const prevGroup = i > 0 ? result[i - 1] : undefined;
165
+ const nextGroup = i < result.length - 1 ? result[i + 1] : undefined;
166
+ const prevCompat = prevGroup !== undefined && bucketsMergeCompatible(myBucket, dominantBucketOfGroup(prevGroup));
167
+ const nextCompat = nextGroup !== undefined && bucketsMergeCompatible(myBucket, dominantBucketOfGroup(nextGroup));
168
+ let mergeDir;
169
+ if (nextCompat && !prevCompat) {
170
+ mergeDir = "forward";
171
+ }
172
+ else if (prevCompat && !nextCompat) {
173
+ mergeDir = "backward";
174
+ }
175
+ else if (prevCompat && nextCompat) {
176
+ mergeDir = i < result.length - 1 ? "forward" : "backward";
177
+ }
178
+ else {
179
+ continue;
180
+ }
181
+ if (mergeDir === "forward") {
182
+ if (nextGroup === undefined) {
183
+ throw new Error("invariant: forward merge missing right group");
184
+ }
185
+ result[i + 1] = `${groupAtI} ${nextGroup}`;
186
+ }
187
+ else {
188
+ if (prevGroup === undefined) {
189
+ throw new Error("invariant: backward merge missing left group");
190
+ }
191
+ result[i - 1] = `${prevGroup} ${groupAtI}`;
192
+ }
193
+ result.splice(i, 1);
194
+ changed = true;
195
+ break;
196
+ }
197
+ }
198
+ }
199
+ return result;
200
+ }
201
+ /**
202
+ * Tie-break when two merge candidates are both {@link bucketsMergeCompatible} (same bucket or COMPATIBLE_BUCKET_SETS).
203
+ */
204
+ function capMergePenalty(leftBucket, rightBucket) {
205
+ if (leftBucket === rightBucket) {
206
+ return 0;
207
+ }
208
+ if (bucketsCompatible(leftBucket, rightBucket)) {
209
+ return 0;
210
+ }
211
+ return 500;
212
+ }
213
+ /**
214
+ * Merge adjacent groups until total count ≤ maxGroups.
215
+ * Only merges pairs allowed by {@link bucketsMergeCompatible} — never glues incompatible
216
+ * buckets (which previously defaulted to penalty 0 and merged layout+state when over cap).
217
+ *
218
+ * Complexity: O(n²) in the number of groups — each merge pass scans all remaining adjacent
219
+ * pairs. In practice `n` is bounded by {@link MAX_GROUPS_CAP} (24) and typical class strings
220
+ * are well below that, so this is not a concern for the current usage pattern. If this ever
221
+ * runs in a high-throughput batch mode, consider a priority-queue approach.
222
+ */
223
+ function capGroups(groups, maxGroups) {
224
+ const result = [...groups];
225
+ const lengths = result.map((groupStr) => tokenizeClassString(groupStr).length);
226
+ while (result.length > maxGroups) {
227
+ const mergePairCandidates = [];
228
+ for (let i = 0; i < result.length - 1; i++) {
229
+ const leftGroup = result[i];
230
+ const rightGroup = result[i + 1];
231
+ const leftLen = lengths[i];
232
+ const rightLen = lengths[i + 1];
233
+ if (leftGroup === undefined || rightGroup === undefined || leftLen === undefined || rightLen === undefined) {
234
+ throw new Error("invariant: capGroups adjacent pair missing");
235
+ }
236
+ const dominantLeft = dominantBucketOfGroup(leftGroup);
237
+ const dominantRight = dominantBucketOfGroup(rightGroup);
238
+ if (!bucketsMergeCompatible(dominantLeft, dominantRight)) {
239
+ continue;
240
+ }
241
+ mergePairCandidates.push({
242
+ i,
243
+ size: leftLen + rightLen,
244
+ penalty: capMergePenalty(dominantLeft, dominantRight),
245
+ });
246
+ }
247
+ if (mergePairCandidates.length === 0) {
248
+ break;
249
+ }
250
+ const firstCandidate = mergePairCandidates[0];
251
+ if (firstCandidate === undefined) {
252
+ throw new Error("invariant: merge candidates empty");
253
+ }
254
+ let best = firstCandidate;
255
+ for (const candidate of mergePairCandidates) {
256
+ if (candidate.penalty < best.penalty || (candidate.penalty === best.penalty && candidate.size < best.size)) {
257
+ best = candidate;
258
+ }
259
+ }
260
+ const bestIdx = best.i;
261
+ const leftMerge = result[bestIdx];
262
+ const rightMerge = result[bestIdx + 1];
263
+ const leftMergeLen = lengths[bestIdx];
264
+ const rightMergeLen = lengths[bestIdx + 1];
265
+ if (leftMerge === undefined ||
266
+ rightMerge === undefined ||
267
+ leftMergeLen === undefined ||
268
+ rightMergeLen === undefined) {
269
+ throw new Error("invariant: capGroups best merge pair missing");
270
+ }
271
+ result[bestIdx] = `${leftMerge} ${rightMerge}`;
272
+ lengths[bestIdx] = leftMergeLen + rightMergeLen;
273
+ result.splice(bestIdx + 1, 1);
274
+ lengths.splice(bestIdx + 1, 1);
275
+ }
276
+ return result;
277
+ }
278
+ /**
279
+ * If a chunk is **only** bare `ease-*` timing (Motion), buffer it and prepend to the **first**
280
+ * **later** chunk that is predominantly `state` **and** contains some `animate-*` utility —
281
+ * skipping intermediate `state` chunks (`sm:…`, `group-data-[…]:…`, etc.) that sit between
282
+ * `ease-ui` and `data-open:animate-*`. If no such chunk exists, the ease chunk is left as-is.
283
+ */
284
+ function mergeEaseTimingIntoFollowingAnimatedState(groups) {
285
+ const result = [...groups];
286
+ let changed = true;
287
+ while (changed) {
288
+ changed = false;
289
+ for (let i = 0; i < result.length; i++) {
290
+ const chunkI = result[i];
291
+ if (chunkI === undefined) {
292
+ throw new Error("invariant: mergeEase chunk missing");
293
+ }
294
+ if (!chunkIsOnlyEaseTimingMotion(chunkI)) {
295
+ continue;
296
+ }
297
+ const easeStr = chunkI;
298
+ let target = -1;
299
+ for (let j = i + 1; j < result.length; j++) {
300
+ const chunkJ = result[j];
301
+ if (chunkJ === undefined) {
302
+ throw new Error("invariant: mergeEase following chunk missing");
303
+ }
304
+ if (dominantBucketOfGroup(chunkJ) !== "state") {
305
+ continue;
306
+ }
307
+ const classTokens = tokenizeClassString(chunkJ);
308
+ if (!classTokens.some((classToken) => stripVariants(classToken).startsWith("animate"))) {
309
+ continue;
310
+ }
311
+ target = j;
312
+ break;
313
+ }
314
+ if (target === -1) {
315
+ continue;
316
+ }
317
+ const targetChunk = result[target];
318
+ if (targetChunk === undefined) {
319
+ throw new Error("invariant: mergeEase target chunk missing");
320
+ }
321
+ result[target] = `${easeStr} ${targetChunk}`.trim();
322
+ result.splice(i, 1);
323
+ changed = true;
324
+ break;
325
+ }
326
+ }
327
+ return result;
328
+ }
329
+ function chunkIsOnlyEaseTimingMotion(groupStr) {
330
+ const classTokens = tokenizeClassString(groupStr);
331
+ if (classTokens.length === 0) {
332
+ return false;
333
+ }
334
+ return classTokens.every((classToken) => classifyToken(classToken) === "motion" && stripVariants(classToken).startsWith("ease-"));
335
+ }
336
+ /**
337
+ * @since 0.3.16-canary.0
338
+ */
339
+ export function suggestCnGroups(classString) {
340
+ const tokens = tokenizeClassString(classString);
341
+ if (tokens.length === 0) {
342
+ return [];
343
+ }
344
+ /**
345
+ * Variant-keyed buckets (`state`, `starting`, `selector`): after global bucket ordering,
346
+ * cluster tokens that share the same {@link variantGroupKey} so the same modifier stack
347
+ * (e.g. `focus-visible:`) merges one `cn()` arg regardless of interleaved unrelated
348
+ * variants. Block order follows the **first source index** of each key so unrelated
349
+ * states keep document order; within a key, `classToken` order is lexicographic for
350
+ * idempotency.
351
+ */
352
+ const classified = tokens.map((classToken, index) => ({
353
+ classToken,
354
+ bucket: classifyToken(classToken),
355
+ index,
356
+ }));
357
+ const firstVariantKeySourceIndex = buildFirstVariantKeySourceIndex(classified);
358
+ classified.sort((left, right) => compareClassifiedTailwindTokensForCnGrouping(left, right, firstVariantKeySourceIndex));
359
+ const rawGroups = [];
360
+ /**
361
+ * Bucket of the last token already placed in the current run (pairwise compat with `COMPATIBLE_BUCKET_SETS`).
362
+ */
363
+ let lastBucketInRun = null;
364
+ let currentStateKey = null;
365
+ let currentTokens = [];
366
+ const flush = () => {
367
+ if (currentTokens.length > 0) {
368
+ rawGroups.push(currentTokens.join(" "));
369
+ currentTokens = [];
370
+ }
371
+ lastBucketInRun = null;
372
+ currentStateKey = null;
373
+ };
374
+ for (const { classToken, bucket: tokenBucket } of classified) {
375
+ if (lastBucketInRun === null) {
376
+ lastBucketInRun = tokenBucket;
377
+ currentStateKey = isVariantKeyedBucket(tokenBucket) ? variantGroupKey(tokenBucket, classToken) : null;
378
+ currentTokens.push(classToken);
379
+ continue;
380
+ }
381
+ if (isVariantKeyedBucket(tokenBucket)) {
382
+ const key = variantGroupKey(tokenBucket, classToken);
383
+ if (currentStateKey !== null && key !== currentStateKey) {
384
+ flush();
385
+ lastBucketInRun = tokenBucket;
386
+ currentStateKey = key;
387
+ currentTokens.push(classToken);
388
+ continue;
389
+ }
390
+ }
391
+ if (!bucketsCompatible(tokenBucket, lastBucketInRun)) {
392
+ flush();
393
+ lastBucketInRun = tokenBucket;
394
+ currentStateKey = isVariantKeyedBucket(tokenBucket) ? variantGroupKey(tokenBucket, classToken) : null;
395
+ currentTokens.push(classToken);
396
+ continue;
397
+ }
398
+ if (isVariantKeyedBucket(tokenBucket)) {
399
+ currentStateKey = variantGroupKey(tokenBucket, classToken);
400
+ }
401
+ else if (currentStateKey !== null) {
402
+ // Defensive reset: keeps state-key logic explicit if bucket rules evolve.
403
+ currentStateKey = null;
404
+ }
405
+ lastBucketInRun = tokenBucket;
406
+ currentTokens.push(classToken);
407
+ }
408
+ flush();
409
+ const merged = mergeSingletons(rawGroups);
410
+ const withEaseMerged = mergeEaseTimingIntoFollowingAnimatedState(merged);
411
+ // Never cap-merge below the semantic chunk count from the tokenizer (fixes layout+state glued
412
+ // when `preferred` compat list was empty and unrelated pairs used penalty 0).
413
+ const maxAllowed = Math.max(dynamicMaxGroups(tokens.length), withEaseMerged.length);
414
+ return capGroups(withEaseMerged, maxAllowed);
415
+ }
416
+ /**
417
+ * One label per suggested group: a single bucket name, or `mixed:a+b` when that chunk
418
+ * spans multiple Tailwind buckets (matches `codefast arrange group` stdout).
419
+ *
420
+ * @since 0.3.16-canary.0
421
+ */
422
+ export function summarizeGroupBucketLabels(groups) {
423
+ return groups.map((g) => {
424
+ const uniq = new Set(tokenizeClassString(g).map(classifyToken));
425
+ if (uniq.size !== 1) {
426
+ return `mixed:${[...uniq].toSorted(compareClassTokensCanonically).join("+")}`;
427
+ }
428
+ const onlyBucket = [...uniq][0];
429
+ if (onlyBucket === undefined) {
430
+ return `mixed:${[...uniq].toSorted(compareClassTokensCanonically).join("+")}`;
431
+ }
432
+ return onlyBucket;
433
+ });
434
+ }
435
+ //# sourceMappingURL=grouping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouping.js","sourceRoot":"","sources":["../../../src/arrange/domain/grouping.ts"],"names":[],"mappings":"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"}