@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.
- package/.cursor/rules/anchor-docs.mdc +15 -0
- package/README.md +2 -2
- package/anchor-docs/README.md +10 -0
- package/anchor-docs/_TEMPLATE +24 -0
- package/bin/aifabrix.js +13 -4
- package/integration/hubspot-test/README.md +157 -0
- package/integration/{hubspot → hubspot-test}/application.json +6 -6
- package/integration/{hubspot → hubspot-test}/create-hubspot.js +10 -10
- package/integration/hubspot-test/env.template +4 -0
- package/integration/hubspot-test/hubspot-test-datasource-company.json +138 -0
- package/integration/hubspot-test/hubspot-test-datasource-contact.json +146 -0
- package/integration/hubspot-test/hubspot-test-datasource-deal.json +146 -0
- package/integration/hubspot-test/hubspot-test-datasource-users.json +76 -0
- package/integration/{hubspot/hubspot-deploy.json → hubspot-test/hubspot-test-deploy.json} +201 -24
- package/integration/{hubspot/hubspot-system.json → hubspot-test/hubspot-test-system.json} +8 -7
- package/integration/hubspot-test/rbac.json +166 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-hubspot-credential-real.yaml +3 -3
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-hubspot-env-vars.yaml +2 -2
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-add-datasource.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-credential-create.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-credential-select.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-known-platform.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-source.yaml +2 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-mode.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-openapi-file.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-openapi-url.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-source.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-dimension-array-test.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-key-test.yaml +5 -0
- package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-path-test.yaml +5 -0
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-dimension-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-rbac-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-valid-for-rbac-yaml-test.yaml +1 -1
- package/integration/{hubspot → hubspot-test}/test-dataplane-down-tests.js +1 -7
- package/integration/{hubspot → hubspot-test}/test-dataplane-down.js +3 -3
- package/integration/{hubspot → hubspot-test}/test.js +137 -102
- package/integration/{hubspot → hubspot-test}/wizard-hubspot-e2e.yaml +2 -2
- package/integration/{hubspot → hubspot-test}/wizard-hubspot-platform.yaml +1 -1
- package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
- package/integration/roundtrip-test-local/README.md +144 -0
- package/integration/roundtrip-test-local/application.yaml +13 -0
- package/integration/roundtrip-test-local/env.template +15 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
- package/integration/roundtrip-test-local2/README.md +144 -0
- package/integration/roundtrip-test-local2/application.yaml +13 -0
- package/integration/roundtrip-test-local2/env.template +15 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
- package/integration/test/wizard.yaml +8 -0
- package/jest.config.default.js +10 -0
- package/jest.config.integration.fixtures.js +22 -0
- package/jest.config.integration.js +21 -18
- package/jest.config.isolated.js +10 -0
- package/jest.projects.js +288 -0
- package/lib/api/datasources-core.api.js +3 -3
- package/lib/api/dev-mtls-request.js +110 -0
- package/lib/api/dev-server-https.js +145 -0
- package/lib/api/dev.api.js +133 -144
- package/lib/api/index.js +0 -1
- package/lib/api/pipeline.api.js +67 -20
- package/lib/api/service-users.api.js +111 -2
- package/lib/api/types/dev.types.js +4 -3
- package/lib/api/types/pipeline.types.js +8 -5
- package/lib/api/types/service-users.types.js +41 -0
- package/lib/api/types/validation-run.types.js +56 -0
- package/lib/api/validation-run.api.js +99 -0
- package/lib/api/validation-runner.js +99 -0
- package/lib/app/config.js +1 -1
- package/lib/app/deploy-status-display.js +2 -2
- package/lib/app/deploy.js +7 -6
- package/lib/app/display.js +2 -1
- package/lib/app/dockerfile.js +3 -2
- package/lib/app/down.js +2 -1
- package/lib/app/helpers.js +6 -5
- package/lib/app/index.js +27 -8
- package/lib/app/list.js +7 -6
- package/lib/app/push.js +4 -3
- package/lib/app/register.js +19 -8
- package/lib/app/rotate-secret.js +17 -13
- package/lib/app/run-container-start.js +184 -0
- package/lib/app/run-docker-fallback.js +108 -0
- package/lib/app/run-env-compose.js +30 -42
- package/lib/app/run-helpers.js +49 -126
- package/lib/app/run-infra-requirements.js +30 -0
- package/lib/app/run-resolve-image.js +21 -0
- package/lib/app/run.js +74 -21
- package/lib/app/show-display.js +1 -1
- package/lib/app/show.js +1 -1
- package/lib/build/index.js +13 -10
- package/lib/cli/index.js +2 -0
- package/lib/cli/setup-app.help.js +67 -0
- package/lib/cli/setup-app.js +59 -123
- package/lib/cli/setup-app.test-commands.js +179 -0
- package/lib/cli/setup-auth.js +36 -14
- package/lib/cli/setup-credential-deployment.js +22 -8
- package/lib/cli/setup-dev-path-commands.js +124 -0
- package/lib/cli/setup-dev.js +190 -103
- package/lib/cli/setup-environment.js +11 -20
- package/lib/cli/setup-external-system.js +62 -22
- package/lib/cli/setup-infra.js +139 -47
- package/lib/cli/setup-parameters.js +32 -0
- package/lib/cli/setup-secrets.js +147 -10
- package/lib/cli/setup-service-user.js +146 -20
- package/lib/cli/setup-utility.js +47 -19
- package/lib/commands/app-down.js +5 -7
- package/lib/commands/app-install.js +14 -7
- package/lib/commands/app-logs.js +13 -10
- package/lib/commands/app-shell.js +4 -1
- package/lib/commands/app-test.js +25 -19
- package/lib/commands/app.js +22 -10
- package/lib/commands/auth-config.js +10 -14
- package/lib/commands/auth-status.js +4 -3
- package/lib/commands/credential-env.js +4 -3
- package/lib/commands/credential-list.js +5 -4
- package/lib/commands/credential-push.js +4 -3
- package/lib/commands/datasource-unified-test-cli.js +495 -0
- package/lib/commands/datasource-unified-test-cli.options.js +149 -0
- package/lib/commands/datasource-validation-cli.js +129 -0
- package/lib/commands/datasource.js +123 -71
- package/lib/commands/deployment-list.js +6 -5
- package/lib/commands/dev-cli-handlers.js +122 -18
- package/lib/commands/dev-down.js +4 -3
- package/lib/commands/dev-init.js +231 -116
- package/lib/commands/dev-show-display.js +473 -0
- package/lib/commands/login-credentials.js +3 -2
- package/lib/commands/login-device.js +4 -3
- package/lib/commands/login.js +5 -4
- package/lib/commands/logout.js +8 -7
- package/lib/commands/parameters-validate.js +54 -0
- package/lib/commands/repair-datasource.js +314 -68
- package/lib/commands/repair-env-template.js +16 -10
- package/lib/commands/repair-rbac.js +25 -19
- package/lib/commands/repair.js +116 -32
- package/lib/commands/secrets-list.js +23 -12
- package/lib/commands/secrets-remove-all.js +220 -0
- package/lib/commands/secrets-remove.js +22 -13
- package/lib/commands/secrets-set.js +21 -12
- package/lib/commands/secrets-validate.js +20 -7
- package/lib/commands/secure.js +10 -9
- package/lib/commands/service-user.js +243 -13
- package/lib/commands/test-e2e-external.js +27 -1
- package/lib/commands/up-common.js +28 -2
- package/lib/commands/up-dataplane.js +31 -18
- package/lib/commands/up-miso.js +19 -29
- package/lib/commands/upload.js +138 -39
- package/lib/commands/wizard-core-helpers.js +1 -1
- package/lib/commands/wizard-dataplane.js +4 -3
- package/lib/commands/wizard-helpers.js +3 -3
- package/lib/commands/wizard.js +2 -2
- package/lib/core/admin-secrets.js +16 -5
- package/lib/core/audit-logger.js +12 -4
- package/lib/core/config-attach-extensions.js +46 -0
- package/lib/core/config-runtime-paths.js +29 -0
- package/lib/core/config.js +59 -58
- package/lib/core/diff.js +3 -2
- package/lib/core/ensure-encryption-key.js +2 -4
- package/lib/core/secrets-ensure-infra.js +77 -0
- package/lib/core/secrets-ensure.js +120 -64
- package/lib/core/secrets-env-write.js +35 -7
- package/lib/core/secrets-infra-placeholder-sync.js +61 -0
- package/lib/core/secrets.js +228 -42
- package/lib/core/templates-env.js +4 -3
- package/lib/core/templates.js +1 -1
- package/lib/datasource/abac-validator.js +148 -0
- package/lib/datasource/deploy.js +75 -53
- package/lib/datasource/field-reference-validator.js +77 -36
- package/lib/datasource/integration-context.js +63 -0
- package/lib/datasource/list.js +8 -7
- package/lib/datasource/log-viewer.js +252 -0
- package/lib/datasource/resolve-app.js +109 -0
- package/lib/datasource/test-e2e.js +95 -155
- package/lib/datasource/test-integration.js +121 -109
- package/lib/datasource/unified-validation-run-body.js +65 -0
- package/lib/datasource/unified-validation-run-post.js +23 -0
- package/lib/datasource/unified-validation-run-resolve.js +43 -0
- package/lib/datasource/unified-validation-run.js +92 -0
- package/lib/datasource/validate.js +162 -15
- package/lib/deployment/deployer.js +4 -3
- package/lib/deployment/environment.js +7 -6
- package/lib/deployment/push.js +17 -8
- package/lib/external-system/delete.js +4 -3
- package/lib/external-system/deploy.js +131 -53
- package/lib/external-system/download-helpers.js +1 -1
- package/lib/external-system/download.js +7 -6
- package/lib/external-system/generator.js +104 -14
- package/lib/external-system/integration-test-dispatch.js +26 -0
- package/lib/external-system/test-execution.js +5 -1
- package/lib/external-system/test-helpers.js +0 -4
- package/lib/external-system/test-system-level-helpers.js +110 -0
- package/lib/external-system/test-system-level.js +83 -44
- package/lib/external-system/test.js +59 -8
- package/lib/generator/builders.js +23 -11
- package/lib/generator/deploy-manifest-azure-kv.js +81 -0
- package/lib/generator/external-controller-manifest.js +3 -3
- package/lib/generator/external.js +23 -11
- package/lib/generator/helpers.js +71 -12
- package/lib/generator/index.js +8 -4
- package/lib/generator/split-readme.js +12 -7
- package/lib/generator/split-variables.js +2 -1
- package/lib/generator/split.js +46 -11
- package/lib/generator/wizard-readme.js +3 -3
- package/lib/generator/wizard.js +16 -13
- package/lib/infrastructure/compose.js +60 -6
- package/lib/infrastructure/helpers.js +238 -51
- package/lib/infrastructure/index.js +64 -37
- package/lib/infrastructure/services.js +21 -15
- package/lib/internal/fs-real-sync.js +104 -0
- package/lib/internal/node-fs.js +98 -0
- package/lib/parameters/database-secret-values.js +173 -0
- package/lib/parameters/infra-kv-discovery.js +121 -0
- package/lib/parameters/infra-parameter-catalog.js +458 -0
- package/lib/parameters/infra-parameter-validate.js +64 -0
- package/lib/schema/application-schema.json +37 -17
- package/lib/schema/datasource-test-run.schema.json +493 -0
- package/lib/schema/deployment-rules.yaml +102 -63
- package/lib/schema/external-datasource.schema.json +1201 -433
- package/lib/schema/external-system.schema.json +181 -5
- package/lib/schema/flag-map-validation-run.json +31 -0
- package/lib/schema/infra-parameter.schema.json +106 -0
- package/lib/schema/infra.parameter.yaml +421 -0
- package/lib/schema/type/credential-auth-templates.json +40 -0
- package/lib/schema/type/document-storage.json +213 -0
- package/lib/schema/type/message-service.json +123 -0
- package/lib/schema/type/vector-store.json +88 -0
- package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
- package/lib/utils/api-error-handler.js +2 -2
- package/lib/utils/api.js +49 -14
- package/lib/utils/app-config-resolver.js +23 -1
- package/lib/utils/app-register-api.js +3 -2
- package/lib/utils/app-register-auth.js +1 -1
- package/lib/utils/app-register-config.js +4 -4
- package/lib/utils/app-register-display.js +3 -2
- package/lib/utils/app-register-validator.js +3 -2
- package/lib/utils/app-run-containers.js +26 -22
- package/lib/utils/app-scoped-config.js +31 -0
- package/lib/utils/app-service-env-from-builder.js +164 -0
- package/lib/utils/build-copy.js +1 -1
- package/lib/utils/build-helpers.js +20 -20
- package/lib/utils/build-resolve-image.js +165 -0
- package/lib/utils/cli-layout-chalk.js +8 -0
- package/lib/utils/cli-test-layout-chalk.js +267 -0
- package/lib/utils/cli-utils.js +88 -11
- package/lib/utils/compose-db-passwords.js +138 -0
- package/lib/utils/compose-generate-docker-compose.js +216 -0
- package/lib/utils/compose-generator.js +197 -291
- package/lib/utils/compose-miso-env.js +18 -0
- package/lib/utils/compose-traefik-ingress-base.js +158 -0
- package/lib/utils/config-paths.js +209 -6
- package/lib/utils/config-scoped-resources-preference.js +41 -0
- package/lib/utils/controller-deployment-outcome.js +68 -0
- package/lib/utils/credential-display.js +2 -2
- package/lib/utils/credential-secrets-env.js +16 -1
- package/lib/utils/dataplane-pipeline-warning.js +4 -3
- package/lib/utils/datasource-test-run-capability-scope.js +43 -0
- package/lib/utils/datasource-test-run-debug-display.js +137 -0
- package/lib/utils/datasource-test-run-debug-slice.js +93 -0
- package/lib/utils/datasource-test-run-display.js +442 -0
- package/lib/utils/datasource-test-run-exit.js +58 -0
- package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
- package/lib/utils/datasource-test-run-report-version.js +51 -0
- package/lib/utils/datasource-test-run-schema-sync.js +59 -0
- package/lib/utils/datasource-test-run-tty-log.js +81 -0
- package/lib/utils/datasource-validation-watch.js +266 -0
- package/lib/utils/declarative-url-ports.js +47 -0
- package/lib/utils/derive-env-key-from-client-id.js +41 -0
- package/lib/utils/dev-ca-install.js +185 -23
- package/lib/utils/dev-cert-helper.js +266 -17
- package/lib/utils/dev-hosts-helper.js +307 -0
- package/lib/utils/dev-init-cert-hints.js +37 -0
- package/lib/utils/dev-init-health-messages.js +52 -0
- package/lib/utils/dev-init-resolve.js +86 -0
- package/lib/utils/dev-init-ssh-merge.js +65 -0
- package/lib/utils/dev-ssh-config-helper.js +196 -0
- package/lib/utils/dev-user-groups.js +93 -0
- package/lib/utils/docker-build.js +42 -17
- package/lib/utils/docker-exec.js +28 -0
- package/lib/utils/docker-manifest-public-port.js +116 -0
- package/lib/utils/docker-not-running-hint.js +52 -0
- package/lib/utils/docker.js +98 -11
- package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
- package/lib/utils/env-config-loader.js +10 -91
- package/lib/utils/env-copy.js +19 -10
- package/lib/utils/env-map.js +42 -11
- package/lib/utils/env-template.js +2 -2
- package/lib/utils/environment-scoped-resources.js +144 -0
- package/lib/utils/error-formatter.js +125 -9
- package/lib/utils/error-formatters/http-status-errors.js +6 -5
- package/lib/utils/error-formatters/network-errors.js +2 -1
- package/lib/utils/error-formatters/permission-errors.js +2 -1
- package/lib/utils/error-formatters/validation-errors.js +2 -1
- package/lib/utils/external-env-template.js +180 -0
- package/lib/utils/external-readme.js +8 -1
- package/lib/utils/external-system-display.js +277 -136
- package/lib/utils/external-system-local-test-tty.js +389 -0
- package/lib/utils/external-system-readiness-core.js +377 -0
- package/lib/utils/external-system-readiness-deploy-display.js +270 -0
- package/lib/utils/external-system-readiness-display-internals.js +150 -0
- package/lib/utils/external-system-readiness-display.js +186 -0
- package/lib/utils/external-system-test-helpers.js +24 -6
- package/lib/utils/external-system-validators.js +32 -14
- package/lib/utils/health-check-url.js +119 -0
- package/lib/utils/health-check.js +59 -25
- package/lib/utils/help-builder.js +14 -13
- package/lib/utils/image-version.js +4 -8
- package/lib/utils/infra-containers.js +4 -7
- package/lib/utils/infra-env-defaults.js +162 -0
- package/lib/utils/infra-status-display.js +167 -0
- package/lib/utils/infra-status.js +16 -8
- package/lib/utils/local-secrets.js +29 -7
- package/lib/utils/paths.js +136 -48
- package/lib/utils/port-resolver.js +10 -23
- package/lib/utils/redis-env-scope.js +62 -0
- package/lib/utils/register-aifabrix-shell-env.js +204 -0
- package/lib/utils/remote-builder-validation.js +99 -0
- package/lib/utils/remote-dev-auth.js +117 -21
- package/lib/utils/remote-docker-env.js +67 -15
- package/lib/utils/remote-secrets-loader.js +13 -4
- package/lib/utils/resolve-docker-image-ref.js +124 -0
- package/lib/utils/schema-loader.js +22 -9
- package/lib/utils/secrets-bash-kv.js +25 -0
- package/lib/utils/secrets-generator.js +171 -51
- package/lib/utils/secrets-helpers.js +70 -59
- package/lib/utils/secrets-kv-scope.js +60 -0
- package/lib/utils/secrets-utils.js +35 -37
- package/lib/utils/secrets-validation.js +3 -1
- package/lib/utils/secrets-yaml-preserve.js +109 -0
- package/lib/utils/secure-file-permissions.js +91 -0
- package/lib/utils/ssh-key-helper.js +4 -2
- package/lib/utils/template-helpers.js +2 -2
- package/lib/utils/test-log-writer.js +3 -3
- package/lib/utils/token-manager.js +37 -5
- package/lib/utils/url-declarative-public-base.js +188 -0
- package/lib/utils/url-declarative-resolve-build.js +493 -0
- package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
- package/lib/utils/url-declarative-resolve.js +220 -0
- package/lib/utils/url-declarative-token-parse.js +74 -0
- package/lib/utils/url-declarative-url-flags.js +50 -0
- package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
- package/lib/utils/url-public-path-prefix.js +34 -0
- package/lib/utils/urls-local-registry.js +220 -0
- package/lib/utils/validation-report-tty-kit.js +77 -0
- package/lib/utils/validation-run-poll.js +89 -0
- package/lib/utils/validation-run-post-retry.js +73 -0
- package/lib/utils/validation-run-request.js +98 -0
- package/lib/utils/variable-transformer.js +21 -4
- package/lib/utils/yaml-preserve.js +78 -1
- package/lib/validation/datasource-warnings.js +56 -0
- package/lib/validation/env-template-auth.js +50 -2
- package/lib/validation/external-manifest-validator.js +35 -7
- package/lib/validation/validate-display.js +37 -31
- package/lib/validation/validate.js +9 -10
- package/lib/validation/validator-unresolved-placeholders.js +98 -0
- package/lib/validation/validator.js +32 -78
- package/lib/validation/wizard-config-validator.js +2 -1
- package/package.json +11 -3
- package/scripts/check-datasource-test-run-schema-sync.js +34 -0
- package/scripts/diagnose-cli.js +150 -0
- package/scripts/install-local.js +304 -55
- package/templates/README.md +15 -2
- package/templates/applications/dataplane/application.yaml +52 -2
- package/templates/applications/dataplane/env.template +80 -18
- package/templates/applications/dataplane/rbac.yaml +8 -0
- package/templates/applications/keycloak/application.yaml +9 -1
- package/templates/applications/keycloak/env.template +15 -6
- package/templates/applications/miso-controller/application.yaml +10 -2
- package/templates/applications/miso-controller/env.template +55 -14
- package/templates/applications/miso-controller/rbac.yaml +5 -0
- package/templates/external-system/README.md.hbs +20 -7
- package/templates/external-system/deploy.js.hbs +5 -5
- package/templates/external-system/env.template.hbs +22 -0
- package/templates/external-system/external-datasource.yaml.hbs +197 -118
- package/templates/infra/compose.yaml.hbs +20 -4
- package/templates/python/docker-compose.hbs +16 -0
- package/templates/typescript/docker-compose.hbs +16 -0
- package/integration/hubspot/README.md +0 -102
- package/integration/hubspot/env.template +0 -4
- package/integration/hubspot/hubspot-datasource-company.json +0 -541
- package/integration/hubspot/hubspot-datasource-contact.json +0 -639
- package/integration/hubspot/hubspot-datasource-deal.json +0 -588
- package/integration/hubspot/hubspot-datasource-users.json +0 -116
- package/integration/hubspot/test-artifacts/wizard-invalid-missing-source.yaml +0 -2
- package/integration/hubspot/test-artifacts/wizard-valid-for-dimension-key-test.yaml +0 -5
- package/integration/hubspot/test-artifacts/wizard-valid-for-dimension-path-test.yaml +0 -5
- package/lib/api/external-test.api.js +0 -111
- package/lib/schema/env-config.yaml +0 -43
- /package/integration/{hubspot → hubspot-test}/companies.json +0 -0
- /package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-app-name.yaml +0 -0
- /package/integration/{hubspot → hubspot-test}/test-artifacts/wizard-invalid-missing-app.yaml +0 -0
- /package/integration/{hubspot → hubspot-test}/test-dataplane-down-helpers.js +0 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Structured TTY report for local external `aifabrix test` (no DatasourceTestRun envelope).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const chalk = require('chalk');
|
|
8
|
+
const logger = require('./logger');
|
|
9
|
+
const {
|
|
10
|
+
SEP,
|
|
11
|
+
statusGlyph,
|
|
12
|
+
verdictLineLocalExternalTest,
|
|
13
|
+
readinessLineFromAggregateStatus,
|
|
14
|
+
formatDataQualityLines,
|
|
15
|
+
pushSeparatorBlock
|
|
16
|
+
} = require('./validation-report-tty-kit');
|
|
17
|
+
const {
|
|
18
|
+
sectionTitle,
|
|
19
|
+
headerKeyValue,
|
|
20
|
+
formatStatusKeyValue,
|
|
21
|
+
colorRollupPrefixedLine,
|
|
22
|
+
metadata: metaGray
|
|
23
|
+
} = require('./cli-test-layout-chalk');
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @param {Object} results
|
|
27
|
+
* @returns {'ok'|'warn'|'fail'}
|
|
28
|
+
*/
|
|
29
|
+
function deriveRootStatus(results) {
|
|
30
|
+
if (!results.valid || (results.errors && results.errors.length > 0)) {
|
|
31
|
+
return 'fail';
|
|
32
|
+
}
|
|
33
|
+
const dsWarn = (results.datasourceResults || []).some(r => r.warnings && r.warnings.length > 0);
|
|
34
|
+
if ((results.warnings && results.warnings.length > 0) || dsWarn) {
|
|
35
|
+
return 'warn';
|
|
36
|
+
}
|
|
37
|
+
return 'ok';
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @param {Object} results
|
|
42
|
+
* @returns {{ schema: 'ok'|'warn'|'fail', consistency: 'ok'|'warn'|'fail', reliability: 'ok'|'warn'|'fail' }}
|
|
43
|
+
*/
|
|
44
|
+
function deriveDataQualityRollups(results) {
|
|
45
|
+
const systemsOk = (results.systemResults || []).every(s => s.valid);
|
|
46
|
+
const ds = results.datasourceResults || [];
|
|
47
|
+
const structuralOk = ds.length === 0 || ds.every(r => r.structuralValid !== false);
|
|
48
|
+
|
|
49
|
+
let schema = 'ok';
|
|
50
|
+
if (!systemsOk || !structuralOk) {
|
|
51
|
+
schema = 'fail';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const ranPayload = ds.filter(r => r.payloadTestsRan === true);
|
|
55
|
+
const skippedPayload = ds.filter(r => r.payloadTestsRan !== true);
|
|
56
|
+
let consistency = 'ok';
|
|
57
|
+
if (ranPayload.some(r => r.payloadTestsOk === false)) {
|
|
58
|
+
consistency = 'fail';
|
|
59
|
+
} else if (skippedPayload.length > 0) {
|
|
60
|
+
consistency = skippedPayload.length === ds.length ? 'warn' : 'warn';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const reliability = 'warn';
|
|
64
|
+
|
|
65
|
+
return { schema, consistency, reliability };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @param {Object} results
|
|
70
|
+
* @returns {Array<{ label: string, message: string }>}
|
|
71
|
+
*/
|
|
72
|
+
function collectFailureItems(results) {
|
|
73
|
+
const out = [];
|
|
74
|
+
for (const e of results.errors || []) {
|
|
75
|
+
out.push({ label: 'manifest', message: String(e) });
|
|
76
|
+
}
|
|
77
|
+
for (const s of results.systemResults || []) {
|
|
78
|
+
for (const err of s.errors || []) {
|
|
79
|
+
out.push({ label: s.file || 'system', message: String(err) });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (const d of results.datasourceResults || []) {
|
|
83
|
+
for (const err of d.errors || []) {
|
|
84
|
+
out.push({ label: d.key || d.file || 'datasource', message: String(err) });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @param {Array<{ label: string, message: string }>} failures
|
|
92
|
+
* @param {number} max
|
|
93
|
+
* @returns {string[]}
|
|
94
|
+
*/
|
|
95
|
+
function formatDeductionLines(failures, max) {
|
|
96
|
+
if (failures.length === 0) return [];
|
|
97
|
+
const lines = ['Deductions:'];
|
|
98
|
+
const cap = Math.min(max, failures.length);
|
|
99
|
+
for (let i = 0; i < cap; i += 1) {
|
|
100
|
+
const f = failures[i];
|
|
101
|
+
lines.push(`- [${f.label}] ${f.message}`);
|
|
102
|
+
}
|
|
103
|
+
return lines;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* @param {Object} results
|
|
108
|
+
* @param {Array<{ label: string, message: string }>} failures
|
|
109
|
+
* @returns {string[]}
|
|
110
|
+
*/
|
|
111
|
+
function formatNextActionLines(results, failures) {
|
|
112
|
+
const lines = ['Next actions:'];
|
|
113
|
+
if (failures.length > 0) {
|
|
114
|
+
lines.push('- Fix Failures above, then re-run `aifabrix test`.');
|
|
115
|
+
lines.push('- Run `aifabrix test-integration` to validate against the dataplane when manifests are clean.');
|
|
116
|
+
return lines;
|
|
117
|
+
}
|
|
118
|
+
if ((results.warnings || []).length > 0) {
|
|
119
|
+
lines.push('- Review warnings; add testPayload where missing for deeper local checks.');
|
|
120
|
+
} else {
|
|
121
|
+
lines.push('- Proceed to `aifabrix test-integration` or deploy when ready.');
|
|
122
|
+
}
|
|
123
|
+
return lines;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function appendLocalDataQualitySection(lines, dq, failures, status) {
|
|
127
|
+
lines.push('Data Quality:');
|
|
128
|
+
formatDataQualityLines(dq, {
|
|
129
|
+
schema: 'structural JSON and system/datasource schema checks.',
|
|
130
|
+
consistency: 'field mappings and metadata schema (where testPayload is present).',
|
|
131
|
+
reliability: 'live API/connectivity not exercised in this command.'
|
|
132
|
+
}).forEach(l => lines.push(l));
|
|
133
|
+
lines.push('');
|
|
134
|
+
if (failures.length > 0) {
|
|
135
|
+
lines.push(...formatDeductionLines(failures, 3));
|
|
136
|
+
lines.push('');
|
|
137
|
+
}
|
|
138
|
+
lines.push(readinessLineFromAggregateStatus(status));
|
|
139
|
+
lines.push('');
|
|
140
|
+
lines.push(SEP);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function appendLocalFailureDetailSections(lines, failures) {
|
|
144
|
+
if (failures.length === 0) return;
|
|
145
|
+
pushSeparatorBlock(lines);
|
|
146
|
+
lines.push('Failures:');
|
|
147
|
+
for (const f of failures) {
|
|
148
|
+
lines.push('');
|
|
149
|
+
lines.push(`${f.label}:`);
|
|
150
|
+
lines.push(`- ${f.message}`);
|
|
151
|
+
}
|
|
152
|
+
pushSeparatorBlock(lines);
|
|
153
|
+
lines.push('Impact:');
|
|
154
|
+
lines.push(`- ${failures.length} blocking issue(s) must be resolved before integration test or deploy.`);
|
|
155
|
+
pushSeparatorBlock(lines);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function appendLocalTrailingSections(lines, results, failures) {
|
|
159
|
+
lines.push('');
|
|
160
|
+
lines.push(...formatNextActionLines(results, failures));
|
|
161
|
+
if ((results.warnings || []).length === 0) return;
|
|
162
|
+
lines.push('');
|
|
163
|
+
lines.push('Other warnings:');
|
|
164
|
+
for (const w of results.warnings) {
|
|
165
|
+
lines.push(`- ${w}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* @param {Object} results
|
|
171
|
+
* @param {string} appName
|
|
172
|
+
* @returns {string[]}
|
|
173
|
+
*/
|
|
174
|
+
function buildLocalExternalPlanLines(results, appName) {
|
|
175
|
+
const systemKey = results.systemKey || appName || 'unknown';
|
|
176
|
+
const status = deriveRootStatus(results);
|
|
177
|
+
const dq = deriveDataQualityRollups(results);
|
|
178
|
+
const failures = collectFailureItems(results);
|
|
179
|
+
const nSys = (results.systemResults || []).length;
|
|
180
|
+
const nDs = (results.datasourceResults || []).length;
|
|
181
|
+
const appSuffix = results.appName && results.appName !== systemKey ? ` (${results.appName})` : '';
|
|
182
|
+
|
|
183
|
+
const lines = [];
|
|
184
|
+
lines.push(
|
|
185
|
+
`System: ${systemKey}${appSuffix}`,
|
|
186
|
+
'Run: test (local)',
|
|
187
|
+
`Status: ${statusGlyph(status)} ${status}`,
|
|
188
|
+
'',
|
|
189
|
+
'Verdict:',
|
|
190
|
+
verdictLineLocalExternalTest(status),
|
|
191
|
+
'',
|
|
192
|
+
'Summary:',
|
|
193
|
+
`Local manifest validation only (${nSys} system file(s), ${nDs} datasource(s)); no dataplane run.`
|
|
194
|
+
);
|
|
195
|
+
pushSeparatorBlock(lines);
|
|
196
|
+
appendLocalDataQualitySection(lines, dq, failures, status);
|
|
197
|
+
appendLocalFailureDetailSections(lines, failures);
|
|
198
|
+
appendLocalTrailingSections(lines, results, failures);
|
|
199
|
+
return lines;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Failures section + blank + separator lines for local plan TTY.
|
|
204
|
+
* @param {string} line
|
|
205
|
+
* @param {{ inFailuresSection: boolean }} state
|
|
206
|
+
* @returns {boolean} True if handled
|
|
207
|
+
*/
|
|
208
|
+
function emitLocalPlanFailuresAndSeparators(line, state) {
|
|
209
|
+
if (line === 'Failures:') {
|
|
210
|
+
state.inFailuresSection = true;
|
|
211
|
+
logger.log(chalk.red.bold('Failures:'));
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
if (state.inFailuresSection && line === SEP) {
|
|
215
|
+
state.inFailuresSection = false;
|
|
216
|
+
logger.log(metaGray(SEP));
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
if (line === '') {
|
|
220
|
+
logger.log('');
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
if (line === SEP) {
|
|
224
|
+
logger.log(metaGray(SEP));
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Header and fixed section titles for local plan TTY.
|
|
232
|
+
* @param {string} line
|
|
233
|
+
* @param {'ok'|'warn'|'fail'} status
|
|
234
|
+
* @returns {boolean} True if handled
|
|
235
|
+
*/
|
|
236
|
+
function emitLocalPlanHeadersAndTitles(line, status) {
|
|
237
|
+
if (line.startsWith('System: ')) {
|
|
238
|
+
logger.log(headerKeyValue('System:', line.slice('System: '.length)));
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
if (line.startsWith('Run: ')) {
|
|
242
|
+
logger.log(headerKeyValue('Run:', line.slice('Run: '.length)));
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
if (line.startsWith('Status: ')) {
|
|
246
|
+
logger.log(formatStatusKeyValue(status, statusGlyph(status)));
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
const titles = [
|
|
250
|
+
'Verdict:',
|
|
251
|
+
'Summary:',
|
|
252
|
+
'Data Quality:',
|
|
253
|
+
'Deductions:',
|
|
254
|
+
'Next actions:',
|
|
255
|
+
'Impact:'
|
|
256
|
+
];
|
|
257
|
+
if (titles.includes(line)) {
|
|
258
|
+
logger.log(sectionTitle(line));
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
if (line === 'Other warnings:') {
|
|
262
|
+
logger.log(chalk.yellow.bold('Other warnings:'));
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Failure body, readiness, bullets, default for local plan TTY.
|
|
270
|
+
* @param {string} line
|
|
271
|
+
* @param {{ inFailuresSection: boolean }} state
|
|
272
|
+
*/
|
|
273
|
+
function emitLocalPlanBodyLine(line, state) {
|
|
274
|
+
if (state.inFailuresSection && line.startsWith('- ')) {
|
|
275
|
+
logger.log(chalk.red(line));
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (state.inFailuresSection && !line.startsWith('- ') && line.endsWith(':')) {
|
|
279
|
+
logger.log(chalk.red.bold(line));
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (line.startsWith('Readiness: ')) {
|
|
283
|
+
const rest = line.slice('Readiness: '.length);
|
|
284
|
+
logger.log(`${chalk.gray('Readiness:')} ${colorRollupPrefixedLine(rest)}`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (emitLocalPlanGlyphCheckboxOrMeta(line)) return;
|
|
288
|
+
logger.log(chalk.white(line));
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* @param {string} line
|
|
293
|
+
* @returns {boolean} true if handled
|
|
294
|
+
*/
|
|
295
|
+
function emitLocalPlanGlyphCheckboxOrMeta(line) {
|
|
296
|
+
const t = line.trimStart();
|
|
297
|
+
if (t.startsWith('✔') || t.startsWith('⚠') || t.startsWith('✖')) {
|
|
298
|
+
logger.log(colorRollupPrefixedLine(line));
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
if (line.startsWith('- [') || (line.startsWith('- ') && line.includes('[') && line.includes(']'))) {
|
|
302
|
+
logger.log(chalk.red(line));
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
if (line.startsWith('- ')) {
|
|
306
|
+
logger.log(metaGray(line));
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* @param {string[]} lines
|
|
314
|
+
* @param {'ok'|'warn'|'fail'} status
|
|
315
|
+
*/
|
|
316
|
+
function emitColoredLocalPlanLines(lines, status) {
|
|
317
|
+
const state = { inFailuresSection: false };
|
|
318
|
+
for (const line of lines) {
|
|
319
|
+
if (emitLocalPlanFailuresAndSeparators(line, state)) continue;
|
|
320
|
+
if (emitLocalPlanHeadersAndTitles(line, status)) continue;
|
|
321
|
+
emitLocalPlanBodyLine(line, state);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* @param {Object} results
|
|
327
|
+
* @param {boolean} verbose
|
|
328
|
+
* @param {string} appName
|
|
329
|
+
*/
|
|
330
|
+
function displayLocalExternalTestPlanLayout(results, verbose, appName) {
|
|
331
|
+
const status = deriveRootStatus(results);
|
|
332
|
+
emitColoredLocalPlanLines(buildLocalExternalPlanLines(results, appName), status);
|
|
333
|
+
if (verbose) {
|
|
334
|
+
displayVerboseInventory(results);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function logVerboseSystemRows(systemResults) {
|
|
339
|
+
for (const s of systemResults || []) {
|
|
340
|
+
const ok = s.valid;
|
|
341
|
+
logger.log(ok ? chalk.green(` ✔ ${s.file}`) : chalk.red(` ✖ ${s.file}`));
|
|
342
|
+
(s.errors || []).forEach(e => logger.log(chalk.red(` - ${e}`)));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function logVerboseDatasourceRows(datasourceResults) {
|
|
347
|
+
for (const d of datasourceResults || []) {
|
|
348
|
+
const ok = d.valid;
|
|
349
|
+
logger.log(ok ? chalk.green(` ✔ ${d.key} (${d.file})`) : chalk.red(` ✖ ${d.key} (${d.file})`));
|
|
350
|
+
(d.errors || []).forEach(e => logger.log(chalk.red(` - ${e}`)));
|
|
351
|
+
(d.warnings || []).forEach(w => logger.log(chalk.yellow(` ⚠ ${w}`)));
|
|
352
|
+
if (d.fieldMappingResults && d.fieldMappingResults.mappedFields) {
|
|
353
|
+
logger.log(chalk.gray(` Field mappings: ${Object.keys(d.fieldMappingResults.mappedFields).length} fields`));
|
|
354
|
+
}
|
|
355
|
+
if (d.metadataSchemaResults) {
|
|
356
|
+
const mOk = d.metadataSchemaResults.valid;
|
|
357
|
+
logger.log(mOk ? chalk.gray(' Metadata schema: ✔ Valid') : chalk.red(' Metadata schema: ✖ Invalid'));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
function logVerboseTopLevelMessages(errors, warnings) {
|
|
363
|
+
if ((errors || []).length > 0) {
|
|
364
|
+
logger.log(chalk.red('\nTop-level errors:'));
|
|
365
|
+
errors.forEach(err => logger.log(chalk.red(` - ${err}`)));
|
|
366
|
+
}
|
|
367
|
+
if ((warnings || []).length > 0) {
|
|
368
|
+
logger.log(chalk.yellow('\nTop-level warnings:'));
|
|
369
|
+
warnings.forEach(warn => logger.log(chalk.yellow(` - ${warn}`)));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* @param {Object} results
|
|
375
|
+
*/
|
|
376
|
+
function displayVerboseInventory(results) {
|
|
377
|
+
logger.log('');
|
|
378
|
+
logger.log(chalk.gray(SEP));
|
|
379
|
+
logger.log(chalk.gray('Verbose — file inventory'));
|
|
380
|
+
logVerboseSystemRows(results.systemResults);
|
|
381
|
+
logVerboseDatasourceRows(results.datasourceResults);
|
|
382
|
+
logVerboseTopLevelMessages(results.errors, results.warnings);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
module.exports = {
|
|
386
|
+
displayLocalExternalTestPlanLayout,
|
|
387
|
+
deriveRootStatus,
|
|
388
|
+
deriveDataQualityRollups
|
|
389
|
+
};
|