@codefast/cli 0.3.14-canary.2 → 0.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/README.md +8 -3
  2. package/dist/bootstrap/cli-application.module.mjs +18 -0
  3. package/dist/bootstrap/composition-root.mjs +14 -0
  4. package/dist/bootstrap/register-cli-command-trees.mjs +7 -0
  5. package/dist/{lib → domains}/arrange/application/use-cases/analyze-directory.use-case.mjs +12 -12
  6. package/dist/{lib → domains}/arrange/application/use-cases/prepare-arrange-workspace.use-case.mjs +19 -18
  7. package/dist/{lib → domains}/arrange/application/use-cases/run-arrange-sync.use-case.mjs +18 -18
  8. package/dist/{lib → domains}/arrange/application/use-cases/suggest-cn-groups.use-case.mjs +5 -5
  9. package/dist/domains/arrange/arrange.module.mjs +38 -0
  10. package/dist/domains/arrange/composition/tokens.mjs +17 -0
  11. package/dist/{lib/arrange/domain/arrange-analyze.service.mjs → domains/arrange/domain/arrange-analyze.domain-service.mjs} +1 -1
  12. package/dist/{lib/arrange/domain/arrange-grouping.service.mjs → domains/arrange/domain/arrange-grouping.domain-service.mjs} +2 -2
  13. package/dist/{lib → domains}/arrange/domain/ast/ast-helpers.helper.mjs +2 -2
  14. package/dist/{lib → domains}/arrange/domain/ast/ast-node.model.mjs +1 -1
  15. package/dist/{lib → domains}/arrange/domain/ast/collectors-cn.collector.mjs +1 -1
  16. package/dist/{lib → domains}/arrange/domain/ast/collectors-jsx.collector.mjs +1 -1
  17. package/dist/{lib → domains}/arrange/domain/ast/collectors-tv.collector.mjs +1 -1
  18. package/dist/{lib → domains}/arrange/domain/ast/targets.model.mjs +2 -2
  19. package/dist/{lib → domains}/arrange/domain/constants.domain.mjs +1 -1
  20. package/dist/{lib → domains}/arrange/domain/grouping.domain.mjs +1 -1
  21. package/dist/{lib → domains}/arrange/domain/imports.domain.mjs +1 -1
  22. package/dist/{lib → domains}/arrange/domain/source-text-formatters.formatter.mjs +2 -2
  23. package/dist/{lib/arrange/domain/tailwind-grouping.service.mjs → domains/arrange/domain/tailwind-grouping.domain-service.mjs} +5 -5
  24. package/dist/{lib → domains}/arrange/domain/tailwind-token-classifier.domain-service.mjs +1 -1
  25. package/dist/{lib → domains}/arrange/domain/tailwind-token.value-object.mjs +1 -1
  26. package/dist/{lib/arrange/application/services/arrange-file-processor.service.mjs → domains/arrange/infrastructure/adapters/arrange-file-processor.adapter.mjs} +8 -8
  27. package/dist/domains/arrange/infrastructure/adapters/arrange-target-path-resolver.adapter.mjs +247 -0
  28. package/dist/{lib/arrange/application/services/arrange-target-scanner.service.mjs → domains/arrange/infrastructure/adapters/arrange-target-scanner.adapter.mjs} +8 -8
  29. package/dist/{lib/arrange/adapters/secondary → domains/arrange/infrastructure/adapters}/domain-source-parser.adapter.mjs +10 -8
  30. package/dist/{lib/arrange/adapters/secondary → domains/arrange/infrastructure/adapters}/file-walker.adapter.mjs +8 -9
  31. package/dist/domains/arrange/infrastructure/typescript-ast-translator.mjs +580 -0
  32. package/dist/{lib/arrange/adapters/primary → domains/arrange/presentation}/cli/arrange.command.mjs +195 -54
  33. package/dist/{lib/arrange/presentation → domains/arrange/presentation/presenters}/arrange-analyze.presenter.mjs +26 -33
  34. package/dist/{lib/arrange/presentation → domains/arrange/presentation/presenters}/arrange-cli.schema.mjs +1 -1
  35. package/dist/{lib/tag/presentation/present-tag-sync-result.presenter.mjs → domains/arrange/presentation/presenters/arrange-sync.presenter.mjs} +12 -9
  36. package/dist/{lib/arrange/presentation → domains/arrange/presentation/presenters}/group-file-preview.presenter.mjs +46 -46
  37. package/dist/domains/config/composition/tokens.mjs +7 -0
  38. package/dist/{lib/config/infrastructure/config-schema.adapter.mjs → domains/config/domain/codefast-config.schema.mjs} +6 -6
  39. package/dist/{lib/config/infrastructure → domains/config/infrastructure/adapters}/config-loader.adapter.mjs +76 -77
  40. package/dist/{lib/config/infrastructure → domains/config/infrastructure/adapters}/config-warning-reporter.adapter.mjs +6 -6
  41. package/dist/domains/config/infrastructure/adapters/zod-codefast-config-schema.adapter.mjs +236 -0
  42. package/dist/domains/mirror/application/mirror-sync-cli-result.mjs +15 -0
  43. package/dist/{lib → domains}/mirror/application/use-cases/prepare-mirror-sync.use-case.mjs +14 -15
  44. package/dist/{lib → domains}/mirror/application/use-cases/run-mirror-sync.use-case.mjs +69 -54
  45. package/dist/{lib/mirror/contracts → domains/mirror/composition}/tokens.mjs +4 -3
  46. package/dist/{lib → domains}/mirror/domain/constants.domain.mjs +1 -1
  47. package/dist/{lib → domains}/mirror/domain/errors.domain.mjs +1 -1
  48. package/dist/{lib/mirror/application/services/generate-mirror-exports.service.mjs → domains/mirror/domain/generate-mirror-exports.domain-service.mjs} +2 -2
  49. package/dist/{lib → domains}/mirror/domain/package-display-name.policy.mjs +1 -1
  50. package/dist/{lib → domains}/mirror/domain/path-normalizer.value-object.mjs +1 -1
  51. package/dist/{lib/mirror/adapters/secondary → domains/mirror/infrastructure/adapters}/file-system-service.adapter.mjs +8 -8
  52. package/dist/domains/mirror/infrastructure/adapters/mirror-package-path-resolver.adapter.mjs +252 -0
  53. package/dist/{lib/mirror/adapters/secondary → domains/mirror/infrastructure/adapters}/mirror-sync-reporter.adapter.mjs +94 -15
  54. package/dist/{lib/mirror/adapters/secondary → domains/mirror/infrastructure/adapters}/package-repository.adapter.mjs +4 -4
  55. package/dist/{lib/mirror/adapters/secondary → domains/mirror/infrastructure/adapters}/sync-workspace-package.adapter.mjs +23 -46
  56. package/dist/{lib/mirror/infrastructure → domains/mirror/infrastructure/guards}/dirent-list.guard.mjs +1 -1
  57. package/dist/{lib → domains}/mirror/infrastructure/package-json-exports.repository.mjs +27 -27
  58. package/dist/domains/mirror/mirror.module.mjs +26 -0
  59. package/dist/{lib/mirror/adapters/primary → domains/mirror/presentation}/cli/mirror.command.mjs +83 -27
  60. package/dist/{lib/mirror/presentation → domains/mirror/presentation/presenters}/mirror-cli.schema.mjs +1 -4
  61. package/dist/domains/mirror/presentation/presenters/present-mirror-sync-progress.presenter.mjs +265 -0
  62. package/dist/domains/tag/application/ports/outbound/tag-eligible-workspace-paths.port.mjs +1 -0
  63. package/dist/domains/tag/application/ports/outbound/tag-since-writer.port.mjs +1 -0
  64. package/dist/domains/tag/application/ports/outbound/tag-target-path-resolver.port.mjs +1 -0
  65. package/dist/domains/tag/application/ports/outbound/tag-target-runner.port.mjs +1 -0
  66. package/dist/domains/tag/application/ports/outbound/tag-version-resolver.port.mjs +1 -0
  67. package/dist/domains/tag/application/ports/presenting/present-tag-sync-progress.presenter.mjs +1 -0
  68. package/dist/domains/tag/application/ports/presenting/present-tag-sync-result.presenter.mjs +1 -0
  69. package/dist/domains/tag/application/requests/tag-sync-execution-input.mjs +1 -0
  70. package/dist/domains/tag/application/requests/tag-sync.request.mjs +1 -0
  71. package/dist/{lib → domains}/tag/application/tag-sync-cli-result.mjs +3 -3
  72. package/dist/{lib → domains}/tag/application/use-cases/prepare-tag-sync.use-case.mjs +20 -24
  73. package/dist/{lib → domains}/tag/application/use-cases/run-tag-sync.use-case.mjs +123 -129
  74. package/dist/domains/tag/composition/tokens.mjs +13 -0
  75. package/dist/domains/tag/contracts/models.mjs +1 -0
  76. package/dist/domains/tag/domain/types.domain.mjs +1 -0
  77. package/dist/{lib/tag/adapters/secondary → domains/tag/infrastructure/adapters}/tag-since-writer.adapter.mjs +105 -105
  78. package/dist/{lib/tag/adapters/secondary/typescript-tree-walk.adapter.mjs → domains/tag/infrastructure/adapters/tag-target-path-resolver.adapter.mjs} +11 -9
  79. package/dist/domains/tag/infrastructure/adapters/tag-target-resolver.adapter.mjs +302 -0
  80. package/dist/domains/tag/infrastructure/adapters/tag-target-runner.adapter.mjs +259 -0
  81. package/dist/{lib/tag/adapters/secondary → domains/tag/infrastructure/adapters}/tag-version-resolver.adapter.mjs +6 -6
  82. package/dist/{lib/tag/adapters/primary → domains/tag/presentation}/cli/tag.command.mjs +67 -27
  83. package/dist/{lib/tag/presentation/tag-sync-progress-listener.presenter.mjs → domains/tag/presentation/presenters/present-tag-sync-progress.presenter.mjs} +14 -9
  84. package/dist/domains/tag/presentation/presenters/present-tag-sync-result.presenter.mjs +290 -0
  85. package/dist/{lib/tag/presentation → domains/tag/presentation/presenters}/tag-cli.schema.mjs +1 -1
  86. package/dist/domains/tag/tag.module.mjs +28 -0
  87. package/dist/program.mjs +3 -2
  88. package/dist/shell/application/cli-runtime.tokens.mjs +18 -0
  89. package/dist/shell/application/coordination/cli-executor.coordination.mjs +1 -0
  90. package/dist/shell/application/coordination/cli-schema-parsing.coordination.mjs +1 -0
  91. package/dist/shell/application/global-cli-options.model.mjs +5 -0
  92. package/dist/shell/application/ports/inbound/load-codefast-config.port.mjs +1 -0
  93. package/dist/shell/application/ports/outbound/cli-fs.port.mjs +1 -0
  94. package/dist/shell/application/ports/outbound/cli-logger.port.mjs +1 -0
  95. package/dist/shell/application/ports/outbound/cli-path.port.mjs +1 -0
  96. package/dist/shell/application/ports/outbound/cli-runtime.port.mjs +1 -0
  97. package/dist/shell/application/ports/outbound/cli-telemetry.port.mjs +1 -0
  98. package/dist/shell/application/ports/outbound/cli-verbose-diagnostics.port.mjs +1 -0
  99. package/dist/shell/application/ports/outbound/format-app-error.port.mjs +1 -0
  100. package/dist/shell/application/ports/outbound/global-cli-options-parse.port.mjs +1 -0
  101. package/dist/shell/application/ports/outbound/repo-root-resolver.port.mjs +1 -0
  102. package/dist/shell/application/ports/outbound/typescript-source-file-walker.port.mjs +1 -0
  103. package/dist/shell/application/ports/outbound/workspace-package-layout.port.mjs +1 -0
  104. package/dist/shell/application/ports/primary/command.port.mjs +1 -0
  105. package/dist/shell/application/services/cli-executor.service.mjs +267 -0
  106. package/dist/shell/application/services/schema-validator.service.mjs +236 -0
  107. package/dist/{lib/core/application → shell/application/use-cases}/load-codefast-config.use-case.mjs +11 -13
  108. package/dist/shell/composition/tokens.mjs +5 -0
  109. package/dist/shell/contracts/cli-command-slots.mjs +11 -0
  110. package/dist/{lib/core → shell}/domain/caught-unknown-message.value-object.mjs +1 -1
  111. package/dist/{lib/core → shell}/domain/cli-exit-codes.domain.mjs +1 -1
  112. package/dist/shell/domain/cli-positional-arg.value-object.mjs +6 -0
  113. package/dist/{lib/core → shell}/domain/errors.domain.mjs +1 -1
  114. package/dist/{lib/core → shell}/domain/result.model.mjs +1 -1
  115. package/dist/{lib/shared/source-code/domain/text-edit.model.mjs → shell/domain/source-text-edit.support.mjs} +2 -2
  116. package/dist/shell/infrastructure/adapters/cli-verbose-diagnostics.adapter.mjs +228 -0
  117. package/dist/{lib/tag/adapters/secondary/tag-target-resolver.adapter.mjs → shell/infrastructure/adapters/format-app-error.adapter.mjs} +16 -13
  118. package/dist/shell/infrastructure/adapters/global-cli-options-parser.adapter.mjs +233 -0
  119. package/dist/{lib/mirror/adapters/secondary/workspace-service.adapter.mjs → shell/infrastructure/adapters/repo-root-resolver.adapter.mjs} +20 -13
  120. package/dist/shell/infrastructure/adapters/typescript-source-file-walker.adapter.mjs +259 -0
  121. package/dist/shell/infrastructure/commander/commander-cli-host.adapter.mjs +69 -0
  122. package/dist/{lib/infrastructure/node-io.adapter.mjs → shell/infrastructure/node/node-cli-fs.adapter.mjs} +11 -47
  123. package/dist/{lib/arrange/adapters/secondary/workspace-resolver.adapter.mjs → shell/infrastructure/node/node-cli-logger.adapter.mjs} +11 -13
  124. package/dist/{lib/core/infrastructure/path.adapter.mjs → shell/infrastructure/node/node-cli-path.adapter.mjs} +1 -1
  125. package/dist/{lib/core/infrastructure/repo-root-resolver.adapter.mjs → shell/infrastructure/node/node-cli-runtime.adapter.mjs} +14 -13
  126. package/dist/shell/infrastructure/telemetry/cli-telemetry.adapter.mjs +280 -0
  127. package/dist/shell/infrastructure/workspace/node-pnpm-workspace-package-layout.adapter.mjs +385 -0
  128. package/dist/shell/shell.module.mjs +43 -0
  129. package/dist/shell/wiring/optional-cli-port-telemetry-activation.mjs +13 -0
  130. package/package.json +9 -7
  131. package/dist/lib/arrange/adapters/primary/cli/arrange.presentation.module.mjs +0 -14
  132. package/dist/lib/arrange/adapters/primary/cli/presentation.tokens.mjs +0 -5
  133. package/dist/lib/arrange/application/services/arrange-target-path-resolver.service.mjs +0 -21
  134. package/dist/lib/arrange/arrange.module.mjs +0 -31
  135. package/dist/lib/arrange/contracts/tokens.mjs +0 -15
  136. package/dist/lib/arrange/infrastructure/typescript-ast-translator.adapter.mjs +0 -355
  137. package/dist/lib/arrange/presentation/arrange-sync.presenter.mjs +0 -33
  138. package/dist/lib/bootstrap/composition-root.mjs +0 -33
  139. package/dist/lib/config/application/services/load-config.service.mjs +0 -17
  140. package/dist/lib/config/contracts/tokens.mjs +0 -6
  141. package/dist/lib/core/application/services/global-cli-options-parser.service.mjs +0 -9
  142. package/dist/lib/core/application/services/schema-validator.service.mjs +0 -17
  143. package/dist/lib/core/contracts/tokens.mjs +0 -10
  144. package/dist/lib/core/core.module.mjs +0 -9
  145. package/dist/lib/core/infrastructure/infrastructure.module.mjs +0 -30
  146. package/dist/lib/core/infrastructure/port-telemetry.decorator.mjs +0 -62
  147. package/dist/lib/core/infrastructure/verbose-diagnostics.policy.mjs +0 -9
  148. package/dist/lib/core/presentation/cli-executor.presenter.mjs +0 -42
  149. package/dist/lib/core/presentation/cli-schema.parser.mjs +0 -7
  150. package/dist/lib/core/presentation/format-app-error.presenter.mjs +0 -17
  151. package/dist/lib/core/presentation/presentation.module.mjs +0 -5
  152. package/dist/lib/infrastructure/workspace/repo-root-resolver.service.mjs +0 -21
  153. package/dist/lib/kernel/contracts/tokens.mjs +0 -5
  154. package/dist/lib/mirror/application/mirror-sync-json.format.mjs +0 -12
  155. package/dist/lib/mirror/application/services/mirror-package-arg-resolver.service.mjs +0 -20
  156. package/dist/lib/mirror/infrastructure/mirror-console-reporter.presenter.mjs +0 -99
  157. package/dist/lib/mirror/infrastructure/package-filter-resolver.service.mjs +0 -25
  158. package/dist/lib/mirror/infrastructure/workspace-packages.service.mjs +0 -158
  159. package/dist/lib/mirror/mirror.module.mjs +0 -25
  160. package/dist/lib/shared/source-code/infrastructure/typescript-source-file-walker.service.mjs +0 -33
  161. package/dist/lib/tag/adapters/primary/cli/presentation.tokens.mjs +0 -6
  162. package/dist/lib/tag/adapters/primary/cli/tag.presentation.module.mjs +0 -13
  163. package/dist/lib/tag/application/services/tag-cli-target-path-resolver.service.mjs +0 -9
  164. package/dist/lib/tag/application/services/tag-target-runner.service.mjs +0 -21
  165. package/dist/lib/tag/application/tag-sync-json.format.mjs +0 -14
  166. package/dist/lib/tag/contracts/tokens.mjs +0 -10
  167. package/dist/lib/tag/infrastructure/tag-target-candidates.adapter.mjs +0 -170
  168. package/dist/lib/tag/presentation/colors.presenter.mjs +0 -12
  169. package/dist/lib/tag/presentation/tag-sync.presenter.mjs +0 -61
  170. package/dist/lib/tag/tag.module.mjs +0 -23
  171. /package/dist/{lib/arrange/application/ports/domain-source-parser.port.mjs → domains/arrange/application/ports/inbound/analyze-directory.port.mjs} +0 -0
  172. /package/dist/{lib/arrange/application/ports/file-walker.port.mjs → domains/arrange/application/ports/inbound/prepare-arrange-workspace.port.mjs} +0 -0
  173. /package/dist/{lib/arrange/application/ports/group-file-preview.port.mjs → domains/arrange/application/ports/inbound/run-arrange-sync.port.mjs} +0 -0
  174. /package/dist/{lib/arrange/application/ports/workspace-resolver.port.mjs → domains/arrange/application/ports/inbound/suggest-cn-groups.port.mjs} +0 -0
  175. /package/dist/{lib/arrange/application/requests/analyze-directory.request.mjs → domains/arrange/application/ports/outbound/arrange-file-processor.port.mjs} +0 -0
  176. /package/dist/{lib/arrange/application/requests/arrange-sync.request.mjs → domains/arrange/application/ports/outbound/arrange-target-path-resolver.port.mjs} +0 -0
  177. /package/dist/{lib/arrange/application/requests/suggest-groups.request.mjs → domains/arrange/application/ports/outbound/arrange-target-scanner.port.mjs} +0 -0
  178. /package/dist/{lib/arrange/contracts/analyze-report-presenter.contract.mjs → domains/arrange/application/ports/outbound/domain-source-parser.port.mjs} +0 -0
  179. /package/dist/{lib/arrange/contracts/models.mjs → domains/arrange/application/ports/outbound/file-walker.port.mjs} +0 -0
  180. /package/dist/{lib/arrange/contracts/services.contract.mjs → domains/arrange/application/ports/presenting/present-analyze-report.presenter.mjs} +0 -0
  181. /package/dist/{lib/arrange/domain/types.domain.mjs → domains/arrange/application/ports/presenting/present-arrange-sync-result.presenter.mjs} +0 -0
  182. /package/dist/{lib/config/application/ports/config-loader.port.mjs → domains/arrange/application/ports/presenting/present-group-file-preview.presenter.mjs} +0 -0
  183. /package/dist/{lib/config/application/ports/config-warning-reporter.port.mjs → domains/arrange/application/requests/analyze-directory.request.mjs} +0 -0
  184. /package/dist/{lib/config/domain/schema.domain.mjs → domains/arrange/application/requests/arrange-sync.request.mjs} +0 -0
  185. /package/dist/{lib/core/application/ports/cli-io.port.mjs → domains/arrange/application/requests/suggest-groups.request.mjs} +0 -0
  186. /package/dist/{lib/mirror → domains/arrange}/contracts/models.mjs +0 -0
  187. /package/dist/{lib/mirror → domains/arrange}/domain/types.domain.mjs +0 -0
  188. /package/dist/{lib/core/application/ports/path.port.mjs → domains/config/application/ports/outbound/codefast-config-schema.port.mjs} +0 -0
  189. /package/dist/{lib/core/application/ports/repo-root-resolver.port.mjs → domains/config/application/ports/outbound/config-loader.port.mjs} +0 -0
  190. /package/dist/{lib/core/application/ports/runtime.port.mjs → domains/config/application/ports/outbound/config-warning-reporter.port.mjs} +0 -0
  191. /package/dist/{lib/kernel/contracts/cli-command.contract.mjs → domains/config/domain/schema.domain.mjs} +0 -0
  192. /package/dist/{lib/mirror/application/ports/file-system-service.port.mjs → domains/mirror/application/ports/inbound/prepare-mirror-sync.port.mjs} +0 -0
  193. /package/dist/{lib/mirror/application/ports/mirror-sync-reporter.port.mjs → domains/mirror/application/ports/inbound/run-mirror-sync.port.mjs} +0 -0
  194. /package/dist/{lib/mirror/application/ports/package-repository.port.mjs → domains/mirror/application/ports/outbound/file-system-service.port.mjs} +0 -0
  195. /package/dist/{lib/mirror/application/ports/sync-workspace-package.port.mjs → domains/mirror/application/ports/outbound/mirror-package-path.port.mjs} +0 -0
  196. /package/dist/{lib/mirror/application/ports/workspace-service.port.mjs → domains/mirror/application/ports/outbound/mirror-sync-reporter.port.mjs} +0 -0
  197. /package/dist/{lib/mirror/application/requests/mirror-sync.request.mjs → domains/mirror/application/ports/outbound/package-repository.port.mjs} +0 -0
  198. /package/dist/{lib/tag/application/ports/tag-since-writer.port.mjs → domains/mirror/application/ports/outbound/sync-workspace-package.port.mjs} +0 -0
  199. /package/dist/{lib/tag/application/ports/tag-version-resolver.port.mjs → domains/mirror/application/ports/presenting/present-mirror-sync-progress.presenter.mjs} +0 -0
  200. /package/dist/{lib/tag/application/ports/target-resolver.port.mjs → domains/mirror/application/requests/mirror-sync-execution-input.mjs} +0 -0
  201. /package/dist/{lib/tag/application/ports/typescript-tree-walk.port.mjs → domains/mirror/application/requests/mirror-sync.request.mjs} +0 -0
  202. /package/dist/{lib/tag → domains/mirror}/contracts/models.mjs +0 -0
  203. /package/dist/{lib/tag → domains/mirror}/domain/types.domain.mjs +0 -0
  204. /package/dist/{lib/tag/application/requests/tag-sync.request.mjs → domains/tag/application/ports/inbound/prepare-tag-sync.port.mjs} +0 -0
  205. /package/dist/{lib/tag/contracts/tag-sync-result-presenter.contract.mjs → domains/tag/application/ports/inbound/run-tag-sync.port.mjs} +0 -0
@@ -1,11 +1,10 @@
1
- import { CliFsToken, CliPathToken } from "../../../core/contracts/tokens.mjs";
2
- import { AppError } from "../../../core/domain/errors.domain.mjs";
3
- import { err, ok } from "../../../core/domain/result.model.mjs";
4
- import { messageFromCaughtUnknown } from "../../../core/domain/caught-unknown-message.value-object.mjs";
5
- import { TagSinceWriterPortToken, TagTargetResolverPortToken, TagVersionResolverPortToken, TypeScriptTreeWalkPortToken } from "../../contracts/tokens.mjs";
6
- import { runTagOnTarget } from "../services/tag-target-runner.service.mjs";
1
+ import { CliFilesystemPortToken, CliPathPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
2
+ import { AppError } from "../../../../shell/domain/errors.domain.mjs";
3
+ import { err, ok } from "../../../../shell/domain/result.model.mjs";
4
+ import { messageFromCaughtUnknown } from "../../../../shell/domain/caught-unknown-message.value-object.mjs";
5
+ import { TagEligibleWorkspacePathsPortToken, TagTargetRunnerPortToken } from "../../composition/tokens.mjs";
7
6
  import { inject, injectable } from "@codefast/di";
8
- //#region src/lib/tag/application/use-cases/run-tag-sync.use-case.ts
7
+ //#region src/domains/tag/application/use-cases/run-tag-sync.use-case.ts
9
8
  function toPrimitive(input, hint) {
10
9
  if (typeof input !== "object" || input === null) return input;
11
10
  var prim = input[Symbol.toPrimitive];
@@ -216,155 +215,51 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
216
215
  };
217
216
  }
218
217
  let _dec, _initClass;
219
- async function runTagOnAfterWriteHook(hook, modifiedFiles) {
220
- if (!hook || modifiedFiles.length === 0) return null;
221
- try {
222
- await hook({ files: modifiedFiles });
223
- return null;
224
- } catch (caughtHookError) {
225
- return `[tag] onAfterWrite hook failed: ${messageFromCaughtUnknown(caughtHookError)}`;
226
- }
227
- }
228
- function summarizeVersions(targetResults) {
229
- const distinctVersions = extractDistinctVersions(targetResults);
230
- if (distinctVersions.size === 0) return "none";
231
- if (distinctVersions.size > 1) return "mixed";
232
- for (const version of distinctVersions) return version;
233
- return "none";
234
- }
235
- function extractDistinctVersions(targetResults) {
236
- return new Set(targetResults.map((targetResult) => targetResult.result?.version).filter((version) => typeof version === "string" && version.length > 0));
237
- }
238
- function chooseWorkspacePackageTargetPath(candidate, pathService, fs) {
239
- if (candidate.source !== "workspace-package") return {
240
- targetPath: candidate.candidatePath,
241
- source: candidate.source
242
- };
243
- const preferredSourceDir = pathService.join(candidate.candidatePath, "src");
244
- if (fs.existsSync(preferredSourceDir) && fs.statSync(preferredSourceDir).isDirectory()) return {
245
- targetPath: preferredSourceDir,
246
- source: "workspace-package-selected-src"
247
- };
248
- return {
249
- targetPath: candidate.candidatePath,
250
- source: "workspace-package-selected-root"
251
- };
252
- }
253
- function resolveTargetSelection(candidate, rootDir, pathService, fs) {
254
- const selectedTarget = chooseWorkspacePackageTargetPath(candidate, pathService, fs);
255
- const rootRelativeTargetPath = pathService.relative(rootDir, selectedTarget.targetPath).split(pathService.separator).join("/");
256
- return {
257
- targetPath: selectedTarget.targetPath,
258
- rootRelativeTargetPath: rootRelativeTargetPath || ".",
259
- source: selectedTarget.source,
260
- packageDir: candidate.packageDir,
261
- packageName: candidate.packageName
262
- };
263
- }
264
- function filterSkippedCandidates(targetCandidates, skipPackages) {
265
- if (!skipPackages || skipPackages.length === 0) return {
266
- includedCandidates: targetCandidates,
267
- skippedPackages: []
268
- };
269
- const skipPackageSet = new Set(skipPackages);
270
- const includedCandidates = [];
271
- const skippedPackages = [];
272
- for (const candidate of targetCandidates) {
273
- const packageName = candidate.packageName;
274
- if (packageName && skipPackageSet.has(packageName)) {
275
- skippedPackages.push(packageName);
276
- continue;
277
- }
278
- includedCandidates.push(candidate);
279
- }
280
- return {
281
- includedCandidates,
282
- skippedPackages
283
- };
284
- }
285
- async function runOnResolvedTarget(resolvedTarget, write, fs, pathService, versionResolver, sinceWriter, typeScriptTreeWalk, listener) {
286
- listener?.onTargetStarted(resolvedTarget);
287
- const absoluteTargetPath = pathService.resolve(resolvedTarget.targetPath);
288
- if (!fs.existsSync(absoluteTargetPath)) {
289
- const missingTargetResult = {
290
- target: resolvedTarget,
291
- targetExists: false,
292
- runError: `Not found: ${absoluteTargetPath}`,
293
- result: null
294
- };
295
- listener?.onTargetCompleted(resolvedTarget, missingTargetResult);
296
- return missingTargetResult;
297
- }
298
- try {
299
- const targetRunResult = {
300
- target: resolvedTarget,
301
- targetExists: true,
302
- runError: null,
303
- result: runTagOnTarget(absoluteTargetPath, { write }, fs, pathService, versionResolver, sinceWriter, typeScriptTreeWalk)
304
- };
305
- listener?.onTargetCompleted(resolvedTarget, targetRunResult);
306
- return targetRunResult;
307
- } catch (caughtRunError) {
308
- const failedTargetRunResult = {
309
- target: resolvedTarget,
310
- targetExists: true,
311
- runError: messageFromCaughtUnknown(caughtRunError),
312
- result: null
313
- };
314
- listener?.onTargetCompleted(resolvedTarget, failedTargetRunResult);
315
- return failedTargetRunResult;
316
- }
317
- }
318
218
  _dec = injectable([
319
- inject(CliFsToken),
320
- inject(CliPathToken),
321
- inject(TagTargetResolverPortToken),
322
- inject(TypeScriptTreeWalkPortToken),
323
- inject(TagVersionResolverPortToken),
324
- inject(TagSinceWriterPortToken)
219
+ inject(CliFilesystemPortToken),
220
+ inject(CliPathPortToken),
221
+ inject(TagEligibleWorkspacePathsPortToken),
222
+ inject(TagTargetRunnerPortToken)
325
223
  ]);
326
- let _RunTagSyncUseCaseImpl;
224
+ let _RunTagSyncUseCase;
327
225
  (class {
328
226
  fs;
329
227
  path;
330
228
  targetResolver;
331
- typeScriptTreeWalk;
332
- versionResolver;
333
- sinceWriter;
229
+ tagTargetRunner;
334
230
  static {
335
- ({c: [_RunTagSyncUseCaseImpl, _initClass]} = _apply_decs_2311(this, [_dec], []));
231
+ ({c: [_RunTagSyncUseCase, _initClass]} = _apply_decs_2311(this, [_dec], []));
336
232
  }
337
- constructor(fs, path, targetResolver, typeScriptTreeWalk, versionResolver, sinceWriter) {
233
+ constructor(fs, path, targetResolver, tagTargetRunner) {
338
234
  this.fs = fs;
339
235
  this.path = path;
340
236
  this.targetResolver = targetResolver;
341
- this.typeScriptTreeWalk = typeScriptTreeWalk;
342
- this.versionResolver = versionResolver;
343
- this.sinceWriter = sinceWriter;
237
+ this.tagTargetRunner = tagTargetRunner;
344
238
  }
345
239
  async execute(input) {
346
240
  try {
347
241
  const tagConfig = input.config;
348
- const { includedCandidates, skippedPackages } = filterSkippedCandidates(await this.targetResolver.resolveTagTargetCandidates(input.rootDir, input.targetPath), input.skipPackages);
349
- const selectedTargets = includedCandidates.map((candidate) => resolveTargetSelection(candidate, input.rootDir, this.path, this.fs));
350
- const targetExecutionResults = await Promise.all(selectedTargets.map((resolvedTarget) => runOnResolvedTarget(resolvedTarget, input.write, this.fs, this.path, this.versionResolver, this.sinceWriter, this.typeScriptTreeWalk, input.listener)));
242
+ const targetCandidates = await this.targetResolver.resolveTagTargetCandidates(input.rootDir, input.targetPath);
243
+ const { includedCandidates, skippedPackages } = this.filterSkippedCandidates(targetCandidates, input.skipPackages);
244
+ const selectedTargets = includedCandidates.map((candidate) => this.resolveTargetSelection(candidate, input.rootDir));
245
+ const targetExecutionResults = await Promise.all(selectedTargets.map((resolvedTarget) => this.runOnResolvedTarget(resolvedTarget, input.write, input.listener)));
351
246
  const allFileResults = targetExecutionResults.flatMap((targetResult) => targetResult.result?.fileResults ?? []);
352
247
  const filesScanned = targetExecutionResults.reduce((sum, targetResult) => sum + (targetResult.result?.filesScanned ?? 0), 0);
353
248
  const filesChanged = targetExecutionResults.reduce((sum, targetResult) => sum + (targetResult.result?.filesChanged ?? 0), 0);
354
249
  const taggedDeclarations = targetExecutionResults.reduce((sum, targetResult) => sum + (targetResult.result?.taggedDeclarations ?? 0), 0);
355
250
  const modifiedFiles = allFileResults.filter((entry) => entry.changed).map((entry) => entry.filePath);
356
- const hookError = input.write && modifiedFiles.length > 0 ? await runTagOnAfterWriteHook(tagConfig?.onAfterWrite, modifiedFiles) : null;
357
- const distinctVersions = [...extractDistinctVersions(targetExecutionResults)].sort((left, right) => left.localeCompare(right));
251
+ const hookError = input.write && modifiedFiles.length > 0 ? await this.runTagOnAfterWriteHook(tagConfig?.onAfterWrite, modifiedFiles) : null;
252
+ const versionsSet = this.extractDistinctVersions(targetExecutionResults);
253
+ const distinctVersions = [...versionsSet].sort((left, right) => left.localeCompare(right));
358
254
  return ok({
359
255
  mode: input.write ? "applied" : "dry-run",
360
256
  selectedTargets,
361
- resolvedTargets: selectedTargets,
362
257
  skippedPackages,
363
258
  targetResults: targetExecutionResults,
364
259
  filesScanned,
365
260
  filesChanged,
366
261
  taggedDeclarations,
367
- versionSummary: summarizeVersions(targetExecutionResults),
262
+ versionSummary: this.summarizeVersions(versionsSet),
368
263
  distinctVersions,
369
264
  modifiedFiles,
370
265
  hookError
@@ -373,9 +268,108 @@ let _RunTagSyncUseCaseImpl;
373
268
  return err(new AppError("INFRA_FAILURE", messageFromCaughtUnknown(caughtError), caughtError));
374
269
  }
375
270
  }
271
+ async runTagOnAfterWriteHook(hook, modifiedFiles) {
272
+ if (!hook || modifiedFiles.length === 0) return null;
273
+ try {
274
+ await hook({ files: modifiedFiles });
275
+ return null;
276
+ } catch (caughtHookError) {
277
+ return `[tag] onAfterWrite hook failed: ${messageFromCaughtUnknown(caughtHookError)}`;
278
+ }
279
+ }
280
+ summarizeVersions(distinctVersions) {
281
+ if (distinctVersions.size === 0) return "none";
282
+ if (distinctVersions.size > 1) return "mixed";
283
+ return distinctVersions.values().next().value ?? "none";
284
+ }
285
+ extractDistinctVersions(targetResults) {
286
+ return new Set(targetResults.map((targetResult) => targetResult.result?.version).filter((version) => typeof version === "string" && version.length > 0));
287
+ }
288
+ chooseWorkspacePackageTargetPath(candidate) {
289
+ if (candidate.source !== "workspace-package") return {
290
+ targetPath: candidate.candidatePath,
291
+ source: candidate.source
292
+ };
293
+ const preferredSourceDir = this.path.join(candidate.candidatePath, "src");
294
+ try {
295
+ if (this.fs.statSync(preferredSourceDir).isDirectory()) return {
296
+ targetPath: preferredSourceDir,
297
+ source: "workspace-package-selected-src"
298
+ };
299
+ } catch {}
300
+ return {
301
+ targetPath: candidate.candidatePath,
302
+ source: "workspace-package-selected-root"
303
+ };
304
+ }
305
+ resolveTargetSelection(candidate, rootDir) {
306
+ const selectedTarget = this.chooseWorkspacePackageTargetPath(candidate);
307
+ const rootRelativeTargetPath = this.path.relative(rootDir, selectedTarget.targetPath).split(this.path.separator).join("/");
308
+ return {
309
+ targetPath: selectedTarget.targetPath,
310
+ rootRelativeTargetPath: rootRelativeTargetPath || ".",
311
+ source: selectedTarget.source,
312
+ packageDir: candidate.packageDir,
313
+ packageName: candidate.packageName
314
+ };
315
+ }
316
+ filterSkippedCandidates(targetCandidates, skipPackages) {
317
+ if (!skipPackages || skipPackages.length === 0) return {
318
+ includedCandidates: targetCandidates,
319
+ skippedPackages: []
320
+ };
321
+ const skipPackageSet = new Set(skipPackages);
322
+ const includedCandidates = [];
323
+ const skippedPackages = [];
324
+ for (const candidate of targetCandidates) {
325
+ const packageName = candidate.packageName;
326
+ if (packageName && skipPackageSet.has(packageName)) {
327
+ skippedPackages.push(packageName);
328
+ continue;
329
+ }
330
+ includedCandidates.push(candidate);
331
+ }
332
+ return {
333
+ includedCandidates,
334
+ skippedPackages
335
+ };
336
+ }
337
+ async runOnResolvedTarget(resolvedTarget, write, listener) {
338
+ listener?.onTargetStarted(resolvedTarget);
339
+ const absoluteTargetPath = this.path.resolve(resolvedTarget.targetPath);
340
+ if (!this.fs.existsSync(absoluteTargetPath)) {
341
+ const missingTargetResult = {
342
+ target: resolvedTarget,
343
+ targetExists: false,
344
+ runError: `Not found: ${absoluteTargetPath}`,
345
+ result: null
346
+ };
347
+ listener?.onTargetCompleted(resolvedTarget, missingTargetResult);
348
+ return missingTargetResult;
349
+ }
350
+ try {
351
+ const targetRunResult = {
352
+ target: resolvedTarget,
353
+ targetExists: true,
354
+ runError: null,
355
+ result: this.tagTargetRunner.runOnTarget(absoluteTargetPath, { write })
356
+ };
357
+ listener?.onTargetCompleted(resolvedTarget, targetRunResult);
358
+ return targetRunResult;
359
+ } catch (caughtRunError) {
360
+ const failedTargetRunResult = {
361
+ target: resolvedTarget,
362
+ targetExists: true,
363
+ runError: messageFromCaughtUnknown(caughtRunError),
364
+ result: null
365
+ };
366
+ listener?.onTargetCompleted(resolvedTarget, failedTargetRunResult);
367
+ return failedTargetRunResult;
368
+ }
369
+ }
376
370
  static {
377
371
  _initClass();
378
372
  }
379
373
  });
380
374
  //#endregion
381
- export { _RunTagSyncUseCaseImpl as RunTagSyncUseCaseImpl };
375
+ export { _RunTagSyncUseCase as RunTagSyncUseCase };
@@ -0,0 +1,13 @@
1
+ import { token } from "@codefast/di";
2
+ //#region src/domains/tag/composition/tokens.ts
3
+ const TagEligibleWorkspacePathsPortToken = token("TagEligibleWorkspacePathsPort");
4
+ const TagSinceWriterPortToken = token("TagSinceWriterPort");
5
+ const TagVersionResolverPortToken = token("TagVersionResolverPort");
6
+ const RunTagSyncUseCaseToken = token("RunTagSyncUseCase");
7
+ const PrepareTagSyncUseCaseToken = token("PrepareTagSyncUseCase");
8
+ const TagTargetRunnerPortToken = token("TagTargetRunnerPort");
9
+ const TagTargetPathResolverPortToken = token("TagTargetPathResolverPort");
10
+ const PresentTagSyncResultPresenterToken = token("PresentTagSyncResultPresenter");
11
+ const PresentTagSyncProgressPresenterToken = token("PresentTagSyncProgressPresenter");
12
+ //#endregion
13
+ export { PrepareTagSyncUseCaseToken, PresentTagSyncProgressPresenterToken, PresentTagSyncResultPresenterToken, RunTagSyncUseCaseToken, TagEligibleWorkspacePathsPortToken, TagSinceWriterPortToken, TagTargetPathResolverPortToken, TagTargetRunnerPortToken, TagVersionResolverPortToken };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,8 +1,8 @@
1
- import { CliFsToken } from "../../../core/contracts/tokens.mjs";
2
- import { applyEditsDescending, indentOfLineContaining } from "../../../shared/source-code/domain/text-edit.model.mjs";
1
+ import { CliFilesystemPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
2
+ import { applyEditsDescending, indentOfLineContaining } from "../../../../shell/domain/source-text-edit.support.mjs";
3
3
  import { inject, injectable } from "@codefast/di";
4
4
  import ts from "typescript";
5
- //#region src/lib/tag/adapters/secondary/tag-since-writer.adapter.ts
5
+ //#region src/domains/tag/infrastructure/adapters/tag-since-writer.adapter.ts
6
6
  function toPrimitive(input, hint) {
7
7
  if (typeof input !== "object" || input === null) return input;
8
8
  var prim = input[Symbol.toPrimitive];
@@ -213,106 +213,7 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
213
213
  };
214
214
  }
215
215
  let _dec, _initClass;
216
- const VERSION_TAG = "@since";
217
- function hasExportModifier(node) {
218
- return (ts.canHaveModifiers(node) ? ts.getModifiers(node) : void 0)?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) ?? false;
219
- }
220
- function isTaggableDeclaration(node) {
221
- return ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node) || ts.isVariableStatement(node);
222
- }
223
- function addDeclarationName(registry, name, declaration) {
224
- if (!registry.has(name)) {
225
- registry.set(name, new Set([declaration]));
226
- return;
227
- }
228
- const bucket = registry.get(name);
229
- if (bucket === void 0) throw new Error(`declaration registry missing set for ${name}`);
230
- bucket.add(declaration);
231
- }
232
- function collectLocalNamedDeclarations(sf) {
233
- const declarations = /* @__PURE__ */ new Map();
234
- for (const statement of sf.statements) {
235
- if (ts.isFunctionDeclaration(statement) && statement.name) {
236
- addDeclarationName(declarations, statement.name.text, statement);
237
- continue;
238
- }
239
- if (ts.isClassDeclaration(statement) && statement.name) {
240
- addDeclarationName(declarations, statement.name.text, statement);
241
- continue;
242
- }
243
- if (ts.isInterfaceDeclaration(statement)) {
244
- addDeclarationName(declarations, statement.name.text, statement);
245
- continue;
246
- }
247
- if (ts.isTypeAliasDeclaration(statement)) {
248
- addDeclarationName(declarations, statement.name.text, statement);
249
- continue;
250
- }
251
- if (ts.isEnumDeclaration(statement)) {
252
- addDeclarationName(declarations, statement.name.text, statement);
253
- continue;
254
- }
255
- if (!ts.isVariableStatement(statement)) continue;
256
- for (const declaration of statement.declarationList.declarations) if (ts.isIdentifier(declaration.name)) addDeclarationName(declarations, declaration.name.text, statement);
257
- }
258
- return declarations;
259
- }
260
- function collectExportedDeclarations(sf) {
261
- const exported = /* @__PURE__ */ new Set();
262
- const localNamed = collectLocalNamedDeclarations(sf);
263
- for (const statement of sf.statements) {
264
- if (isTaggableDeclaration(statement) && hasExportModifier(statement)) {
265
- exported.add(statement);
266
- continue;
267
- }
268
- if (ts.isExportDeclaration(statement) && !statement.moduleSpecifier && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
269
- for (const element of statement.exportClause.elements) {
270
- const localName = element.propertyName?.text ?? element.name.text;
271
- const declarations = localNamed.get(localName);
272
- if (!declarations) continue;
273
- for (const declaration of declarations) exported.add(declaration);
274
- }
275
- continue;
276
- }
277
- if (!ts.isExportAssignment(statement) || !ts.isIdentifier(statement.expression)) continue;
278
- const declarations = localNamed.get(statement.expression.text);
279
- if (!declarations) continue;
280
- for (const declaration of declarations) exported.add(declaration);
281
- }
282
- return exported;
283
- }
284
- function makeJSDocSinceLine(existingComment, sourceText, version) {
285
- const commentText = sourceText.slice(existingComment.pos, existingComment.end);
286
- const baseIndent = indentOfLineContaining(sourceText, existingComment.pos);
287
- const normalizedBodyLines = commentText.replace(/^\/\*\*\s?/, "").replace(/\s*\*\/$/, "").split("\n").map((line) => line.replace(/^\s*\*\s?/, "").replace(/\s+$/, "")).filter((line, lineIndex, lines) => {
288
- if (line.length > 0) return true;
289
- const hasNonEmptyBefore = lines.slice(0, lineIndex).some((value) => value.length > 0);
290
- const hasNonEmptyAfter = lines.slice(lineIndex + 1).some((value) => value.length > 0);
291
- return hasNonEmptyBefore && hasNonEmptyAfter;
292
- });
293
- const replacement = `/**\n${normalizedBodyLines.length > 0 ? `${normalizedBodyLines.map((line) => `${baseIndent} * ${line}`).join("\n")}\n${baseIndent} *\n` : ""}${baseIndent} * ${VERSION_TAG} ${version}\n${baseIndent} */`;
294
- return {
295
- start: existingComment.pos,
296
- end: existingComment.end,
297
- replacement
298
- };
299
- }
300
- function makeSinceOnlyJSDocBlock(declarationIndent, version) {
301
- return `/**\n${declarationIndent} * ${VERSION_TAG} ${version}\n${declarationIndent} */`;
302
- }
303
- function makeDeclarationSinceLine(declaration, sf, sourceText, version) {
304
- if (ts.getJSDocTags(declaration).some((tag) => tag.tagName.text === "since")) return;
305
- const lastJsDoc = ts.getJSDocCommentsAndTags(declaration).filter(ts.isJSDoc).at(-1);
306
- if (lastJsDoc) return makeJSDocSinceLine(lastJsDoc, sourceText, version);
307
- const start = declaration.getStart(sf);
308
- const indent = indentOfLineContaining(sourceText, start);
309
- return {
310
- start,
311
- end: start,
312
- replacement: `${indent}${makeSinceOnlyJSDocBlock(indent, version)}\n${indent}`
313
- };
314
- }
315
- _dec = injectable([inject(CliFsToken)]);
216
+ _dec = injectable([inject(CliFilesystemPortToken)]);
316
217
  let _TagSinceWriterAdapter;
317
218
  (class {
318
219
  fs;
@@ -322,12 +223,13 @@ let _TagSinceWriterAdapter;
322
223
  constructor(fs) {
323
224
  this.fs = fs;
324
225
  }
226
+ sinceDocumentationTag = "@since";
325
227
  applySinceTagsToFile(filePath, version, write) {
326
228
  const sourceText = this.fs.readFileSync(filePath, "utf8");
327
229
  const sf = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, filePath.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
328
230
  const edits = [];
329
- for (const declaration of collectExportedDeclarations(sf)) {
330
- const edit = makeDeclarationSinceLine(declaration, sf, sourceText, version);
231
+ for (const declaration of this.collectExportedDeclarations(sf)) {
232
+ const edit = this.makeDeclarationSinceLine(declaration, sf, sourceText, version);
331
233
  if (edit) edits.push(edit);
332
234
  }
333
235
  if (edits.length > 0 && write) {
@@ -340,6 +242,104 @@ let _TagSinceWriterAdapter;
340
242
  changed: edits.length > 0
341
243
  };
342
244
  }
245
+ hasExportModifier(node) {
246
+ return (ts.canHaveModifiers(node) ? ts.getModifiers(node) : void 0)?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) ?? false;
247
+ }
248
+ isTaggableDeclaration(node) {
249
+ return ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node) || ts.isVariableStatement(node);
250
+ }
251
+ addDeclarationName(registry, name, declaration) {
252
+ if (!registry.has(name)) {
253
+ registry.set(name, new Set([declaration]));
254
+ return;
255
+ }
256
+ const bucket = registry.get(name);
257
+ if (bucket === void 0) throw new Error(`declaration registry missing set for ${name}`);
258
+ bucket.add(declaration);
259
+ }
260
+ collectLocalNamedDeclarations(sf) {
261
+ const declarations = /* @__PURE__ */ new Map();
262
+ for (const statement of sf.statements) {
263
+ if (ts.isFunctionDeclaration(statement) && statement.name) {
264
+ this.addDeclarationName(declarations, statement.name.text, statement);
265
+ continue;
266
+ }
267
+ if (ts.isClassDeclaration(statement) && statement.name) {
268
+ this.addDeclarationName(declarations, statement.name.text, statement);
269
+ continue;
270
+ }
271
+ if (ts.isInterfaceDeclaration(statement)) {
272
+ this.addDeclarationName(declarations, statement.name.text, statement);
273
+ continue;
274
+ }
275
+ if (ts.isTypeAliasDeclaration(statement)) {
276
+ this.addDeclarationName(declarations, statement.name.text, statement);
277
+ continue;
278
+ }
279
+ if (ts.isEnumDeclaration(statement)) {
280
+ this.addDeclarationName(declarations, statement.name.text, statement);
281
+ continue;
282
+ }
283
+ if (!ts.isVariableStatement(statement)) continue;
284
+ for (const declaration of statement.declarationList.declarations) if (ts.isIdentifier(declaration.name)) this.addDeclarationName(declarations, declaration.name.text, statement);
285
+ }
286
+ return declarations;
287
+ }
288
+ collectExportedDeclarations(sf) {
289
+ const exported = /* @__PURE__ */ new Set();
290
+ const localNamed = this.collectLocalNamedDeclarations(sf);
291
+ for (const statement of sf.statements) {
292
+ if (this.isTaggableDeclaration(statement) && this.hasExportModifier(statement)) {
293
+ exported.add(statement);
294
+ continue;
295
+ }
296
+ if (ts.isExportDeclaration(statement) && !statement.moduleSpecifier && statement.exportClause && ts.isNamedExports(statement.exportClause)) {
297
+ for (const element of statement.exportClause.elements) {
298
+ const localName = element.propertyName?.text ?? element.name.text;
299
+ const declarations = localNamed.get(localName);
300
+ if (!declarations) continue;
301
+ for (const declaration of declarations) exported.add(declaration);
302
+ }
303
+ continue;
304
+ }
305
+ if (!ts.isExportAssignment(statement) || !ts.isIdentifier(statement.expression)) continue;
306
+ const declarations = localNamed.get(statement.expression.text);
307
+ if (!declarations) continue;
308
+ for (const declaration of declarations) exported.add(declaration);
309
+ }
310
+ return exported;
311
+ }
312
+ makeJSDocSinceLine(existingComment, sourceText, version) {
313
+ const commentText = sourceText.slice(existingComment.pos, existingComment.end);
314
+ const baseIndent = indentOfLineContaining(sourceText, existingComment.pos);
315
+ const normalizedBodyLines = commentText.replace(/^\/\*\*\s?/, "").replace(/\s*\*\/$/, "").split("\n").map((line) => line.replace(/^\s*\*\s?/, "").replace(/\s+$/, "")).filter((line, lineIndex, lines) => {
316
+ if (line.length > 0) return true;
317
+ const hasNonEmptyBefore = lines.slice(0, lineIndex).some((value) => value.length > 0);
318
+ const hasNonEmptyAfter = lines.slice(lineIndex + 1).some((value) => value.length > 0);
319
+ return hasNonEmptyBefore && hasNonEmptyAfter;
320
+ });
321
+ const replacement = `/**\n${normalizedBodyLines.length > 0 ? `${normalizedBodyLines.map((line) => `${baseIndent} * ${line}`).join("\n")}\n${baseIndent} *\n` : ""}${baseIndent} * ${this.sinceDocumentationTag} ${version}\n${baseIndent} */`;
322
+ return {
323
+ start: existingComment.pos,
324
+ end: existingComment.end,
325
+ replacement
326
+ };
327
+ }
328
+ makeSinceOnlyJSDocBlock(declarationIndent, version) {
329
+ return `/**\n${declarationIndent} * ${this.sinceDocumentationTag} ${version}\n${declarationIndent} */`;
330
+ }
331
+ makeDeclarationSinceLine(declaration, sf, sourceText, version) {
332
+ if (ts.getJSDocTags(declaration).some((tag) => tag.tagName.text === "since")) return;
333
+ const lastJsDoc = ts.getJSDocCommentsAndTags(declaration).filter(ts.isJSDoc).at(-1);
334
+ if (lastJsDoc) return this.makeJSDocSinceLine(lastJsDoc, sourceText, version);
335
+ const start = declaration.getStart(sf);
336
+ const indent = indentOfLineContaining(sourceText, start);
337
+ return {
338
+ start,
339
+ end: start,
340
+ replacement: `${indent}${this.makeSinceOnlyJSDocBlock(indent, version)}\n${indent}`
341
+ };
342
+ }
343
343
  static {
344
344
  _initClass();
345
345
  }
@@ -1,7 +1,7 @@
1
- import { CliFsToken } from "../../../core/contracts/tokens.mjs";
2
- import { walkTsxFiles } from "../../../shared/source-code/infrastructure/typescript-source-file-walker.service.mjs";
1
+ import { CliFilesystemPortToken } from "../../../../shell/application/cli-runtime.tokens.mjs";
2
+ import path from "node:path";
3
3
  import { inject, injectable } from "@codefast/di";
4
- //#region src/lib/tag/adapters/secondary/typescript-tree-walk.adapter.ts
4
+ //#region src/domains/tag/infrastructure/adapters/tag-target-path-resolver.adapter.ts
5
5
  function toPrimitive(input, hint) {
6
6
  if (typeof input !== "object" || input === null) return input;
7
7
  var prim = input[Symbol.toPrimitive];
@@ -212,22 +212,24 @@ function _apply_decs_2311(targetClass, classDecs, memberDecs, classDecsHaveThis,
212
212
  };
213
213
  }
214
214
  let _dec, _initClass;
215
- _dec = injectable([inject(CliFsToken)]);
216
- let _TypeScriptTreeWalkAdapter;
215
+ _dec = injectable([inject(CliFilesystemPortToken)]);
216
+ let _TagTargetPathResolverAdapter;
217
217
  (class {
218
218
  fs;
219
219
  static {
220
- ({c: [_TypeScriptTreeWalkAdapter, _initClass]} = _apply_decs_2311(this, [_dec], []));
220
+ ({c: [_TagTargetPathResolverAdapter, _initClass]} = _apply_decs_2311(this, [_dec], []));
221
221
  }
222
222
  constructor(fs) {
223
223
  this.fs = fs;
224
224
  }
225
- walkTsxFiles(rootDirectoryPath) {
226
- return walkTsxFiles(rootDirectoryPath, this.fs);
225
+ resolveProvidedTargetPath(args) {
226
+ if (args.rawTarget === void 0) return;
227
+ const candidate = path.isAbsolute(args.rawTarget) ? path.resolve(args.rawTarget) : path.resolve(args.currentWorkingDirectory, args.rawTarget);
228
+ return this.fs.canonicalPathSync(candidate);
227
229
  }
228
230
  static {
229
231
  _initClass();
230
232
  }
231
233
  });
232
234
  //#endregion
233
- export { _TypeScriptTreeWalkAdapter as TypeScriptTreeWalkAdapter };
235
+ export { _TagTargetPathResolverAdapter as TagTargetPathResolverAdapter };