@tdk-landscape/tdk-cli-core 1.3.15 → 1.3.26
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/Tiltfile +144 -0
- package/discovery/AGENTS.md +362 -0
- package/discovery/TILT_DISCOVERY.star +424 -0
- package/discovery/Tiltfile +58 -0
- package/discovery/config.star +258 -0
- package/discovery/constants.star +127 -0
- package/discovery/deterministic.star +211 -0
- package/discovery/discovery_daemon.star +191 -0
- package/discovery/discovery_orchestrator.star +460 -0
- package/discovery/filtering.star +5 -0
- package/discovery/identity-management-backend/service.yaml +26 -0
- package/discovery/identity-management-frontend/service.yaml +29 -0
- package/discovery/identity-sdk/service.yaml +9 -0
- package/discovery/incremental_discovery.star +213 -0
- package/discovery/indexing.star +7 -0
- package/discovery/json_manifest_scanner.star +51 -0
- package/discovery/libraries.star +46 -0
- package/discovery/loading.star +23 -0
- package/discovery/manifest/constants.star +104 -0
- package/discovery/manifest/loading.star +386 -0
- package/discovery/manifest/normalize.star +281 -0
- package/discovery/manifest/validation.star +108 -0
- package/discovery/normalization.star +11 -0
- package/discovery/registry.star +544 -0
- package/discovery/resource_snapshot.py +382 -0
- package/discovery/resource_snapshot.star +143 -0
- package/discovery/schemas.star +1 -0
- package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
- package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
- package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
- package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
- package/discovery/test_resource_snapshot.py +251 -0
- package/discovery/validation.star +78 -0
- package/discovery/versioning.star +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +36 -41
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/resource.d.ts.map +1 -1
- package/dist/commands/resource.js +51 -55
- package/dist/commands/resource.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +22 -24
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +1 -2
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +1 -2
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/upgrade.d.ts +8 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +59 -18
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/generator/extension-fetch.d.ts +19 -0
- package/dist/generator/extension-fetch.d.ts.map +1 -1
- package/dist/generator/extension-fetch.js +71 -5
- package/dist/generator/extension-fetch.js.map +1 -1
- package/dist/generator/template-engine.d.ts +1 -0
- package/dist/generator/template-engine.d.ts.map +1 -1
- package/dist/generator/template-engine.js +50 -6
- package/dist/generator/template-engine.js.map +1 -1
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +7 -9
- package/dist/utils/command-helpers.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +1 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +6 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/project-features.d.ts.map +1 -1
- package/dist/utils/project-features.js +1 -1
- package/dist/utils/project-features.js.map +1 -1
- package/dist/utils/resource-features.d.ts.map +1 -1
- package/dist/utils/resource-features.js +2 -2
- package/dist/utils/resource-features.js.map +1 -1
- package/dist/utils/tar.js +4 -4
- package/dist/utils/tar.js.map +1 -1
- package/dist/utils/validation.d.ts +7 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +9 -0
- package/dist/utils/validation.js.map +1 -1
- package/engine/AGENTS.md +705 -0
- package/engine/README.md +29 -0
- package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
- package/engine/Tiltfile +80 -0
- package/engine/assets/docker/golden-layers.Dockerfile +221 -0
- package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
- package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
- package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
- package/engine/config.star +3 -0
- package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
- package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
- package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
- package/engine/docs/C4-ARCHITECTURE.md +17 -0
- package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
- package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
- package/engine/docs/README.md +284 -0
- package/engine/entrypoint.star +97 -0
- package/engine/lifecycle/orchestrator.star +260 -0
- package/engine/paths.star +717 -0
- package/engine/schemas/manifest-schema.json +301 -0
- package/engine/schemas/service-schema.json +301 -0
- package/engine/scripts/README.md +89 -0
- package/engine/scripts/build-and-publish-lib.sh +205 -0
- package/engine/scripts/check-lib-publish.sh +85 -0
- package/engine/scripts/debug-container.sh +258 -0
- package/engine/scripts/generate-manifest.sh +197 -0
- package/engine/spec.master +702 -0
- package/engine/spec.master.example +341 -0
- package/engine/topologies/README.md +34 -0
- package/engine/topologies/platform/docker/AGENTS.md +59 -0
- package/engine/topologies/platform/docker/auth/auth.star +167 -0
- package/engine/topologies/platform/docker/build/golden_image.star +37 -0
- package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
- package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
- package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
- package/engine/topologies/platform/docker/compose/compose.star +636 -0
- package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
- package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
- package/engine/topologies/platform/docker/config/bunignore.star +142 -0
- package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
- package/engine/topologies/platform/docker/constants.star +170 -0
- package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
- package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
- package/engine/topologies/platform/docker/index.star +27 -0
- package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
- package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
- package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
- package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
- package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
- package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
- package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
- package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
- package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
- package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
- package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
- package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
- package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
- package/engine/topologies/platform/docker/networking/traefik.star +232 -0
- package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
- package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
- package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
- package/engine/topologies/platform/net/proxy.star +4 -0
- package/engine/topologies/platform/registries/local.star +4 -0
- package/engine/topologies/platform/security/secrets.star +239 -0
- package/engine/topologies/platform/state/relational.star +4 -0
- package/engine/topologies/tilt/common/AGENTS.md +59 -0
- package/engine/topologies/tilt/common/utils.star +364 -0
- package/engine/topologies/tilt/common/utils_debug.star +69 -0
- package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
- package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
- package/engine/topologies/tilt/common/utils_env.star +43 -0
- package/engine/topologies/tilt/common/utils_output.star +97 -0
- package/engine/topologies/tilt/config/AGENTS.md +68 -0
- package/engine/topologies/tilt/config/defaults.star +3 -0
- package/engine/topologies/tilt/config/feature_flags.star +10 -0
- package/engine/topologies/tilt/config/global.star +55 -0
- package/engine/topologies/tilt/config/profiles.star +382 -0
- package/engine/topologies/tilt/generators/agents_md.star +62 -0
- package/engine/topologies/tilt/generators/api_gateway.star +145 -0
- package/engine/topologies/tilt/generators/index.star +124 -0
- package/engine/topologies/tilt/generators/infisical/README.md +424 -0
- package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
- package/engine/topologies/tilt/generators/infisical/index.star +57 -0
- package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
- package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
- package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
- package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
- package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
- package/engine/topologies/tilt/generators/npmrc.star +111 -0
- package/engine/topologies/tilt/generators/tsconfig.star +23 -0
- package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
- package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
- package/engine/topologies/tilt/generators/typescript/common.star +7 -0
- package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
- package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
- package/engine/topologies/tilt/generators/typescript/include.star +23 -0
- package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
- package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
- package/engine/topologies/tilt/generators/validators.star +853 -0
- package/engine/topologies/tilt/generators/vite/backend.star +78 -0
- package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
- package/engine/topologies/tilt/generators/vite/generators.star +43 -0
- package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
- package/engine/topologies/tilt/generators/vite/library.star +65 -0
- package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
- package/engine/topologies/tilt/generators/vite/templates.star +737 -0
- package/engine/topologies/tilt/generators/vite_config.star +22 -0
- package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
- package/engine/topologies/tilt/manifest/README.md +693 -0
- package/engine/topologies/tilt/manifest/__init__.star +218 -0
- package/engine/topologies/tilt/manifest/constants.star +252 -0
- package/engine/topologies/tilt/manifest/errors.star +266 -0
- package/engine/topologies/tilt/manifest/integration.star +339 -0
- package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
- package/engine/topologies/tilt/manifest/loader.star +214 -0
- package/engine/topologies/tilt/manifest/mapper.star +227 -0
- package/engine/topologies/tilt/manifest/parser.star +400 -0
- package/engine/topologies/tilt/manifest/schema.star +462 -0
- package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
- package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
- package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
- package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
- package/engine/topologies/tilt/manifest/validator.star +717 -0
- package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
- package/engine/topologies/tilt/resources/AGENTS.md +71 -0
- package/engine/topologies/tilt/resources/conditions.star +3 -0
- package/engine/topologies/tilt/resources/databases.star +244 -0
- package/engine/topologies/tilt/resources/declaration.star +3 -0
- package/engine/topologies/tilt/resources/deps.star +3 -0
- package/engine/topologies/tilt/resources/infra-loader.star +437 -0
- package/engine/topologies/tilt/resources/libs.star +30 -0
- package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
- package/engine/topologies/tilt/resources/libs_paths.star +79 -0
- package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
- package/engine/topologies/tilt/resources/libs_setup.star +164 -0
- package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
- package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
- package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
- package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
- package/engine/topologies/tilt/resources/orchestrator.star +54 -0
- package/engine/topologies/tilt/resources/ordering.star +3 -0
- package/engine/topologies/tilt/resources/triggers.star +3 -0
- package/engine/topologies/tilt/resources/watchers.star +299 -0
- package/engine/where-things-live.star +717 -0
- package/ext/Tiltfile +66 -0
- package/ext/ide-components/README.md +219 -0
- package/ext/ide-components/code_executor/server.py +268 -0
- package/ext/ide-components/code_viewer/server.py +206 -0
- package/ext/ide-components/config_inspector/server.py +1050 -0
- package/ext/ide-components/file_browser/server.py +285 -0
- package/ext/ide-components/shared/config_service.py +469 -0
- package/ext/ide-components/shared/file_utils.py +298 -0
- package/ext/ide-components/shared/http_utils.py +232 -0
- package/ext/ide-components/shared/static/styles.css +1334 -0
- package/ext/ide-components/shared/syntax_highlighter.py +140 -0
- package/ext/ide-components/shared/template_engine.py +123 -0
- package/ext/ide-components/shared/templates/base.html +121 -0
- package/ext/ide-components/shared/test_config_service.py +326 -0
- package/ext/ide-components/shared/tilt_integration.py +158 -0
- package/ext/ui-enhancements/cron-status-server.sh +49 -0
- package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
- package/ext/ui-enhancements/extension.yaml +36 -0
- package/ext/ui-enhancements/tiltfile.py +99 -0
- package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
- package/ext/ui-enhancements/ui/help-panel.css +279 -0
- package/ext/ui-enhancements/ui/icons.css +125 -0
- package/ext/ui-enhancements/ui/tooltips.css +114 -0
- package/package.json +13 -9
- package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
- package/specs/specs/TILT_TECH_STACK.star +159 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 🔐 INFISICAL SECRETS GENERATOR
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Generates secret injection configuration for services
|
|
5
|
+
# Replaces: Shell-based infisical-entrypoint.sh injection
|
|
6
|
+
# =============================================================================
|
|
7
|
+
#
|
|
8
|
+
# This module generates:
|
|
9
|
+
# - Environment variable mappings for secret paths
|
|
10
|
+
# - Docker Compose secret injection configuration
|
|
11
|
+
# - Kubernetes secret references (future)
|
|
12
|
+
# - Local development .env templates
|
|
13
|
+
#
|
|
14
|
+
# Usage:
|
|
15
|
+
# load("./infisical/secrets_generator.star", "SecretsGenerator")
|
|
16
|
+
# config = SecretsGenerator.generate_for_service("my-service", "/services/my-service")
|
|
17
|
+
# =============================================================================
|
|
18
|
+
|
|
19
|
+
def _get_timestamp():
|
|
20
|
+
"""Get current timestamp string"""
|
|
21
|
+
return str(local("date +%Y-%m-%dT%H:%M:%S", quiet=True)).strip()
|
|
22
|
+
|
|
23
|
+
# =============================================================================
|
|
24
|
+
# Secret Path Configuration
|
|
25
|
+
# =============================================================================
|
|
26
|
+
|
|
27
|
+
DEFAULT_SECRET_KEYS = [
|
|
28
|
+
"DATABASE_URL",
|
|
29
|
+
"JWT_SECRET",
|
|
30
|
+
"RESOURCE_API_KEY",
|
|
31
|
+
"REDIS_URL",
|
|
32
|
+
"NATS_URL",
|
|
33
|
+
"STRIPE_SECRET_KEY",
|
|
34
|
+
"STRIPE_WEBHOOK_SECRET",
|
|
35
|
+
"API_GATEWAY_TOKEN",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
# Required secrets for each service type
|
|
39
|
+
RESOURCE_TYPE_SECRETS = {
|
|
40
|
+
"backend": [
|
|
41
|
+
"DATABASE_URL",
|
|
42
|
+
"JWT_SECRET",
|
|
43
|
+
"RESOURCE_API_KEY",
|
|
44
|
+
],
|
|
45
|
+
"frontend": [
|
|
46
|
+
"API_GATEWAY_TOKEN",
|
|
47
|
+
],
|
|
48
|
+
"api-gateway": [
|
|
49
|
+
"JWT_SECRET",
|
|
50
|
+
"RESOURCE_API_KEY",
|
|
51
|
+
],
|
|
52
|
+
"payment": [
|
|
53
|
+
"DATABASE_URL",
|
|
54
|
+
"JWT_SECRET",
|
|
55
|
+
"RESOURCE_API_KEY",
|
|
56
|
+
"STRIPE_SECRET_KEY",
|
|
57
|
+
"STRIPE_WEBHOOK_SECRET",
|
|
58
|
+
],
|
|
59
|
+
"notification": [
|
|
60
|
+
"DATABASE_URL",
|
|
61
|
+
"JWT_SECRET",
|
|
62
|
+
"RESOURCE_API_KEY",
|
|
63
|
+
"SMTP_PASSWORD",
|
|
64
|
+
"SENDGRID_API_KEY",
|
|
65
|
+
],
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# =============================================================================
|
|
69
|
+
# Secret Injection Patterns
|
|
70
|
+
# =============================================================================
|
|
71
|
+
|
|
72
|
+
def _generate_docker_compose_env(resource_name, secret_path, additional_vars=None):
|
|
73
|
+
"""
|
|
74
|
+
Generate Docker Compose environment section for secret injection.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
resource_name: Name of the service
|
|
78
|
+
secret_path: Infisical path (e.g., /services/my-service)
|
|
79
|
+
additional_vars: Additional environment variables dict
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Dictionary for docker-compose environment section
|
|
83
|
+
"""
|
|
84
|
+
env = {
|
|
85
|
+
# Core Infisical configuration
|
|
86
|
+
"RESOURCE_NAME": resource_name,
|
|
87
|
+
"INFISICAL_SECRET_PATH": secret_path,
|
|
88
|
+
|
|
89
|
+
# Token injection (from host env or Infisical)
|
|
90
|
+
"INFISICAL_TOKEN": "${INFISICAL_TOKEN:-}",
|
|
91
|
+
"INFISICAL_CLIENT_ID": "${INFISICAL_CLIENT_ID:-}",
|
|
92
|
+
"INFISICAL_CLIENT_SECRET": "${INFISICAL_CLIENT_SECRET:-}",
|
|
93
|
+
|
|
94
|
+
# API configuration
|
|
95
|
+
"INFISICAL_API_URL": "${INFISICAL_API_URL:-http://infisical:8080}",
|
|
96
|
+
"INFISICAL_PROJECT_ID": "${INFISICAL_PROJECT_ID:-}",
|
|
97
|
+
"INFISICAL_ENVIRONMENT": "${INFISICAL_ENVIRONMENT:-dev}",
|
|
98
|
+
|
|
99
|
+
# Fallback policy: this generator only feeds local Tilt/docker-compose dev
|
|
100
|
+
# environments (see topologies/platform/docker/compose/compose.star). There's
|
|
101
|
+
# rarely a real Infisical server running locally, so default to allowing the
|
|
102
|
+
# entrypoint to fall back to the plain env vars already in the compose file
|
|
103
|
+
# instead of failing to start. Production/CI paths (Kubernetes secrets, etc.)
|
|
104
|
+
# are generated separately and are unaffected by this default.
|
|
105
|
+
"INFISICAL_ALLOW_FALLBACK": "${INFISICAL_ALLOW_FALLBACK:-true}",
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if additional_vars:
|
|
109
|
+
env.update(additional_vars)
|
|
110
|
+
|
|
111
|
+
return env
|
|
112
|
+
|
|
113
|
+
def _generate_entrypoint_env(resource_name, secret_path, command):
|
|
114
|
+
"""
|
|
115
|
+
Generate environment for entrypoint.sh-based secret injection.
|
|
116
|
+
|
|
117
|
+
This is the zero-code pattern - entrypoint handles all secret fetching.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
resource_name: Name of the service
|
|
121
|
+
secret_path: Infisical path
|
|
122
|
+
command: Command to run after secret injection
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Dict with entrypoint configuration
|
|
126
|
+
"""
|
|
127
|
+
return {
|
|
128
|
+
"RESOURCE_NAME": resource_name,
|
|
129
|
+
"INFISICAL_SECRET_PATH": secret_path,
|
|
130
|
+
"INFISICAL_TOKEN": "${INFISICAL_TOKEN:-}",
|
|
131
|
+
"INFISICAL_CLIENT_ID": "${INFISICAL_CLIENT_ID:-}",
|
|
132
|
+
"INFISICAL_CLIENT_SECRET": "${INFISICAL_CLIENT_SECRET:-}",
|
|
133
|
+
"INFISICAL_API_URL": "${INFISICAL_API_URL:-http://infisical:8080}",
|
|
134
|
+
"INFISICAL_PROJECT_ID": "${INFISICAL_PROJECT_ID:-}",
|
|
135
|
+
"INFISICAL_ENVIRONMENT": "${INFISICAL_ENVIRONMENT:-dev}",
|
|
136
|
+
"ENTRYPOINT_COMMAND": command,
|
|
137
|
+
"INFISICAL_ALLOW_FALLBACK": "false",
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
def _generate_kubernetes_secret_ref(resource_name, secret_path):
|
|
141
|
+
"""
|
|
142
|
+
Generate Kubernetes secret reference configuration.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
resource_name: Name of the service
|
|
146
|
+
secret_path: Infisical path
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Dict with Kubernetes secret configuration
|
|
150
|
+
"""
|
|
151
|
+
return {
|
|
152
|
+
"apiVersion": "v1",
|
|
153
|
+
"kind": "Secret",
|
|
154
|
+
"metadata": {
|
|
155
|
+
"name": "{}-secrets".format(resource_name),
|
|
156
|
+
"annotations": {
|
|
157
|
+
"infisical.path": secret_path,
|
|
158
|
+
"infisical.operator.kubernetes.io/auto-reload": "true",
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
"type": "Opaque",
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# =============================================================================
|
|
165
|
+
# Local Development Configuration
|
|
166
|
+
# =============================================================================
|
|
167
|
+
|
|
168
|
+
def _generate_local_env_template(resource_name, secret_path, resource_type="backend"):
|
|
169
|
+
"""
|
|
170
|
+
Generate .env file template for local development.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
resource_name: Name of the service
|
|
174
|
+
secret_path: Infisical path
|
|
175
|
+
resource_type: Type of service for determining required secrets
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
String content for .env file
|
|
179
|
+
"""
|
|
180
|
+
required_secrets = RESOURCE_TYPE_SECRETS.get(resource_type, RESOURCE_TYPE_SECRETS["backend"])
|
|
181
|
+
timestamp = _get_timestamp()
|
|
182
|
+
|
|
183
|
+
lines = [
|
|
184
|
+
"# Infisical Local Development Configuration",
|
|
185
|
+
"# Service: {}".format(resource_name),
|
|
186
|
+
"# Path: {}".format(secret_path),
|
|
187
|
+
"# Generated: {}".format(timestamp),
|
|
188
|
+
"#",
|
|
189
|
+
"# ⚠️ SECURITY WARNING: Do not commit this file to Git!",
|
|
190
|
+
"# This file should be in .gitignore",
|
|
191
|
+
"",
|
|
192
|
+
"# Infisical Connection",
|
|
193
|
+
"INFISICAL_API_URL=http://localhost:8089",
|
|
194
|
+
"INFISICAL_ENVIRONMENT=dev",
|
|
195
|
+
"INFISICAL_SECRET_PATH={}".format(secret_path),
|
|
196
|
+
"RESOURCE_NAME={}".format(resource_name),
|
|
197
|
+
"",
|
|
198
|
+
"# Authentication (Machine Identity)",
|
|
199
|
+
"# Get these from Infisical Dashboard > Identities > machine1",
|
|
200
|
+
"INFISICAL_CLIENT_ID=your-client-id-here",
|
|
201
|
+
"INFISICAL_CLIENT_SECRET=your-client-secret-here",
|
|
202
|
+
"INFISICAL_PROJECT_ID=your-project-id-here",
|
|
203
|
+
"",
|
|
204
|
+
"# Required Secrets (to be fetched from Infisical):",
|
|
205
|
+
]
|
|
206
|
+
|
|
207
|
+
for secret in required_secrets:
|
|
208
|
+
lines.append("# {}=__will_be_fetched_from_infisical__".format(secret))
|
|
209
|
+
|
|
210
|
+
lines.extend([
|
|
211
|
+
"",
|
|
212
|
+
"# Tilt Integration (optional)",
|
|
213
|
+
"# These are injected by Tilt during local development",
|
|
214
|
+
"TILT_ENV=local",
|
|
215
|
+
"TILT_HOST=localhost",
|
|
216
|
+
])
|
|
217
|
+
|
|
218
|
+
return "\n".join(lines)
|
|
219
|
+
|
|
220
|
+
# =============================================================================
|
|
221
|
+
# Validation
|
|
222
|
+
# =============================================================================
|
|
223
|
+
|
|
224
|
+
def _validate_secret_path(secret_path):
|
|
225
|
+
"""
|
|
226
|
+
Validate Infisical secret path format.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
secret_path: Path to validate
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
Tuple (is_valid, error_message)
|
|
233
|
+
"""
|
|
234
|
+
if not secret_path:
|
|
235
|
+
return False, "Secret path cannot be empty"
|
|
236
|
+
|
|
237
|
+
if not secret_path.startswith("/"):
|
|
238
|
+
return False, "Secret path must start with /"
|
|
239
|
+
|
|
240
|
+
# Valid characters: alphanumeric, hyphen, underscore, forward slash
|
|
241
|
+
valid_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_/"
|
|
242
|
+
invalid = []
|
|
243
|
+
for i in range(len(secret_path)):
|
|
244
|
+
c = secret_path[i]
|
|
245
|
+
if c not in valid_chars:
|
|
246
|
+
invalid.append(c)
|
|
247
|
+
if len(invalid) > 0:
|
|
248
|
+
return False, "Invalid characters in path: {}".format(invalid)
|
|
249
|
+
|
|
250
|
+
# Path depth limit (Infisical limitation)
|
|
251
|
+
parts = []
|
|
252
|
+
for x in secret_path.split("/"):
|
|
253
|
+
if x:
|
|
254
|
+
parts.append(x)
|
|
255
|
+
depth = len(parts)
|
|
256
|
+
if depth > 20:
|
|
257
|
+
return False, "Path depth exceeds maximum (20)"
|
|
258
|
+
|
|
259
|
+
return True, ""
|
|
260
|
+
|
|
261
|
+
def _validate_resource_name(resource_name):
|
|
262
|
+
"""
|
|
263
|
+
Validate service name format.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
resource_name: Name to validate
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
Tuple (is_valid, error_message)
|
|
270
|
+
"""
|
|
271
|
+
if not resource_name:
|
|
272
|
+
return False, "Service name cannot be empty"
|
|
273
|
+
|
|
274
|
+
# Valid characters: alphanumeric, hyphen, underscore
|
|
275
|
+
valid_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
|
|
276
|
+
invalid = []
|
|
277
|
+
for i in range(len(resource_name)):
|
|
278
|
+
c = resource_name[i]
|
|
279
|
+
if c not in valid_chars:
|
|
280
|
+
invalid.append(c)
|
|
281
|
+
if len(invalid) > 0:
|
|
282
|
+
return False, "Invalid characters in service name: {}".format(invalid)
|
|
283
|
+
|
|
284
|
+
if len(resource_name) > 64:
|
|
285
|
+
return False, "Service name too long (max 64 characters)"
|
|
286
|
+
|
|
287
|
+
return True, ""
|
|
288
|
+
|
|
289
|
+
# =============================================================================
|
|
290
|
+
# Main Generator Functions
|
|
291
|
+
# =============================================================================
|
|
292
|
+
|
|
293
|
+
def generate_for_service(resource_name, secret_path, resource_type="backend", command=None, additional_vars=None):
|
|
294
|
+
"""
|
|
295
|
+
Generate complete secret injection configuration for a service.
|
|
296
|
+
|
|
297
|
+
This is the main entry point for secret generation.
|
|
298
|
+
|
|
299
|
+
Args:
|
|
300
|
+
resource_name: Name of the service (e.g., "user-management-backend")
|
|
301
|
+
secret_path: Infisical path (e.g., "/services/user")
|
|
302
|
+
resource_type: Type of service (backend, frontend, api-gateway, payment, notification)
|
|
303
|
+
command: Command to run after secret injection (for entrypoint pattern)
|
|
304
|
+
additional_vars: Additional environment variables
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
Dict with all secret configurations:
|
|
308
|
+
{
|
|
309
|
+
"resource_name": str,
|
|
310
|
+
"secret_path": str,
|
|
311
|
+
"resource_type": str,
|
|
312
|
+
"validation": {"valid": bool, "errors": [str]},
|
|
313
|
+
"docker_compose": {"environment": dict},
|
|
314
|
+
"entrypoint": {"environment": dict},
|
|
315
|
+
"kubernetes": {"secret_ref": dict},
|
|
316
|
+
"local_template": str,
|
|
317
|
+
"required_secrets": [str],
|
|
318
|
+
}
|
|
319
|
+
"""
|
|
320
|
+
# Validate inputs
|
|
321
|
+
path_valid, path_error = _validate_secret_path(secret_path)
|
|
322
|
+
name_valid, name_error = _validate_resource_name(resource_name)
|
|
323
|
+
|
|
324
|
+
errors = []
|
|
325
|
+
if not path_valid:
|
|
326
|
+
errors.append(path_error)
|
|
327
|
+
if not name_valid:
|
|
328
|
+
errors.append(name_error)
|
|
329
|
+
|
|
330
|
+
validation = {
|
|
331
|
+
"valid": path_valid and name_valid,
|
|
332
|
+
"errors": errors,
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
# Generate configurations
|
|
336
|
+
docker_compose_env = _generate_docker_compose_env(resource_name, secret_path, additional_vars)
|
|
337
|
+
|
|
338
|
+
entrypoint_env = None
|
|
339
|
+
if command:
|
|
340
|
+
entrypoint_env = _generate_entrypoint_env(resource_name, secret_path, command)
|
|
341
|
+
|
|
342
|
+
k8s_secret = _generate_kubernetes_secret_ref(resource_name, secret_path)
|
|
343
|
+
local_template = _generate_local_env_template(resource_name, secret_path, resource_type)
|
|
344
|
+
required_secrets = RESOURCE_TYPE_SECRETS.get(resource_type, RESOURCE_TYPE_SECRETS["backend"])
|
|
345
|
+
|
|
346
|
+
return {
|
|
347
|
+
"resource_name": resource_name,
|
|
348
|
+
"secret_path": secret_path,
|
|
349
|
+
"resource_type": resource_type,
|
|
350
|
+
"validation": validation,
|
|
351
|
+
"docker_compose": {
|
|
352
|
+
"environment": docker_compose_env,
|
|
353
|
+
},
|
|
354
|
+
"entrypoint": {
|
|
355
|
+
"environment": entrypoint_env,
|
|
356
|
+
} if entrypoint_env else None,
|
|
357
|
+
"kubernetes": {
|
|
358
|
+
"secret_ref": k8s_secret,
|
|
359
|
+
},
|
|
360
|
+
"local_template": local_template,
|
|
361
|
+
"required_secrets": required_secrets,
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
def generate_for_services_batch(services_config):
|
|
365
|
+
"""
|
|
366
|
+
Generate secret configurations for multiple services.
|
|
367
|
+
|
|
368
|
+
Args:
|
|
369
|
+
services_config: List of dicts with keys:
|
|
370
|
+
- name: Service name
|
|
371
|
+
- path: Infisical path
|
|
372
|
+
- type: Service type (optional, default "backend")
|
|
373
|
+
- command: Entrypoint command (optional)
|
|
374
|
+
- additional_vars: Additional env vars (optional)
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
Dict mapping service names to their configurations
|
|
378
|
+
"""
|
|
379
|
+
results = {}
|
|
380
|
+
|
|
381
|
+
for config in services_config:
|
|
382
|
+
name = config.get("name")
|
|
383
|
+
path = config.get("path")
|
|
384
|
+
svc_type = config.get("type", "backend")
|
|
385
|
+
command = config.get("command")
|
|
386
|
+
additional = config.get("additional_vars")
|
|
387
|
+
|
|
388
|
+
if not name or not path:
|
|
389
|
+
results[name or "unknown"] = {
|
|
390
|
+
"validation": {"valid": False, "errors": ["Missing name or path"]},
|
|
391
|
+
}
|
|
392
|
+
continue
|
|
393
|
+
|
|
394
|
+
results[name] = generate_for_service(name, path, svc_type, command, additional)
|
|
395
|
+
|
|
396
|
+
return results
|
|
397
|
+
|
|
398
|
+
# =============================================================================
|
|
399
|
+
# Public API
|
|
400
|
+
# =============================================================================
|
|
401
|
+
|
|
402
|
+
SecretsGenerator = struct(
|
|
403
|
+
# Main generator functions
|
|
404
|
+
generate_for_service=generate_for_service,
|
|
405
|
+
generate_for_services_batch=generate_for_services_batch,
|
|
406
|
+
|
|
407
|
+
# Validation
|
|
408
|
+
validate_secret_path=_validate_secret_path,
|
|
409
|
+
validate_resource_name=_validate_resource_name,
|
|
410
|
+
|
|
411
|
+
# Configuration constants
|
|
412
|
+
DEFAULT_SECRET_KEYS=DEFAULT_SECRET_KEYS,
|
|
413
|
+
RESOURCE_TYPE_SECRETS=RESOURCE_TYPE_SECRETS,
|
|
414
|
+
|
|
415
|
+
# Individual generators (for advanced use)
|
|
416
|
+
generate_docker_compose_env=_generate_docker_compose_env,
|
|
417
|
+
generate_entrypoint_env=_generate_entrypoint_env,
|
|
418
|
+
generate_kubernetes_secret_ref=_generate_kubernetes_secret_ref,
|
|
419
|
+
generate_local_env_template=_generate_local_env_template,
|
|
420
|
+
)
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 🌐 TILT SDK - NGINX PROVIDER
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Path: .tilt/providers/nginx.star
|
|
5
|
+
# Purpose: Generate nginx configs for frontend services
|
|
6
|
+
# =============================================================================
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# === INLINED CONSTANTS for pure extension loading ===
|
|
10
|
+
BASE_PORT_FRONTEND = 3000
|
|
11
|
+
OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
|
|
12
|
+
# === END INLINED CONSTANTS ===
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
load('../../../topologies/tilt/common/utils.star', 'Utils')
|
|
16
|
+
load('../../../topologies/tilt/manifest/constants.star', 'GENERATED_CONFIG_FILENAMES')
|
|
17
|
+
|
|
18
|
+
# NOTE: api_gateway.star loaded by caller to avoid circular imports
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def api_proxy_location(backend_name, port=BASE_PORT_FRONTEND, base_path='', stack=''):
|
|
22
|
+
"""Return nginx location /api block that proxy_passes to the given backend (Vite-proxy style in prod)."""
|
|
23
|
+
return """
|
|
24
|
+
location /api {{
|
|
25
|
+
proxy_pass http://{backend}:{port};
|
|
26
|
+
proxy_http_version 1.1;
|
|
27
|
+
proxy_set_header Host $host;
|
|
28
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
29
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
30
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
31
|
+
}}""".format(backend=backend_name, port=port)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def generate_frontend_nginx(manifest, write_fn=None, referer_map_block=''):
|
|
35
|
+
"""
|
|
36
|
+
Generate nginx config for frontend services.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
manifest: Service manifest dict
|
|
40
|
+
write_fn: Function to write files
|
|
41
|
+
referer_map_block: Generated referer map block (from ApiGateway)
|
|
42
|
+
|
|
43
|
+
Output:
|
|
44
|
+
{resource_path}/.autogenerated/nginx.autogenerated.conf
|
|
45
|
+
"""
|
|
46
|
+
if manifest.get('appType') != 'frontend':
|
|
47
|
+
return ''
|
|
48
|
+
|
|
49
|
+
resource_path = manifest.get('_resource_path', '')
|
|
50
|
+
app_name = manifest.get('appName', 'unknown-frontend')
|
|
51
|
+
backend_name = manifest.get('backendName', 'backend')
|
|
52
|
+
header = Utils.get_template_header(
|
|
53
|
+
'nginx',
|
|
54
|
+
'Nginx.frontend()',
|
|
55
|
+
app_name,
|
|
56
|
+
'Output: .autogenerated/' + GENERATED_CONFIG_FILENAMES['nginx'],
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
base_path = manifest.get('basePath', '')
|
|
60
|
+
stack = manifest.get('stack', '')
|
|
61
|
+
port = manifest.get('port', BASE_PORT_FRONTEND)
|
|
62
|
+
# NOTE: referer_map_block now passed as parameter to avoid circular import
|
|
63
|
+
|
|
64
|
+
conf = """{header}
|
|
65
|
+
# Docker DNS resolver
|
|
66
|
+
resolver 127.0.0.11 valid=30s ipv6=off;
|
|
67
|
+
|
|
68
|
+
{referer_map_block}
|
|
69
|
+
|
|
70
|
+
server {{
|
|
71
|
+
listen 80;
|
|
72
|
+
server_name _;
|
|
73
|
+
root /usr/share/nginx/html;
|
|
74
|
+
index index.html;
|
|
75
|
+
|
|
76
|
+
gzip on;
|
|
77
|
+
gzip_vary on;
|
|
78
|
+
gzip_min_length 1024;
|
|
79
|
+
gzip_proxied any;
|
|
80
|
+
gzip_comp_level 6;
|
|
81
|
+
gzip_types
|
|
82
|
+
text/plain
|
|
83
|
+
text/css
|
|
84
|
+
text/xml
|
|
85
|
+
text/javascript
|
|
86
|
+
application/json
|
|
87
|
+
application/javascript
|
|
88
|
+
application/xml+rss
|
|
89
|
+
application/atom+xml
|
|
90
|
+
image/svg+xml;
|
|
91
|
+
|
|
92
|
+
location / {{
|
|
93
|
+
try_files $uri $uri/ /index.html;
|
|
94
|
+
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
|
|
95
|
+
add_header Pragma "no-cache" always;
|
|
96
|
+
add_header Expires "0" always;
|
|
97
|
+
}}
|
|
98
|
+
|
|
99
|
+
location ~* \\.(js|css)$ {{
|
|
100
|
+
expires 2m;
|
|
101
|
+
add_header Cache-Control "public, max-age=120, must-revalidate";
|
|
102
|
+
add_header Last-Modified $date_gmt;
|
|
103
|
+
add_header ETag off;
|
|
104
|
+
if_modified_since off;
|
|
105
|
+
}}
|
|
106
|
+
|
|
107
|
+
location ~* \\.(png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {{
|
|
108
|
+
expires 1y;
|
|
109
|
+
add_header Cache-Control "public, immutable";
|
|
110
|
+
}}
|
|
111
|
+
|
|
112
|
+
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
113
|
+
add_header X-Content-Type-Options "nosniff" always;
|
|
114
|
+
add_header X-XSS-Protection "1; mode=block" always;
|
|
115
|
+
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
|
116
|
+
|
|
117
|
+
location /api {{
|
|
118
|
+
proxy_pass $api_backend;
|
|
119
|
+
proxy_http_version 1.1;
|
|
120
|
+
proxy_set_header Host $host;
|
|
121
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
122
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
123
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
124
|
+
proxy_set_header X-Referer $http_referer;
|
|
125
|
+
}}
|
|
126
|
+
|
|
127
|
+
location /health {{
|
|
128
|
+
access_log off;
|
|
129
|
+
return 200 "healthy\\n";
|
|
130
|
+
add_header Content-Type text/plain;
|
|
131
|
+
}}
|
|
132
|
+
}}""".format(header=header, referer_map_block=referer_map_block)
|
|
133
|
+
|
|
134
|
+
if write_fn:
|
|
135
|
+
write_fn(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['nginx'], conf)
|
|
136
|
+
|
|
137
|
+
return conf
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
Nginx = struct(
|
|
141
|
+
api_proxy_location = api_proxy_location,
|
|
142
|
+
frontend = generate_frontend_nginx,
|
|
143
|
+
)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# 📦 TILT SDK - NPM/BUN CONFIG PROVIDER
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Path: .tilt/providers/npmrc.star
|
|
5
|
+
# Purpose: Generate .npmrc and bunfig.toml for Verdaccio registry
|
|
6
|
+
# =============================================================================
|
|
7
|
+
#
|
|
8
|
+
# Generates configuration files for:
|
|
9
|
+
# - .npmrc / .npmrc.docker.autogenerated - NPM registry configuration
|
|
10
|
+
# - bunfig.toml / bunfig.docker.autogenerated.toml - Bun package manager configuration
|
|
11
|
+
#
|
|
12
|
+
# These files ensure services can install @{npm_scope}/* packages from
|
|
13
|
+
# the local Verdaccio registry during development.
|
|
14
|
+
# =============================================================================
|
|
15
|
+
|
|
16
|
+
load("../../../topologies/tilt/common/utils.star", "Utils")
|
|
17
|
+
|
|
18
|
+
# Output folder constant (consistent with other generators)
|
|
19
|
+
OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
|
|
20
|
+
|
|
21
|
+
# Load npm scope from project.json (or use project name as default)
|
|
22
|
+
# Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
|
|
23
|
+
def _load_npm_scope():
|
|
24
|
+
project_root = os.environ.get('TDK_PROJECT_ROOT', '')
|
|
25
|
+
project_json_path = '.tdk/project.json'
|
|
26
|
+
if project_root:
|
|
27
|
+
project_json_path = project_root + '/' + project_json_path
|
|
28
|
+
|
|
29
|
+
if os.path.exists(project_json_path):
|
|
30
|
+
_project_json = read_json(project_json_path)
|
|
31
|
+
return _project_json.get('project', {}).get('name', 'tdk-project')
|
|
32
|
+
return 'tdk-project'
|
|
33
|
+
|
|
34
|
+
_NPM_SCOPE = _load_npm_scope()
|
|
35
|
+
load("../../../topologies/tilt/manifest/constants.star", "PACKAGE_CONFIG_FILENAMES")
|
|
36
|
+
|
|
37
|
+
# =============================================================================
|
|
38
|
+
# 📝 NPMRC GENERATORS
|
|
39
|
+
# =============================================================================
|
|
40
|
+
|
|
41
|
+
def generate_npmrc(resource_path, registry_url, is_docker, write_fn):
|
|
42
|
+
"""
|
|
43
|
+
Generate .npmrc for NPM registry configuration.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
resource_path: Path to service directory
|
|
47
|
+
registry_url: Verdaccio registry URL
|
|
48
|
+
is_docker: If True, generates .npmrc.docker.autogenerated, else .npmrc
|
|
49
|
+
write_fn: File writer function
|
|
50
|
+
"""
|
|
51
|
+
registry_host = registry_url.replace("http://", "").replace("https://", "").rstrip("/")
|
|
52
|
+
|
|
53
|
+
target_dir = resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER
|
|
54
|
+
generated_filename = PACKAGE_CONFIG_FILENAMES['npmrc_docker_autogenerated'] if is_docker else PACKAGE_CONFIG_FILENAMES['npmrc']
|
|
55
|
+
header = Utils.get_template_header("npmrc", target_dir + "/" + generated_filename)
|
|
56
|
+
content = """{header}
|
|
57
|
+
registry=https://registry.npmjs.org/
|
|
58
|
+
@{npm_scope}:registry={registry_url}/
|
|
59
|
+
@tdk-landscape:registry={registry_url}/
|
|
60
|
+
@identity:registry={registry_url}/
|
|
61
|
+
//{registry_host}/:username=admin
|
|
62
|
+
//{registry_host}/:_password=YWRtaW4=
|
|
63
|
+
//{registry_host}/:email=admin@example.com
|
|
64
|
+
//{registry_host}/:always-auth=true""".format(header=header, registry_url=registry_url, registry_host=registry_host, npm_scope=_NPM_SCOPE)
|
|
65
|
+
|
|
66
|
+
filename = generated_filename
|
|
67
|
+
write_fn(target_dir + '/' + filename, content)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# =============================================================================
|
|
71
|
+
# 📝 BUNFIG GENERATORS
|
|
72
|
+
# =============================================================================
|
|
73
|
+
|
|
74
|
+
def generate_bunfig(resource_path, registry_url, is_docker, write_fn):
|
|
75
|
+
"""
|
|
76
|
+
Generate bunfig.toml for Bun package manager configuration.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
resource_path: Path to service directory
|
|
80
|
+
registry_url: Verdaccio registry URL
|
|
81
|
+
is_docker: If True, generates bunfig.docker.autogenerated.toml, else bunfig.toml
|
|
82
|
+
write_fn: File writer function
|
|
83
|
+
"""
|
|
84
|
+
target_dir = resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER
|
|
85
|
+
generated_filename = PACKAGE_CONFIG_FILENAMES['bunfig_docker_autogenerated'] if is_docker else PACKAGE_CONFIG_FILENAMES['bunfig']
|
|
86
|
+
header = Utils.get_template_header("bunfig", target_dir + "/" + generated_filename)
|
|
87
|
+
content = """{header}
|
|
88
|
+
[install]
|
|
89
|
+
linker = "isolated"
|
|
90
|
+
linkWorkspacePackages = true
|
|
91
|
+
registry = "https://registry.npmjs.org"
|
|
92
|
+
|
|
93
|
+
[install.scopes]
|
|
94
|
+
"@{npm_scope}" = {{ url = "{registry_url}/" }}
|
|
95
|
+
"@tdk-landscape" = {{ url = "{registry_url}/" }}
|
|
96
|
+
"@identity" = {{ url = "{registry_url}/" }}
|
|
97
|
+
|
|
98
|
+
""".format(header=header, registry_url=registry_url, npm_scope=_NPM_SCOPE)
|
|
99
|
+
|
|
100
|
+
filename = generated_filename
|
|
101
|
+
write_fn(target_dir + '/' + filename, content)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# =============================================================================
|
|
105
|
+
# 🎯 PUBLIC API - Struct-based Exports
|
|
106
|
+
# =============================================================================
|
|
107
|
+
|
|
108
|
+
PackageConfig = struct(
|
|
109
|
+
npmrc = generate_npmrc,
|
|
110
|
+
bunfig = generate_bunfig,
|
|
111
|
+
)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# Entry point for modular TSConfig provider
|
|
3
|
+
# =============================================================================
|
|
4
|
+
|
|
5
|
+
load("./typescript/backend_tsconfig.star", "generate_backend_tsconfig")
|
|
6
|
+
load("./typescript/frontend_tsconfig.star", "generate_frontend_tsconfig")
|
|
7
|
+
load("./typescript/prisma_config.star", "generate_prisma_config")
|
|
8
|
+
load("./typescript/frontend_library_tsconfig.star", "generate_frontend_library_tsconfig")
|
|
9
|
+
load("./typescript/backend_library_tsconfig.star", "generate_backend_library_tsconfig")
|
|
10
|
+
load("./typescript/playwright_config.star", "generate_playwright_config")
|
|
11
|
+
|
|
12
|
+
# =============================================================================
|
|
13
|
+
# TSConfig Struct - Public API
|
|
14
|
+
# =============================================================================
|
|
15
|
+
|
|
16
|
+
TSConfig = struct(
|
|
17
|
+
backend = generate_backend_tsconfig,
|
|
18
|
+
frontend = generate_frontend_tsconfig,
|
|
19
|
+
library_backend = generate_backend_library_tsconfig,
|
|
20
|
+
library_frontend = generate_frontend_library_tsconfig,
|
|
21
|
+
prisma = generate_prisma_config,
|
|
22
|
+
playwright = generate_playwright_config,
|
|
23
|
+
)
|