@aifabrix/builder 2.45.0 → 2.46.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/cli-layout.mdc +2 -0
- package/.cursor/rules/cli-product-neutral.mdc +43 -0
- package/.cursor/rules/docs-rules.mdc +3 -1
- package/.cursor/rules/project-rules.mdc +1 -0
- package/README.md +43 -17
- package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
- package/jest.config.default.js +2 -1
- package/jest.config.isolated.js +2 -1
- package/jest.global-live-fabrix-hooks.js +36 -0
- package/jest.isolated-projects.js +130 -0
- package/jest.projects.js +69 -121
- package/lib/api/agent-metadata-validation.api.js +93 -0
- package/lib/api/api-response-errors.js +124 -0
- package/lib/api/audit-api-helpers.js +68 -0
- package/lib/api/audit.api.js +119 -0
- package/lib/api/auth-cache.api.js +44 -0
- package/lib/api/certificates.api.js +4 -4
- package/lib/api/credential.api.js +2 -2
- package/lib/api/dataplane-health.api.js +137 -0
- package/lib/api/dataplane-sync.api.js +27 -0
- package/lib/api/datasources-core.api.js +21 -18
- package/lib/api/datasources-extended.api.js +22 -22
- package/lib/api/dimensions.api.js +3 -0
- package/lib/api/external-systems.api.js +13 -13
- package/lib/api/governance-scenario-pack.api.js +159 -0
- package/lib/api/governance-scenarios.api.js +39 -0
- package/lib/api/groups.api.js +79 -0
- package/lib/api/index.js +88 -5
- package/lib/api/lifecycle.api.js +77 -0
- package/lib/api/pipeline.api.js +7 -5
- package/lib/api/protection.api.js +157 -0
- package/lib/api/records-bulk.api.js +43 -0
- package/lib/api/records-search-parse.js +49 -0
- package/lib/api/records-search.api.js +29 -0
- package/lib/api/types/agent-metadata-validation.types.js +67 -0
- package/lib/api/types/audit.types.js +72 -0
- package/lib/api/types/dataplane-health.types.js +27 -0
- package/lib/api/types/dimensions.types.js +2 -0
- package/lib/api/types/governance-scenarios.types.js +39 -0
- package/lib/api/types/protection.types.js +69 -0
- package/lib/api/types/records-bulk.types.js +35 -0
- package/lib/api/types/records-search.types.js +28 -0
- package/lib/api/user-groups.api.js +50 -0
- package/lib/api/users.api.js +95 -0
- package/lib/api/validation-run.api.js +3 -3
- package/lib/api/validation-runner.js +5 -3
- package/lib/api/wizard-platform.api.js +3 -3
- package/lib/api/wizard.api.js +21 -21
- package/lib/app/deploy-config.js +4 -1
- package/lib/app/deploy.js +34 -19
- package/lib/app/down.js +20 -1
- package/lib/app/push.js +4 -5
- package/lib/app/register.js +7 -4
- package/lib/app/run-env-compose.js +84 -30
- package/lib/build/index.js +5 -0
- package/lib/certification/sync-system-certification.js +13 -6
- package/lib/cli/index.js +8 -2
- package/lib/cli/infra-guided-auth.js +109 -0
- package/lib/cli/infra-guided.js +91 -69
- package/lib/cli/setup-app.help.js +19 -2
- package/lib/cli/setup-app.js +58 -23
- package/lib/cli/setup-app.test-commands.js +28 -21
- package/lib/cli/setup-auth.js +55 -3
- package/lib/cli/setup-certification-commands.js +147 -0
- package/lib/cli/setup-certification.help.js +141 -0
- package/lib/cli/setup-environment.js +19 -2
- package/lib/cli/setup-external-system-help.js +62 -0
- package/lib/cli/setup-external-system.js +62 -6
- package/lib/cli/setup-infra.js +9 -1
- package/lib/cli/setup-platform.js +6 -1
- package/lib/cli/setup-secrets.js +33 -1
- package/lib/cli/setup-utility-help-after.js +65 -0
- package/lib/cli/setup-utility-repair.js +198 -0
- package/lib/cli/setup-utility-resolve.js +42 -6
- package/lib/cli/setup-utility-validate.js +197 -0
- package/lib/cli/setup-utility.js +41 -258
- package/lib/commands/auth-status-client-tokens.js +214 -0
- package/lib/commands/auth-status-dataplane-version.js +269 -0
- package/lib/commands/auth-status-display.js +94 -0
- package/lib/commands/auth-status.js +111 -53
- package/lib/commands/credential-push.js +10 -5
- package/lib/commands/datasource-load-export-cli.js +178 -0
- package/lib/commands/datasource-test-trust-cli.js +118 -0
- package/lib/commands/datasource-unified-test-cli.js +31 -20
- package/lib/commands/datasource-unified-test-cli.options.js +22 -3
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
- package/lib/commands/datasource-verify-audit-cli.js +96 -0
- package/lib/commands/datasource.js +68 -1
- package/lib/commands/dev-show-display.js +8 -1
- package/lib/commands/dimension-value.js +43 -13
- package/lib/commands/dimension.js +38 -7
- package/lib/commands/governance-cli-shared.js +94 -0
- package/lib/commands/governance-command-action.js +132 -0
- package/lib/commands/governance-download-external.js +34 -0
- package/lib/commands/governance-generate-external.js +71 -0
- package/lib/commands/governance-upload-external.js +36 -0
- package/lib/commands/governance-verify-external.js +64 -0
- package/lib/commands/governance.js +144 -0
- package/lib/commands/identity-apply-sync.js +131 -0
- package/lib/commands/identity-group-cli.js +146 -0
- package/lib/commands/identity-membership-role-cache.js +175 -0
- package/lib/commands/identity-shared.js +94 -0
- package/lib/commands/identity-user-cli.js +158 -0
- package/lib/commands/identity.js +43 -0
- package/lib/commands/lifecycle-command-action.js +123 -0
- package/lib/commands/lifecycle-external.js +268 -0
- package/lib/commands/login.js +56 -17
- package/lib/commands/protection-cli-leaves.js +286 -0
- package/lib/commands/protection.js +50 -0
- package/lib/commands/repair-auth-apply.js +127 -0
- package/lib/commands/repair-changed-files.js +41 -0
- package/lib/commands/repair-datasource-keys.js +4 -1
- package/lib/commands/repair-datasource-run.js +59 -0
- package/lib/commands/repair-datasource-test-payload.js +259 -0
- package/lib/commands/repair-datasource.js +1 -51
- package/lib/commands/repair-env-template.js +64 -13
- package/lib/commands/repair-external-run.js +216 -0
- package/lib/commands/repair-openapi-sync.js +23 -0
- package/lib/commands/repair-persist.js +4 -0
- package/lib/commands/repair-rbac.js +52 -1
- package/lib/commands/repair-steps.js +145 -0
- package/lib/commands/repair.js +29 -286
- package/lib/commands/secrets-get.js +184 -0
- package/lib/commands/secrets-remove-all.js +3 -1
- package/lib/commands/setup-image-refresh.js +146 -0
- package/lib/commands/setup-modes.js +158 -162
- package/lib/commands/setup-platform-auth.js +76 -0
- package/lib/commands/setup-prompts-admin.js +244 -0
- package/lib/commands/setup-prompts-platform-mode.js +67 -0
- package/lib/commands/setup-prompts-validators.js +36 -0
- package/lib/commands/setup-prompts.js +24 -76
- package/lib/commands/setup-run-context.js +45 -0
- package/lib/commands/setup-spinners.js +39 -0
- package/lib/commands/setup.js +27 -5
- package/lib/commands/teardown.js +39 -0
- package/lib/commands/test-e2e-external.js +61 -14
- package/lib/commands/test-governance-cli-options.js +47 -0
- package/lib/commands/test-governance-external.js +67 -0
- package/lib/commands/test-trust-cli-options.js +32 -0
- package/lib/commands/test-trust-external.js +126 -0
- package/lib/commands/up-common.js +25 -13
- package/lib/commands/up-dataplane.js +50 -13
- package/lib/commands/upload-publish-context.js +75 -0
- package/lib/commands/upload-sidecar-followups.js +89 -0
- package/lib/commands/upload.js +108 -105
- package/lib/commands/verify-governance-combined-external.js +61 -0
- package/lib/commands/verify-governance-command-action.js +64 -0
- package/lib/commands/verify-governance-db.js +102 -0
- package/lib/commands/verify-governance-external.js +77 -0
- package/lib/commands/verify-governance-result-builders.js +71 -0
- package/lib/commands/verify-operations-command-action.js +68 -0
- package/lib/commands/verify-operations-external.js +268 -0
- package/lib/commands/verify-operations-persist.js +75 -0
- package/lib/commands/verify-operations-step-plan.js +68 -0
- package/lib/commands/verify-operations-steps.js +111 -0
- package/lib/commands/verify-trust-command-action.js +70 -0
- package/lib/commands/verify-trust-external.js +67 -0
- package/lib/commands/wizard-config-normalizer.js +43 -23
- package/lib/commands/wizard-core.js +5 -0
- package/lib/core/admin-password-generator.js +38 -0
- package/lib/core/admin-secrets-bundle.js +111 -0
- package/lib/core/admin-secrets-env-overlay.js +62 -0
- package/lib/core/admin-secrets.js +32 -4
- package/lib/core/config-attach-extensions.js +3 -0
- package/lib/core/config-device-dataplane.js +185 -0
- package/lib/core/config-platform-controller.js +44 -0
- package/lib/core/config-setup-installation-profile.js +42 -0
- package/lib/core/config-setup-platform-mode.js +46 -0
- package/lib/core/config.js +46 -36
- package/lib/core/secrets-admin-env.js +6 -2
- package/lib/core/secrets-ensure.js +4 -0
- package/lib/core/secrets-env-content.js +54 -48
- package/lib/core/secrets-env-write.js +10 -1
- package/lib/core/secrets-infra-placeholder-sync.js +2 -0
- package/lib/core/setup-installation-profile.js +43 -0
- package/lib/core/setup-platform-mode.js +55 -0
- package/lib/datasource/agent-trust-debug-log.js +45 -0
- package/lib/datasource/agent-trust-fetch.js +115 -0
- package/lib/datasource/agent-trust-map.js +101 -0
- package/lib/datasource/agent-trust-mock.js +44 -0
- package/lib/datasource/agent-trust-run.js +95 -0
- package/lib/datasource/agent-trust-timeout.js +25 -0
- package/lib/datasource/audit-evidence-display.js +80 -0
- package/lib/datasource/audit-evidence-extract-debug.js +115 -0
- package/lib/datasource/audit-evidence-extract.js +180 -0
- package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
- package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
- package/lib/datasource/audit-evidence-poll.js +109 -0
- package/lib/datasource/audit-evidence-run.js +177 -0
- package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
- package/lib/datasource/audit-evidence-verify-matrix.js +205 -0
- package/lib/datasource/audit-evidence-verify.js +108 -0
- package/lib/datasource/bulk-loader-run-batches.js +100 -0
- package/lib/datasource/bulk-loader-service-retry.js +52 -0
- package/lib/datasource/bulk-loader-service.js +127 -0
- package/lib/datasource/capability/run-capability-dimension.js +2 -1
- package/lib/datasource/datasource-exporter-resolve.js +82 -0
- package/lib/datasource/datasource-exporter-service.js +144 -0
- package/lib/datasource/datasource-identifier.js +148 -0
- package/lib/datasource/datasource-load-export-context.js +95 -0
- package/lib/datasource/integration-context.js +6 -4
- package/lib/datasource/local-data-paths.js +145 -0
- package/lib/datasource/log-cleaner.js +241 -0
- package/lib/datasource/log-viewer.js +111 -6
- package/lib/datasource/record-file-parser.js +85 -0
- package/lib/datasource/record-mapper.js +129 -0
- package/lib/datasource/resolve-app.js +74 -55
- package/lib/datasource/test-e2e.js +29 -2
- package/lib/datasource/unified-validation-run-body.js +3 -1
- package/lib/datasource/unified-validation-run-resolve.js +45 -12
- package/lib/datasource/unified-validation-run.js +47 -18
- package/lib/datasource/validate.js +37 -20
- package/lib/deployment/environment-poll-status.js +138 -0
- package/lib/deployment/environment.js +42 -34
- package/lib/external-system/download.js +21 -20
- package/lib/external-system/generator.js +5 -1
- package/lib/external-system/integration-auth-context.js +45 -0
- package/lib/external-system/test-auth.js +12 -5
- package/lib/external-system/test-system-level.js +25 -4
- package/lib/external-system/test.js +9 -7
- package/lib/generator/external-controller-manifest.js +15 -0
- package/lib/governance/governance-cli-errors.js +96 -0
- package/lib/governance/governance-download-display.js +38 -0
- package/lib/governance/governance-pack-loader.js +70 -0
- package/lib/governance/governance-run-display.js +309 -0
- package/lib/identity/identity-apply-core.js +108 -0
- package/lib/identity/identity-apply-phases.js +244 -0
- package/lib/identity/identity-apply-service.js +77 -0
- package/lib/identity/identity-csv-parser.js +114 -0
- package/lib/infrastructure/admin-secrets-apply.js +84 -0
- package/lib/infrastructure/admin-secrets-ensure.js +130 -0
- package/lib/infrastructure/admin-secrets-resolve.js +95 -0
- package/lib/infrastructure/admin-secrets-sync.js +91 -0
- package/lib/infrastructure/helpers.js +23 -129
- package/lib/infrastructure/index.js +5 -6
- package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
- package/lib/internal/fs-real-sync.js +29 -1
- package/lib/lifecycle/certification-progress.js +231 -0
- package/lib/lifecycle/dataplane-ui-url.js +145 -0
- package/lib/lifecycle/exit-codes.js +24 -0
- package/lib/lifecycle/json-envelope.js +25 -0
- package/lib/lifecycle/lifecycle-governance-options.js +51 -0
- package/lib/lifecycle/logger-quiet.js +29 -0
- package/lib/lifecycle/open-api-published.js +59 -0
- package/lib/lifecycle/operations-readiness-metrics.js +101 -0
- package/lib/lifecycle/product-model.js +196 -0
- package/lib/lifecycle/report-display.js +471 -0
- package/lib/lifecycle/scenario-upload.js +191 -0
- package/lib/lifecycle/verify-step-progress.js +87 -0
- package/lib/parameters/infra-kv-discovery.js +27 -2
- package/lib/protection/auth-context.js +51 -0
- package/lib/protection/convert-batch.js +90 -0
- package/lib/protection/load.js +41 -0
- package/lib/protection/paths.js +158 -0
- package/lib/protection/preflight-datasource-ready.js +46 -0
- package/lib/protection/protection-create-probe-lines.js +142 -0
- package/lib/protection/protection-create-probes.js +95 -0
- package/lib/protection/protection-create-scaffold.js +281 -0
- package/lib/protection/protection-display-helpers.js +445 -0
- package/lib/protection/protection-display.js +215 -0
- package/lib/protection/protection-preset-registry.js +97 -0
- package/lib/protection/report-exit.js +62 -0
- package/lib/protection/resolve.js +202 -0
- package/lib/protection/run-commands-validate.js +130 -0
- package/lib/protection/run-commands.js +216 -0
- package/lib/protection/run-protection-create-helpers.js +134 -0
- package/lib/protection/run-protection-create-probes-flow.js +43 -0
- package/lib/protection/run-protection-create.js +191 -0
- package/lib/protection/scope.js +22 -0
- package/lib/protection/sync-after-upload.js +64 -0
- package/lib/protection/upload-batch.js +127 -0
- package/lib/protection/validate-batch.js +113 -0
- package/lib/protection/validate-local.js +65 -0
- package/lib/resolvers/dimension-file.js +29 -4
- package/lib/schema/application-schema.json +1 -1
- package/lib/schema/datasource-test-run.schema.json +89 -6
- package/lib/schema/external-datasource.schema.json +2636 -2588
- package/lib/schema/external-system.schema.json +1089 -761
- package/lib/schema/flag-map-validation-run.json +2 -2
- package/lib/schema/infra.parameter.yaml +45 -0
- package/lib/schema/protection.schema.json +374 -0
- package/lib/schema/type/credential-field-registry.json +642 -0
- package/lib/schema/wizard-config.schema.json +1 -1
- package/lib/utils/agent-trust-run-display.js +231 -0
- package/lib/utils/agent-trust-run-exit.js +59 -0
- package/lib/utils/agent-trust-wait-ui.js +94 -0
- package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
- package/lib/utils/api.js +55 -31
- package/lib/utils/app-relative-path-env.js +112 -0
- package/lib/utils/cli-exit-codes.js +30 -0
- package/lib/utils/cli-secrets-error-format.js +83 -21
- package/lib/utils/cli-sync-options.js +33 -0
- package/lib/utils/cli-utils.js +16 -4
- package/lib/utils/compose-generate-docker-compose.js +4 -0
- package/lib/utils/compose-traefik-ingress-base.js +16 -1
- package/lib/utils/config-secrets-path.js +46 -0
- package/lib/utils/controller-url.js +88 -1
- package/lib/utils/credential-push-ui.js +90 -0
- package/lib/utils/credential-secrets-env.js +137 -9
- package/lib/utils/dataplane-cli-version-gate.js +202 -0
- package/lib/utils/dataplane-cli-version-help.js +74 -0
- package/lib/utils/dataplane-resolver.js +129 -2
- package/lib/utils/datasource-export-display.js +137 -0
- package/lib/utils/datasource-load-display.js +174 -0
- package/lib/utils/datasource-load-export-ui.js +120 -0
- package/lib/utils/datasource-test-run-capability-scope.js +3 -3
- package/lib/utils/datasource-test-run-display.js +3 -3
- package/lib/utils/datasource-test-run-tty-log.js +5 -1
- package/lib/utils/declarative-url-ports.js +3 -3
- package/lib/utils/deployment-auth-mode.js +41 -0
- package/lib/utils/developer-volume-id.js +33 -0
- package/lib/utils/env-copy.js +14 -9
- package/lib/utils/env-kv-orphan-lines.js +43 -0
- package/lib/utils/error-formatters/network-errors.js +13 -4
- package/lib/utils/external-env-template.js +1 -0
- package/lib/utils/external-system-readiness-core.js +10 -0
- package/lib/utils/external-system-readiness-display.js +80 -23
- package/lib/utils/health-check.js +4 -1
- package/lib/utils/help-builder.js +35 -26
- package/lib/utils/keycloak-realm-ready.js +101 -0
- package/lib/utils/load-cip-capacity-display-config.js +61 -15
- package/lib/utils/manifest-source-emit.js +24 -0
- package/lib/utils/pipeline-upload-auth-retry.js +82 -0
- package/lib/utils/platform-controller-url.js +156 -0
- package/lib/utils/postgres-platform-bootstrap.js +199 -0
- package/lib/utils/postgres-wipe.js +9 -2
- package/lib/utils/resolve-env-mode.js +47 -0
- package/lib/utils/secrets-generator.js +31 -25
- package/lib/utils/secrets-missing-error.js +164 -0
- package/lib/utils/semver-compare.js +127 -0
- package/lib/utils/service-url-label.js +81 -0
- package/lib/utils/setup-quiet-output.js +25 -0
- package/lib/utils/template-helpers.js +15 -0
- package/lib/utils/token-manager-client-credentials.js +201 -0
- package/lib/utils/token-manager-messages.js +8 -0
- package/lib/utils/token-manager-refresh.js +12 -2
- package/lib/utils/token-manager.js +86 -105
- package/lib/utils/upload-pipeline-ui.js +98 -0
- package/lib/utils/upload-sync-options.js +42 -0
- package/lib/utils/url-declarative-public-base.js +21 -3
- package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
- package/lib/utils/validation-poll-ui.js +22 -7
- package/lib/utils/validation-run-stage.js +45 -0
- package/lib/validation/wizard-config-validator.js +58 -19
- package/package.json +1 -1
- package/templates/applications/dataplane/application.yaml +2 -1
- package/templates/applications/dataplane/env.template +36 -1
- package/templates/applications/dataplane/rbac.yaml +4 -0
- package/templates/applications/miso-controller/env.template +16 -0
- package/templates/external-system/README.md.hbs +116 -11
- package/templates/python/docker-compose.hbs +19 -18
- package/templates/typescript/docker-compose.hbs +18 -17
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Protection subcommand registration (keeps setupProtectionCommands under line limit).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const logger = require('../utils/logger');
|
|
8
|
+
const { resolveProtectionArgument } = require('../protection/resolve');
|
|
9
|
+
const {
|
|
10
|
+
runProtectionValidate,
|
|
11
|
+
runProtectionUpload,
|
|
12
|
+
runProtectionList,
|
|
13
|
+
runProtectionShow,
|
|
14
|
+
runProtectionDelete
|
|
15
|
+
} = require('../protection/run-commands');
|
|
16
|
+
const { runProtectionCreate } = require('../protection/run-protection-create');
|
|
17
|
+
|
|
18
|
+
const SHARED_OPTS = [
|
|
19
|
+
['-e, --env <environment>', 'Environment key'],
|
|
20
|
+
['-v, --verbose', 'Verbose output']
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const PROTECTION_CREATE_HELP_AFTER = `
|
|
24
|
+
|
|
25
|
+
Examples:
|
|
26
|
+
$ aifabrix protection create hubspot-companies --type country-sales
|
|
27
|
+
$ aifabrix protection create hr-persons --type department-manager
|
|
28
|
+
$ aifabrix protection create erp-projects --type project-team
|
|
29
|
+
$ aifabrix protection create hubspot-companies --dimension-key country --dry-run
|
|
30
|
+
$ aifabrix protection create hubspot-companies --type country-sales --force
|
|
31
|
+
|
|
32
|
+
Preset types:
|
|
33
|
+
country-sales, department-manager, customer-team, project-team, static-region, owner-direct
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
const PROTECTION_VALIDATE_HELP_AFTER = `
|
|
37
|
+
|
|
38
|
+
Examples:
|
|
39
|
+
$ aifabrix protection validate hubspot-companies
|
|
40
|
+
$ aifabrix protection validate hubspot-companies --simulate
|
|
41
|
+
$ aifabrix protection validate hubspot-companies --warnings-as-errors
|
|
42
|
+
$ aifabrix protection validate hubspot-companies --json
|
|
43
|
+
`;
|
|
44
|
+
|
|
45
|
+
const PROTECTION_UPLOAD_HELP_AFTER = `
|
|
46
|
+
|
|
47
|
+
Examples:
|
|
48
|
+
$ aifabrix protection upload hubspot-companies
|
|
49
|
+
$ aifabrix protection upload hubspot-companies --dry-run
|
|
50
|
+
$ aifabrix protection upload hubspot-companies --no-sync
|
|
51
|
+
`;
|
|
52
|
+
|
|
53
|
+
const PROTECTION_LIST_HELP_AFTER = `
|
|
54
|
+
|
|
55
|
+
Examples:
|
|
56
|
+
$ aifabrix protection list
|
|
57
|
+
$ aifabrix protection list --page 1 --page-size 50
|
|
58
|
+
$ aifabrix protection list --filter enabled:eq:true
|
|
59
|
+
$ aifabrix protection list --json
|
|
60
|
+
`;
|
|
61
|
+
|
|
62
|
+
const PROTECTION_SHOW_HELP_AFTER = `
|
|
63
|
+
|
|
64
|
+
Examples:
|
|
65
|
+
$ aifabrix protection show hubspot-companies
|
|
66
|
+
$ aifabrix protection show hubspot-companies -v
|
|
67
|
+
$ aifabrix protection show hubspot-companies --json
|
|
68
|
+
`;
|
|
69
|
+
|
|
70
|
+
const PROTECTION_DELETE_HELP_AFTER = `
|
|
71
|
+
|
|
72
|
+
Examples:
|
|
73
|
+
$ aifabrix protection delete hubspot-companies
|
|
74
|
+
$ aifabrix protection delete hubspot-companies --yes
|
|
75
|
+
`;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @param {import('commander').Command} cmd
|
|
79
|
+
* @param {string} name
|
|
80
|
+
* @param {string} description
|
|
81
|
+
* @param {Function} action
|
|
82
|
+
* @param {Array<[string, string]>} extraOpts
|
|
83
|
+
* @param {string} helpAfter
|
|
84
|
+
*/
|
|
85
|
+
function addProtectionLeaf(cmd, name, description, action, extraOpts = [], helpAfter = '') {
|
|
86
|
+
const leaf = cmd.command(name).description(description);
|
|
87
|
+
for (const [flags, desc] of [...SHARED_OPTS, ...extraOpts]) {
|
|
88
|
+
leaf.option(flags, desc);
|
|
89
|
+
}
|
|
90
|
+
if (helpAfter) {
|
|
91
|
+
leaf.addHelpText('after', helpAfter);
|
|
92
|
+
}
|
|
93
|
+
leaf.action(async(datasourceKey, options) => {
|
|
94
|
+
try {
|
|
95
|
+
const code = await action(datasourceKey, options);
|
|
96
|
+
if (code && code !== 0) process.exit(code);
|
|
97
|
+
} catch (err) {
|
|
98
|
+
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
99
|
+
logger.error(formatBlockingError(err.message || String(err)));
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @param {import('commander').Command} protection
|
|
107
|
+
*/
|
|
108
|
+
function registerProtectionCreate(protection) {
|
|
109
|
+
const leaf = protection
|
|
110
|
+
.command('create <datasourceKey>')
|
|
111
|
+
.description(
|
|
112
|
+
'Probe dataplane datasource + Controller dimension, then scaffold under integration/.protection/'
|
|
113
|
+
);
|
|
114
|
+
for (const [flags, desc] of SHARED_OPTS) {
|
|
115
|
+
leaf.option(flags, desc);
|
|
116
|
+
}
|
|
117
|
+
leaf
|
|
118
|
+
.option('--type <type>', 'Preset type (country-sales, department-manager, customer-team, project-team, static-region, owner-direct)')
|
|
119
|
+
.option('--dimension-key <key>', 'Dimension catalog key (inferred from --type when omitted)')
|
|
120
|
+
.option('--field <name>', 'Metadata field used by preset value templates when needed')
|
|
121
|
+
.option('--fk-name <name>', 'FK binding name in expressions (default: same as dimension key)')
|
|
122
|
+
.option('--protection-key <key>', 'metadata.key (default: <datasource>-<dimension>-access)')
|
|
123
|
+
.option('--display-name <text>', 'metadata.displayName')
|
|
124
|
+
.option('--rule-key <key>', 'Rule key inside spec.rules[0]')
|
|
125
|
+
.option('--principal-expression <expr>', 'Group principal expression (default: Sales {{fk.<fk>.metadata.iso3}} Users)')
|
|
126
|
+
.option('--value-expression <expr>', 'Grant valueExpression (default: {{fk.<fk>.metadata.iso2}})')
|
|
127
|
+
.option('--dry-run', 'Print YAML to stdout; do not write file')
|
|
128
|
+
.option('--force', 'Overwrite existing integration/.protection/<datasourceKey> manifest')
|
|
129
|
+
.option('--disabled', 'Set spec.enabled to false', false)
|
|
130
|
+
.addHelpText('after', PROTECTION_CREATE_HELP_AFTER)
|
|
131
|
+
.action(async(datasourceKey, options) => {
|
|
132
|
+
try {
|
|
133
|
+
const code = await runProtectionCreate(datasourceKey, {
|
|
134
|
+
...options,
|
|
135
|
+
dryRun: options.dryRun === true,
|
|
136
|
+
force: options.force === true,
|
|
137
|
+
verbose: options.verbose === true,
|
|
138
|
+
disabled: options.disabled === true
|
|
139
|
+
}, logger);
|
|
140
|
+
if (code && code !== 0) process.exit(code);
|
|
141
|
+
} catch (err) {
|
|
142
|
+
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
143
|
+
if (Array.isArray(err.probeLines)) {
|
|
144
|
+
for (const line of err.probeLines) {
|
|
145
|
+
logger.log(line);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
logger.error(formatBlockingError(err.message || String(err)));
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* @param {import('commander').Command} protection
|
|
156
|
+
*/
|
|
157
|
+
function registerProtectionValidate(protection) {
|
|
158
|
+
addProtectionLeaf(
|
|
159
|
+
protection,
|
|
160
|
+
'validate <datasourceKey>',
|
|
161
|
+
'Validate protection manifest (local schema + dataplane)',
|
|
162
|
+
async(datasourceKey, options) => {
|
|
163
|
+
const resolved = resolveProtectionArgument(datasourceKey);
|
|
164
|
+
return runProtectionValidate(resolved.datasourceKey, resolved.manifest, {
|
|
165
|
+
...options,
|
|
166
|
+
manifestPath: resolved.manifestPath,
|
|
167
|
+
warningsAsErrors: options.warningsAsErrors === true,
|
|
168
|
+
simulate: options.simulate === true,
|
|
169
|
+
json: options.json === true,
|
|
170
|
+
verbose: options.verbose === true
|
|
171
|
+
}, logger);
|
|
172
|
+
},
|
|
173
|
+
[
|
|
174
|
+
['--json', 'Output dataplane report as JSON'],
|
|
175
|
+
['--warnings-as-errors', 'Pass strict=true to dataplane validate'],
|
|
176
|
+
['--simulate', 'Run simulate after validate passes']
|
|
177
|
+
],
|
|
178
|
+
PROTECTION_VALIDATE_HELP_AFTER
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* @param {import('commander').Command} protection
|
|
184
|
+
*/
|
|
185
|
+
function registerProtectionUpload(protection) {
|
|
186
|
+
addProtectionLeaf(
|
|
187
|
+
protection,
|
|
188
|
+
'upload <datasourceKey>',
|
|
189
|
+
'Validate and upload protection manifest to dataplane',
|
|
190
|
+
async(datasourceKey, options) => {
|
|
191
|
+
const resolved = resolveProtectionArgument(datasourceKey);
|
|
192
|
+
return runProtectionUpload(resolved.datasourceKey, resolved.manifest, {
|
|
193
|
+
...options,
|
|
194
|
+
manifestPath: resolved.manifestPath,
|
|
195
|
+
warningsAsErrors: options.warningsAsErrors === true,
|
|
196
|
+
dryRun: options.dryRun === true,
|
|
197
|
+
noSync: options.noSync === true,
|
|
198
|
+
verbose: options.verbose === true
|
|
199
|
+
}, logger);
|
|
200
|
+
},
|
|
201
|
+
[
|
|
202
|
+
['--dry-run', 'Validate only; no upload or sync'],
|
|
203
|
+
['--no-sync', 'Skip datasource sync after upload']
|
|
204
|
+
],
|
|
205
|
+
PROTECTION_UPLOAD_HELP_AFTER
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @param {import('commander').Command} protection
|
|
211
|
+
*/
|
|
212
|
+
function registerProtectionList(protection) {
|
|
213
|
+
const leaf = protection.command('list').description('List deployed protection manifests on dataplane');
|
|
214
|
+
for (const [flags, desc] of SHARED_OPTS) {
|
|
215
|
+
leaf.option(flags, desc);
|
|
216
|
+
}
|
|
217
|
+
leaf
|
|
218
|
+
.option('--json', 'Output paginated list as JSON')
|
|
219
|
+
.option('--page <n>', 'Page (1-based)', (v) => parseInt(v, 10))
|
|
220
|
+
.option('--page-size <n>', 'Page size', (v) => parseInt(v, 10))
|
|
221
|
+
.option('--filter <expr>', 'Filter (e.g. enabled:eq:true)')
|
|
222
|
+
.addHelpText('after', PROTECTION_LIST_HELP_AFTER)
|
|
223
|
+
.action(async(options) => {
|
|
224
|
+
try {
|
|
225
|
+
const code = await runProtectionList(
|
|
226
|
+
{
|
|
227
|
+
...options,
|
|
228
|
+
json: options.json === true,
|
|
229
|
+
verbose: options.verbose === true
|
|
230
|
+
},
|
|
231
|
+
logger
|
|
232
|
+
);
|
|
233
|
+
if (code && code !== 0) process.exit(code);
|
|
234
|
+
} catch (err) {
|
|
235
|
+
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
236
|
+
logger.error(formatBlockingError(err.message || String(err)));
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* @param {import('commander').Command} protection
|
|
244
|
+
*/
|
|
245
|
+
function registerProtectionShow(protection) {
|
|
246
|
+
addProtectionLeaf(
|
|
247
|
+
protection,
|
|
248
|
+
'show <datasourceKey>',
|
|
249
|
+
'Show deployed protection state from dataplane',
|
|
250
|
+
async(datasourceKey, options) =>
|
|
251
|
+
runProtectionShow(datasourceKey, {
|
|
252
|
+
...options,
|
|
253
|
+
json: options.json === true,
|
|
254
|
+
verbose: options.verbose === true
|
|
255
|
+
}, logger),
|
|
256
|
+
[['--json', 'Output merged manifest + status as JSON']],
|
|
257
|
+
PROTECTION_SHOW_HELP_AFTER
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* @param {import('commander').Command} protection
|
|
263
|
+
*/
|
|
264
|
+
function registerProtectionDelete(protection) {
|
|
265
|
+
addProtectionLeaf(
|
|
266
|
+
protection,
|
|
267
|
+
'delete <datasourceKey>',
|
|
268
|
+
'Delete deployed protection for datasource',
|
|
269
|
+
async(datasourceKey, options) =>
|
|
270
|
+
runProtectionDelete(datasourceKey, {
|
|
271
|
+
...options,
|
|
272
|
+
yes: options.yes === true
|
|
273
|
+
}, logger),
|
|
274
|
+
[['--yes', 'Skip confirmation prompt']],
|
|
275
|
+
PROTECTION_DELETE_HELP_AFTER
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
module.exports = {
|
|
280
|
+
registerProtectionCreate,
|
|
281
|
+
registerProtectionValidate,
|
|
282
|
+
registerProtectionUpload,
|
|
283
|
+
registerProtectionList,
|
|
284
|
+
registerProtectionShow,
|
|
285
|
+
registerProtectionDelete
|
|
286
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Protection manifest CLI commands.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const {
|
|
10
|
+
registerProtectionCreate,
|
|
11
|
+
registerProtectionValidate,
|
|
12
|
+
registerProtectionUpload,
|
|
13
|
+
registerProtectionList,
|
|
14
|
+
registerProtectionShow,
|
|
15
|
+
registerProtectionDelete
|
|
16
|
+
} = require('./protection-cli-leaves');
|
|
17
|
+
|
|
18
|
+
const PROTECTION_HELP_AFTER = `
|
|
19
|
+
|
|
20
|
+
Examples:
|
|
21
|
+
$ aifabrix protection create hubspot-companies --type country-sales
|
|
22
|
+
$ aifabrix protection validate hubspot-companies --simulate
|
|
23
|
+
$ aifabrix protection upload hubspot-companies --dry-run
|
|
24
|
+
$ aifabrix protection list
|
|
25
|
+
$ aifabrix protection show hubspot-companies
|
|
26
|
+
$ aifabrix protection delete hubspot-companies --yes
|
|
27
|
+
|
|
28
|
+
Per-command help: aifabrix protection <command> --help
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {import('commander').Command} program
|
|
33
|
+
*/
|
|
34
|
+
function setupProtectionCommands(program) {
|
|
35
|
+
const protection = program
|
|
36
|
+
.command('protection')
|
|
37
|
+
.description('Manage protection manifests in integration/.protection/ (repo root)')
|
|
38
|
+
.addHelpText('after', PROTECTION_HELP_AFTER);
|
|
39
|
+
|
|
40
|
+
registerProtectionCreate(protection);
|
|
41
|
+
registerProtectionValidate(protection);
|
|
42
|
+
registerProtectionUpload(protection);
|
|
43
|
+
registerProtectionList(protection);
|
|
44
|
+
registerProtectionShow(protection);
|
|
45
|
+
registerProtectionDelete(protection);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = {
|
|
49
|
+
setupProtectionCommands
|
|
50
|
+
};
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repair --auth: canonical authentication blocks and bearerToken preset.
|
|
3
|
+
*
|
|
4
|
+
* Applies canonical authentication blocks for repair --auth.
|
|
5
|
+
*
|
|
6
|
+
* @fileoverview Repair authentication method application
|
|
7
|
+
* @author AI Fabrix Team
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const { buildAuthenticationFromMethod } = require('../external-system/generator');
|
|
14
|
+
|
|
15
|
+
/** Repair CLI --auth values (normalized lowercase). */
|
|
16
|
+
const ALLOWED_REPAIR_AUTH = [
|
|
17
|
+
'oauth2',
|
|
18
|
+
'aad',
|
|
19
|
+
'apikey',
|
|
20
|
+
'bearertoken',
|
|
21
|
+
'bearerkey',
|
|
22
|
+
'basic',
|
|
23
|
+
'queryparam',
|
|
24
|
+
'oidc',
|
|
25
|
+
'hmac',
|
|
26
|
+
'none'
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const PRESERVED_VARIABLE_KEYS = ['baseUrl', 'testEndpoint'];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {string} authOption - Raw --auth value
|
|
33
|
+
* @returns {string} Normalized lowercase auth option
|
|
34
|
+
*/
|
|
35
|
+
function normalizeRepairAuthOption(authOption) {
|
|
36
|
+
return String(authOption || '').trim().toLowerCase();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param {string} authOption - Normalized --auth value
|
|
41
|
+
* @returns {boolean}
|
|
42
|
+
*/
|
|
43
|
+
function isAllowedRepairAuth(authOption) {
|
|
44
|
+
return ALLOWED_REPAIR_AUTH.includes(normalizeRepairAuthOption(authOption));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Builds authentication block for repair --auth.
|
|
49
|
+
* @param {string} systemKey - System key
|
|
50
|
+
* @param {string} authOption - Normalized repair auth (e.g. bearertoken, apikey)
|
|
51
|
+
* @returns {{ method: string, variables: Object, security: Object }}
|
|
52
|
+
*/
|
|
53
|
+
function buildAuthenticationForRepair(systemKey, authOption) {
|
|
54
|
+
const normalized = normalizeRepairAuthOption(authOption);
|
|
55
|
+
const schemaMethod =
|
|
56
|
+
normalized === 'queryparam'
|
|
57
|
+
? 'queryParam'
|
|
58
|
+
: normalized === 'bearertoken' || normalized === 'bearerkey'
|
|
59
|
+
? 'bearerToken'
|
|
60
|
+
: normalized;
|
|
61
|
+
return buildAuthenticationFromMethod(systemKey, schemaMethod);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Merges preserved connectivity fields from existing auth into template variables.
|
|
66
|
+
* @param {Object} mergedVariables - Target variables object (mutated)
|
|
67
|
+
* @param {Object} existingVars - Prior authentication.variables
|
|
68
|
+
*/
|
|
69
|
+
function mergePreservedAuthVariables(mergedVariables, existingVars) {
|
|
70
|
+
if (!existingVars || typeof existingVars !== 'object') return;
|
|
71
|
+
for (const key of PRESERVED_VARIABLE_KEYS) {
|
|
72
|
+
if (existingVars[key] !== undefined && existingVars[key] !== null) {
|
|
73
|
+
mergedVariables[key] = existingVars[key];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Human-readable label for repair change log.
|
|
80
|
+
* @param {string} authOption - Normalized repair auth
|
|
81
|
+
* @returns {string}
|
|
82
|
+
*/
|
|
83
|
+
function repairAuthChangeLabel(authOption) {
|
|
84
|
+
const normalized = normalizeRepairAuthOption(authOption);
|
|
85
|
+
if (normalized === 'bearertoken' || normalized === 'bearerkey') return 'bearerToken';
|
|
86
|
+
return normalized;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const MISSING_TEST_ENDPOINT_WARNING =
|
|
90
|
+
'authentication.variables.testEndpoint is missing for apikey/bearerToken auth — add a GET URL for credential/E2E tests (e.g. /crm/v3/objects/contacts?limit=1, or a path resolved against baseUrl).';
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Warn when apikey auth (including bearerToken preset) has no testEndpoint.
|
|
94
|
+
* @param {Object} authentication - authentication block on system file
|
|
95
|
+
* @param {string[]} warnings - Mutable warnings list
|
|
96
|
+
*/
|
|
97
|
+
function appendTestEndpointWarningIfMissing(authentication, warnings) {
|
|
98
|
+
const method = String(authentication?.method || '').toLowerCase();
|
|
99
|
+
if (method !== 'apikey' && method !== 'bearertoken') return;
|
|
100
|
+
const testEndpoint = String(authentication?.variables?.testEndpoint || '').trim();
|
|
101
|
+
if (testEndpoint) return;
|
|
102
|
+
if (warnings.includes(MISSING_TEST_ENDPOINT_WARNING)) return;
|
|
103
|
+
warnings.push(MISSING_TEST_ENDPOINT_WARNING);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Audit system authentication after repair (with or without --auth).
|
|
108
|
+
* @param {Object} systemParsed - Parsed system config
|
|
109
|
+
* @param {string[]} warnings - Mutable warnings list
|
|
110
|
+
*/
|
|
111
|
+
function auditRepairAuthenticationWarnings(systemParsed, warnings) {
|
|
112
|
+
const authentication = systemParsed?.authentication || systemParsed?.auth;
|
|
113
|
+
if (!authentication || typeof authentication !== 'object') return;
|
|
114
|
+
appendTestEndpointWarningIfMissing(authentication, warnings);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
module.exports = {
|
|
118
|
+
ALLOWED_REPAIR_AUTH,
|
|
119
|
+
MISSING_TEST_ENDPOINT_WARNING,
|
|
120
|
+
normalizeRepairAuthOption,
|
|
121
|
+
isAllowedRepairAuth,
|
|
122
|
+
buildAuthenticationForRepair,
|
|
123
|
+
mergePreservedAuthVariables,
|
|
124
|
+
repairAuthChangeLabel,
|
|
125
|
+
appendTestEndpointWarningIfMissing,
|
|
126
|
+
auditRepairAuthenticationWarnings
|
|
127
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track integration files touched during repair for CLI summary output.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Repair changed-file tracking
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Ensures backup/repair context has changed-file buckets.
|
|
15
|
+
* @param {Object} ctx - Repair backup context
|
|
16
|
+
* @returns {{ changedFiles: string[], wouldChangeFiles: string[] }}
|
|
17
|
+
*/
|
|
18
|
+
function ensureChangedFileBuckets(ctx) {
|
|
19
|
+
if (!ctx) return { changedFiles: [], wouldChangeFiles: [] };
|
|
20
|
+
if (!Array.isArray(ctx.changedFiles)) ctx.changedFiles = [];
|
|
21
|
+
if (!Array.isArray(ctx.wouldChangeFiles)) ctx.wouldChangeFiles = [];
|
|
22
|
+
return { changedFiles: ctx.changedFiles, wouldChangeFiles: ctx.wouldChangeFiles };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Records a file path that repair wrote or would write (dry-run).
|
|
27
|
+
* @param {string} filePath - Path to file
|
|
28
|
+
* @param {Object} ctx - Repair context with dryRun, changedFiles, wouldChangeFiles
|
|
29
|
+
*/
|
|
30
|
+
function trackRepairWrite(filePath, ctx) {
|
|
31
|
+
if (!filePath || !ctx) return;
|
|
32
|
+
const abs = path.resolve(filePath);
|
|
33
|
+
const { changedFiles, wouldChangeFiles } = ensureChangedFileBuckets(ctx);
|
|
34
|
+
const bucket = ctx.dryRun ? wouldChangeFiles : changedFiles;
|
|
35
|
+
if (!bucket.includes(abs)) bucket.push(abs);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = {
|
|
39
|
+
ensureChangedFileBuckets,
|
|
40
|
+
trackRepairWrite
|
|
41
|
+
};
|
|
@@ -16,6 +16,7 @@ const path = require('path');
|
|
|
16
16
|
const fs = require('fs');
|
|
17
17
|
const { loadConfigFile, writeConfigFile } = require('../utils/config-format');
|
|
18
18
|
const { backupIntegrationFile } = require('../utils/integration-file-backup');
|
|
19
|
+
const { trackRepairWrite } = require('./repair-changed-files');
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Returns suffix from a canonical-format filename: <systemKey>-datasource-<suffix>.<ext>.
|
|
@@ -174,8 +175,9 @@ function normalizeDatasourceKeysAndFilenames(appPath, datasourceFiles, systemKey
|
|
|
174
175
|
|
|
175
176
|
if (parsed.key !== canonicalKey) {
|
|
176
177
|
parsed.key = canonicalKey;
|
|
178
|
+
const fullPath = path.join(appPath, fileName);
|
|
179
|
+
trackRepairWrite(fullPath, backupCtx);
|
|
177
180
|
if (!dryRun) {
|
|
178
|
-
const fullPath = path.join(appPath, fileName);
|
|
179
181
|
backupIntegrationFile(fullPath, backupCtx);
|
|
180
182
|
writeConfigFile(fullPath, parsed);
|
|
181
183
|
}
|
|
@@ -185,6 +187,7 @@ function normalizeDatasourceKeysAndFilenames(appPath, datasourceFiles, systemKey
|
|
|
185
187
|
if (fileName !== canonicalFileName) {
|
|
186
188
|
const oldPath = path.join(appPath, fileName);
|
|
187
189
|
const newPath = path.join(appPath, canonicalFileName);
|
|
190
|
+
trackRepairWrite(newPath, backupCtx);
|
|
188
191
|
if (!dryRun && fs.existsSync(oldPath) && !fs.existsSync(newPath)) {
|
|
189
192
|
backupIntegrationFile(oldPath, backupCtx);
|
|
190
193
|
fs.renameSync(oldPath, newPath);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch datasource file repair during external integration repair.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Run repairDatasourceFile across integration datasource files
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const chalk = require('chalk');
|
|
14
|
+
const logger = require('../utils/logger');
|
|
15
|
+
const { loadConfigFile, writeConfigFile } = require('../utils/config-format');
|
|
16
|
+
const { backupIntegrationFile } = require('../utils/integration-file-backup');
|
|
17
|
+
const { trackRepairWrite } = require('./repair-changed-files');
|
|
18
|
+
const { repairDatasourceFile } = require('./repair-datasource');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param {string} appPath
|
|
22
|
+
* @param {string[]} datasourceFiles
|
|
23
|
+
* @param {Object} options
|
|
24
|
+
* @param {boolean} dryRun
|
|
25
|
+
* @param {string[]} changes
|
|
26
|
+
* @returns {boolean}
|
|
27
|
+
*/
|
|
28
|
+
function runDatasourceRepairs(appPath, datasourceFiles, options, dryRun, changes) {
|
|
29
|
+
if (!datasourceFiles || datasourceFiles.length === 0) return false;
|
|
30
|
+
let updated = false;
|
|
31
|
+
for (const fileName of datasourceFiles) {
|
|
32
|
+
const filePath = path.join(appPath, fileName);
|
|
33
|
+
if (!fs.existsSync(filePath)) continue;
|
|
34
|
+
try {
|
|
35
|
+
const parsed = loadConfigFile(filePath);
|
|
36
|
+
const { updated: fileUpdated, changes: fileChanges } = repairDatasourceFile(parsed, {
|
|
37
|
+
expose: options.expose,
|
|
38
|
+
sync: options.sync,
|
|
39
|
+
test: options.test
|
|
40
|
+
});
|
|
41
|
+
if (fileUpdated) {
|
|
42
|
+
updated = true;
|
|
43
|
+
fileChanges.forEach(c => changes.push(`${fileName}: ${c}`));
|
|
44
|
+
if (!dryRun) {
|
|
45
|
+
backupIntegrationFile(filePath, options.backupCtx);
|
|
46
|
+
writeConfigFile(filePath, parsed);
|
|
47
|
+
}
|
|
48
|
+
trackRepairWrite(filePath, options.backupCtx);
|
|
49
|
+
}
|
|
50
|
+
} catch (err) {
|
|
51
|
+
logger.log(chalk.yellow(`⚠ Could not repair datasource ${fileName}: ${err.message}`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return updated;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
module.exports = {
|
|
58
|
+
runDatasourceRepairs
|
|
59
|
+
};
|