@codefast/cli 0.3.13-canary.1 → 0.3.13-canary.2
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/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/{bin.mjs → bin.js} +1 -4
- package/dist/commands/arrange.d.ts +3 -0
- package/dist/commands/arrange.d.ts.map +1 -0
- package/dist/commands/arrange.js +129 -0
- package/dist/commands/mirror.d.ts +4 -0
- package/dist/commands/mirror.d.ts.map +1 -0
- package/dist/commands/mirror.js +75 -0
- package/dist/commands/tag.d.ts +3 -0
- package/dist/commands/tag.d.ts.map +1 -0
- package/dist/commands/tag.js +41 -0
- package/dist/lib/arrange/application/analyze.d.ts +17 -0
- package/dist/lib/arrange/application/analyze.d.ts.map +1 -0
- package/dist/lib/arrange/application/analyze.js +24 -0
- package/dist/lib/arrange/application/group-file-preview.d.ts +17 -0
- package/dist/lib/arrange/application/group-file-preview.d.ts.map +1 -0
- package/dist/lib/arrange/application/group-file-preview.js +46 -0
- package/dist/lib/arrange/application/group-file.d.ts +5 -0
- package/dist/lib/arrange/application/group-file.d.ts.map +1 -0
- package/dist/lib/arrange/application/group-file.js +40 -0
- package/dist/lib/arrange/application/ports/domain-source-parser.port.d.ts +5 -0
- package/dist/lib/arrange/application/ports/domain-source-parser.port.d.ts.map +1 -0
- package/dist/lib/arrange/application/ports/file-walker.port.d.ts +5 -0
- package/dist/lib/arrange/application/ports/file-walker.port.d.ts.map +1 -0
- package/dist/lib/arrange/application/requests/analyze-directory.request.d.ts +6 -0
- package/dist/lib/arrange/application/requests/analyze-directory.request.d.ts.map +1 -0
- package/dist/lib/arrange/application/requests/analyze-directory.request.js +4 -0
- package/dist/lib/arrange/application/requests/arrange-sync.request.d.ts +18 -0
- package/dist/lib/arrange/application/requests/arrange-sync.request.d.ts.map +1 -0
- package/dist/lib/arrange/application/requests/arrange-sync.request.js +15 -0
- package/dist/lib/arrange/application/run-target.d.ts +19 -0
- package/dist/lib/arrange/application/run-target.d.ts.map +1 -0
- package/dist/lib/arrange/application/run-target.js +85 -0
- package/dist/lib/arrange/domain/arrange-analyze.service.d.ts +12 -0
- package/dist/lib/arrange/domain/arrange-analyze.service.d.ts.map +1 -0
- package/dist/lib/arrange/domain/arrange-analyze.service.js +116 -0
- package/dist/lib/arrange/domain/arrange-grouping.service.d.ts +53 -0
- package/dist/lib/arrange/domain/arrange-grouping.service.d.ts.map +1 -0
- package/dist/lib/arrange/domain/arrange-grouping.service.js +106 -0
- package/dist/lib/arrange/domain/ast/ast-helpers.d.ts +28 -0
- package/dist/lib/arrange/domain/ast/ast-helpers.d.ts.map +1 -0
- package/dist/lib/arrange/domain/ast/ast-helpers.js +130 -0
- package/dist/lib/arrange/domain/ast/ast-node.model.d.ts +179 -0
- package/dist/lib/arrange/domain/ast/ast-node.model.d.ts.map +1 -0
- package/dist/lib/arrange/domain/ast/ast-node.model.js +210 -0
- package/dist/lib/arrange/domain/ast/collectors-cn.d.ts +7 -0
- package/dist/lib/arrange/domain/ast/collectors-cn.d.ts.map +1 -0
- package/dist/lib/arrange/domain/ast/collectors-cn.js +70 -0
- package/dist/lib/arrange/domain/ast/collectors-jsx.d.ts +4 -0
- package/dist/lib/arrange/domain/ast/collectors-jsx.d.ts.map +1 -0
- package/dist/lib/arrange/domain/ast/collectors-jsx.js +21 -0
- package/dist/lib/arrange/domain/ast/collectors-tv.d.ts +13 -0
- package/dist/lib/arrange/domain/ast/collectors-tv.d.ts.map +1 -0
- package/dist/lib/arrange/domain/ast/collectors-tv.js +302 -0
- package/dist/lib/arrange/domain/ast/targets.d.ts +8 -0
- package/dist/lib/arrange/domain/ast/targets.d.ts.map +1 -0
- package/dist/lib/arrange/domain/ast/targets.js +147 -0
- package/dist/lib/arrange/domain/constants.d.ts +68 -0
- package/dist/lib/arrange/domain/constants.d.ts.map +1 -0
- package/dist/lib/arrange/domain/constants.js +180 -0
- package/dist/lib/arrange/domain/errors.d.ts +14 -0
- package/dist/lib/arrange/domain/errors.d.ts.map +1 -0
- package/dist/lib/arrange/domain/errors.js +16 -0
- package/dist/lib/arrange/domain/grouping.d.ts +41 -0
- package/dist/lib/arrange/domain/grouping.d.ts.map +1 -0
- package/dist/lib/arrange/domain/grouping.js +307 -0
- package/dist/lib/arrange/domain/imports.d.ts +7 -0
- package/dist/lib/arrange/domain/imports.d.ts.map +1 -0
- package/dist/lib/arrange/domain/imports.js +80 -0
- package/dist/lib/arrange/domain/source-text-formatters.d.ts +16 -0
- package/dist/lib/arrange/domain/source-text-formatters.d.ts.map +1 -0
- package/dist/lib/arrange/domain/source-text-formatters.js +55 -0
- package/dist/lib/arrange/domain/tokenizer.d.ts +45 -0
- package/dist/lib/arrange/domain/tokenizer.d.ts.map +1 -0
- package/dist/lib/arrange/domain/tokenizer.js +466 -0
- package/dist/lib/arrange/domain/types.d.ts +112 -0
- package/dist/lib/arrange/domain/types.d.ts.map +1 -0
- package/dist/lib/arrange/domain/types.js +7 -0
- package/dist/lib/arrange/index.d.ts +45 -0
- package/dist/lib/arrange/index.d.ts.map +1 -0
- package/dist/lib/arrange/index.js +41 -0
- package/dist/lib/arrange/infra/arrange-sync-cli-options.d.ts +14 -0
- package/dist/lib/arrange/infra/arrange-sync-cli-options.d.ts.map +1 -0
- package/dist/lib/arrange/infra/domain-source-parser.adapter.d.ts +11 -0
- package/dist/lib/arrange/infra/domain-source-parser.adapter.d.ts.map +1 -0
- package/dist/lib/arrange/infra/domain-source-parser.adapter.js +19 -0
- package/dist/lib/arrange/infra/ensure-cn-import.d.ts +3 -0
- package/dist/lib/arrange/infra/ensure-cn-import.d.ts.map +1 -0
- package/dist/lib/arrange/infra/ensure-cn-import.js +6 -0
- package/dist/lib/arrange/infra/file-walker.adapter.d.ts +8 -0
- package/dist/lib/arrange/infra/file-walker.adapter.d.ts.map +1 -0
- package/dist/lib/arrange/infra/file-walker.adapter.js +17 -0
- package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.d.ts +8 -0
- package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.d.ts.map +1 -0
- package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.js +25 -0
- package/dist/lib/arrange/infra/ts-ast-translator.d.ts +10 -0
- package/dist/lib/arrange/infra/ts-ast-translator.d.ts.map +1 -0
- package/dist/lib/arrange/infra/ts-ast-translator.js +363 -0
- package/dist/lib/arrange/presentation/formatters.d.ts +3 -0
- package/dist/lib/arrange/presentation/formatters.d.ts.map +1 -0
- package/dist/lib/arrange/presentation/formatters.js +2 -0
- package/dist/lib/arrange/presentation/report.d.ts +4 -0
- package/dist/lib/arrange/presentation/report.d.ts.map +1 -0
- package/dist/lib/arrange/presentation/report.js +37 -0
- package/dist/lib/config/domain/schema.d.ts +50 -0
- package/dist/lib/config/domain/schema.d.ts.map +1 -0
- package/dist/lib/config/domain/schema.js +43 -0
- package/dist/lib/config/index.d.ts +4 -0
- package/dist/lib/config/index.d.ts.map +1 -0
- package/dist/lib/config/index.js +2 -0
- package/dist/lib/config/infra/loader.d.ts +11 -0
- package/dist/lib/config/infra/loader.d.ts.map +1 -0
- package/dist/lib/config/infra/loader.js +90 -0
- package/dist/lib/core/application/architecture-boundaries.d.ts +19 -0
- package/dist/lib/core/application/architecture-boundaries.d.ts.map +1 -0
- package/dist/lib/core/application/architecture-boundaries.js +263 -0
- package/dist/lib/core/application/ports/cli-io.port.d.ts +27 -0
- package/dist/lib/core/application/ports/cli-io.port.d.ts.map +1 -0
- package/dist/lib/core/application/schema-parse.d.ts +8 -0
- package/dist/lib/core/application/schema-parse.d.ts.map +1 -0
- package/dist/lib/core/application/schema-parse.js +20 -0
- package/dist/lib/core/application/utils/caught-unknown-message.d.ts +6 -0
- package/dist/lib/core/application/utils/caught-unknown-message.d.ts.map +1 -0
- package/dist/lib/core/application/utils/caught-unknown-message.js +34 -0
- package/dist/lib/core/application/utils/verbose-diagnostics.d.ts +5 -0
- package/dist/lib/core/application/utils/verbose-diagnostics.d.ts.map +1 -0
- package/dist/lib/core/application/utils/verbose-diagnostics.js +7 -0
- package/dist/lib/core/domain/errors.d.ts +11 -0
- package/dist/lib/core/domain/errors.d.ts.map +1 -0
- package/dist/lib/core/domain/errors.js +9 -0
- package/dist/lib/core/domain/result.d.ts +15 -0
- package/dist/lib/core/domain/result.d.ts.map +1 -0
- package/dist/lib/core/domain/result.js +9 -0
- package/dist/lib/core/infra/container.d.ts +34 -0
- package/dist/lib/core/infra/container.d.ts.map +1 -0
- package/dist/lib/core/infra/container.js +65 -0
- package/dist/lib/core/infra/logging-decorator.d.ts +12 -0
- package/dist/lib/core/infra/logging-decorator.d.ts.map +1 -0
- package/dist/lib/core/infra/logging-decorator.js +75 -0
- package/dist/lib/core/presentation/cli-executor.d.ts +33 -0
- package/dist/lib/core/presentation/cli-executor.d.ts.map +1 -0
- package/dist/lib/core/presentation/cli-executor.js +73 -0
- package/dist/lib/core/presentation/create-command-handler.d.ts +20 -0
- package/dist/lib/core/presentation/create-command-handler.d.ts.map +1 -0
- package/dist/lib/core/presentation/create-command-handler.js +70 -0
- package/dist/lib/core/presentation/format-app-error.d.ts +6 -0
- package/dist/lib/core/presentation/format-app-error.d.ts.map +1 -0
- package/dist/lib/core/presentation/format-app-error.js +19 -0
- package/dist/lib/infra/caught-unknown-message.d.ts +2 -0
- package/dist/lib/infra/caught-unknown-message.d.ts.map +1 -0
- package/dist/lib/infra/caught-unknown-message.js +1 -0
- package/dist/lib/infra/config-reporter.d.ts +4 -0
- package/dist/lib/infra/config-reporter.d.ts.map +1 -0
- package/dist/lib/infra/config-reporter.js +9 -0
- package/dist/lib/infra/fs-contract.d.ts +2 -0
- package/dist/lib/infra/fs-contract.d.ts.map +1 -0
- package/dist/lib/infra/fs-contract.js +1 -0
- package/dist/lib/infra/node-io.d.ts +4 -0
- package/dist/lib/infra/node-io.d.ts.map +1 -0
- package/dist/lib/infra/node-io.js +27 -0
- package/dist/lib/infra/workspace/repo-root.d.ts +7 -0
- package/dist/lib/infra/workspace/repo-root.d.ts.map +1 -0
- package/dist/lib/infra/workspace/repo-root.js +23 -0
- package/dist/lib/mirror/application/engine.d.ts +10 -0
- package/dist/lib/mirror/application/engine.d.ts.map +1 -0
- package/dist/lib/mirror/application/engine.js +271 -0
- package/dist/lib/mirror/application/ports/file-system-service.port.d.ts +6 -0
- package/dist/lib/mirror/application/ports/file-system-service.port.d.ts.map +1 -0
- package/dist/lib/mirror/application/ports/file-system-service.port.js +1 -0
- package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.d.ts +27 -0
- package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.d.ts.map +1 -0
- package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.js +1 -0
- package/dist/lib/mirror/application/ports/package-repository.port.d.ts +16 -0
- package/dist/lib/mirror/application/ports/package-repository.port.d.ts.map +1 -0
- package/dist/lib/mirror/application/ports/package-repository.port.js +1 -0
- package/dist/lib/mirror/application/ports/workspace-service.port.d.ts +7 -0
- package/dist/lib/mirror/application/ports/workspace-service.port.d.ts.map +1 -0
- package/dist/lib/mirror/application/ports/workspace-service.port.js +1 -0
- package/dist/lib/mirror/application/requests/mirror-sync.request.d.ts +10 -0
- package/dist/lib/mirror/application/requests/mirror-sync.request.d.ts.map +1 -0
- package/dist/lib/mirror/application/requests/mirror-sync.request.js +8 -0
- package/dist/lib/mirror/application/sync.d.ts +19 -0
- package/dist/lib/mirror/application/sync.d.ts.map +1 -0
- package/dist/lib/mirror/application/sync.js +168 -0
- package/dist/lib/mirror/domain/constants.d.ts +6 -0
- package/dist/lib/mirror/domain/constants.d.ts.map +1 -0
- package/dist/lib/mirror/domain/constants.js +5 -0
- package/dist/lib/mirror/domain/errors.d.ts +10 -0
- package/dist/lib/mirror/domain/errors.d.ts.map +1 -0
- package/dist/lib/mirror/domain/errors.js +12 -0
- package/dist/lib/mirror/domain/types.d.ts +65 -0
- package/dist/lib/mirror/domain/types.d.ts.map +1 -0
- package/dist/lib/mirror/domain/types.js +1 -0
- package/dist/lib/mirror/index.d.ts +6 -0
- package/dist/lib/mirror/index.d.ts.map +1 -0
- package/dist/lib/mirror/index.js +1 -0
- package/dist/lib/mirror/infra/dirent-list.d.ts +9 -0
- package/dist/lib/mirror/infra/dirent-list.d.ts.map +1 -0
- package/dist/lib/mirror/infra/dirent-list.js +13 -0
- package/dist/lib/mirror/infra/file-system-service.adapter.d.ts +7 -0
- package/dist/lib/mirror/infra/file-system-service.adapter.d.ts.map +1 -0
- package/dist/lib/mirror/infra/file-system-service.adapter.js +47 -0
- package/dist/lib/mirror/infra/mirror-sync-cli-options.d.ts +14 -0
- package/dist/lib/mirror/infra/mirror-sync-cli-options.d.ts.map +1 -0
- package/dist/lib/mirror/infra/mirror-sync-cli-options.js +1 -0
- package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.d.ts +3 -0
- package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.d.ts.map +1 -0
- package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.js +13 -0
- package/dist/lib/mirror/infra/package-filter.d.ts +8 -0
- package/dist/lib/mirror/infra/package-filter.d.ts.map +1 -0
- package/dist/lib/mirror/infra/package-filter.js +33 -0
- package/dist/lib/mirror/infra/package-repository.adapter.d.ts +17 -0
- package/dist/lib/mirror/infra/package-repository.adapter.d.ts.map +1 -0
- package/dist/lib/mirror/infra/package-repository.adapter.js +17 -0
- package/dist/lib/mirror/infra/path-normalizer.d.ts +2 -0
- package/dist/lib/mirror/infra/path-normalizer.d.ts.map +1 -0
- package/dist/lib/mirror/infra/path-normalizer.js +4 -0
- package/dist/lib/mirror/infra/update-pkg.d.ts +19 -0
- package/dist/lib/mirror/infra/update-pkg.d.ts.map +1 -0
- package/dist/lib/mirror/infra/update-pkg.js +156 -0
- package/dist/lib/mirror/infra/workspace-packages.d.ts +26 -0
- package/dist/lib/mirror/infra/workspace-packages.d.ts.map +1 -0
- package/dist/lib/mirror/infra/workspace-packages.js +170 -0
- package/dist/lib/mirror/infra/workspace-service.adapter.d.ts +8 -0
- package/dist/lib/mirror/infra/workspace-service.adapter.d.ts.map +1 -0
- package/dist/lib/mirror/infra/workspace-service.adapter.js +10 -0
- package/dist/lib/mirror/presentation/reporter.d.ts +25 -0
- package/dist/lib/mirror/presentation/reporter.d.ts.map +1 -0
- package/dist/lib/mirror/presentation/reporter.js +140 -0
- package/dist/lib/shared/source-code/domain/text-edit.d.ts +14 -0
- package/dist/lib/shared/source-code/domain/text-edit.d.ts.map +1 -0
- package/dist/lib/shared/source-code/domain/text-edit.js +30 -0
- package/dist/lib/shared/source-code/infra/tsx-file-walk.d.ts +4 -0
- package/dist/lib/shared/source-code/infra/tsx-file-walk.d.ts.map +1 -0
- package/dist/lib/shared/source-code/infra/tsx-file-walk.js +37 -0
- package/dist/lib/tag/application/engine.d.ts +23 -0
- package/dist/lib/tag/application/engine.d.ts.map +1 -0
- package/dist/lib/tag/application/engine.js +357 -0
- package/dist/lib/tag/application/ports/target-resolver.port.d.ts +6 -0
- package/dist/lib/tag/application/ports/target-resolver.port.d.ts.map +1 -0
- package/dist/lib/tag/application/ports/target-resolver.port.js +1 -0
- package/dist/lib/tag/application/ports/typescript-tree-walk.port.d.ts +6 -0
- package/dist/lib/tag/application/ports/typescript-tree-walk.port.d.ts.map +1 -0
- package/dist/lib/tag/application/ports/typescript-tree-walk.port.js +1 -0
- package/dist/lib/tag/application/requests/tag-sync.request.d.ts +10 -0
- package/dist/lib/tag/application/requests/tag-sync.request.d.ts.map +1 -0
- package/dist/lib/tag/application/requests/tag-sync.request.js +8 -0
- package/dist/lib/tag/domain/types.d.ts +56 -0
- package/dist/lib/tag/domain/types.d.ts.map +1 -0
- package/dist/lib/tag/domain/types.js +1 -0
- package/dist/lib/tag/index.d.ts +14 -0
- package/dist/lib/tag/index.d.ts.map +1 -0
- package/dist/lib/tag/index.js +10 -0
- package/dist/lib/tag/infra/tag-sync-cli-options.d.ts +14 -0
- package/dist/lib/tag/infra/tag-sync-cli-options.d.ts.map +1 -0
- package/dist/lib/tag/infra/tag-sync-cli-options.js +1 -0
- package/dist/lib/tag/infra/tag-target-resolver.adapter.d.ts +3 -0
- package/dist/lib/tag/infra/tag-target-resolver.adapter.d.ts.map +1 -0
- package/dist/lib/tag/infra/tag-target-resolver.adapter.js +4 -0
- package/dist/lib/tag/infra/target-resolver.d.ts +4 -0
- package/dist/lib/tag/infra/target-resolver.d.ts.map +1 -0
- package/dist/lib/tag/infra/target-resolver.js +200 -0
- package/dist/lib/tag/infra/typescript-tree-walk.adapter.d.ts +3 -0
- package/dist/lib/tag/infra/typescript-tree-walk.adapter.d.ts.map +1 -0
- package/dist/lib/tag/infra/typescript-tree-walk.adapter.js +4 -0
- package/dist/lib/tag/presentation/colors.d.ts +8 -0
- package/dist/lib/tag/presentation/colors.d.ts.map +1 -0
- package/dist/lib/tag/presentation/colors.js +9 -0
- package/dist/lib/tag/presentation/tag-presenter.d.ts +20 -0
- package/dist/lib/tag/presentation/tag-presenter.d.ts.map +1 -0
- package/dist/lib/tag/presentation/tag-presenter.js +92 -0
- package/dist/program.d.ts +4 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +40 -0
- package/package.json +8 -5
- package/dist/commands/arrange.mjs +0 -107
- package/dist/commands/mirror.mjs +0 -66
- package/dist/commands/tag.mjs +0 -58
- package/dist/lib/arrange/application/analyze.mjs +0 -92
- package/dist/lib/arrange/application/group-file.mjs +0 -113
- package/dist/lib/arrange/application/run-target.mjs +0 -65
- package/dist/lib/arrange/domain/ast/ast-helpers.mjs +0 -115
- package/dist/lib/arrange/domain/ast/collectors-cn.mjs +0 -61
- package/dist/lib/arrange/domain/ast/collectors-jsx.mjs +0 -20
- package/dist/lib/arrange/domain/ast/collectors-tv.mjs +0 -170
- package/dist/lib/arrange/domain/ast/targets.mjs +0 -106
- package/dist/lib/arrange/domain/constants.mjs +0 -169
- package/dist/lib/arrange/domain/errors.mjs +0 -19
- package/dist/lib/arrange/domain/grouping.mjs +0 -235
- package/dist/lib/arrange/domain/imports.mjs +0 -54
- package/dist/lib/arrange/domain/tokenizer.mjs +0 -216
- package/dist/lib/arrange/index.mjs +0 -15
- package/dist/lib/arrange/infra/walk.mjs +0 -33
- package/dist/lib/arrange/presentation/formatters.mjs +0 -52
- package/dist/lib/arrange/presentation/report.mjs +0 -24
- package/dist/lib/config/domain/schema.mjs +0 -25
- package/dist/lib/config/index.mjs +0 -3
- package/dist/lib/config/infra/loader.mjs +0 -78
- package/dist/lib/infra/caught-unknown-message.mjs +0 -20
- package/dist/lib/infra/config-reporter.mjs +0 -10
- package/dist/lib/infra/node-io.mjs +0 -30
- package/dist/lib/infra/workspace/repo-root.mjs +0 -22
- package/dist/lib/mirror/application/engine.mjs +0 -248
- package/dist/lib/mirror/application/sync.mjs +0 -162
- package/dist/lib/mirror/domain/constants.mjs +0 -12
- package/dist/lib/mirror/domain/errors.mjs +0 -15
- package/dist/lib/mirror/index.mjs +0 -2
- package/dist/lib/mirror/infra/dirent-list.mjs +0 -14
- package/dist/lib/mirror/infra/package-filter.mjs +0 -26
- package/dist/lib/mirror/infra/path-normalizer.mjs +0 -7
- package/dist/lib/mirror/infra/update-pkg.mjs +0 -105
- package/dist/lib/mirror/infra/workspace-packages.mjs +0 -159
- package/dist/lib/mirror/presentation/reporter.mjs +0 -111
- package/dist/lib/tag/application/engine.mjs +0 -287
- package/dist/lib/tag/index.mjs +0 -4
- package/dist/lib/tag/infra/target-resolver.mjs +0 -170
- package/dist/lib/tag/presentation/colors.mjs +0 -12
- package/dist/lib/tag/presentation/tag-presenter.mjs +0 -63
- package/dist/program.mjs +0 -34
- /package/dist/lib/arrange/{domain/types.mjs → application/ports/domain-source-parser.port.js} +0 -0
- /package/dist/lib/{infra/fs-contract.mjs → arrange/application/ports/file-walker.port.js} +0 -0
- /package/dist/lib/{mirror/domain/types.mjs → arrange/infra/arrange-sync-cli-options.js} +0 -0
- /package/dist/lib/{tag/domain/types.mjs → core/application/ports/cli-io.port.js} +0 -0
package/dist/commands/tag.mjs
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { messageFromCaughtUnknown } from "../lib/infra/caught-unknown-message.mjs";
|
|
2
|
-
import { loadConfig } from "../lib/config/infra/loader.mjs";
|
|
3
|
-
import "../lib/config/index.mjs";
|
|
4
|
-
import { printConfigSchemaWarnings } from "../lib/infra/config-reporter.mjs";
|
|
5
|
-
import { createNodeCliFs, createNodeCliLogger } from "../lib/infra/node-io.mjs";
|
|
6
|
-
import { findRepoRoot } from "../lib/infra/workspace/repo-root.mjs";
|
|
7
|
-
import { runTagSync } from "../lib/tag/application/engine.mjs";
|
|
8
|
-
import { createTagProgressListener, formatSummary, formatTargetTable, formatWarningsAndErrors } from "../lib/tag/presentation/tag-presenter.mjs";
|
|
9
|
-
import "../lib/tag/index.mjs";
|
|
10
|
-
import process from "node:process";
|
|
11
|
-
import path from "node:path";
|
|
12
|
-
//#region src/commands/tag.ts
|
|
13
|
-
function resolveTagRootDir(fs, logger) {
|
|
14
|
-
try {
|
|
15
|
-
return findRepoRoot(fs);
|
|
16
|
-
} catch (caughtRepoRootError) {
|
|
17
|
-
logger.out(`[tag] workspace root auto-detection failed (${messageFromCaughtUnknown(caughtRepoRootError)}), using cwd=${process.cwd()}`);
|
|
18
|
-
return process.cwd();
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function registerTagCommand(program) {
|
|
22
|
-
program.command("tag").alias("annotate").description("Add @since <version> JSDoc tags to exported declarations").argument("[target]", "Directory or file to annotate (default: auto-discover workspace packages)").option("--dry-run", "Show summary without writing files", false).action(async (target, options) => {
|
|
23
|
-
const fs = createNodeCliFs();
|
|
24
|
-
const logger = createNodeCliLogger();
|
|
25
|
-
const rootDir = resolveTagRootDir(fs, logger);
|
|
26
|
-
let tagConfig = {};
|
|
27
|
-
try {
|
|
28
|
-
const { config, warnings } = await loadConfig(fs, rootDir);
|
|
29
|
-
printConfigSchemaWarnings(logger, warnings);
|
|
30
|
-
tagConfig = config.tag ?? {};
|
|
31
|
-
} catch (caughtConfigError) {
|
|
32
|
-
logger.err(messageFromCaughtUnknown(caughtConfigError));
|
|
33
|
-
process.exitCode = 1;
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const tagResult = await runTagSync({
|
|
37
|
-
rootDir,
|
|
38
|
-
config: tagConfig,
|
|
39
|
-
skipPackages: tagConfig.skipPackages,
|
|
40
|
-
targetPath: target ? path.resolve(target) : void 0,
|
|
41
|
-
write: !options.dryRun,
|
|
42
|
-
fs,
|
|
43
|
-
listener: createTagProgressListener((line) => logger.out(line))
|
|
44
|
-
});
|
|
45
|
-
logger.out(formatTargetTable(tagResult.selectedTargets, rootDir));
|
|
46
|
-
if (tagResult.selectedTargets.length === 0) {
|
|
47
|
-
logger.err("No packages found in workspace. Check your pnpm-workspace.yaml or provide an explicit target path.");
|
|
48
|
-
process.exitCode = 1;
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const warningsAndErrorsSection = formatWarningsAndErrors(tagResult);
|
|
52
|
-
if (warningsAndErrorsSection) logger.err(warningsAndErrorsSection);
|
|
53
|
-
logger.out(formatSummary(tagResult));
|
|
54
|
-
process.exitCode = tagResult.targetResults.some((targetResult) => targetResult.runError !== null) || tagResult.hookError ? 1 : 0;
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
//#endregion
|
|
58
|
-
export { registerTagCommand };
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import "../domain/constants.mjs";
|
|
2
|
-
import { tokenizeClassString } from "../domain/tokenizer.mjs";
|
|
3
|
-
import { forEachStringLiteralInClassExpression } from "../domain/ast/collectors-cn.mjs";
|
|
4
|
-
import { jsxClassNameStaticLiteral } from "../domain/ast/collectors-jsx.mjs";
|
|
5
|
-
import { buildKnownCnTvBindings, isCnOrTvIdentifier, lineOf } from "../domain/ast/ast-helpers.mjs";
|
|
6
|
-
import { collectCnCallsInsideTv, traverseTvObject } from "../domain/ast/collectors-tv.mjs";
|
|
7
|
-
import { walkTsxFiles } from "../infra/walk.mjs";
|
|
8
|
-
import ts from "typescript";
|
|
9
|
-
//#region src/lib/arrange/application/analyze.ts
|
|
10
|
-
function analyzeCnCall(sf, call, report) {
|
|
11
|
-
for (const arg of call.arguments) forEachStringLiteralInClassExpression(arg, (lit) => {
|
|
12
|
-
const text = lit.text;
|
|
13
|
-
const tokenCount = tokenizeClassString(text).length;
|
|
14
|
-
if (tokenCount >= 18) report.longCnStringLiterals.push({
|
|
15
|
-
file: sf.fileName,
|
|
16
|
-
line: lineOf(sf, lit),
|
|
17
|
-
tokenCount,
|
|
18
|
-
preview: text.length > 72 ? `${text.slice(0, 72)}…` : text
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
function visitCallExpressionForArrangeAnalyze(callExpression, sf, sourceText, knownBindings, report) {
|
|
23
|
-
if (isCnOrTvIdentifier(callExpression.expression, "cn", knownBindings)) {
|
|
24
|
-
report.cnCallExpressions++;
|
|
25
|
-
analyzeCnCall(sf, callExpression, report);
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
if (!isCnOrTvIdentifier(callExpression.expression, "tv", knownBindings)) return;
|
|
29
|
-
report.tvCallExpressions++;
|
|
30
|
-
const arg0 = callExpression.arguments[0];
|
|
31
|
-
if (!arg0 || !ts.isObjectLiteralExpression(arg0)) return;
|
|
32
|
-
for (const nestedCn of collectCnCallsInsideTv(sf, arg0, knownBindings, 0)) {
|
|
33
|
-
const src = sourceText.slice(nestedCn.getStart(sf), nestedCn.getEnd());
|
|
34
|
-
const preview = src.length > 72 ? `${src.slice(0, 72)}…` : src;
|
|
35
|
-
report.cnInsideTvCalls.push({
|
|
36
|
-
file: sf.fileName,
|
|
37
|
-
line: lineOf(sf, nestedCn),
|
|
38
|
-
argCount: nestedCn.arguments.length,
|
|
39
|
-
preview
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
traverseTvObject(sf, arg0, (classLiteral) => {
|
|
43
|
-
const text = classLiteral.text;
|
|
44
|
-
const tokenCount = tokenizeClassString(text).length;
|
|
45
|
-
if (tokenCount >= 18) report.longTvStringLiterals.push({
|
|
46
|
-
file: sf.fileName,
|
|
47
|
-
line: lineOf(sf, classLiteral),
|
|
48
|
-
tokenCount,
|
|
49
|
-
preview: text.length > 72 ? `${text.slice(0, 72)}…` : text
|
|
50
|
-
});
|
|
51
|
-
}, 0, knownBindings);
|
|
52
|
-
}
|
|
53
|
-
function visitJsxAttributeForArrangeAnalyze(jsxClassAttribute, sf, filePath, report) {
|
|
54
|
-
if (!filePath.endsWith(".tsx")) return;
|
|
55
|
-
const parsed = jsxClassNameStaticLiteral(jsxClassAttribute);
|
|
56
|
-
if (!parsed) return;
|
|
57
|
-
const text = parsed.lit.text;
|
|
58
|
-
const tokenCount = tokenizeClassString(text).length;
|
|
59
|
-
if (tokenCount >= 18) report.longJsxClassNameLiterals.push({
|
|
60
|
-
file: sf.fileName,
|
|
61
|
-
line: lineOf(sf, parsed.lit),
|
|
62
|
-
tokenCount,
|
|
63
|
-
preview: text.length > 72 ? `${text.slice(0, 72)}…` : text
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
function analyzeDirectory(analyzeRootPath, fs) {
|
|
67
|
-
const report = {
|
|
68
|
-
files: 0,
|
|
69
|
-
cnCallExpressions: 0,
|
|
70
|
-
tvCallExpressions: 0,
|
|
71
|
-
cnInsideTvCalls: [],
|
|
72
|
-
longCnStringLiterals: [],
|
|
73
|
-
longTvStringLiterals: [],
|
|
74
|
-
longJsxClassNameLiterals: []
|
|
75
|
-
};
|
|
76
|
-
const files = fs.statSync(analyzeRootPath).isDirectory() ? walkTsxFiles(analyzeRootPath, fs) : [analyzeRootPath];
|
|
77
|
-
for (const filePath of files) {
|
|
78
|
-
const sourceText = fs.readFileSync(filePath, "utf8");
|
|
79
|
-
const sf = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, filePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
|
|
80
|
-
report.files++;
|
|
81
|
-
const knownBindings = buildKnownCnTvBindings(sf);
|
|
82
|
-
const visitTypeScriptSubtree = (tsNode) => {
|
|
83
|
-
if (ts.isCallExpression(tsNode)) visitCallExpressionForArrangeAnalyze(tsNode, sf, sourceText, knownBindings, report);
|
|
84
|
-
if (ts.isJsxAttribute(tsNode)) visitJsxAttributeForArrangeAnalyze(tsNode, sf, filePath, report);
|
|
85
|
-
ts.forEachChild(tsNode, visitTypeScriptSubtree);
|
|
86
|
-
};
|
|
87
|
-
visitTypeScriptSubtree(sf);
|
|
88
|
-
}
|
|
89
|
-
return report;
|
|
90
|
-
}
|
|
91
|
-
//#endregion
|
|
92
|
-
export { analyzeDirectory };
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { applyEditsDescending, buildKnownCnTvBindings, lineOf, unwrapCnInsideTvCallReplacement } from "../domain/ast/ast-helpers.mjs";
|
|
2
|
-
import { listAllCnCallsInsideTvInSourceFile } from "../domain/ast/collectors-tv.mjs";
|
|
3
|
-
import { collectGroupTargets, planGroupEditForTarget, targetReplaceStart } from "../domain/ast/targets.mjs";
|
|
4
|
-
import { ensureCnImport } from "../domain/imports.mjs";
|
|
5
|
-
import ts from "typescript";
|
|
6
|
-
//#region src/lib/arrange/application/group-file.ts
|
|
7
|
-
function printGroupFilePreview(logger, args) {
|
|
8
|
-
const { out } = logger;
|
|
9
|
-
const { filePath, reportTotal, cnInTvNoReplacement, cnInTvCalls, unwrapReplacementByCall, sourceText, sf, unwrapEdits, plannedGroupEdits } = args;
|
|
10
|
-
let header = `\n── ${filePath} (${reportTotal} site(s)`;
|
|
11
|
-
if (cnInTvNoReplacement > 0) header += `; plus ${cnInTvNoReplacement} cn() inside tv left unchanged (0 args)`;
|
|
12
|
-
header += `) ──`;
|
|
13
|
-
out(header);
|
|
14
|
-
for (const call of cnInTvCalls) {
|
|
15
|
-
const replacement = unwrapReplacementByCall.get(call);
|
|
16
|
-
if (replacement === void 0) {
|
|
17
|
-
out(` Line ${lineOf(sf, call)} [tv ⊃ cn]: cn(...) has no arguments — skipped`);
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
const start = call.getStart(sf);
|
|
21
|
-
const end = call.getEnd();
|
|
22
|
-
if (sourceText.slice(start, end) === replacement) continue;
|
|
23
|
-
out(` Line ${lineOf(sf, call)} [tv ⊃ cn → string/array]:`);
|
|
24
|
-
out(` ${replacement.split("\n").join("\n ")}`);
|
|
25
|
-
}
|
|
26
|
-
if (unwrapEdits.length > 0 && plannedGroupEdits.length > 0) out(" ([cn] / [tv] / [JSX className] lines below reflect content after unwrap of cn inside tv.)");
|
|
27
|
-
for (const plan of plannedGroupEdits) {
|
|
28
|
-
out(` Line ${lineOf(plan.lineSf, plan.reportNode)} [${plan.label}]:`);
|
|
29
|
-
out(` ${plan.replacement.split("\n").join("\n ")}`);
|
|
30
|
-
out(` // Buckets: ${JSON.stringify(plan.bucketSummary)}`);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function applyGroupFileWrites(filePath, options, fs, logger, unwrapEdits, textAfterUnwrap, plannedGroupEdits, cnInTvNoReplacement) {
|
|
34
|
-
const groupEdits = plannedGroupEdits.map((plannedEdit) => ({
|
|
35
|
-
start: plannedEdit.start,
|
|
36
|
-
end: plannedEdit.end,
|
|
37
|
-
replacement: plannedEdit.replacement,
|
|
38
|
-
jsxCn: plannedEdit.jsxCn
|
|
39
|
-
}));
|
|
40
|
-
const touchedJsxCn = groupEdits.some((groupEdit) => groupEdit.jsxCn);
|
|
41
|
-
let newText = groupEdits.length > 0 ? applyEditsDescending(textAfterUnwrap, groupEdits) : textAfterUnwrap;
|
|
42
|
-
const changed = unwrapEdits.length + groupEdits.length;
|
|
43
|
-
if (changed > 0) {
|
|
44
|
-
if (touchedJsxCn) newText = ensureCnImport(newText, filePath, options.cnImport);
|
|
45
|
-
fs.writeFileSync(filePath, newText, "utf8");
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
filePath,
|
|
49
|
-
totalFound: changed + cnInTvNoReplacement,
|
|
50
|
-
changed
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
function groupFile(filePath, options, fs, logger) {
|
|
54
|
-
const sourceText = fs.readFileSync(filePath, "utf8");
|
|
55
|
-
const sf = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, filePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
|
|
56
|
-
const cnInTvCalls = listAllCnCallsInsideTvInSourceFile(sf, buildKnownCnTvBindings(sf));
|
|
57
|
-
const unwrapPlans = cnInTvCalls.map((call) => {
|
|
58
|
-
const replacement = unwrapCnInsideTvCallReplacement(call, sourceText, sf);
|
|
59
|
-
if (replacement === void 0) return;
|
|
60
|
-
return {
|
|
61
|
-
start: call.getStart(sf),
|
|
62
|
-
end: call.getEnd(),
|
|
63
|
-
replacement,
|
|
64
|
-
call
|
|
65
|
-
};
|
|
66
|
-
}).filter((planOrUndefined) => planOrUndefined !== void 0);
|
|
67
|
-
const unwrapReplacementByCall = new Map(unwrapPlans.map((unwrapPlan) => [unwrapPlan.call, unwrapPlan.replacement]));
|
|
68
|
-
const unwrapEdits = unwrapPlans.filter((unwrapPlan) => sourceText.slice(unwrapPlan.start, unwrapPlan.end) !== unwrapPlan.replacement);
|
|
69
|
-
const textAfterUnwrap = unwrapEdits.length > 0 ? applyEditsDescending(sourceText, unwrapEdits) : sourceText;
|
|
70
|
-
const groupTargets = collectGroupTargets(ts.createSourceFile(filePath, textAfterUnwrap, ts.ScriptTarget.Latest, true, filePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS), filePath);
|
|
71
|
-
const cnInTvNoReplacement = cnInTvCalls.length - unwrapPlans.length;
|
|
72
|
-
const sortedTargets = [...groupTargets].sort((leftTarget, rightTarget) => targetReplaceStart(rightTarget) - targetReplaceStart(leftTarget));
|
|
73
|
-
const plannedGroupEdits = [];
|
|
74
|
-
for (const groupTarget of sortedTargets) {
|
|
75
|
-
const plan = planGroupEditForTarget(groupTarget, textAfterUnwrap, options.withClassName);
|
|
76
|
-
if (plan === void 0) continue;
|
|
77
|
-
if (textAfterUnwrap.slice(plan.start, plan.end) === plan.replacement) continue;
|
|
78
|
-
plannedGroupEdits.push(plan);
|
|
79
|
-
}
|
|
80
|
-
const editSitesCount = unwrapEdits.length + plannedGroupEdits.length;
|
|
81
|
-
const reportTotal = editSitesCount + cnInTvNoReplacement;
|
|
82
|
-
if (cnInTvCalls.length === 0 && groupTargets.length === 0) return {
|
|
83
|
-
filePath,
|
|
84
|
-
totalFound: 0,
|
|
85
|
-
changed: 0
|
|
86
|
-
};
|
|
87
|
-
if (!options.write) {
|
|
88
|
-
if (editSitesCount === 0 && cnInTvNoReplacement === 0) return {
|
|
89
|
-
filePath,
|
|
90
|
-
totalFound: 0,
|
|
91
|
-
changed: 0
|
|
92
|
-
};
|
|
93
|
-
printGroupFilePreview(logger, {
|
|
94
|
-
filePath,
|
|
95
|
-
reportTotal,
|
|
96
|
-
cnInTvNoReplacement,
|
|
97
|
-
cnInTvCalls,
|
|
98
|
-
unwrapReplacementByCall,
|
|
99
|
-
sourceText,
|
|
100
|
-
sf,
|
|
101
|
-
unwrapEdits,
|
|
102
|
-
plannedGroupEdits
|
|
103
|
-
});
|
|
104
|
-
return {
|
|
105
|
-
filePath,
|
|
106
|
-
totalFound: reportTotal,
|
|
107
|
-
changed: 0
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
return applyGroupFileWrites(filePath, options, fs, logger, unwrapEdits, textAfterUnwrap, plannedGroupEdits, cnInTvNoReplacement);
|
|
111
|
-
}
|
|
112
|
-
//#endregion
|
|
113
|
-
export { groupFile };
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { messageFromCaughtUnknown } from "../../infra/caught-unknown-message.mjs";
|
|
2
|
-
import { walkTsxFiles } from "../infra/walk.mjs";
|
|
3
|
-
import { groupFile } from "./group-file.mjs";
|
|
4
|
-
import { ArrangeError, ArrangeErrorCode } from "../domain/errors.mjs";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
//#region src/lib/arrange/application/run-target.ts
|
|
7
|
-
function runOnTarget(target, options, fs, logger) {
|
|
8
|
-
const { out } = logger;
|
|
9
|
-
if (!fs.existsSync(target)) throw new ArrangeError(ArrangeErrorCode.TARGET_NOT_FOUND, `Not found: ${target}`);
|
|
10
|
-
const filePaths = fs.statSync(target).isDirectory() ? walkTsxFiles(target, fs) : [target];
|
|
11
|
-
const modifiedFiles = [];
|
|
12
|
-
let totalFound = 0;
|
|
13
|
-
let totalChanged = 0;
|
|
14
|
-
for (const filePath of filePaths) {
|
|
15
|
-
const result = groupFile(filePath, options, fs, logger);
|
|
16
|
-
totalFound += result.totalFound;
|
|
17
|
-
totalChanged += result.changed;
|
|
18
|
-
if (result.changed > 0) modifiedFiles.push(result.filePath);
|
|
19
|
-
}
|
|
20
|
-
out(`\nTotal: ${filePaths.length} file(s), ${totalFound} site(s) (cn/tv/JSX className) to review.`);
|
|
21
|
-
if (options.write) out(`Applied: ${totalChanged} site(s) updated.`);
|
|
22
|
-
else out(`(Run "apply" to write changes, or "pnpm cli:arrange-apply" / "pnpm exec codefast arrange apply")`);
|
|
23
|
-
if (options.write ? totalChanged > 0 : totalFound > 0) out("Note: class order may change across concern groups — smoke-test the UI if you rely on cascade order.");
|
|
24
|
-
return {
|
|
25
|
-
filePaths,
|
|
26
|
-
modifiedFiles,
|
|
27
|
-
totalFound,
|
|
28
|
-
totalChanged
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
async function runArrangeOnAfterWriteHook(logger, hook, modifiedFiles) {
|
|
32
|
-
if (!hook || modifiedFiles.length === 0) return;
|
|
33
|
-
try {
|
|
34
|
-
await hook({ files: modifiedFiles });
|
|
35
|
-
} catch (caughtHookError) {
|
|
36
|
-
logger.err(`[arrange] onAfterWrite hook failed: ${messageFromCaughtUnknown(caughtHookError)}`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* CLI entry: run arrange preview/apply using config injected by the command layer.
|
|
41
|
-
* @returns Process exit code (`0`, or `1` when the target path is missing).
|
|
42
|
-
*/
|
|
43
|
-
async function runArrangeSync(opts) {
|
|
44
|
-
opts.rootDir;
|
|
45
|
-
const { fs, logger } = opts;
|
|
46
|
-
const resolvedTarget = path.resolve(opts.targetPath);
|
|
47
|
-
let result;
|
|
48
|
-
try {
|
|
49
|
-
result = runOnTarget(resolvedTarget, {
|
|
50
|
-
write: opts.write,
|
|
51
|
-
withClassName: !!opts.withClassName,
|
|
52
|
-
cnImport: opts.cnImport
|
|
53
|
-
}, fs, logger);
|
|
54
|
-
} catch (caughtError) {
|
|
55
|
-
if (caughtError instanceof ArrangeError && caughtError.code === ArrangeErrorCode.TARGET_NOT_FOUND) {
|
|
56
|
-
logger.err(caughtError.message);
|
|
57
|
-
return 1;
|
|
58
|
-
}
|
|
59
|
-
throw caughtError;
|
|
60
|
-
}
|
|
61
|
-
if (opts.write && result.modifiedFiles.length > 0) await runArrangeOnAfterWriteHook(logger, opts.config?.onAfterWrite, result.modifiedFiles);
|
|
62
|
-
return 0;
|
|
63
|
-
}
|
|
64
|
-
//#endregion
|
|
65
|
-
export { runArrangeSync, runOnTarget };
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { EMPTY_CN_TV_BINDINGS } from "../constants.mjs";
|
|
2
|
-
import ts from "typescript";
|
|
3
|
-
//#region src/lib/arrange/domain/ast/ast-helpers.ts
|
|
4
|
-
/** Known module specifiers that export `cn` / `tv`. */
|
|
5
|
-
const KNOWN_CN_TV_MODULES = new Set([
|
|
6
|
-
"@codefast/tailwind-variants",
|
|
7
|
-
"clsx",
|
|
8
|
-
"class-variance-authority",
|
|
9
|
-
"tailwind-variants",
|
|
10
|
-
"#lib/utils",
|
|
11
|
-
"~/lib/utils",
|
|
12
|
-
"@/lib/utils"
|
|
13
|
-
]);
|
|
14
|
-
/**
|
|
15
|
-
* True for typical shadcn-style re-exports: `./utils`, `@/lib/utils`, `…/utils/…`,
|
|
16
|
-
* or a dedicated `cn.ts` / `cn.tsx` module.
|
|
17
|
-
*/
|
|
18
|
-
function moduleLooksLikeCnTvReexport(moduleSpecifier) {
|
|
19
|
-
const norm = moduleSpecifier.replace(/\\/g, "/");
|
|
20
|
-
if (/(?:^|[./])utils(?:\/|$)/.test(norm)) return true;
|
|
21
|
-
if (/\/utils\//.test(norm) || /\/utils$/.test(norm)) return true;
|
|
22
|
-
if (/(?:^|\/)cn\.tsx?$/.test(norm)) return true;
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Build a set of local binding names that are imported from a known cn/tv
|
|
27
|
-
* module in `sf`.
|
|
28
|
-
*/
|
|
29
|
-
function buildKnownCnTvBindings(sf) {
|
|
30
|
-
const bindings = /* @__PURE__ */ new Set();
|
|
31
|
-
for (const stmt of sf.statements) {
|
|
32
|
-
if (!ts.isImportDeclaration(stmt) || !stmt.importClause) continue;
|
|
33
|
-
if (stmt.importClause.isTypeOnly) continue;
|
|
34
|
-
const spec = stmt.moduleSpecifier;
|
|
35
|
-
if (!ts.isStringLiteral(spec)) continue;
|
|
36
|
-
const moduleSpecifier = spec.text;
|
|
37
|
-
if (!KNOWN_CN_TV_MODULES.has(moduleSpecifier) && !moduleLooksLikeCnTvReexport(moduleSpecifier)) continue;
|
|
38
|
-
const clause = stmt.importClause;
|
|
39
|
-
if (clause.name) bindings.add(clause.name.text);
|
|
40
|
-
if (!clause.namedBindings) continue;
|
|
41
|
-
if (ts.isNamedImports(clause.namedBindings)) {
|
|
42
|
-
for (const namedImport of clause.namedBindings.elements) bindings.add(namedImport.name.text);
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
bindings.add(clause.namedBindings.name.text);
|
|
46
|
-
}
|
|
47
|
-
return bindings;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Returns true when `expr` is an identifier whose name matches `name` AND
|
|
51
|
-
* that name is listed in `knownBindings` from a recognized import.
|
|
52
|
-
*/
|
|
53
|
-
function isCnOrTvIdentifier(expr, name, knownBindings = EMPTY_CN_TV_BINDINGS) {
|
|
54
|
-
if (knownBindings.size === 0) return false;
|
|
55
|
-
if (ts.isIdentifier(expr) && expr.text === name) return knownBindings.has(expr.text);
|
|
56
|
-
if (ts.isPropertyAccessExpression(expr) && expr.name.text === name) return ts.isIdentifier(expr.expression) && knownBindings.has(expr.expression.text);
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
function propertyAssignmentNameText(prop) {
|
|
60
|
-
if (ts.isIdentifier(prop.name)) return prop.name.text;
|
|
61
|
-
if (ts.isStringLiteral(prop.name)) return prop.name.text;
|
|
62
|
-
}
|
|
63
|
-
function lineOf(sf, tsNode) {
|
|
64
|
-
return sf.getLineAndCharacterOfPosition(tsNode.getStart(sf)).line + 1;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Returns only the leading whitespace (tabs / spaces) of the line containing
|
|
68
|
-
* `pos`.
|
|
69
|
-
*/
|
|
70
|
-
function indentOfLineContaining(source, pos) {
|
|
71
|
-
const searchPos = Math.max(0, Math.min(pos, source.length));
|
|
72
|
-
const prevLineBreak = Math.max(source.lastIndexOf("\n", searchPos - 1), source.lastIndexOf("\r", searchPos - 1));
|
|
73
|
-
const lineStart = prevLineBreak === -1 ? 0 : prevLineBreak + 1;
|
|
74
|
-
let lineEnd = source.length;
|
|
75
|
-
for (let i = lineStart; i < source.length; i++) {
|
|
76
|
-
const ch = source[i];
|
|
77
|
-
if (ch === "\n" || ch === "\r") {
|
|
78
|
-
lineEnd = i;
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
const line = source.slice(lineStart, lineEnd);
|
|
83
|
-
return /^[\t ]*/.exec(line)?.[0] ?? "";
|
|
84
|
-
}
|
|
85
|
-
function applyEditsDescending(sourceText, edits) {
|
|
86
|
-
const sorted = [...edits].sort((editA, editB) => editB.start - editA.start);
|
|
87
|
-
let out = sourceText;
|
|
88
|
-
for (const edit of sorted) out = out.slice(0, edit.start) + edit.replacement + out.slice(edit.end);
|
|
89
|
-
return out;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Replace `cn(...)` nested in `tv({...})` with a plain string (one arg) or a string
|
|
93
|
-
* array (multiple args). Returns undefined when there are zero arguments.
|
|
94
|
-
*/
|
|
95
|
-
function unwrapCnInsideTvCallReplacement(call, sourceText, sf) {
|
|
96
|
-
const args = call.arguments;
|
|
97
|
-
if (args.length === 0) return;
|
|
98
|
-
const baseIndent = indentOfLineContaining(sourceText, call.getStart(sf));
|
|
99
|
-
const innerIndent = `${baseIndent} `;
|
|
100
|
-
if (args.length === 1) {
|
|
101
|
-
const firstArg = args[0];
|
|
102
|
-
return sourceText.slice(firstArg.getStart(sf), firstArg.getEnd());
|
|
103
|
-
}
|
|
104
|
-
const lines = ["["];
|
|
105
|
-
for (let i = 0; i < args.length; i++) {
|
|
106
|
-
const arg = args[i];
|
|
107
|
-
const piece = sourceText.slice(arg.getStart(sf), arg.getEnd());
|
|
108
|
-
const comma = i < args.length - 1 || args.length > 1 ? "," : "";
|
|
109
|
-
lines.push(`${innerIndent}${piece}${comma}`);
|
|
110
|
-
}
|
|
111
|
-
lines.push(`${baseIndent}]`);
|
|
112
|
-
return lines.join("\n");
|
|
113
|
-
}
|
|
114
|
-
//#endregion
|
|
115
|
-
export { KNOWN_CN_TV_MODULES, applyEditsDescending, buildKnownCnTvBindings, indentOfLineContaining, isCnOrTvIdentifier, lineOf, moduleLooksLikeCnTvReexport, propertyAssignmentNameText, unwrapCnInsideTvCallReplacement };
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import "../constants.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 { CN_APPLY_LITERAL_WALK_OPTS, collectUnconditionalTailwindLiteralsFromCnArguments, forEachStringLiteralInClassExpression, isUnsafeLiteralForCnStyleApplySplit, mergeCnUnconditionalLiteralPoolForTest };
|
|
@@ -1,20 +0,0 @@
|
|
|
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;
|
|
5
|
-
const init = jsxClassNameAttribute.initializer;
|
|
6
|
-
if (!init) return;
|
|
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 };
|