@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,15 @@
1
+ ---
2
+ description: Mandatory structure for Builder CLI anchor-docs.
3
+ globs: anchor-docs/**/*.md
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # anchor-docs (Builder)
8
+
9
+ When editing `anchor-docs/**/*.md` (only `README.md` is exempt). Copy `anchor-docs/_TEMPLATE` to create a new anchor (no `.md` extension — not validated):
10
+
11
+ - Include YAML frontmatter: `title`, `navigation_id`, `owner`, `last_verified_commit`.
12
+ - `navigation_id` must match **aifabrix-docs** `docs/builder/navigation.yaml` entries (`builder/<url>`).
13
+ - Sections required: `## Summary`, `## Details`, `## Examples`, `## Paths`.
14
+ - Reference repo files with **`[path:aifabrix-builder/...]`**; avoid backtick-only paths for the same references.
15
+ - Align with CLI user-doc rules: keep HTTP/API endpoint names out of `docs/commands/` user text; technical anchors may cite code paths.
package/README.md CHANGED
@@ -48,7 +48,7 @@ Get the platform running locally so you can try it.
48
48
  aifabrix up-infra
49
49
  ```
50
50
 
51
- First-time run creates required infra secrets automatically. Use `aifabrix up-infra --adminPwd <password>` to set a custom admin password for Postgres, pgAdmin, and Redis Commander.
51
+ First-time run creates required infra secrets automatically. Use `aifabrix up-infra --adminPassword <password>` to set a custom admin password for Postgres, pgAdmin, and Redis Commander.
52
52
 
53
53
  2. **Start the platform** (Keycloak, Miso Controller, Dataplane) from community images:
54
54
 
@@ -82,7 +82,7 @@ Create and deploy an external system (e.g. HubSpot): wizard or manual setup, the
82
82
 
83
83
  **Example: HubSpot**
84
84
 
85
- - Create: `aifabrix create hubspot` (external is the default; or `aifabrix wizard` for guided setup). For a web app use `aifabrix create my-app --type webapp`.
85
+ - Create: `aifabrix create hubspot-test` (external is the default; or `aifabrix wizard` for guided setup). For a web app use `aifabrix create my-app --type webapp`.
86
86
  - Configure auth and datasources under `integration/hubspot-test/`.
87
87
  - Validate: `aifabrix validate hubspot-test`
88
88
  - Deploy: `aifabrix deploy hubspot-test`
@@ -0,0 +1,10 @@
1
+ # anchor-docs (Builder CLI)
2
+
3
+ Canonical technical notes for the AI Fabrix Builder. Command references, JSON schemas, and generator entrypoints live here; **aifabrix-docs** `docs/builder/` should only summarize and link.
4
+
5
+ ## Conventions
6
+
7
+ * Copy `anchor-docs/_TEMPLATE` to a new `*.md` file and fill in placeholders (the template is not `.md`, so it is not validated as an anchor).
8
+ * `navigation_id` must match **aifabrix-docs** `docs/builder/navigation.yaml` (`builder/<url>`).
9
+ * Use **`[path:aifabrix-builder/...]`** markers only.
10
+ * PRs touching anchors should request review from the `owner` team.
@@ -0,0 +1,24 @@
1
+ # Copy this file to `your-topic.md` and replace placeholders. This is not `*.md` so it is not validated as an anchor-doc.
2
+
3
+ ---
4
+ title: <Title>
5
+ navigation_id: builder/<slug-from-navigation.yaml>
6
+ owner: <team>
7
+ last_verified_commit: <sha-or-TBD>
8
+ ---
9
+
10
+ ## Summary
11
+
12
+ <What this anchor covers for Builder CLI or schemas.>
13
+
14
+ ## Details
15
+
16
+ <Implementation notes; keep persona docs in aifabrix-docs thin.>
17
+
18
+ ## Examples
19
+
20
+ <aifabrix wizard|validate|deploy ...>
21
+
22
+ ## Paths
23
+
24
+ [path:aifabrix-builder/README.md]
package/bin/aifabrix.js CHANGED
@@ -28,14 +28,23 @@ function initializeCLI() {
28
28
 
29
29
  program.name('aifabrix')
30
30
  .version(packageJson.version)
31
- .description('AI Fabrix Local Fabric & Deployment SDK');
31
+ .description(
32
+ 'Local Docker infra, app scaffolding, validation, and deploy to Azure (or local) via Miso Controller'
33
+ );
32
34
 
33
35
  // Delegate command setup to lib/cli.js (order matches help categories for consistency)
34
36
  cli.setupCommands(program);
35
37
 
36
- // Use categorized help for a more user-friendly command list
38
+ // Custom help replaces Commander default; append footer here (program.addHelpText is not applied)
39
+ const ROOT_HELP_FOOTER = `
40
+
41
+ More:
42
+ aifabrix <command> --help Options and examples for one command
43
+ docs/commands/README.md Command reference in the repo
44
+ `;
45
+
37
46
  program.helpInformation = function() {
38
- return buildCategorizedHelp(program);
47
+ return buildCategorizedHelp(program) + ROOT_HELP_FOOTER;
39
48
  };
40
49
 
41
50
  // Parse command line arguments
@@ -51,7 +60,7 @@ if (require.main === module) {
51
60
  try {
52
61
  initializeCLI();
53
62
  } catch (error) {
54
- logger.error(' Failed to initialize CLI:', error.message);
63
+ logger.error(' Failed to initialize CLI:', error.message);
55
64
  process.exit(1);
56
65
  }
57
66
  }
@@ -0,0 +1,157 @@
1
+ # HubSpot CRM
2
+
3
+ HubSpot CRM integration with OpenAPI support for companies, contacts, and deals
4
+
5
+ ## System Information
6
+
7
+ - **System Key**: `hubspot-test`
8
+ - **System Type**: `openapi`
9
+ - **Datasources**: 4
10
+
11
+ ## Regenerating files with the CLI (recommended)
12
+
13
+ Datasource and system JSON under this folder are **normally produced by the Builder**, not edited by hand for structural/schema changes. Use one of these flows (from the **repository root**):
14
+
15
+ 1. **Interactive wizard** (writes to `integration/hubspot-test/` when the app key is `hubspot-test`):
16
+
17
+ ```bash
18
+ aifabrix wizard hubspot-test
19
+ ```
20
+
21
+ 2. **Headless wizard – known platform HubSpot** (same folder; needs dataplane + auth):
22
+
23
+ ```bash
24
+ node bin/aifabrix.js wizard \
25
+ --config integration/hubspot-test/wizard-hubspot-test-headless.yaml \
26
+ --controller <YOUR_CONTROLLER_URL> \
27
+ --environment <YOUR_ENV>
28
+ ```
29
+
30
+ Edit `deployment.controller` / `deployment.environment` in that YAML if you prefer not to pass flags.
31
+
32
+ 3. **Helper script** (generates a temporary wizard config and runs the CLI; defaults OpenAPI to `companies.json` in this directory):
33
+
34
+ ```bash
35
+ node integration/hubspot-test/create-hubspot.js --name hubspot-test --keep-wizard-files
36
+ ```
37
+
38
+ After regeneration, run `aifabrix validate hubspot-test --type external` and the HubSpot integration tests as needed.
39
+
40
+ Committed copies may still be **trimmed or adjusted** for repo tests (e.g. deterministic fields); prefer changing **generators/templates** in `lib/` and `templates/` when defaults should change for everyone.
41
+
42
+ ## Files
43
+
44
+ - `application.yaml` – Application configuration with `app` and `externalIntegration` blocks
45
+ - `hubspot-test-system.json` – External system definition (authentication, OpenAPI/MCP, RBAC)
46
+ - `hubspot-test-datasource-deal.json` – Datasource: HubSpot Deal
47
+ - `hubspot-test-datasource-contact.json` – Datasource: HubSpot Contact
48
+ - `hubspot-test-datasource-users.json` – Datasource: HubSpot Users
49
+ - `hubspot-test-datasource-company.json` – Datasource: HubSpot Company
50
+ - `env.template` – Environment variables template (secrets, API keys)
51
+ - `hubspot-test-deploy.json` – Deployment manifest (generated by `aifabrix json`)
52
+
53
+ Optional: `rbac.yaml` – Roles and permissions merged into the system when present.
54
+
55
+ ## Quick Start
56
+
57
+ ### 1. Create External System
58
+
59
+ ```bash
60
+ aifabrix create hubspot-test
61
+ ```
62
+
63
+ (External is the default type. Use `aifabrix create <name> --type webapp` for a builder app.)
64
+
65
+ Or use the interactive wizard:
66
+
67
+ ```bash
68
+ aifabrix wizard --app hubspot-test
69
+ ```
70
+
71
+ ### 2. Configure Authentication and Datasources
72
+
73
+ Edit files in `integration/hubspot-test/`:
74
+
75
+ - **Authentication**: `hubspot-test-system.json` (auth type, credentials placeholders)
76
+ - **Field mappings**: `hubspot-test-datasource-*.json` (dimensions, attributes, operations)
77
+
78
+ ### 3. Validate Configuration
79
+
80
+ ```bash
81
+ aifabrix validate hubspot-test --type external
82
+ ```
83
+
84
+ ### 4. Generate Deployment Manifest
85
+
86
+ ```bash
87
+ aifabrix json hubspot-test --type external
88
+ ```
89
+
90
+ This creates `hubspot-test-deploy.json` in `integration/hubspot-test/`.
91
+
92
+ ### 5. Deploy
93
+
94
+ Controller URL and environment are read from config. Configure and log in first:
95
+
96
+ ```bash
97
+ aifabrix auth config --set-controller <url> --set-environment dev
98
+ aifabrix login
99
+ ```
100
+
101
+ Then deploy:
102
+
103
+ ```bash
104
+ aifabrix deploy hubspot-test
105
+ ```
106
+
107
+ ## Testing
108
+
109
+ ### Unit Tests (Local Validation, No API)
110
+
111
+ ```bash
112
+ aifabrix test hubspot-test
113
+ ```
114
+
115
+ ### Integration Tests (Via Dataplane)
116
+
117
+ ```bash
118
+ aifabrix test-integration hubspot-test
119
+ ```
120
+
121
+ ## Deployment
122
+
123
+ Deploy via miso-controller pipeline (same as regular apps). Auth and controller come from `aifabrix login` and `aifabrix auth config`:
124
+
125
+ ```bash
126
+ aifabrix deploy hubspot-test
127
+ ```
128
+
129
+ ## Wizard E2E tests (`test.js`)
130
+
131
+ Run positive wizard tests with:
132
+
133
+ ```bash
134
+ pnpm test:hubspot-wizard:positive
135
+ ```
136
+
137
+ If you see **"Invalid token or insufficient permissions"** or **"Failed to create wizard session"** even though `aifabrix auth status` shows connected, the dataplane may be configured to accept only **client credentials** for the wizard API, not device tokens.
138
+
139
+ **Option A – Use client credentials (recommended if dataplane requires them)**
140
+
141
+ 1. Get a **client ID** and **client secret** for an app that the dataplane accepts for wizard (e.g. from your admin or Miso/Keycloak for the environment).
142
+ 2. Put them in **`~/.aifabrix/secrets.local.yaml`** under keys that depend on the **app name in the wizard config**:
143
+ - For `wizard-hubspot-e2e.yaml` the app name is `wizard-e2e-e2e`, so use:
144
+ - `wizard-e2e-e2e-client-idKeyVault`: `<your client id>`
145
+ - `wizard-e2e-e2e-client-secretKeyVault`: `<your client secret>`
146
+ - If your platform uses a single “wizard” or “dataplane” app for all wizard runs, ask your admin for that app’s client ID/secret and the exact key names (they may be something like `dataplane-client-idKeyVault` / `dataplane-client-secretKeyVault`; the builder looks up `<appName>-client-idKeyVault` and `<appName>-client-secretKeyVault` where `appName` comes from the config file).
147
+ 3. **Optional fallback:** you can also set **`integration/hubspot-test/.env`** with `CLIENTID` and `CLIENTSECRET`; the test runner maps those to `HUBSPOT_CLIENT_ID` / `HUBSPOT_CLIENT_SECRET` for real-credential tests, and the token manager uses `CLIENTID`/`CLIENTSECRET` when no secrets file entry exists for the app.
148
+
149
+ **Option B – Use device token**
150
+
151
+ If the dataplane is configured to accept device tokens for the wizard API, ensure you are logged in with `aifabrix login` and that the controller URL and environment match (e.g. `dev`). No client credentials are needed.
152
+
153
+ ## Troubleshooting
154
+
155
+ - **Validation errors**: Run `aifabrix validate hubspot-test --type external` to see schema and manifest errors.
156
+ - **Deployment / auth**: Run `aifabrix auth config --set-controller <url> --set-environment <env>` and `aifabrix login` before `aifabrix deploy`.
157
+ - **File not found**: Run commands from the project root (where `package.json` and `integration/` live).
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "app": {
3
- "key": "hubspot",
3
+ "key": "hubspot-test",
4
4
  "displayName": "HubSpot CRM",
5
5
  "description": "HubSpot CRM integration with OpenAPI support for companies, contacts, and deals",
6
6
  "type": "external"
@@ -8,13 +8,13 @@
8
8
  "externalIntegration": {
9
9
  "schemaBasePath": "./",
10
10
  "systems": [
11
- "hubspot-system.json"
11
+ "hubspot-test-system.json"
12
12
  ],
13
13
  "dataSources": [
14
- "hubspot-datasource-company.json",
15
- "hubspot-datasource-contact.json",
16
- "hubspot-datasource-deal.json",
17
- "hubspot-datasource-users.json"
14
+ "hubspot-test-datasource-company.json",
15
+ "hubspot-test-datasource-contact.json",
16
+ "hubspot-test-datasource-deal.json",
17
+ "hubspot-test-datasource-users.json"
18
18
  ],
19
19
  "autopublish": true,
20
20
  "version": "1.0.0"
@@ -24,7 +24,7 @@ const execFileAsync = promisify(execFile);
24
24
  const DEFAULT_CONTROLLER_URL = process.env.CONTROLLER_URL || 'http://localhost:3110';
25
25
  const DEFAULT_ENVIRONMENT = process.env.ENVIRONMENT || 'miso';
26
26
  const DEFAULT_OPENAPI_FILE = process.env.HUBSPOT_OPENAPI_FILE ||
27
- path.join(process.cwd(), 'integration', 'hubspot', 'companies.json');
27
+ path.join(process.cwd(), 'integration', 'hubspot-test', 'companies.json');
28
28
 
29
29
  /**
30
30
  * Prints usage information
@@ -34,7 +34,7 @@ const DEFAULT_OPENAPI_FILE = process.env.HUBSPOT_OPENAPI_FILE ||
34
34
  function printUsage() {
35
35
  logger.log([
36
36
  'Usage:',
37
- ' node integration/hubspot/create-hubspot.js [options]',
37
+ ' node integration/hubspot-test/create-hubspot.js [options]',
38
38
  '',
39
39
  'Options:',
40
40
  ' --name <name> Application name (required)',
@@ -46,9 +46,9 @@ function printUsage() {
46
46
  ' --help Show this help message',
47
47
  '',
48
48
  'Examples:',
49
- ' node integration/hubspot/create-hubspot.js --name my-hubspot',
50
- ' node integration/hubspot/create-hubspot.js --name my-hubspot --output ~/my-project',
51
- ' node integration/hubspot/create-hubspot.js --name my-hubspot --openapi /path/to/openapi.json'
49
+ ' node integration/hubspot-test/create-hubspot.js --name my-hubspot',
50
+ ' node integration/hubspot-test/create-hubspot.js --name my-hubspot --output ~/my-project',
51
+ ' node integration/hubspot-test/create-hubspot.js --name my-hubspot --openapi /path/to/openapi.json'
52
52
  ].join('\n'));
53
53
  }
54
54
 
@@ -404,7 +404,7 @@ async function executeWizard(args) {
404
404
  args.controller,
405
405
  args.environment
406
406
  );
407
- logSuccess(`✓ Created config: ${configPath}`);
407
+ logSuccess(`✔ Created config: ${configPath}`);
408
408
 
409
409
  logInfo('\n2. Running wizard...');
410
410
  const wizardResult = await runWizard(configPath, args.controller, args.environment);
@@ -420,7 +420,7 @@ async function executeWizard(args) {
420
420
  throw new Error('Wizard execution failed');
421
421
  }
422
422
 
423
- logSuccess(' Wizard completed successfully');
423
+ logSuccess(' Wizard completed successfully');
424
424
  return configPath;
425
425
  }
426
426
 
@@ -444,7 +444,7 @@ async function processGeneratedFiles(args) {
444
444
  if (outputDir !== wizardOutputDir) {
445
445
  logInfo(`\n4. Copying files to: ${outputDir}`);
446
446
  const copiedFiles = await copyDirectoryContents(wizardOutputDir, outputDir);
447
- logSuccess(`✓ Copied ${copiedFiles.length} files`);
447
+ logSuccess(`✔ Copied ${copiedFiles.length} files`);
448
448
  } else {
449
449
  logInfo(`\n4. Files are in: ${outputDir}`);
450
450
  }
@@ -462,7 +462,7 @@ async function processGeneratedFiles(args) {
462
462
  * @returns {Promise<void>} Resolves when summary is printed
463
463
  */
464
464
  async function printSummary(outputDir, appName, environment) {
465
- logSuccess('\n HubSpot integration created successfully!');
465
+ logSuccess('\n HubSpot integration created successfully!');
466
466
  logger.log('\nGenerated files:');
467
467
  const files = await listFiles(outputDir);
468
468
  for (const file of files) {
@@ -490,7 +490,7 @@ async function cleanupFiles(configPath, wizardOutputDir, outputDir, keepWizardFi
490
490
  if (!keepWizardFiles && outputDir !== wizardOutputDir) {
491
491
  logInfo('\n5. Cleaning up wizard files...');
492
492
  await fs.rm(wizardOutputDir, { recursive: true, force: true });
493
- logSuccess(' Cleaned up wizard files');
493
+ logSuccess(' Cleaned up wizard files');
494
494
  }
495
495
 
496
496
  await fs.unlink(configPath).catch(() => {
@@ -0,0 +1,4 @@
1
+ HUBSPOT_API_VERSION=v3
2
+ MAX_PAGE_SIZE=100
3
+ KV_HUBSPOT_TEST_CLIENTID=kv://hubspot-test/clientId
4
+ KV_HUBSPOT_TEST_CLIENTSECRET=kv://hubspot-test/clientSecret
@@ -0,0 +1,138 @@
1
+ {
2
+ "key": "hubspot-test-company",
3
+ "displayName": "HubSpot Company",
4
+ "description": "HubSpot companies datasource with field mappings for CRM company data",
5
+ "systemKey": "hubspot-test",
6
+ "entityType": "recordStorage",
7
+ "resourceType": "customer",
8
+ "enabled": true,
9
+ "version": "1.0.0",
10
+ "primaryKey": [
11
+ "id"
12
+ ],
13
+ "labelKey": [
14
+ "name"
15
+ ],
16
+ "metadataSchema": {
17
+ "type": "object",
18
+ "required": [
19
+ "id",
20
+ "externalId",
21
+ "properties"
22
+ ],
23
+ "properties": {
24
+ "id": {
25
+ "type": "string",
26
+ "index": true
27
+ },
28
+ "externalId": {
29
+ "type": "string",
30
+ "index": true
31
+ },
32
+ "name": {
33
+ "type": "string",
34
+ "filter": true
35
+ },
36
+ "properties": {
37
+ "type": "object",
38
+ "additionalProperties": true
39
+ }
40
+ }
41
+ },
42
+ "dimensions": {
43
+ "country": {
44
+ "type": "local",
45
+ "field": "country"
46
+ },
47
+ "domain": {
48
+ "type": "local",
49
+ "field": "domain"
50
+ }
51
+ },
52
+ "fieldMappings": {
53
+ "attributes": {
54
+ "id": {
55
+ "expression": "{{raw.id}}"
56
+ },
57
+ "externalId": {
58
+ "expression": "{{raw.id}}"
59
+ },
60
+ "name": {
61
+ "expression": "{{raw.properties.name.value}} | trim"
62
+ },
63
+ "domain": {
64
+ "expression": "{{raw.properties.domain.value}} | toLower | trim"
65
+ },
66
+ "country": {
67
+ "expression": "{{raw.properties.country.value}} | toUpper | trim"
68
+ },
69
+ "city": {
70
+ "expression": "{{raw.properties.city.value}} | trim"
71
+ },
72
+ "industry": {
73
+ "expression": "{{raw.properties.industry.value}} | trim"
74
+ },
75
+ "website": {
76
+ "expression": "{{raw.properties.website.value}} | trim"
77
+ },
78
+ "phone": {
79
+ "expression": "{{raw.properties.phone.value}} | trim"
80
+ },
81
+ "createdAt": {
82
+ "expression": "{{raw.properties.createdate.value}}"
83
+ },
84
+ "updatedAt": {
85
+ "expression": "{{raw.properties.hs_lastmodifieddate.value}}"
86
+ }
87
+ }
88
+ },
89
+ "exposed": {
90
+ "description": "Exposed fields for HubSpot companies",
91
+ "schema": {
92
+ "id": "metadata.id",
93
+ "externalId": "metadata.externalId",
94
+ "name": "metadata.name",
95
+ "domain": "metadata.domain",
96
+ "country": "metadata.country",
97
+ "city": "metadata.city",
98
+ "industry": "metadata.industry",
99
+ "website": "metadata.website",
100
+ "phone": "metadata.phone",
101
+ "createdAt": "metadata.createdAt",
102
+ "updatedAt": "metadata.updatedAt"
103
+ }
104
+ },
105
+ "openapi": {
106
+ "enabled": true,
107
+ "documentKey": "hubspot-v3",
108
+ "baseUrl": "https://api.hubapi.com",
109
+ "operations": {
110
+ "list": {
111
+ "operationId": "getCompanies",
112
+ "method": "GET",
113
+ "path": "/crm/v3/objects/companies"
114
+ },
115
+ "get": {
116
+ "operationId": "getCompany",
117
+ "method": "GET",
118
+ "path": "/crm/v3/objects/companies/{companyId}"
119
+ },
120
+ "create": {
121
+ "operationId": "createCompany",
122
+ "method": "POST",
123
+ "path": "/crm/v3/objects/companies"
124
+ },
125
+ "update": {
126
+ "operationId": "updateCompany",
127
+ "method": "PATCH",
128
+ "path": "/crm/v3/objects/companies/{companyId}"
129
+ },
130
+ "delete": {
131
+ "operationId": "deleteCompany",
132
+ "method": "DELETE",
133
+ "path": "/crm/v3/objects/companies/{companyId}"
134
+ }
135
+ },
136
+ "autoRbac": true
137
+ }
138
+ }
@@ -0,0 +1,146 @@
1
+ {
2
+ "key": "hubspot-test-contact",
3
+ "displayName": "HubSpot Contact",
4
+ "description": "HubSpot contacts datasource with field mappings for CRM contact data",
5
+ "systemKey": "hubspot-test",
6
+ "entityType": "recordStorage",
7
+ "resourceType": "contact",
8
+ "enabled": true,
9
+ "version": "1.0.0",
10
+ "primaryKey": [
11
+ "id"
12
+ ],
13
+ "labelKey": [
14
+ "email"
15
+ ],
16
+ "metadataSchema": {
17
+ "type": "object",
18
+ "required": [
19
+ "id",
20
+ "externalId",
21
+ "properties"
22
+ ],
23
+ "properties": {
24
+ "id": {
25
+ "type": "string",
26
+ "index": true
27
+ },
28
+ "externalId": {
29
+ "type": "string",
30
+ "index": true
31
+ },
32
+ "email": {
33
+ "type": "string",
34
+ "filter": true
35
+ },
36
+ "properties": {
37
+ "type": "object",
38
+ "additionalProperties": true
39
+ }
40
+ }
41
+ },
42
+ "dimensions": {
43
+ "email": {
44
+ "type": "local",
45
+ "field": "email"
46
+ },
47
+ "country": {
48
+ "type": "local",
49
+ "field": "country"
50
+ }
51
+ },
52
+ "fieldMappings": {
53
+ "attributes": {
54
+ "id": {
55
+ "expression": "{{raw.id}}"
56
+ },
57
+ "externalId": {
58
+ "expression": "{{raw.id}}"
59
+ },
60
+ "firstName": {
61
+ "expression": "{{raw.properties.firstname.value}} | trim"
62
+ },
63
+ "lastName": {
64
+ "expression": "{{raw.properties.lastname.value}} | trim"
65
+ },
66
+ "email": {
67
+ "expression": "{{raw.properties.email.value}} | trim"
68
+ },
69
+ "phone": {
70
+ "expression": "{{raw.properties.phone.value}} | trim"
71
+ },
72
+ "company": {
73
+ "expression": "{{raw.properties.company.value}} | trim"
74
+ },
75
+ "jobTitle": {
76
+ "expression": "{{raw.properties.jobtitle.value}} | trim"
77
+ },
78
+ "address": {
79
+ "expression": "{{raw.properties.address.value}} | trim"
80
+ },
81
+ "city": {
82
+ "expression": "{{raw.properties.city.value}} | trim"
83
+ },
84
+ "country": {
85
+ "expression": "{{raw.properties.country.value}} | toUpper | trim"
86
+ },
87
+ "createdAt": {
88
+ "expression": "{{raw.properties.createdate.value}}"
89
+ },
90
+ "updatedAt": {
91
+ "expression": "{{raw.properties.hs_lastmodifieddate.value}}"
92
+ }
93
+ }
94
+ },
95
+ "exposed": {
96
+ "description": "Exposed fields for HubSpot contacts",
97
+ "schema": {
98
+ "id": "metadata.id",
99
+ "externalId": "metadata.externalId",
100
+ "firstName": "metadata.firstName",
101
+ "lastName": "metadata.lastName",
102
+ "email": "metadata.email",
103
+ "phone": "metadata.phone",
104
+ "company": "metadata.company",
105
+ "jobTitle": "metadata.jobTitle",
106
+ "address": "metadata.address",
107
+ "city": "metadata.city",
108
+ "country": "metadata.country",
109
+ "createdAt": "metadata.createdAt",
110
+ "updatedAt": "metadata.updatedAt"
111
+ }
112
+ },
113
+ "openapi": {
114
+ "enabled": true,
115
+ "documentKey": "hubspot-v3",
116
+ "baseUrl": "https://api.hubapi.com",
117
+ "operations": {
118
+ "list": {
119
+ "operationId": "getContacts",
120
+ "method": "GET",
121
+ "path": "/crm/v3/objects/contacts"
122
+ },
123
+ "get": {
124
+ "operationId": "getContact",
125
+ "method": "GET",
126
+ "path": "/crm/v3/objects/contacts/{contactId}"
127
+ },
128
+ "create": {
129
+ "operationId": "createContact",
130
+ "method": "POST",
131
+ "path": "/crm/v3/objects/contacts"
132
+ },
133
+ "update": {
134
+ "operationId": "updateContact",
135
+ "method": "PATCH",
136
+ "path": "/crm/v3/objects/contacts/{contactId}"
137
+ },
138
+ "delete": {
139
+ "operationId": "deleteContact",
140
+ "method": "DELETE",
141
+ "path": "/crm/v3/objects/contacts/{contactId}"
142
+ }
143
+ },
144
+ "autoRbac": true
145
+ }
146
+ }