@codefast/cli 0.3.13-canary.3 → 0.3.13-canary.4
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/README.md +29 -3
- package/dist/{bin.js → bin.mjs} +4 -1
- package/dist/commands/arrange.mjs +325 -0
- package/dist/commands/mirror.mjs +267 -0
- package/dist/commands/tag.mjs +283 -0
- package/dist/lib/arrange/application/arrange-analyze-json.format.mjs +10 -0
- package/dist/lib/arrange/application/arrange-group-json.format.mjs +11 -0
- package/dist/lib/arrange/application/arrange-sync-cli-result.mjs +7 -0
- package/dist/lib/arrange/application/arrange-sync-json.format.mjs +12 -0
- package/dist/lib/arrange/application/services/arrange-file-processor.service.mjs +242 -0
- package/dist/lib/arrange/application/services/arrange-target-scanner.service.mjs +237 -0
- package/dist/lib/arrange/application/use-cases/analyze-directory.use-case.mjs +258 -0
- package/dist/lib/arrange/application/use-cases/group-file.use-case.mjs +35 -0
- package/dist/lib/arrange/application/use-cases/run-arrange-sync.use-case.mjs +283 -0
- package/dist/lib/arrange/application/use-cases/suggest-cn-groups.use-case.mjs +233 -0
- package/dist/lib/arrange/arrange.feature.module.mjs +19 -0
- package/dist/lib/arrange/arrange.module.mjs +27 -0
- package/dist/lib/arrange/arrange.presentation.module.mjs +13 -0
- package/dist/lib/arrange/contracts/tokens.mjs +14 -0
- package/dist/lib/arrange/domain/arrange-analyze.service.mjs +95 -0
- package/dist/lib/arrange/domain/arrange-grouping.service.mjs +100 -0
- package/dist/lib/arrange/domain/ast/ast-helpers.helper.mjs +89 -0
- package/dist/lib/arrange/domain/ast/ast-node.model.mjs +181 -0
- package/dist/lib/arrange/domain/ast/collectors-cn.collector.mjs +52 -0
- package/dist/lib/arrange/domain/ast/collectors-jsx.collector.mjs +20 -0
- package/dist/lib/arrange/domain/ast/collectors-tv.collector.mjs +174 -0
- package/dist/lib/arrange/domain/ast/targets.model.mjs +110 -0
- package/dist/lib/arrange/domain/constants.domain.mjs +154 -0
- package/dist/lib/arrange/domain/errors.domain.mjs +18 -0
- package/dist/lib/arrange/domain/grouping.domain.mjs +306 -0
- package/dist/lib/arrange/domain/imports.domain.mjs +55 -0
- package/dist/lib/arrange/domain/source-text-formatters.formatter.mjs +54 -0
- package/dist/lib/arrange/domain/tokenizer.util.mjs +209 -0
- package/dist/lib/arrange/infra/domain-source-parser.adapter.mjs +240 -0
- package/dist/lib/arrange/infra/ensure-cn-import.adapter.mjs +8 -0
- package/dist/lib/arrange/infra/file-walker.adapter.mjs +239 -0
- package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.test-helper.mjs +18 -0
- package/dist/lib/arrange/infra/ts-ast-translator.adapter.mjs +355 -0
- package/dist/lib/arrange/presentation/arrange-cli-schema.presenter.mjs +29 -0
- package/dist/lib/arrange/presentation/arrange-sync.presenter.mjs +12 -0
- package/dist/lib/arrange/presentation/formatters.presenter.mjs +2 -0
- package/dist/lib/arrange/presentation/group-file-preview.presenter.mjs +275 -0
- package/dist/lib/arrange/presentation/prepare-arrange.orchestrator.mjs +258 -0
- package/dist/lib/arrange/presentation/present-analyze-cli.presenter.mjs +7 -0
- package/dist/lib/arrange/presentation/present-analyze-report.presenter.mjs +233 -0
- package/dist/lib/arrange/presentation/report.presenter.mjs +24 -0
- package/dist/lib/arrange/presentation/resolve-arrange-cli-target.presenter.mjs +21 -0
- package/dist/lib/config/application/use-cases/load-config.use-case.mjs +17 -0
- package/dist/lib/config/contracts/tokens.mjs +5 -0
- package/dist/lib/config/infra/config-schema.adapter.mjs +25 -0
- package/dist/lib/config/infra/loader.adapter.mjs +84 -0
- package/dist/lib/core/application/architecture-boundaries.policy.mjs +311 -0
- package/dist/lib/core/application/ports/path.port.mjs +1 -0
- package/dist/lib/core/application/schema-parse.util.mjs +17 -0
- package/dist/lib/core/application/utils/caught-unknown-message.util.mjs +19 -0
- package/dist/lib/core/application/utils/verbose-diagnostics.util.mjs +9 -0
- package/dist/lib/core/contracts/presentation.contract.mjs +1 -0
- package/dist/lib/core/contracts/tokens.mjs +5 -0
- package/dist/lib/core/core.module.mjs +9 -0
- package/dist/lib/core/domain/cli-exit-codes.domain.mjs +11 -0
- package/dist/lib/core/domain/errors.domain.mjs +16 -0
- package/dist/lib/core/domain/result.model.mjs +23 -0
- package/dist/lib/core/infra/composition-root.mjs +21 -0
- package/dist/lib/core/infra/infra.module.mjs +23 -0
- package/dist/lib/core/infra/logging-decorator.adapter.mjs +62 -0
- package/dist/lib/core/infra/path.adapter.mjs +13 -0
- package/dist/lib/core/operational/contracts/tokens.mjs +7 -0
- package/dist/lib/core/presentation/cli-executor.presenter.mjs +57 -0
- package/dist/lib/core/presentation/command.interface.mjs +1 -0
- package/dist/lib/core/presentation/format-app-error.presenter.mjs +17 -0
- package/dist/lib/core/presentation/global-cli-options.presenter.mjs +9 -0
- package/dist/lib/core/presentation/load-codefast-config.presenter.mjs +18 -0
- package/dist/lib/core/presentation/parse-cli-schema.presenter.mjs +7 -0
- package/dist/lib/core/presentation/presentation.module.mjs +11 -0
- package/dist/lib/core/presentation/try-load-codefast-config.presenter.mjs +245 -0
- package/dist/lib/infra/config-reporter.adapter.mjs +9 -0
- package/dist/lib/infra/fs-contract.port.mjs +1 -0
- package/dist/lib/infra/node-io.adapter.mjs +266 -0
- package/dist/lib/infra/workspace/repo-root.adapter.mjs +21 -0
- package/dist/lib/kernel/di/command.token.mjs +5 -0
- package/dist/lib/mirror/application/mirror-sync-json.format.mjs +12 -0
- package/dist/lib/mirror/application/ports/file-system-service.port.mjs +1 -0
- package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.mjs +1 -0
- package/dist/lib/mirror/application/ports/package-repository.port.mjs +1 -0
- package/dist/lib/mirror/application/ports/sync-workspace-package.port.mjs +1 -0
- package/dist/lib/mirror/application/ports/workspace-service.port.mjs +1 -0
- package/dist/lib/mirror/application/requests/mirror-sync.request.mjs +1 -0
- package/dist/lib/mirror/application/services/sync-workspace-package.service.mjs +351 -0
- package/dist/lib/mirror/application/use-cases/generate-mirror-exports.use-case.mjs +219 -0
- package/dist/lib/mirror/application/use-cases/run-mirror-sync.use-case.mjs +302 -0
- package/dist/lib/mirror/contracts/models.mjs +1 -0
- package/dist/lib/mirror/contracts/presentation.contract.mjs +1 -0
- package/dist/lib/mirror/contracts/tokens.mjs +11 -0
- package/dist/lib/mirror/contracts/use-cases.contract.mjs +1 -0
- package/dist/lib/mirror/domain/constants.domain.mjs +16 -0
- package/dist/lib/mirror/domain/errors.domain.mjs +15 -0
- package/dist/lib/mirror/domain/types.domain.mjs +1 -0
- package/dist/lib/mirror/infra/dirent-list.adapter.mjs +13 -0
- package/dist/lib/mirror/infra/file-system-service.adapter.mjs +256 -0
- package/dist/lib/mirror/infra/mirror-sync-cli-options.adapter.mjs +1 -0
- package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.mjs +236 -0
- package/dist/lib/mirror/infra/package-filter.adapter.mjs +25 -0
- package/dist/lib/mirror/infra/package-repository.adapter.mjs +235 -0
- package/dist/lib/mirror/infra/path-normalizer.adapter.mjs +7 -0
- package/dist/lib/mirror/infra/update-pkg.adapter.mjs +102 -0
- package/dist/lib/mirror/infra/workspace-packages.adapter.mjs +154 -0
- package/dist/lib/mirror/infra/workspace-service.adapter.mjs +232 -0
- package/dist/lib/mirror/mirror.feature.module.mjs +19 -0
- package/dist/lib/mirror/mirror.module.mjs +23 -0
- package/dist/lib/mirror/mirror.presentation.module.mjs +11 -0
- package/dist/lib/mirror/presentation/mirror-cli-schema.presenter.mjs +12 -0
- package/dist/lib/mirror/presentation/prepare-mirror.orchestrator.mjs +263 -0
- package/dist/lib/mirror/presentation/reporter.presenter.mjs +111 -0
- package/dist/lib/mirror/presentation/resolve-mirror-package-arg.presenter.mjs +20 -0
- package/dist/lib/shared/source-code/domain/text-edit.model.mjs +28 -0
- package/dist/lib/shared/source-code/infra/tsx-file-walk.adapter.mjs +33 -0
- package/dist/lib/tag/application/ports/tag-since-writer.port.mjs +1 -0
- package/dist/lib/tag/application/ports/tag-version-resolver.port.mjs +1 -0
- package/dist/lib/tag/application/ports/target-resolver.port.mjs +1 -0
- package/dist/lib/tag/application/ports/typescript-tree-walk.port.mjs +1 -0
- package/dist/lib/tag/application/requests/tag-sync.request.mjs +1 -0
- package/dist/lib/tag/application/tag-sync-cli-result.mjs +11 -0
- package/dist/lib/tag/application/tag-sync-json.format.mjs +14 -0
- package/dist/lib/tag/application/use-cases/run-tag-sync.use-case.mjs +398 -0
- package/dist/lib/tag/contracts/models.mjs +1 -0
- package/dist/lib/tag/contracts/presentation.contract.mjs +1 -0
- package/dist/lib/tag/contracts/tokens.mjs +12 -0
- package/dist/lib/tag/contracts/use-cases.contract.mjs +1 -0
- package/dist/lib/tag/domain/types.domain.mjs +1 -0
- package/dist/lib/tag/infra/tag-since-writer.adapter.mjs +343 -0
- package/dist/lib/tag/infra/tag-sync-cli-options.adapter.mjs +1 -0
- package/dist/lib/tag/infra/tag-target-candidates.adapter.mjs +170 -0
- package/dist/lib/tag/infra/tag-target-resolver.adapter.mjs +226 -0
- package/dist/lib/tag/infra/tag-version-resolver.adapter.mjs +247 -0
- package/dist/lib/tag/infra/typescript-tree-walk.adapter.mjs +226 -0
- package/dist/lib/tag/presentation/colors.presenter.mjs +12 -0
- package/dist/lib/tag/presentation/create-tag-progress-listener.presenter.mjs +228 -0
- package/dist/lib/tag/presentation/prepare-tag.orchestrator.mjs +264 -0
- package/dist/lib/tag/presentation/present-tag-sync-result.presenter.mjs +233 -0
- package/dist/lib/tag/presentation/resolve-tag-cli-target.presenter.mjs +9 -0
- package/dist/lib/tag/presentation/resolve-tag-workspace-root.presenter.mjs +12 -0
- package/dist/lib/tag/presentation/tag-cli-schema.presenter.mjs +12 -0
- package/dist/lib/tag/presentation/tag-sync.presenter.mjs +78 -0
- package/dist/lib/tag/tag.feature.module.mjs +19 -0
- package/dist/lib/tag/tag.module.mjs +21 -0
- package/dist/lib/tag/tag.presentation.module.mjs +15 -0
- package/dist/program.mjs +39 -0
- package/package.json +16 -19
- package/dist/bin.d.ts +0 -3
- package/dist/bin.d.ts.map +0 -1
- package/dist/commands/arrange.d.ts +0 -3
- package/dist/commands/arrange.d.ts.map +0 -1
- package/dist/commands/arrange.js +0 -108
- package/dist/commands/mirror.d.ts +0 -3
- package/dist/commands/mirror.d.ts.map +0 -1
- package/dist/commands/mirror.js +0 -36
- package/dist/commands/tag.d.ts +0 -3
- package/dist/commands/tag.d.ts.map +0 -1
- package/dist/commands/tag.js +0 -44
- package/dist/lib/arrange/application/ports/domain-source-parser.port.d.ts +0 -5
- package/dist/lib/arrange/application/ports/domain-source-parser.port.d.ts.map +0 -1
- package/dist/lib/arrange/application/ports/file-walker.port.d.ts +0 -5
- package/dist/lib/arrange/application/ports/file-walker.port.d.ts.map +0 -1
- package/dist/lib/arrange/application/requests/analyze-directory.request.d.ts +0 -6
- package/dist/lib/arrange/application/requests/analyze-directory.request.d.ts.map +0 -1
- package/dist/lib/arrange/application/requests/analyze-directory.request.js +0 -4
- package/dist/lib/arrange/application/requests/arrange-sync.request.d.ts +0 -18
- package/dist/lib/arrange/application/requests/arrange-sync.request.d.ts.map +0 -1
- package/dist/lib/arrange/application/requests/arrange-sync.request.js +0 -15
- package/dist/lib/arrange/application/requests/suggest-groups.request.d.ts +0 -8
- package/dist/lib/arrange/application/requests/suggest-groups.request.d.ts.map +0 -1
- package/dist/lib/arrange/application/requests/suggest-groups.request.js +0 -8
- package/dist/lib/arrange/application/use-cases/analyze-directory.use-case.d.ts +0 -17
- package/dist/lib/arrange/application/use-cases/analyze-directory.use-case.d.ts.map +0 -1
- package/dist/lib/arrange/application/use-cases/analyze-directory.use-case.js +0 -24
- package/dist/lib/arrange/application/use-cases/group-file-preview.use-case.d.ts +0 -17
- package/dist/lib/arrange/application/use-cases/group-file-preview.use-case.d.ts.map +0 -1
- package/dist/lib/arrange/application/use-cases/group-file-preview.use-case.js +0 -46
- package/dist/lib/arrange/application/use-cases/group-file.use-case.d.ts +0 -5
- package/dist/lib/arrange/application/use-cases/group-file.use-case.d.ts.map +0 -1
- package/dist/lib/arrange/application/use-cases/group-file.use-case.js +0 -40
- package/dist/lib/arrange/application/use-cases/run-arrange-sync.use-case.d.ts +0 -19
- package/dist/lib/arrange/application/use-cases/run-arrange-sync.use-case.d.ts.map +0 -1
- package/dist/lib/arrange/application/use-cases/run-arrange-sync.use-case.js +0 -85
- package/dist/lib/arrange/application/use-cases/suggest-cn-groups.use-case.d.ts +0 -7
- package/dist/lib/arrange/application/use-cases/suggest-cn-groups.use-case.d.ts.map +0 -1
- package/dist/lib/arrange/application/use-cases/suggest-cn-groups.use-case.js +0 -10
- package/dist/lib/arrange/domain/arrange-analyze.service.d.ts +0 -12
- package/dist/lib/arrange/domain/arrange-analyze.service.d.ts.map +0 -1
- package/dist/lib/arrange/domain/arrange-analyze.service.js +0 -116
- package/dist/lib/arrange/domain/arrange-grouping.service.d.ts +0 -53
- package/dist/lib/arrange/domain/arrange-grouping.service.d.ts.map +0 -1
- package/dist/lib/arrange/domain/arrange-grouping.service.js +0 -106
- package/dist/lib/arrange/domain/ast/ast-helpers.helper.d.ts +0 -28
- package/dist/lib/arrange/domain/ast/ast-helpers.helper.d.ts.map +0 -1
- package/dist/lib/arrange/domain/ast/ast-helpers.helper.js +0 -130
- package/dist/lib/arrange/domain/ast/ast-node.model.d.ts +0 -179
- package/dist/lib/arrange/domain/ast/ast-node.model.d.ts.map +0 -1
- package/dist/lib/arrange/domain/ast/ast-node.model.js +0 -210
- package/dist/lib/arrange/domain/ast/collectors-cn.collector.d.ts +0 -7
- package/dist/lib/arrange/domain/ast/collectors-cn.collector.d.ts.map +0 -1
- package/dist/lib/arrange/domain/ast/collectors-cn.collector.js +0 -70
- package/dist/lib/arrange/domain/ast/collectors-jsx.collector.d.ts +0 -4
- package/dist/lib/arrange/domain/ast/collectors-jsx.collector.d.ts.map +0 -1
- package/dist/lib/arrange/domain/ast/collectors-jsx.collector.js +0 -21
- package/dist/lib/arrange/domain/ast/collectors-tv.collector.d.ts +0 -13
- package/dist/lib/arrange/domain/ast/collectors-tv.collector.d.ts.map +0 -1
- package/dist/lib/arrange/domain/ast/collectors-tv.collector.js +0 -302
- package/dist/lib/arrange/domain/ast/targets.model.d.ts +0 -8
- package/dist/lib/arrange/domain/ast/targets.model.d.ts.map +0 -1
- package/dist/lib/arrange/domain/ast/targets.model.js +0 -147
- package/dist/lib/arrange/domain/constants.domain.d.ts +0 -70
- package/dist/lib/arrange/domain/constants.domain.d.ts.map +0 -1
- package/dist/lib/arrange/domain/constants.domain.js +0 -182
- package/dist/lib/arrange/domain/errors.domain.d.ts +0 -14
- package/dist/lib/arrange/domain/errors.domain.d.ts.map +0 -1
- package/dist/lib/arrange/domain/errors.domain.js +0 -16
- package/dist/lib/arrange/domain/grouping.domain.d.ts +0 -41
- package/dist/lib/arrange/domain/grouping.domain.d.ts.map +0 -1
- package/dist/lib/arrange/domain/grouping.domain.js +0 -371
- package/dist/lib/arrange/domain/imports.domain.d.ts +0 -7
- package/dist/lib/arrange/domain/imports.domain.d.ts.map +0 -1
- package/dist/lib/arrange/domain/imports.domain.js +0 -80
- package/dist/lib/arrange/domain/source-text-formatters.formatter.d.ts +0 -16
- package/dist/lib/arrange/domain/source-text-formatters.formatter.d.ts.map +0 -1
- package/dist/lib/arrange/domain/source-text-formatters.formatter.js +0 -55
- package/dist/lib/arrange/domain/tokenizer.util.d.ts +0 -45
- package/dist/lib/arrange/domain/tokenizer.util.d.ts.map +0 -1
- package/dist/lib/arrange/domain/tokenizer.util.js +0 -469
- package/dist/lib/arrange/domain/types.domain.d.ts +0 -115
- package/dist/lib/arrange/domain/types.domain.d.ts.map +0 -1
- package/dist/lib/arrange/domain/types.domain.js +0 -10
- package/dist/lib/arrange/index.d.ts +0 -45
- package/dist/lib/arrange/index.d.ts.map +0 -1
- package/dist/lib/arrange/index.js +0 -41
- package/dist/lib/arrange/infra/arrange-sync-cli-options.adapter.d.ts +0 -14
- package/dist/lib/arrange/infra/arrange-sync-cli-options.adapter.d.ts.map +0 -1
- package/dist/lib/arrange/infra/domain-source-parser.adapter.d.ts +0 -11
- package/dist/lib/arrange/infra/domain-source-parser.adapter.d.ts.map +0 -1
- package/dist/lib/arrange/infra/domain-source-parser.adapter.js +0 -19
- package/dist/lib/arrange/infra/ensure-cn-import.adapter.d.ts +0 -3
- package/dist/lib/arrange/infra/ensure-cn-import.adapter.d.ts.map +0 -1
- package/dist/lib/arrange/infra/ensure-cn-import.adapter.js +0 -6
- package/dist/lib/arrange/infra/file-walker.adapter.d.ts +0 -8
- package/dist/lib/arrange/infra/file-walker.adapter.d.ts.map +0 -1
- package/dist/lib/arrange/infra/file-walker.adapter.js +0 -17
- package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.test-helper.d.ts +0 -8
- package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.test-helper.d.ts.map +0 -1
- package/dist/lib/arrange/infra/merge-cn-literal-pool-for-test.test-helper.js +0 -25
- package/dist/lib/arrange/infra/ts-ast-translator.adapter.d.ts +0 -10
- package/dist/lib/arrange/infra/ts-ast-translator.adapter.d.ts.map +0 -1
- package/dist/lib/arrange/infra/ts-ast-translator.adapter.js +0 -363
- package/dist/lib/arrange/presentation/arrange-prelude.presenter.d.ts +0 -14
- package/dist/lib/arrange/presentation/arrange-prelude.presenter.d.ts.map +0 -1
- package/dist/lib/arrange/presentation/arrange-prelude.presenter.js +0 -24
- package/dist/lib/arrange/presentation/formatters.presenter.d.ts +0 -3
- package/dist/lib/arrange/presentation/formatters.presenter.d.ts.map +0 -1
- package/dist/lib/arrange/presentation/formatters.presenter.js +0 -2
- package/dist/lib/arrange/presentation/present-analyze-cli.presenter.d.ts +0 -4
- package/dist/lib/arrange/presentation/present-analyze-cli.presenter.d.ts.map +0 -1
- package/dist/lib/arrange/presentation/present-analyze-cli.presenter.js +0 -4
- package/dist/lib/arrange/presentation/report.presenter.d.ts +0 -4
- package/dist/lib/arrange/presentation/report.presenter.d.ts.map +0 -1
- package/dist/lib/arrange/presentation/report.presenter.js +0 -37
- package/dist/lib/arrange/presentation/resolve-arrange-cli-target.presenter.d.ts +0 -2
- package/dist/lib/arrange/presentation/resolve-arrange-cli-target.presenter.d.ts.map +0 -1
- package/dist/lib/arrange/presentation/resolve-arrange-cli-target.presenter.js +0 -7
- package/dist/lib/config/domain/schema.domain.d.ts +0 -50
- package/dist/lib/config/domain/schema.domain.d.ts.map +0 -1
- package/dist/lib/config/domain/schema.domain.js +0 -43
- package/dist/lib/config/index.d.ts +0 -4
- package/dist/lib/config/index.d.ts.map +0 -1
- package/dist/lib/config/index.js +0 -2
- package/dist/lib/config/infra/loader.adapter.d.ts +0 -11
- package/dist/lib/config/infra/loader.adapter.d.ts.map +0 -1
- package/dist/lib/config/infra/loader.adapter.js +0 -90
- package/dist/lib/core/application/architecture-boundaries.policy.d.ts +0 -19
- package/dist/lib/core/application/architecture-boundaries.policy.d.ts.map +0 -1
- package/dist/lib/core/application/architecture-boundaries.policy.js +0 -370
- package/dist/lib/core/application/ports/cli-io.port.d.ts +0 -31
- package/dist/lib/core/application/ports/cli-io.port.d.ts.map +0 -1
- package/dist/lib/core/application/schema-parse.util.d.ts +0 -8
- package/dist/lib/core/application/schema-parse.util.d.ts.map +0 -1
- package/dist/lib/core/application/schema-parse.util.js +0 -20
- package/dist/lib/core/application/utils/caught-unknown-message.util.d.ts +0 -6
- package/dist/lib/core/application/utils/caught-unknown-message.util.d.ts.map +0 -1
- package/dist/lib/core/application/utils/caught-unknown-message.util.js +0 -34
- package/dist/lib/core/application/utils/verbose-diagnostics.util.d.ts +0 -5
- package/dist/lib/core/application/utils/verbose-diagnostics.util.d.ts.map +0 -1
- package/dist/lib/core/application/utils/verbose-diagnostics.util.js +0 -7
- package/dist/lib/core/domain/errors.domain.d.ts +0 -11
- package/dist/lib/core/domain/errors.domain.d.ts.map +0 -1
- package/dist/lib/core/domain/errors.domain.js +0 -9
- package/dist/lib/core/domain/result.model.d.ts +0 -17
- package/dist/lib/core/domain/result.model.d.ts.map +0 -1
- package/dist/lib/core/domain/result.model.js +0 -15
- package/dist/lib/core/infra/container.adapter.d.ts +0 -58
- package/dist/lib/core/infra/container.adapter.d.ts.map +0 -1
- package/dist/lib/core/infra/container.adapter.js +0 -80
- package/dist/lib/core/infra/logging-decorator.adapter.d.ts +0 -12
- package/dist/lib/core/infra/logging-decorator.adapter.d.ts.map +0 -1
- package/dist/lib/core/infra/logging-decorator.adapter.js +0 -75
- package/dist/lib/core/presentation/cli-executor.presenter.d.ts +0 -33
- package/dist/lib/core/presentation/cli-executor.presenter.d.ts.map +0 -1
- package/dist/lib/core/presentation/cli-executor.presenter.js +0 -73
- package/dist/lib/core/presentation/format-app-error.presenter.d.ts +0 -6
- package/dist/lib/core/presentation/format-app-error.presenter.d.ts.map +0 -1
- package/dist/lib/core/presentation/format-app-error.presenter.js +0 -19
- package/dist/lib/core/presentation/global-cli-options.presenter.d.ts +0 -9
- package/dist/lib/core/presentation/global-cli-options.presenter.d.ts.map +0 -1
- package/dist/lib/core/presentation/global-cli-options.presenter.js +0 -8
- package/dist/lib/core/presentation/load-codefast-config.presenter.d.ts +0 -8
- package/dist/lib/core/presentation/load-codefast-config.presenter.d.ts.map +0 -1
- package/dist/lib/core/presentation/load-codefast-config.presenter.js +0 -15
- package/dist/lib/core/presentation/parse-cli-schema.presenter.d.ts +0 -5
- package/dist/lib/core/presentation/parse-cli-schema.presenter.d.ts.map +0 -1
- package/dist/lib/core/presentation/parse-cli-schema.presenter.js +0 -4
- package/dist/lib/core/presentation/run-cli-use-case-after-parse.presenter.d.ts +0 -6
- package/dist/lib/core/presentation/run-cli-use-case-after-parse.presenter.d.ts.map +0 -1
- package/dist/lib/core/presentation/run-cli-use-case-after-parse.presenter.js +0 -17
- package/dist/lib/core/presentation/workspace-root-strict.presenter.d.ts +0 -5
- package/dist/lib/core/presentation/workspace-root-strict.presenter.d.ts.map +0 -1
- package/dist/lib/core/presentation/workspace-root-strict.presenter.js +0 -12
- package/dist/lib/infra/config-reporter.adapter.d.ts +0 -4
- package/dist/lib/infra/config-reporter.adapter.d.ts.map +0 -1
- package/dist/lib/infra/config-reporter.adapter.js +0 -9
- package/dist/lib/infra/fs-contract.port.d.ts +0 -2
- package/dist/lib/infra/fs-contract.port.d.ts.map +0 -1
- package/dist/lib/infra/node-io.adapter.d.ts +0 -4
- package/dist/lib/infra/node-io.adapter.d.ts.map +0 -1
- package/dist/lib/infra/node-io.adapter.js +0 -37
- package/dist/lib/infra/workspace/repo-root.adapter.d.ts +0 -7
- package/dist/lib/infra/workspace/repo-root.adapter.d.ts.map +0 -1
- package/dist/lib/infra/workspace/repo-root.adapter.js +0 -23
- package/dist/lib/mirror/application/ports/file-system-service.port.d.ts +0 -6
- package/dist/lib/mirror/application/ports/file-system-service.port.d.ts.map +0 -1
- package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.d.ts +0 -27
- package/dist/lib/mirror/application/ports/mirror-sync-reporter.port.d.ts.map +0 -1
- package/dist/lib/mirror/application/ports/package-repository.port.d.ts +0 -16
- package/dist/lib/mirror/application/ports/package-repository.port.d.ts.map +0 -1
- package/dist/lib/mirror/application/ports/workspace-service.port.d.ts +0 -7
- package/dist/lib/mirror/application/ports/workspace-service.port.d.ts.map +0 -1
- package/dist/lib/mirror/application/requests/mirror-sync.request.d.ts +0 -10
- package/dist/lib/mirror/application/requests/mirror-sync.request.d.ts.map +0 -1
- package/dist/lib/mirror/application/requests/mirror-sync.request.js +0 -8
- package/dist/lib/mirror/application/use-cases/generate-mirror-exports.use-case.d.ts +0 -10
- package/dist/lib/mirror/application/use-cases/generate-mirror-exports.use-case.d.ts.map +0 -1
- package/dist/lib/mirror/application/use-cases/generate-mirror-exports.use-case.js +0 -271
- package/dist/lib/mirror/application/use-cases/run-mirror-sync.use-case.d.ts +0 -19
- package/dist/lib/mirror/application/use-cases/run-mirror-sync.use-case.d.ts.map +0 -1
- package/dist/lib/mirror/application/use-cases/run-mirror-sync.use-case.js +0 -168
- package/dist/lib/mirror/domain/constants.domain.d.ts +0 -6
- package/dist/lib/mirror/domain/constants.domain.d.ts.map +0 -1
- package/dist/lib/mirror/domain/constants.domain.js +0 -5
- package/dist/lib/mirror/domain/errors.domain.d.ts +0 -10
- package/dist/lib/mirror/domain/errors.domain.d.ts.map +0 -1
- package/dist/lib/mirror/domain/errors.domain.js +0 -12
- package/dist/lib/mirror/domain/types.domain.d.ts +0 -65
- package/dist/lib/mirror/domain/types.domain.d.ts.map +0 -1
- package/dist/lib/mirror/index.d.ts +0 -6
- package/dist/lib/mirror/index.d.ts.map +0 -1
- package/dist/lib/mirror/index.js +0 -1
- package/dist/lib/mirror/infra/dirent-list.adapter.d.ts +0 -9
- package/dist/lib/mirror/infra/dirent-list.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/dirent-list.adapter.js +0 -13
- package/dist/lib/mirror/infra/file-system-service.adapter.d.ts +0 -7
- package/dist/lib/mirror/infra/file-system-service.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/file-system-service.adapter.js +0 -47
- package/dist/lib/mirror/infra/mirror-sync-cli-options.adapter.d.ts +0 -14
- package/dist/lib/mirror/infra/mirror-sync-cli-options.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.d.ts +0 -3
- package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/mirror-sync-reporter.adapter.js +0 -13
- package/dist/lib/mirror/infra/package-filter.adapter.d.ts +0 -8
- package/dist/lib/mirror/infra/package-filter.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/package-filter.adapter.js +0 -33
- package/dist/lib/mirror/infra/package-repository.adapter.d.ts +0 -17
- package/dist/lib/mirror/infra/package-repository.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/package-repository.adapter.js +0 -17
- package/dist/lib/mirror/infra/path-normalizer.adapter.d.ts +0 -2
- package/dist/lib/mirror/infra/path-normalizer.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/path-normalizer.adapter.js +0 -4
- package/dist/lib/mirror/infra/update-pkg.adapter.d.ts +0 -19
- package/dist/lib/mirror/infra/update-pkg.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/update-pkg.adapter.js +0 -156
- package/dist/lib/mirror/infra/workspace-packages.adapter.d.ts +0 -26
- package/dist/lib/mirror/infra/workspace-packages.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/workspace-packages.adapter.js +0 -170
- package/dist/lib/mirror/infra/workspace-service.adapter.d.ts +0 -8
- package/dist/lib/mirror/infra/workspace-service.adapter.d.ts.map +0 -1
- package/dist/lib/mirror/infra/workspace-service.adapter.js +0 -10
- package/dist/lib/mirror/presentation/mirror-prelude.presenter.d.ts +0 -17
- package/dist/lib/mirror/presentation/mirror-prelude.presenter.d.ts.map +0 -1
- package/dist/lib/mirror/presentation/mirror-prelude.presenter.js +0 -35
- package/dist/lib/mirror/presentation/reporter.presenter.d.ts +0 -25
- package/dist/lib/mirror/presentation/reporter.presenter.d.ts.map +0 -1
- package/dist/lib/mirror/presentation/reporter.presenter.js +0 -140
- package/dist/lib/mirror/presentation/resolve-mirror-package-arg.presenter.d.ts +0 -11
- package/dist/lib/mirror/presentation/resolve-mirror-package-arg.presenter.d.ts.map +0 -1
- package/dist/lib/mirror/presentation/resolve-mirror-package-arg.presenter.js +0 -27
- package/dist/lib/shared/source-code/domain/text-edit.model.d.ts +0 -14
- package/dist/lib/shared/source-code/domain/text-edit.model.d.ts.map +0 -1
- package/dist/lib/shared/source-code/domain/text-edit.model.js +0 -30
- package/dist/lib/shared/source-code/infra/tsx-file-walk.adapter.d.ts +0 -4
- package/dist/lib/shared/source-code/infra/tsx-file-walk.adapter.d.ts.map +0 -1
- package/dist/lib/shared/source-code/infra/tsx-file-walk.adapter.js +0 -37
- package/dist/lib/tag/application/ports/target-resolver.port.d.ts +0 -6
- package/dist/lib/tag/application/ports/target-resolver.port.d.ts.map +0 -1
- package/dist/lib/tag/application/ports/typescript-tree-walk.port.d.ts +0 -6
- package/dist/lib/tag/application/ports/typescript-tree-walk.port.d.ts.map +0 -1
- package/dist/lib/tag/application/requests/tag-sync.request.d.ts +0 -10
- package/dist/lib/tag/application/requests/tag-sync.request.d.ts.map +0 -1
- package/dist/lib/tag/application/requests/tag-sync.request.js +0 -8
- package/dist/lib/tag/application/use-cases/run-tag-sync.use-case.d.ts +0 -23
- package/dist/lib/tag/application/use-cases/run-tag-sync.use-case.d.ts.map +0 -1
- package/dist/lib/tag/application/use-cases/run-tag-sync.use-case.js +0 -357
- package/dist/lib/tag/domain/types.domain.d.ts +0 -56
- package/dist/lib/tag/domain/types.domain.d.ts.map +0 -1
- package/dist/lib/tag/index.d.ts +0 -14
- package/dist/lib/tag/index.d.ts.map +0 -1
- package/dist/lib/tag/index.js +0 -10
- package/dist/lib/tag/infra/tag-sync-cli-options.adapter.d.ts +0 -14
- package/dist/lib/tag/infra/tag-sync-cli-options.adapter.d.ts.map +0 -1
- package/dist/lib/tag/infra/tag-target-candidates.adapter.d.ts +0 -4
- package/dist/lib/tag/infra/tag-target-candidates.adapter.d.ts.map +0 -1
- package/dist/lib/tag/infra/tag-target-candidates.adapter.js +0 -200
- package/dist/lib/tag/infra/tag-target-resolver.adapter.d.ts +0 -3
- package/dist/lib/tag/infra/tag-target-resolver.adapter.d.ts.map +0 -1
- package/dist/lib/tag/infra/tag-target-resolver.adapter.js +0 -4
- package/dist/lib/tag/infra/typescript-tree-walk.adapter.d.ts +0 -3
- package/dist/lib/tag/infra/typescript-tree-walk.adapter.d.ts.map +0 -1
- package/dist/lib/tag/infra/typescript-tree-walk.adapter.js +0 -4
- package/dist/lib/tag/presentation/colors.presenter.d.ts +0 -8
- package/dist/lib/tag/presentation/colors.presenter.d.ts.map +0 -1
- package/dist/lib/tag/presentation/colors.presenter.js +0 -9
- package/dist/lib/tag/presentation/resolve-tag-cli-target.presenter.d.ts +0 -8
- package/dist/lib/tag/presentation/resolve-tag-cli-target.presenter.d.ts.map +0 -1
- package/dist/lib/tag/presentation/resolve-tag-cli-target.presenter.js +0 -10
- package/dist/lib/tag/presentation/resolve-tag-workspace-root.presenter.d.ts +0 -8
- package/dist/lib/tag/presentation/resolve-tag-workspace-root.presenter.d.ts.map +0 -1
- package/dist/lib/tag/presentation/resolve-tag-workspace-root.presenter.js +0 -10
- package/dist/lib/tag/presentation/tag-prelude.presenter.d.ts +0 -15
- package/dist/lib/tag/presentation/tag-prelude.presenter.d.ts.map +0 -1
- package/dist/lib/tag/presentation/tag-prelude.presenter.js +0 -31
- package/dist/lib/tag/presentation/tag-sync.presenter.d.ts +0 -20
- package/dist/lib/tag/presentation/tag-sync.presenter.d.ts.map +0 -1
- package/dist/lib/tag/presentation/tag-sync.presenter.js +0 -92
- package/dist/program.d.ts +0 -4
- package/dist/program.d.ts.map +0 -1
- package/dist/program.js +0 -40
- /package/dist/lib/arrange/application/ports/{domain-source-parser.port.js → domain-source-parser.port.mjs} +0 -0
- /package/dist/lib/arrange/application/ports/{file-walker.port.js → file-walker.port.mjs} +0 -0
- /package/dist/lib/arrange/{infra/arrange-sync-cli-options.adapter.js → application/ports/group-file-preview.port.mjs} +0 -0
- /package/dist/lib/{core/application/ports/cli-io.port.js → arrange/application/requests/analyze-directory.request.mjs} +0 -0
- /package/dist/lib/{infra/fs-contract.port.js → arrange/application/requests/arrange-sync.request.mjs} +0 -0
- /package/dist/lib/{mirror/application/ports/file-system-service.port.js → arrange/application/requests/suggest-groups.request.mjs} +0 -0
- /package/dist/lib/{mirror/application/ports/mirror-sync-reporter.port.js → arrange/contracts/models.mjs} +0 -0
- /package/dist/lib/{mirror/application/ports/package-repository.port.js → arrange/contracts/presentation.contract.mjs} +0 -0
- /package/dist/lib/{mirror/application/ports/workspace-service.port.js → arrange/contracts/services.contract.mjs} +0 -0
- /package/dist/lib/{mirror/domain/types.domain.js → arrange/contracts/use-cases.contract.mjs} +0 -0
- /package/dist/lib/{mirror/infra/mirror-sync-cli-options.adapter.js → arrange/domain/types.domain.mjs} +0 -0
- /package/dist/lib/{tag/application/ports/target-resolver.port.js → arrange/infra/arrange-sync-cli-options.adapter.mjs} +0 -0
- /package/dist/lib/{tag/application/ports/typescript-tree-walk.port.js → config/application/ports/config-loader.port.mjs} +0 -0
- /package/dist/lib/{tag/domain/types.domain.js → config/domain/schema.domain.mjs} +0 -0
- /package/dist/lib/{tag/infra/tag-sync-cli-options.adapter.js → core/application/ports/cli-io.port.mjs} +0 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
//#region src/lib/core/application/architecture-boundaries.policy.ts
|
|
2
|
+
/** Product bounded contexts: no direct cross-imports between these (domain + application rules). */ const PRODUCT_BOUNDED_CONTEXTS = new Set([
|
|
3
|
+
"arrange",
|
|
4
|
+
"mirror",
|
|
5
|
+
"tag"
|
|
6
|
+
]);
|
|
7
|
+
const SHARED_SOURCE_CODE_CONTEXT = "shared-source-code";
|
|
8
|
+
const PATH_SEPARATOR = "/";
|
|
9
|
+
const LAYERS = new Set([
|
|
10
|
+
"domain",
|
|
11
|
+
"application",
|
|
12
|
+
"infra",
|
|
13
|
+
"presentation"
|
|
14
|
+
]);
|
|
15
|
+
/** Import roots that any product slice may depend on without going "through" another slice. */ const NEUTRAL_LIB_IMPORT_ROOTS = new Set([
|
|
16
|
+
"core",
|
|
17
|
+
"config",
|
|
18
|
+
"infra",
|
|
19
|
+
"shared"
|
|
20
|
+
]);
|
|
21
|
+
/** Internal imports: tsconfig `#/*` → `src/*`. */ const INTERNAL_LIB_PREFIX = "#/lib/";
|
|
22
|
+
function pathAfterInternalLibPrefix(specifier) {
|
|
23
|
+
if (!specifier.startsWith(INTERNAL_LIB_PREFIX)) return null;
|
|
24
|
+
return specifier.slice(6);
|
|
25
|
+
}
|
|
26
|
+
function internalLibSpecifierSegmentList(specifier) {
|
|
27
|
+
const afterPrefix = pathAfterInternalLibPrefix(specifier);
|
|
28
|
+
if (afterPrefix === null) return null;
|
|
29
|
+
const segments = afterPrefix.split(PATH_SEPARATOR).filter(Boolean);
|
|
30
|
+
return segments.length === 0 ? null : segments;
|
|
31
|
+
}
|
|
32
|
+
function normalizePathSeparators(pathValue) {
|
|
33
|
+
return pathValue.split("\\").join(PATH_SEPARATOR);
|
|
34
|
+
}
|
|
35
|
+
function splitPath(pathValue) {
|
|
36
|
+
return normalizePathSeparators(pathValue).split(PATH_SEPARATOR).filter(Boolean);
|
|
37
|
+
}
|
|
38
|
+
function basenamePath(pathValue) {
|
|
39
|
+
const parts = splitPath(pathValue);
|
|
40
|
+
return parts.length === 0 ? "" : parts[parts.length - 1] ?? "";
|
|
41
|
+
}
|
|
42
|
+
function dirnamePath(pathValue) {
|
|
43
|
+
const parts = normalizePathSeparators(pathValue).split(PATH_SEPARATOR);
|
|
44
|
+
parts.pop();
|
|
45
|
+
if (parts.length === 0) return PATH_SEPARATOR;
|
|
46
|
+
const joined = parts.join(PATH_SEPARATOR);
|
|
47
|
+
return joined === "" ? PATH_SEPARATOR : joined;
|
|
48
|
+
}
|
|
49
|
+
function joinPath(...segments) {
|
|
50
|
+
return segments.map((segment) => normalizePathSeparators(segment)).join(PATH_SEPARATOR).replace(/\/+/g, PATH_SEPARATOR);
|
|
51
|
+
}
|
|
52
|
+
function normalizeDotSegments(pathValue) {
|
|
53
|
+
const normalized = normalizePathSeparators(pathValue);
|
|
54
|
+
const isAbsolute = normalized.startsWith(PATH_SEPARATOR);
|
|
55
|
+
const segments = normalized.split(PATH_SEPARATOR);
|
|
56
|
+
const stack = [];
|
|
57
|
+
for (const segment of segments) {
|
|
58
|
+
if (!segment || segment === ".") continue;
|
|
59
|
+
if (segment === "..") {
|
|
60
|
+
if (stack.length > 0) stack.pop();
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
stack.push(segment);
|
|
64
|
+
}
|
|
65
|
+
const suffix = stack.join(PATH_SEPARATOR);
|
|
66
|
+
return isAbsolute ? `${PATH_SEPARATOR}${suffix}` : suffix;
|
|
67
|
+
}
|
|
68
|
+
function sharedSourceCodeLayerFromSpecifier(segments) {
|
|
69
|
+
if (segments.length < 3 || segments[0] !== "shared" || segments[1] !== "source-code") return null;
|
|
70
|
+
return segments[2] ?? null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Extract `#/lib/...` and relative import specifiers from TypeScript source
|
|
74
|
+
* (static `from` / `import("...")` only).
|
|
75
|
+
*/ function extractImportSpecifiers(sourceText) {
|
|
76
|
+
const specifiers = [];
|
|
77
|
+
const fromPattern = /\bfrom\s+["']([^"']+)["']/g;
|
|
78
|
+
let fromMatch;
|
|
79
|
+
while ((fromMatch = fromPattern.exec(sourceText)) !== null) {
|
|
80
|
+
const cap = fromMatch[1];
|
|
81
|
+
if (cap !== void 0) specifiers.push(cap);
|
|
82
|
+
}
|
|
83
|
+
const importOnlyPattern = /^\s*import\s+["']([^"']+)["']\s*;/gm;
|
|
84
|
+
let importOnlyMatch;
|
|
85
|
+
while ((importOnlyMatch = importOnlyPattern.exec(sourceText)) !== null) {
|
|
86
|
+
const cap = importOnlyMatch[1];
|
|
87
|
+
if (cap !== void 0) specifiers.push(cap);
|
|
88
|
+
}
|
|
89
|
+
const importCallPattern = /\bimport\s*\(\s*["']([^"']+)["']\s*\)/g;
|
|
90
|
+
let importCallMatch;
|
|
91
|
+
while ((importCallMatch = importCallPattern.exec(sourceText)) !== null) {
|
|
92
|
+
const cap = importCallMatch[1];
|
|
93
|
+
if (cap !== void 0) specifiers.push(cap);
|
|
94
|
+
}
|
|
95
|
+
return specifiers;
|
|
96
|
+
}
|
|
97
|
+
function pathUnderCliSrcLib(absolutePath) {
|
|
98
|
+
const normalized = normalizePathSeparators(absolutePath);
|
|
99
|
+
const marker = `${PATH_SEPARATOR}src${PATH_SEPARATOR}lib${PATH_SEPARATOR}`;
|
|
100
|
+
const index = normalized.lastIndexOf(marker);
|
|
101
|
+
if (index === -1) return null;
|
|
102
|
+
return normalized.slice(index + marker.length);
|
|
103
|
+
}
|
|
104
|
+
function parseLibSourceLocation(absoluteFilePath) {
|
|
105
|
+
const tail = pathUnderCliSrcLib(absoluteFilePath);
|
|
106
|
+
if (tail === null) return null;
|
|
107
|
+
const parts = tail.split(PATH_SEPARATOR).filter(Boolean);
|
|
108
|
+
if (parts.length < 2) return null;
|
|
109
|
+
if (parts[0] === "shared" && parts[1] === "source-code" && parts.length >= 3) {
|
|
110
|
+
const layer = parts[2];
|
|
111
|
+
if (layer === void 0 || !LAYERS.has(layer)) return null;
|
|
112
|
+
const rest = parts.slice(3);
|
|
113
|
+
if (layer === "domain" && rest[0] === "__tests__") return {
|
|
114
|
+
context: SHARED_SOURCE_CODE_CONTEXT,
|
|
115
|
+
layer: "domain"
|
|
116
|
+
};
|
|
117
|
+
return {
|
|
118
|
+
context: SHARED_SOURCE_CODE_CONTEXT,
|
|
119
|
+
layer
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const context = parts[0];
|
|
123
|
+
const layer = parts[1];
|
|
124
|
+
const rest = parts.slice(2);
|
|
125
|
+
if (context === void 0 || layer === void 0 || !LAYERS.has(layer)) return null;
|
|
126
|
+
if (layer === "domain" && rest[0] === "__tests__") return {
|
|
127
|
+
context,
|
|
128
|
+
layer
|
|
129
|
+
};
|
|
130
|
+
return {
|
|
131
|
+
context,
|
|
132
|
+
layer
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function isArchitectureExcludedSourceFile(absoluteFilePath) {
|
|
136
|
+
const base = basenamePath(absoluteFilePath);
|
|
137
|
+
if (base.endsWith(".test.ts") || base.endsWith(".integration.test.ts")) return true;
|
|
138
|
+
return normalizePathSeparators(absoluteFilePath).split(PATH_SEPARATOR).includes("__tests__");
|
|
139
|
+
}
|
|
140
|
+
function resolveRelativeSpecifier(fromAbsoluteFile, specifier) {
|
|
141
|
+
if (!specifier.startsWith(".")) return null;
|
|
142
|
+
return normalizeDotSegments(joinPath(dirnamePath(fromAbsoluteFile), specifier));
|
|
143
|
+
}
|
|
144
|
+
function libTailAfterResolution(absoluteResolved) {
|
|
145
|
+
const tail = pathUnderCliSrcLib(absoluteResolved);
|
|
146
|
+
if (tail === null) return null;
|
|
147
|
+
return tail.split(PATH_SEPARATOR).filter(Boolean);
|
|
148
|
+
}
|
|
149
|
+
function lastSegmentOfLibSpecifier(specifier) {
|
|
150
|
+
const segments = internalLibSpecifierSegmentList(specifier);
|
|
151
|
+
if (segments === null) return null;
|
|
152
|
+
return segments[segments.length - 1] ?? null;
|
|
153
|
+
}
|
|
154
|
+
function importedModuleStem(specifier, fromAbsoluteFile) {
|
|
155
|
+
if (pathAfterInternalLibPrefix(specifier) !== null) return lastSegmentOfLibSpecifier(specifier);
|
|
156
|
+
const resolved = resolveRelativeSpecifier(fromAbsoluteFile, specifier);
|
|
157
|
+
if (resolved === null) return null;
|
|
158
|
+
const baseName = basenamePath(resolved.endsWith(".ts") ? resolved : `${resolved}.ts`);
|
|
159
|
+
return baseName.endsWith(".ts") ? baseName.slice(0, -3) : baseName;
|
|
160
|
+
}
|
|
161
|
+
function isPureDomainOrModelFileName(fileBaseName) {
|
|
162
|
+
return /\.(domain|model)\.ts$/.test(fileBaseName);
|
|
163
|
+
}
|
|
164
|
+
function isRuleAForbiddenImportedStem(moduleStem) {
|
|
165
|
+
return moduleStem.includes(".use-case") || moduleStem.includes(".adapter") || moduleStem.includes(".presenter");
|
|
166
|
+
}
|
|
167
|
+
function isRuleBForbiddenImportedStem(moduleStem) {
|
|
168
|
+
return moduleStem.includes(".adapter") || moduleStem.includes(".presenter");
|
|
169
|
+
}
|
|
170
|
+
function violationRuleAPureDomainModel(absoluteFilePath, fileBaseName, specifier) {
|
|
171
|
+
if (!isPureDomainOrModelFileName(fileBaseName)) return null;
|
|
172
|
+
const stem = importedModuleStem(specifier, absoluteFilePath);
|
|
173
|
+
if (stem === null || !isRuleAForbiddenImportedStem(stem)) return null;
|
|
174
|
+
return `${absoluteFilePath}: Rule A (pure domain/model) must not import orchestration or IO modules — blocked ${specifier} (stem "${stem}")`;
|
|
175
|
+
}
|
|
176
|
+
function violationRuleBApplicationIsolation(loc, absoluteFilePath, specifier) {
|
|
177
|
+
if (loc.layer !== "application") return null;
|
|
178
|
+
const stem = importedModuleStem(specifier, absoluteFilePath);
|
|
179
|
+
if (stem === null || !isRuleBForbiddenImportedStem(stem)) return null;
|
|
180
|
+
return `${absoluteFilePath}: Rule B (application isolation) must not import adapters or presenters — blocked ${specifier} (stem "${stem}")`;
|
|
181
|
+
}
|
|
182
|
+
function violationRuleCAntiCrossSlice(loc, specifier, fromAbsoluteFile) {
|
|
183
|
+
if (!PRODUCT_BOUNDED_CONTEXTS.has(loc.context)) return null;
|
|
184
|
+
const ruleCSegments = internalLibSpecifierSegmentList(specifier);
|
|
185
|
+
if (ruleCSegments !== null) {
|
|
186
|
+
const importedRoot = ruleCSegments[0];
|
|
187
|
+
if (importedRoot === void 0 || NEUTRAL_LIB_IMPORT_ROOTS.has(importedRoot)) return null;
|
|
188
|
+
if (importedRoot === loc.context) return null;
|
|
189
|
+
if (PRODUCT_BOUNDED_CONTEXTS.has(importedRoot)) return `${fromAbsoluteFile}: Rule C (slice isolation) context "${loc.context}" must not import "${specifier}" — use #/lib/shared/... or neutral roots (core, config, infra) instead`;
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
const resolved = resolveRelativeSpecifier(fromAbsoluteFile, specifier);
|
|
193
|
+
if (resolved === null) return null;
|
|
194
|
+
const parts = libTailAfterResolution(resolved.endsWith(".ts") ? resolved : `${resolved}.ts`);
|
|
195
|
+
if (parts === null || parts.length === 0) return null;
|
|
196
|
+
const importedContext = parts[0];
|
|
197
|
+
if (importedContext === void 0 || NEUTRAL_LIB_IMPORT_ROOTS.has(importedContext)) return null;
|
|
198
|
+
if (importedContext === loc.context) return null;
|
|
199
|
+
if (PRODUCT_BOUNDED_CONTEXTS.has(importedContext)) return `${fromAbsoluteFile}: Rule C (slice isolation) context "${loc.context}" must not resolve into sibling slice via ${specifier}`;
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
function violationDomainLayer(loc, specifier, fromAbsoluteFile) {
|
|
203
|
+
const domainSegments = internalLibSpecifierSegmentList(specifier);
|
|
204
|
+
if (domainSegments !== null) {
|
|
205
|
+
const segments = domainSegments;
|
|
206
|
+
if (segments[0] === "infra") return `${fromAbsoluteFile}: domain must not import ${specifier}`;
|
|
207
|
+
const sharedLayerImported = sharedSourceCodeLayerFromSpecifier(segments);
|
|
208
|
+
if (sharedLayerImported !== null && sharedLayerImported !== "domain") return `${fromAbsoluteFile}: domain must not import ${specifier}`;
|
|
209
|
+
if (segments[0] === loc.context && segments.length >= 2) {
|
|
210
|
+
const importLayer = segments[1];
|
|
211
|
+
if (importLayer === "application" || importLayer === "infra" || importLayer === "presentation") return `${fromAbsoluteFile}: domain must not import ${specifier}`;
|
|
212
|
+
}
|
|
213
|
+
const segmentZero = segments[0];
|
|
214
|
+
if (segments.length >= 2 && segments[1] === "domain" && segmentZero !== void 0 && PRODUCT_BOUNDED_CONTEXTS.has(segmentZero) && segmentZero !== loc.context) return `${fromAbsoluteFile}: domain (${loc.context}) must not import other bounded context domain ${specifier}`;
|
|
215
|
+
if (loc.context === "core" && segments.length >= 2 && segments[1] === "domain" && segmentZero !== void 0 && PRODUCT_BOUNDED_CONTEXTS.has(segmentZero)) return `${fromAbsoluteFile}: core/domain must not import bounded context domain ${specifier}`;
|
|
216
|
+
if (loc.context === "config" && segments.length >= 2 && segments[1] === "domain" && segmentZero !== void 0 && PRODUCT_BOUNDED_CONTEXTS.has(segmentZero)) return `${fromAbsoluteFile}: config/domain must not import bounded context domain ${specifier}`;
|
|
217
|
+
if (loc.context === SHARED_SOURCE_CODE_CONTEXT && segmentZero !== void 0 && PRODUCT_BOUNDED_CONTEXTS.has(segmentZero)) return `${fromAbsoluteFile}: shared source-code domain must not import product context ${specifier}`;
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
const resolved = resolveRelativeSpecifier(fromAbsoluteFile, specifier);
|
|
221
|
+
if (resolved === null) return null;
|
|
222
|
+
const parts = libTailAfterResolution(resolved);
|
|
223
|
+
if (parts === null || parts.length < 2) return null;
|
|
224
|
+
const relCtx = parts[0];
|
|
225
|
+
const relLayer = parts[1];
|
|
226
|
+
if (relCtx === void 0 || relLayer === void 0) return null;
|
|
227
|
+
if (relCtx === "infra") return `${fromAbsoluteFile}: domain must not resolve into infra via ${specifier}`;
|
|
228
|
+
if (relCtx === loc.context) {
|
|
229
|
+
if (relLayer === "application" || relLayer === "infra" || relLayer === "presentation") return `${fromAbsoluteFile}: domain must not resolve into ${relLayer} via ${specifier}`;
|
|
230
|
+
}
|
|
231
|
+
if (relLayer === "domain" && PRODUCT_BOUNDED_CONTEXTS.has(relCtx) && relCtx !== loc.context) return `${fromAbsoluteFile}: domain must not resolve into other bounded context domain via ${specifier}`;
|
|
232
|
+
if (loc.context === "core" && relLayer === "domain" && PRODUCT_BOUNDED_CONTEXTS.has(relCtx)) return `${fromAbsoluteFile}: core/domain must not resolve into bounded context domain via ${specifier}`;
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
function violationApplicationLayer(loc, specifier, fromAbsoluteFile) {
|
|
236
|
+
const applicationSegments = internalLibSpecifierSegmentList(specifier);
|
|
237
|
+
if (applicationSegments !== null) {
|
|
238
|
+
const segments = applicationSegments;
|
|
239
|
+
if (segments[0] === "infra") return `${fromAbsoluteFile}: application must not import ${specifier}`;
|
|
240
|
+
const sharedLayerImported = sharedSourceCodeLayerFromSpecifier(segments);
|
|
241
|
+
if (sharedLayerImported === "infra" || sharedLayerImported === "presentation" || sharedLayerImported === "application") return `${fromAbsoluteFile}: application must not import ${specifier}`;
|
|
242
|
+
if (segments.length >= 2 && (segments[1] === "infra" || segments[1] === "presentation")) return `${fromAbsoluteFile}: application must not import ${specifier}`;
|
|
243
|
+
const appSegmentZero = segments[0];
|
|
244
|
+
if (PRODUCT_BOUNDED_CONTEXTS.has(loc.context) && appSegmentZero !== void 0 && PRODUCT_BOUNDED_CONTEXTS.has(appSegmentZero) && appSegmentZero !== loc.context) return `${fromAbsoluteFile}: application (${loc.context}) must not import ${specifier}`;
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
const resolved = resolveRelativeSpecifier(fromAbsoluteFile, specifier);
|
|
248
|
+
if (resolved === null) return null;
|
|
249
|
+
const parts = libTailAfterResolution(resolved);
|
|
250
|
+
if (parts === null || parts.length < 2) return null;
|
|
251
|
+
const relCtx = parts[0];
|
|
252
|
+
const relLayer = parts[1];
|
|
253
|
+
if (relCtx === void 0 || relLayer === void 0) return null;
|
|
254
|
+
if (relCtx === "infra") return `${fromAbsoluteFile}: application must not resolve into infra via ${specifier}`;
|
|
255
|
+
if (relLayer === "infra" || relLayer === "presentation") return `${fromAbsoluteFile}: application must not resolve into ${relLayer} via ${specifier}`;
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Returns human-readable violations for a single file's imports (for unit tests and tooling).
|
|
260
|
+
*/ function violationsForFileContent(absoluteFilePath, loc, sourceText) {
|
|
261
|
+
const violations = [];
|
|
262
|
+
const fileBaseName = basenamePath(absoluteFilePath);
|
|
263
|
+
for (const specifier of extractImportSpecifiers(sourceText)) {
|
|
264
|
+
const ruleA = violationRuleAPureDomainModel(absoluteFilePath, fileBaseName, specifier);
|
|
265
|
+
if (ruleA !== null) violations.push(ruleA);
|
|
266
|
+
const ruleB = violationRuleBApplicationIsolation(loc, absoluteFilePath, specifier);
|
|
267
|
+
if (ruleB !== null) violations.push(ruleB);
|
|
268
|
+
const ruleC = violationRuleCAntiCrossSlice(loc, specifier, absoluteFilePath);
|
|
269
|
+
if (ruleC !== null) violations.push(ruleC);
|
|
270
|
+
if (loc.layer === "domain") {
|
|
271
|
+
const domainViolation = violationDomainLayer(loc, specifier, absoluteFilePath);
|
|
272
|
+
if (domainViolation !== null) violations.push(domainViolation);
|
|
273
|
+
} else if (loc.layer === "application") {
|
|
274
|
+
const appViolation = violationApplicationLayer(loc, specifier, absoluteFilePath);
|
|
275
|
+
if (appViolation !== null) violations.push(appViolation);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return [...new Set(violations)];
|
|
279
|
+
}
|
|
280
|
+
function walkNonTestTsFiles(rootDir, fs) {
|
|
281
|
+
const results = [];
|
|
282
|
+
const scan = (dir) => {
|
|
283
|
+
for (const entryName of fs.readdirSync(dir)) {
|
|
284
|
+
const full = joinPath(dir, entryName);
|
|
285
|
+
const stat = fs.statSync(full);
|
|
286
|
+
if (stat.isDirectory()) {
|
|
287
|
+
if (entryName === "node_modules" || entryName === "dist") continue;
|
|
288
|
+
scan(full);
|
|
289
|
+
} else if (stat.isFile() && entryName.endsWith(".ts")) {
|
|
290
|
+
if (!isArchitectureExcludedSourceFile(full)) results.push(full);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
scan(rootDir);
|
|
295
|
+
return results;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Scans `packages/cli/src/lib` for explicit-architecture boundary violations (non-test sources only).
|
|
299
|
+
*/ function scanCliPackageArchitectureViolations(cliPackageRoot, fs, pathService) {
|
|
300
|
+
const libRoot = pathService.join(cliPackageRoot, "src", "lib");
|
|
301
|
+
const violations = [];
|
|
302
|
+
for (const absoluteFilePath of walkNonTestTsFiles(libRoot, fs)) {
|
|
303
|
+
const loc = parseLibSourceLocation(absoluteFilePath);
|
|
304
|
+
if (loc === null) continue;
|
|
305
|
+
const sourceText = fs.readFileSync(absoluteFilePath, "utf8");
|
|
306
|
+
violations.push(...violationsForFileContent(absoluteFilePath, loc, sourceText));
|
|
307
|
+
}
|
|
308
|
+
return violations;
|
|
309
|
+
}
|
|
310
|
+
//#endregion
|
|
311
|
+
export { extractImportSpecifiers, isArchitectureExcludedSourceFile, parseLibSourceLocation, scanCliPackageArchitectureViolations, violationsForFileContent };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { appError } from "../domain/errors.domain.mjs";
|
|
2
|
+
import { err, ok } from "../domain/result.model.mjs";
|
|
3
|
+
//#region src/lib/core/application/schema-parse.util.ts
|
|
4
|
+
function formatSchemaIssues(issues) {
|
|
5
|
+
return issues.map((issue) => {
|
|
6
|
+
return `${issue.path.length > 0 ? `${issue.path.join(".")}: ` : ""}${issue.message}`;
|
|
7
|
+
}).join("; ");
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Validates `input` with `schema`, returning {@link AppError} with code `VALIDATION_ERROR` on failure.
|
|
11
|
+
*/ function parseWithSchema(schema, input) {
|
|
12
|
+
const parsed = schema.safeParse(input);
|
|
13
|
+
if (!parsed.success) return err(appError("VALIDATION_ERROR", formatSchemaIssues(parsed.error.issues)));
|
|
14
|
+
return ok(parsed.data);
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { parseWithSchema };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/lib/core/application/utils/caught-unknown-message.util.ts
|
|
2
|
+
/**
|
|
3
|
+
* Stable, user-facing text for values caught as `unknown`.
|
|
4
|
+
* Avoids `String(unknown)` / `[object Object]` and satisfies strict `no-base-to-string`.
|
|
5
|
+
*/ function messageFromCaughtUnknown(value) {
|
|
6
|
+
if (value instanceof Error) return value.message;
|
|
7
|
+
if (typeof value === "string") return value;
|
|
8
|
+
if (typeof value === "number" || typeof value === "bigint" || typeof value === "boolean") return String(value);
|
|
9
|
+
if (typeof value === "symbol") return String(value);
|
|
10
|
+
if (value === null) return "null";
|
|
11
|
+
if (value === void 0) return "undefined";
|
|
12
|
+
try {
|
|
13
|
+
const serialized = JSON.stringify(value);
|
|
14
|
+
if (typeof serialized === "string") return serialized;
|
|
15
|
+
} catch {}
|
|
16
|
+
return "[unserializable non-Error value]";
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { messageFromCaughtUnknown };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/lib/core/application/utils/verbose-diagnostics.util.ts
|
|
2
|
+
/**
|
|
3
|
+
* When true, infrastructure failures may log full stack traces (e.g. in {@link consumeCliAppError}).
|
|
4
|
+
*/ function isVerboseInfraDiagnostics() {
|
|
5
|
+
const raw = process.env.CODEFAST_VERBOSE;
|
|
6
|
+
return raw === "1" || raw === "true";
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { isVerboseInfraDiagnostics };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CliPathToken } from "./operational/contracts/tokens.mjs";
|
|
2
|
+
import { nodeCliPath } from "./infra/path.adapter.mjs";
|
|
3
|
+
import { Module } from "@codefast/di";
|
|
4
|
+
//#region src/lib/core/core.module.ts
|
|
5
|
+
const CoreModule = Module.create("cli-core", (moduleBuilder) => {
|
|
6
|
+
moduleBuilder.bind(CliPathToken).toConstantValue(nodeCliPath);
|
|
7
|
+
});
|
|
8
|
+
//#endregion
|
|
9
|
+
export { CoreModule };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/lib/core/domain/cli-exit-codes.domain.ts
|
|
2
|
+
/**
|
|
3
|
+
* Process exit codes for the `codefast` CLI.
|
|
4
|
+
*
|
|
5
|
+
* Conventions align with common Unix tooling: `0` success, `1` general failure,
|
|
6
|
+
* `2` for invalid invocation (schema / options), matching GNU `sysexits` `EX_USAGE` spirit.
|
|
7
|
+
*/ const CLI_EXIT_SUCCESS = 0;
|
|
8
|
+
const CLI_EXIT_GENERAL_ERROR = 1;
|
|
9
|
+
const CLI_EXIT_USAGE = 2;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { CLI_EXIT_GENERAL_ERROR, CLI_EXIT_SUCCESS, CLI_EXIT_USAGE };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/lib/core/domain/errors.domain.ts
|
|
2
|
+
/**
|
|
3
|
+
* Cross-context application errors for Result-based use cases (CLI orchestration).
|
|
4
|
+
*/ function appError(code, message, cause) {
|
|
5
|
+
if (cause === void 0) return {
|
|
6
|
+
code,
|
|
7
|
+
message
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
code,
|
|
11
|
+
message,
|
|
12
|
+
cause
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { appError };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/lib/core/domain/result.model.ts
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight functional Result type for use-case boundaries.
|
|
4
|
+
*/ function ok(value) {
|
|
5
|
+
return {
|
|
6
|
+
ok: true,
|
|
7
|
+
value
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function err(error) {
|
|
11
|
+
return {
|
|
12
|
+
ok: false,
|
|
13
|
+
error
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function isOk(result) {
|
|
17
|
+
return result.ok === true;
|
|
18
|
+
}
|
|
19
|
+
function isErr(result) {
|
|
20
|
+
return result.ok === false;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { err, isErr, isOk, ok };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { registerArrangeFeature, resolveArrangeCommand } from "../../arrange/arrange.feature.module.mjs";
|
|
2
|
+
import { registerMirrorFeature, resolveMirrorCommand } from "../../mirror/mirror.feature.module.mjs";
|
|
3
|
+
import { registerTagFeature, resolveTagCommand } from "../../tag/tag.feature.module.mjs";
|
|
4
|
+
import { Container } from "@codefast/di";
|
|
5
|
+
//#region src/lib/core/infra/composition-root.ts
|
|
6
|
+
function createCliRuntimeContainer() {
|
|
7
|
+
const runtimeContainer = Container.create();
|
|
8
|
+
registerArrangeFeature(runtimeContainer);
|
|
9
|
+
registerMirrorFeature(runtimeContainer);
|
|
10
|
+
registerTagFeature(runtimeContainer);
|
|
11
|
+
return runtimeContainer;
|
|
12
|
+
}
|
|
13
|
+
function resolveCliCommands(runtimeContainer) {
|
|
14
|
+
return [
|
|
15
|
+
resolveArrangeCommand(runtimeContainer),
|
|
16
|
+
resolveMirrorCommand(runtimeContainer),
|
|
17
|
+
resolveTagCommand(runtimeContainer)
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { createCliRuntimeContainer, resolveCliCommands };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CliFsToken, CliLoggerToken } from "../operational/contracts/tokens.mjs";
|
|
2
|
+
import { ConfigLoaderPortToken } from "../../config/contracts/tokens.mjs";
|
|
3
|
+
import { configLoaderAdapter } from "../../config/infra/loader.adapter.mjs";
|
|
4
|
+
import { CoreModule } from "../core.module.mjs";
|
|
5
|
+
import { isCliTelemetryEnabled, withCliPortTelemetry } from "./logging-decorator.adapter.mjs";
|
|
6
|
+
import { NodeCliFsAdapter as _NodeCliFsAdapter, NodeCliLoggerAdapter as _NodeCliLoggerAdapter } from "../../infra/node-io.adapter.mjs";
|
|
7
|
+
import { Module } from "@codefast/di";
|
|
8
|
+
//#region src/lib/core/infra/infra.module.ts
|
|
9
|
+
const InfraModule = Module.create("cli-infra", (moduleBuilder) => {
|
|
10
|
+
moduleBuilder.import(CoreModule);
|
|
11
|
+
moduleBuilder.bind(CliLoggerToken).to(_NodeCliLoggerAdapter).singleton();
|
|
12
|
+
moduleBuilder.bind(CliFsToken).to(_NodeCliFsAdapter).onActivation((ctx, rawFs) => {
|
|
13
|
+
if (!isCliTelemetryEnabled()) return rawFs;
|
|
14
|
+
return withCliPortTelemetry({
|
|
15
|
+
portName: "CliFs",
|
|
16
|
+
implementation: rawFs,
|
|
17
|
+
logger: ctx.resolve(CliLoggerToken)
|
|
18
|
+
});
|
|
19
|
+
}).singleton();
|
|
20
|
+
moduleBuilder.bind(ConfigLoaderPortToken).toConstantValue(configLoaderAdapter);
|
|
21
|
+
});
|
|
22
|
+
//#endregion
|
|
23
|
+
export { InfraModule };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
//#region src/lib/core/infra/logging-decorator.adapter.ts
|
|
2
|
+
function summarizeTelemetryArg(value, maxLen = 160) {
|
|
3
|
+
if (typeof value === "string") return value.length > maxLen ? `${value.slice(0, maxLen)}…(${value.length} chars)` : value;
|
|
4
|
+
if (value === null || value === void 0) return String(value);
|
|
5
|
+
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
6
|
+
if (typeof value === "object") try {
|
|
7
|
+
const json = JSON.stringify(value);
|
|
8
|
+
if (typeof json === "string") return json.length > maxLen ? `${json.slice(0, maxLen)}…` : json;
|
|
9
|
+
} catch {
|
|
10
|
+
return "[object]";
|
|
11
|
+
}
|
|
12
|
+
return "[value]";
|
|
13
|
+
}
|
|
14
|
+
function isPromiseLike(value) {
|
|
15
|
+
return value !== null && typeof value === "object" && "then" in value && typeof value.then === "function";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Wraps a port implementation (object of functions) to log call timing and summarized arguments via `logger`.
|
|
19
|
+
* Does not modify application or domain code — wire only from the composition root.
|
|
20
|
+
*/ function withCliPortTelemetry(args) {
|
|
21
|
+
const { portName, implementation, logger } = args;
|
|
22
|
+
return new Proxy(implementation, { get(target, propertyKey, receiver) {
|
|
23
|
+
if (typeof propertyKey === "symbol") return Reflect.get(target, propertyKey, receiver);
|
|
24
|
+
const propertyName = String(propertyKey);
|
|
25
|
+
const value = Reflect.get(target, propertyKey, receiver);
|
|
26
|
+
if (typeof value !== "function") return value;
|
|
27
|
+
return (...callArgs) => {
|
|
28
|
+
const argSummary = callArgs.map((arg) => summarizeTelemetryArg(arg)).join(", ");
|
|
29
|
+
logger.out(`[telemetry:${portName}.${propertyName}] ← (${argSummary})`);
|
|
30
|
+
const startedAt = performance.now();
|
|
31
|
+
try {
|
|
32
|
+
const result = value.apply(target, callArgs);
|
|
33
|
+
if (isPromiseLike(result)) return result.then((resolved) => {
|
|
34
|
+
logger.out(`[telemetry:${portName}.${propertyName}] → ok ${(performance.now() - startedAt).toFixed(2)}ms`);
|
|
35
|
+
return resolved;
|
|
36
|
+
}, (rejection) => {
|
|
37
|
+
logger.out(`[telemetry:${portName}.${propertyName}] → err ${(performance.now() - startedAt).toFixed(2)}ms`);
|
|
38
|
+
throw rejection;
|
|
39
|
+
});
|
|
40
|
+
logger.out(`[telemetry:${portName}.${propertyName}] → ${(performance.now() - startedAt).toFixed(2)}ms`);
|
|
41
|
+
return result;
|
|
42
|
+
} catch (caughtSyncError) {
|
|
43
|
+
logger.out(`[telemetry:${portName}.${propertyName}] → err ${(performance.now() - startedAt).toFixed(2)}ms`);
|
|
44
|
+
throw caughtSyncError;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
} });
|
|
48
|
+
}
|
|
49
|
+
function isCliTelemetryEnabled() {
|
|
50
|
+
const raw = process.env.ENABLE_TELEMETRY;
|
|
51
|
+
return raw === "1" || raw === "true";
|
|
52
|
+
}
|
|
53
|
+
function withOptionalPortTelemetry(portName, implementation, logger) {
|
|
54
|
+
if (!isCliTelemetryEnabled()) return implementation;
|
|
55
|
+
return withCliPortTelemetry({
|
|
56
|
+
portName,
|
|
57
|
+
implementation,
|
|
58
|
+
logger
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { isCliTelemetryEnabled, withCliPortTelemetry, withOptionalPortTelemetry };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
//#region src/lib/core/infra/path.adapter.ts
|
|
3
|
+
const nodeCliPath = {
|
|
4
|
+
resolve: (...paths) => path.resolve(...paths),
|
|
5
|
+
join: (...paths) => path.join(...paths),
|
|
6
|
+
relative: (from, to) => path.relative(from, to),
|
|
7
|
+
dirname: (pathValue) => path.dirname(pathValue),
|
|
8
|
+
basename: (pathValue) => path.basename(pathValue),
|
|
9
|
+
extname: (pathValue) => path.extname(pathValue),
|
|
10
|
+
separator: path.sep
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { nodeCliPath };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { token } from "@codefast/di";
|
|
2
|
+
//#region src/lib/core/operational/contracts/tokens.ts
|
|
3
|
+
const CliFsToken = token("CliFs");
|
|
4
|
+
const CliLoggerToken = token("CliLogger");
|
|
5
|
+
const CliPathToken = token("CliPath");
|
|
6
|
+
//#endregion
|
|
7
|
+
export { CliFsToken, CliLoggerToken, CliPathToken };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import "../domain/cli-exit-codes.domain.mjs";
|
|
2
|
+
import { formatAppError } from "./format-app-error.presenter.mjs";
|
|
3
|
+
import { isVerboseInfraDiagnostics } from "../application/utils/verbose-diagnostics.util.mjs";
|
|
4
|
+
import process from "node:process";
|
|
5
|
+
//#region src/lib/core/presentation/cli-executor.presenter.ts
|
|
6
|
+
function assertExhaustiveAppErrorCode(code) {
|
|
7
|
+
return code;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Maps {@link AppError} codes to `process.exitCode` for CLI commands.
|
|
11
|
+
*/ function exitCodeForAppError(error) {
|
|
12
|
+
const { code } = error;
|
|
13
|
+
switch (code) {
|
|
14
|
+
case "NOT_FOUND": return 1;
|
|
15
|
+
case "VALIDATION_ERROR": return 2;
|
|
16
|
+
case "INFRA_FAILURE": return 1;
|
|
17
|
+
default: return assertExhaustiveAppErrorCode(code);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* When `outcome` is {@link Err}, logs via {@link formatAppError}, sets `process.exitCode`, returns `false`.
|
|
22
|
+
* When `Ok`, optionally logs `successMessage` to stdout and returns `true`.
|
|
23
|
+
*/ function consumeCliAppError(logger, outcome, options) {
|
|
24
|
+
if (!outcome.ok) {
|
|
25
|
+
logger.err(formatAppError(outcome.error));
|
|
26
|
+
if (isVerboseInfraDiagnostics() && outcome.error.code === "INFRA_FAILURE" && outcome.error.cause instanceof Error && outcome.error.cause.stack !== void 0) logger.err(outcome.error.cause.stack);
|
|
27
|
+
process.exitCode = exitCodeForAppError(outcome.error);
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (options?.successMessage !== void 0) logger.out(options.successMessage);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Awaits a use case and applies the same handling as {@link consumeCliAppError}.
|
|
35
|
+
*/ async function consumeCliAppErrorAsync(logger, outcomePromise, options) {
|
|
36
|
+
const outcome = await outcomePromise;
|
|
37
|
+
consumeCliAppError(logger, outcome, options);
|
|
38
|
+
return outcome;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Completes CLI handling: errors are logged and `process.exitCode` is set; success runs `onSuccess`
|
|
42
|
+
* and assigns `process.exitCode` from its return value (default `0`).
|
|
43
|
+
*/ function runCliResult(logger, outcome, onSuccess) {
|
|
44
|
+
if (!consumeCliAppError(logger, outcome)) return;
|
|
45
|
+
const exit = onSuccess(outcome.value);
|
|
46
|
+
process.exitCode = exit === void 0 ? 0 : exit;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Async variant of {@link runCliResult}.
|
|
50
|
+
*/ async function runCliResultAsync(logger, outcomePromise, onSuccess) {
|
|
51
|
+
const outcome = await outcomePromise;
|
|
52
|
+
if (!consumeCliAppError(logger, outcome)) return;
|
|
53
|
+
const exit = await onSuccess(outcome.value);
|
|
54
|
+
process.exitCode = exit === void 0 ? 0 : exit;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { consumeCliAppError, consumeCliAppErrorAsync, exitCodeForAppError, runCliResult, runCliResultAsync };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/lib/core/presentation/format-app-error.presenter.ts
|
|
2
|
+
function assertExhaustiveAppErrorCode(code) {
|
|
3
|
+
return `Unhandled error code: ${String(code)}`;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Stable, user-facing line for CLI output. Exhaustive over every `AppError["code"]`.
|
|
7
|
+
*/ function formatAppError(error) {
|
|
8
|
+
const { code, message } = error;
|
|
9
|
+
switch (code) {
|
|
10
|
+
case "NOT_FOUND": return `[NOT_FOUND] ${message}`;
|
|
11
|
+
case "VALIDATION_ERROR": return `[VALIDATION_ERROR] ${message}`;
|
|
12
|
+
case "INFRA_FAILURE": return `[INFRA_FAILURE] ${message}`;
|
|
13
|
+
default: return assertExhaustiveAppErrorCode(code);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { formatAppError };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { parseWithSchema } from "../application/schema-parse.util.mjs";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
//#region src/lib/core/presentation/global-cli-options.presenter.ts
|
|
4
|
+
const globalCliOptionsSchema = z.object({ color: z.boolean().optional() });
|
|
5
|
+
function parseGlobalCliOptions(raw) {
|
|
6
|
+
return parseWithSchema(globalCliOptionsSchema, raw);
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { globalCliOptionsSchema, parseGlobalCliOptions };
|