@codefast/cli 0.3.13-canary.0 → 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/analyze-DvtJ3j9m.mjs +0 -92
- package/dist/arrange-Bbh62DrU.mjs +0 -107
- package/dist/arrange-BqP2DI3w.mjs +0 -8
- package/dist/ast-helpers-MDRYuIAk.mjs +0 -115
- package/dist/caught-unknown-message-CRhkDWO7.mjs +0 -20
- package/dist/collectors-cn-BS8TTQ8O.mjs +0 -61
- package/dist/collectors-jsx-D9tL2ZPM.mjs +0 -20
- package/dist/collectors-tv-D2PXZaRt.mjs +0 -170
- package/dist/colors-BjdkCfGK.mjs +0 -12
- package/dist/commands/arrange.mjs +0 -2
- package/dist/commands/mirror.mjs +0 -2
- package/dist/commands/mirror.test.mjs +0 -48
- package/dist/commands/tag.mjs +0 -2
- package/dist/config-DVia_f9a.mjs +0 -3
- package/dist/config-reporter-SCcWDZc1.mjs +0 -10
- package/dist/constants-AtPhF-Ct.mjs +0 -169
- package/dist/constants-Bq5wdyLC.mjs +0 -8
- package/dist/dirent-list-BSDeRG5i.mjs +0 -14
- package/dist/engine-CcWEHSCq.mjs +0 -287
- package/dist/engine-DRTdkc5u.mjs +0 -236
- package/dist/errors-CFH4w6ic.mjs +0 -15
- package/dist/errors-CpU1ogfA.mjs +0 -19
- package/dist/formatters-DGE8jJ53.mjs +0 -52
- package/dist/group-file-ClW7XdD6.mjs +0 -113
- package/dist/grouping-c1grpCQT.mjs +0 -235
- package/dist/imports-DSVq1xhB.mjs +0 -54
- package/dist/lib/arrange/application/analyze.mjs +0 -2
- package/dist/lib/arrange/application/analyze.test.mjs +0 -171
- package/dist/lib/arrange/application/group-file.mjs +0 -2
- package/dist/lib/arrange/application/group-file.test.mjs +0 -273
- package/dist/lib/arrange/application/run-target.mjs +0 -2
- package/dist/lib/arrange/application/run-target.test.mjs +0 -97
- package/dist/lib/arrange/domain/ast/ast-helpers.mjs +0 -2
- package/dist/lib/arrange/domain/ast/ast-helpers.test.mjs +0 -148
- package/dist/lib/arrange/domain/ast/collectors-cn.mjs +0 -2
- package/dist/lib/arrange/domain/ast/collectors-cn.test.mjs +0 -58
- package/dist/lib/arrange/domain/ast/collectors-jsx.mjs +0 -2
- package/dist/lib/arrange/domain/ast/collectors-jsx.test.mjs +0 -20
- package/dist/lib/arrange/domain/ast/collectors-tv.mjs +0 -2
- package/dist/lib/arrange/domain/ast/collectors-tv.test.mjs +0 -145
- package/dist/lib/arrange/domain/ast/targets.mjs +0 -2
- package/dist/lib/arrange/domain/ast/targets.test.mjs +0 -50
- package/dist/lib/arrange/domain/constants.mjs +0 -2
- package/dist/lib/arrange/domain/errors.mjs +0 -2
- package/dist/lib/arrange/domain/grouping.mjs +0 -2
- package/dist/lib/arrange/domain/grouping.test.mjs +0 -186
- package/dist/lib/arrange/domain/imports.mjs +0 -2
- package/dist/lib/arrange/domain/imports.test.mjs +0 -48
- package/dist/lib/arrange/domain/tokenizer.mjs +0 -2
- package/dist/lib/arrange/domain/tokenizer.test.mjs +0 -165
- package/dist/lib/arrange/index.mjs +0 -16
- package/dist/lib/arrange/infra/walk.mjs +0 -2
- package/dist/lib/arrange/infra/walk.test.mjs +0 -50
- package/dist/lib/arrange/presentation/formatters.mjs +0 -2
- package/dist/lib/arrange/presentation/formatters.test.mjs +0 -73
- package/dist/lib/arrange/presentation/report.mjs +0 -2
- package/dist/lib/config/domain/schema.mjs +0 -2
- package/dist/lib/config/index.mjs +0 -4
- package/dist/lib/config/infra/loader.mjs +0 -2
- package/dist/lib/config/infra/loader.test.mjs +0 -116
- package/dist/lib/infra/caught-unknown-message.mjs +0 -2
- package/dist/lib/infra/config-reporter.mjs +0 -2
- package/dist/lib/infra/node-io.mjs +0 -2
- package/dist/lib/infra/workspace/repo-root.mjs +0 -2
- package/dist/lib/infra/workspace/repo-root.test.mjs +0 -45
- package/dist/lib/mirror/application/engine.mjs +0 -2
- package/dist/lib/mirror/application/sync.mjs +0 -2
- package/dist/lib/mirror/application/sync.test.mjs +0 -482
- package/dist/lib/mirror/domain/constants.mjs +0 -2
- package/dist/lib/mirror/domain/errors.mjs +0 -2
- package/dist/lib/mirror/index.mjs +0 -3
- package/dist/lib/mirror/infra/dirent-list.mjs +0 -2
- package/dist/lib/mirror/infra/dirent-list.test.mjs +0 -18
- package/dist/lib/mirror/infra/package-filter.mjs +0 -2
- package/dist/lib/mirror/infra/package-filter.test.mjs +0 -32
- package/dist/lib/mirror/infra/path-normalizer.mjs +0 -2
- package/dist/lib/mirror/infra/update-pkg.mjs +0 -2
- package/dist/lib/mirror/infra/workspace-packages.mjs +0 -2
- package/dist/lib/mirror/infra/workspace-packages.test.mjs +0 -167
- package/dist/lib/mirror/presentation/reporter.mjs +0 -2
- package/dist/lib/tag/application/engine.mjs +0 -2
- package/dist/lib/tag/application/engine.test.mjs +0 -159
- package/dist/lib/tag/index.mjs +0 -5
- package/dist/lib/tag/infra/target-resolver.mjs +0 -2
- package/dist/lib/tag/presentation/colors.mjs +0 -2
- package/dist/lib/tag/presentation/tag-presenter.mjs +0 -2
- package/dist/lib/tag/presentation/tag-presenter.test.mjs +0 -29
- package/dist/loader-DpN-zl5g.mjs +0 -78
- package/dist/mirror-CbGiLXKT.mjs +0 -2
- package/dist/mirror-DqJE3ejL.mjs +0 -66
- package/dist/node-io-DFRbHO6m.mjs +0 -30
- package/dist/package-filter-C_8ryqvz.mjs +0 -26
- package/dist/path-normalizer-D4ceBO3l.mjs +0 -7
- package/dist/program-DR-H4tH3.mjs +0 -34
- package/dist/program.mjs +0 -2
- package/dist/repo-root-HmtIEm6J.mjs +0 -22
- package/dist/report-DYxvw34T.mjs +0 -24
- package/dist/reporter-CwIe_tAM.mjs +0 -108
- package/dist/run-target-CJWrqNT4.mjs +0 -65
- package/dist/schema-Or8RAARd.mjs +0 -25
- package/dist/sync-e1Sp-shi.mjs +0 -157
- package/dist/tag-Cd9JujU5.mjs +0 -2
- package/dist/tag-hEKVZ_-7.mjs +0 -58
- package/dist/tag-presenter-Cs66UBsH.mjs +0 -63
- package/dist/target-resolver-CR3FXMTy.mjs +0 -170
- package/dist/targets-pCTslnFh.mjs +0 -106
- package/dist/tokenizer-CeZx73Zu.mjs +0 -216
- package/dist/update-pkg-CnGfjWBy.mjs +0 -37
- package/dist/walk-DjgQn66n.mjs +0 -33
- package/dist/workspace-packages-K2NYTHJq.mjs +0 -159
- /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
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { appError } from "#lib/core/domain/errors";
|
|
3
|
+
import { err, ok } from "#lib/core/domain/result";
|
|
4
|
+
import { messageFromCaughtUnknown } from "#lib/core/application/utils/caught-unknown-message";
|
|
5
|
+
import { groupFile } from "#lib/arrange/application/group-file";
|
|
6
|
+
export function runOnTarget(request, deps) {
|
|
7
|
+
const { out } = deps.logger;
|
|
8
|
+
const { fs, fileWalker, domainSourceParser } = deps;
|
|
9
|
+
if (!fs.existsSync(request.targetPath)) {
|
|
10
|
+
return err(appError("NOT_FOUND", `Not found: ${request.targetPath}`));
|
|
11
|
+
}
|
|
12
|
+
const filePaths = fs.statSync(request.targetPath).isDirectory()
|
|
13
|
+
? fileWalker.walkTypeScriptFiles(request.targetPath, fs)
|
|
14
|
+
: [request.targetPath];
|
|
15
|
+
const modifiedFiles = [];
|
|
16
|
+
let totalFound = 0;
|
|
17
|
+
let totalChanged = 0;
|
|
18
|
+
const groupOptions = {
|
|
19
|
+
write: request.write,
|
|
20
|
+
withClassName: !!request.withClassName,
|
|
21
|
+
cnImport: request.cnImport,
|
|
22
|
+
};
|
|
23
|
+
for (const filePath of filePaths) {
|
|
24
|
+
const result = groupFile(filePath, groupOptions, fs, deps.logger, domainSourceParser);
|
|
25
|
+
totalFound += result.totalFound;
|
|
26
|
+
totalChanged += result.changed;
|
|
27
|
+
if (result.changed > 0) {
|
|
28
|
+
modifiedFiles.push(result.filePath);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
out(`\nTotal: ${filePaths.length} file(s), ${totalFound} site(s) (cn/tv/JSX className) to review.`);
|
|
32
|
+
if (request.write) {
|
|
33
|
+
out(`Applied: ${totalChanged} site(s) updated.`);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
out(`(Run "apply" to write changes, or "pnpm cli:arrange-apply" / "pnpm exec codefast arrange apply")`);
|
|
37
|
+
}
|
|
38
|
+
const showCascadeHint = request.write ? totalChanged > 0 : totalFound > 0;
|
|
39
|
+
if (showCascadeHint) {
|
|
40
|
+
out("Note: class order may change across concern groups — smoke-test the UI if you rely on cascade order.");
|
|
41
|
+
}
|
|
42
|
+
return ok({
|
|
43
|
+
filePaths,
|
|
44
|
+
modifiedFiles,
|
|
45
|
+
totalFound,
|
|
46
|
+
totalChanged,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function runArrangeOnAfterWriteHook(logger, hook, modifiedFiles) {
|
|
50
|
+
if (!hook || modifiedFiles.length === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
await hook({ files: modifiedFiles });
|
|
55
|
+
}
|
|
56
|
+
catch (caughtHookError) {
|
|
57
|
+
logger.err(`[arrange] onAfterWrite hook failed: ${messageFromCaughtUnknown(caughtHookError)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Preview/apply orchestration: resolves target path, runs grouping pipeline, optional hook.
|
|
62
|
+
*/
|
|
63
|
+
export async function runArrangeSync(request, deps) {
|
|
64
|
+
void request.rootDir;
|
|
65
|
+
const resolvedTarget = path.resolve(request.targetPath);
|
|
66
|
+
const runTargetRequest = {
|
|
67
|
+
targetPath: resolvedTarget,
|
|
68
|
+
write: request.write,
|
|
69
|
+
withClassName: request.withClassName,
|
|
70
|
+
cnImport: request.cnImport,
|
|
71
|
+
};
|
|
72
|
+
const runOutcome = runOnTarget(runTargetRequest, deps);
|
|
73
|
+
if (!runOutcome.ok) {
|
|
74
|
+
if (runOutcome.error.code === "NOT_FOUND") {
|
|
75
|
+
deps.logger.err(runOutcome.error.message);
|
|
76
|
+
}
|
|
77
|
+
return runOutcome;
|
|
78
|
+
}
|
|
79
|
+
const result = runOutcome.value;
|
|
80
|
+
if (request.write && result.modifiedFiles.length > 0) {
|
|
81
|
+
const arrangeConfig = request.config;
|
|
82
|
+
await runArrangeOnAfterWriteHook(deps.logger, arrangeConfig?.onAfterWrite, result.modifiedFiles);
|
|
83
|
+
}
|
|
84
|
+
return ok(0);
|
|
85
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
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 { AnalyzeReport } from "#lib/arrange/domain/types";
|
|
6
|
+
import { type DomainSourceFile } from "#lib/arrange/domain/ast/ast-node.model";
|
|
7
|
+
export declare function createEmptyAnalyzeReport(): AnalyzeReport;
|
|
8
|
+
/**
|
|
9
|
+
* Accumulates findings for one parsed source file into `report` (mutates report).
|
|
10
|
+
*/
|
|
11
|
+
export declare function accumulateAnalyzeReportForSourceFile(report: AnalyzeReport, domainSf: DomainSourceFile, sourceText: string, filePath: string): void;
|
|
12
|
+
//# sourceMappingURL=arrange-analyze.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrange-analyze.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/arrange/domain/arrange-analyze.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAU/D,OAAO,EAIL,KAAK,gBAAgB,EAKtB,MAAM,wCAAwC,CAAC;AAQhD,wBAAgB,wBAAwB,IAAI,aAAa,CAUxD;AAmGD;;GAEG;AACH,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,IAAI,CAeN"}
|
|
@@ -0,0 +1,116 @@
|
|
|
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 { LONG_STRING_TOKEN_THRESHOLD } from "#lib/arrange/domain/constants";
|
|
6
|
+
import { tokenizeClassString } from "#lib/arrange/domain/tokenizer";
|
|
7
|
+
import { forEachStringLiteralInClassExpression } from "#lib/arrange/domain/ast/collectors-cn";
|
|
8
|
+
import { jsxClassNameStaticLiteral } from "#lib/arrange/domain/ast/collectors-jsx";
|
|
9
|
+
import { collectCnCallsInsideTv, traverseTvObject } from "#lib/arrange/domain/ast/collectors-tv";
|
|
10
|
+
import { buildKnownCnTvBindings, isCnOrTvIdentifier, lineOf, } from "#lib/arrange/domain/ast/ast-helpers";
|
|
11
|
+
import { isDomainCallExpression, isDomainJsxAttribute, isDomainObjectLiteralExpression, forEachDomainChild, } from "#lib/arrange/domain/ast/ast-node.model";
|
|
12
|
+
const PREVIEW_MAX_LENGTH = 72;
|
|
13
|
+
function previewText(text) {
|
|
14
|
+
return text.length > PREVIEW_MAX_LENGTH ? `${text.slice(0, PREVIEW_MAX_LENGTH)}…` : text;
|
|
15
|
+
}
|
|
16
|
+
export function createEmptyAnalyzeReport() {
|
|
17
|
+
return {
|
|
18
|
+
files: 0,
|
|
19
|
+
cnCallExpressions: 0,
|
|
20
|
+
tvCallExpressions: 0,
|
|
21
|
+
cnInsideTvCalls: [],
|
|
22
|
+
longCnStringLiterals: [],
|
|
23
|
+
longTvStringLiterals: [],
|
|
24
|
+
longJsxClassNameLiterals: [],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function analyzeCnCall(domainSf, call, report) {
|
|
28
|
+
for (const arg of call.arguments) {
|
|
29
|
+
forEachStringLiteralInClassExpression(arg, (lit) => {
|
|
30
|
+
const text = lit.text;
|
|
31
|
+
const tokenCount = tokenizeClassString(text).length;
|
|
32
|
+
if (tokenCount >= LONG_STRING_TOKEN_THRESHOLD) {
|
|
33
|
+
report.longCnStringLiterals.push({
|
|
34
|
+
file: domainSf.fileName,
|
|
35
|
+
line: lineOf(domainSf, lit),
|
|
36
|
+
tokenCount,
|
|
37
|
+
preview: previewText(text),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function visitCallExpressionForArrangeAnalyze(callExpression, domainSf, sourceText, knownBindings, report) {
|
|
44
|
+
if (isCnOrTvIdentifier(callExpression.expression, "cn", knownBindings)) {
|
|
45
|
+
report.cnCallExpressions++;
|
|
46
|
+
analyzeCnCall(domainSf, callExpression, report);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!isCnOrTvIdentifier(callExpression.expression, "tv", knownBindings)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
report.tvCallExpressions++;
|
|
53
|
+
const arg0 = callExpression.arguments[0];
|
|
54
|
+
if (!arg0 || !isDomainObjectLiteralExpression(arg0)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
for (const nestedCn of collectCnCallsInsideTv(domainSf, arg0, knownBindings, 0)) {
|
|
58
|
+
const src = sourceText.slice(nestedCn.pos, nestedCn.end);
|
|
59
|
+
report.cnInsideTvCalls.push({
|
|
60
|
+
file: domainSf.fileName,
|
|
61
|
+
line: lineOf(domainSf, nestedCn),
|
|
62
|
+
argCount: nestedCn.arguments.length,
|
|
63
|
+
preview: previewText(src),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
traverseTvObject(domainSf, arg0, (classLiteral) => {
|
|
67
|
+
const text = classLiteral.text;
|
|
68
|
+
const tokenCount = tokenizeClassString(text).length;
|
|
69
|
+
if (tokenCount >= LONG_STRING_TOKEN_THRESHOLD) {
|
|
70
|
+
report.longTvStringLiterals.push({
|
|
71
|
+
file: domainSf.fileName,
|
|
72
|
+
line: lineOf(domainSf, classLiteral),
|
|
73
|
+
tokenCount,
|
|
74
|
+
preview: previewText(text),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}, 0, knownBindings);
|
|
78
|
+
}
|
|
79
|
+
function visitJsxAttributeForArrangeAnalyze(jsxClassAttribute, domainSf, filePath, report) {
|
|
80
|
+
if (!filePath.endsWith(".tsx")) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const parsed = jsxClassNameStaticLiteral(jsxClassAttribute);
|
|
84
|
+
if (!parsed) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const text = parsed.lit.text;
|
|
88
|
+
const tokenCount = tokenizeClassString(text).length;
|
|
89
|
+
if (tokenCount >= LONG_STRING_TOKEN_THRESHOLD) {
|
|
90
|
+
report.longJsxClassNameLiterals.push({
|
|
91
|
+
file: domainSf.fileName,
|
|
92
|
+
line: lineOf(domainSf, parsed.lit),
|
|
93
|
+
tokenCount,
|
|
94
|
+
preview: previewText(text),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Accumulates findings for one parsed source file into `report` (mutates report).
|
|
100
|
+
*/
|
|
101
|
+
export function accumulateAnalyzeReportForSourceFile(report, domainSf, sourceText, filePath) {
|
|
102
|
+
report.files++;
|
|
103
|
+
const knownBindings = buildKnownCnTvBindings(domainSf);
|
|
104
|
+
const visitTypeScriptSubtree = (tsNode) => {
|
|
105
|
+
if (isDomainCallExpression(tsNode)) {
|
|
106
|
+
visitCallExpressionForArrangeAnalyze(tsNode, domainSf, sourceText, knownBindings, report);
|
|
107
|
+
}
|
|
108
|
+
if (isDomainJsxAttribute(tsNode)) {
|
|
109
|
+
visitJsxAttributeForArrangeAnalyze(tsNode, domainSf, filePath, report);
|
|
110
|
+
}
|
|
111
|
+
forEachDomainChild(tsNode, visitTypeScriptSubtree);
|
|
112
|
+
};
|
|
113
|
+
for (const stmt of domainSf.statements) {
|
|
114
|
+
visitTypeScriptSubtree(stmt);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rich domain: plan Tailwind class grouping / cn-in-tv unwrap for a single file.
|
|
3
|
+
* Pure: only DomainSourceFile, source strings, and options — no I/O.
|
|
4
|
+
*/
|
|
5
|
+
import type { GroupFileResult, PlannedGroupEdit } from "#lib/arrange/domain/types";
|
|
6
|
+
import type { DomainCallExpression, DomainSourceFile } from "#lib/arrange/domain/ast/ast-node.model";
|
|
7
|
+
export type GroupFileUnwrapPlan = {
|
|
8
|
+
readonly start: number;
|
|
9
|
+
readonly end: number;
|
|
10
|
+
readonly replacement: string;
|
|
11
|
+
readonly call: DomainCallExpression;
|
|
12
|
+
};
|
|
13
|
+
export type GroupFileUnwrapState = {
|
|
14
|
+
readonly cnInTvCalls: readonly DomainCallExpression[];
|
|
15
|
+
readonly unwrapReplacementByCall: ReadonlyMap<DomainCallExpression, string>;
|
|
16
|
+
readonly unwrapEdits: readonly GroupFileUnwrapPlan[];
|
|
17
|
+
readonly textAfterUnwrap: string;
|
|
18
|
+
readonly cnInTvNoReplacement: number;
|
|
19
|
+
};
|
|
20
|
+
export type GroupFileWorkPlan = {
|
|
21
|
+
readonly filePath: string;
|
|
22
|
+
readonly sourceText: string;
|
|
23
|
+
readonly textAfterUnwrap: string;
|
|
24
|
+
readonly domainSfForLineNumbers: DomainSourceFile;
|
|
25
|
+
readonly domainSfGrouped: DomainSourceFile;
|
|
26
|
+
readonly cnInTvCalls: readonly DomainCallExpression[];
|
|
27
|
+
readonly unwrapReplacementByCall: ReadonlyMap<DomainCallExpression, string>;
|
|
28
|
+
readonly unwrapEdits: readonly GroupFileUnwrapPlan[];
|
|
29
|
+
readonly plannedGroupEdits: readonly PlannedGroupEdit[];
|
|
30
|
+
readonly cnInTvNoReplacement: number;
|
|
31
|
+
readonly reportTotal: number;
|
|
32
|
+
readonly editSitesCount: number;
|
|
33
|
+
};
|
|
34
|
+
export declare function buildGroupFileUnwrapState(domainSfInitial: DomainSourceFile, sourceText: string): GroupFileUnwrapState;
|
|
35
|
+
/**
|
|
36
|
+
* `domainSfGrouped` must be a parse of `unwrap.textAfterUnwrap` (same `text` as source).
|
|
37
|
+
* Returns `null` when there is no cn-in-tv and no grouping targets.
|
|
38
|
+
*/
|
|
39
|
+
export declare function tryBuildGroupFileWorkPlan(input: {
|
|
40
|
+
readonly filePath: string;
|
|
41
|
+
readonly sourceText: string;
|
|
42
|
+
readonly domainSfInitial: DomainSourceFile;
|
|
43
|
+
readonly domainSfGrouped: DomainSourceFile;
|
|
44
|
+
readonly withClassName: boolean;
|
|
45
|
+
readonly unwrap: GroupFileUnwrapState;
|
|
46
|
+
}): GroupFileWorkPlan | null;
|
|
47
|
+
export declare function groupFileDryRunNoEdits(filePath: string): GroupFileResult;
|
|
48
|
+
export declare function groupFilePreviewTotals(work: GroupFileWorkPlan): GroupFileResult;
|
|
49
|
+
export declare function mergeGroupFileBodyText(work: GroupFileWorkPlan): string;
|
|
50
|
+
export declare function groupFileEditsTouchJsxCn(work: GroupFileWorkPlan): boolean;
|
|
51
|
+
export declare function countPersistedGroupFileEdits(work: GroupFileWorkPlan): number;
|
|
52
|
+
export declare function groupFileWorkHasNothingToReport(work: GroupFileWorkPlan): boolean;
|
|
53
|
+
//# sourceMappingURL=arrange-grouping.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrange-grouping.service.d.ts","sourceRoot":"","sources":["../../../../src/lib/arrange/domain/arrange-grouping.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAYnF,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACtD,QAAQ,CAAC,uBAAuB,EAAE,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IAC5E,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACrD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,sBAAsB,EAAE,gBAAgB,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACtD,QAAQ,CAAC,uBAAuB,EAAE,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IAC5E,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACrD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACxD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC,CAAC;AAiBF,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,gBAAgB,EACjC,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAoBtB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC,GAAG,iBAAiB,GAAG,IAAI,CA+C3B;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAExE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,CAM/E;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAWtE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAEzE;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAE5E;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAEhF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rich domain: plan Tailwind class grouping / cn-in-tv unwrap for a single file.
|
|
3
|
+
* Pure: only DomainSourceFile, source strings, and options — no I/O.
|
|
4
|
+
*/
|
|
5
|
+
import { applyEditsDescending, buildKnownCnTvBindings, unwrapCnInsideTvCallReplacement, } from "#lib/arrange/domain/ast/ast-helpers";
|
|
6
|
+
import { listAllCnCallsInsideTvInSourceFile } from "#lib/arrange/domain/ast/collectors-tv";
|
|
7
|
+
import { collectGroupTargets, planGroupEditForTarget, targetReplaceStart, } from "#lib/arrange/domain/ast/targets";
|
|
8
|
+
function toUnwrapPlans(cnInTvCalls, sourceText) {
|
|
9
|
+
return cnInTvCalls
|
|
10
|
+
.map((call) => {
|
|
11
|
+
const replacement = unwrapCnInsideTvCallReplacement(call, sourceText);
|
|
12
|
+
if (replacement === undefined) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return { start: call.pos, end: call.end, replacement, call };
|
|
16
|
+
})
|
|
17
|
+
.filter((plan) => plan !== undefined);
|
|
18
|
+
}
|
|
19
|
+
export function buildGroupFileUnwrapState(domainSfInitial, sourceText) {
|
|
20
|
+
const knownBindings = buildKnownCnTvBindings(domainSfInitial);
|
|
21
|
+
const cnInTvCalls = listAllCnCallsInsideTvInSourceFile(domainSfInitial, knownBindings);
|
|
22
|
+
const unwrapPlans = toUnwrapPlans(cnInTvCalls, sourceText);
|
|
23
|
+
const unwrapReplacementByCall = new Map(unwrapPlans.map((unwrapPlan) => [unwrapPlan.call, unwrapPlan.replacement]));
|
|
24
|
+
const unwrapEdits = unwrapPlans.filter((unwrapPlan) => sourceText.slice(unwrapPlan.start, unwrapPlan.end) !== unwrapPlan.replacement);
|
|
25
|
+
const textAfterUnwrap = unwrapEdits.length > 0 ? applyEditsDescending(sourceText, [...unwrapEdits]) : sourceText;
|
|
26
|
+
const cnInTvNoReplacement = cnInTvCalls.length - unwrapPlans.length;
|
|
27
|
+
return {
|
|
28
|
+
cnInTvCalls,
|
|
29
|
+
unwrapReplacementByCall,
|
|
30
|
+
unwrapEdits,
|
|
31
|
+
textAfterUnwrap,
|
|
32
|
+
cnInTvNoReplacement,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* `domainSfGrouped` must be a parse of `unwrap.textAfterUnwrap` (same `text` as source).
|
|
37
|
+
* Returns `null` when there is no cn-in-tv and no grouping targets.
|
|
38
|
+
*/
|
|
39
|
+
export function tryBuildGroupFileWorkPlan(input) {
|
|
40
|
+
const { filePath, sourceText, domainSfInitial, domainSfGrouped, withClassName, unwrap } = input;
|
|
41
|
+
if (domainSfGrouped.text !== unwrap.textAfterUnwrap) {
|
|
42
|
+
throw new Error("Domain invariant: domainSfGrouped.text must match unwrap phase textAfterUnwrap");
|
|
43
|
+
}
|
|
44
|
+
const groupTargets = collectGroupTargets(domainSfGrouped, filePath);
|
|
45
|
+
if (unwrap.cnInTvCalls.length === 0 && groupTargets.length === 0) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const sortedTargets = [...groupTargets].sort((leftTarget, rightTarget) => targetReplaceStart(rightTarget) - targetReplaceStart(leftTarget));
|
|
49
|
+
const plannedGroupEdits = [];
|
|
50
|
+
for (const groupTarget of sortedTargets) {
|
|
51
|
+
const plan = planGroupEditForTarget(groupTarget, unwrap.textAfterUnwrap, withClassName);
|
|
52
|
+
if (plan === undefined) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (unwrap.textAfterUnwrap.slice(plan.start, plan.end) === plan.replacement) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
plannedGroupEdits.push(plan);
|
|
59
|
+
}
|
|
60
|
+
const editSitesCount = unwrap.unwrapEdits.length + plannedGroupEdits.length;
|
|
61
|
+
const reportTotal = editSitesCount + unwrap.cnInTvNoReplacement;
|
|
62
|
+
return {
|
|
63
|
+
filePath,
|
|
64
|
+
sourceText,
|
|
65
|
+
textAfterUnwrap: unwrap.textAfterUnwrap,
|
|
66
|
+
domainSfForLineNumbers: domainSfInitial,
|
|
67
|
+
domainSfGrouped,
|
|
68
|
+
cnInTvCalls: unwrap.cnInTvCalls,
|
|
69
|
+
unwrapReplacementByCall: unwrap.unwrapReplacementByCall,
|
|
70
|
+
unwrapEdits: unwrap.unwrapEdits,
|
|
71
|
+
plannedGroupEdits,
|
|
72
|
+
cnInTvNoReplacement: unwrap.cnInTvNoReplacement,
|
|
73
|
+
reportTotal,
|
|
74
|
+
editSitesCount,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function groupFileDryRunNoEdits(filePath) {
|
|
78
|
+
return { filePath, totalFound: 0, changed: 0 };
|
|
79
|
+
}
|
|
80
|
+
export function groupFilePreviewTotals(work) {
|
|
81
|
+
return {
|
|
82
|
+
filePath: work.filePath,
|
|
83
|
+
totalFound: work.reportTotal,
|
|
84
|
+
changed: 0,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function mergeGroupFileBodyText(work) {
|
|
88
|
+
const groupEdits = work.plannedGroupEdits.map((plannedEdit) => ({
|
|
89
|
+
start: plannedEdit.start,
|
|
90
|
+
end: plannedEdit.end,
|
|
91
|
+
replacement: plannedEdit.replacement,
|
|
92
|
+
jsxCn: plannedEdit.jsxCn,
|
|
93
|
+
}));
|
|
94
|
+
return groupEdits.length > 0
|
|
95
|
+
? applyEditsDescending(work.textAfterUnwrap, groupEdits)
|
|
96
|
+
: work.textAfterUnwrap;
|
|
97
|
+
}
|
|
98
|
+
export function groupFileEditsTouchJsxCn(work) {
|
|
99
|
+
return work.plannedGroupEdits.some((plannedEdit) => plannedEdit.jsxCn);
|
|
100
|
+
}
|
|
101
|
+
export function countPersistedGroupFileEdits(work) {
|
|
102
|
+
return work.unwrapEdits.length + work.plannedGroupEdits.length;
|
|
103
|
+
}
|
|
104
|
+
export function groupFileWorkHasNothingToReport(work) {
|
|
105
|
+
return work.editSitesCount === 0 && work.cnInTvNoReplacement === 0;
|
|
106
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { applyEditsDescending, indentOfLineContaining } from "#lib/shared/source-code/domain/text-edit";
|
|
2
|
+
import { type DomainAstNode, type DomainCallExpression, type DomainPropertyAssignment, type DomainSourceFile } from "#lib/arrange/domain/ast/ast-node.model";
|
|
3
|
+
/** Known module specifiers that export `cn` / `tv`. */
|
|
4
|
+
export declare const KNOWN_CN_TV_MODULES: Set<string>;
|
|
5
|
+
/**
|
|
6
|
+
* True for typical shadcn-style re-exports: `./utils`, `@/lib/utils`, `…/utils/…`,
|
|
7
|
+
* or a dedicated `cn.ts` / `cn.tsx` module.
|
|
8
|
+
*/
|
|
9
|
+
export declare function moduleLooksLikeCnTvReexport(moduleSpecifier: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Build a set of local binding names that are imported from a known cn/tv
|
|
12
|
+
* module in `sourceFile`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildKnownCnTvBindings(sourceFile: DomainSourceFile): Set<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Returns true when `expr` is an identifier whose name matches `name` AND
|
|
17
|
+
* that name is listed in `knownBindings` from a recognized import.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isCnOrTvIdentifier(expr: DomainAstNode, name: "cn" | "tv", knownBindings?: Set<string>): boolean;
|
|
20
|
+
export declare function propertyAssignmentNameText(prop: DomainPropertyAssignment): string | undefined;
|
|
21
|
+
export declare function lineOf(sourceFile: DomainSourceFile, node: DomainAstNode): number;
|
|
22
|
+
export { applyEditsDescending, indentOfLineContaining };
|
|
23
|
+
/**
|
|
24
|
+
* Replace `cn(...)` nested in `tv({...})` with a plain string (one arg) or a string
|
|
25
|
+
* array (multiple args). Returns undefined when there are zero arguments.
|
|
26
|
+
*/
|
|
27
|
+
export declare function unwrapCnInsideTvCallReplacement(call: DomainCallExpression, sourceText: string): string | undefined;
|
|
28
|
+
//# sourceMappingURL=ast-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-helpers.d.ts","sourceRoot":"","sources":["../../../../../src/lib/arrange/domain/ast/ast-helpers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EAQtB,MAAM,wCAAwC,CAAC;AAEhD,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,aAU9B,CAAC;AAEH;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAY5E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,CAsChF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,aAAa,GAAE,GAAG,CAAC,MAAM,CAAwB,GAChD,OAAO,CAWT;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,GAAG,SAAS,CAQ7F;AAED,wBAAgB,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAEhF;AAED,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;AAExD;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,oBAAoB,EAC1B,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,SAAS,CAsBpB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { EMPTY_CN_TV_BINDINGS } from "#lib/arrange/domain/constants";
|
|
2
|
+
import { applyEditsDescending, indentOfLineContaining, } from "#lib/shared/source-code/domain/text-edit";
|
|
3
|
+
import { isDomainIdentifier, isDomainImportDeclaration, isDomainNamedImports, isDomainNamespaceImport, isDomainPropertyAccessExpression, isDomainStringLiteral, lineOfSourcePosition, } from "#lib/arrange/domain/ast/ast-node.model";
|
|
4
|
+
/** Known module specifiers that export `cn` / `tv`. */
|
|
5
|
+
export const KNOWN_CN_TV_MODULES = new Set([
|
|
6
|
+
"@codefast/tailwind-variants",
|
|
7
|
+
"clsx",
|
|
8
|
+
"class-variance-authority",
|
|
9
|
+
// Backward compatibility only: keep detection for existing user code that still imports
|
|
10
|
+
// from "tailwind-variants"; new code should prefer "@codefast/tailwind-variants".
|
|
11
|
+
"tailwind-variants",
|
|
12
|
+
"#lib/utils",
|
|
13
|
+
"~/lib/utils",
|
|
14
|
+
"@/lib/utils",
|
|
15
|
+
]);
|
|
16
|
+
/**
|
|
17
|
+
* True for typical shadcn-style re-exports: `./utils`, `@/lib/utils`, `…/utils/…`,
|
|
18
|
+
* or a dedicated `cn.ts` / `cn.tsx` module.
|
|
19
|
+
*/
|
|
20
|
+
export function moduleLooksLikeCnTvReexport(moduleSpecifier) {
|
|
21
|
+
const norm = moduleSpecifier.replace(/\\/g, "/");
|
|
22
|
+
if (/(?:^|[./])utils(?:\/|$)/.test(norm)) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (/\/utils\//.test(norm) || /\/utils$/.test(norm)) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
if (/(?:^|\/)cn\.tsx?$/.test(norm)) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Build a set of local binding names that are imported from a known cn/tv
|
|
35
|
+
* module in `sourceFile`.
|
|
36
|
+
*/
|
|
37
|
+
export function buildKnownCnTvBindings(sourceFile) {
|
|
38
|
+
const bindings = new Set();
|
|
39
|
+
for (const stmt of sourceFile.statements) {
|
|
40
|
+
if (!isDomainImportDeclaration(stmt) || !stmt.importClause) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (stmt.importClause.isTypeOnly) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const spec = stmt.moduleSpecifier;
|
|
47
|
+
if (!isDomainStringLiteral(spec)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const moduleSpecifierText = spec.text;
|
|
51
|
+
const isKnown = KNOWN_CN_TV_MODULES.has(moduleSpecifierText);
|
|
52
|
+
if (!isKnown && !moduleLooksLikeCnTvReexport(moduleSpecifierText)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const clause = stmt.importClause;
|
|
56
|
+
if (clause.name) {
|
|
57
|
+
bindings.add(clause.name.text);
|
|
58
|
+
}
|
|
59
|
+
const { namedBindings } = clause;
|
|
60
|
+
if (!namedBindings) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (isDomainNamedImports(namedBindings)) {
|
|
64
|
+
for (const namedImport of namedBindings.elements) {
|
|
65
|
+
bindings.add(namedImport.name.text);
|
|
66
|
+
}
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (isDomainNamespaceImport(namedBindings)) {
|
|
70
|
+
bindings.add(namedBindings.name.text);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return bindings;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Returns true when `expr` is an identifier whose name matches `name` AND
|
|
77
|
+
* that name is listed in `knownBindings` from a recognized import.
|
|
78
|
+
*/
|
|
79
|
+
export function isCnOrTvIdentifier(expr, name, knownBindings = EMPTY_CN_TV_BINDINGS) {
|
|
80
|
+
if (knownBindings.size === 0) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (isDomainIdentifier(expr) && expr.text === name) {
|
|
84
|
+
return knownBindings.has(expr.text);
|
|
85
|
+
}
|
|
86
|
+
if (isDomainPropertyAccessExpression(expr) && expr.name.text === name) {
|
|
87
|
+
return isDomainIdentifier(expr.expression) && knownBindings.has(expr.expression.text);
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
export function propertyAssignmentNameText(prop) {
|
|
92
|
+
if (isDomainIdentifier(prop.name)) {
|
|
93
|
+
return prop.name.text;
|
|
94
|
+
}
|
|
95
|
+
if (isDomainStringLiteral(prop.name)) {
|
|
96
|
+
return prop.name.text;
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
export function lineOf(sourceFile, node) {
|
|
101
|
+
return lineOfSourcePosition(sourceFile.text, node.pos);
|
|
102
|
+
}
|
|
103
|
+
export { applyEditsDescending, indentOfLineContaining };
|
|
104
|
+
/**
|
|
105
|
+
* Replace `cn(...)` nested in `tv({...})` with a plain string (one arg) or a string
|
|
106
|
+
* array (multiple args). Returns undefined when there are zero arguments.
|
|
107
|
+
*/
|
|
108
|
+
export function unwrapCnInsideTvCallReplacement(call, sourceText) {
|
|
109
|
+
const args = call.arguments;
|
|
110
|
+
if (args.length === 0) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
const baseIndent = indentOfLineContaining(sourceText, call.pos);
|
|
114
|
+
const innerIndent = `${baseIndent} `;
|
|
115
|
+
if (args.length === 1) {
|
|
116
|
+
const firstArg = args[0];
|
|
117
|
+
return sourceText.slice(firstArg.pos, firstArg.end);
|
|
118
|
+
}
|
|
119
|
+
const lines = ["["];
|
|
120
|
+
for (let i = 0; i < args.length; i++) {
|
|
121
|
+
const arg = args[i];
|
|
122
|
+
const piece = sourceText.slice(arg.pos, arg.end);
|
|
123
|
+
// Trailing comma on every element — intentional (Prettier-compatible style;
|
|
124
|
+
// keeps array diffs clean when arguments are later added or removed).
|
|
125
|
+
const comma = i < args.length - 1 || args.length > 1 ? "," : "";
|
|
126
|
+
lines.push(`${innerIndent}${piece}${comma}`);
|
|
127
|
+
}
|
|
128
|
+
lines.push(`${baseIndent}]`);
|
|
129
|
+
return lines.join("\n");
|
|
130
|
+
}
|