@aifabrix/builder 2.42.1 → 2.44.0

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 (392) hide show
  1. package/.cursor/rules/anchor-docs.mdc +15 -0
  2. package/README.md +2 -2
  3. package/anchor-docs/README.md +10 -0
  4. package/anchor-docs/_TEMPLATE +24 -0
  5. package/bin/aifabrix.js +13 -4
  6. package/integration/hubspot-test/README.md +157 -0
  7. package/integration/{hubspot → hubspot-test}/application.json +6 -6
  8. package/integration/{hubspot → hubspot-test}/create-hubspot.js +10 -10
  9. package/integration/hubspot-test/env.template +4 -0
  10. package/integration/hubspot-test/hubspot-test-datasource-company.json +138 -0
  11. package/integration/hubspot-test/hubspot-test-datasource-contact.json +146 -0
  12. package/integration/hubspot-test/hubspot-test-datasource-deal.json +146 -0
  13. package/integration/hubspot-test/hubspot-test-datasource-users.json +76 -0
  14. package/integration/{hubspot/hubspot-deploy.json → hubspot-test/hubspot-test-deploy.json} +201 -24
  15. package/integration/{hubspot/hubspot-system.json → hubspot-test/hubspot-test-system.json} +8 -7
  16. package/integration/hubspot-test/rbac.json +166 -0
  17. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-hubspot-credential-real.yaml +3 -3
  18. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-hubspot-env-vars.yaml +2 -2
  19. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-add-datasource.yaml +1 -1
  20. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-credential-create.yaml +1 -1
  21. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-credential-select.yaml +1 -1
  22. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-known-platform.yaml +1 -1
  23. package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-source.yaml +2 -0
  24. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-mode.yaml +1 -1
  25. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-openapi-file.yaml +1 -1
  26. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-openapi-url.yaml +1 -1
  27. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-source.yaml +1 -1
  28. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-dimension-array-test.yaml +1 -1
  29. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-key-test.yaml +5 -0
  30. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-path-test.yaml +5 -0
  31. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-dimension-test.yaml +1 -1
  32. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-rbac-test.yaml +1 -1
  33. package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-rbac-yaml-test.yaml +1 -1
  34. package/integration/{hubspot → hubspot-test}/test-dataplane-down-tests.js +1 -7
  35. package/integration/{hubspot → hubspot-test}/test-dataplane-down.js +3 -3
  36. package/integration/{hubspot → hubspot-test}/test.js +137 -102
  37. package/integration/{hubspot → hubspot-test}/wizard-hubspot-e2e.yaml +2 -2
  38. package/integration/{hubspot → hubspot-test}/wizard-hubspot-platform.yaml +1 -1
  39. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
  40. package/integration/roundtrip-test-local/README.md +144 -0
  41. package/integration/roundtrip-test-local/application.yaml +13 -0
  42. package/integration/roundtrip-test-local/env.template +15 -0
  43. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
  44. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
  45. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
  46. package/integration/roundtrip-test-local2/README.md +144 -0
  47. package/integration/roundtrip-test-local2/application.yaml +13 -0
  48. package/integration/roundtrip-test-local2/env.template +15 -0
  49. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
  50. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
  51. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
  52. package/integration/test/wizard.yaml +8 -0
  53. package/jest.config.default.js +10 -0
  54. package/jest.config.integration.fixtures.js +22 -0
  55. package/jest.config.integration.js +21 -18
  56. package/jest.config.isolated.js +10 -0
  57. package/jest.projects.js +288 -0
  58. package/lib/api/datasources-core.api.js +3 -3
  59. package/lib/api/dev-mtls-request.js +110 -0
  60. package/lib/api/dev-server-https.js +145 -0
  61. package/lib/api/dev.api.js +133 -144
  62. package/lib/api/index.js +0 -1
  63. package/lib/api/pipeline.api.js +67 -20
  64. package/lib/api/service-users.api.js +111 -2
  65. package/lib/api/types/dev.types.js +4 -3
  66. package/lib/api/types/pipeline.types.js +8 -5
  67. package/lib/api/types/service-users.types.js +41 -0
  68. package/lib/api/types/validation-run.types.js +56 -0
  69. package/lib/api/validation-run.api.js +99 -0
  70. package/lib/api/validation-runner.js +99 -0
  71. package/lib/app/config.js +1 -1
  72. package/lib/app/deploy-status-display.js +2 -2
  73. package/lib/app/deploy.js +7 -6
  74. package/lib/app/display.js +2 -1
  75. package/lib/app/dockerfile.js +3 -2
  76. package/lib/app/down.js +2 -1
  77. package/lib/app/helpers.js +6 -5
  78. package/lib/app/index.js +27 -8
  79. package/lib/app/list.js +7 -6
  80. package/lib/app/push.js +4 -3
  81. package/lib/app/register.js +19 -8
  82. package/lib/app/rotate-secret.js +17 -13
  83. package/lib/app/run-container-start.js +184 -0
  84. package/lib/app/run-docker-fallback.js +108 -0
  85. package/lib/app/run-env-compose.js +30 -42
  86. package/lib/app/run-helpers.js +49 -126
  87. package/lib/app/run-infra-requirements.js +30 -0
  88. package/lib/app/run-resolve-image.js +21 -0
  89. package/lib/app/run.js +74 -21
  90. package/lib/app/show-display.js +1 -1
  91. package/lib/app/show.js +1 -1
  92. package/lib/build/index.js +13 -10
  93. package/lib/cli/index.js +2 -0
  94. package/lib/cli/setup-app.help.js +67 -0
  95. package/lib/cli/setup-app.js +59 -123
  96. package/lib/cli/setup-app.test-commands.js +179 -0
  97. package/lib/cli/setup-auth.js +36 -14
  98. package/lib/cli/setup-credential-deployment.js +22 -8
  99. package/lib/cli/setup-dev-path-commands.js +124 -0
  100. package/lib/cli/setup-dev.js +190 -103
  101. package/lib/cli/setup-environment.js +11 -20
  102. package/lib/cli/setup-external-system.js +62 -22
  103. package/lib/cli/setup-infra.js +139 -47
  104. package/lib/cli/setup-parameters.js +32 -0
  105. package/lib/cli/setup-secrets.js +147 -10
  106. package/lib/cli/setup-service-user.js +146 -20
  107. package/lib/cli/setup-utility.js +47 -19
  108. package/lib/commands/app-down.js +5 -7
  109. package/lib/commands/app-install.js +14 -7
  110. package/lib/commands/app-logs.js +13 -10
  111. package/lib/commands/app-shell.js +4 -1
  112. package/lib/commands/app-test.js +25 -19
  113. package/lib/commands/app.js +22 -10
  114. package/lib/commands/auth-config.js +10 -14
  115. package/lib/commands/auth-status.js +4 -3
  116. package/lib/commands/credential-env.js +4 -3
  117. package/lib/commands/credential-list.js +5 -4
  118. package/lib/commands/credential-push.js +4 -3
  119. package/lib/commands/datasource-unified-test-cli.js +495 -0
  120. package/lib/commands/datasource-unified-test-cli.options.js +149 -0
  121. package/lib/commands/datasource-validation-cli.js +129 -0
  122. package/lib/commands/datasource.js +123 -71
  123. package/lib/commands/deployment-list.js +6 -5
  124. package/lib/commands/dev-cli-handlers.js +122 -18
  125. package/lib/commands/dev-down.js +4 -3
  126. package/lib/commands/dev-init.js +231 -116
  127. package/lib/commands/dev-show-display.js +473 -0
  128. package/lib/commands/login-credentials.js +3 -2
  129. package/lib/commands/login-device.js +4 -3
  130. package/lib/commands/login.js +5 -4
  131. package/lib/commands/logout.js +8 -7
  132. package/lib/commands/parameters-validate.js +54 -0
  133. package/lib/commands/repair-datasource.js +314 -68
  134. package/lib/commands/repair-env-template.js +16 -10
  135. package/lib/commands/repair-rbac.js +25 -19
  136. package/lib/commands/repair.js +116 -32
  137. package/lib/commands/secrets-list.js +23 -12
  138. package/lib/commands/secrets-remove-all.js +220 -0
  139. package/lib/commands/secrets-remove.js +22 -13
  140. package/lib/commands/secrets-set.js +21 -12
  141. package/lib/commands/secrets-validate.js +20 -7
  142. package/lib/commands/secure.js +10 -9
  143. package/lib/commands/service-user.js +243 -13
  144. package/lib/commands/test-e2e-external.js +27 -1
  145. package/lib/commands/up-common.js +28 -2
  146. package/lib/commands/up-dataplane.js +31 -18
  147. package/lib/commands/up-miso.js +19 -29
  148. package/lib/commands/upload.js +138 -39
  149. package/lib/commands/wizard-core-helpers.js +1 -1
  150. package/lib/commands/wizard-dataplane.js +4 -3
  151. package/lib/commands/wizard-helpers.js +3 -3
  152. package/lib/commands/wizard.js +2 -2
  153. package/lib/core/admin-secrets.js +16 -5
  154. package/lib/core/audit-logger.js +12 -4
  155. package/lib/core/config-attach-extensions.js +46 -0
  156. package/lib/core/config-runtime-paths.js +29 -0
  157. package/lib/core/config.js +59 -58
  158. package/lib/core/diff.js +3 -2
  159. package/lib/core/ensure-encryption-key.js +2 -4
  160. package/lib/core/secrets-ensure-infra.js +77 -0
  161. package/lib/core/secrets-ensure.js +120 -64
  162. package/lib/core/secrets-env-write.js +35 -7
  163. package/lib/core/secrets-infra-placeholder-sync.js +61 -0
  164. package/lib/core/secrets.js +228 -42
  165. package/lib/core/templates-env.js +4 -3
  166. package/lib/core/templates.js +1 -1
  167. package/lib/datasource/abac-validator.js +148 -0
  168. package/lib/datasource/deploy.js +75 -53
  169. package/lib/datasource/field-reference-validator.js +77 -36
  170. package/lib/datasource/integration-context.js +63 -0
  171. package/lib/datasource/list.js +8 -7
  172. package/lib/datasource/log-viewer.js +252 -0
  173. package/lib/datasource/resolve-app.js +109 -0
  174. package/lib/datasource/test-e2e.js +95 -155
  175. package/lib/datasource/test-integration.js +121 -109
  176. package/lib/datasource/unified-validation-run-body.js +65 -0
  177. package/lib/datasource/unified-validation-run-post.js +23 -0
  178. package/lib/datasource/unified-validation-run-resolve.js +43 -0
  179. package/lib/datasource/unified-validation-run.js +92 -0
  180. package/lib/datasource/validate.js +162 -15
  181. package/lib/deployment/deployer.js +4 -3
  182. package/lib/deployment/environment.js +7 -6
  183. package/lib/deployment/push.js +17 -8
  184. package/lib/external-system/delete.js +4 -3
  185. package/lib/external-system/deploy.js +131 -53
  186. package/lib/external-system/download-helpers.js +1 -1
  187. package/lib/external-system/download.js +7 -6
  188. package/lib/external-system/generator.js +104 -14
  189. package/lib/external-system/integration-test-dispatch.js +26 -0
  190. package/lib/external-system/test-execution.js +5 -1
  191. package/lib/external-system/test-helpers.js +0 -4
  192. package/lib/external-system/test-system-level-helpers.js +110 -0
  193. package/lib/external-system/test-system-level.js +83 -44
  194. package/lib/external-system/test.js +59 -8
  195. package/lib/generator/builders.js +23 -11
  196. package/lib/generator/deploy-manifest-azure-kv.js +81 -0
  197. package/lib/generator/external-controller-manifest.js +3 -3
  198. package/lib/generator/external.js +23 -11
  199. package/lib/generator/helpers.js +71 -12
  200. package/lib/generator/index.js +8 -4
  201. package/lib/generator/split-readme.js +12 -7
  202. package/lib/generator/split-variables.js +2 -1
  203. package/lib/generator/split.js +46 -11
  204. package/lib/generator/wizard-readme.js +3 -3
  205. package/lib/generator/wizard.js +16 -13
  206. package/lib/infrastructure/compose.js +60 -6
  207. package/lib/infrastructure/helpers.js +238 -51
  208. package/lib/infrastructure/index.js +64 -37
  209. package/lib/infrastructure/services.js +21 -15
  210. package/lib/internal/fs-real-sync.js +104 -0
  211. package/lib/internal/node-fs.js +98 -0
  212. package/lib/parameters/database-secret-values.js +173 -0
  213. package/lib/parameters/infra-kv-discovery.js +121 -0
  214. package/lib/parameters/infra-parameter-catalog.js +458 -0
  215. package/lib/parameters/infra-parameter-validate.js +64 -0
  216. package/lib/schema/application-schema.json +37 -17
  217. package/lib/schema/datasource-test-run.schema.json +493 -0
  218. package/lib/schema/deployment-rules.yaml +102 -63
  219. package/lib/schema/external-datasource.schema.json +1201 -433
  220. package/lib/schema/external-system.schema.json +181 -5
  221. package/lib/schema/flag-map-validation-run.json +31 -0
  222. package/lib/schema/infra-parameter.schema.json +106 -0
  223. package/lib/schema/infra.parameter.yaml +421 -0
  224. package/lib/schema/type/credential-auth-templates.json +40 -0
  225. package/lib/schema/type/document-storage.json +213 -0
  226. package/lib/schema/type/message-service.json +123 -0
  227. package/lib/schema/type/vector-store.json +88 -0
  228. package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
  229. package/lib/utils/api-error-handler.js +2 -2
  230. package/lib/utils/api.js +49 -14
  231. package/lib/utils/app-config-resolver.js +23 -1
  232. package/lib/utils/app-register-api.js +3 -2
  233. package/lib/utils/app-register-auth.js +1 -1
  234. package/lib/utils/app-register-config.js +4 -4
  235. package/lib/utils/app-register-display.js +3 -2
  236. package/lib/utils/app-register-validator.js +3 -2
  237. package/lib/utils/app-run-containers.js +26 -22
  238. package/lib/utils/app-scoped-config.js +31 -0
  239. package/lib/utils/app-service-env-from-builder.js +164 -0
  240. package/lib/utils/build-copy.js +1 -1
  241. package/lib/utils/build-helpers.js +20 -20
  242. package/lib/utils/build-resolve-image.js +165 -0
  243. package/lib/utils/cli-layout-chalk.js +8 -0
  244. package/lib/utils/cli-test-layout-chalk.js +267 -0
  245. package/lib/utils/cli-utils.js +88 -11
  246. package/lib/utils/compose-db-passwords.js +138 -0
  247. package/lib/utils/compose-generate-docker-compose.js +216 -0
  248. package/lib/utils/compose-generator.js +197 -291
  249. package/lib/utils/compose-miso-env.js +18 -0
  250. package/lib/utils/compose-traefik-ingress-base.js +158 -0
  251. package/lib/utils/config-paths.js +209 -6
  252. package/lib/utils/config-scoped-resources-preference.js +41 -0
  253. package/lib/utils/controller-deployment-outcome.js +68 -0
  254. package/lib/utils/credential-display.js +2 -2
  255. package/lib/utils/credential-secrets-env.js +16 -1
  256. package/lib/utils/dataplane-pipeline-warning.js +4 -3
  257. package/lib/utils/datasource-test-run-capability-scope.js +43 -0
  258. package/lib/utils/datasource-test-run-debug-display.js +137 -0
  259. package/lib/utils/datasource-test-run-debug-slice.js +93 -0
  260. package/lib/utils/datasource-test-run-display.js +442 -0
  261. package/lib/utils/datasource-test-run-exit.js +58 -0
  262. package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
  263. package/lib/utils/datasource-test-run-report-version.js +51 -0
  264. package/lib/utils/datasource-test-run-schema-sync.js +59 -0
  265. package/lib/utils/datasource-test-run-tty-log.js +81 -0
  266. package/lib/utils/datasource-validation-watch.js +266 -0
  267. package/lib/utils/declarative-url-ports.js +47 -0
  268. package/lib/utils/derive-env-key-from-client-id.js +41 -0
  269. package/lib/utils/dev-ca-install.js +185 -23
  270. package/lib/utils/dev-cert-helper.js +266 -17
  271. package/lib/utils/dev-hosts-helper.js +307 -0
  272. package/lib/utils/dev-init-cert-hints.js +37 -0
  273. package/lib/utils/dev-init-health-messages.js +52 -0
  274. package/lib/utils/dev-init-resolve.js +86 -0
  275. package/lib/utils/dev-init-ssh-merge.js +65 -0
  276. package/lib/utils/dev-ssh-config-helper.js +196 -0
  277. package/lib/utils/dev-user-groups.js +93 -0
  278. package/lib/utils/docker-build.js +42 -17
  279. package/lib/utils/docker-exec.js +28 -0
  280. package/lib/utils/docker-manifest-public-port.js +116 -0
  281. package/lib/utils/docker-not-running-hint.js +52 -0
  282. package/lib/utils/docker.js +98 -11
  283. package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
  284. package/lib/utils/env-config-loader.js +10 -91
  285. package/lib/utils/env-copy.js +19 -10
  286. package/lib/utils/env-map.js +42 -11
  287. package/lib/utils/env-template.js +2 -2
  288. package/lib/utils/environment-scoped-resources.js +144 -0
  289. package/lib/utils/error-formatter.js +125 -9
  290. package/lib/utils/error-formatters/http-status-errors.js +6 -5
  291. package/lib/utils/error-formatters/network-errors.js +2 -1
  292. package/lib/utils/error-formatters/permission-errors.js +2 -1
  293. package/lib/utils/error-formatters/validation-errors.js +2 -1
  294. package/lib/utils/external-env-template.js +180 -0
  295. package/lib/utils/external-readme.js +8 -1
  296. package/lib/utils/external-system-display.js +277 -136
  297. package/lib/utils/external-system-local-test-tty.js +389 -0
  298. package/lib/utils/external-system-readiness-core.js +377 -0
  299. package/lib/utils/external-system-readiness-deploy-display.js +270 -0
  300. package/lib/utils/external-system-readiness-display-internals.js +150 -0
  301. package/lib/utils/external-system-readiness-display.js +186 -0
  302. package/lib/utils/external-system-test-helpers.js +24 -6
  303. package/lib/utils/external-system-validators.js +32 -14
  304. package/lib/utils/health-check-url.js +119 -0
  305. package/lib/utils/health-check.js +59 -25
  306. package/lib/utils/help-builder.js +14 -13
  307. package/lib/utils/image-version.js +4 -8
  308. package/lib/utils/infra-containers.js +4 -7
  309. package/lib/utils/infra-env-defaults.js +162 -0
  310. package/lib/utils/infra-status-display.js +167 -0
  311. package/lib/utils/infra-status.js +16 -8
  312. package/lib/utils/local-secrets.js +29 -7
  313. package/lib/utils/paths.js +136 -48
  314. package/lib/utils/port-resolver.js +10 -23
  315. package/lib/utils/redis-env-scope.js +62 -0
  316. package/lib/utils/register-aifabrix-shell-env.js +204 -0
  317. package/lib/utils/remote-builder-validation.js +99 -0
  318. package/lib/utils/remote-dev-auth.js +117 -21
  319. package/lib/utils/remote-docker-env.js +67 -15
  320. package/lib/utils/remote-secrets-loader.js +13 -4
  321. package/lib/utils/resolve-docker-image-ref.js +124 -0
  322. package/lib/utils/schema-loader.js +22 -9
  323. package/lib/utils/secrets-bash-kv.js +25 -0
  324. package/lib/utils/secrets-generator.js +171 -51
  325. package/lib/utils/secrets-helpers.js +70 -59
  326. package/lib/utils/secrets-kv-scope.js +60 -0
  327. package/lib/utils/secrets-utils.js +35 -37
  328. package/lib/utils/secrets-validation.js +3 -1
  329. package/lib/utils/secrets-yaml-preserve.js +109 -0
  330. package/lib/utils/secure-file-permissions.js +91 -0
  331. package/lib/utils/ssh-key-helper.js +4 -2
  332. package/lib/utils/template-helpers.js +2 -2
  333. package/lib/utils/test-log-writer.js +3 -3
  334. package/lib/utils/token-manager.js +37 -5
  335. package/lib/utils/url-declarative-public-base.js +188 -0
  336. package/lib/utils/url-declarative-resolve-build.js +493 -0
  337. package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
  338. package/lib/utils/url-declarative-resolve.js +220 -0
  339. package/lib/utils/url-declarative-token-parse.js +74 -0
  340. package/lib/utils/url-declarative-url-flags.js +50 -0
  341. package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
  342. package/lib/utils/url-public-path-prefix.js +34 -0
  343. package/lib/utils/urls-local-registry.js +220 -0
  344. package/lib/utils/validation-report-tty-kit.js +77 -0
  345. package/lib/utils/validation-run-poll.js +89 -0
  346. package/lib/utils/validation-run-post-retry.js +73 -0
  347. package/lib/utils/validation-run-request.js +98 -0
  348. package/lib/utils/variable-transformer.js +21 -4
  349. package/lib/utils/yaml-preserve.js +78 -1
  350. package/lib/validation/datasource-warnings.js +56 -0
  351. package/lib/validation/env-template-auth.js +50 -2
  352. package/lib/validation/external-manifest-validator.js +35 -7
  353. package/lib/validation/validate-display.js +37 -31
  354. package/lib/validation/validate.js +9 -10
  355. package/lib/validation/validator-unresolved-placeholders.js +98 -0
  356. package/lib/validation/validator.js +32 -78
  357. package/lib/validation/wizard-config-validator.js +2 -1
  358. package/package.json +11 -3
  359. package/scripts/check-datasource-test-run-schema-sync.js +34 -0
  360. package/scripts/diagnose-cli.js +150 -0
  361. package/scripts/install-local.js +304 -55
  362. package/templates/README.md +15 -2
  363. package/templates/applications/dataplane/application.yaml +52 -2
  364. package/templates/applications/dataplane/env.template +80 -18
  365. package/templates/applications/dataplane/rbac.yaml +8 -0
  366. package/templates/applications/keycloak/application.yaml +9 -1
  367. package/templates/applications/keycloak/env.template +15 -6
  368. package/templates/applications/miso-controller/application.yaml +10 -2
  369. package/templates/applications/miso-controller/env.template +55 -14
  370. package/templates/applications/miso-controller/rbac.yaml +5 -0
  371. package/templates/external-system/README.md.hbs +20 -7
  372. package/templates/external-system/deploy.js.hbs +5 -5
  373. package/templates/external-system/env.template.hbs +22 -0
  374. package/templates/external-system/external-datasource.yaml.hbs +197 -118
  375. package/templates/infra/compose.yaml.hbs +20 -4
  376. package/templates/python/docker-compose.hbs +16 -0
  377. package/templates/typescript/docker-compose.hbs +16 -0
  378. package/integration/hubspot/README.md +0 -102
  379. package/integration/hubspot/env.template +0 -4
  380. package/integration/hubspot/hubspot-datasource-company.json +0 -541
  381. package/integration/hubspot/hubspot-datasource-contact.json +0 -639
  382. package/integration/hubspot/hubspot-datasource-deal.json +0 -588
  383. package/integration/hubspot/hubspot-datasource-users.json +0 -116
  384. package/integration/hubspot/test-artifacts/wizard-invalid-missing-source.yaml +0 -2
  385. package/integration/hubspot/test-artifacts/wizard-valid-for-dimension-key-test.yaml +0 -5
  386. package/integration/hubspot/test-artifacts/wizard-valid-for-dimension-path-test.yaml +0 -5
  387. package/lib/api/external-test.api.js +0 -111
  388. package/lib/schema/env-config.yaml +0 -43
  389. /package/integration/{hubspot → hubspot-test}/companies.json +0 -0
  390. /package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-app-name.yaml +0 -0
  391. /package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-missing-app.yaml +0 -0
  392. /package/integration/{hubspot → hubspot-test}/test-dataplane-down-helpers.js +0 -0
@@ -0,0 +1,493 @@
1
+ /**
2
+ * URL string builders and token expansion for declarative url:// resolution (plan 122).
3
+ *
4
+ * @fileoverview Split from url-declarative-resolve.js for ESLint max-lines limits
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { getRegistryEntryForApp } = require('./urls-local-registry');
12
+ const { DECLARATIVE_URL_INFRA_DEFAULTS } = require('./infra-env-defaults');
13
+ const { getContainerPort, getLocalPort } = require('./port-resolver');
14
+ const pathsUtil = require('./paths');
15
+ const {
16
+ computePublicUrlBaseString,
17
+ resolveHostPortForDeclarativePublic
18
+ } = require('./url-declarative-public-base');
19
+ const { computePathActive } = require('./url-declarative-url-flags');
20
+ const { loadApplicationYamlDocForUrlResolve } = require('./url-declarative-resolve-load-doc');
21
+ const { parseUrlToken } = require('./url-declarative-token-parse');
22
+
23
+ /**
24
+ * Plan 122: **Developer subdomain `devNN` + remote hostname is not derived from envKey `tst`.** It comes only from
25
+ * expanding **`frontDoorRouting.host`** (e.g. `${DEV_USERNAME}.${REMOTE_HOST}`) when **`traefik`** is on.
26
+ * Kept as a no-op for backward compatibility; callers must not rely on tst-based host mutation.
27
+ *
28
+ * @param {string} absoluteUrl
29
+ * @returns {string}
30
+ */
31
+ function applyTstRemoteDeveloperHost(absoluteUrl) {
32
+ return absoluteUrl;
33
+ }
34
+
35
+ /**
36
+ * @param {string} origin
37
+ * @returns {string}
38
+ */
39
+ function applyTstRemoteDeveloperHostToOrigin(origin) {
40
+ return origin;
41
+ }
42
+
43
+ /**
44
+ * Join base URL origin with path segments (no duplicate slashes).
45
+ * @param {string} originOrBase - https://host or https://host:port
46
+ * @param {string} suffixPath - /dev/data
47
+ * @returns {string}
48
+ */
49
+ function joinUrlPath(originOrBase, suffixPath) {
50
+ const base = String(originOrBase || '').replace(/\/+$/, '');
51
+ let suf = suffixPath || '';
52
+ if (!suf.startsWith('/')) {
53
+ suf = `/${suf}`;
54
+ }
55
+ return `${base}${suf}`.replace(/([^:]\/)\/+/g, '$1');
56
+ }
57
+
58
+ /**
59
+ * @param {Object} opts
60
+ * @returns {string}
61
+ */
62
+ function buildPublicUrlString(opts) {
63
+ const {
64
+ profile,
65
+ listenPort,
66
+ developerIdNum,
67
+ remoteServer,
68
+ pathPrefix,
69
+ patternPath,
70
+ traefik,
71
+ hostTemplate,
72
+ tls,
73
+ developerIdRaw,
74
+ infraTlsEnabled,
75
+ frontDoorIngressActive,
76
+ declarativeTargetAppKey,
77
+ declarativeCurrentAppKey
78
+ } = opts;
79
+ const base = computePublicUrlBaseString({
80
+ traefik: Boolean(traefik),
81
+ pathActive: Boolean(frontDoorIngressActive),
82
+ hostTemplate: hostTemplate || null,
83
+ tls: tls !== false,
84
+ developerIdRaw,
85
+ remoteServer,
86
+ profile,
87
+ listenPort,
88
+ developerIdNum,
89
+ infraTlsEnabled: Boolean(infraTlsEnabled),
90
+ declarativeTargetAppKey,
91
+ declarativeCurrentAppKey
92
+ });
93
+ const patternSegment =
94
+ frontDoorIngressActive === false
95
+ ? ''
96
+ : patternPath === '/' || patternPath === ''
97
+ ? ''
98
+ : patternPath;
99
+ const rawSuffix = `${pathPrefix}${patternSegment}`.replace(/\/{2,}/g, '/');
100
+ if (!rawSuffix || rawSuffix === '/') {
101
+ return String(base).replace(/\/+$/, '');
102
+ }
103
+ const normalizedSuffix = rawSuffix.startsWith('/') ? rawSuffix : `/${rawSuffix}`;
104
+ return joinUrlPath(base, normalizedSuffix);
105
+ }
106
+
107
+ /**
108
+ * Public reachability origin only (no env path prefix, no front-door pattern path).
109
+ * @param {Object} opts
110
+ * @returns {string}
111
+ */
112
+ function buildPublicHostOriginString(opts) {
113
+ const {
114
+ profile,
115
+ listenPort,
116
+ developerIdNum,
117
+ remoteServer,
118
+ traefik,
119
+ hostTemplate,
120
+ tls,
121
+ developerIdRaw,
122
+ infraTlsEnabled,
123
+ frontDoorIngressActive,
124
+ declarativeTargetAppKey,
125
+ declarativeCurrentAppKey
126
+ } = opts;
127
+ const base = computePublicUrlBaseString({
128
+ traefik: Boolean(traefik),
129
+ pathActive: Boolean(frontDoorIngressActive),
130
+ hostTemplate: hostTemplate || null,
131
+ tls: tls !== false,
132
+ developerIdRaw,
133
+ remoteServer,
134
+ profile,
135
+ listenPort,
136
+ developerIdNum,
137
+ infraTlsEnabled: Boolean(infraTlsEnabled),
138
+ declarativeTargetAppKey,
139
+ declarativeCurrentAppKey
140
+ });
141
+ try {
142
+ return new URL(base).origin;
143
+ } catch {
144
+ const hostPort = resolveHostPortForDeclarativePublic({
145
+ profile,
146
+ listenPort,
147
+ developerIdNum,
148
+ declarativeTargetAppKey,
149
+ declarativeCurrentAppKey
150
+ });
151
+ return `http://localhost:${hostPort}`;
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Internal service origin only (scheme + host + port), no path suffix.
157
+ * @param {Object} opts
158
+ * @returns {string}
159
+ */
160
+ function buildInternalHostOriginString(opts) {
161
+ const {
162
+ profile,
163
+ listenPort,
164
+ targetAppKey,
165
+ remoteServer,
166
+ pathPrefix,
167
+ patternPath,
168
+ developerIdNum,
169
+ traefik,
170
+ hostTemplate,
171
+ tls,
172
+ developerIdRaw,
173
+ infraTlsEnabled,
174
+ frontDoorIngressActive,
175
+ declarativeTargetAppKey,
176
+ declarativeCurrentAppKey
177
+ } = opts;
178
+ if (profile === 'docker') {
179
+ return `http://${targetAppKey}:${listenPort}`;
180
+ }
181
+ if (remoteServer && String(remoteServer).trim()) {
182
+ const pub = buildPublicUrlString({
183
+ profile: 'local',
184
+ listenPort,
185
+ developerIdNum,
186
+ remoteServer,
187
+ pathPrefix,
188
+ patternPath,
189
+ traefik,
190
+ hostTemplate,
191
+ tls,
192
+ developerIdRaw,
193
+ infraTlsEnabled,
194
+ frontDoorIngressActive,
195
+ declarativeTargetAppKey: declarativeTargetAppKey || targetAppKey,
196
+ declarativeCurrentAppKey: declarativeCurrentAppKey
197
+ });
198
+ try {
199
+ return new URL(pub).origin;
200
+ } catch {
201
+ return `http://${targetAppKey}:${listenPort}`;
202
+ }
203
+ }
204
+ return `http://${targetAppKey}:${listenPort}`;
205
+ }
206
+
207
+ function buildInternalUrlString(opts) {
208
+ const {
209
+ profile,
210
+ listenPort,
211
+ targetAppKey,
212
+ remoteServer,
213
+ pathPrefix,
214
+ patternPath,
215
+ developerIdNum,
216
+ traefik,
217
+ hostTemplate,
218
+ tls,
219
+ developerIdRaw,
220
+ infraTlsEnabled,
221
+ frontDoorIngressActive,
222
+ declarativeTargetAppKey,
223
+ declarativeCurrentAppKey
224
+ } = opts;
225
+ if (profile === 'docker') {
226
+ return `http://${targetAppKey}:${listenPort}`;
227
+ }
228
+ if (remoteServer && String(remoteServer).trim()) {
229
+ return buildPublicUrlString({
230
+ profile: 'local',
231
+ listenPort,
232
+ developerIdNum,
233
+ remoteServer,
234
+ pathPrefix,
235
+ patternPath,
236
+ traefik,
237
+ hostTemplate,
238
+ tls,
239
+ developerIdRaw,
240
+ infraTlsEnabled,
241
+ frontDoorIngressActive,
242
+ declarativeTargetAppKey: declarativeTargetAppKey || targetAppKey,
243
+ declarativeCurrentAppKey: declarativeCurrentAppKey
244
+ });
245
+ }
246
+ return `http://${targetAppKey}:${listenPort}`;
247
+ }
248
+
249
+ /**
250
+ * @param {object|null|undefined} doc
251
+ * @returns {{ hostTemplate: string|null, tls: boolean }}
252
+ */
253
+ function readFrontDoorHostTlsFromDoc(doc) {
254
+ if (!doc || !doc.frontDoorRouting) {
255
+ return { hostTemplate: null, tls: true };
256
+ }
257
+ const fd = doc.frontDoorRouting;
258
+ const hostTemplate =
259
+ typeof fd.host === 'string' && fd.host.trim() ? fd.host.trim() : null;
260
+ return { hostTemplate, tls: fd.tls !== false };
261
+ }
262
+
263
+ /**
264
+ * Ports from application.yaml: `listenPort` = container/process listen ({@link getContainerPort});
265
+ * `publicPortBasis` = manifest root `port` ({@link getLocalPort}) for browser-published host URLs
266
+ * (url://host-public, url://public origin) when Traefik is not serving the app — not the internal
267
+ * container port (e.g. Keycloak 8082 published vs 8080 in-container).
268
+ *
269
+ * @param {object|null|undefined} doc
270
+ * @param {{ port: number, containerPort: number|null, pattern: string }|null} entry
271
+ * @returns {{ listenPort: number, publicPortBasis: number, patternStr: string }|null}
272
+ */
273
+ function resolveListenPortAndPatternFromDoc(doc, entry) {
274
+ if (doc) {
275
+ const listenPort = getContainerPort(doc);
276
+ const publicPortBasis = getLocalPort(doc);
277
+ const raw = doc.frontDoorRouting && doc.frontDoorRouting.pattern;
278
+ const patternStr =
279
+ typeof raw === 'string'
280
+ ? raw
281
+ : entry && typeof entry.pattern === 'string'
282
+ ? entry.pattern
283
+ : DECLARATIVE_URL_INFRA_DEFAULTS.frontDoorPatternWhenUnspecified;
284
+ return { listenPort, publicPortBasis, patternStr };
285
+ }
286
+ if (entry) {
287
+ const c = entry.containerPort;
288
+ const listenPort = typeof c === 'number' && c > 0 ? c : entry.port;
289
+ return { listenPort, publicPortBasis: entry.port, patternStr: entry.pattern };
290
+ }
291
+ return null;
292
+ }
293
+
294
+ /**
295
+ * Port + pattern + optional Traefik host template for a url:// token.
296
+ * @param {string} token
297
+ * @param {Object} ctx
298
+ * @param {Object} registry
299
+ * @returns {{ appKey: string, listenPort: number, publicPortBasis: number, patternStr: string, hostTemplate: string|null, tls: boolean, frontDoorIngressActive: boolean }|null}
300
+ */
301
+ function resolveListenPortPatternForToken(token, ctx, registry) {
302
+ const { targetKey } = parseUrlToken(token);
303
+ const currentAppKey = ctx.currentAppKey || '';
304
+ const appKey = targetKey || currentAppKey;
305
+ if (!appKey) {
306
+ return null;
307
+ }
308
+ const doc = loadApplicationYamlDocForUrlResolve(appKey, ctx, pathsUtil);
309
+ const entry = getRegistryEntryForApp(appKey, registry);
310
+ const portPattern = resolveListenPortAndPatternFromDoc(doc, entry);
311
+ if (!portPattern) {
312
+ return null;
313
+ }
314
+ const { listenPort, publicPortBasis, patternStr } = portPattern;
315
+ const meta = readFrontDoorHostTlsFromDoc(doc);
316
+ const frontDoorIngressActive = computePathActive(
317
+ Boolean(ctx.traefik),
318
+ Boolean(doc && doc.frontDoorRouting && doc.frontDoorRouting.enabled === true)
319
+ );
320
+ return {
321
+ appKey,
322
+ listenPort,
323
+ publicPortBasis,
324
+ patternStr,
325
+ hostTemplate: meta.hostTemplate,
326
+ tls: meta.tls,
327
+ frontDoorIngressActive
328
+ };
329
+ }
330
+
331
+ /**
332
+ * Published/browser origin port basis for url:// public surfaces (manifest `port`), not container listen.
333
+ * @param {Object} r
334
+ * @returns {number}
335
+ */
336
+ function publishedOriginPortBasis(r) {
337
+ const b = r.publicPortBasis;
338
+ if (b !== undefined && b !== null && Number.isFinite(Number(b))) {
339
+ return Number(b);
340
+ }
341
+ return r.listenPort;
342
+ }
343
+
344
+ /**
345
+ * @param {Object} r - resolved app + patternPath + pathPrefix + remoteServer + profile + devNum + derivedEnvKey
346
+ * @returns {string}
347
+ */
348
+ function expandHostSurfacePublic(r) {
349
+ return buildPublicHostOriginString({
350
+ profile: r.profile,
351
+ listenPort: publishedOriginPortBasis(r),
352
+ developerIdNum: r.devNum,
353
+ remoteServer: r.remoteServer,
354
+ traefik: r.traefik,
355
+ hostTemplate: r.hostTemplate,
356
+ tls: r.tls,
357
+ developerIdRaw: r.developerIdRaw,
358
+ infraTlsEnabled: r.infraTlsEnabled,
359
+ frontDoorIngressActive: r.frontDoorIngressActive,
360
+ declarativeTargetAppKey: r.appKey,
361
+ declarativeCurrentAppKey: r.currentAppKey
362
+ });
363
+ }
364
+
365
+ /**
366
+ * Local workstation `.env` (no remote-server): browser-reachable URLs only — internal tokens match public.
367
+ * Remote dev keeps internal = public mirroring via {@link buildInternalUrlString} when `remoteServer` is set.
368
+ *
369
+ * @param {Object} r
370
+ * @returns {boolean}
371
+ */
372
+ function isLocalProfileWithoutRemoteServer(r) {
373
+ return r.profile === 'local' && !String(r.remoteServer || '').trim();
374
+ }
375
+
376
+ /**
377
+ * @param {Object} r
378
+ * @returns {string}
379
+ */
380
+ function expandHostSurfaceInternal(r) {
381
+ if (isLocalProfileWithoutRemoteServer(r)) {
382
+ return expandHostSurfacePublic(r);
383
+ }
384
+ return buildInternalHostOriginString({
385
+ profile: r.profile,
386
+ listenPort: r.listenPort,
387
+ targetAppKey: r.appKey,
388
+ remoteServer: r.remoteServer,
389
+ pathPrefix: r.pathPrefix,
390
+ patternPath: r.patternPath,
391
+ developerIdNum: r.devNum,
392
+ derivedEnvKey: r.derivedEnvKey,
393
+ traefik: r.traefik,
394
+ hostTemplate: r.hostTemplate,
395
+ tls: r.tls,
396
+ developerIdRaw: r.developerIdRaw,
397
+ infraTlsEnabled: r.infraTlsEnabled,
398
+ frontDoorIngressActive: r.frontDoorIngressActive,
399
+ declarativeTargetAppKey: r.appKey,
400
+ declarativeCurrentAppKey: r.currentAppKey
401
+ });
402
+ }
403
+
404
+ /**
405
+ * @param {Object} r
406
+ * @returns {string}
407
+ */
408
+ function expandFullSurfacePublic(r) {
409
+ return buildPublicUrlString({
410
+ profile: r.profile,
411
+ listenPort: publishedOriginPortBasis(r),
412
+ developerIdNum: r.devNum,
413
+ remoteServer: r.remoteServer,
414
+ pathPrefix: r.pathPrefix,
415
+ patternPath: r.patternPath,
416
+ traefik: r.traefik,
417
+ hostTemplate: r.hostTemplate,
418
+ tls: r.tls,
419
+ developerIdRaw: r.developerIdRaw,
420
+ infraTlsEnabled: r.infraTlsEnabled,
421
+ frontDoorIngressActive: r.frontDoorIngressActive,
422
+ declarativeTargetAppKey: r.appKey,
423
+ declarativeCurrentAppKey: r.currentAppKey
424
+ });
425
+ }
426
+
427
+ /**
428
+ * @param {Object} r
429
+ * @returns {string}
430
+ */
431
+ function expandFullSurfaceInternal(r) {
432
+ if (isLocalProfileWithoutRemoteServer(r)) {
433
+ return expandFullSurfacePublic(r);
434
+ }
435
+ return buildInternalUrlString({
436
+ profile: r.profile,
437
+ listenPort: r.listenPort,
438
+ targetAppKey: r.appKey,
439
+ remoteServer: r.remoteServer,
440
+ pathPrefix: r.pathPrefix,
441
+ patternPath: r.patternPath,
442
+ developerIdNum: r.devNum,
443
+ derivedEnvKey: r.derivedEnvKey,
444
+ traefik: r.traefik,
445
+ hostTemplate: r.hostTemplate,
446
+ tls: r.tls,
447
+ developerIdRaw: r.developerIdRaw,
448
+ infraTlsEnabled: r.infraTlsEnabled,
449
+ frontDoorIngressActive: r.frontDoorIngressActive,
450
+ declarativeTargetAppKey: r.appKey,
451
+ declarativeCurrentAppKey: r.currentAppKey
452
+ });
453
+ }
454
+
455
+ /**
456
+ * @param {{ kind: string, surface: string }} parsed
457
+ * @param {Object} r
458
+ * @returns {string}
459
+ */
460
+ function expandResolvedUrlToken(parsed, r) {
461
+ if (parsed.surface === 'vdir') {
462
+ if (!r.frontDoorIngressActive) {
463
+ return '';
464
+ }
465
+ // Plan 124: docker PRIVATEVDIR is always empty; public vdir still carries pattern
466
+ if (parsed.kind === 'internal' && r.profile === 'docker') {
467
+ return '';
468
+ }
469
+ const prefix = String(r.pathPrefix || '');
470
+ const pat = r.patternPath || '/';
471
+ if (!pat || pat === '/') {
472
+ return prefix || '';
473
+ }
474
+ const joined = `${prefix}${pat}`.replace(/\/{2,}/g, '/');
475
+ return joined.startsWith('/') ? joined : `/${joined}`;
476
+ }
477
+ if (parsed.surface === 'host') {
478
+ return parsed.kind === 'public' ? expandHostSurfacePublic(r) : expandHostSurfaceInternal(r);
479
+ }
480
+ return parsed.kind === 'public' ? expandFullSurfacePublic(r) : expandFullSurfaceInternal(r);
481
+ }
482
+
483
+ module.exports = {
484
+ applyTstRemoteDeveloperHost,
485
+ applyTstRemoteDeveloperHostToOrigin,
486
+ buildPublicUrlString,
487
+ buildPublicHostOriginString,
488
+ buildInternalUrlString,
489
+ buildInternalHostOriginString,
490
+ parseUrlToken,
491
+ expandResolvedUrlToken,
492
+ resolveListenPortPatternForToken
493
+ };
@@ -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
+ };