@codefast/cli 0.9.0 → 0.11.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.
- package/CHANGELOG.md +61 -0
- package/README.md +345 -151
- package/dist/arrange/command.d.ts +7 -0
- package/dist/arrange/command.js +96 -132
- package/dist/arrange/domain/ast/ast-node.d.ts +394 -0
- package/dist/arrange/domain/ast/collectors-cn.d.ts +26 -0
- package/dist/arrange/domain/ast/collectors-jsx.d.ts +8 -0
- package/dist/arrange/domain/ast/collectors-tv.d.ts +34 -0
- package/dist/arrange/domain/ast/helpers.d.ts +36 -0
- package/dist/arrange/domain/ast/helpers.js +1 -0
- package/dist/arrange/domain/ast/simplify-targets.d.ts +22 -0
- package/dist/arrange/domain/ast/simplify-targets.js +18 -23
- package/dist/arrange/domain/ast/targets.d.ts +20 -0
- package/dist/arrange/domain/ast/translator.d.ts +32 -0
- package/dist/arrange/{typescript-ast-translator.js → domain/ast/translator.js} +19 -22
- package/dist/arrange/domain/constants.d.ts +111 -0
- package/dist/arrange/domain/grouping-service.d.ts +100 -0
- package/dist/arrange/domain/grouping.d.ts +21 -0
- package/dist/arrange/domain/imports.d.ts +14 -0
- package/dist/arrange/domain/source-text-formatters.d.ts +33 -0
- package/dist/arrange/domain/tailwind-token.d.ts +24 -0
- package/dist/arrange/domain/token-classifier.d.ts +47 -0
- package/dist/arrange/domain/types.d.ts +208 -0
- package/dist/arrange/group/cli-result.d.ts +7 -0
- package/dist/arrange/group/cli-result.js +12 -0
- package/dist/arrange/group/cli-schema.d.ts +17 -0
- package/dist/arrange/group/cli-schema.js +13 -0
- package/dist/arrange/group/output.d.ts +7 -0
- package/dist/arrange/group/output.js +10 -0
- package/dist/arrange/group/suggest.d.ts +8 -0
- package/dist/arrange/inspect/cli-result.d.ts +7 -0
- package/dist/arrange/inspect/cli-result.js +8 -0
- package/dist/arrange/inspect/cli-schema.d.ts +15 -0
- package/dist/arrange/inspect/cli-schema.js +9 -0
- package/dist/arrange/inspect/domain/analyze-service.d.ts +18 -0
- package/dist/arrange/inspect/output.d.ts +7 -0
- package/dist/arrange/inspect/output.js +42 -0
- package/dist/arrange/inspect/run.d.ts +10 -0
- package/dist/arrange/{analyze.js → inspect/run.js} +2 -2
- package/dist/arrange/prepare.d.ts +13 -0
- package/dist/arrange/{workspace.js → prepare.js} +5 -8
- package/dist/arrange/regroup/cli-result.d.ts +13 -0
- package/dist/arrange/regroup/cli-result.js +23 -0
- package/dist/arrange/regroup/cli-schema.d.ts +20 -0
- package/dist/arrange/regroup/cli-schema.js +14 -0
- package/dist/arrange/regroup/output.d.ts +14 -0
- package/dist/arrange/regroup/output.js +72 -0
- package/dist/arrange/regroup/process-file.d.ts +11 -0
- package/dist/arrange/regroup/run.d.ts +11 -0
- package/dist/arrange/{sync.js → regroup/run.js} +2 -2
- package/dist/arrange/resolve-target.d.ts +10 -0
- package/dist/arrange/resolve-target.js +3 -16
- package/dist/arrange/scan-target.d.ts +7 -0
- package/dist/arrange/simplify/cli-result.d.ts +7 -0
- package/dist/arrange/simplify/cli-result.js +8 -0
- package/dist/arrange/simplify/cli-schema.d.ts +17 -0
- package/dist/arrange/simplify/cli-schema.js +11 -0
- package/dist/arrange/simplify/fold-targets.d.ts +13 -0
- package/dist/arrange/simplify/fold-targets.js +139 -0
- package/dist/arrange/simplify/output.d.ts +7 -0
- package/dist/arrange/simplify/output.js +15 -0
- package/dist/arrange/simplify/process-file.d.ts +13 -0
- package/dist/arrange/simplify/process-file.js +49 -0
- package/dist/arrange/simplify/run.d.ts +14 -0
- package/dist/arrange/simplify/run.js +38 -0
- package/dist/arrange/simplify/variant-classname-probe.d.ts +35 -0
- package/dist/arrange/simplify/variant-classname-probe.js +95 -0
- package/dist/arrange/source-parse.d.ts +7 -0
- package/dist/arrange/source-parse.js +1 -1
- package/dist/audit/command.d.ts +8 -0
- package/dist/audit/command.js +134 -211
- package/dist/audit/comments/cli-result.d.ts +13 -0
- package/dist/audit/comments/cli-result.js +22 -0
- package/dist/audit/comments/cli-schema.d.ts +19 -0
- package/dist/audit/comments/cli-schema.js +13 -0
- package/dist/audit/comments/domain/comment-content.d.ts +26 -0
- package/dist/audit/comments/domain/comment-dividers.d.ts +62 -0
- package/dist/audit/comments/domain/link-references.d.ts +40 -0
- package/dist/audit/comments/domain/since-versions.d.ts +26 -0
- package/dist/audit/comments/domain/tsdoc-syntax.d.ts +20 -0
- package/dist/audit/comments/output.d.ts +7 -0
- package/dist/audit/comments/output.js +27 -0
- package/dist/audit/comments/prepare.d.ts +16 -0
- package/dist/audit/comments/prepare.js +12 -0
- package/dist/audit/comments/run.d.ts +17 -0
- package/dist/audit/{run-comments.js → comments/run.js} +5 -5
- package/dist/audit/display-names/cli-result.d.ts +13 -0
- package/dist/audit/display-names/cli-result.js +22 -0
- package/dist/audit/display-names/cli-schema.d.ts +18 -0
- package/dist/audit/display-names/cli-schema.js +12 -0
- package/dist/audit/display-names/domain/display-names.d.ts +11 -0
- package/dist/audit/display-names/output.d.ts +7 -0
- package/dist/audit/display-names/output.js +21 -0
- package/dist/audit/display-names/prepare.d.ts +16 -0
- package/dist/audit/display-names/prepare.js +12 -0
- package/dist/audit/display-names/run.d.ts +14 -0
- package/dist/audit/{run-display-names.js → display-names/run.js} +1 -1
- package/dist/audit/domain/types.d.ts +171 -0
- package/dist/audit/imports/cli-result.d.ts +13 -0
- package/dist/audit/imports/cli-result.js +22 -0
- package/dist/audit/imports/cli-schema.d.ts +18 -0
- package/dist/audit/imports/cli-schema.js +12 -0
- package/dist/audit/imports/domain/import-policy.d.ts +34 -0
- package/dist/audit/imports/domain/import-policy.js +140 -0
- package/dist/audit/imports/output.d.ts +7 -0
- package/dist/audit/imports/output.js +21 -0
- package/dist/audit/imports/prepare.d.ts +16 -0
- package/dist/audit/imports/prepare.js +12 -0
- package/dist/audit/imports/run.d.ts +14 -0
- package/dist/audit/{run-react.js → imports/run.js} +15 -5
- package/dist/audit/links/cli-result.d.ts +13 -0
- package/dist/audit/links/cli-result.js +22 -0
- package/dist/audit/links/cli-schema.d.ts +18 -0
- package/dist/audit/links/cli-schema.js +12 -0
- package/dist/audit/links/domain/markdown-links.d.ts +44 -0
- package/dist/audit/links/output.d.ts +7 -0
- package/dist/audit/links/output.js +21 -0
- package/dist/audit/links/prepare.d.ts +16 -0
- package/dist/audit/links/prepare.js +12 -0
- package/dist/audit/links/run.d.ts +14 -0
- package/dist/audit/{run-links.js → links/run.js} +1 -1
- package/dist/audit/prepare.d.ts +31 -0
- package/dist/audit/prepare.js +11 -134
- package/dist/audit/rtl/cli-result.d.ts +13 -0
- package/dist/audit/rtl/cli-result.js +22 -0
- package/dist/audit/rtl/cli-schema.d.ts +18 -0
- package/dist/audit/rtl/cli-schema.js +12 -0
- package/dist/audit/rtl/domain/audit-file.d.ts +7 -0
- package/dist/audit/{domain → rtl/domain}/audit-file.js +2 -2
- package/dist/audit/rtl/domain/mappings.d.ts +45 -0
- package/dist/audit/rtl/domain/tokenize.d.ts +14 -0
- package/dist/audit/rtl/output.d.ts +7 -0
- package/dist/audit/rtl/output.js +21 -0
- package/dist/audit/rtl/prepare.d.ts +13 -0
- package/dist/audit/rtl/prepare.js +41 -0
- package/dist/audit/rtl/run.d.ts +14 -0
- package/dist/audit/{run.js → rtl/run.js} +1 -1
- package/dist/bin.d.ts +2 -0
- package/dist/cli.d.ts +6 -0
- package/dist/core/cli/command-pipeline.d.ts +91 -0
- package/dist/core/cli/command-pipeline.js +83 -0
- package/dist/core/cli/format-error.d.ts +7 -0
- package/dist/core/cli/global-options.d.ts +15 -0
- package/dist/core/cli/global-options.js +1 -1
- package/dist/core/cli/positional.d.ts +6 -0
- package/dist/core/cli/resolve-root.d.ts +9 -0
- package/dist/core/cli/resolve-root.js +16 -0
- package/dist/core/cli/result-handle.d.ts +13 -0
- package/dist/core/cli/result-handle.js +0 -13
- package/dist/core/config/define-config.d.ts +7 -0
- package/dist/core/config/define-config.js +8 -0
- package/dist/core/config/loader.d.ts +18 -0
- package/dist/core/config/loader.js +2 -7
- package/dist/core/config/schema.d.ts +99 -0
- package/dist/core/config/schema.js +8 -86
- package/dist/core/config/warnings.d.ts +6 -0
- package/dist/core/config.d.ts +12 -0
- package/dist/core/errors.d.ts +25 -0
- package/dist/core/exit-codes.d.ts +18 -0
- package/dist/core/filesystem/filesystem.d.ts +44 -0
- package/dist/core/filesystem/node.d.ts +7 -0
- package/dist/core/filesystem/node.js +2 -1
- package/dist/core/glob.d.ts +19 -0
- package/dist/core/logger.d.ts +9 -0
- package/dist/core/result.d.ts +30 -0
- package/dist/core/schema-parse.d.ts +9 -0
- package/dist/core/source-text-edit.d.ts +47 -0
- package/dist/core/source-text-edit.js +22 -0
- package/dist/core/verbose-diagnostics.d.ts +6 -0
- package/dist/core/workspace/ancestor-directories.d.ts +12 -0
- package/dist/core/workspace/ancestor-directories.js +30 -0
- package/dist/core/workspace/markdown-walk.d.ts +7 -0
- package/dist/core/workspace/markdown-walk.js +2 -20
- package/dist/core/workspace/package-version.d.ts +9 -0
- package/dist/core/workspace/package-version.js +8 -12
- package/dist/core/workspace/resolver.d.ts +39 -0
- package/dist/core/workspace/resolver.js +58 -75
- package/dist/core/workspace/skip-directories.d.ts +6 -0
- package/dist/core/workspace/source-walk.d.ts +16 -0
- package/dist/core/workspace/source-walk.js +2 -19
- package/dist/core/workspace/typescript-walk.d.ts +7 -0
- package/dist/core/workspace/typescript-walk.js +2 -23
- package/dist/core/workspace/walk-files.d.ts +7 -0
- package/dist/core/workspace/walk-files.js +27 -0
- package/dist/core/workspace/well-known-files.d.ts +18 -0
- package/dist/core/workspace/well-known-files.js +18 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +5 -0
- package/dist/mirror/cli-result.d.ts +13 -0
- package/dist/mirror/cli-schema.d.ts +8 -0
- package/dist/mirror/cli-schema.js +1 -1
- package/dist/mirror/command.d.ts +7 -0
- package/dist/mirror/command.js +31 -60
- package/dist/mirror/dist-filesystem-node.d.ts +8 -0
- package/dist/mirror/{dist-filesystem-impl.js → dist-filesystem-node.js} +1 -1
- package/dist/mirror/domain/constants.d.ts +18 -0
- package/dist/mirror/domain/constants.js +0 -12
- package/dist/mirror/domain/dirent-guard.d.ts +10 -0
- package/dist/mirror/domain/dist-filesystem.d.ts +9 -0
- package/dist/mirror/domain/errors.d.ts +24 -0
- package/dist/mirror/domain/exports.d.ts +36 -0
- package/dist/mirror/domain/package-display-name.d.ts +8 -0
- package/dist/mirror/domain/path-normalizer.d.ts +6 -0
- package/dist/mirror/domain/types.d.ts +188 -0
- package/dist/mirror/output.d.ts +21 -0
- package/dist/mirror/output.js +126 -1
- package/dist/mirror/package-path.d.ts +19 -0
- package/dist/mirror/prepare.d.ts +15 -0
- package/dist/mirror/prepare.js +6 -10
- package/dist/mirror/run.d.ts +12 -0
- package/dist/mirror/{sync.js → run.js} +5 -3
- package/dist/mirror/supplement-exports.d.ts +27 -0
- package/dist/mirror/supplement-exports.js +2 -2
- package/dist/mirror/sync-workspace-package.d.ts +9 -0
- package/dist/mirror/sync-workspace-package.js +4 -4
- package/dist/mirror/write-exports.d.ts +15 -0
- package/dist/pack-slim/cli-result.d.ts +13 -0
- package/dist/pack-slim/cli-schema.d.ts +17 -0
- package/dist/pack-slim/cli-schema.js +1 -1
- package/dist/pack-slim/command.d.ts +7 -0
- package/dist/pack-slim/command.js +31 -66
- package/dist/pack-slim/domain/transform.d.ts +69 -0
- package/dist/pack-slim/domain/types.d.ts +46 -0
- package/dist/pack-slim/output.d.ts +15 -0
- package/dist/pack-slim/prepare.d.ts +21 -0
- package/dist/pack-slim/prepare.js +14 -0
- package/dist/pack-slim/run.d.ts +23 -0
- package/dist/pack-slim/{sync.js → run.js} +4 -4
- package/dist/pack-slim/working-tree.d.ts +20 -0
- package/dist/tag/cli-result.d.ts +13 -0
- package/dist/tag/cli-result.js +14 -1
- package/dist/tag/cli-schema.d.ts +8 -0
- package/dist/tag/cli-schema.js +3 -4
- package/dist/tag/command.d.ts +7 -0
- package/dist/tag/command.js +33 -60
- package/dist/tag/domain/skip-filter.d.ts +13 -0
- package/dist/tag/domain/skip-filter.js +29 -0
- package/dist/tag/domain/types.d.ts +131 -0
- package/dist/tag/domain/version-summary.d.ts +13 -0
- package/dist/tag/domain/version-summary.js +24 -0
- package/dist/tag/output.d.ts +17 -0
- package/dist/tag/output.js +6 -9
- package/dist/tag/prepare.d.ts +13 -0
- package/dist/tag/prepare.js +4 -4
- package/dist/tag/run.d.ts +10 -0
- package/dist/tag/{sync.js → run.js} +20 -50
- package/dist/tag/target/candidates.d.ts +8 -0
- package/dist/tag/{target-candidates.js → target/candidates.js} +2 -2
- package/dist/tag/target/resolve-path.d.ts +10 -0
- package/dist/tag/target/runner.d.ts +8 -0
- package/dist/tag/{target-runner.js → target/runner.js} +2 -2
- package/dist/tag/writer/since-writer.d.ts +32 -0
- package/dist/tag/writer/version-resolver.d.ts +7 -0
- package/package.json +21 -2
- package/dist/arrange/cli-schema.js +0 -34
- package/dist/arrange/output.js +0 -127
- package/dist/arrange/simplify-process-file.js +0 -30
- package/dist/arrange/simplify-sync.js +0 -30
- package/dist/audit/cli-schema.js +0 -66
- package/dist/audit/domain/react-imports.js +0 -91
- package/dist/audit/output.js +0 -213
- package/dist/mirror/sync-reporter.js +0 -124
- package/dist/mirror/sync-types.js +0 -1
- /package/dist/arrange/{suggest.js → group/suggest.js} +0 -0
- /package/dist/arrange/{domain → inspect/domain}/analyze-service.js +0 -0
- /package/dist/arrange/{process-file.js → regroup/process-file.js} +0 -0
- /package/dist/audit/{domain → comments/domain}/comment-content.js +0 -0
- /package/dist/audit/{domain → comments/domain}/comment-dividers.js +0 -0
- /package/dist/audit/{domain → comments/domain}/link-references.js +0 -0
- /package/dist/audit/{domain → comments/domain}/since-versions.js +0 -0
- /package/dist/audit/{domain → comments/domain}/tsdoc-syntax.js +0 -0
- /package/dist/audit/{domain → display-names/domain}/display-names.js +0 -0
- /package/dist/audit/{domain → links/domain}/markdown-links.js +0 -0
- /package/dist/audit/{domain → rtl/domain}/mappings.js +0 -0
- /package/dist/audit/{domain → rtl/domain}/tokenize.js +0 -0
- /package/dist/core/filesystem/{port.js → filesystem.js} +0 -0
- /package/dist/tag/{resolve-target-path.js → target/resolve-path.js} +0 -0
- /package/dist/tag/{since-writer.js → writer/since-writer.js} +0 -0
- /package/dist/tag/{version-resolver.js → writer/version-resolver.js} +0 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the arrange pipeline (Tailwind `cn()` / `tv()` tooling).
|
|
3
|
+
*
|
|
4
|
+
* **Render Pipeline Order**: Existence → Position → Layout
|
|
5
|
+
* → Sizing → Spacing → Shape → Background → Shadow → Typography → Composite → Motion
|
|
6
|
+
* → Starting → Behavior → State → Selector.
|
|
7
|
+
*
|
|
8
|
+
* `arbitrary` and `other` are non-pipeline tails for `[prop:value]` syntax and unknown utilities.
|
|
9
|
+
*/
|
|
10
|
+
import type { DomainAstNode, DomainCallExpression, DomainSourceFile, DomainTailwindClassLiteral } from "#/arrange/domain/ast/ast-node";
|
|
11
|
+
import type { GroupFileWorkPlan } from "#/arrange/domain/grouping-service";
|
|
12
|
+
import type { CodefastConfig } from "#/core/config/schema";
|
|
13
|
+
/**
|
|
14
|
+
* The render-pipeline bucket a Tailwind token classifies into.
|
|
15
|
+
*
|
|
16
|
+
* @since 0.3.16-canary.0
|
|
17
|
+
*/
|
|
18
|
+
export type Bucket = "existence" | "position" | "layout" | "sizing" | "spacing" | "shape" | "background" | "shadow" | "typography" | "composite" | "motion" | "starting" | "behavior" | "state"
|
|
19
|
+
/**
|
|
20
|
+
* Selector variants (e.g. `[&…]:`, `*:`, `has-*`) distinct from interactive/data state.
|
|
21
|
+
*/
|
|
22
|
+
| "selector" | "arbitrary" | "other";
|
|
23
|
+
/**
|
|
24
|
+
* String or no-substitution template literal used as a Tailwind class blob.
|
|
25
|
+
*
|
|
26
|
+
* @since 0.3.16-canary.0
|
|
27
|
+
*/
|
|
28
|
+
export type TailwindClassLiteral = DomainTailwindClassLiteral;
|
|
29
|
+
/**
|
|
30
|
+
* Options controlling which literals a class-expression walk visits.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.3.16-canary.0
|
|
33
|
+
*/
|
|
34
|
+
export type ForEachStringLiteralInClassExpressionOptions = {
|
|
35
|
+
/**
|
|
36
|
+
* When `false`, do not visit literals inside `cond ? "a" : "b"`. Used when
|
|
37
|
+
* building the cn/tv **apply** pool so mutually exclusive branch classes are
|
|
38
|
+
* never merged into one static string (while `analyze` still uses the default).
|
|
39
|
+
*/
|
|
40
|
+
descendIntoConditional?: boolean;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* A static JSX `className` literal paired with the node to replace.
|
|
44
|
+
*
|
|
45
|
+
* @since 0.3.16-canary.0
|
|
46
|
+
*/
|
|
47
|
+
export type JsxClassNameStatic = {
|
|
48
|
+
lit: TailwindClassLiteral;
|
|
49
|
+
/**
|
|
50
|
+
* Replace this node: `StringLiteral` or whole `JsxExpression`.
|
|
51
|
+
*/
|
|
52
|
+
valueNode: DomainAstNode;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* A StringNode represents a single "grouping slot" — the full set of static
|
|
56
|
+
* string literals that belong to one logical class surface.
|
|
57
|
+
*
|
|
58
|
+
* @since 0.3.16-canary.0
|
|
59
|
+
*/
|
|
60
|
+
export type StringNode = {
|
|
61
|
+
/**
|
|
62
|
+
* All static string literals belonging to this slot, in source order.
|
|
63
|
+
*/
|
|
64
|
+
nodes: Array<TailwindClassLiteral>;
|
|
65
|
+
sf: DomainSourceFile;
|
|
66
|
+
/**
|
|
67
|
+
* String slots in `tv({ ... })` that are not `cn(...)` arguments — use `formatArray` when
|
|
68
|
+
* replacing a whole array, or `formatArrayElementsAsSiblingLines` when replacing one element
|
|
69
|
+
* inside an existing array.
|
|
70
|
+
*/
|
|
71
|
+
isTvContext: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* When set, the entire cn(...) call is replaced at once.
|
|
74
|
+
*/
|
|
75
|
+
cnCall?: DomainCallExpression | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* First literal in the slot; used for positions and line-number reporting.
|
|
78
|
+
*/
|
|
79
|
+
get primaryClassLiteral(): TailwindClassLiteral;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* A groupable class surface — a `cn()` argument slot or a static JSX `className`.
|
|
83
|
+
*
|
|
84
|
+
* @since 0.3.16-canary.0
|
|
85
|
+
*/
|
|
86
|
+
export type GroupTarget = {
|
|
87
|
+
kind: "cnArg";
|
|
88
|
+
item: StringNode;
|
|
89
|
+
} | {
|
|
90
|
+
kind: "jsxClassName";
|
|
91
|
+
sf: DomainSourceFile;
|
|
92
|
+
lit: TailwindClassLiteral;
|
|
93
|
+
valueNode: DomainAstNode;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* A planned text replacement for one grouped class surface.
|
|
97
|
+
*
|
|
98
|
+
* @since 0.3.16-canary.0
|
|
99
|
+
*/
|
|
100
|
+
export type PlannedGroupEdit = {
|
|
101
|
+
start: number;
|
|
102
|
+
end: number;
|
|
103
|
+
replacement: string;
|
|
104
|
+
/**
|
|
105
|
+
* Per-chunk bucket labels (same as `arrange group` trailing `// Buckets:` line).
|
|
106
|
+
*/
|
|
107
|
+
bucketSummary: Array<string>;
|
|
108
|
+
jsxCn: boolean;
|
|
109
|
+
lineSf: DomainSourceFile;
|
|
110
|
+
reportNode: DomainAstNode;
|
|
111
|
+
label: string;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* The accumulated findings of an `arrange analyze` run.
|
|
115
|
+
*
|
|
116
|
+
* @since 0.3.16-canary.0
|
|
117
|
+
*/
|
|
118
|
+
export type AnalyzeReport = {
|
|
119
|
+
files: number;
|
|
120
|
+
cnCallExpressions: number;
|
|
121
|
+
tvCallExpressions: number;
|
|
122
|
+
cnInsideTvCalls: Array<{
|
|
123
|
+
file: string;
|
|
124
|
+
line: number;
|
|
125
|
+
argCount: number;
|
|
126
|
+
preview: string;
|
|
127
|
+
}>;
|
|
128
|
+
longCnStringLiterals: Array<{
|
|
129
|
+
file: string;
|
|
130
|
+
line: number;
|
|
131
|
+
tokenCount: number;
|
|
132
|
+
preview: string;
|
|
133
|
+
}>;
|
|
134
|
+
longTvStringLiterals: Array<{
|
|
135
|
+
file: string;
|
|
136
|
+
line: number;
|
|
137
|
+
tokenCount: number;
|
|
138
|
+
preview: string;
|
|
139
|
+
}>;
|
|
140
|
+
longJsxClassNameLiterals: Array<{
|
|
141
|
+
file: string;
|
|
142
|
+
line: number;
|
|
143
|
+
tokenCount: number;
|
|
144
|
+
preview: string;
|
|
145
|
+
}>;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* The per-file outcome of a grouping pass.
|
|
149
|
+
*
|
|
150
|
+
* @since 0.3.16-canary.0
|
|
151
|
+
*/
|
|
152
|
+
export type GroupFileResult = {
|
|
153
|
+
filePath: string;
|
|
154
|
+
/**
|
|
155
|
+
* Sites worth human review: applied edits plus `cn()` inside `tv` with no args
|
|
156
|
+
* (skipped). Matches preview totals when `groupEdits` correspond to the same plan.
|
|
157
|
+
*/
|
|
158
|
+
totalFound: number;
|
|
159
|
+
/**
|
|
160
|
+
* Edits actually written in apply mode; always 0 in preview mode.
|
|
161
|
+
*/
|
|
162
|
+
changed: number;
|
|
163
|
+
/** Populated only in preview mode (write=false) when edits exist. */
|
|
164
|
+
workPlan?: GroupFileWorkPlan;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* The options a per-file grouping pass runs with.
|
|
168
|
+
*
|
|
169
|
+
* @since 0.3.16-canary.0
|
|
170
|
+
*/
|
|
171
|
+
export type ArrangeGroupFileOptions = {
|
|
172
|
+
write: boolean;
|
|
173
|
+
withClassName: boolean;
|
|
174
|
+
cnImport?: string | undefined;
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* The aggregate outcome of an `arrange` run across files.
|
|
178
|
+
*
|
|
179
|
+
* @since 0.3.16-canary.0
|
|
180
|
+
*/
|
|
181
|
+
export type ArrangeRunResult = {
|
|
182
|
+
filePaths: Array<string>;
|
|
183
|
+
modifiedFiles: Array<string>;
|
|
184
|
+
totalFound: number;
|
|
185
|
+
totalChanged: number;
|
|
186
|
+
hookError: string | null;
|
|
187
|
+
/** Populated in preview mode (write=false); empty in apply mode. */
|
|
188
|
+
previewPlans: Array<GroupFileWorkPlan>;
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* The formatted lines `arrange group` prints for a suggested grouping.
|
|
192
|
+
*
|
|
193
|
+
* @since 0.3.16-canary.0
|
|
194
|
+
*/
|
|
195
|
+
export type ArrangeSuggestGroupsOutput = {
|
|
196
|
+
readonly primaryLine: string;
|
|
197
|
+
readonly bucketsCommentLine: string;
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* The resolved target, workspace root, and loaded config an arrange run starts from.
|
|
201
|
+
*
|
|
202
|
+
* @since 0.3.16-canary.0
|
|
203
|
+
*/
|
|
204
|
+
export type ArrangeTargetWorkspaceAndConfig = {
|
|
205
|
+
readonly resolvedTarget: string;
|
|
206
|
+
readonly rootDir: string;
|
|
207
|
+
readonly config: CodefastConfig;
|
|
208
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ArrangeSuggestGroupsOutput } from "#/arrange/domain/types";
|
|
2
|
+
/**
|
|
3
|
+
* Machine-readable `arrange group` suggestion for `--json`.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.11.0
|
|
6
|
+
*/
|
|
7
|
+
export declare function formatArrangeGroupJsonOutput(output: ArrangeSuggestGroupsOutput): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Machine-readable `arrange group` suggestion for `--json`.
|
|
3
|
+
*
|
|
4
|
+
* @since 0.11.0
|
|
5
|
+
*/
|
|
6
|
+
export function formatArrangeGroupJsonOutput(output) {
|
|
7
|
+
return JSON.stringify({
|
|
8
|
+
schemaVersion: 1,
|
|
9
|
+
primaryLine: output.primaryLine,
|
|
10
|
+
bucketsCommentLine: output.bucketsCommentLine,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The request payload for `arrange group`.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.3.16-canary.0
|
|
6
|
+
*/
|
|
7
|
+
export type ArrangeSuggestGroupsRequest = {
|
|
8
|
+
inlineClasses: string;
|
|
9
|
+
emitTvStyleArray: boolean;
|
|
10
|
+
trailingClassName: boolean;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The `zod` schema validating an `arrange group` request.
|
|
14
|
+
*
|
|
15
|
+
* @since 0.3.16-canary.0
|
|
16
|
+
*/
|
|
17
|
+
export declare const arrangeSuggestGroupsRequestSchema: z.ZodType<ArrangeSuggestGroupsRequest>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The `zod` schema validating an `arrange group` request.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.3.16-canary.0
|
|
6
|
+
*/
|
|
7
|
+
export const arrangeSuggestGroupsRequestSchema = z.object({
|
|
8
|
+
inlineClasses: z
|
|
9
|
+
.string()
|
|
10
|
+
.min(1, 'Pass a class string. Example: codefast arrange group "flex gap-2 text-sm rounded-md"'),
|
|
11
|
+
emitTvStyleArray: z.boolean(),
|
|
12
|
+
trailingClassName: z.boolean(),
|
|
13
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ArrangeSuggestGroupsOutput } from "#/arrange/domain/types";
|
|
2
|
+
/**
|
|
3
|
+
* Presents the suggested grouping lines for an `arrange group` run.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.11.0
|
|
6
|
+
*/
|
|
7
|
+
export declare function presentArrangeGroupResult(output: ArrangeSuggestGroupsOutput): void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { logger } from "#/core/logger";
|
|
2
|
+
/**
|
|
3
|
+
* Presents the suggested grouping lines for an `arrange group` run.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.11.0
|
|
6
|
+
*/
|
|
7
|
+
export function presentArrangeGroupResult(output) {
|
|
8
|
+
logger.out(output.primaryLine);
|
|
9
|
+
logger.out(output.bucketsCommentLine);
|
|
10
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ArrangeSuggestGroupsOutput } from "#/arrange/domain/types";
|
|
2
|
+
import type { ArrangeSuggestGroupsRequest } from "#/arrange/group/cli-schema";
|
|
3
|
+
/**
|
|
4
|
+
* Formats the suggested grouping for an inline class string as `arrange group` output lines.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.3.16-canary.0
|
|
7
|
+
*/
|
|
8
|
+
export declare function suggestCnGroupsFromCli(request: ArrangeSuggestGroupsRequest): ArrangeSuggestGroupsOutput;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The request payload for `arrange inspect`.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.3.16-canary.0
|
|
6
|
+
*/
|
|
7
|
+
export type ArrangeAnalyzeDirectoryRequest = {
|
|
8
|
+
analyzeRootPath: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* The `zod` schema validating an `arrange inspect` request.
|
|
12
|
+
*
|
|
13
|
+
* @since 0.3.16-canary.0
|
|
14
|
+
*/
|
|
15
|
+
export declare const arrangeAnalyzeDirectoryRequestSchema: z.ZodType<ArrangeAnalyzeDirectoryRequest>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The `zod` schema validating an `arrange inspect` request.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.3.16-canary.0
|
|
6
|
+
*/
|
|
7
|
+
export const arrangeAnalyzeDirectoryRequestSchema = z.object({
|
|
8
|
+
analyzeRootPath: z.string().min(1, "analyzeRootPath is required"),
|
|
9
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rich domain: Tailwind/cn/tv analysis rules (counts, long literals, nested cn in tv).
|
|
3
|
+
* Pure orchestration of domain collectors and invariants — no I/O.
|
|
4
|
+
*/
|
|
5
|
+
import type { DomainSourceFile } from "#/arrange/domain/ast/ast-node";
|
|
6
|
+
import type { AnalyzeReport } from "#/arrange/domain/types";
|
|
7
|
+
/**
|
|
8
|
+
* Creates a zeroed analyze report ready for accumulation.
|
|
9
|
+
*
|
|
10
|
+
* @since 0.3.16-canary.0
|
|
11
|
+
*/
|
|
12
|
+
export declare function createEmptyAnalyzeReport(): AnalyzeReport;
|
|
13
|
+
/**
|
|
14
|
+
* Accumulates findings for one parsed source file into `report` (mutates report).
|
|
15
|
+
*
|
|
16
|
+
* @since 0.3.16-canary.0
|
|
17
|
+
*/
|
|
18
|
+
export declare function accumulateAnalyzeReportForSourceFile(report: AnalyzeReport, domainSf: DomainSourceFile, sourceText: string, filePath: string): void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AnalyzeReport } from "#/arrange/domain/types";
|
|
2
|
+
/**
|
|
3
|
+
* Presents the human-readable summary of an `arrange inspect` report.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.3.16-canary.0
|
|
6
|
+
*/
|
|
7
|
+
export declare function presentAnalyzeReport(resolvedTargetPath: string, report: AnalyzeReport): void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { LONG_STRING_TOKEN_THRESHOLD, MAX_REPORT_LINES } from "#/arrange/domain/constants";
|
|
3
|
+
import { logger } from "#/core/logger";
|
|
4
|
+
/**
|
|
5
|
+
* Presents the human-readable summary of an `arrange inspect` report.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.3.16-canary.0
|
|
8
|
+
*/
|
|
9
|
+
export function presentAnalyzeReport(resolvedTargetPath, report) {
|
|
10
|
+
logger.out(`Path: ${path.resolve(resolvedTargetPath)}`);
|
|
11
|
+
logger.out(`.ts/.tsx files: ${report.files}`);
|
|
12
|
+
logger.out(`cn(...) call sites: ${report.cnCallExpressions}`);
|
|
13
|
+
logger.out(`tv(...) call sites: ${report.tvCallExpressions}`);
|
|
14
|
+
logger.out(`\nLong cn(...) string literals (≥${LONG_STRING_TOKEN_THRESHOLD} tokens — consider splitting arguments): ${report.longCnStringLiterals.length}`);
|
|
15
|
+
for (const findingEntry of report.longCnStringLiterals.slice(0, MAX_REPORT_LINES)) {
|
|
16
|
+
logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
|
|
17
|
+
}
|
|
18
|
+
if (report.longCnStringLiterals.length > MAX_REPORT_LINES) {
|
|
19
|
+
logger.out(` … and ${report.longCnStringLiterals.length - MAX_REPORT_LINES} more`);
|
|
20
|
+
}
|
|
21
|
+
logger.out(`\nLong tv({...}) string literals in base/variants/… (≥${LONG_STRING_TOKEN_THRESHOLD} tokens): ${report.longTvStringLiterals.length}`);
|
|
22
|
+
for (const findingEntry of report.longTvStringLiterals.slice(0, MAX_REPORT_LINES)) {
|
|
23
|
+
logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
|
|
24
|
+
}
|
|
25
|
+
if (report.longTvStringLiterals.length > MAX_REPORT_LINES) {
|
|
26
|
+
logger.out(` … and ${report.longTvStringLiterals.length - MAX_REPORT_LINES} more`);
|
|
27
|
+
}
|
|
28
|
+
logger.out(`\nJSX className="..." or className={'...'} (static strings, ≥${LONG_STRING_TOKEN_THRESHOLD} tokens): ${report.longJsxClassNameLiterals.length}`);
|
|
29
|
+
for (const findingEntry of report.longJsxClassNameLiterals.slice(0, MAX_REPORT_LINES)) {
|
|
30
|
+
logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.tokenCount} tokens) ${findingEntry.preview}`);
|
|
31
|
+
}
|
|
32
|
+
if (report.longJsxClassNameLiterals.length > MAX_REPORT_LINES) {
|
|
33
|
+
logger.out(` … and ${report.longJsxClassNameLiterals.length - MAX_REPORT_LINES} more`);
|
|
34
|
+
}
|
|
35
|
+
logger.out(`\ncn(...) nested inside tv({...}) (prefer a string or array — preview/apply can rewrite): ${report.cnInsideTvCalls.length}`);
|
|
36
|
+
for (const findingEntry of report.cnInsideTvCalls.slice(0, MAX_REPORT_LINES)) {
|
|
37
|
+
logger.out(` ${findingEntry.file}:${findingEntry.line} (${findingEntry.argCount} args) ${findingEntry.preview}`);
|
|
38
|
+
}
|
|
39
|
+
if (report.cnInsideTvCalls.length > MAX_REPORT_LINES) {
|
|
40
|
+
logger.out(` … and ${report.cnInsideTvCalls.length - MAX_REPORT_LINES} more`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AnalyzeReport } from "#/arrange/domain/types";
|
|
2
|
+
import { AppError } from "#/core/errors";
|
|
3
|
+
import type { Filesystem } from "#/core/filesystem/filesystem";
|
|
4
|
+
import type { Result } from "#/core/result";
|
|
5
|
+
/**
|
|
6
|
+
* Scans a directory's arrange targets and returns the accumulated analyze report.
|
|
7
|
+
*
|
|
8
|
+
* @since 0.3.16-canary.0
|
|
9
|
+
*/
|
|
10
|
+
export declare function runArrangeInspect(fs: Filesystem, analyzeRootPath: string): Result<AnalyzeReport, AppError>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { accumulateAnalyzeReportForSourceFile, createEmptyAnalyzeReport } from "#/arrange/domain/analyze-service";
|
|
1
|
+
import { accumulateAnalyzeReportForSourceFile, createEmptyAnalyzeReport, } from "#/arrange/inspect/domain/analyze-service";
|
|
2
2
|
import { scanArrangeTargets } from "#/arrange/scan-target";
|
|
3
3
|
import { parseDomainSourceFile } from "#/arrange/source-parse";
|
|
4
4
|
import { AppError } from "#/core/errors";
|
|
@@ -9,7 +9,7 @@ import { err, ok } from "#/core/result";
|
|
|
9
9
|
*
|
|
10
10
|
* @since 0.3.16-canary.0
|
|
11
11
|
*/
|
|
12
|
-
export function
|
|
12
|
+
export function runArrangeInspect(fs, analyzeRootPath) {
|
|
13
13
|
const report = createEmptyAnalyzeReport();
|
|
14
14
|
try {
|
|
15
15
|
const files = scanArrangeTargets(fs, analyzeRootPath);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ArrangeTargetWorkspaceAndConfig } from "#/arrange/domain/types";
|
|
2
|
+
import { AppError } from "#/core/errors";
|
|
3
|
+
import type { Filesystem } from "#/core/filesystem/filesystem";
|
|
4
|
+
import type { Result } from "#/core/result";
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the arrange target, repo root, and loaded config an arrange run needs.
|
|
7
|
+
*
|
|
8
|
+
* @since 0.3.16-canary.0
|
|
9
|
+
*/
|
|
10
|
+
export declare function prepareArrangeWorkspace(fs: Filesystem, args: {
|
|
11
|
+
readonly currentWorkingDirectory: string;
|
|
12
|
+
readonly rawTarget: string | undefined;
|
|
13
|
+
}): Promise<Result<ArrangeTargetWorkspaceAndConfig, AppError>>;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { resolveArrangeTargetPath } from "#/arrange/resolve-target";
|
|
2
|
+
import { resolveProjectRootResult } from "#/core/cli/resolve-root";
|
|
2
3
|
import { loadCodefastConfig } from "#/core/config";
|
|
3
4
|
import { AppError } from "#/core/errors";
|
|
4
|
-
import { messageFrom } from "#/core/errors";
|
|
5
5
|
import { err, ok } from "#/core/result";
|
|
6
|
-
import { findRepoRoot } from "#/core/workspace/resolver";
|
|
7
6
|
/**
|
|
8
7
|
* Resolves the arrange target, repo root, and loaded config an arrange run needs.
|
|
9
8
|
*
|
|
@@ -17,13 +16,11 @@ export async function prepareArrangeWorkspace(fs, args) {
|
|
|
17
16
|
if (!fs.existsSync(resolvedTarget)) {
|
|
18
17
|
return err(new AppError("NOT_FOUND", `Not found: ${resolvedTarget}`));
|
|
19
18
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
catch (caughtError) {
|
|
25
|
-
return err(new AppError("INFRA_FAILURE", messageFrom(caughtError), caughtError));
|
|
19
|
+
const rootOutcome = resolveProjectRootResult(fs, args.currentWorkingDirectory);
|
|
20
|
+
if (!rootOutcome.ok) {
|
|
21
|
+
return rootOutcome;
|
|
26
22
|
}
|
|
23
|
+
const rootDir = rootOutcome.value;
|
|
27
24
|
const loadedOutcome = await loadCodefastConfig(rootDir, fs);
|
|
28
25
|
if (!loadedOutcome.ok) {
|
|
29
26
|
return loadedOutcome;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ArrangeRunResult } from "#/arrange/domain/types";
|
|
2
|
+
/**
|
|
3
|
+
* Machine-readable `arrange` run summary for `--json`, minus the non-serializable preview plans.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.11.0
|
|
6
|
+
*/
|
|
7
|
+
export declare function formatArrangeJsonOutput(result: ArrangeRunResult, write: boolean): string;
|
|
8
|
+
/**
|
|
9
|
+
* Exit `1` when an after-write hook failed, `0` otherwise.
|
|
10
|
+
*
|
|
11
|
+
* @since 0.11.0
|
|
12
|
+
*/
|
|
13
|
+
export declare function exitCodeForArrangeResult(result: ArrangeRunResult): number;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CLI_EXIT_GENERAL_ERROR, CLI_EXIT_SUCCESS } from "#/core/exit-codes";
|
|
2
|
+
/**
|
|
3
|
+
* Machine-readable `arrange` run summary for `--json`, minus the non-serializable preview plans.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.11.0
|
|
6
|
+
*/
|
|
7
|
+
export function formatArrangeJsonOutput(result, write) {
|
|
8
|
+
const { previewPlans: _plans, ...serializableResult } = result;
|
|
9
|
+
return JSON.stringify({
|
|
10
|
+
schemaVersion: 1,
|
|
11
|
+
ok: result.hookError === null,
|
|
12
|
+
write,
|
|
13
|
+
result: serializableResult,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Exit `1` when an after-write hook failed, `0` otherwise.
|
|
18
|
+
*
|
|
19
|
+
* @since 0.11.0
|
|
20
|
+
*/
|
|
21
|
+
export function exitCodeForArrangeResult(result) {
|
|
22
|
+
return result.hookError !== null ? CLI_EXIT_GENERAL_ERROR : CLI_EXIT_SUCCESS;
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The request payload for a top-level `arrange` run.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.3.16-canary.0
|
|
6
|
+
*/
|
|
7
|
+
export type ArrangeRunRequest = {
|
|
8
|
+
rootDir: string;
|
|
9
|
+
targetPath: string;
|
|
10
|
+
write: boolean;
|
|
11
|
+
withClassName?: boolean | undefined;
|
|
12
|
+
cnImport?: string | undefined;
|
|
13
|
+
config?: unknown;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* The `zod` schema validating an `arrange` run request.
|
|
17
|
+
*
|
|
18
|
+
* @since 0.3.16-canary.0
|
|
19
|
+
*/
|
|
20
|
+
export declare const arrangeRunRequestSchema: z.ZodType<ArrangeRunRequest>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The `zod` schema validating an `arrange` run request.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.3.16-canary.0
|
|
6
|
+
*/
|
|
7
|
+
export const arrangeRunRequestSchema = z.object({
|
|
8
|
+
rootDir: z.string().min(1),
|
|
9
|
+
targetPath: z.string().min(1),
|
|
10
|
+
write: z.boolean(),
|
|
11
|
+
withClassName: z.boolean().optional(),
|
|
12
|
+
cnImport: z.string().optional(),
|
|
13
|
+
config: z.unknown().optional(),
|
|
14
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { GroupFileWorkPlan } from "#/arrange/domain/grouping-service";
|
|
2
|
+
import type { ArrangeRunResult } from "#/arrange/domain/types";
|
|
3
|
+
/**
|
|
4
|
+
* Presents the totals and follow-up hints for an `arrange` run.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.3.16-canary.0
|
|
7
|
+
*/
|
|
8
|
+
export declare function presentArrangeResult(result: ArrangeRunResult, write: boolean): void;
|
|
9
|
+
/**
|
|
10
|
+
* Presents the per-file preview of a work plan's unwrap and grouping edits.
|
|
11
|
+
*
|
|
12
|
+
* @since 0.3.16-canary.0
|
|
13
|
+
*/
|
|
14
|
+
export declare function presentGroupFilePreviewFromWork(work: GroupFileWorkPlan): void;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { lineOf } from "#/arrange/domain/ast/helpers";
|
|
2
|
+
import { logger } from "#/core/logger";
|
|
3
|
+
/**
|
|
4
|
+
* Presents the totals and follow-up hints for an `arrange` run.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.3.16-canary.0
|
|
7
|
+
*/
|
|
8
|
+
export function presentArrangeResult(result, write) {
|
|
9
|
+
logger.out(`\nTotal: ${result.filePaths.length} file(s), ${result.totalFound} site(s) (cn/tv/JSX className) to review.`);
|
|
10
|
+
if (write) {
|
|
11
|
+
logger.out(`Applied: ${result.totalChanged} site(s) updated.`);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
logger.out(`(Re-run without --dry-run to write changes, or "pnpm cli:arrange" / "pnpm exec codefast arrange")`);
|
|
15
|
+
}
|
|
16
|
+
const shouldShowCascadeHint = write ? result.totalChanged > 0 : result.totalFound > 0;
|
|
17
|
+
if (shouldShowCascadeHint) {
|
|
18
|
+
logger.out("Note: class order may change across concern groups — smoke-test the UI if you rely on cascade order.");
|
|
19
|
+
}
|
|
20
|
+
if (result.hookError !== null) {
|
|
21
|
+
logger.err(result.hookError);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Presents the per-file preview of a work plan's unwrap and grouping edits.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.3.16-canary.0
|
|
28
|
+
*/
|
|
29
|
+
export function presentGroupFilePreviewFromWork(work) {
|
|
30
|
+
presentGroupFilePreviewBody({
|
|
31
|
+
filePath: work.filePath,
|
|
32
|
+
reportTotal: work.reportTotal,
|
|
33
|
+
cnInTvNoReplacement: work.cnInTvNoReplacement,
|
|
34
|
+
cnInTvCalls: work.cnInTvCalls,
|
|
35
|
+
unwrapReplacementByCall: work.unwrapReplacementByCall,
|
|
36
|
+
sourceText: work.sourceText,
|
|
37
|
+
domainSf: work.domainSfForLineNumbers,
|
|
38
|
+
unwrapEdits: work.unwrapEdits,
|
|
39
|
+
plannedGroupEdits: work.plannedGroupEdits,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function presentGroupFilePreviewBody(args) {
|
|
43
|
+
const { filePath, reportTotal, cnInTvNoReplacement, cnInTvCalls, unwrapReplacementByCall, sourceText, domainSf, unwrapEdits, plannedGroupEdits, } = args;
|
|
44
|
+
let header = `\n── ${filePath} (${reportTotal} site(s)`;
|
|
45
|
+
if (cnInTvNoReplacement > 0) {
|
|
46
|
+
header += `; plus ${cnInTvNoReplacement} cn() inside tv left unchanged (0 args)`;
|
|
47
|
+
}
|
|
48
|
+
header += `) ──`;
|
|
49
|
+
logger.out(header);
|
|
50
|
+
for (const call of cnInTvCalls) {
|
|
51
|
+
const replacement = unwrapReplacementByCall.get(call);
|
|
52
|
+
if (replacement === undefined) {
|
|
53
|
+
logger.out(` Line ${lineOf(domainSf, call)} [tv ⊃ cn]: cn(...) has no arguments — skipped`);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const start = call.pos;
|
|
57
|
+
const end = call.end;
|
|
58
|
+
if (sourceText.slice(start, end) === replacement) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
logger.out(` Line ${lineOf(domainSf, call)} [tv ⊃ cn → string/array]:`);
|
|
62
|
+
logger.out(` ${replacement.split("\n").join("\n ")}`);
|
|
63
|
+
}
|
|
64
|
+
if (unwrapEdits.length > 0 && plannedGroupEdits.length > 0) {
|
|
65
|
+
logger.out(" ([cn] / [tv] / [JSX className] lines below reflect content after unwrap of cn inside tv.)");
|
|
66
|
+
}
|
|
67
|
+
for (const plan of plannedGroupEdits) {
|
|
68
|
+
logger.out(` Line ${lineOf(plan.lineSf, plan.reportNode)} [${plan.label}]:`);
|
|
69
|
+
logger.out(` ${plan.replacement.split("\n").join("\n ")}`);
|
|
70
|
+
logger.out(` // Buckets: ${JSON.stringify(plan.bucketSummary)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ArrangeGroupFileOptions, GroupFileResult } from "#/arrange/domain/types";
|
|
2
|
+
import type { Filesystem } from "#/core/filesystem/filesystem";
|
|
3
|
+
/**
|
|
4
|
+
* Runs the grouping pipeline on one file — preview or write — and returns its per-file result.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.3.16-canary.0
|
|
7
|
+
*/
|
|
8
|
+
export declare function processArrangeGroupFile(fs: Filesystem, args: {
|
|
9
|
+
readonly filePath: string;
|
|
10
|
+
readonly options: ArrangeGroupFileOptions;
|
|
11
|
+
}): GroupFileResult;
|