@aifabrix/builder 2.43.0 → 2.44.1

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 (371) hide show
  1. package/.cursor/rules/anchor-docs.mdc +15 -0
  2. package/.cursor/rules/cli-layout.mdc +75 -0
  3. package/.cursor/rules/project-rules.mdc +8 -0
  4. package/.npmrc.token +1 -0
  5. package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  6. package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  7. package/.nyc_output/processinfo/index.json +1 -0
  8. package/README.md +1 -1
  9. package/anchor-docs/README.md +10 -0
  10. package/anchor-docs/_TEMPLATE +24 -0
  11. package/bin/aifabrix.js +13 -4
  12. package/integration/hubspot-test/README.md +31 -0
  13. package/integration/hubspot-test/create-hubspot.js +5 -5
  14. package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
  15. package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
  16. package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
  17. package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
  18. package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
  19. package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
  20. package/integration/hubspot-test/test-dataplane-down.js +3 -3
  21. package/integration/hubspot-test/test.js +35 -43
  22. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
  23. package/integration/roundtrip-test-local/README.md +144 -0
  24. package/integration/roundtrip-test-local/application.yaml +13 -0
  25. package/integration/roundtrip-test-local/env.template +15 -0
  26. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
  27. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
  28. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
  29. package/integration/roundtrip-test-local2/README.md +144 -0
  30. package/integration/roundtrip-test-local2/application.yaml +13 -0
  31. package/integration/roundtrip-test-local2/env.template +15 -0
  32. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
  33. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
  34. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
  35. package/integration/test/wizard.yaml +8 -0
  36. package/jest.config.default.js +10 -0
  37. package/jest.config.integration.fixtures.js +22 -0
  38. package/jest.config.integration.js +21 -18
  39. package/jest.config.isolated.js +10 -0
  40. package/jest.projects.js +301 -0
  41. package/lib/api/certificates.api.js +62 -0
  42. package/lib/api/datasources-core.api.js +3 -3
  43. package/lib/api/dev-mtls-request.js +110 -0
  44. package/lib/api/dev-server-https.js +145 -0
  45. package/lib/api/dev.api.js +133 -144
  46. package/lib/api/index.js +11 -3
  47. package/lib/api/pipeline.api.js +67 -20
  48. package/lib/api/types/certificates.types.js +48 -0
  49. package/lib/api/types/dev.types.js +4 -3
  50. package/lib/api/types/pipeline.types.js +8 -5
  51. package/lib/api/types/validation-run.types.js +56 -0
  52. package/lib/api/validation-run.api.js +111 -0
  53. package/lib/api/validation-runner.js +109 -0
  54. package/lib/app/certification-show-enrich.js +129 -0
  55. package/lib/app/certification-verify-rows.js +60 -0
  56. package/lib/app/config.js +1 -1
  57. package/lib/app/deploy-status-display.js +2 -2
  58. package/lib/app/deploy.js +7 -6
  59. package/lib/app/display.js +2 -1
  60. package/lib/app/dockerfile.js +3 -2
  61. package/lib/app/down.js +2 -1
  62. package/lib/app/helpers.js +6 -5
  63. package/lib/app/index.js +27 -8
  64. package/lib/app/list.js +7 -6
  65. package/lib/app/push.js +4 -3
  66. package/lib/app/register.js +16 -7
  67. package/lib/app/rotate-secret.js +14 -13
  68. package/lib/app/run-container-start.js +184 -0
  69. package/lib/app/run-docker-fallback.js +108 -0
  70. package/lib/app/run-env-compose.js +30 -42
  71. package/lib/app/run-helpers.js +49 -126
  72. package/lib/app/run-infra-requirements.js +30 -0
  73. package/lib/app/run-resolve-image.js +21 -0
  74. package/lib/app/run.js +74 -21
  75. package/lib/app/show-display.js +44 -1
  76. package/lib/app/show.js +93 -9
  77. package/lib/build/index.js +13 -10
  78. package/lib/certification/cli-cert-sync-skip.js +21 -0
  79. package/lib/certification/merge-certification-from-artifact.js +185 -0
  80. package/lib/certification/post-unified-cert-sync.js +33 -0
  81. package/lib/certification/sync-after-external-command.js +52 -0
  82. package/lib/certification/sync-system-certification.js +197 -0
  83. package/lib/cli/index.js +2 -0
  84. package/lib/cli/setup-app.help.js +67 -0
  85. package/lib/cli/setup-app.js +61 -121
  86. package/lib/cli/setup-app.test-commands.js +195 -0
  87. package/lib/cli/setup-auth.js +19 -5
  88. package/lib/cli/setup-credential-deployment.js +22 -8
  89. package/lib/cli/setup-dev-path-commands.js +124 -0
  90. package/lib/cli/setup-dev.js +170 -113
  91. package/lib/cli/setup-environment.js +7 -1
  92. package/lib/cli/setup-external-system.js +84 -23
  93. package/lib/cli/setup-infra.js +126 -47
  94. package/lib/cli/setup-parameters.js +32 -0
  95. package/lib/cli/setup-secrets.js +137 -18
  96. package/lib/cli/setup-service-user.js +1 -1
  97. package/lib/cli/setup-utility.js +54 -22
  98. package/lib/commands/app-down.js +5 -7
  99. package/lib/commands/app-install.js +14 -7
  100. package/lib/commands/app-logs.js +13 -10
  101. package/lib/commands/app-shell.js +4 -1
  102. package/lib/commands/app-test.js +25 -19
  103. package/lib/commands/app.js +32 -11
  104. package/lib/commands/auth-config.js +6 -6
  105. package/lib/commands/auth-status.js +4 -3
  106. package/lib/commands/credential-env.js +4 -3
  107. package/lib/commands/credential-list.js +5 -4
  108. package/lib/commands/credential-push.js +4 -3
  109. package/lib/commands/datasource-unified-test-cli.js +428 -0
  110. package/lib/commands/datasource-unified-test-cli.options.js +191 -0
  111. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
  112. package/lib/commands/datasource-validation-cli.js +143 -0
  113. package/lib/commands/datasource.js +125 -95
  114. package/lib/commands/deployment-list.js +6 -5
  115. package/lib/commands/dev-cli-handlers.js +122 -18
  116. package/lib/commands/dev-down.js +4 -3
  117. package/lib/commands/dev-init.js +231 -116
  118. package/lib/commands/dev-show-display.js +473 -0
  119. package/lib/commands/login-credentials.js +3 -2
  120. package/lib/commands/login-device.js +4 -3
  121. package/lib/commands/login.js +5 -4
  122. package/lib/commands/logout.js +8 -7
  123. package/lib/commands/parameters-validate.js +54 -0
  124. package/lib/commands/repair-datasource.js +314 -68
  125. package/lib/commands/repair-env-template.js +2 -2
  126. package/lib/commands/repair.js +21 -3
  127. package/lib/commands/secrets-list.js +23 -12
  128. package/lib/commands/secrets-remove-all.js +220 -0
  129. package/lib/commands/secrets-remove.js +21 -12
  130. package/lib/commands/secrets-set.js +21 -12
  131. package/lib/commands/secrets-validate.js +4 -4
  132. package/lib/commands/secure.js +10 -9
  133. package/lib/commands/service-user.js +26 -25
  134. package/lib/commands/test-e2e-external.js +27 -1
  135. package/lib/commands/up-common.js +3 -2
  136. package/lib/commands/up-dataplane.js +29 -16
  137. package/lib/commands/up-miso.js +19 -29
  138. package/lib/commands/upload.js +149 -39
  139. package/lib/commands/wizard-core-helpers.js +1 -1
  140. package/lib/commands/wizard-dataplane.js +4 -3
  141. package/lib/commands/wizard-helpers.js +3 -3
  142. package/lib/commands/wizard.js +2 -2
  143. package/lib/core/admin-secrets.js +14 -5
  144. package/lib/core/audit-logger.js +12 -4
  145. package/lib/core/config-attach-extensions.js +46 -0
  146. package/lib/core/config-runtime-paths.js +29 -0
  147. package/lib/core/config.js +55 -56
  148. package/lib/core/diff.js +3 -2
  149. package/lib/core/ensure-encryption-key.js +1 -1
  150. package/lib/core/secrets-ensure-infra.js +77 -0
  151. package/lib/core/secrets-ensure.js +120 -64
  152. package/lib/core/secrets-env-write.js +35 -7
  153. package/lib/core/secrets-infra-placeholder-sync.js +61 -0
  154. package/lib/core/secrets.js +200 -37
  155. package/lib/core/templates-env.js +4 -3
  156. package/lib/datasource/abac-validator.js +1 -10
  157. package/lib/datasource/deploy.js +75 -53
  158. package/lib/datasource/field-reference-validator.js +9 -6
  159. package/lib/datasource/integration-context.js +63 -0
  160. package/lib/datasource/list.js +8 -7
  161. package/lib/datasource/log-viewer.js +189 -67
  162. package/lib/datasource/resolve-app.js +4 -4
  163. package/lib/datasource/test-e2e.js +113 -146
  164. package/lib/datasource/test-integration.js +114 -122
  165. package/lib/datasource/unified-validation-run-body.js +68 -0
  166. package/lib/datasource/unified-validation-run-post.js +23 -0
  167. package/lib/datasource/unified-validation-run-resolve.js +43 -0
  168. package/lib/datasource/unified-validation-run.js +93 -0
  169. package/lib/datasource/validate.js +157 -13
  170. package/lib/deployment/deployer.js +4 -3
  171. package/lib/deployment/environment.js +7 -6
  172. package/lib/deployment/push.js +17 -8
  173. package/lib/external-system/delete.js +4 -3
  174. package/lib/external-system/deploy.js +166 -53
  175. package/lib/external-system/download-helpers.js +1 -1
  176. package/lib/external-system/download.js +7 -6
  177. package/lib/external-system/generator.js +92 -6
  178. package/lib/external-system/integration-test-dispatch.js +26 -0
  179. package/lib/external-system/test-execution.js +5 -1
  180. package/lib/external-system/test-helpers.js +0 -4
  181. package/lib/external-system/test-system-level-helpers.js +110 -0
  182. package/lib/external-system/test-system-level.js +83 -44
  183. package/lib/external-system/test.js +59 -8
  184. package/lib/generator/builders.js +23 -11
  185. package/lib/generator/deploy-manifest-azure-kv.js +81 -0
  186. package/lib/generator/external.js +16 -4
  187. package/lib/generator/helpers.js +58 -3
  188. package/lib/generator/index.js +4 -0
  189. package/lib/generator/split-readme.js +12 -7
  190. package/lib/generator/split-variables.js +2 -1
  191. package/lib/generator/split.js +1 -1
  192. package/lib/generator/wizard-readme.js +3 -3
  193. package/lib/generator/wizard.js +8 -8
  194. package/lib/infrastructure/compose.js +70 -7
  195. package/lib/infrastructure/helpers-docker-check.js +67 -0
  196. package/lib/infrastructure/helpers.js +203 -42
  197. package/lib/infrastructure/index.js +31 -18
  198. package/lib/infrastructure/services.js +21 -67
  199. package/lib/internal/fs-real-sync.js +104 -0
  200. package/lib/internal/node-fs.js +98 -0
  201. package/lib/parameters/database-secret-values.js +173 -0
  202. package/lib/parameters/infra-kv-discovery.js +121 -0
  203. package/lib/parameters/infra-parameter-catalog.js +458 -0
  204. package/lib/parameters/infra-parameter-validate.js +64 -0
  205. package/lib/schema/application-schema.json +37 -17
  206. package/lib/schema/datasource-test-run.schema.json +493 -0
  207. package/lib/schema/deployment-rules.yaml +102 -63
  208. package/lib/schema/external-datasource.schema.json +1200 -442
  209. package/lib/schema/external-system.schema.json +203 -5
  210. package/lib/schema/flag-map-validation-run.json +31 -0
  211. package/lib/schema/infra-parameter.schema.json +106 -0
  212. package/lib/schema/infra.parameter.yaml +421 -0
  213. package/lib/schema/type/credential-auth-templates.json +40 -0
  214. package/lib/schema/type/document-storage.json +226 -0
  215. package/lib/schema/type/message-service.json +123 -0
  216. package/lib/schema/type/vector-store.json +88 -0
  217. package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
  218. package/lib/utils/api-error-handler.js +2 -2
  219. package/lib/utils/api.js +77 -17
  220. package/lib/utils/app-register-api.js +3 -2
  221. package/lib/utils/app-register-auth.js +1 -1
  222. package/lib/utils/app-register-config.js +4 -4
  223. package/lib/utils/app-register-display.js +3 -2
  224. package/lib/utils/app-register-validator.js +3 -2
  225. package/lib/utils/app-run-containers.js +26 -22
  226. package/lib/utils/app-scoped-config.js +31 -0
  227. package/lib/utils/app-service-env-from-builder.js +164 -0
  228. package/lib/utils/build-copy.js +1 -1
  229. package/lib/utils/build-helpers.js +20 -20
  230. package/lib/utils/build-resolve-image.js +165 -0
  231. package/lib/utils/cli-layout-chalk.js +8 -0
  232. package/lib/utils/cli-test-layout-chalk.js +267 -0
  233. package/lib/utils/cli-utils.js +88 -11
  234. package/lib/utils/compose-db-passwords.js +138 -0
  235. package/lib/utils/compose-generate-docker-compose.js +216 -0
  236. package/lib/utils/compose-generator.js +197 -291
  237. package/lib/utils/compose-miso-env.js +18 -0
  238. package/lib/utils/compose-traefik-ingress-base.js +158 -0
  239. package/lib/utils/config-paths.js +166 -7
  240. package/lib/utils/config-scoped-resources-preference.js +41 -0
  241. package/lib/utils/configuration-env-resolver.js +11 -8
  242. package/lib/utils/controller-deployment-outcome.js +68 -0
  243. package/lib/utils/credential-display.js +2 -2
  244. package/lib/utils/credential-secrets-env.js +5 -5
  245. package/lib/utils/dataplane-pipeline-warning.js +4 -3
  246. package/lib/utils/datasource-test-run-capability-scope.js +43 -0
  247. package/lib/utils/datasource-test-run-certificate-tty.js +82 -0
  248. package/lib/utils/datasource-test-run-debug-display.js +137 -0
  249. package/lib/utils/datasource-test-run-debug-slice.js +93 -0
  250. package/lib/utils/datasource-test-run-display.js +459 -0
  251. package/lib/utils/datasource-test-run-exit.js +83 -0
  252. package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
  253. package/lib/utils/datasource-test-run-report-version.js +51 -0
  254. package/lib/utils/datasource-test-run-schema-sync.js +59 -0
  255. package/lib/utils/datasource-test-run-tty-log.js +81 -0
  256. package/lib/utils/datasource-validation-watch.js +266 -0
  257. package/lib/utils/declarative-url-ports.js +47 -0
  258. package/lib/utils/derive-env-key-from-client-id.js +41 -0
  259. package/lib/utils/dev-ca-install.js +185 -23
  260. package/lib/utils/dev-cert-helper.js +266 -17
  261. package/lib/utils/dev-hosts-helper.js +307 -0
  262. package/lib/utils/dev-init-cert-hints.js +37 -0
  263. package/lib/utils/dev-init-health-messages.js +52 -0
  264. package/lib/utils/dev-init-resolve.js +86 -0
  265. package/lib/utils/dev-init-ssh-merge.js +65 -0
  266. package/lib/utils/dev-ssh-config-helper.js +196 -0
  267. package/lib/utils/dev-user-groups.js +93 -0
  268. package/lib/utils/docker-build.js +42 -17
  269. package/lib/utils/docker-exec.js +28 -0
  270. package/lib/utils/docker-manifest-public-port.js +116 -0
  271. package/lib/utils/docker-not-running-hint.js +52 -0
  272. package/lib/utils/docker.js +98 -11
  273. package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
  274. package/lib/utils/env-config-loader.js +10 -91
  275. package/lib/utils/env-copy.js +19 -10
  276. package/lib/utils/env-map.js +35 -8
  277. package/lib/utils/env-template.js +2 -2
  278. package/lib/utils/environment-scoped-resources.js +144 -0
  279. package/lib/utils/error-formatter.js +92 -13
  280. package/lib/utils/error-formatters/http-status-errors.js +6 -5
  281. package/lib/utils/error-formatters/network-errors.js +2 -1
  282. package/lib/utils/error-formatters/permission-errors.js +2 -1
  283. package/lib/utils/error-formatters/validation-errors.js +2 -1
  284. package/lib/utils/external-readme.js +8 -1
  285. package/lib/utils/external-system-display.js +242 -136
  286. package/lib/utils/external-system-local-test-tty.js +389 -0
  287. package/lib/utils/external-system-readiness-core.js +377 -0
  288. package/lib/utils/external-system-readiness-deploy-display.js +270 -0
  289. package/lib/utils/external-system-readiness-display-internals.js +150 -0
  290. package/lib/utils/external-system-readiness-display.js +186 -0
  291. package/lib/utils/external-system-system-test-tty-overview.js +120 -0
  292. package/lib/utils/external-system-system-test-tty.js +417 -0
  293. package/lib/utils/external-system-test-helpers.js +24 -6
  294. package/lib/utils/external-system-validators.js +30 -12
  295. package/lib/utils/health-check-url.js +119 -0
  296. package/lib/utils/health-check.js +59 -25
  297. package/lib/utils/help-builder.js +11 -8
  298. package/lib/utils/image-version.js +4 -8
  299. package/lib/utils/infra-containers.js +4 -7
  300. package/lib/utils/infra-env-defaults.js +162 -0
  301. package/lib/utils/infra-status-display.js +167 -0
  302. package/lib/utils/infra-status.js +16 -8
  303. package/lib/utils/local-secrets.js +3 -4
  304. package/lib/utils/paths.js +148 -47
  305. package/lib/utils/port-resolver.js +10 -23
  306. package/lib/utils/redis-env-scope.js +62 -0
  307. package/lib/utils/register-aifabrix-shell-env.js +204 -0
  308. package/lib/utils/remote-builder-validation.js +99 -0
  309. package/lib/utils/remote-dev-auth.js +117 -21
  310. package/lib/utils/remote-docker-env.js +67 -15
  311. package/lib/utils/remote-secrets-loader.js +13 -4
  312. package/lib/utils/resolve-docker-image-ref.js +124 -0
  313. package/lib/utils/schema-loader.js +22 -9
  314. package/lib/utils/secrets-bash-kv.js +25 -0
  315. package/lib/utils/secrets-generator.js +169 -49
  316. package/lib/utils/secrets-helpers.js +70 -59
  317. package/lib/utils/secrets-kv-scope.js +60 -0
  318. package/lib/utils/secrets-utils.js +32 -38
  319. package/lib/utils/secrets-validation.js +3 -1
  320. package/lib/utils/secrets-yaml-preserve.js +109 -0
  321. package/lib/utils/ssh-key-helper.js +4 -2
  322. package/lib/utils/template-helpers.js +2 -2
  323. package/lib/utils/test-log-writer.js +3 -3
  324. package/lib/utils/token-manager.js +1 -2
  325. package/lib/utils/url-declarative-public-base.js +188 -0
  326. package/lib/utils/url-declarative-resolve-build.js +493 -0
  327. package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
  328. package/lib/utils/url-declarative-resolve.js +220 -0
  329. package/lib/utils/url-declarative-token-parse.js +74 -0
  330. package/lib/utils/url-declarative-url-flags.js +50 -0
  331. package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
  332. package/lib/utils/url-public-path-prefix.js +34 -0
  333. package/lib/utils/urls-local-registry.js +220 -0
  334. package/lib/utils/validation-report-tty-kit.js +77 -0
  335. package/lib/utils/validation-run-poll.js +112 -0
  336. package/lib/utils/validation-run-post-retry.js +85 -0
  337. package/lib/utils/validation-run-request.js +116 -0
  338. package/lib/utils/variable-transformer.js +21 -4
  339. package/lib/utils/yaml-preserve.js +33 -14
  340. package/lib/validation/datasource-warnings.js +56 -0
  341. package/lib/validation/env-template-auth.js +1 -1
  342. package/lib/validation/external-manifest-validator.js +27 -7
  343. package/lib/validation/validate-display.js +37 -31
  344. package/lib/validation/validate-external-cert-sync.js +23 -0
  345. package/lib/validation/validate.js +8 -14
  346. package/lib/validation/validator-unresolved-placeholders.js +98 -0
  347. package/lib/validation/validator.js +22 -65
  348. package/lib/validation/wizard-config-validator.js +2 -1
  349. package/package.json +9 -4
  350. package/scripts/check-datasource-test-run-schema-sync.js +34 -0
  351. package/scripts/diagnose-cli.js +150 -0
  352. package/scripts/install-local.js +307 -55
  353. package/scripts/pnpm-global-remove.js +48 -0
  354. package/templates/README.md +15 -2
  355. package/templates/applications/dataplane/application.yaml +52 -2
  356. package/templates/applications/dataplane/env.template +79 -17
  357. package/templates/applications/dataplane/rbac.yaml +8 -0
  358. package/templates/applications/keycloak/application.yaml +9 -1
  359. package/templates/applications/keycloak/env.template +15 -6
  360. package/templates/applications/miso-controller/application.yaml +10 -2
  361. package/templates/applications/miso-controller/env.template +42 -12
  362. package/templates/applications/miso-controller/rbac.yaml +5 -0
  363. package/templates/external-system/README.md.hbs +20 -7
  364. package/templates/external-system/deploy.js.hbs +5 -5
  365. package/templates/external-system/external-datasource.yaml.hbs +197 -118
  366. package/templates/infra/compose.yaml.hbs +33 -16
  367. package/templates/infra/servers.json.hbs +3 -1
  368. package/templates/python/docker-compose.hbs +16 -0
  369. package/templates/typescript/docker-compose.hbs +16 -0
  370. package/lib/api/external-test.api.js +0 -111
  371. package/lib/schema/env-config.yaml +0 -60
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Load application.yaml for url:// resolution (current app via variablesPath, else builder-relative).
3
+ * @fileoverview
4
+ */
5
+ 'use strict';
6
+
7
+ const path = require('path');
8
+ const yaml = require('js-yaml');
9
+ const fsRealSync = require('../internal/fs-real-sync');
10
+
11
+ /**
12
+ * @param {string} appKey
13
+ * @param {Object} ctx
14
+ * @param {object} pathsUtil - paths module (getProjectRoot)
15
+ * @returns {object|null}
16
+ */
17
+ function loadApplicationYamlDocForUrlResolve(appKey, ctx, pathsUtil) {
18
+ try {
19
+ const current = ctx.currentAppKey || '';
20
+ if (appKey === current && ctx.variablesPath) {
21
+ const vp = path.resolve(String(ctx.variablesPath));
22
+ try {
23
+ const raw = fsRealSync.readFileSync(vp, 'utf8');
24
+ const doc = yaml.load(raw);
25
+ if (doc && typeof doc === 'object') {
26
+ return doc;
27
+ }
28
+ } catch {
29
+ // Fall through to builder-relative resolution
30
+ }
31
+ }
32
+ const root = pathsUtil.getProjectRoot();
33
+ if (!root) {
34
+ return null;
35
+ }
36
+ const cfgPath = path.resolve(path.join(root, 'builder', appKey, 'application.yaml'));
37
+ try {
38
+ const raw = fsRealSync.readFileSync(cfgPath, 'utf8');
39
+ const doc = yaml.load(raw);
40
+ return doc && typeof doc === 'object' ? doc : null;
41
+ } catch {
42
+ return null;
43
+ }
44
+ } catch {
45
+ return null;
46
+ }
47
+ }
48
+
49
+ module.exports = {
50
+ loadApplicationYamlDocForUrlResolve
51
+ };
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Expand url:// placeholders after kv:// (plan 122): full URL, host-only (origin), and vdir (path) variants.
3
+ *
4
+ * @fileoverview Dual profile docker|local; devNN host only via Traefik + frontDoorRouting.host (plan 122)
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fsRealSync = require('../internal/fs-real-sync');
12
+ const path = require('path');
13
+ const yaml = require('js-yaml');
14
+ const { deriveEnvKeyFromClientId } = require('./derive-env-key-from-client-id');
15
+ const { parseDeveloperIdNum } = require('./declarative-url-ports');
16
+ const { computeDeclarativePathPrefix } = require('./url-declarative-url-flags');
17
+ const { refreshUrlsLocalRegistryFromBuilder, normalizePatternForUrl } = require('./urls-local-registry');
18
+ const pathsUtil = require('./paths');
19
+ const { parseUrlToken } = require('./url-declarative-token-parse');
20
+ const {
21
+ applyTstRemoteDeveloperHost,
22
+ applyTstRemoteDeveloperHostToOrigin,
23
+ buildPublicUrlString,
24
+ buildPublicHostOriginString,
25
+ buildInternalUrlString,
26
+ buildInternalHostOriginString,
27
+ expandResolvedUrlToken,
28
+ resolveListenPortPatternForToken
29
+ } = require('./url-declarative-resolve-build');
30
+
31
+ const URL_REF = /url:\/\/([^\s#'"]+)/g;
32
+
33
+ /**
34
+ * Expand each `url://token` in a value (comma-separated lists, e.g. CORS ALLOWED_ORIGINS).
35
+ * Tokens match {@link parseUrlToken} id characters (alphanumeric, dot, underscore, hyphen).
36
+ *
37
+ * @param {string} value - RHS of KEY=value
38
+ * @param {function(string): string} replaceToken - receives token without `url://`
39
+ * @returns {string}
40
+ */
41
+ function expandDeclarativeUrlListValue(value, replaceToken) {
42
+ if (!value || typeof value !== 'string' || !value.includes('url://')) {
43
+ return value;
44
+ }
45
+ return value
46
+ .split(',')
47
+ .map((raw) => {
48
+ const seg = raw.trim();
49
+ const exact = /^url:\/\/([a-zA-Z0-9._-]+)$/.exec(seg);
50
+ if (exact) {
51
+ return replaceToken(exact[1]);
52
+ }
53
+ if (seg.includes('url://')) {
54
+ return seg.replace(/url:\/\/([a-zA-Z0-9._-]+)/g, (_full, tok) => replaceToken(tok));
55
+ }
56
+ return seg;
57
+ })
58
+ .join(',');
59
+ }
60
+
61
+ /**
62
+ * @param {string} content - .env-like content
63
+ * @returns {Object.<string, string>}
64
+ */
65
+ function parseSimpleEnvMap(content) {
66
+ const map = {};
67
+ if (!content || typeof content !== 'string') {
68
+ return map;
69
+ }
70
+ for (const line of content.split('\n')) {
71
+ const t = line.trim();
72
+ if (!t || t.startsWith('#')) {
73
+ continue;
74
+ }
75
+ const eq = t.indexOf('=');
76
+ if (eq > 0) {
77
+ const k = t.slice(0, eq).trim();
78
+ map[k] = t.slice(eq + 1);
79
+ }
80
+ }
81
+ return map;
82
+ }
83
+
84
+ /**
85
+ * Load application.yaml for cross-app scoped flag.
86
+ * @param {string} targetAppKey
87
+ * @returns {boolean}
88
+ */
89
+ function readTargetAppScopedFlag(targetAppKey) {
90
+ try {
91
+ const appPath = pathsUtil.getBuilderPath(targetAppKey);
92
+ const cfgPath = path.join(appPath, 'application.yaml');
93
+ if (!fsRealSync.existsSync(cfgPath)) {
94
+ return false;
95
+ }
96
+ const doc = yaml.load(fsRealSync.readFileSync(cfgPath, 'utf8'));
97
+ return doc && doc.environmentScopedResources === true;
98
+ } catch {
99
+ return false;
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Resolve one url:// token to a concrete URL string.
105
+ * @param {string} token
106
+ * @param {Object} ctx - Same shape as expandDeclarativeUrlsInEnvContent ctx
107
+ * @param {'docker'|'local'} profile
108
+ * @param {number} devNum
109
+ * @param {string} derivedEnvKey
110
+ * @param {Object} registry
111
+ * @returns {string}
112
+ */
113
+ function replaceUrlRefToken(token, ctx, profile, devNum, derivedEnvKey, registry) {
114
+ const parsed = parseUrlToken(token);
115
+ const resolved = resolveListenPortPatternForToken(token, ctx, registry);
116
+ if (!resolved) {
117
+ return `url://${token}`;
118
+ }
119
+ const {
120
+ appKey,
121
+ listenPort,
122
+ publicPortBasis,
123
+ patternStr,
124
+ hostTemplate,
125
+ tls,
126
+ frontDoorIngressActive
127
+ } = resolved;
128
+ const patternPath = normalizePatternForUrl(patternStr);
129
+ const appScoped = parsed.targetKey
130
+ ? readTargetAppScopedFlag(parsed.targetKey)
131
+ : Boolean(ctx.appEnvironmentScopedResources);
132
+ const pathPrefix = computeDeclarativePathPrefix(
133
+ Boolean(ctx.traefik),
134
+ ctx.useEnvironmentScopedResources,
135
+ appScoped,
136
+ derivedEnvKey
137
+ );
138
+ return expandResolvedUrlToken(parsed, {
139
+ profile,
140
+ listenPort,
141
+ publicPortBasis,
142
+ appKey,
143
+ currentAppKey: ctx.currentAppKey || '',
144
+ patternPath,
145
+ pathPrefix,
146
+ remoteServer: ctx.remoteServer,
147
+ devNum,
148
+ derivedEnvKey,
149
+ traefik: Boolean(ctx.traefik),
150
+ hostTemplate,
151
+ tls,
152
+ frontDoorIngressActive,
153
+ developerIdRaw: ctx.developerIdRaw,
154
+ infraTlsEnabled: Boolean(ctx.infraTlsEnabled)
155
+ });
156
+ }
157
+
158
+ /**
159
+ * Expand url:// references in env content (after kv://).
160
+ *
161
+ * @async
162
+ * @param {string} content
163
+ * @param {Object} ctx
164
+ * @param {'docker'|'local'} ctx.profile
165
+ * @param {string} ctx.currentAppKey
166
+ * @param {string|null} ctx.variablesPath
167
+ * @param {boolean} ctx.useEnvironmentScopedResources
168
+ * @param {boolean} ctx.appEnvironmentScopedResources
169
+ * @param {string|null|undefined} ctx.remoteServer
170
+ * @param {string|number|null|undefined} ctx.developerIdRaw
171
+ * @param {boolean} [ctx.traefik] - Infra Traefik proxy on. Plan 117 `/dev`/`/tst` applies only when this is true. Traefik **host** authority (`frontDoorRouting.host`) applies only when this is true **and** the target app has `frontDoorRouting.enabled: true` (plan 124 `pathActive`).
172
+ * @param {boolean} [ctx.infraTlsEnabled] - When true (`tlsEnabled` in config / `up-infra --tls`), Traefik front-door `url://public` uses https even if application.yaml has `frontDoorRouting.tls: false`
173
+ * @returns {Promise<string>}
174
+ */
175
+ async function expandDeclarativeUrlsInEnvContent(content, ctx) {
176
+ if (!content || !content.includes('url://')) {
177
+ return content;
178
+ }
179
+ const profile = ctx.profile === 'docker' ? 'docker' : 'local';
180
+ const devNum = parseDeveloperIdNum(ctx.developerIdRaw);
181
+ const envMap = parseSimpleEnvMap(content);
182
+ const clientId = envMap.MISO_CLIENTID;
183
+ const pipelineOverride = envMap.MISO_PIPELINE_ENV_KEY;
184
+ const derivedEnvKey = deriveEnvKeyFromClientId(clientId, pipelineOverride);
185
+ const registry = refreshUrlsLocalRegistryFromBuilder(pathsUtil.getProjectRoot());
186
+
187
+ const lines = content.split('\n');
188
+ const outLines = lines.map((line) => {
189
+ const t = line.trim();
190
+ if (!t || t.startsWith('#') || !line.includes('url://')) {
191
+ return line;
192
+ }
193
+ const eq = line.indexOf('=');
194
+ if (eq <= 0) {
195
+ return line.replace(URL_REF, (_m, token) =>
196
+ replaceUrlRefToken(token, ctx, profile, devNum, derivedEnvKey, registry)
197
+ );
198
+ }
199
+ const keyPart = line.slice(0, eq);
200
+ const valuePart = line.slice(eq + 1);
201
+ const expandedValue = expandDeclarativeUrlListValue(valuePart, (token) =>
202
+ replaceUrlRefToken(token, ctx, profile, devNum, derivedEnvKey, registry)
203
+ );
204
+ return `${keyPart}=${expandedValue}`;
205
+ });
206
+ return outLines.join('\n');
207
+ }
208
+
209
+ module.exports = {
210
+ expandDeclarativeUrlsInEnvContent,
211
+ expandDeclarativeUrlListValue,
212
+ parseSimpleEnvMap,
213
+ applyTstRemoteDeveloperHost,
214
+ applyTstRemoteDeveloperHostToOrigin,
215
+ buildPublicUrlString,
216
+ buildPublicHostOriginString,
217
+ buildInternalUrlString,
218
+ buildInternalHostOriginString,
219
+ parseUrlToken
220
+ };
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Declarative url:// token shape parsing (plan 122/124).
3
+ * Single module for suffix lists and parseUrlToken — avoids drift with tests.
4
+ *
5
+ * @fileoverview parseUrlToken only; no URL expansion
6
+ * @author AI Fabrix Team
7
+ * @version 1.0.0
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ /**
13
+ * Current-app tokens (no appKey prefix).
14
+ * @type {readonly { id: string, kind: 'public'|'internal', surface: 'full'|'host'|'vdir' }[]}
15
+ */
16
+ const DECLARATIVE_URL_EXACT_TOKENS = Object.freeze([
17
+ { id: 'host-public', kind: 'public', surface: 'host' },
18
+ { id: 'host-internal', kind: 'internal', surface: 'host' },
19
+ { id: 'host-private', kind: 'internal', surface: 'host' },
20
+ { id: 'vdir-public', kind: 'public', surface: 'vdir' },
21
+ { id: 'vdir-internal', kind: 'internal', surface: 'vdir' },
22
+ { id: 'vdir-private', kind: 'internal', surface: 'vdir' },
23
+ { id: 'public', kind: 'public', surface: 'full' },
24
+ { id: 'internal', kind: 'internal', surface: 'full' },
25
+ { id: 'private', kind: 'internal', surface: 'full' }
26
+ ]);
27
+
28
+ /**
29
+ * Cross-app suffixes (longest match first). App key is token prefix before suffix.
30
+ * @type {readonly { suffix: string, kind: 'public'|'internal', surface: 'full'|'host'|'vdir' }[]}
31
+ */
32
+ const DECLARATIVE_URL_CROSS_APP_SUFFIXES = Object.freeze([
33
+ { suffix: '-host-public', kind: 'public', surface: 'host' },
34
+ { suffix: '-host-internal', kind: 'internal', surface: 'host' },
35
+ { suffix: '-host-private', kind: 'internal', surface: 'host' },
36
+ { suffix: '-vdir-public', kind: 'public', surface: 'vdir' },
37
+ { suffix: '-vdir-internal', kind: 'internal', surface: 'vdir' },
38
+ { suffix: '-vdir-private', kind: 'internal', surface: 'vdir' }
39
+ ]);
40
+
41
+ const URL_TOKEN_EXACT = new Map(DECLARATIVE_URL_EXACT_TOKENS.map((d) => [d.id, { kind: d.kind, surface: d.surface }]));
42
+
43
+ /**
44
+ * @param {string} token
45
+ * @returns {{ targetKey: string, kind: 'public'|'internal', surface: 'full'|'host'|'vdir' }}
46
+ */
47
+ function parseUrlToken(token) {
48
+ const t = String(token || '').trim();
49
+ const exact = URL_TOKEN_EXACT.get(t);
50
+ if (exact) {
51
+ return { targetKey: '', kind: exact.kind, surface: exact.surface };
52
+ }
53
+ for (const { suffix, kind, surface } of DECLARATIVE_URL_CROSS_APP_SUFFIXES) {
54
+ if (t.endsWith(suffix)) {
55
+ return { targetKey: t.slice(0, -suffix.length), kind, surface };
56
+ }
57
+ }
58
+ if (t.endsWith('-public')) {
59
+ return { targetKey: t.slice(0, -'-public'.length), kind: 'public', surface: 'full' };
60
+ }
61
+ if (t.endsWith('-internal')) {
62
+ return { targetKey: t.slice(0, -'-internal'.length), kind: 'internal', surface: 'full' };
63
+ }
64
+ if (t.endsWith('-private')) {
65
+ return { targetKey: t.slice(0, -'-private'.length), kind: 'internal', surface: 'full' };
66
+ }
67
+ return { targetKey: '', kind: 'public', surface: 'full' };
68
+ }
69
+
70
+ module.exports = {
71
+ DECLARATIVE_URL_EXACT_TOKENS,
72
+ DECLARATIVE_URL_CROSS_APP_SUFFIXES,
73
+ parseUrlToken
74
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Centralized declarative url:// flags (plan 124 truth table).
3
+ *
4
+ * @fileoverview pathActive, pathPrefix gating — single source for resolver + tests
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { computePublicUrlPathPrefix } = require('./url-public-path-prefix');
12
+
13
+ /**
14
+ * pathActive = traefik on AND application.yaml frontDoorRouting.enabled === true
15
+ * @param {boolean} traefik
16
+ * @param {boolean} [frontDoorRoutingEnabled]
17
+ * @returns {boolean}
18
+ */
19
+ function computePathActive(traefik, frontDoorRoutingEnabled) {
20
+ return Boolean(traefik) && frontDoorRoutingEnabled === true;
21
+ }
22
+
23
+ /**
24
+ * Plan 117 /dev|/tst prefix only when Traefik proxy is on; otherwise '' (plan 124).
25
+ * @param {boolean} traefik
26
+ * @param {boolean} useEnvironmentScopedResources
27
+ * @param {boolean} appEnvironmentScopedResources
28
+ * @param {string} derivedEnvKey
29
+ * @returns {string}
30
+ */
31
+ function computeDeclarativePathPrefix(
32
+ traefik,
33
+ useEnvironmentScopedResources,
34
+ appEnvironmentScopedResources,
35
+ derivedEnvKey
36
+ ) {
37
+ if (!traefik) {
38
+ return '';
39
+ }
40
+ return computePublicUrlPathPrefix(
41
+ useEnvironmentScopedResources,
42
+ appEnvironmentScopedResources,
43
+ derivedEnvKey
44
+ );
45
+ }
46
+
47
+ module.exports = {
48
+ computePathActive,
49
+ computeDeclarativePathPrefix
50
+ };
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Rewrite env lines that hold the declarative token url://vdir-public when the front-door
3
+ * path is inactive. Expansion would yield an empty path; consumers need a non-empty value,
4
+ * so the line is set to "/" only in that case.
5
+ *
6
+ * @fileoverview No schema or manifest keys — fixed "/" when path inactive (same token as url-declarative-resolve-build).
7
+ * Reads application.yaml via {@link module:lib/internal/fs-real-sync} so Jest fs mocks do not hide real files.
8
+ * @author AI Fabrix Team
9
+ * @version 1.0.0
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ const yaml = require('js-yaml');
15
+ const { existsSync, readFileSync } = require('../internal/fs-real-sync');
16
+ const { DECLARATIVE_URL_INFRA_DEFAULTS } = require('./infra-env-defaults');
17
+ const { computePathActive } = require('./url-declarative-url-flags');
18
+
19
+ /**
20
+ * Treat common YAML / string forms as enabled (strict `=== true` alone missed some parsers).
21
+ * @param {object|null|undefined} doc
22
+ * @returns {boolean}
23
+ */
24
+ function isFrontDoorRoutingEnabledInDoc(doc) {
25
+ const v = doc && doc.frontDoorRouting && doc.frontDoorRouting.enabled;
26
+ return v === true || v === 'true' || v === 'yes' || v === 'on';
27
+ }
28
+
29
+ /**
30
+ * Parse application.yaml from disk (real fs — not Jest-mocked require('fs')).
31
+ * @param {string} variablesPath
32
+ * @returns {object|null}
33
+ */
34
+ function loadApplicationYamlDoc(variablesPath) {
35
+ if (!variablesPath || !existsSync(variablesPath)) {
36
+ return null;
37
+ }
38
+ try {
39
+ return yaml.load(readFileSync(variablesPath, 'utf8')) || null;
40
+ } catch {
41
+ return null;
42
+ }
43
+ }
44
+
45
+ /** Declarative URL token (matches {@link module:lib/utils/url-declarative-resolve-build} vdir-public). */
46
+ const URL_DECLARATIVE_VDIR_PUBLIC_TOKEN = 'url://vdir-public';
47
+
48
+ /** Value used when front-door path is inactive (would otherwise expand empty). */
49
+ const INACTIVE_VDIR_PUBLIC_ENV_FALLBACK =
50
+ DECLARATIVE_URL_INFRA_DEFAULTS.inactiveVdirPublicEnvReplacement;
51
+
52
+ /**
53
+ * @param {string} content - .env template fragment
54
+ * @param {string} replacement
55
+ * @returns {string}
56
+ */
57
+ function applyInactiveVdirPublicTokenRewrite(content, replacement) {
58
+ if (!content || !content.includes(URL_DECLARATIVE_VDIR_PUBLIC_TOKEN)) {
59
+ return content;
60
+ }
61
+ const escaped = URL_DECLARATIVE_VDIR_PUBLIC_TOKEN.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
62
+ // End line with [ \t]* only — \s would consume \n and strip line endings from the file.
63
+ const lineRe = new RegExp(`^(\\s*[A-Z][A-Z0-9_]*)\\s*=\\s*${escaped}[ \t]*$`, 'gm');
64
+ return content.replace(lineRe, (_, lhs) => `${lhs}=${replacement}`);
65
+ }
66
+
67
+ /**
68
+ * Load application.yaml, compute pathActive, rewrite matching lines to "/" when inactive.
69
+ * @param {string} content
70
+ * @param {string|null|undefined} variablesPath
71
+ * @param {{ traefik?: boolean }} userCfg
72
+ * @returns {string}
73
+ */
74
+ function rewriteInactiveDeclarativeVdirPublicContent(content, variablesPath, userCfg) {
75
+ if (!content || !variablesPath || !content.includes(URL_DECLARATIVE_VDIR_PUBLIC_TOKEN)) {
76
+ return content;
77
+ }
78
+ let doc = null;
79
+ try {
80
+ doc = loadApplicationYamlDoc(variablesPath);
81
+ } catch {
82
+ doc = null;
83
+ }
84
+ const pathActive = computePathActive(
85
+ Boolean(userCfg && userCfg.traefik),
86
+ isFrontDoorRoutingEnabledInDoc(doc)
87
+ );
88
+ if (pathActive) {
89
+ return content;
90
+ }
91
+ return applyInactiveVdirPublicTokenRewrite(content, INACTIVE_VDIR_PUBLIC_ENV_FALLBACK);
92
+ }
93
+
94
+ module.exports = {
95
+ URL_DECLARATIVE_VDIR_PUBLIC_TOKEN,
96
+ INACTIVE_VDIR_PUBLIC_ENV_FALLBACK,
97
+ applyInactiveVdirPublicTokenRewrite,
98
+ rewriteInactiveDeclarativeVdirPublicContent
99
+ };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Plan 117 URL path prefix for url://public (dev/tst only when gated).
3
+ *
4
+ * @fileoverview baseEffective ∧ derived envKey ∈ {dev,tst}. Caller must pass prefix only when `traefik` is on (see url-declarative-resolve).
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ /**
12
+ * @param {boolean} useEnvironmentScopedResources - config gate
13
+ * @param {boolean} appEnvironmentScopedResources - application.yaml
14
+ * @param {string} derivedEnvKey - from client id (dev|tst|pro|miso)
15
+ * @returns {string} '' | '/dev' | '/tst'
16
+ */
17
+ function computePublicUrlPathPrefix(useEnvironmentScopedResources, appEnvironmentScopedResources, derivedEnvKey) {
18
+ const baseEffective = Boolean(useEnvironmentScopedResources) && Boolean(appEnvironmentScopedResources);
19
+ if (!baseEffective) {
20
+ return '';
21
+ }
22
+ const k = String(derivedEnvKey || '').toLowerCase();
23
+ if (k === 'dev') {
24
+ return '/dev';
25
+ }
26
+ if (k === 'tst') {
27
+ return '/tst';
28
+ }
29
+ return '';
30
+ }
31
+
32
+ module.exports = {
33
+ computePublicUrlPathPrefix
34
+ };