@codefast/cli 0.3.12 → 0.3.13-canary.0

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 (225) hide show
  1. package/README.md +206 -51
  2. package/dist/analyze-DvtJ3j9m.mjs +92 -0
  3. package/dist/arrange-Bbh62DrU.mjs +107 -0
  4. package/dist/arrange-BqP2DI3w.mjs +8 -0
  5. package/dist/ast-helpers-MDRYuIAk.mjs +115 -0
  6. package/dist/{bin.js → bin.mjs} +4 -1
  7. package/dist/caught-unknown-message-CRhkDWO7.mjs +20 -0
  8. package/dist/collectors-cn-BS8TTQ8O.mjs +61 -0
  9. package/dist/collectors-jsx-D9tL2ZPM.mjs +20 -0
  10. package/dist/collectors-tv-D2PXZaRt.mjs +170 -0
  11. package/dist/colors-BjdkCfGK.mjs +12 -0
  12. package/dist/commands/arrange.mjs +2 -0
  13. package/dist/commands/mirror.mjs +2 -0
  14. package/dist/commands/mirror.test.mjs +48 -0
  15. package/dist/commands/tag.mjs +2 -0
  16. package/dist/config-DVia_f9a.mjs +3 -0
  17. package/dist/config-reporter-SCcWDZc1.mjs +10 -0
  18. package/dist/constants-AtPhF-Ct.mjs +169 -0
  19. package/dist/constants-Bq5wdyLC.mjs +8 -0
  20. package/dist/dirent-list-BSDeRG5i.mjs +14 -0
  21. package/dist/engine-CcWEHSCq.mjs +287 -0
  22. package/dist/engine-DRTdkc5u.mjs +236 -0
  23. package/dist/errors-CFH4w6ic.mjs +15 -0
  24. package/dist/errors-CpU1ogfA.mjs +19 -0
  25. package/dist/formatters-DGE8jJ53.mjs +52 -0
  26. package/dist/group-file-ClW7XdD6.mjs +113 -0
  27. package/dist/grouping-c1grpCQT.mjs +235 -0
  28. package/dist/imports-DSVq1xhB.mjs +54 -0
  29. package/dist/lib/arrange/application/analyze.mjs +2 -0
  30. package/dist/lib/arrange/application/analyze.test.mjs +171 -0
  31. package/dist/lib/arrange/application/group-file.mjs +2 -0
  32. package/dist/lib/arrange/application/group-file.test.mjs +273 -0
  33. package/dist/lib/arrange/application/run-target.mjs +2 -0
  34. package/dist/lib/arrange/application/run-target.test.mjs +97 -0
  35. package/dist/lib/arrange/domain/ast/ast-helpers.mjs +2 -0
  36. package/dist/lib/arrange/domain/ast/ast-helpers.test.mjs +148 -0
  37. package/dist/lib/arrange/domain/ast/collectors-cn.mjs +2 -0
  38. package/dist/lib/arrange/domain/ast/collectors-cn.test.mjs +58 -0
  39. package/dist/lib/arrange/domain/ast/collectors-jsx.mjs +2 -0
  40. package/dist/lib/arrange/domain/ast/collectors-jsx.test.mjs +20 -0
  41. package/dist/lib/arrange/domain/ast/collectors-tv.mjs +2 -0
  42. package/dist/lib/arrange/domain/ast/collectors-tv.test.mjs +145 -0
  43. package/dist/lib/arrange/domain/ast/targets.mjs +2 -0
  44. package/dist/lib/arrange/domain/ast/targets.test.mjs +50 -0
  45. package/dist/lib/arrange/domain/constants.mjs +2 -0
  46. package/dist/lib/arrange/domain/errors.mjs +2 -0
  47. package/dist/lib/arrange/domain/grouping.mjs +2 -0
  48. package/dist/lib/arrange/domain/grouping.test.mjs +186 -0
  49. package/dist/lib/arrange/domain/imports.mjs +2 -0
  50. package/dist/lib/arrange/domain/imports.test.mjs +48 -0
  51. package/dist/lib/arrange/domain/tokenizer.mjs +2 -0
  52. package/dist/lib/arrange/domain/tokenizer.test.mjs +165 -0
  53. package/dist/lib/arrange/index.mjs +16 -0
  54. package/dist/lib/arrange/infra/walk.mjs +2 -0
  55. package/dist/lib/arrange/infra/walk.test.mjs +50 -0
  56. package/dist/lib/arrange/presentation/formatters.mjs +2 -0
  57. package/dist/lib/arrange/presentation/formatters.test.mjs +73 -0
  58. package/dist/lib/arrange/presentation/report.mjs +2 -0
  59. package/dist/lib/config/domain/schema.mjs +2 -0
  60. package/dist/lib/config/index.mjs +4 -0
  61. package/dist/lib/config/infra/loader.mjs +2 -0
  62. package/dist/lib/config/infra/loader.test.mjs +116 -0
  63. package/dist/lib/infra/caught-unknown-message.mjs +2 -0
  64. package/dist/lib/infra/config-reporter.mjs +2 -0
  65. package/dist/lib/infra/node-io.mjs +2 -0
  66. package/dist/lib/infra/workspace/repo-root.mjs +2 -0
  67. package/dist/lib/infra/workspace/repo-root.test.mjs +45 -0
  68. package/dist/lib/mirror/application/engine.mjs +2 -0
  69. package/dist/lib/mirror/application/sync.mjs +2 -0
  70. package/dist/lib/mirror/application/sync.test.mjs +482 -0
  71. package/dist/lib/mirror/domain/constants.mjs +2 -0
  72. package/dist/lib/mirror/domain/errors.mjs +2 -0
  73. package/dist/lib/mirror/domain/types.mjs +1 -0
  74. package/dist/lib/mirror/index.mjs +3 -0
  75. package/dist/lib/mirror/infra/dirent-list.mjs +2 -0
  76. package/dist/lib/mirror/infra/dirent-list.test.mjs +18 -0
  77. package/dist/lib/mirror/infra/package-filter.mjs +2 -0
  78. package/dist/lib/mirror/infra/package-filter.test.mjs +32 -0
  79. package/dist/lib/mirror/infra/path-normalizer.mjs +2 -0
  80. package/dist/lib/mirror/infra/update-pkg.mjs +2 -0
  81. package/dist/lib/mirror/infra/workspace-packages.mjs +2 -0
  82. package/dist/lib/mirror/infra/workspace-packages.test.mjs +167 -0
  83. package/dist/lib/mirror/presentation/reporter.mjs +2 -0
  84. package/dist/lib/tag/application/engine.mjs +2 -0
  85. package/dist/lib/tag/application/engine.test.mjs +159 -0
  86. package/dist/lib/tag/domain/types.mjs +1 -0
  87. package/dist/lib/tag/index.mjs +5 -0
  88. package/dist/lib/tag/infra/target-resolver.mjs +2 -0
  89. package/dist/lib/tag/presentation/colors.mjs +2 -0
  90. package/dist/lib/tag/presentation/tag-presenter.mjs +2 -0
  91. package/dist/lib/tag/presentation/tag-presenter.test.mjs +29 -0
  92. package/dist/loader-DpN-zl5g.mjs +78 -0
  93. package/dist/mirror-CbGiLXKT.mjs +2 -0
  94. package/dist/mirror-DqJE3ejL.mjs +66 -0
  95. package/dist/node-io-DFRbHO6m.mjs +30 -0
  96. package/dist/package-filter-C_8ryqvz.mjs +26 -0
  97. package/dist/path-normalizer-D4ceBO3l.mjs +7 -0
  98. package/dist/program-DR-H4tH3.mjs +34 -0
  99. package/dist/program.mjs +2 -0
  100. package/dist/repo-root-HmtIEm6J.mjs +22 -0
  101. package/dist/report-DYxvw34T.mjs +24 -0
  102. package/dist/reporter-CwIe_tAM.mjs +108 -0
  103. package/dist/run-target-CJWrqNT4.mjs +65 -0
  104. package/dist/schema-Or8RAARd.mjs +25 -0
  105. package/dist/sync-e1Sp-shi.mjs +157 -0
  106. package/dist/tag-Cd9JujU5.mjs +2 -0
  107. package/dist/tag-hEKVZ_-7.mjs +58 -0
  108. package/dist/tag-presenter-Cs66UBsH.mjs +63 -0
  109. package/dist/target-resolver-CR3FXMTy.mjs +170 -0
  110. package/dist/targets-pCTslnFh.mjs +106 -0
  111. package/dist/tokenizer-CeZx73Zu.mjs +216 -0
  112. package/dist/update-pkg-CnGfjWBy.mjs +37 -0
  113. package/dist/walk-DjgQn66n.mjs +33 -0
  114. package/dist/workspace-packages-K2NYTHJq.mjs +159 -0
  115. package/package.json +11 -11
  116. package/dist/bin.d.ts +0 -3
  117. package/dist/bin.d.ts.map +0 -1
  118. package/dist/commands/arrange.d.ts +0 -3
  119. package/dist/commands/arrange.d.ts.map +0 -1
  120. package/dist/commands/arrange.js +0 -114
  121. package/dist/commands/mirror.d.ts +0 -4
  122. package/dist/commands/mirror.d.ts.map +0 -1
  123. package/dist/commands/mirror.js +0 -63
  124. package/dist/lib/arrange/analyze.d.ts +0 -4
  125. package/dist/lib/arrange/analyze.d.ts.map +0 -1
  126. package/dist/lib/arrange/analyze.js +0 -105
  127. package/dist/lib/arrange/ast/collectors-cn.d.ts +0 -10
  128. package/dist/lib/arrange/ast/collectors-cn.d.ts.map +0 -1
  129. package/dist/lib/arrange/ast/collectors-cn.js +0 -84
  130. package/dist/lib/arrange/ast/collectors-jsx.d.ts +0 -4
  131. package/dist/lib/arrange/ast/collectors-jsx.d.ts.map +0 -1
  132. package/dist/lib/arrange/ast/collectors-jsx.js +0 -18
  133. package/dist/lib/arrange/ast/collectors-tv.d.ts +0 -13
  134. package/dist/lib/arrange/ast/collectors-tv.d.ts.map +0 -1
  135. package/dist/lib/arrange/ast/collectors-tv.js +0 -273
  136. package/dist/lib/arrange/ast/targets.d.ts +0 -8
  137. package/dist/lib/arrange/ast/targets.d.ts.map +0 -1
  138. package/dist/lib/arrange/ast/targets.js +0 -143
  139. package/dist/lib/arrange/ast/utils.d.ts +0 -36
  140. package/dist/lib/arrange/ast/utils.d.ts.map +0 -1
  141. package/dist/lib/arrange/ast/utils.js +0 -138
  142. package/dist/lib/arrange/constants.d.ts +0 -68
  143. package/dist/lib/arrange/constants.d.ts.map +0 -1
  144. package/dist/lib/arrange/constants.js +0 -179
  145. package/dist/lib/arrange/errors.d.ts +0 -14
  146. package/dist/lib/arrange/errors.d.ts.map +0 -1
  147. package/dist/lib/arrange/errors.js +0 -16
  148. package/dist/lib/arrange/formatters.d.ts +0 -16
  149. package/dist/lib/arrange/formatters.d.ts.map +0 -1
  150. package/dist/lib/arrange/formatters.js +0 -57
  151. package/dist/lib/arrange/group-file.d.ts +0 -4
  152. package/dist/lib/arrange/group-file.d.ts.map +0 -1
  153. package/dist/lib/arrange/group-file.js +0 -115
  154. package/dist/lib/arrange/grouping.d.ts +0 -41
  155. package/dist/lib/arrange/grouping.d.ts.map +0 -1
  156. package/dist/lib/arrange/grouping.js +0 -280
  157. package/dist/lib/arrange/imports.d.ts +0 -6
  158. package/dist/lib/arrange/imports.d.ts.map +0 -1
  159. package/dist/lib/arrange/imports.js +0 -74
  160. package/dist/lib/arrange/report.d.ts +0 -4
  161. package/dist/lib/arrange/report.d.ts.map +0 -1
  162. package/dist/lib/arrange/report.js +0 -37
  163. package/dist/lib/arrange/run-target.d.ts +0 -4
  164. package/dist/lib/arrange/run-target.d.ts.map +0 -1
  165. package/dist/lib/arrange/run-target.js +0 -28
  166. package/dist/lib/arrange/tokenizer.d.ts +0 -37
  167. package/dist/lib/arrange/tokenizer.d.ts.map +0 -1
  168. package/dist/lib/arrange/tokenizer.js +0 -390
  169. package/dist/lib/arrange/types.d.ts +0 -104
  170. package/dist/lib/arrange/types.d.ts.map +0 -1
  171. package/dist/lib/arrange/types.js +0 -7
  172. package/dist/lib/arrange/walk.d.ts +0 -4
  173. package/dist/lib/arrange/walk.d.ts.map +0 -1
  174. package/dist/lib/arrange/walk.js +0 -34
  175. package/dist/lib/arrange.d.ts +0 -41
  176. package/dist/lib/arrange.d.ts.map +0 -1
  177. package/dist/lib/arrange.js +0 -38
  178. package/dist/lib/infra/fs-contract.d.ts +0 -28
  179. package/dist/lib/infra/fs-contract.d.ts.map +0 -1
  180. package/dist/lib/infra/node-io.d.ts +0 -4
  181. package/dist/lib/infra/node-io.d.ts.map +0 -1
  182. package/dist/lib/infra/node-io.js +0 -27
  183. package/dist/lib/mirror/config.d.ts +0 -7
  184. package/dist/lib/mirror/config.d.ts.map +0 -1
  185. package/dist/lib/mirror/config.js +0 -146
  186. package/dist/lib/mirror/constants.d.ts +0 -10
  187. package/dist/lib/mirror/constants.d.ts.map +0 -1
  188. package/dist/lib/mirror/constants.js +0 -13
  189. package/dist/lib/mirror/engine.d.ts +0 -12
  190. package/dist/lib/mirror/engine.d.ts.map +0 -1
  191. package/dist/lib/mirror/engine.js +0 -248
  192. package/dist/lib/mirror/errors.d.ts +0 -10
  193. package/dist/lib/mirror/errors.d.ts.map +0 -1
  194. package/dist/lib/mirror/errors.js +0 -12
  195. package/dist/lib/mirror/package-filter.d.ts +0 -8
  196. package/dist/lib/mirror/package-filter.d.ts.map +0 -1
  197. package/dist/lib/mirror/package-filter.js +0 -33
  198. package/dist/lib/mirror/reporter.d.ts +0 -24
  199. package/dist/lib/mirror/reporter.d.ts.map +0 -1
  200. package/dist/lib/mirror/reporter.js +0 -126
  201. package/dist/lib/mirror/sync.d.ts +0 -4
  202. package/dist/lib/mirror/sync.d.ts.map +0 -1
  203. package/dist/lib/mirror/sync.js +0 -135
  204. package/dist/lib/mirror/types.d.ts +0 -81
  205. package/dist/lib/mirror/types.d.ts.map +0 -1
  206. package/dist/lib/mirror/update-pkg.d.ts +0 -13
  207. package/dist/lib/mirror/update-pkg.d.ts.map +0 -1
  208. package/dist/lib/mirror/update-pkg.js +0 -39
  209. package/dist/lib/mirror/workspace-packages.d.ts +0 -26
  210. package/dist/lib/mirror/workspace-packages.d.ts.map +0 -1
  211. package/dist/lib/mirror/workspace-packages.js +0 -160
  212. package/dist/lib/mirror.d.ts +0 -7
  213. package/dist/lib/mirror.d.ts.map +0 -1
  214. package/dist/lib/mirror.js +0 -5
  215. package/dist/lib/repo-root.d.ts +0 -7
  216. package/dist/lib/repo-root.d.ts.map +0 -1
  217. package/dist/lib/repo-root.js +0 -23
  218. package/dist/lib/shared/utils.d.ts +0 -9
  219. package/dist/lib/shared/utils.d.ts.map +0 -1
  220. package/dist/lib/shared/utils.js +0 -12
  221. package/dist/program.d.ts +0 -4
  222. package/dist/program.d.ts.map +0 -1
  223. package/dist/program.js +0 -38
  224. /package/dist/lib/{infra/fs-contract.js → arrange/domain/types.mjs} +0 -0
  225. /package/dist/lib/{mirror/types.js → infra/fs-contract.mjs} +0 -0
@@ -0,0 +1,61 @@
1
+ import "./constants-AtPhF-Ct.mjs";
2
+ import ts from "typescript";
3
+ //#region src/lib/arrange/domain/ast/collectors-cn.ts
4
+ function forEachStringLiteralInClassExpression(expr, sink, depth = 0, options) {
5
+ if (depth > 12) return;
6
+ if (ts.isStringLiteral(expr) || ts.isNoSubstitutionTemplateLiteral(expr)) {
7
+ sink(expr);
8
+ return;
9
+ }
10
+ if (ts.isParenthesizedExpression(expr)) {
11
+ forEachStringLiteralInClassExpression(expr.expression, sink, depth + 1, options);
12
+ return;
13
+ }
14
+ if (ts.isAsExpression(expr) || ts.isSatisfiesExpression(expr)) {
15
+ forEachStringLiteralInClassExpression(expr.expression, sink, depth + 1, options);
16
+ return;
17
+ }
18
+ if (ts.isNonNullExpression(expr)) {
19
+ forEachStringLiteralInClassExpression(expr.expression, sink, depth + 1, options);
20
+ return;
21
+ }
22
+ if (ts.isConditionalExpression(expr)) {
23
+ if (options?.descendIntoConditional === false) return;
24
+ forEachStringLiteralInClassExpression(expr.whenTrue, sink, depth + 1, options);
25
+ forEachStringLiteralInClassExpression(expr.whenFalse, sink, depth + 1, options);
26
+ return;
27
+ }
28
+ if (ts.isBinaryExpression(expr) && expr.operatorToken.kind === ts.SyntaxKind.PlusToken) {
29
+ forEachStringLiteralInClassExpression(expr.left, sink, depth + 1, options);
30
+ forEachStringLiteralInClassExpression(expr.right, sink, depth + 1, options);
31
+ return;
32
+ }
33
+ if (ts.isArrayLiteralExpression(expr)) for (const arrayElement of expr.elements) {
34
+ if (ts.isSpreadElement(arrayElement)) continue;
35
+ forEachStringLiteralInClassExpression(arrayElement, sink, depth + 1, options);
36
+ }
37
+ }
38
+ function isUnsafeLiteralForCnStyleApplySplit(classLiteral) {
39
+ return ts.isArrayLiteralExpression(classLiteral.parent);
40
+ }
41
+ const CN_APPLY_LITERAL_WALK_OPTS = { descendIntoConditional: false };
42
+ function collectUnconditionalTailwindLiteralsFromCnArguments(args) {
43
+ const staticLits = [];
44
+ for (const arg of args) if (ts.isStringLiteral(arg) || ts.isNoSubstitutionTemplateLiteral(arg)) {
45
+ if (!isUnsafeLiteralForCnStyleApplySplit(arg)) staticLits.push(arg);
46
+ } else forEachStringLiteralInClassExpression(arg, (lit) => {
47
+ if (!isUnsafeLiteralForCnStyleApplySplit(lit)) staticLits.push(lit);
48
+ }, 0, CN_APPLY_LITERAL_WALK_OPTS);
49
+ return staticLits;
50
+ }
51
+ function mergeCnUnconditionalLiteralPoolForTest(argsSnippet, options) {
52
+ const callee = options?.callee ?? "cn";
53
+ const sourceText = `${callee}(${argsSnippet});`;
54
+ const stmt = ts.createSourceFile("mergeCnUnconditionalLiteralPoolForTest.ts", sourceText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS).statements[0];
55
+ if (!ts.isExpressionStatement(stmt)) throw new Error("expected expression statement");
56
+ const call = stmt.expression;
57
+ if (!ts.isCallExpression(call) || !ts.isIdentifier(call.expression) || call.expression.text !== callee) throw new Error(`expected ${callee}(...) call`);
58
+ return collectUnconditionalTailwindLiteralsFromCnArguments(call.arguments).map((literal) => literal.text).join(" ");
59
+ }
60
+ //#endregion
61
+ export { mergeCnUnconditionalLiteralPoolForTest as a, isUnsafeLiteralForCnStyleApplySplit as i, collectUnconditionalTailwindLiteralsFromCnArguments as n, forEachStringLiteralInClassExpression as r, CN_APPLY_LITERAL_WALK_OPTS as t };
@@ -0,0 +1,20 @@
1
+ import ts from "typescript";
2
+ //#region src/lib/arrange/domain/ast/collectors-jsx.ts
3
+ function jsxClassNameStaticLiteral(jsxClassNameAttribute) {
4
+ if (!ts.isIdentifier(jsxClassNameAttribute.name) || jsxClassNameAttribute.name.text !== "className") return void 0;
5
+ const init = jsxClassNameAttribute.initializer;
6
+ if (!init) return void 0;
7
+ if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) return {
8
+ lit: init,
9
+ valueNode: init
10
+ };
11
+ if (ts.isJsxExpression(init) && init.expression) {
12
+ const jsxExpressionBody = init.expression;
13
+ if (ts.isStringLiteral(jsxExpressionBody) || ts.isNoSubstitutionTemplateLiteral(jsxExpressionBody)) return {
14
+ lit: jsxExpressionBody,
15
+ valueNode: init
16
+ };
17
+ }
18
+ }
19
+ //#endregion
20
+ export { jsxClassNameStaticLiteral as t };
@@ -0,0 +1,170 @@
1
+ import "./constants-AtPhF-Ct.mjs";
2
+ import { d as tokenizeClassString } from "./tokenizer-CeZx73Zu.mjs";
3
+ import { i as isUnsafeLiteralForCnStyleApplySplit, n as collectUnconditionalTailwindLiteralsFromCnArguments, r as forEachStringLiteralInClassExpression, t as CN_APPLY_LITERAL_WALK_OPTS } from "./collectors-cn-BS8TTQ8O.mjs";
4
+ import { a as isCnOrTvIdentifier, c as propertyAssignmentNameText, r as buildKnownCnTvBindings } from "./ast-helpers-MDRYuIAk.mjs";
5
+ import ts from "typescript";
6
+ //#region src/lib/arrange/domain/ast/collectors-tv.ts
7
+ function traverseTvObject(sf, obj, visitor, depth = 0, knownBindings) {
8
+ if (depth > 12) return;
9
+ for (const prop of obj.properties) {
10
+ if (!ts.isPropertyAssignment(prop)) continue;
11
+ const init = prop.initializer;
12
+ if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) visitor(init, sf, void 0);
13
+ else if (ts.isArrayLiteralExpression(init)) for (const arrayElement of init.elements) {
14
+ if (ts.isSpreadElement(arrayElement)) continue;
15
+ if (ts.isStringLiteral(arrayElement) || ts.isNoSubstitutionTemplateLiteral(arrayElement)) visitor(arrayElement, sf, void 0);
16
+ else if (ts.isCallExpression(arrayElement) && isCnOrTvIdentifier(arrayElement.expression, "cn", knownBindings)) for (const arg of arrayElement.arguments) forEachStringLiteralInClassExpression(arg, (lit) => {
17
+ visitor(lit, sf, arrayElement);
18
+ });
19
+ else if (ts.isObjectLiteralExpression(arrayElement)) for (const objectProperty of arrayElement.properties) {
20
+ if (!ts.isPropertyAssignment(objectProperty)) continue;
21
+ const propName = propertyAssignmentNameText(objectProperty);
22
+ if (propName !== "className" && propName !== "class") continue;
23
+ const innerInit = objectProperty.initializer;
24
+ if (ts.isStringLiteral(innerInit) || ts.isNoSubstitutionTemplateLiteral(innerInit)) visitor(innerInit, sf, void 0);
25
+ else if (ts.isArrayLiteralExpression(innerInit)) for (const nestedArrayElement of innerInit.elements) {
26
+ if (ts.isSpreadElement(nestedArrayElement)) continue;
27
+ if (ts.isStringLiteral(nestedArrayElement) || ts.isNoSubstitutionTemplateLiteral(nestedArrayElement)) visitor(nestedArrayElement, sf, void 0);
28
+ }
29
+ else if (ts.isCallExpression(innerInit) && isCnOrTvIdentifier(innerInit.expression, "cn", knownBindings)) for (const arg of innerInit.arguments) forEachStringLiteralInClassExpression(arg, (lit) => {
30
+ visitor(lit, sf, innerInit);
31
+ });
32
+ }
33
+ }
34
+ else if (ts.isObjectLiteralExpression(init)) traverseTvObject(sf, init, visitor, depth + 1, knownBindings);
35
+ else if (ts.isCallExpression(init) && isCnOrTvIdentifier(init.expression, "cn", knownBindings)) for (const arg of init.arguments) forEachStringLiteralInClassExpression(arg, (lit) => {
36
+ visitor(lit, sf, init);
37
+ });
38
+ }
39
+ }
40
+ function collectCnCallsInsideTv(sf, obj, knownBindings, depth = 0) {
41
+ if (depth > 12) return [];
42
+ const calls = [];
43
+ for (const prop of obj.properties) {
44
+ if (!ts.isPropertyAssignment(prop)) continue;
45
+ const init = prop.initializer;
46
+ if (ts.isArrayLiteralExpression(init)) for (const arrayElement of init.elements) {
47
+ if (ts.isSpreadElement(arrayElement)) continue;
48
+ if (ts.isCallExpression(arrayElement) && isCnOrTvIdentifier(arrayElement.expression, "cn", knownBindings)) calls.push(arrayElement);
49
+ else if (ts.isObjectLiteralExpression(arrayElement)) for (const objectProperty of arrayElement.properties) {
50
+ if (!ts.isPropertyAssignment(objectProperty)) continue;
51
+ const propName = propertyAssignmentNameText(objectProperty);
52
+ if (propName !== "className" && propName !== "class") continue;
53
+ const innerInit = objectProperty.initializer;
54
+ if (ts.isCallExpression(innerInit) && isCnOrTvIdentifier(innerInit.expression, "cn", knownBindings)) calls.push(innerInit);
55
+ }
56
+ }
57
+ else if (ts.isObjectLiteralExpression(init)) calls.push(...collectCnCallsInsideTv(sf, init, knownBindings, depth + 1));
58
+ else if (ts.isCallExpression(init) && isCnOrTvIdentifier(init.expression, "cn", knownBindings)) calls.push(init);
59
+ }
60
+ return calls;
61
+ }
62
+ function listAllCnCallsInsideTvInSourceFile(sf, knownBindings) {
63
+ const calls = [];
64
+ const visitTypeScriptSubtree = (tsNode) => {
65
+ if (ts.isCallExpression(tsNode) && isCnOrTvIdentifier(tsNode.expression, "tv", knownBindings)) {
66
+ const arg0 = tsNode.arguments[0];
67
+ if (arg0 && ts.isObjectLiteralExpression(arg0)) calls.push(...collectCnCallsInsideTv(sf, arg0, knownBindings, 0));
68
+ }
69
+ ts.forEachChild(tsNode, visitTypeScriptSubtree);
70
+ };
71
+ visitTypeScriptSubtree(sf);
72
+ return calls;
73
+ }
74
+ function makeStringNode(nodes, sf, isTvContext, cnCall) {
75
+ return {
76
+ nodes,
77
+ sf,
78
+ isTvContext,
79
+ cnCall,
80
+ get primaryClassLiteral() {
81
+ return this.nodes[0];
82
+ }
83
+ };
84
+ }
85
+ function slotClassString(stringNode) {
86
+ return stringNode.nodes.map((literal) => literal.text).join(" ");
87
+ }
88
+ function emitTvSlot(lits, sf, cnCall, results, seenNodePos) {
89
+ if (lits.length === 0) return;
90
+ const firstPos = lits[0].getStart(sf);
91
+ if (seenNodePos.has(firstPos)) return;
92
+ seenNodePos.add(firstPos);
93
+ if (lits.reduce((accumulatedTokenCount, literal) => accumulatedTokenCount + tokenizeClassString(literal.text).length, 0) < 2) return;
94
+ results.push(makeStringNode(lits, sf, true, cnCall));
95
+ }
96
+ function collectTvSlots(sf, obj, knownBindings, results, seenNodePos, depth = 0) {
97
+ if (depth > 12) return;
98
+ for (const prop of obj.properties) {
99
+ if (!ts.isPropertyAssignment(prop)) continue;
100
+ const init = prop.initializer;
101
+ if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) emitTvSlot([init], sf, void 0, results, seenNodePos);
102
+ else if (ts.isArrayLiteralExpression(init)) {
103
+ const arrayPos = init.getStart(sf);
104
+ if (seenNodePos.has(arrayPos)) continue;
105
+ seenNodePos.add(arrayPos);
106
+ const staticLits = [];
107
+ for (const arrayElement of init.elements) {
108
+ if (ts.isSpreadElement(arrayElement)) continue;
109
+ if (ts.isStringLiteral(arrayElement) || ts.isNoSubstitutionTemplateLiteral(arrayElement)) staticLits.push(arrayElement);
110
+ else if (ts.isCallExpression(arrayElement) && isCnOrTvIdentifier(arrayElement.expression, "cn", knownBindings)) for (const arg of arrayElement.arguments) forEachStringLiteralInClassExpression(arg, (lit) => {
111
+ if (!isUnsafeLiteralForCnStyleApplySplit(lit)) staticLits.push(lit);
112
+ }, 0, CN_APPLY_LITERAL_WALK_OPTS);
113
+ else if (ts.isObjectLiteralExpression(arrayElement)) for (const objectProperty of arrayElement.properties) {
114
+ if (!ts.isPropertyAssignment(objectProperty)) continue;
115
+ const propName = propertyAssignmentNameText(objectProperty);
116
+ if (propName !== "className" && propName !== "class") continue;
117
+ const innerInit = objectProperty.initializer;
118
+ if (ts.isStringLiteral(innerInit) || ts.isNoSubstitutionTemplateLiteral(innerInit)) emitTvSlot([innerInit], sf, void 0, results, seenNodePos);
119
+ else if (ts.isArrayLiteralExpression(innerInit)) {
120
+ const innerLits = [];
121
+ for (const nestedArrayElement of innerInit.elements) if (!ts.isSpreadElement(nestedArrayElement) && (ts.isStringLiteral(nestedArrayElement) || ts.isNoSubstitutionTemplateLiteral(nestedArrayElement))) innerLits.push(nestedArrayElement);
122
+ emitTvSlot(innerLits, sf, void 0, results, seenNodePos);
123
+ } else if (ts.isCallExpression(innerInit) && isCnOrTvIdentifier(innerInit.expression, "cn", knownBindings)) {
124
+ const cnLits = [];
125
+ for (const arg of innerInit.arguments) forEachStringLiteralInClassExpression(arg, (lit) => {
126
+ if (!isUnsafeLiteralForCnStyleApplySplit(lit)) cnLits.push(lit);
127
+ }, 0, CN_APPLY_LITERAL_WALK_OPTS);
128
+ emitTvSlot(cnLits, sf, innerInit, results, seenNodePos);
129
+ }
130
+ }
131
+ }
132
+ if (staticLits.length > 0) emitTvSlot(staticLits, sf, void 0, results, seenNodePos);
133
+ } else if (ts.isObjectLiteralExpression(init)) collectTvSlots(sf, init, knownBindings, results, seenNodePos, depth + 1);
134
+ else if (ts.isCallExpression(init) && isCnOrTvIdentifier(init.expression, "cn", knownBindings)) {
135
+ const cnLits = [];
136
+ for (const arg of init.arguments) forEachStringLiteralInClassExpression(arg, (lit) => {
137
+ if (!isUnsafeLiteralForCnStyleApplySplit(lit)) cnLits.push(lit);
138
+ }, 0, CN_APPLY_LITERAL_WALK_OPTS);
139
+ emitTvSlot(cnLits, sf, init, results, seenNodePos);
140
+ }
141
+ }
142
+ }
143
+ function collectGroupableStringNodes(sf) {
144
+ const results = [];
145
+ const seenNodePos = /* @__PURE__ */ new Set();
146
+ const knownBindings = buildKnownCnTvBindings(sf);
147
+ const visitTypeScriptSubtree = (tsNode) => {
148
+ if (ts.isCallExpression(tsNode)) {
149
+ if (isCnOrTvIdentifier(tsNode.expression, "cn", knownBindings)) {
150
+ const callPos = tsNode.getStart(sf);
151
+ if (seenNodePos.has(callPos)) {
152
+ ts.forEachChild(tsNode, visitTypeScriptSubtree);
153
+ return;
154
+ }
155
+ seenNodePos.add(callPos);
156
+ const staticLits = collectUnconditionalTailwindLiteralsFromCnArguments(tsNode.arguments);
157
+ const totalTokens = staticLits.reduce((accumulatedTokenCount, literal) => accumulatedTokenCount + tokenizeClassString(literal.text).length, 0);
158
+ if (staticLits.length > 0 && totalTokens >= 2) results.push(makeStringNode(staticLits, sf, false, tsNode));
159
+ } else if (isCnOrTvIdentifier(tsNode.expression, "tv", knownBindings)) {
160
+ const arg0 = tsNode.arguments[0];
161
+ if (arg0 && ts.isObjectLiteralExpression(arg0)) collectTvSlots(sf, arg0, knownBindings, results, seenNodePos);
162
+ }
163
+ }
164
+ ts.forEachChild(tsNode, visitTypeScriptSubtree);
165
+ };
166
+ visitTypeScriptSubtree(sf);
167
+ return results;
168
+ }
169
+ //#endregion
170
+ export { listAllCnCallsInsideTvInSourceFile as a, traverseTvObject as c, emitTvSlot as i, collectGroupableStringNodes as n, makeStringNode as o, collectTvSlots as r, slotClassString as s, collectCnCallsInsideTv as t };
@@ -0,0 +1,12 @@
1
+ //#region src/lib/tag/presentation/colors.ts
2
+ const TAG_COLORS = {
3
+ RESET: "\x1B[0m",
4
+ RED: "\x1B[31m",
5
+ GREEN: "\x1B[32m",
6
+ YELLOW: "\x1B[33m"
7
+ };
8
+ function withTagColor(line, colorCode) {
9
+ return `${colorCode}${line}${TAG_COLORS.RESET}`;
10
+ }
11
+ //#endregion
12
+ export { withTagColor as n, TAG_COLORS as t };
@@ -0,0 +1,2 @@
1
+ import { t as registerArrangeCommand } from "../arrange-Bbh62DrU.mjs";
2
+ export { registerArrangeCommand };
@@ -0,0 +1,2 @@
1
+ import { n as registerMirrorCommand, t as packageArgToRelative } from "../mirror-DqJE3ejL.mjs";
2
+ export { packageArgToRelative, registerMirrorCommand };
@@ -0,0 +1,48 @@
1
+ import { t as packageArgToRelative } from "../mirror-DqJE3ejL.mjs";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ //#region src/commands/mirror.test.ts
6
+ describe("packageArgToRelative", () => {
7
+ it("returns undefined when arg is undefined", () => {
8
+ expect(packageArgToRelative("/repo", void 0)).toBeUndefined();
9
+ });
10
+ it("returns a normalized path for a package under the repo root", () => {
11
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "mirror-pkg-"));
12
+ const pkgDir = path.join(root, "packages", "widget");
13
+ fs.mkdirSync(pkgDir, { recursive: true });
14
+ const prev = process.cwd();
15
+ try {
16
+ process.chdir(root);
17
+ expect(packageArgToRelative(root, "packages/widget")).toBe("packages/widget");
18
+ expect(packageArgToRelative(root, pkgDir)).toBe("packages/widget");
19
+ } finally {
20
+ process.chdir(prev);
21
+ }
22
+ });
23
+ it("rejects '.' and other paths that resolve to the repo root", () => {
24
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "mirror-root-dot-"));
25
+ fs.mkdirSync(path.join(root, "packages", "x"), { recursive: true });
26
+ const prev = process.cwd();
27
+ try {
28
+ process.chdir(root);
29
+ expect(() => packageArgToRelative(root, ".")).toThrow(/subdirectory under monorepo root/);
30
+ expect(() => packageArgToRelative(root, "./")).toThrow(/subdirectory under monorepo root/);
31
+ } finally {
32
+ process.chdir(prev);
33
+ }
34
+ });
35
+ it("rejects paths outside the monorepo root", () => {
36
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "mirror-out-"));
37
+ const outside = fs.mkdtempSync(path.join(os.tmpdir(), "mirror-outside-"));
38
+ const prev = process.cwd();
39
+ try {
40
+ process.chdir(root);
41
+ expect(() => packageArgToRelative(root, outside)).toThrow(/subdirectory under monorepo root/);
42
+ } finally {
43
+ process.chdir(prev);
44
+ }
45
+ });
46
+ });
47
+ //#endregion
48
+ export {};
@@ -0,0 +1,2 @@
1
+ import { t as registerTagCommand } from "../tag-hEKVZ_-7.mjs";
2
+ export { registerTagCommand };
@@ -0,0 +1,3 @@
1
+ import "./schema-Or8RAARd.mjs";
2
+ import "./loader-DpN-zl5g.mjs";
3
+ export {};
@@ -0,0 +1,10 @@
1
+ //#region src/lib/infra/config-reporter.ts
2
+ const YELLOW = "\x1B[33m";
3
+ const RESET = "\x1B[0m";
4
+ /** User-visible lines for non-fatal issues returned with a successfully parsed config. */
5
+ function printConfigSchemaWarnings(logger, warnings) {
6
+ const { out } = logger;
7
+ for (const warningMessage of warnings) out(`${YELLOW}\u26A0\uFE0F ${warningMessage}${RESET}`);
8
+ }
9
+ //#endregion
10
+ export { printConfigSchemaWarnings as t };
@@ -0,0 +1,169 @@
1
+ //#region src/lib/arrange/domain/constants.ts
2
+ /** Analyze report: long literal threshold (token count). */
3
+ const LONG_STRING_TOKEN_THRESHOLD = 18;
4
+ /**
5
+ * Minimum token count for a string to be considered a candidate for grouping
6
+ * in the apply/preview pipeline. Intentionally much lower than
7
+ * {@link LONG_STRING_TOKEN_THRESHOLD} (analyze only).
8
+ */
9
+ const APPLY_MIN_TOKENS = 2;
10
+ /**
11
+ * Minimum tokens a group must have to stand alone before singleton-merging.
12
+ * Set to 2 so single-token groups are not collapsed into unrelated buckets by the merger.
13
+ */
14
+ const MIN_GROUP_TOKENS = 2;
15
+ /** Dynamic max groups clamp: base bound. */
16
+ const MAX_GROUPS_BASE = 4;
17
+ /** Dynamic max groups clamp: upper cap. */
18
+ const MAX_GROUPS_CAP = 24;
19
+ /**
20
+ * Extra slots so a few state / aria groups do not force `capGroups` to merge
21
+ * unrelated buckets (e.g. `bg-border` + `outline-hidden`).
22
+ */
23
+ const MAX_GROUPS_HEADROOM = 2;
24
+ /** Maximum findings printed per category in the analyze report. */
25
+ const MAX_REPORT_LINES = 40;
26
+ /** Maximum recursion depth when traversing `tv()` object literals. */
27
+ const MAX_OBJECT_DEPTH = 12;
28
+ /** Maximum depth when peeling conditional / parens / arrays inside `cn(...)` args. */
29
+ const MAX_CLASS_EXPR_DEPTH = 12;
30
+ /**
31
+ * Maximum variant-stripping passes in {@link stripVariants}.
32
+ * Real-world Tailwind stacks rarely exceed 4–5 segments (e.g. `@md/sidebar:group-hover:dark:focus-visible:`);
33
+ * 12 is a conservative safety cap that prevents runaway loops on malformed input.
34
+ */
35
+ const MAX_STRIP_VARIANT_PASSES = 12;
36
+ /**
37
+ * Passed when optional `knownBindings` is missing — size 0 disables matching
38
+ * for `cn` / `tv` identifier resolution.
39
+ */
40
+ const EMPTY_CN_TV_BINDINGS = /* @__PURE__ */ new Set();
41
+ /**
42
+ * Bucket sort order — **render pipeline** (lower → earlier in output).
43
+ * Existence → Position → Layout → Sizing → Spacing → Shape → Background → Shadow
44
+ * → Typography → Composite → Motion → Starting → Behavior → State (variants) → Selector variants.
45
+ */
46
+ const BUCKET_ORDER = {
47
+ existence: 0,
48
+ position: 1,
49
+ layout: 2,
50
+ sizing: 3,
51
+ spacing: 4,
52
+ shape: 5,
53
+ background: 6,
54
+ shadow: 7,
55
+ typography: 8,
56
+ composite: 9,
57
+ motion: 10,
58
+ starting: 11,
59
+ behavior: 12,
60
+ state: 13,
61
+ selector: 14,
62
+ other: 15,
63
+ arbitrary: 16
64
+ };
65
+ /**
66
+ * Compatible bucket **pairs** — two adjacent tokens whose buckets appear in the same
67
+ * `Set` may stay in one `cn()` string chunk. Compatibility is **not transitive**: there is
68
+ * no `{position, sizing}` pair, so `fixed inset-0` and `overflow-auto` become **separate**
69
+ * literals unless **layout** tokens sit between them in sorted order; then
70
+ * `position↔layout` and `layout↔sizing` each justify one hop and the whole “box in flow”
71
+ * (place + tracks + scrollport) stays in one chunk — co-located because they jointly define
72
+ * stacking and scroll behavior for the same surface.
73
+ */
74
+ const COMPATIBLE_BUCKET_SETS = [
75
+ new Set(["existence", "position"]),
76
+ new Set(["existence", "layout"]),
77
+ new Set(["position", "layout"]),
78
+ new Set(["layout", "sizing"]),
79
+ new Set(["shape", "shadow"]),
80
+ new Set(["background", "shadow"]),
81
+ new Set(["background", "typography"]),
82
+ new Set(["layout", "typography"]),
83
+ new Set(["sizing", "typography"]),
84
+ new Set(["motion", "behavior"]),
85
+ new Set(["motion", "starting"]),
86
+ new Set(["composite", "motion"]),
87
+ new Set(["sizing", "composite"]),
88
+ new Set(["sizing", "spacing"])
89
+ ];
90
+ /**
91
+ * Responsive / variant prefix — Tailwind v4 aware.
92
+ *
93
+ * v3: sm: md: … — v4: @sm:, @min-[600px]:, @[480px]:, named @md/sidebar:,
94
+ * viewport md/sidebar:, min-[100px]: / max-[100px]:, …
95
+ */
96
+ const RESPONSIVE_PREFIX = /^(?:@(?:min|max)-\[[^\]]+\]:|@\[[^\]]+\]:|@(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/[a-z][a-z0-9-]*)?:|(?:max-|min-)?(?:sm|md|lg|xl|2xl|3xl)(?:\/[a-z][a-z0-9-]*)?:|(?:max-|min-)\[[^\]]+\]:)/;
97
+ /** State variant stems — hoisted to module scope (not recreated per call). */
98
+ const STATE_PREFIXES = new Set([
99
+ "hover",
100
+ "focus",
101
+ "focus-within",
102
+ "focus-visible",
103
+ "active",
104
+ "visited",
105
+ "link",
106
+ "any-link",
107
+ "disabled",
108
+ "enabled",
109
+ "checked",
110
+ "indeterminate",
111
+ "required",
112
+ "optional",
113
+ "valid",
114
+ "invalid",
115
+ "in-range",
116
+ "out-of-range",
117
+ "read-only",
118
+ "read-write",
119
+ "placeholder-shown",
120
+ "default",
121
+ "autofill",
122
+ "open",
123
+ "closed",
124
+ "first",
125
+ "last",
126
+ "only",
127
+ "odd",
128
+ "even",
129
+ "first-of-type",
130
+ "last-of-type",
131
+ "only-of-type",
132
+ "first-child",
133
+ "last-child",
134
+ "only-child",
135
+ "empty",
136
+ "target",
137
+ "group",
138
+ "peer",
139
+ "aria",
140
+ "data",
141
+ "dark",
142
+ "light",
143
+ "supports",
144
+ "motion-reduce",
145
+ "motion-safe",
146
+ "print",
147
+ "screen",
148
+ "ltr",
149
+ "rtl",
150
+ "not",
151
+ "has",
152
+ "in",
153
+ "nth",
154
+ "file",
155
+ "selection",
156
+ "marker",
157
+ "placeholder",
158
+ "before",
159
+ "after",
160
+ "first-line",
161
+ "first-letter",
162
+ "backdrop",
163
+ "details-content",
164
+ "popover-open"
165
+ ]);
166
+ /** Default directory for arrange analyze/preview/apply when no target is passed. */
167
+ const DEFAULT_ARRANGE_TARGET = "packages/ui/src/components";
168
+ //#endregion
169
+ export { EMPTY_CN_TV_BINDINGS as a, MAX_GROUPS_BASE as c, MAX_OBJECT_DEPTH as d, MAX_REPORT_LINES as f, STATE_PREFIXES as g, RESPONSIVE_PREFIX as h, DEFAULT_ARRANGE_TARGET as i, MAX_GROUPS_CAP as l, MIN_GROUP_TOKENS as m, BUCKET_ORDER as n, LONG_STRING_TOKEN_THRESHOLD as o, MAX_STRIP_VARIANT_PASSES as p, COMPATIBLE_BUCKET_SETS as r, MAX_CLASS_EXPR_DEPTH as s, APPLY_MIN_TOKENS as t, MAX_GROUPS_HEADROOM as u };
@@ -0,0 +1,8 @@
1
+ //#region src/lib/mirror/domain/constants.ts
2
+ const DIST_DIR = "dist";
3
+ const PACKAGE_JSON = "package.json";
4
+ const VALID_JS_EXTENSIONS = new Set([".js", ".cjs"]);
5
+ const DTS_EXTENSION = ".d.ts";
6
+ const PACKAGE_JSON_EXPORT = "./package.json";
7
+ //#endregion
8
+ export { VALID_JS_EXTENSIONS as a, PACKAGE_JSON_EXPORT as i, DTS_EXTENSION as n, PACKAGE_JSON as r, DIST_DIR as t };
@@ -0,0 +1,14 @@
1
+ //#region src/lib/mirror/infra/dirent-list.ts
2
+ /**
3
+ * Narrow `fs.promises.readdir` overload result to `Dirent[]` when `withFileTypes: true`.
4
+ * Accepts both historical checks (`isFile` / `isDirectory`) in one guard.
5
+ * Returning `true` for an empty array is intentional: callers treat empty lists
6
+ * the same regardless of the element type, so `[]` is safely accepted as `Dirent[]`.
7
+ */
8
+ function isDirentList(x) {
9
+ if (x.length === 0) return true;
10
+ const first = x[0];
11
+ return typeof first === "object" && first !== null && "isFile" in first && "isDirectory" in first;
12
+ }
13
+ //#endregion
14
+ export { isDirentList as t };