@flisk-sh/flisk 0.0.0-stage → 1.3.190
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/CHANGELOG.md +492 -0
- package/LICENSE +21 -0
- package/README.md +479 -2
- package/Tiltfile +151 -0
- package/cli/bin/flisk.js +42 -0
- package/cli/dist/agent-runtimes/custom.js +335 -0
- package/cli/dist/agent-runtimes/registry.js +34 -0
- package/cli/dist/backend-frameworks/elysia.js +38 -0
- package/cli/dist/backend-frameworks/express.js +49 -0
- package/cli/dist/backend-frameworks/fastify.js +43 -0
- package/cli/dist/backend-frameworks/h3.js +37 -0
- package/cli/dist/backend-frameworks/koa.js +47 -0
- package/cli/dist/backend-frameworks/mcp.js +86 -0
- package/cli/dist/backend-frameworks/nestjs.js +55 -0
- package/cli/dist/backend-frameworks/registry.js +134 -0
- package/cli/dist/backend-frameworks/types.js +1 -0
- package/cli/dist/backend-languages/bun.js +76 -0
- package/cli/dist/backend-languages/go.js +125 -0
- package/cli/dist/backend-languages/node.js +122 -0
- package/cli/dist/backend-languages/python.js +94 -0
- package/cli/dist/backend-languages/registry.js +37 -0
- package/cli/dist/backend-languages/rust.js +82 -0
- package/cli/dist/backend-languages/types.js +1 -0
- package/cli/dist/cli.js +29 -0
- package/cli/dist/commands/__tests__/project-e2e-helpers.js +49 -0
- package/cli/dist/commands/__tests__/ui-loading-screen.test.js +16 -0
- package/cli/dist/commands/agent.js +182 -0
- package/cli/dist/commands/completion-candidates.js +116 -0
- package/cli/dist/commands/completion.js +843 -0
- package/cli/dist/commands/config.js +362 -0
- package/cli/dist/commands/doctor.js +1504 -0
- package/cli/dist/commands/down.js +114 -0
- package/cli/dist/commands/eject.js +108 -0
- package/cli/dist/commands/help.js +152 -0
- package/cli/dist/commands/import.js +164 -0
- package/cli/dist/commands/logs.js +119 -0
- package/cli/dist/commands/maintainers.js +102 -0
- package/cli/dist/commands/mcp.js +28 -0
- package/cli/dist/commands/networks.js +306 -0
- package/cli/dist/commands/project.js +447 -0
- package/cli/dist/commands/projects.js +103 -0
- package/cli/dist/commands/registry.js +53 -0
- package/cli/dist/commands/resource.js +992 -0
- package/cli/dist/commands/resources.js +127 -0
- package/cli/dist/commands/restart.js +89 -0
- package/cli/dist/commands/runtime.js +75 -0
- package/cli/dist/commands/stack.js +171 -0
- package/cli/dist/commands/stacks.js +71 -0
- package/cli/dist/commands/status.js +211 -0
- package/cli/dist/commands/ui.js +725 -0
- package/cli/dist/commands/up.js +609 -0
- package/cli/dist/commands/upgrade.js +840 -0
- package/cli/dist/commands/version.js +10 -0
- package/cli/dist/components/Accessible.js +11 -0
- package/cli/dist/components/BaseTooltip.js +30 -0
- package/cli/dist/components/DetailPanel.js +33 -0
- package/cli/dist/components/FileTree.js +51 -0
- package/cli/dist/components/ResourceSelectInput.js +42 -0
- package/cli/dist/components/ResourceTable.js +35 -0
- package/cli/dist/components/ServiceIssues.js +13 -0
- package/cli/dist/components/TUIHeader.js +27 -0
- package/cli/dist/components/TabBar.js +27 -0
- package/cli/dist/components/Tooltip.js +13 -0
- package/cli/dist/components/index.js +11 -0
- package/cli/dist/components/ui-theme.js +120 -0
- package/cli/dist/config/platform-standards.js +182 -0
- package/cli/dist/frontend-frameworks/lit.js +64 -0
- package/cli/dist/frontend-frameworks/preact.js +62 -0
- package/cli/dist/frontend-frameworks/qwik.js +61 -0
- package/cli/dist/frontend-frameworks/react.js +69 -0
- package/cli/dist/frontend-frameworks/registry.js +83 -0
- package/cli/dist/frontend-frameworks/solid.js +62 -0
- package/cli/dist/frontend-frameworks/svelte.js +67 -0
- package/cli/dist/frontend-frameworks/tanstack-router.js +101 -0
- package/cli/dist/frontend-frameworks/types.js +1 -0
- package/cli/dist/frontend-frameworks/vanilla.js +59 -0
- package/cli/dist/frontend-frameworks/vue.js +72 -0
- package/cli/dist/generator/__tests__/golden-helpers.js +43 -0
- package/cli/dist/generator/extension-fetch.js +291 -0
- package/cli/dist/generator/resource-templates.js +133 -0
- package/cli/dist/generator/template-engine.js +801 -0
- package/cli/dist/index.js +10 -0
- package/cli/dist/mcp/server.js +101 -0
- package/cli/dist/mcp/tools.js +351 -0
- package/cli/dist/program.js +37 -0
- package/cli/dist/types/index.js +38 -0
- package/cli/dist/utils/agent-host.js +36 -0
- package/cli/dist/utils/atomic-write.js +36 -0
- package/cli/dist/utils/bun-floor.js +9 -0
- package/cli/dist/utils/bun-requirement.js +10 -0
- package/cli/dist/utils/cache.js +63 -0
- package/cli/dist/utils/cold-preflight.js +257 -0
- package/cli/dist/utils/command-helpers.js +57 -0
- package/cli/dist/utils/constants.js +160 -0
- package/cli/dist/utils/discovery-context.js +71 -0
- package/cli/dist/utils/discovery-paths.js +93 -0
- package/cli/dist/utils/docker.js +34 -0
- package/cli/dist/utils/doctor-crashloop.js +161 -0
- package/cli/dist/utils/doctor-fix.js +391 -0
- package/cli/dist/utils/doctor-host.js +66 -0
- package/cli/dist/utils/doctor-report.js +78 -0
- package/cli/dist/utils/doctor-runtime.js +880 -0
- package/cli/dist/utils/doctor-starlark.js +132 -0
- package/cli/dist/utils/doctor-wiring.js +698 -0
- package/cli/dist/utils/down-cleanup.js +125 -0
- package/cli/dist/utils/env-validator.js +266 -0
- package/cli/dist/utils/errors.js +175 -0
- package/cli/dist/utils/exec-async.js +31 -0
- package/cli/dist/utils/file-helpers.js +104 -0
- package/cli/dist/utils/formatting.js +165 -0
- package/cli/dist/utils/generated-paths.js +51 -0
- package/cli/dist/utils/help-command.js +11 -0
- package/cli/dist/utils/host-port-config.js +140 -0
- package/cli/dist/utils/host-port-plan.js +100 -0
- package/cli/dist/utils/json-output.js +29 -0
- package/cli/dist/utils/machine-output.js +33 -0
- package/cli/dist/utils/paths.js +43 -0
- package/cli/dist/utils/platform.js +58 -0
- package/cli/dist/utils/port-assignment.js +75 -0
- package/cli/dist/utils/port-conflict-fix.js +25 -0
- package/cli/dist/utils/port-fallback-notice.js +17 -0
- package/cli/dist/utils/port-listener-probe.js +20 -0
- package/cli/dist/utils/project-config-defaults.js +17 -0
- package/cli/dist/utils/project-features.js +91 -0
- package/cli/dist/utils/project-templates.js +32 -0
- package/cli/dist/utils/prompt.js +97 -0
- package/cli/dist/utils/resource-features.js +184 -0
- package/cli/dist/utils/resource-kind.js +9 -0
- package/cli/dist/utils/schema-version-gate.js +45 -0
- package/cli/dist/utils/search-status.js +12 -0
- package/cli/dist/utils/secret-redaction.js +73 -0
- package/cli/dist/utils/service-config-checks.js +189 -0
- package/cli/dist/utils/service-manifest.js +254 -0
- package/cli/dist/utils/service-runtime-state.js +66 -0
- package/cli/dist/utils/service-urls.js +112 -0
- package/cli/dist/utils/services.js +360 -0
- package/cli/dist/utils/shared-infra.js +45 -0
- package/cli/dist/utils/shared-platform-postgres.js +232 -0
- package/cli/dist/utils/single-flight.js +21 -0
- package/cli/dist/utils/smoke.js +401 -0
- package/cli/dist/utils/spinner.js +40 -0
- package/cli/dist/utils/stack-features.js +15 -0
- package/cli/dist/utils/stack-status.js +14 -0
- package/cli/dist/utils/startup-report.js +78 -0
- package/cli/dist/utils/status-message.js +21 -0
- package/cli/dist/utils/status-ports.js +33 -0
- package/cli/dist/utils/suggestions.js +63 -0
- package/cli/dist/utils/tar.js +46 -0
- package/cli/dist/utils/tdk-version.js +51 -0
- package/cli/dist/utils/terminal-layout.js +19 -0
- package/cli/dist/utils/tilt-events.js +194 -0
- package/cli/dist/utils/tilt-logs.js +61 -0
- package/cli/dist/utils/tilt-port-owner.js +63 -0
- package/cli/dist/utils/tilt-process.js +54 -0
- package/cli/dist/utils/tilt-resource-state.js +32 -0
- package/cli/dist/utils/tilt-startup.js +49 -0
- package/cli/dist/utils/tilt-unreachable-message.js +9 -0
- package/cli/dist/utils/tilt.js +104 -0
- package/cli/dist/utils/ui-keymap.js +129 -0
- package/cli/dist/utils/ui-service-state.js +34 -0
- package/cli/dist/utils/up-only.js +28 -0
- package/cli/dist/utils/up-readiness.js +118 -0
- package/cli/dist/utils/url-actions.js +103 -0
- package/cli/dist/utils/validation.js +62 -0
- package/cli/dist/utils/which.js +56 -0
- package/cli/dist/utils/windows-doctor.js +176 -0
- package/cli/dist-bundle/chunk-6EA4DGCY.js +2 -0
- package/cli/dist-bundle/chunk-BZ4H7MM4.js +3 -0
- package/cli/dist-bundle/chunk-CLCUIDBH.js +510 -0
- package/cli/dist-bundle/cli.js +2017 -0
- package/cli/dist-bundle/cold-preflight-SY26O2IG.js +2 -0
- package/cli/dist-bundle/devtools-ZUHXW33W.js +5 -0
- package/cli/dist-bundle/extension-fetch-J4FFH7TJ.js +2 -0
- package/cli/package.json +83 -0
- package/cli/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
- package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
- package/cli/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
- package/cli/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
- package/cli/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
- package/cli/templates/.tiltignore.hbs +72 -0
- package/cli/templates/TILT_RESOURCE_DEFAULTS.star.hbs +220 -0
- package/cli/templates/TILT_TECH_STACK.star.hbs +149 -0
- package/cli/templates/Tiltfile.hbs +381 -0
- package/cli/templates/spec.master.hbs +192 -0
- package/discovery/AGENTS.md +362 -0
- package/discovery/TILT_DISCOVERY.star +429 -0
- package/discovery/Tiltfile +58 -0
- package/discovery/config.star +265 -0
- package/discovery/constants.star +167 -0
- package/discovery/deterministic.star +213 -0
- package/discovery/discovery_daemon.star +193 -0
- package/discovery/discovery_orchestrator.star +492 -0
- package/discovery/filtering.star +7 -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 +215 -0
- package/discovery/indexing.star +9 -0
- package/discovery/json_manifest_scanner.star +57 -0
- package/discovery/libraries.star +48 -0
- package/discovery/loading.star +25 -0
- package/discovery/manifest/constants.star +106 -0
- package/discovery/manifest/loading.star +418 -0
- package/discovery/manifest/normalize.star +289 -0
- package/discovery/manifest/validation.star +110 -0
- package/discovery/normalization.star +13 -0
- package/discovery/registry.star +562 -0
- package/discovery/resource_snapshot.py +384 -0
- package/discovery/resource_snapshot.star +145 -0
- package/discovery/schemas.star +3 -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 +253 -0
- package/discovery/validation.star +80 -0
- package/discovery/versioning.star +3 -0
- package/engine/AGENTS.md +706 -0
- package/engine/README.md +31 -0
- package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
- package/engine/Tiltfile +86 -0
- package/engine/assets/docker/golden-layers.Dockerfile +204 -0
- package/engine/assets/docker/wake-gateway/Dockerfile +28 -0
- package/engine/assets/docker/wake-gateway/decide.test.ts +177 -0
- package/engine/assets/docker/wake-gateway/decide.ts +135 -0
- package/engine/assets/docker/wake-gateway/server.ts +363 -0
- package/engine/assets/scripts/cleanup-completed-migrator-images.sh +39 -0
- package/engine/assets/scripts/cleanup-tilt-images.sh +122 -0
- package/engine/assets/scripts/mac-m1-resource-monitor.sh +123 -0
- package/engine/config.star +5 -0
- package/engine/entrypoint.star +101 -0
- package/engine/lifecycle/orchestrator.star +263 -0
- package/engine/paths.star +719 -0
- package/engine/schemas/project-schema.json +147 -0
- package/engine/schemas/service-schema.json +537 -0
- package/engine/scripts/README.md +89 -0
- package/engine/scripts/build-and-publish-lib.sh +207 -0
- package/engine/scripts/check-lib-publish.sh +87 -0
- package/engine/scripts/debug-container.sh +265 -0
- package/engine/scripts/generate-manifest.sh +200 -0
- package/engine/spec.master +702 -0
- package/engine/spec.master.example +341 -0
- package/engine/topologies/README.md +33 -0
- package/engine/topologies/platform/docker/AGENTS.md +59 -0
- package/engine/topologies/platform/docker/auth/auth.star +207 -0
- package/engine/topologies/platform/docker/build/frontend_build_plan.star +65 -0
- package/engine/topologies/platform/docker/build/golden_image.star +37 -0
- package/engine/topologies/platform/docker/build/golden_image_build.star +144 -0
- package/engine/topologies/platform/docker/build/golden_image_constants.star +100 -0
- package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +263 -0
- package/engine/topologies/platform/docker/compose/compose.star +637 -0
- package/engine/topologies/platform/docker/compose/compose_helpers.star +54 -0
- package/engine/topologies/platform/docker/compose/traefik_standalone.star +171 -0
- package/engine/topologies/platform/docker/config/bunignore.star +144 -0
- package/engine/topologies/platform/docker/config/dockerignore.star +152 -0
- package/engine/topologies/platform/docker/config/healthcheck.star +58 -0
- package/engine/topologies/platform/docker/constants.star +211 -0
- package/engine/topologies/platform/docker/dockerfile/dockerfile.star +56 -0
- package/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +264 -0
- package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +76 -0
- package/engine/topologies/platform/docker/index.star +40 -0
- package/engine/topologies/platform/docker/layers/bun_helpers.star +25 -0
- package/engine/topologies/platform/docker/layers/infisical/index.star +42 -0
- package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +264 -0
- package/engine/topologies/platform/docker/layers/l1_base_layers.star +89 -0
- package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +147 -0
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +229 -0
- package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +282 -0
- package/engine/topologies/platform/docker/layers/prisma/constants.star +138 -0
- package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +98 -0
- package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +131 -0
- package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +100 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +128 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +205 -0
- package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +121 -0
- package/engine/topologies/platform/docker/networking/api_path_constants.star +206 -0
- package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +31 -0
- package/engine/topologies/platform/docker/networking/traefik.star +266 -0
- package/engine/topologies/platform/docker/networking/traefik_constants.star +148 -0
- package/engine/topologies/platform/docker/networking/traefik_helpers.star +162 -0
- package/engine/topologies/platform/docker/networking/traefik_static_routes.star +165 -0
- package/engine/topologies/platform/docker/secrets/env_secrets.star +74 -0
- package/engine/topologies/platform/docker/secrets/infisical.star +109 -0
- package/engine/topologies/platform/net/AGENTS.md +64 -0
- package/engine/topologies/platform/net/proxy.star +6 -0
- package/engine/topologies/platform/registries/local.star +6 -0
- package/engine/topologies/platform/registries/verdaccio_loader.star +20 -0
- package/engine/topologies/platform/security/AGENTS.md +49 -0
- package/engine/topologies/platform/security/secrets.star +241 -0
- package/engine/topologies/platform/state/AGENTS.md +64 -0
- package/engine/topologies/platform/state/relational.star +6 -0
- package/engine/topologies/tilt/common/AGENTS.md +59 -0
- package/engine/topologies/tilt/common/utils.star +409 -0
- package/engine/topologies/tilt/common/utils_debug.star +71 -0
- package/engine/topologies/tilt/common/utils_deterministic.star +170 -0
- package/engine/topologies/tilt/common/utils_docker_networks.star +54 -0
- package/engine/topologies/tilt/common/utils_env.star +92 -0
- package/engine/topologies/tilt/common/utils_output.star +99 -0
- package/engine/topologies/tilt/config/AGENTS.md +68 -0
- package/engine/topologies/tilt/config/defaults.star +5 -0
- package/engine/topologies/tilt/config/feature_flags.star +12 -0
- package/engine/topologies/tilt/config/global.star +57 -0
- package/engine/topologies/tilt/config/profiles.star +398 -0
- package/engine/topologies/tilt/generators/agents_md.star +64 -0
- package/engine/topologies/tilt/generators/api_gateway.star +147 -0
- package/engine/topologies/tilt/generators/index.star +126 -0
- package/engine/topologies/tilt/generators/infisical/README.md +424 -0
- package/engine/topologies/tilt/generators/infisical/examples.star +314 -0
- package/engine/topologies/tilt/generators/infisical/index.star +59 -0
- package/engine/topologies/tilt/generators/infisical/machine_identity.star +422 -0
- package/engine/topologies/tilt/generators/infisical/organization.star +536 -0
- package/engine/topologies/tilt/generators/infisical/path_manager.star +478 -0
- package/engine/topologies/tilt/generators/infisical/secrets_generator.star +422 -0
- package/engine/topologies/tilt/generators/nginx_conf.star +145 -0
- package/engine/topologies/tilt/generators/npmrc.star +132 -0
- package/engine/topologies/tilt/generators/tsconfig.star +25 -0
- package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +73 -0
- package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +137 -0
- package/engine/topologies/tilt/generators/typescript/common.star +9 -0
- package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +78 -0
- package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +140 -0
- package/engine/topologies/tilt/generators/typescript/include.star +25 -0
- package/engine/topologies/tilt/generators/typescript/playwright_config.star +42 -0
- package/engine/topologies/tilt/generators/typescript/prisma_config.star +51 -0
- package/engine/topologies/tilt/generators/validators.star +868 -0
- package/engine/topologies/tilt/generators/vite/backend.star +80 -0
- package/engine/topologies/tilt/generators/vite/frameworks/lit.star +92 -0
- package/engine/topologies/tilt/generators/vite/frameworks/preact.star +94 -0
- package/engine/topologies/tilt/generators/vite/frameworks/qwik.star +94 -0
- package/engine/topologies/tilt/generators/vite/frameworks/react.star +128 -0
- package/engine/topologies/tilt/generators/vite/frameworks/solid.star +94 -0
- package/engine/topologies/tilt/generators/vite/frameworks/svelte.star +94 -0
- package/engine/topologies/tilt/generators/vite/frameworks/vanilla.star +92 -0
- package/engine/topologies/tilt/generators/vite/frameworks/vue.star +94 -0
- package/engine/topologies/tilt/generators/vite/frontend.star +153 -0
- package/engine/topologies/tilt/generators/vite/generators.star +45 -0
- package/engine/topologies/tilt/generators/vite/helpers.star +256 -0
- package/engine/topologies/tilt/generators/vite/library.star +67 -0
- package/engine/topologies/tilt/generators/vite/sdk.star +75 -0
- package/engine/topologies/tilt/generators/vite/templates.star +460 -0
- package/engine/topologies/tilt/generators/vite_config.star +24 -0
- package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
- package/engine/topologies/tilt/manifest/README.md +679 -0
- package/engine/topologies/tilt/manifest/__init__.star +220 -0
- package/engine/topologies/tilt/manifest/constants.star +262 -0
- package/engine/topologies/tilt/manifest/errors.star +268 -0
- package/engine/topologies/tilt/manifest/integration.star +348 -0
- package/engine/topologies/tilt/manifest/json_to_yaml.py +61 -0
- package/engine/topologies/tilt/manifest/loader.star +239 -0
- package/engine/topologies/tilt/manifest/mapper.star +229 -0
- package/engine/topologies/tilt/manifest/parser.star +490 -0
- package/engine/topologies/tilt/manifest/schema.star +502 -0
- package/engine/topologies/tilt/manifest/tests/test_integration.star +278 -0
- package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +475 -0
- package/engine/topologies/tilt/manifest/tests/test_manifest.star +319 -0
- package/engine/topologies/tilt/manifest/tests/test_validator.star +472 -0
- package/engine/topologies/tilt/manifest/validator.star +744 -0
- package/engine/topologies/tilt/manifest/yaml_to_json.py +20 -0
- package/engine/topologies/tilt/resources/AGENTS.md +71 -0
- package/engine/topologies/tilt/resources/build_concurrency.star +56 -0
- package/engine/topologies/tilt/resources/conditions.star +5 -0
- package/engine/topologies/tilt/resources/databases.star +246 -0
- package/engine/topologies/tilt/resources/declaration.star +5 -0
- package/engine/topologies/tilt/resources/deps.star +5 -0
- package/engine/topologies/tilt/resources/infra-loader.star +504 -0
- package/engine/topologies/tilt/resources/libs.star +32 -0
- package/engine/topologies/tilt/resources/libs_discovery.star +104 -0
- package/engine/topologies/tilt/resources/libs_paths.star +81 -0
- package/engine/topologies/tilt/resources/libs_resource_definition.star +153 -0
- package/engine/topologies/tilt/resources/libs_setup.star +166 -0
- package/engine/topologies/tilt/resources/libs_tsconfig.star +39 -0
- package/engine/topologies/tilt/resources/orchestrator/apply.star +79 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +864 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +90 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +150 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +38 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +46 -0
- package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +193 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +23 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +136 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/env.star +219 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +172 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +577 -0
- package/engine/topologies/tilt/resources/orchestrator/helpers.star +35 -0
- package/engine/topologies/tilt/resources/orchestrator.star +56 -0
- package/engine/topologies/tilt/resources/ordering.star +5 -0
- package/engine/topologies/tilt/resources/shared-platform-postgres.star +30 -0
- package/engine/topologies/tilt/resources/triggers.star +5 -0
- package/engine/topologies/tilt/resources/watchers.star +304 -0
- package/engine/where-things-live.star +719 -0
- package/examples/tdk-example/LICENSE +21 -0
- package/examples/tdk-example/README.md +23 -0
- package/examples/tdk-example/TILT_SERVICE_DEFAULTS.star +42 -0
- package/examples/tdk-example/TILT_TECH_STACK.star +67 -0
- package/examples/tdk-example/Tiltfile +25 -0
- package/examples/tdk-example/services/platform/messaging/docker-compose.yml +26 -0
- package/examples/tdk-example/services/shop/orders-api/package.json +20 -0
- package/examples/tdk-example/services/shop/orders-api/service.json +14 -0
- package/examples/tdk-example/services/shop/orders-api/src/index.ts +81 -0
- package/examples/tdk-example/services/shop/orders-app/index.html +12 -0
- package/examples/tdk-example/services/shop/orders-app/package.json +23 -0
- package/examples/tdk-example/services/shop/orders-app/public/.gitkeep +0 -0
- package/examples/tdk-example/services/shop/orders-app/service.json +9 -0
- package/examples/tdk-example/services/shop/orders-app/src/main.tsx +9 -0
- package/examples/tdk-example/services/shop/orders-app/src/orders.tsx +67 -0
- package/examples/tdk-example/services/shop/orders-app/src/style.css +15 -0
- package/examples/tdk-example/services/shop/orders-worker/package.json +18 -0
- package/examples/tdk-example/services/shop/orders-worker/service.json +13 -0
- package/examples/tdk-example/services/shop/orders-worker/src/index.ts +33 -0
- package/ext/Tiltfile +66 -0
- package/ext/ide-components/README.md +221 -0
- package/ext/ide-components/code_viewer/server.py +208 -0
- package/ext/ide-components/config_inspector/server.py +1052 -0
- package/ext/ide-components/file_browser/server.py +287 -0
- package/ext/ide-components/shared/config_service.py +471 -0
- package/ext/ide-components/shared/file_utils.py +300 -0
- package/ext/ide-components/shared/http_utils.py +234 -0
- package/ext/ide-components/shared/static/styles.css +1334 -0
- package/ext/ide-components/shared/syntax_highlighter.py +142 -0
- package/ext/ide-components/shared/template_engine.py +125 -0
- package/ext/ide-components/shared/templates/base.html +121 -0
- package/ext/ide-components/shared/test_config_service.py +328 -0
- package/ext/ide-components/shared/tilt_integration.py +160 -0
- package/ext/ui-enhancements/cron-status-server.sh +51 -0
- package/ext/ui-enhancements/cron-status-tracker.sh +148 -0
- package/ext/ui-enhancements/extension.yaml +36 -0
- package/ext/ui-enhancements/tiltfile.py +101 -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 +94 -4
- package/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
- package/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
- package/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
- package/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
- package/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
- package/specs/specs/TILT_SERVICE_DEFAULTS.star +207 -0
- package/specs/specs/TILT_TECH_STACK.star +161 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Copyright (c) 2026 Flisk contributors
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# 🐳 PLATFORM DOCKER CONSTANTS
|
|
5
|
+
# =============================================================================
|
|
6
|
+
# Centralized configuration constants for Docker Compose generation.
|
|
7
|
+
# All DATABASE_URL formats, project names, runtime versions, and other
|
|
8
|
+
# shared constants are defined here to ensure consistency across the topology.
|
|
9
|
+
# =============================================================================
|
|
10
|
+
|
|
11
|
+
# Load project name from project.json (makes Flisk CLI portable across projects)
|
|
12
|
+
# Falls back to 'tdk_project' / 'tdk-project' if project.json not found
|
|
13
|
+
# Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
|
|
14
|
+
def _load_project_names():
|
|
15
|
+
project_root = os.environ.get('TDK_PROJECT_ROOT', '')
|
|
16
|
+
project_json_path = '.tdk/project.json'
|
|
17
|
+
if project_root:
|
|
18
|
+
project_json_path = project_root + '/' + project_json_path
|
|
19
|
+
|
|
20
|
+
if os.path.exists(project_json_path):
|
|
21
|
+
_project_json = read_json(project_json_path)
|
|
22
|
+
_PROJECT_NAME_HYPHEN = _project_json.get('project', {}).get('name', 'tdk-project')
|
|
23
|
+
# Convert hyphenated name to underscore (e.g., "my-project" -> "my_project")
|
|
24
|
+
_PROJECT_NAME = _PROJECT_NAME_HYPHEN.replace('-', '_')
|
|
25
|
+
return _PROJECT_NAME, _PROJECT_NAME_HYPHEN
|
|
26
|
+
return "tdk_project", "tdk-project"
|
|
27
|
+
|
|
28
|
+
_PROJECT_NAME, _PROJECT_NAME_HYPHEN = _load_project_names()
|
|
29
|
+
|
|
30
|
+
# Project name constants
|
|
31
|
+
PROJECT_NAME = _PROJECT_NAME
|
|
32
|
+
PROJECT_NAME_HYPHEN = _PROJECT_NAME_HYPHEN
|
|
33
|
+
|
|
34
|
+
# Domain constants
|
|
35
|
+
LOCAL_DOMAIN = PROJECT_NAME_HYPHEN + ".localhost"
|
|
36
|
+
APP_SUBDOMAIN_PREFIX = "app"
|
|
37
|
+
API_SUBDOMAIN_PREFIX = "api"
|
|
38
|
+
APP_LOCAL_DOMAIN = APP_SUBDOMAIN_PREFIX + "." + LOCAL_DOMAIN
|
|
39
|
+
API_LOCAL_DOMAIN = API_SUBDOMAIN_PREFIX + "." + LOCAL_DOMAIN
|
|
40
|
+
EMAIL_DOMAIN = PROJECT_NAME_HYPHEN + ".local"
|
|
41
|
+
|
|
42
|
+
# Published resource-config JSON Schema, same for every project (not project-specific like EMAIL_DOMAIN)
|
|
43
|
+
RESOURCE_SCHEMA_URL = "https://tdk-landscape.github.io/schema.service.json"
|
|
44
|
+
|
|
45
|
+
# NPM scope constant
|
|
46
|
+
NPM_SCOPE = "@" + PROJECT_NAME_HYPHEN + "/"
|
|
47
|
+
|
|
48
|
+
# Bun runtime constants
|
|
49
|
+
BUN_VERSION = "1.3.11"
|
|
50
|
+
BUN_IMAGE = "oven/bun:" + BUN_VERSION + "-alpine"
|
|
51
|
+
|
|
52
|
+
# Database connection constants
|
|
53
|
+
DB_USER = PROJECT_NAME
|
|
54
|
+
DB_HOST = PROJECT_NAME + "_postgres"
|
|
55
|
+
DB_PORT = "5432"
|
|
56
|
+
# ⚠️ SECURITY: No default password - must be provided via DB_PASSWORD env var
|
|
57
|
+
DB_PASSWORD_SHELL = "${DB_PASSWORD}" # Requires DB_PASSWORD to be set
|
|
58
|
+
DB_SCHEMA = "public"
|
|
59
|
+
|
|
60
|
+
# Network names
|
|
61
|
+
NETWORK_TRAEFIK_PUBLIC = PROJECT_NAME + "_traefik-public"
|
|
62
|
+
NETWORK_BACKEND = PROJECT_NAME + "_backend"
|
|
63
|
+
NETWORK_DATABASE = PROJECT_NAME + "_database"
|
|
64
|
+
NETWORK_INFISICAL = PROJECT_NAME + "_infisical-network"
|
|
65
|
+
NETWORK_PROXY = PROJECT_NAME + "_proxy"
|
|
66
|
+
|
|
67
|
+
# Traefik file-provider dynamic config: one generated YAML per `sablier.deferStart`
|
|
68
|
+
# resource's static route (see openspec/changes/prioritized-cold-start), mounted
|
|
69
|
+
# read-only into the standalone Traefik container at /etc/traefik/dynamic.
|
|
70
|
+
TRAEFIK_DYNAMIC_DIR_REL = ".tdk/.tdk-out/traefik-dynamic"
|
|
71
|
+
TRAEFIK_WAKE_GATEWAY_CONTAINER = PROJECT_NAME_HYPHEN + "-wake-gateway"
|
|
72
|
+
TRAEFIK_WAKE_GATEWAY_PORT = 9999
|
|
73
|
+
|
|
74
|
+
# NATS constants
|
|
75
|
+
NATS_HOST = PROJECT_NAME + "_nats"
|
|
76
|
+
NATS_PORT = "4222"
|
|
77
|
+
NATS_URL = "nats://" + NATS_HOST + ":" + NATS_PORT
|
|
78
|
+
|
|
79
|
+
# Verdaccio constants
|
|
80
|
+
VERDACCIO_PORT = 4873
|
|
81
|
+
VERDACCIO_HOST = "localhost"
|
|
82
|
+
VERDACCIO_HOST_DOCKER = "host.docker.internal"
|
|
83
|
+
VERDACCIO_CONTAINER_NAME = PROJECT_NAME_HYPHEN + "-verdaccio"
|
|
84
|
+
VERDACCIO_URL_LOCAL = "http://" + VERDACCIO_HOST + ":" + str(VERDACCIO_PORT)
|
|
85
|
+
VERDACCIO_URL_DOCKER = "http://" + VERDACCIO_HOST_DOCKER + ":" + str(VERDACCIO_PORT)
|
|
86
|
+
VERDACCIO_NETWORK = PROJECT_NAME + "_verdaccio-network"
|
|
87
|
+
VERDACCIO_NPM_REGISTRY = "https://registry.npmjs.org/"
|
|
88
|
+
# Resource and service names
|
|
89
|
+
VERDACCIO_RESOURCE_NAME = "verdaccio"
|
|
90
|
+
VERDACCIO_CONNECT_NETWORK_RESOURCE = "verdaccio-connect-network"
|
|
91
|
+
VERDACCIO_DOMAIN = "verdaccio"
|
|
92
|
+
VERDACCIO_TRAEFIK_HOST = "verdaccio.localhost"
|
|
93
|
+
|
|
94
|
+
# Docker names for one stack's generated services. Every name carries the Flisk
|
|
95
|
+
# project, so two projects that both have a stack called `people` (two Tilt
|
|
96
|
+
# instances on one Docker daemon) never share a Compose project, container or
|
|
97
|
+
# image. Without it, the second `flisk up` runs `--remove-orphans` against the
|
|
98
|
+
# first project's containers and overwrites its images.
|
|
99
|
+
def compose_project_name(stack):
|
|
100
|
+
"""Compose project for a stack: <project>-<stack>-autogenerated (e.g. tdk-erp-system-analytics-autogenerated)."""
|
|
101
|
+
return PROJECT_NAME_HYPHEN + "-" + stack + "-autogenerated"
|
|
102
|
+
|
|
103
|
+
def app_image_name(stack, res_name):
|
|
104
|
+
"""Image tag (:dev) of one service: <project>_<stack>_<resource>:dev."""
|
|
105
|
+
return PROJECT_NAME + "_" + stack + "_" + res_name + ":dev"
|
|
106
|
+
|
|
107
|
+
def infra_compose_project_name(infra):
|
|
108
|
+
"""Compose project for a shared platform stack: <project>-<infra> (e.g. tdk-erp-system-database-management)."""
|
|
109
|
+
return PROJECT_NAME_HYPHEN + "-" + infra
|
|
110
|
+
|
|
111
|
+
def migrator_image_name(stack):
|
|
112
|
+
"""Image tag (:dev) of a stack's migrator: <project>_<stack>-db-migrator:dev."""
|
|
113
|
+
return PROJECT_NAME + "_" + stack + "-db-migrator:dev"
|
|
114
|
+
|
|
115
|
+
# Helper function to generate database name
|
|
116
|
+
def get_db_name(domain_or_service):
|
|
117
|
+
"""Returns standardized database name for a domain or service."""
|
|
118
|
+
return PROJECT_NAME + "_" + domain_or_service.replace("-", "_")
|
|
119
|
+
|
|
120
|
+
# Base JDBC URL format (without database name)
|
|
121
|
+
def get_database_url_base():
|
|
122
|
+
"""Returns base DATABASE_URL format without database name."""
|
|
123
|
+
return "postgresql://" + DB_USER + ":" + DB_PASSWORD_SHELL + "@" + DB_HOST + ":" + DB_PORT + "/"
|
|
124
|
+
|
|
125
|
+
# Complete DATABASE_URL with database name (for .env files)
|
|
126
|
+
def get_database_url_for_env(db_name):
|
|
127
|
+
"""Returns DATABASE_URL format for .env files (shell syntax preserved)."""
|
|
128
|
+
return get_database_url_base() + db_name + "?schema=" + DB_SCHEMA
|
|
129
|
+
|
|
130
|
+
# Complete DATABASE_URL with database name (for shell scripts)
|
|
131
|
+
def get_database_url_for_shell(db_name):
|
|
132
|
+
"""Returns DATABASE_URL format for shell scripts."""
|
|
133
|
+
return "postgresql://" + DB_USER + ":$DB_PASSWORD@" + DB_HOST + ":" + DB_PORT + "/" + db_name + "?schema=" + DB_SCHEMA
|
|
134
|
+
|
|
135
|
+
# Docker Compose environment variable format with fallback
|
|
136
|
+
def get_compose_env_database_url(db_name):
|
|
137
|
+
"""Returns Docker Compose environment variable format with fallback."""
|
|
138
|
+
base_url = get_database_url_for_env(db_name)
|
|
139
|
+
return "${{DATABASE_URL:-" + base_url + "}}"
|
|
140
|
+
|
|
141
|
+
# Tilt resource DATABASE_URL format (for Starlark .format() with host/port placeholders)
|
|
142
|
+
def get_tilt_database_url_template():
|
|
143
|
+
"""Returns DATABASE_URL template with {host} and {port} placeholders for .format()."""
|
|
144
|
+
# ⚠️ SECURITY: No default password - DB_PASSWORD must be set
|
|
145
|
+
return "postgresql://" + PROJECT_NAME + ":${DB_PASSWORD}@{host}:{port}/{db}?schema=public"
|
|
146
|
+
|
|
147
|
+
# Database config entry for config.star
|
|
148
|
+
DB_CONFIG = {
|
|
149
|
+
"host": DB_HOST,
|
|
150
|
+
"port": int(DB_PORT),
|
|
151
|
+
"user": DB_USER,
|
|
152
|
+
"password": DB_PASSWORD_SHELL,
|
|
153
|
+
"name_prefix": PROJECT_NAME + "_",
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
PlatformDockerConstants = struct(
|
|
157
|
+
PROJECT_NAME = PROJECT_NAME,
|
|
158
|
+
PROJECT_NAME_HYPHEN = PROJECT_NAME_HYPHEN,
|
|
159
|
+
LOCAL_DOMAIN = LOCAL_DOMAIN,
|
|
160
|
+
APP_SUBDOMAIN_PREFIX = APP_SUBDOMAIN_PREFIX,
|
|
161
|
+
API_SUBDOMAIN_PREFIX = API_SUBDOMAIN_PREFIX,
|
|
162
|
+
APP_LOCAL_DOMAIN = APP_LOCAL_DOMAIN,
|
|
163
|
+
API_LOCAL_DOMAIN = API_LOCAL_DOMAIN,
|
|
164
|
+
EMAIL_DOMAIN = EMAIL_DOMAIN,
|
|
165
|
+
RESOURCE_SCHEMA_URL = RESOURCE_SCHEMA_URL,
|
|
166
|
+
NPM_SCOPE = NPM_SCOPE,
|
|
167
|
+
BUN_VERSION = BUN_VERSION,
|
|
168
|
+
BUN_IMAGE = BUN_IMAGE,
|
|
169
|
+
DB_USER = DB_USER,
|
|
170
|
+
DB_HOST = DB_HOST,
|
|
171
|
+
DB_PORT = DB_PORT,
|
|
172
|
+
DB_PASSWORD_SHELL = DB_PASSWORD_SHELL,
|
|
173
|
+
DB_SCHEMA = DB_SCHEMA,
|
|
174
|
+
NETWORK_TRAEFIK_PUBLIC = NETWORK_TRAEFIK_PUBLIC,
|
|
175
|
+
NETWORK_BACKEND = NETWORK_BACKEND,
|
|
176
|
+
NETWORK_DATABASE = NETWORK_DATABASE,
|
|
177
|
+
NETWORK_INFISICAL = NETWORK_INFISICAL,
|
|
178
|
+
NETWORK_PROXY = NETWORK_PROXY,
|
|
179
|
+
TRAEFIK_DYNAMIC_DIR_REL = TRAEFIK_DYNAMIC_DIR_REL,
|
|
180
|
+
TRAEFIK_WAKE_GATEWAY_CONTAINER = TRAEFIK_WAKE_GATEWAY_CONTAINER,
|
|
181
|
+
TRAEFIK_WAKE_GATEWAY_PORT = TRAEFIK_WAKE_GATEWAY_PORT,
|
|
182
|
+
NATS_HOST = NATS_HOST,
|
|
183
|
+
NATS_PORT = NATS_PORT,
|
|
184
|
+
NATS_URL = NATS_URL,
|
|
185
|
+
# Verdaccio constants
|
|
186
|
+
VERDACCIO_PORT = VERDACCIO_PORT,
|
|
187
|
+
VERDACCIO_HOST = VERDACCIO_HOST,
|
|
188
|
+
VERDACCIO_HOST_DOCKER = VERDACCIO_HOST_DOCKER,
|
|
189
|
+
VERDACCIO_CONTAINER_NAME = VERDACCIO_CONTAINER_NAME,
|
|
190
|
+
VERDACCIO_URL_LOCAL = VERDACCIO_URL_LOCAL,
|
|
191
|
+
VERDACCIO_URL_DOCKER = VERDACCIO_URL_DOCKER,
|
|
192
|
+
VERDACCIO_NETWORK = VERDACCIO_NETWORK,
|
|
193
|
+
VERDACCIO_NPM_REGISTRY = VERDACCIO_NPM_REGISTRY,
|
|
194
|
+
VERDACCIO_RESOURCE_NAME = VERDACCIO_RESOURCE_NAME,
|
|
195
|
+
VERDACCIO_CONNECT_NETWORK_RESOURCE = VERDACCIO_CONNECT_NETWORK_RESOURCE,
|
|
196
|
+
VERDACCIO_DOMAIN = VERDACCIO_DOMAIN,
|
|
197
|
+
VERDACCIO_TRAEFIK_HOST = VERDACCIO_TRAEFIK_HOST,
|
|
198
|
+
DB_CONFIG = DB_CONFIG,
|
|
199
|
+
get_db_name = get_db_name,
|
|
200
|
+
compose_project_name = compose_project_name,
|
|
201
|
+
infra_compose_project_name = infra_compose_project_name,
|
|
202
|
+
app_image_name = app_image_name,
|
|
203
|
+
migrator_image_name = migrator_image_name,
|
|
204
|
+
get_database_url_base = get_database_url_base,
|
|
205
|
+
get_database_url_for_env = get_database_url_for_env,
|
|
206
|
+
get_database_url_for_shell = get_database_url_for_shell,
|
|
207
|
+
get_compose_env_database_url = get_compose_env_database_url,
|
|
208
|
+
get_tilt_database_url_template = get_tilt_database_url_template,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
CONSTANTS = {}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Copyright (c) 2026 Flisk Landscape contributors
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Dockerfile generation exports
|
|
4
|
+
# === INLINED CONSTANTS for pure extension loading ===
|
|
5
|
+
BASE_PORT_FRONTEND = 3000
|
|
6
|
+
BASE_PORT_BACKEND = 4000
|
|
7
|
+
# === END INLINED CONSTANTS ===
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
load('../generators/golden_docker_generator_v2.star', 'L4_generate_orchestrator')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def generate_frontend_dockerfile(res_path, resource_name, port=BASE_PORT_FRONTEND, target_path='/app/dist', build_cmd='bun run build', cmd='bun run start', use_nginx=False, use_infisical=False, use_shared_libs=True, use_prisma=False, use_golden=True, manifest=None):
|
|
14
|
+
"""Generate Dockerfile for frontend services."""
|
|
15
|
+
return L4_generate_orchestrator(
|
|
16
|
+
res_path=res_path,
|
|
17
|
+
res_type='frontend',
|
|
18
|
+
resource_name=resource_name,
|
|
19
|
+
use_nginx=use_nginx,
|
|
20
|
+
port=port,
|
|
21
|
+
target_path=target_path,
|
|
22
|
+
build_cmd=build_cmd,
|
|
23
|
+
cmd=cmd,
|
|
24
|
+
use_infisical=use_infisical,
|
|
25
|
+
use_shared_libs=use_shared_libs,
|
|
26
|
+
use_prisma=use_prisma,
|
|
27
|
+
use_golden=use_golden,
|
|
28
|
+
manifest=manifest,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
def generate_app_dockerfile(res_path, resource_name, port=BASE_PORT_BACKEND, build_cmd='bun run build', cmd='bun run start', use_infisical=False, use_shared_libs=True, use_prisma=True, use_golden=True, manifest=None):
|
|
32
|
+
"""Generate Dockerfile for backend/app services."""
|
|
33
|
+
return L4_generate_orchestrator(
|
|
34
|
+
res_path=res_path,
|
|
35
|
+
res_type='backend',
|
|
36
|
+
resource_name=resource_name,
|
|
37
|
+
port=port,
|
|
38
|
+
build_cmd=build_cmd,
|
|
39
|
+
cmd=cmd,
|
|
40
|
+
use_infisical=use_infisical,
|
|
41
|
+
use_shared_libs=use_shared_libs,
|
|
42
|
+
use_prisma=use_prisma,
|
|
43
|
+
use_golden=use_golden,
|
|
44
|
+
manifest=manifest,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def generate_migrator_dockerfile(res_path, resource_name, use_infisical=False, use_golden=True, manifest=None):
|
|
48
|
+
"""Generate Dockerfile for database migrator services."""
|
|
49
|
+
return L4_generate_orchestrator(
|
|
50
|
+
res_path=res_path,
|
|
51
|
+
res_type='migrator',
|
|
52
|
+
resource_name=resource_name,
|
|
53
|
+
use_infisical=use_infisical,
|
|
54
|
+
use_golden=use_golden,
|
|
55
|
+
manifest=manifest,
|
|
56
|
+
)
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# Copyright (c) 2026 Flisk Landscape contributors
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# Dockerfiles for backends whose `language` is not the Bun default.
|
|
4
|
+
#
|
|
5
|
+
# Bun backends use the golden-image generator. Python backends are a small
|
|
6
|
+
# standalone image: language-specific base image and reload command, while the build
|
|
7
|
+
# context (project root), `production` target, health check, and PORT contract stay the
|
|
8
|
+
# same as every other backend.
|
|
9
|
+
|
|
10
|
+
BASE_PORT_BACKEND = 4000
|
|
11
|
+
|
|
12
|
+
# Languages whose runtime files are owned by the provider (no Vite/tsconfig/Bun config).
|
|
13
|
+
PROVIDER_OWNED_LANGUAGES = ["python", "go", "rust", "node"]
|
|
14
|
+
|
|
15
|
+
# Files a provider-owned language must scaffold; checked before generating anything.
|
|
16
|
+
LANGUAGE_REQUIRED_FILES = {
|
|
17
|
+
"python": ["pyproject.toml", "src/main.py"],
|
|
18
|
+
"go": ["go.mod", "main.go"],
|
|
19
|
+
"rust": ["Cargo.toml", "src/main.rs"],
|
|
20
|
+
"node": ["package.json", "src/index.js"],
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
_CURL = """RUN apt-get update && apt-get install -y --no-install-recommends curl \\
|
|
24
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
_HEALTHCHECK = """HEALTHCHECK --interval=10s --timeout=5s --retries=3 \\
|
|
28
|
+
CMD curl -f http://localhost:${{PORT:-{port}}}/health || exit 1
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
_PYTHON = """# Generated by Flisk for a Python backend. Do not edit; change service.json instead.
|
|
32
|
+
FROM python:3.12-slim@sha256:05cda9777409a9c3ffddd94a4c476b79f0769a0b4857f0c7ed9226b6800b0d6f AS base
|
|
33
|
+
|
|
34
|
+
WORKDIR /app/{res_path}
|
|
35
|
+
|
|
36
|
+
{curl}
|
|
37
|
+
COPY {res_path}/pyproject.toml ./
|
|
38
|
+
# Wheel then install the wheel only. Scorecard treats a pip install of a
|
|
39
|
+
# .whl as hash-pinned; `pip install .` is not.
|
|
40
|
+
RUN python -m pip wheel --no-cache-dir --wheel-dir /tmp/wheels .
|
|
41
|
+
RUN pip install --no-cache-dir /tmp/wheels/*.whl
|
|
42
|
+
|
|
43
|
+
COPY {res_path}/src ./src
|
|
44
|
+
|
|
45
|
+
FROM base AS test
|
|
46
|
+
RUN python -m pip wheel --no-cache-dir --wheel-dir /tmp/wheels-dev ".[dev]"
|
|
47
|
+
RUN pip install --no-cache-dir /tmp/wheels-dev/*.whl
|
|
48
|
+
COPY {res_path}/tests ./tests
|
|
49
|
+
RUN pytest
|
|
50
|
+
|
|
51
|
+
FROM base AS production
|
|
52
|
+
|
|
53
|
+
{healthcheck}
|
|
54
|
+
EXPOSE {port}
|
|
55
|
+
|
|
56
|
+
CMD ["sh", "-c", "uvicorn main:app --app-dir src --host 0.0.0.0 --port ${{PORT:-{port}}} --reload --reload-dir src"]
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
_GO = """# Generated by Flisk for a Go backend. Do not edit; change service.json instead.
|
|
60
|
+
FROM golang:1.23-bookworm@sha256:167053a2bb901972bf2c1611f8f52c44d5fe7e762e5cab213708d82c421614db AS build
|
|
61
|
+
# The official image pins GOTOOLCHAIN=local, so a go.mod that needs a newer Go (Gin 1.12 needs 1.25) stops with "requires go >= 1.25".
|
|
62
|
+
# `auto` lets Go fetch the toolchain go.mod asks for; a go.mod at or below the image's Go downloads nothing.
|
|
63
|
+
ENV GOTOOLCHAIN=auto
|
|
64
|
+
|
|
65
|
+
WORKDIR /app/{res_path}
|
|
66
|
+
|
|
67
|
+
COPY {res_path}/go.* ./
|
|
68
|
+
RUN go mod download
|
|
69
|
+
|
|
70
|
+
COPY {res_path}/ ./
|
|
71
|
+
RUN CGO_ENABLED=0 go build -o /out/app .
|
|
72
|
+
|
|
73
|
+
FROM build AS test
|
|
74
|
+
RUN go test ./...
|
|
75
|
+
{go_development}
|
|
76
|
+
FROM debian:bookworm-slim@sha256:7c7b2c966bc9ee8cedfeef67e0e279108992c77681fa595db4a9d65c06ccc587 AS production
|
|
77
|
+
|
|
78
|
+
{curl}
|
|
79
|
+
COPY --from=build /out/app /usr/local/bin/app
|
|
80
|
+
|
|
81
|
+
{healthcheck}
|
|
82
|
+
EXPOSE {port}
|
|
83
|
+
|
|
84
|
+
CMD ["app"]
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
_RUST = """# Generated by Flisk for a Rust backend. Do not edit; change service.json instead.
|
|
88
|
+
# BuildKit cache mounts keep the registry and the target directory between builds, so a rebuild after a
|
|
89
|
+
# source change recompiles only the crate itself, not every dependency.
|
|
90
|
+
FROM rust:1-slim-bookworm@sha256:2c3a22f0a5533ea2dd5a16627bc841228151faa2d4de2644ac9987e4a2f1f2fa AS build
|
|
91
|
+
|
|
92
|
+
WORKDIR /app/{res_path}
|
|
93
|
+
|
|
94
|
+
COPY {res_path}/ ./
|
|
95
|
+
RUN --mount=type=cache,target=/usr/local/cargo/registry \\
|
|
96
|
+
--mount=type=cache,target=/app/{res_path}/target \\
|
|
97
|
+
cargo build --release && mkdir -p /out && cp target/release/app /out/app
|
|
98
|
+
|
|
99
|
+
FROM build AS test
|
|
100
|
+
RUN --mount=type=cache,target=/usr/local/cargo/registry \\
|
|
101
|
+
--mount=type=cache,target=/app/{res_path}/target \\
|
|
102
|
+
cargo test
|
|
103
|
+
|
|
104
|
+
FROM debian:bookworm-slim@sha256:7c7b2c966bc9ee8cedfeef67e0e279108992c77681fa595db4a9d65c06ccc587 AS production
|
|
105
|
+
|
|
106
|
+
{curl}
|
|
107
|
+
COPY --from=build /out/app /usr/local/bin/app
|
|
108
|
+
|
|
109
|
+
{healthcheck}
|
|
110
|
+
EXPOSE {port}
|
|
111
|
+
|
|
112
|
+
CMD ["app"]
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
_NODE = """# Generated by Flisk for a Node.js backend. Do not edit; change service.json instead.
|
|
116
|
+
FROM node:22-slim@sha256:c3de60bf2f9dd0ac6370e6117950ff62d6e339527e7472301c9c78a017978392 AS base
|
|
117
|
+
|
|
118
|
+
WORKDIR /app/{res_path}
|
|
119
|
+
|
|
120
|
+
{curl}
|
|
121
|
+
COPY {res_path}/package*.json ./
|
|
122
|
+
RUN npm ci --omit=dev
|
|
123
|
+
|
|
124
|
+
COPY {res_path}/src ./src
|
|
125
|
+
|
|
126
|
+
FROM base AS test
|
|
127
|
+
RUN npm ci
|
|
128
|
+
COPY {res_path}/tests ./tests
|
|
129
|
+
RUN npm test
|
|
130
|
+
|
|
131
|
+
FROM base AS production
|
|
132
|
+
|
|
133
|
+
{healthcheck}
|
|
134
|
+
EXPOSE {port}
|
|
135
|
+
|
|
136
|
+
CMD ["node", "src/index.js"]
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
# The watcher the Go development target runs. It compiles a change into a staging binary while the running app keeps serving, and stops
|
|
140
|
+
# and swaps the app only when that build succeeds. Air was tried first and stops the app as soon as it sees a change (engine.go `start`
|
|
141
|
+
# calls stopBin before buildRun), so the service stayed down for the whole compile; a Traefik health check landing in that gap kept the
|
|
142
|
+
# route at 503 for up to 10s. A compile error is printed to the log and the last good build keeps serving.
|
|
143
|
+
# `-s -w` drops debug info, which shortens the link step; delve cannot attach to a binary built this way.
|
|
144
|
+
# `\\n` in find's -printf format is written with a doubled backslash so the shell receives a backslash and an n.
|
|
145
|
+
_GO_DEV_WATCH = """#!/bin/sh
|
|
146
|
+
app=/tmp/app
|
|
147
|
+
next=/tmp/app.next
|
|
148
|
+
pid=
|
|
149
|
+
|
|
150
|
+
# Path, mtime and size of every file a Go build can read. Dot-directories (.git, .autogenerated), tmp/, tests and docs are ignored.
|
|
151
|
+
signature() {
|
|
152
|
+
find . -type f -not -path '*/.*' -not -path './tmp/*' -not -name '*_test.go' -not -name '*.md' -printf '%p %T@ %s\\n' | sort | cksum
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# The app runs in its own session so a signal reaches everything it forked and no child keeps the listen socket.
|
|
156
|
+
start_app() {
|
|
157
|
+
setsid "$app" &
|
|
158
|
+
pid=$!
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# Succeeds only when the app is really gone; a swap on top of a live process would fail (ETXTBSY) or hit address-in-use.
|
|
162
|
+
stop_app() {
|
|
163
|
+
[ -n "$pid" ] || return 0
|
|
164
|
+
kill -TERM -- "-$pid" 2>/dev/null || kill "$pid" 2>/dev/null
|
|
165
|
+
waited=0
|
|
166
|
+
while kill -0 "$pid" 2>/dev/null && [ "$waited" -lt 50 ]; do
|
|
167
|
+
sleep 0.1
|
|
168
|
+
waited=$((waited + 1))
|
|
169
|
+
done
|
|
170
|
+
kill -KILL -- "-$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null
|
|
171
|
+
wait "$pid" 2>/dev/null
|
|
172
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
173
|
+
return 1
|
|
174
|
+
fi
|
|
175
|
+
pid=
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
trap 'stop_app; exit 0' TERM INT
|
|
179
|
+
|
|
180
|
+
last=$(signature)
|
|
181
|
+
echo "[flisk] watching for Go changes; the running app keeps serving while a rebuild compiles"
|
|
182
|
+
start_app
|
|
183
|
+
|
|
184
|
+
while true; do
|
|
185
|
+
sleep 0.2 &
|
|
186
|
+
wait $!
|
|
187
|
+
if [ -n "$pid" ] && ! kill -0 "$pid" 2>/dev/null; then
|
|
188
|
+
wait "$pid"
|
|
189
|
+
echo "[flisk] the app exited with status $?; waiting for a change to rebuild"
|
|
190
|
+
pid=
|
|
191
|
+
fi
|
|
192
|
+
now=$(signature)
|
|
193
|
+
[ "$now" = "$last" ] && continue
|
|
194
|
+
last=$now
|
|
195
|
+
echo "[flisk] change detected, rebuilding..."
|
|
196
|
+
if go build -ldflags='-s -w' -o "$next" . ; then
|
|
197
|
+
if stop_app && mv "$next" "$app"; then
|
|
198
|
+
start_app
|
|
199
|
+
echo "[flisk] rebuilt and restarted"
|
|
200
|
+
else
|
|
201
|
+
echo "[flisk] could not stop the running app or install the new build; save again to retry"
|
|
202
|
+
last=
|
|
203
|
+
fi
|
|
204
|
+
else
|
|
205
|
+
echo "[flisk] build failed; the last good build keeps running. Fix the error and save again."
|
|
206
|
+
fi
|
|
207
|
+
done
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
# Opt-in Go development target (`dev.liveReload`): the toolchain image plus the watcher above, which rebuilds and restarts the app when a
|
|
211
|
+
# source file changes. Dependencies are downloaded in their own layer and the module download is its own image layer, so an ordinary
|
|
212
|
+
# source edit recompiles incrementally. `go.mod`, `go.sum` and the Dockerfile still rebuild the image. The heredoc needs BuildKit's
|
|
213
|
+
# Dockerfile frontend 1.4 (Docker Engine 23+).
|
|
214
|
+
_GO_DEVELOPMENT = """
|
|
215
|
+
FROM golang:1.23-bookworm@sha256:167053a2bb901972bf2c1611f8f52c44d5fe7e762e5cab213708d82c421614db AS development
|
|
216
|
+
ENV GOTOOLCHAIN=auto
|
|
217
|
+
WORKDIR /app/{res_path}
|
|
218
|
+
COPY {res_path}/go.* ./
|
|
219
|
+
# A plain RUN (not a cache mount) keeps the modules in a layer keyed on go.mod and go.sum, so the priming build below reuses them.
|
|
220
|
+
RUN go mod download
|
|
221
|
+
COPY {res_path}/ ./
|
|
222
|
+
ENV GOFLAGS=-buildvcs=false CGO_ENABLED=0
|
|
223
|
+
# Prime the build cache inside the image (a cache mount would not be kept), so the first edit recompiles only what changed.
|
|
224
|
+
# Same flags as the watcher's builds (and CGO off like the production stage), so the primed binary and cache match every later one.
|
|
225
|
+
RUN go build -ldflags='-s -w' -o /tmp/app .
|
|
226
|
+
COPY --chmod=755 <<'FLISK_GO_DEV_WATCH' /usr/local/bin/flisk-go-watch
|
|
227
|
+
{watch_script}
|
|
228
|
+
FLISK_GO_DEV_WATCH
|
|
229
|
+
EXPOSE {port}
|
|
230
|
+
CMD ["flisk-go-watch"]
|
|
231
|
+
"""
|
|
232
|
+
|
|
233
|
+
def generate_language_dockerfile(res_path, language, port = BASE_PORT_BACKEND, dev = False):
|
|
234
|
+
"""Dockerfile text for a provider-owned backend language, or fail for an unknown one."""
|
|
235
|
+
template = {"python": _PYTHON, "go": _GO, "rust": _RUST, "node": _NODE}.get(language)
|
|
236
|
+
if template == None:
|
|
237
|
+
fail("No Dockerfile generator for backend language '{}'".format(language))
|
|
238
|
+
go_development = ""
|
|
239
|
+
if dev and language == "go":
|
|
240
|
+
go_development = _GO_DEVELOPMENT.format(res_path = res_path, port = port, watch_script = _GO_DEV_WATCH.rstrip("\n"))
|
|
241
|
+
return template.format(
|
|
242
|
+
res_path = res_path,
|
|
243
|
+
port = port,
|
|
244
|
+
go_development = go_development,
|
|
245
|
+
curl = _CURL,
|
|
246
|
+
healthcheck = _HEALTHCHECK.format(port = port),
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def is_provider_owned_language(manifest):
|
|
251
|
+
"""True when the manifest selects a provider-owned language (a missing language means Bun)."""
|
|
252
|
+
if not manifest:
|
|
253
|
+
return False
|
|
254
|
+
return manifest.get("appType", "backend") == "backend" and manifest.get("language", "bun") in PROVIDER_OWNED_LANGUAGES
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def go_live_reload_enabled(manifest):
|
|
258
|
+
"""True for a Go service that opted in with `dev.liveReload: true` (see _GO_DEVELOPMENT); anything else stays off."""
|
|
259
|
+
if not manifest or manifest.get("language", "bun") != "go":
|
|
260
|
+
return False
|
|
261
|
+
dev = manifest.get("dev")
|
|
262
|
+
if type(dev) != "dict":
|
|
263
|
+
return False
|
|
264
|
+
return dev.get("liveReload") == True
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# === INLINED CONSTANTS for pure extension loading ===
|
|
2
|
+
OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
|
|
3
|
+
# === END INLINED CONSTANTS ===
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
BUN_BASE = "oven/bun:1.3.11-alpine"
|
|
7
|
+
ALPINE_BASE = "alpine:3.22"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
load('../../../tilt/common/utils.star', 'Utils')
|
|
11
|
+
load('../../../tilt/manifest/constants.star', 'GENERATED_CONFIG_FILENAMES')
|
|
12
|
+
|
|
13
|
+
# Load layer generators from dedicated modules
|
|
14
|
+
load('../layers/l1_base_layers.star', 'L1_generate_os_base', 'L1_generate_runtime_env')
|
|
15
|
+
load('../layers/l2_dependency_layers.star', 'L2_generate_dependency_manifest')
|
|
16
|
+
load('../layers/l3_builder_layers.star',
|
|
17
|
+
'L3_generate_backend_compiler',
|
|
18
|
+
'L3_generate_frontend_builder',
|
|
19
|
+
'L3_generate_production_purger'
|
|
20
|
+
)
|
|
21
|
+
load('../layers/prisma/prisma_build.star', 'L3_generate_migration_engine')
|
|
22
|
+
load('../layers/prisma/prisma_runtime.star', 'L4_generate_migrator_runtime')
|
|
23
|
+
load('../layers/l4_runtime_layers.star',
|
|
24
|
+
'L4_generate_backend_runtime',
|
|
25
|
+
'L4_generate_frontend_runtime',
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def L4_generate_orchestrator(res_path, res_type = 'backend', resource_name = 'service', use_nginx = False, port = 3000, target_path = '/app/dist', build_cmd = 'bun run build', cmd = 'bun run start', use_infisical = False, use_shared_libs = True, use_prisma = True, use_golden = True, manifest = None):
|
|
29
|
+
parts = []
|
|
30
|
+
migrator_name_match = (
|
|
31
|
+
resource_name == 'migrator'
|
|
32
|
+
or resource_name.endswith('-migrator')
|
|
33
|
+
or resource_name.endswith('-db-migrator')
|
|
34
|
+
)
|
|
35
|
+
prisma_config_exists = use_prisma and read_file(res_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['prisma'], default='') != ''
|
|
36
|
+
parts.append(L1_generate_os_base(use_golden=use_golden))
|
|
37
|
+
parts.append(L1_generate_runtime_env(None))
|
|
38
|
+
parts.append(L2_generate_dependency_manifest(res_path, use_golden=use_golden))
|
|
39
|
+
|
|
40
|
+
if res_type == 'migrator' or (res_type == 'backend' and migrator_name_match):
|
|
41
|
+
# For migrators, skip backend_compiler and production_purger.
|
|
42
|
+
# Keep migration_engine only.
|
|
43
|
+
parts.append(L3_generate_migration_engine(res_path, use_golden=use_golden))
|
|
44
|
+
elif res_type == 'frontend':
|
|
45
|
+
parts.append(L3_generate_frontend_builder(res_path, build_cmd, use_infisical, use_shared_libs, use_golden=use_golden))
|
|
46
|
+
else:
|
|
47
|
+
parts.append(L3_generate_backend_compiler(res_path, build_cmd, use_prisma, use_shared_libs, use_infisical, use_golden=use_golden, has_prisma_config=prisma_config_exists))
|
|
48
|
+
# Backend runtime needs production-purged deps. Prisma migration stage
|
|
49
|
+
# is only required when Prisma is enabled for this resource.
|
|
50
|
+
if use_prisma:
|
|
51
|
+
parts.append(L3_generate_migration_engine(res_path, use_golden=use_golden))
|
|
52
|
+
parts.append(L3_generate_production_purger(res_path))
|
|
53
|
+
|
|
54
|
+
if res_type == 'frontend':
|
|
55
|
+
parts.append(L4_generate_frontend_runtime(res_path, target_path, use_nginx, use_golden=use_golden, port=port))
|
|
56
|
+
elif res_type == 'migrator' or (res_type == 'backend' and migrator_name_match):
|
|
57
|
+
parts.append(L4_generate_migrator_runtime(res_path, resource_name, use_golden=use_golden))
|
|
58
|
+
else:
|
|
59
|
+
parts.append(
|
|
60
|
+
L4_generate_backend_runtime(
|
|
61
|
+
res_path,
|
|
62
|
+
port,
|
|
63
|
+
cmd,
|
|
64
|
+
use_infisical,
|
|
65
|
+
resource_name,
|
|
66
|
+
use_golden=use_golden,
|
|
67
|
+
use_prisma=use_prisma,
|
|
68
|
+
has_prisma_config=prisma_config_exists,
|
|
69
|
+
manifest=manifest,
|
|
70
|
+
),
|
|
71
|
+
)
|
|
72
|
+
dockerfile = "\n\n".join(parts)
|
|
73
|
+
footer = Utils.get_template_header("dockerfile", "golden_docker_generator_v2.L4_generate_orchestrator", resource_name, "Use docker_build(dockerfile_contents=...) in Tiltfile")
|
|
74
|
+
# Heredocs (RUN cat > ... << 'EOF') need the BuildKit frontend; without this line an older builder
|
|
75
|
+
# reads the heredoc body as instructions ("unknown instruction: export").
|
|
76
|
+
return "# syntax=docker/dockerfile:1\n" + dockerfile + "\n\n" + footer
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Copyright (c) 2026 Flisk Landscape contributors
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
load(
|
|
4
|
+
"./dockerfile/dockerfile.star",
|
|
5
|
+
"generate_frontend_dockerfile",
|
|
6
|
+
"generate_app_dockerfile",
|
|
7
|
+
"generate_migrator_dockerfile",
|
|
8
|
+
)
|
|
9
|
+
load(
|
|
10
|
+
"./dockerfile/language_dockerfile.star",
|
|
11
|
+
"generate_language_dockerfile",
|
|
12
|
+
"is_provider_owned_language",
|
|
13
|
+
"go_live_reload_enabled",
|
|
14
|
+
"LANGUAGE_REQUIRED_FILES",
|
|
15
|
+
)
|
|
16
|
+
load("./config/dockerignore.star", "generate_dockerignore")
|
|
17
|
+
load(
|
|
18
|
+
"./compose/compose.star",
|
|
19
|
+
"generate_frontend_compose",
|
|
20
|
+
"generate_backend_compose_entry",
|
|
21
|
+
"generate_app_compose_from_entries",
|
|
22
|
+
"generate_migrator_compose",
|
|
23
|
+
)
|
|
24
|
+
load("./build/golden_image.star", "GoldenImage")
|
|
25
|
+
|
|
26
|
+
Docker = struct(
|
|
27
|
+
frontend = generate_frontend_dockerfile,
|
|
28
|
+
backend = generate_app_dockerfile,
|
|
29
|
+
migrator = generate_migrator_dockerfile,
|
|
30
|
+
backend_language = generate_language_dockerfile,
|
|
31
|
+
is_provider_owned_language = is_provider_owned_language,
|
|
32
|
+
go_live_reload = go_live_reload_enabled,
|
|
33
|
+
language_required_files = LANGUAGE_REQUIRED_FILES,
|
|
34
|
+
generate_dockerignore = generate_dockerignore,
|
|
35
|
+
frontend_compose = generate_frontend_compose,
|
|
36
|
+
backend_compose = generate_backend_compose_entry,
|
|
37
|
+
app_compose = generate_app_compose_from_entries,
|
|
38
|
+
migrator_compose = generate_migrator_compose,
|
|
39
|
+
golden_image = GoldenImage,
|
|
40
|
+
)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Copyright (c) 2026 Flisk Landscape contributors
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
"""
|
|
4
|
+
Bun Helper Functions
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
def bun_hoisted_packages_symlink_fix():
|
|
8
|
+
"""
|
|
9
|
+
Fix all Bun-hoisted package symlinks in node_modules.
|
|
10
|
+
|
|
11
|
+
When packages are installed with Bun's isolated store, they may be symlinked
|
|
12
|
+
from node_modules to .bun/. These symlinks break when copied to Docker.
|
|
13
|
+
This function recreates the necessary symlinks for runtime resolution.
|
|
14
|
+
|
|
15
|
+
Handles:
|
|
16
|
+
- Regular packages with nested node_modules (e.g., hono)
|
|
17
|
+
- Scoped packages (@hono/*, @prisma/*)
|
|
18
|
+
"""
|
|
19
|
+
return (
|
|
20
|
+
"# Fix Bun hoisted package symlinks that break when copied to Docker\n"
|
|
21
|
+
+ "USER root\n"
|
|
22
|
+
+ "COPY shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh /usr/local/bin/bun-hoisted-symlink-fix.sh\n"
|
|
23
|
+
+ "RUN chmod +x /usr/local/bin/bun-hoisted-symlink-fix.sh && /usr/local/bin/bun-hoisted-symlink-fix.sh\n"
|
|
24
|
+
+ "USER bun\n"
|
|
25
|
+
)
|