@aifabrix/builder 2.43.0 → 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 +1 -1
- 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 +31 -0
- package/integration/hubspot-test/create-hubspot.js +5 -5
- package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
- package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
- package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
- package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
- package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
- package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
- package/integration/hubspot-test/test-dataplane-down.js +3 -3
- package/integration/hubspot-test/test.js +35 -43
- 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/types/dev.types.js +4 -3
- package/lib/api/types/pipeline.types.js +8 -5
- 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 +16 -7
- package/lib/app/rotate-secret.js +14 -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 +57 -121
- package/lib/cli/setup-app.test-commands.js +179 -0
- package/lib/cli/setup-auth.js +19 -5
- 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 +170 -113
- package/lib/cli/setup-environment.js +7 -1
- package/lib/cli/setup-external-system.js +62 -22
- package/lib/cli/setup-infra.js +126 -47
- package/lib/cli/setup-parameters.js +32 -0
- package/lib/cli/setup-secrets.js +106 -8
- package/lib/cli/setup-service-user.js +1 -1
- package/lib/cli/setup-utility.js +36 -20
- 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 +6 -6
- 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 +105 -98
- 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 +2 -2
- package/lib/commands/repair.js +21 -3
- package/lib/commands/secrets-list.js +23 -12
- package/lib/commands/secrets-remove-all.js +220 -0
- package/lib/commands/secrets-remove.js +21 -12
- package/lib/commands/secrets-set.js +21 -12
- package/lib/commands/secrets-validate.js +4 -4
- package/lib/commands/secure.js +10 -9
- package/lib/commands/service-user.js +26 -25
- package/lib/commands/test-e2e-external.js +27 -1
- package/lib/commands/up-common.js +3 -2
- package/lib/commands/up-dataplane.js +29 -16
- 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 +14 -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 +55 -56
- package/lib/core/diff.js +3 -2
- package/lib/core/ensure-encryption-key.js +1 -1
- 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 +200 -37
- package/lib/core/templates-env.js +4 -3
- package/lib/datasource/abac-validator.js +1 -10
- package/lib/datasource/deploy.js +75 -53
- package/lib/datasource/field-reference-validator.js +9 -6
- package/lib/datasource/integration-context.js +63 -0
- package/lib/datasource/list.js +8 -7
- package/lib/datasource/log-viewer.js +84 -53
- package/lib/datasource/resolve-app.js +4 -4
- package/lib/datasource/test-e2e.js +95 -146
- package/lib/datasource/test-integration.js +114 -122
- 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 +157 -13
- 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 +92 -6
- 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.js +16 -4
- package/lib/generator/helpers.js +58 -3
- package/lib/generator/index.js +4 -0
- package/lib/generator/split-readme.js +12 -7
- package/lib/generator/split-variables.js +2 -1
- package/lib/generator/split.js +1 -1
- package/lib/generator/wizard-readme.js +3 -3
- package/lib/generator/wizard.js +8 -8
- package/lib/infrastructure/compose.js +60 -6
- package/lib/infrastructure/helpers.js +201 -29
- package/lib/infrastructure/index.js +28 -17
- 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 +1200 -442
- 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-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 +166 -7
- 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/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 +35 -8
- package/lib/utils/env-template.js +2 -2
- package/lib/utils/environment-scoped-resources.js +144 -0
- package/lib/utils/error-formatter.js +92 -13
- 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-readme.js +8 -1
- package/lib/utils/external-system-display.js +234 -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 +30 -12
- package/lib/utils/health-check-url.js +119 -0
- package/lib/utils/health-check.js +59 -25
- package/lib/utils/help-builder.js +11 -8
- 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 +3 -4
- package/lib/utils/paths.js +134 -47
- 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 +169 -49
- package/lib/utils/secrets-helpers.js +70 -59
- package/lib/utils/secrets-kv-scope.js +60 -0
- package/lib/utils/secrets-utils.js +32 -38
- package/lib/utils/secrets-validation.js +3 -1
- package/lib/utils/secrets-yaml-preserve.js +109 -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 +1 -2
- 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 +33 -14
- package/lib/validation/datasource-warnings.js +56 -0
- package/lib/validation/env-template-auth.js +1 -1
- package/lib/validation/external-manifest-validator.js +27 -7
- package/lib/validation/validate-display.js +37 -31
- package/lib/validation/validate.js +4 -13
- package/lib/validation/validator-unresolved-placeholders.js +98 -0
- package/lib/validation/validator.js +22 -65
- package/lib/validation/wizard-config-validator.js +2 -1
- package/package.json +7 -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 +75 -17
- 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 +42 -12
- 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/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/lib/api/external-test.api.js +0 -111
- package/lib/schema/env-config.yaml +0 -60
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load application.yaml for url:// resolution (current app via variablesPath, else builder-relative).
|
|
3
|
+
* @fileoverview
|
|
4
|
+
*/
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const yaml = require('js-yaml');
|
|
9
|
+
const fsRealSync = require('../internal/fs-real-sync');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {string} appKey
|
|
13
|
+
* @param {Object} ctx
|
|
14
|
+
* @param {object} pathsUtil - paths module (getProjectRoot)
|
|
15
|
+
* @returns {object|null}
|
|
16
|
+
*/
|
|
17
|
+
function loadApplicationYamlDocForUrlResolve(appKey, ctx, pathsUtil) {
|
|
18
|
+
try {
|
|
19
|
+
const current = ctx.currentAppKey || '';
|
|
20
|
+
if (appKey === current && ctx.variablesPath) {
|
|
21
|
+
const vp = path.resolve(String(ctx.variablesPath));
|
|
22
|
+
try {
|
|
23
|
+
const raw = fsRealSync.readFileSync(vp, 'utf8');
|
|
24
|
+
const doc = yaml.load(raw);
|
|
25
|
+
if (doc && typeof doc === 'object') {
|
|
26
|
+
return doc;
|
|
27
|
+
}
|
|
28
|
+
} catch {
|
|
29
|
+
// Fall through to builder-relative resolution
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const root = pathsUtil.getProjectRoot();
|
|
33
|
+
if (!root) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const cfgPath = path.resolve(path.join(root, 'builder', appKey, 'application.yaml'));
|
|
37
|
+
try {
|
|
38
|
+
const raw = fsRealSync.readFileSync(cfgPath, 'utf8');
|
|
39
|
+
const doc = yaml.load(raw);
|
|
40
|
+
return doc && typeof doc === 'object' ? doc : null;
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
} catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
module.exports = {
|
|
50
|
+
loadApplicationYamlDocForUrlResolve
|
|
51
|
+
};
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand url:// placeholders after kv:// (plan 122): full URL, host-only (origin), and vdir (path) variants.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Dual profile docker|local; devNN host only via Traefik + frontDoorRouting.host (plan 122)
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fsRealSync = require('../internal/fs-real-sync');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const yaml = require('js-yaml');
|
|
14
|
+
const { deriveEnvKeyFromClientId } = require('./derive-env-key-from-client-id');
|
|
15
|
+
const { parseDeveloperIdNum } = require('./declarative-url-ports');
|
|
16
|
+
const { computeDeclarativePathPrefix } = require('./url-declarative-url-flags');
|
|
17
|
+
const { refreshUrlsLocalRegistryFromBuilder, normalizePatternForUrl } = require('./urls-local-registry');
|
|
18
|
+
const pathsUtil = require('./paths');
|
|
19
|
+
const { parseUrlToken } = require('./url-declarative-token-parse');
|
|
20
|
+
const {
|
|
21
|
+
applyTstRemoteDeveloperHost,
|
|
22
|
+
applyTstRemoteDeveloperHostToOrigin,
|
|
23
|
+
buildPublicUrlString,
|
|
24
|
+
buildPublicHostOriginString,
|
|
25
|
+
buildInternalUrlString,
|
|
26
|
+
buildInternalHostOriginString,
|
|
27
|
+
expandResolvedUrlToken,
|
|
28
|
+
resolveListenPortPatternForToken
|
|
29
|
+
} = require('./url-declarative-resolve-build');
|
|
30
|
+
|
|
31
|
+
const URL_REF = /url:\/\/([^\s#'"]+)/g;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Expand each `url://token` in a value (comma-separated lists, e.g. CORS ALLOWED_ORIGINS).
|
|
35
|
+
* Tokens match {@link parseUrlToken} id characters (alphanumeric, dot, underscore, hyphen).
|
|
36
|
+
*
|
|
37
|
+
* @param {string} value - RHS of KEY=value
|
|
38
|
+
* @param {function(string): string} replaceToken - receives token without `url://`
|
|
39
|
+
* @returns {string}
|
|
40
|
+
*/
|
|
41
|
+
function expandDeclarativeUrlListValue(value, replaceToken) {
|
|
42
|
+
if (!value || typeof value !== 'string' || !value.includes('url://')) {
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
return value
|
|
46
|
+
.split(',')
|
|
47
|
+
.map((raw) => {
|
|
48
|
+
const seg = raw.trim();
|
|
49
|
+
const exact = /^url:\/\/([a-zA-Z0-9._-]+)$/.exec(seg);
|
|
50
|
+
if (exact) {
|
|
51
|
+
return replaceToken(exact[1]);
|
|
52
|
+
}
|
|
53
|
+
if (seg.includes('url://')) {
|
|
54
|
+
return seg.replace(/url:\/\/([a-zA-Z0-9._-]+)/g, (_full, tok) => replaceToken(tok));
|
|
55
|
+
}
|
|
56
|
+
return seg;
|
|
57
|
+
})
|
|
58
|
+
.join(',');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param {string} content - .env-like content
|
|
63
|
+
* @returns {Object.<string, string>}
|
|
64
|
+
*/
|
|
65
|
+
function parseSimpleEnvMap(content) {
|
|
66
|
+
const map = {};
|
|
67
|
+
if (!content || typeof content !== 'string') {
|
|
68
|
+
return map;
|
|
69
|
+
}
|
|
70
|
+
for (const line of content.split('\n')) {
|
|
71
|
+
const t = line.trim();
|
|
72
|
+
if (!t || t.startsWith('#')) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const eq = t.indexOf('=');
|
|
76
|
+
if (eq > 0) {
|
|
77
|
+
const k = t.slice(0, eq).trim();
|
|
78
|
+
map[k] = t.slice(eq + 1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return map;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Load application.yaml for cross-app scoped flag.
|
|
86
|
+
* @param {string} targetAppKey
|
|
87
|
+
* @returns {boolean}
|
|
88
|
+
*/
|
|
89
|
+
function readTargetAppScopedFlag(targetAppKey) {
|
|
90
|
+
try {
|
|
91
|
+
const appPath = pathsUtil.getBuilderPath(targetAppKey);
|
|
92
|
+
const cfgPath = path.join(appPath, 'application.yaml');
|
|
93
|
+
if (!fsRealSync.existsSync(cfgPath)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
const doc = yaml.load(fsRealSync.readFileSync(cfgPath, 'utf8'));
|
|
97
|
+
return doc && doc.environmentScopedResources === true;
|
|
98
|
+
} catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Resolve one url:// token to a concrete URL string.
|
|
105
|
+
* @param {string} token
|
|
106
|
+
* @param {Object} ctx - Same shape as expandDeclarativeUrlsInEnvContent ctx
|
|
107
|
+
* @param {'docker'|'local'} profile
|
|
108
|
+
* @param {number} devNum
|
|
109
|
+
* @param {string} derivedEnvKey
|
|
110
|
+
* @param {Object} registry
|
|
111
|
+
* @returns {string}
|
|
112
|
+
*/
|
|
113
|
+
function replaceUrlRefToken(token, ctx, profile, devNum, derivedEnvKey, registry) {
|
|
114
|
+
const parsed = parseUrlToken(token);
|
|
115
|
+
const resolved = resolveListenPortPatternForToken(token, ctx, registry);
|
|
116
|
+
if (!resolved) {
|
|
117
|
+
return `url://${token}`;
|
|
118
|
+
}
|
|
119
|
+
const {
|
|
120
|
+
appKey,
|
|
121
|
+
listenPort,
|
|
122
|
+
publicPortBasis,
|
|
123
|
+
patternStr,
|
|
124
|
+
hostTemplate,
|
|
125
|
+
tls,
|
|
126
|
+
frontDoorIngressActive
|
|
127
|
+
} = resolved;
|
|
128
|
+
const patternPath = normalizePatternForUrl(patternStr);
|
|
129
|
+
const appScoped = parsed.targetKey
|
|
130
|
+
? readTargetAppScopedFlag(parsed.targetKey)
|
|
131
|
+
: Boolean(ctx.appEnvironmentScopedResources);
|
|
132
|
+
const pathPrefix = computeDeclarativePathPrefix(
|
|
133
|
+
Boolean(ctx.traefik),
|
|
134
|
+
ctx.useEnvironmentScopedResources,
|
|
135
|
+
appScoped,
|
|
136
|
+
derivedEnvKey
|
|
137
|
+
);
|
|
138
|
+
return expandResolvedUrlToken(parsed, {
|
|
139
|
+
profile,
|
|
140
|
+
listenPort,
|
|
141
|
+
publicPortBasis,
|
|
142
|
+
appKey,
|
|
143
|
+
currentAppKey: ctx.currentAppKey || '',
|
|
144
|
+
patternPath,
|
|
145
|
+
pathPrefix,
|
|
146
|
+
remoteServer: ctx.remoteServer,
|
|
147
|
+
devNum,
|
|
148
|
+
derivedEnvKey,
|
|
149
|
+
traefik: Boolean(ctx.traefik),
|
|
150
|
+
hostTemplate,
|
|
151
|
+
tls,
|
|
152
|
+
frontDoorIngressActive,
|
|
153
|
+
developerIdRaw: ctx.developerIdRaw,
|
|
154
|
+
infraTlsEnabled: Boolean(ctx.infraTlsEnabled)
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Expand url:// references in env content (after kv://).
|
|
160
|
+
*
|
|
161
|
+
* @async
|
|
162
|
+
* @param {string} content
|
|
163
|
+
* @param {Object} ctx
|
|
164
|
+
* @param {'docker'|'local'} ctx.profile
|
|
165
|
+
* @param {string} ctx.currentAppKey
|
|
166
|
+
* @param {string|null} ctx.variablesPath
|
|
167
|
+
* @param {boolean} ctx.useEnvironmentScopedResources
|
|
168
|
+
* @param {boolean} ctx.appEnvironmentScopedResources
|
|
169
|
+
* @param {string|null|undefined} ctx.remoteServer
|
|
170
|
+
* @param {string|number|null|undefined} ctx.developerIdRaw
|
|
171
|
+
* @param {boolean} [ctx.traefik] - Infra Traefik proxy on. Plan 117 `/dev`/`/tst` applies only when this is true. Traefik **host** authority (`frontDoorRouting.host`) applies only when this is true **and** the target app has `frontDoorRouting.enabled: true` (plan 124 `pathActive`).
|
|
172
|
+
* @param {boolean} [ctx.infraTlsEnabled] - When true (`tlsEnabled` in config / `up-infra --tls`), Traefik front-door `url://public` uses https even if application.yaml has `frontDoorRouting.tls: false`
|
|
173
|
+
* @returns {Promise<string>}
|
|
174
|
+
*/
|
|
175
|
+
async function expandDeclarativeUrlsInEnvContent(content, ctx) {
|
|
176
|
+
if (!content || !content.includes('url://')) {
|
|
177
|
+
return content;
|
|
178
|
+
}
|
|
179
|
+
const profile = ctx.profile === 'docker' ? 'docker' : 'local';
|
|
180
|
+
const devNum = parseDeveloperIdNum(ctx.developerIdRaw);
|
|
181
|
+
const envMap = parseSimpleEnvMap(content);
|
|
182
|
+
const clientId = envMap.MISO_CLIENTID;
|
|
183
|
+
const pipelineOverride = envMap.MISO_PIPELINE_ENV_KEY;
|
|
184
|
+
const derivedEnvKey = deriveEnvKeyFromClientId(clientId, pipelineOverride);
|
|
185
|
+
const registry = refreshUrlsLocalRegistryFromBuilder(pathsUtil.getProjectRoot());
|
|
186
|
+
|
|
187
|
+
const lines = content.split('\n');
|
|
188
|
+
const outLines = lines.map((line) => {
|
|
189
|
+
const t = line.trim();
|
|
190
|
+
if (!t || t.startsWith('#') || !line.includes('url://')) {
|
|
191
|
+
return line;
|
|
192
|
+
}
|
|
193
|
+
const eq = line.indexOf('=');
|
|
194
|
+
if (eq <= 0) {
|
|
195
|
+
return line.replace(URL_REF, (_m, token) =>
|
|
196
|
+
replaceUrlRefToken(token, ctx, profile, devNum, derivedEnvKey, registry)
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
const keyPart = line.slice(0, eq);
|
|
200
|
+
const valuePart = line.slice(eq + 1);
|
|
201
|
+
const expandedValue = expandDeclarativeUrlListValue(valuePart, (token) =>
|
|
202
|
+
replaceUrlRefToken(token, ctx, profile, devNum, derivedEnvKey, registry)
|
|
203
|
+
);
|
|
204
|
+
return `${keyPart}=${expandedValue}`;
|
|
205
|
+
});
|
|
206
|
+
return outLines.join('\n');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
module.exports = {
|
|
210
|
+
expandDeclarativeUrlsInEnvContent,
|
|
211
|
+
expandDeclarativeUrlListValue,
|
|
212
|
+
parseSimpleEnvMap,
|
|
213
|
+
applyTstRemoteDeveloperHost,
|
|
214
|
+
applyTstRemoteDeveloperHostToOrigin,
|
|
215
|
+
buildPublicUrlString,
|
|
216
|
+
buildPublicHostOriginString,
|
|
217
|
+
buildInternalUrlString,
|
|
218
|
+
buildInternalHostOriginString,
|
|
219
|
+
parseUrlToken
|
|
220
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative url:// token shape parsing (plan 122/124).
|
|
3
|
+
* Single module for suffix lists and parseUrlToken — avoids drift with tests.
|
|
4
|
+
*
|
|
5
|
+
* @fileoverview parseUrlToken only; no URL expansion
|
|
6
|
+
* @author AI Fabrix Team
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Current-app tokens (no appKey prefix).
|
|
14
|
+
* @type {readonly { id: string, kind: 'public'|'internal', surface: 'full'|'host'|'vdir' }[]}
|
|
15
|
+
*/
|
|
16
|
+
const DECLARATIVE_URL_EXACT_TOKENS = Object.freeze([
|
|
17
|
+
{ id: 'host-public', kind: 'public', surface: 'host' },
|
|
18
|
+
{ id: 'host-internal', kind: 'internal', surface: 'host' },
|
|
19
|
+
{ id: 'host-private', kind: 'internal', surface: 'host' },
|
|
20
|
+
{ id: 'vdir-public', kind: 'public', surface: 'vdir' },
|
|
21
|
+
{ id: 'vdir-internal', kind: 'internal', surface: 'vdir' },
|
|
22
|
+
{ id: 'vdir-private', kind: 'internal', surface: 'vdir' },
|
|
23
|
+
{ id: 'public', kind: 'public', surface: 'full' },
|
|
24
|
+
{ id: 'internal', kind: 'internal', surface: 'full' },
|
|
25
|
+
{ id: 'private', kind: 'internal', surface: 'full' }
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Cross-app suffixes (longest match first). App key is token prefix before suffix.
|
|
30
|
+
* @type {readonly { suffix: string, kind: 'public'|'internal', surface: 'full'|'host'|'vdir' }[]}
|
|
31
|
+
*/
|
|
32
|
+
const DECLARATIVE_URL_CROSS_APP_SUFFIXES = Object.freeze([
|
|
33
|
+
{ suffix: '-host-public', kind: 'public', surface: 'host' },
|
|
34
|
+
{ suffix: '-host-internal', kind: 'internal', surface: 'host' },
|
|
35
|
+
{ suffix: '-host-private', kind: 'internal', surface: 'host' },
|
|
36
|
+
{ suffix: '-vdir-public', kind: 'public', surface: 'vdir' },
|
|
37
|
+
{ suffix: '-vdir-internal', kind: 'internal', surface: 'vdir' },
|
|
38
|
+
{ suffix: '-vdir-private', kind: 'internal', surface: 'vdir' }
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
const URL_TOKEN_EXACT = new Map(DECLARATIVE_URL_EXACT_TOKENS.map((d) => [d.id, { kind: d.kind, surface: d.surface }]));
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {string} token
|
|
45
|
+
* @returns {{ targetKey: string, kind: 'public'|'internal', surface: 'full'|'host'|'vdir' }}
|
|
46
|
+
*/
|
|
47
|
+
function parseUrlToken(token) {
|
|
48
|
+
const t = String(token || '').trim();
|
|
49
|
+
const exact = URL_TOKEN_EXACT.get(t);
|
|
50
|
+
if (exact) {
|
|
51
|
+
return { targetKey: '', kind: exact.kind, surface: exact.surface };
|
|
52
|
+
}
|
|
53
|
+
for (const { suffix, kind, surface } of DECLARATIVE_URL_CROSS_APP_SUFFIXES) {
|
|
54
|
+
if (t.endsWith(suffix)) {
|
|
55
|
+
return { targetKey: t.slice(0, -suffix.length), kind, surface };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (t.endsWith('-public')) {
|
|
59
|
+
return { targetKey: t.slice(0, -'-public'.length), kind: 'public', surface: 'full' };
|
|
60
|
+
}
|
|
61
|
+
if (t.endsWith('-internal')) {
|
|
62
|
+
return { targetKey: t.slice(0, -'-internal'.length), kind: 'internal', surface: 'full' };
|
|
63
|
+
}
|
|
64
|
+
if (t.endsWith('-private')) {
|
|
65
|
+
return { targetKey: t.slice(0, -'-private'.length), kind: 'internal', surface: 'full' };
|
|
66
|
+
}
|
|
67
|
+
return { targetKey: '', kind: 'public', surface: 'full' };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
module.exports = {
|
|
71
|
+
DECLARATIVE_URL_EXACT_TOKENS,
|
|
72
|
+
DECLARATIVE_URL_CROSS_APP_SUFFIXES,
|
|
73
|
+
parseUrlToken
|
|
74
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized declarative url:// flags (plan 124 truth table).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview pathActive, pathPrefix gating — single source for resolver + tests
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { computePublicUrlPathPrefix } = require('./url-public-path-prefix');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* pathActive = traefik on AND application.yaml frontDoorRouting.enabled === true
|
|
15
|
+
* @param {boolean} traefik
|
|
16
|
+
* @param {boolean} [frontDoorRoutingEnabled]
|
|
17
|
+
* @returns {boolean}
|
|
18
|
+
*/
|
|
19
|
+
function computePathActive(traefik, frontDoorRoutingEnabled) {
|
|
20
|
+
return Boolean(traefik) && frontDoorRoutingEnabled === true;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Plan 117 /dev|/tst prefix only when Traefik proxy is on; otherwise '' (plan 124).
|
|
25
|
+
* @param {boolean} traefik
|
|
26
|
+
* @param {boolean} useEnvironmentScopedResources
|
|
27
|
+
* @param {boolean} appEnvironmentScopedResources
|
|
28
|
+
* @param {string} derivedEnvKey
|
|
29
|
+
* @returns {string}
|
|
30
|
+
*/
|
|
31
|
+
function computeDeclarativePathPrefix(
|
|
32
|
+
traefik,
|
|
33
|
+
useEnvironmentScopedResources,
|
|
34
|
+
appEnvironmentScopedResources,
|
|
35
|
+
derivedEnvKey
|
|
36
|
+
) {
|
|
37
|
+
if (!traefik) {
|
|
38
|
+
return '';
|
|
39
|
+
}
|
|
40
|
+
return computePublicUrlPathPrefix(
|
|
41
|
+
useEnvironmentScopedResources,
|
|
42
|
+
appEnvironmentScopedResources,
|
|
43
|
+
derivedEnvKey
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module.exports = {
|
|
48
|
+
computePathActive,
|
|
49
|
+
computeDeclarativePathPrefix
|
|
50
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rewrite env lines that hold the declarative token url://vdir-public when the front-door
|
|
3
|
+
* path is inactive. Expansion would yield an empty path; consumers need a non-empty value,
|
|
4
|
+
* so the line is set to "/" only in that case.
|
|
5
|
+
*
|
|
6
|
+
* @fileoverview No schema or manifest keys — fixed "/" when path inactive (same token as url-declarative-resolve-build).
|
|
7
|
+
* Reads application.yaml via {@link module:lib/internal/fs-real-sync} so Jest fs mocks do not hide real files.
|
|
8
|
+
* @author AI Fabrix Team
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
'use strict';
|
|
13
|
+
|
|
14
|
+
const yaml = require('js-yaml');
|
|
15
|
+
const { existsSync, readFileSync } = require('../internal/fs-real-sync');
|
|
16
|
+
const { DECLARATIVE_URL_INFRA_DEFAULTS } = require('./infra-env-defaults');
|
|
17
|
+
const { computePathActive } = require('./url-declarative-url-flags');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Treat common YAML / string forms as enabled (strict `=== true` alone missed some parsers).
|
|
21
|
+
* @param {object|null|undefined} doc
|
|
22
|
+
* @returns {boolean}
|
|
23
|
+
*/
|
|
24
|
+
function isFrontDoorRoutingEnabledInDoc(doc) {
|
|
25
|
+
const v = doc && doc.frontDoorRouting && doc.frontDoorRouting.enabled;
|
|
26
|
+
return v === true || v === 'true' || v === 'yes' || v === 'on';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Parse application.yaml from disk (real fs — not Jest-mocked require('fs')).
|
|
31
|
+
* @param {string} variablesPath
|
|
32
|
+
* @returns {object|null}
|
|
33
|
+
*/
|
|
34
|
+
function loadApplicationYamlDoc(variablesPath) {
|
|
35
|
+
if (!variablesPath || !existsSync(variablesPath)) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
return yaml.load(readFileSync(variablesPath, 'utf8')) || null;
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Declarative URL token (matches {@link module:lib/utils/url-declarative-resolve-build} vdir-public). */
|
|
46
|
+
const URL_DECLARATIVE_VDIR_PUBLIC_TOKEN = 'url://vdir-public';
|
|
47
|
+
|
|
48
|
+
/** Value used when front-door path is inactive (would otherwise expand empty). */
|
|
49
|
+
const INACTIVE_VDIR_PUBLIC_ENV_FALLBACK =
|
|
50
|
+
DECLARATIVE_URL_INFRA_DEFAULTS.inactiveVdirPublicEnvReplacement;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @param {string} content - .env template fragment
|
|
54
|
+
* @param {string} replacement
|
|
55
|
+
* @returns {string}
|
|
56
|
+
*/
|
|
57
|
+
function applyInactiveVdirPublicTokenRewrite(content, replacement) {
|
|
58
|
+
if (!content || !content.includes(URL_DECLARATIVE_VDIR_PUBLIC_TOKEN)) {
|
|
59
|
+
return content;
|
|
60
|
+
}
|
|
61
|
+
const escaped = URL_DECLARATIVE_VDIR_PUBLIC_TOKEN.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
62
|
+
// End line with [ \t]* only — \s would consume \n and strip line endings from the file.
|
|
63
|
+
const lineRe = new RegExp(`^(\\s*[A-Z][A-Z0-9_]*)\\s*=\\s*${escaped}[ \t]*$`, 'gm');
|
|
64
|
+
return content.replace(lineRe, (_, lhs) => `${lhs}=${replacement}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Load application.yaml, compute pathActive, rewrite matching lines to "/" when inactive.
|
|
69
|
+
* @param {string} content
|
|
70
|
+
* @param {string|null|undefined} variablesPath
|
|
71
|
+
* @param {{ traefik?: boolean }} userCfg
|
|
72
|
+
* @returns {string}
|
|
73
|
+
*/
|
|
74
|
+
function rewriteInactiveDeclarativeVdirPublicContent(content, variablesPath, userCfg) {
|
|
75
|
+
if (!content || !variablesPath || !content.includes(URL_DECLARATIVE_VDIR_PUBLIC_TOKEN)) {
|
|
76
|
+
return content;
|
|
77
|
+
}
|
|
78
|
+
let doc = null;
|
|
79
|
+
try {
|
|
80
|
+
doc = loadApplicationYamlDoc(variablesPath);
|
|
81
|
+
} catch {
|
|
82
|
+
doc = null;
|
|
83
|
+
}
|
|
84
|
+
const pathActive = computePathActive(
|
|
85
|
+
Boolean(userCfg && userCfg.traefik),
|
|
86
|
+
isFrontDoorRoutingEnabledInDoc(doc)
|
|
87
|
+
);
|
|
88
|
+
if (pathActive) {
|
|
89
|
+
return content;
|
|
90
|
+
}
|
|
91
|
+
return applyInactiveVdirPublicTokenRewrite(content, INACTIVE_VDIR_PUBLIC_ENV_FALLBACK);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
module.exports = {
|
|
95
|
+
URL_DECLARATIVE_VDIR_PUBLIC_TOKEN,
|
|
96
|
+
INACTIVE_VDIR_PUBLIC_ENV_FALLBACK,
|
|
97
|
+
applyInactiveVdirPublicTokenRewrite,
|
|
98
|
+
rewriteInactiveDeclarativeVdirPublicContent
|
|
99
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan 117 URL path prefix for url://public (dev/tst only when gated).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview baseEffective ∧ derived envKey ∈ {dev,tst}. Caller must pass prefix only when `traefik` is on (see url-declarative-resolve).
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {boolean} useEnvironmentScopedResources - config gate
|
|
13
|
+
* @param {boolean} appEnvironmentScopedResources - application.yaml
|
|
14
|
+
* @param {string} derivedEnvKey - from client id (dev|tst|pro|miso)
|
|
15
|
+
* @returns {string} '' | '/dev' | '/tst'
|
|
16
|
+
*/
|
|
17
|
+
function computePublicUrlPathPrefix(useEnvironmentScopedResources, appEnvironmentScopedResources, derivedEnvKey) {
|
|
18
|
+
const baseEffective = Boolean(useEnvironmentScopedResources) && Boolean(appEnvironmentScopedResources);
|
|
19
|
+
if (!baseEffective) {
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
const k = String(derivedEnvKey || '').toLowerCase();
|
|
23
|
+
if (k === 'dev') {
|
|
24
|
+
return '/dev';
|
|
25
|
+
}
|
|
26
|
+
if (k === 'tst') {
|
|
27
|
+
return '/tst';
|
|
28
|
+
}
|
|
29
|
+
return '';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = {
|
|
33
|
+
computePublicUrlPathPrefix
|
|
34
|
+
};
|