@tdk-landscape/tdk-cli-core 1.3.15 → 1.3.22

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.
Files changed (274) hide show
  1. package/Tiltfile +144 -0
  2. package/discovery/AGENTS.md +362 -0
  3. package/discovery/TILT_DISCOVERY.star +424 -0
  4. package/discovery/Tiltfile +58 -0
  5. package/discovery/config.star +258 -0
  6. package/discovery/constants.star +127 -0
  7. package/discovery/deterministic.star +211 -0
  8. package/discovery/discovery_daemon.star +191 -0
  9. package/discovery/discovery_orchestrator.star +460 -0
  10. package/discovery/filtering.star +5 -0
  11. package/discovery/identity-management-backend/service.yaml +26 -0
  12. package/discovery/identity-management-frontend/service.yaml +29 -0
  13. package/discovery/identity-sdk/service.yaml +9 -0
  14. package/discovery/incremental_discovery.star +213 -0
  15. package/discovery/indexing.star +7 -0
  16. package/discovery/json_manifest_scanner.star +51 -0
  17. package/discovery/libraries.star +46 -0
  18. package/discovery/loading.star +23 -0
  19. package/discovery/manifest/constants.star +104 -0
  20. package/discovery/manifest/loading.star +386 -0
  21. package/discovery/manifest/normalize.star +281 -0
  22. package/discovery/manifest/validation.star +108 -0
  23. package/discovery/normalization.star +11 -0
  24. package/discovery/registry.star +544 -0
  25. package/discovery/resource_snapshot.py +382 -0
  26. package/discovery/resource_snapshot.star +143 -0
  27. package/discovery/schemas.star +1 -0
  28. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  29. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  30. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  31. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  32. package/discovery/test_resource_snapshot.py +251 -0
  33. package/discovery/validation.star +78 -0
  34. package/discovery/versioning.star +1 -0
  35. package/dist/commands/config.d.ts.map +1 -1
  36. package/dist/commands/config.js +11 -0
  37. package/dist/commands/config.js.map +1 -1
  38. package/dist/commands/doctor.d.ts.map +1 -1
  39. package/dist/commands/doctor.js +1 -2
  40. package/dist/commands/doctor.js.map +1 -1
  41. package/dist/commands/project.d.ts.map +1 -1
  42. package/dist/commands/project.js +36 -41
  43. package/dist/commands/project.js.map +1 -1
  44. package/dist/commands/resource.d.ts.map +1 -1
  45. package/dist/commands/resource.js +51 -55
  46. package/dist/commands/resource.js.map +1 -1
  47. package/dist/commands/stack.d.ts.map +1 -1
  48. package/dist/commands/stack.js +22 -24
  49. package/dist/commands/stack.js.map +1 -1
  50. package/dist/commands/ui.d.ts.map +1 -1
  51. package/dist/commands/ui.js +1 -2
  52. package/dist/commands/ui.js.map +1 -1
  53. package/dist/commands/up.d.ts.map +1 -1
  54. package/dist/commands/up.js +1 -2
  55. package/dist/commands/up.js.map +1 -1
  56. package/dist/commands/upgrade.d.ts +8 -0
  57. package/dist/commands/upgrade.d.ts.map +1 -1
  58. package/dist/commands/upgrade.js +59 -18
  59. package/dist/commands/upgrade.js.map +1 -1
  60. package/dist/generator/extension-fetch.d.ts +19 -0
  61. package/dist/generator/extension-fetch.d.ts.map +1 -1
  62. package/dist/generator/extension-fetch.js +71 -5
  63. package/dist/generator/extension-fetch.js.map +1 -1
  64. package/dist/generator/template-engine.d.ts +1 -0
  65. package/dist/generator/template-engine.d.ts.map +1 -1
  66. package/dist/generator/template-engine.js +50 -6
  67. package/dist/generator/template-engine.js.map +1 -1
  68. package/dist/utils/command-helpers.d.ts.map +1 -1
  69. package/dist/utils/command-helpers.js +7 -9
  70. package/dist/utils/command-helpers.js.map +1 -1
  71. package/dist/utils/constants.d.ts +1 -0
  72. package/dist/utils/constants.d.ts.map +1 -1
  73. package/dist/utils/constants.js +1 -0
  74. package/dist/utils/constants.js.map +1 -1
  75. package/dist/utils/errors.d.ts +2 -0
  76. package/dist/utils/errors.d.ts.map +1 -1
  77. package/dist/utils/errors.js +6 -1
  78. package/dist/utils/errors.js.map +1 -1
  79. package/dist/utils/project-features.d.ts.map +1 -1
  80. package/dist/utils/project-features.js +1 -1
  81. package/dist/utils/project-features.js.map +1 -1
  82. package/dist/utils/resource-features.d.ts.map +1 -1
  83. package/dist/utils/resource-features.js +2 -2
  84. package/dist/utils/resource-features.js.map +1 -1
  85. package/dist/utils/tar.js +4 -4
  86. package/dist/utils/tar.js.map +1 -1
  87. package/dist/utils/validation.d.ts +7 -0
  88. package/dist/utils/validation.d.ts.map +1 -1
  89. package/dist/utils/validation.js +9 -0
  90. package/dist/utils/validation.js.map +1 -1
  91. package/engine/AGENTS.md +705 -0
  92. package/engine/README.md +29 -0
  93. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  94. package/engine/Tiltfile +80 -0
  95. package/engine/assets/docker/golden-layers.Dockerfile +221 -0
  96. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
  97. package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
  98. package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
  99. package/engine/config.star +3 -0
  100. package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
  101. package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
  102. package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
  103. package/engine/docs/C4-ARCHITECTURE.md +17 -0
  104. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
  105. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
  106. package/engine/docs/README.md +284 -0
  107. package/engine/entrypoint.star +97 -0
  108. package/engine/lifecycle/orchestrator.star +260 -0
  109. package/engine/paths.star +717 -0
  110. package/engine/schemas/manifest-schema.json +301 -0
  111. package/engine/schemas/service-schema.json +301 -0
  112. package/engine/scripts/README.md +89 -0
  113. package/engine/scripts/build-and-publish-lib.sh +205 -0
  114. package/engine/scripts/check-lib-publish.sh +85 -0
  115. package/engine/scripts/debug-container.sh +258 -0
  116. package/engine/scripts/generate-manifest.sh +197 -0
  117. package/engine/spec.master +702 -0
  118. package/engine/spec.master.example +341 -0
  119. package/engine/topologies/README.md +34 -0
  120. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  121. package/engine/topologies/platform/docker/auth/auth.star +167 -0
  122. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  123. package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
  124. package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
  125. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
  126. package/engine/topologies/platform/docker/compose/compose.star +636 -0
  127. package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
  128. package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
  129. package/engine/topologies/platform/docker/config/bunignore.star +142 -0
  130. package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
  131. package/engine/topologies/platform/docker/constants.star +170 -0
  132. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
  133. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
  134. package/engine/topologies/platform/docker/index.star +27 -0
  135. package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
  136. package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
  137. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
  138. package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
  139. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
  140. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
  141. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
  142. package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
  143. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
  144. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
  145. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
  146. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
  147. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
  148. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
  149. package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
  150. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
  151. package/engine/topologies/platform/docker/networking/traefik.star +232 -0
  152. package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
  153. package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
  154. package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
  155. package/engine/topologies/platform/net/proxy.star +4 -0
  156. package/engine/topologies/platform/registries/local.star +4 -0
  157. package/engine/topologies/platform/security/secrets.star +239 -0
  158. package/engine/topologies/platform/state/relational.star +4 -0
  159. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  160. package/engine/topologies/tilt/common/utils.star +364 -0
  161. package/engine/topologies/tilt/common/utils_debug.star +69 -0
  162. package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
  163. package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
  164. package/engine/topologies/tilt/common/utils_env.star +43 -0
  165. package/engine/topologies/tilt/common/utils_output.star +97 -0
  166. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  167. package/engine/topologies/tilt/config/defaults.star +3 -0
  168. package/engine/topologies/tilt/config/feature_flags.star +10 -0
  169. package/engine/topologies/tilt/config/global.star +55 -0
  170. package/engine/topologies/tilt/config/profiles.star +382 -0
  171. package/engine/topologies/tilt/generators/agents_md.star +62 -0
  172. package/engine/topologies/tilt/generators/api_gateway.star +145 -0
  173. package/engine/topologies/tilt/generators/index.star +124 -0
  174. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  175. package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
  176. package/engine/topologies/tilt/generators/infisical/index.star +57 -0
  177. package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
  178. package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
  179. package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
  180. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
  181. package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
  182. package/engine/topologies/tilt/generators/npmrc.star +111 -0
  183. package/engine/topologies/tilt/generators/tsconfig.star +23 -0
  184. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
  185. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
  186. package/engine/topologies/tilt/generators/typescript/common.star +7 -0
  187. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
  188. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
  189. package/engine/topologies/tilt/generators/typescript/include.star +23 -0
  190. package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
  191. package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
  192. package/engine/topologies/tilt/generators/validators.star +853 -0
  193. package/engine/topologies/tilt/generators/vite/backend.star +78 -0
  194. package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
  195. package/engine/topologies/tilt/generators/vite/generators.star +43 -0
  196. package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
  197. package/engine/topologies/tilt/generators/vite/library.star +65 -0
  198. package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
  199. package/engine/topologies/tilt/generators/vite/templates.star +737 -0
  200. package/engine/topologies/tilt/generators/vite_config.star +22 -0
  201. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  202. package/engine/topologies/tilt/manifest/README.md +693 -0
  203. package/engine/topologies/tilt/manifest/__init__.star +218 -0
  204. package/engine/topologies/tilt/manifest/constants.star +252 -0
  205. package/engine/topologies/tilt/manifest/errors.star +266 -0
  206. package/engine/topologies/tilt/manifest/integration.star +339 -0
  207. package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
  208. package/engine/topologies/tilt/manifest/loader.star +214 -0
  209. package/engine/topologies/tilt/manifest/mapper.star +227 -0
  210. package/engine/topologies/tilt/manifest/parser.star +400 -0
  211. package/engine/topologies/tilt/manifest/schema.star +462 -0
  212. package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
  213. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
  214. package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
  215. package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
  216. package/engine/topologies/tilt/manifest/validator.star +717 -0
  217. package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
  218. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  219. package/engine/topologies/tilt/resources/conditions.star +3 -0
  220. package/engine/topologies/tilt/resources/databases.star +244 -0
  221. package/engine/topologies/tilt/resources/declaration.star +3 -0
  222. package/engine/topologies/tilt/resources/deps.star +3 -0
  223. package/engine/topologies/tilt/resources/infra-loader.star +437 -0
  224. package/engine/topologies/tilt/resources/libs.star +30 -0
  225. package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
  226. package/engine/topologies/tilt/resources/libs_paths.star +79 -0
  227. package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
  228. package/engine/topologies/tilt/resources/libs_setup.star +164 -0
  229. package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
  230. package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
  231. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
  232. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
  233. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
  234. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
  235. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
  236. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
  237. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  238. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
  239. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
  240. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
  241. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
  242. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
  243. package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
  244. package/engine/topologies/tilt/resources/orchestrator.star +54 -0
  245. package/engine/topologies/tilt/resources/ordering.star +3 -0
  246. package/engine/topologies/tilt/resources/triggers.star +3 -0
  247. package/engine/topologies/tilt/resources/watchers.star +299 -0
  248. package/engine/where-things-live.star +717 -0
  249. package/ext/Tiltfile +66 -0
  250. package/ext/ide-components/README.md +219 -0
  251. package/ext/ide-components/code_executor/server.py +268 -0
  252. package/ext/ide-components/code_viewer/server.py +206 -0
  253. package/ext/ide-components/config_inspector/server.py +1050 -0
  254. package/ext/ide-components/file_browser/server.py +285 -0
  255. package/ext/ide-components/shared/config_service.py +469 -0
  256. package/ext/ide-components/shared/file_utils.py +298 -0
  257. package/ext/ide-components/shared/http_utils.py +232 -0
  258. package/ext/ide-components/shared/static/styles.css +1334 -0
  259. package/ext/ide-components/shared/syntax_highlighter.py +140 -0
  260. package/ext/ide-components/shared/template_engine.py +123 -0
  261. package/ext/ide-components/shared/templates/base.html +121 -0
  262. package/ext/ide-components/shared/test_config_service.py +326 -0
  263. package/ext/ide-components/shared/tilt_integration.py +158 -0
  264. package/ext/ui-enhancements/cron-status-server.sh +49 -0
  265. package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
  266. package/ext/ui-enhancements/extension.yaml +36 -0
  267. package/ext/ui-enhancements/tiltfile.py +99 -0
  268. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  269. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  270. package/ext/ui-enhancements/ui/icons.css +125 -0
  271. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  272. package/package.json +13 -9
  273. package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
  274. package/specs/specs/TILT_TECH_STACK.star +159 -0
@@ -0,0 +1,53 @@
1
+ # =============================================================================
2
+ # Standalone Traefik compose for generated TDK projects
3
+ # =============================================================================
4
+ # Full platform checkouts load Introvertic/platform proxy compose files.
5
+ # Standalone `tdk project` output does not ship those files, so Tilt used to
6
+ # skip Traefik entirely and api.{project}.localhost never served.
7
+
8
+ load("../constants.star", "PlatformDockerConstants")
9
+
10
+
11
+ def generate_standalone_traefik_compose():
12
+ """Minimal Traefik that routes Docker labels on api.{project}.localhost."""
13
+ network = PlatformDockerConstants.NETWORK_TRAEFIK_PUBLIC
14
+ name = PlatformDockerConstants.PROJECT_NAME
15
+ return """###############################################################################
16
+ # SYSTEM-GENERATED - DO NOT EDIT
17
+ # Standalone Traefik for TDK projects without platform/introvertic proxy files.
18
+ ###############################################################################
19
+
20
+ services:
21
+ traefik:
22
+ image: traefik:v3.6.8
23
+ container_name: {name}_traefik
24
+ restart: unless-stopped
25
+ command:
26
+ - "--api.insecure=true"
27
+ - "--ping=true"
28
+ - "--providers.docker=true"
29
+ - "--providers.docker.exposedbydefault=false"
30
+ - "--providers.docker.watch=true"
31
+ - "--providers.docker.network={network}"
32
+ - "--entrypoints.web.address=:80"
33
+ - "--entrypoints.websecure.address=:443"
34
+ - "--log.level=INFO"
35
+ ports:
36
+ - "80:80"
37
+ - "8080:8080"
38
+ volumes:
39
+ - /var/run/docker.sock:/var/run/docker.sock:ro
40
+ networks:
41
+ - traefik-public
42
+ healthcheck:
43
+ test: ["CMD", "traefik", "healthcheck", "--ping"]
44
+ interval: 10s
45
+ timeout: 5s
46
+ retries: 6
47
+ start_period: 10s
48
+
49
+ networks:
50
+ traefik-public:
51
+ name: {network}
52
+ external: true
53
+ """.format(name=name, network=network)
@@ -0,0 +1,142 @@
1
+ # =============================================================================
2
+ # 🐳 TILT SDK - BUNIGNORE GENERATORS (Option 2: Reduce node_modules size)
3
+ # =============================================================================
4
+ # Path: .tilt/topologies/platform/docker/bunignore.star
5
+ # Purpose: .bunignore generation to prevent unnecessary files from being installed
6
+ # Strategy: Exclude test files, docs, examples, and other non-production files
7
+ # =============================================================================
8
+
9
+ load('../../../tilt/common/utils.star', 'Utils')
10
+
11
+
12
+ def _get_common_bunignore_rules():
13
+ """Get common .bunignore rules for all packages."""
14
+ return """# Documentation files (not needed at runtime)
15
+ *.md
16
+ *.markdown
17
+ *.rst
18
+ *.adoc
19
+ README*
20
+ CHANGELOG*
21
+ HISTORY*
22
+ CONTRIBUTING*
23
+ LICENSE*
24
+ COPYING*
25
+ AUTHORS*
26
+ NOTICE*
27
+
28
+ # Test files and directories
29
+ __tests__
30
+ __mocks__
31
+ test
32
+ tests
33
+ spec
34
+ specs
35
+ .test
36
+ .spec
37
+ *.test.js
38
+ *.test.ts
39
+ *.test.tsx
40
+ *.spec.js
41
+ *.spec.ts
42
+ *.spec.tsx
43
+ *.test.mjs
44
+ *.spec.mjs
45
+ test-results
46
+ playwright-report
47
+ vitest.config.*
48
+ jest.config.*
49
+ mocha.opts
50
+
51
+ # Example and demo files
52
+ examples
53
+ example
54
+ demo
55
+ demos
56
+ sample
57
+ samples
58
+
59
+ # Development and build configuration
60
+ .github
61
+ .gitlab
62
+ .gitignore
63
+ .editorconfig
64
+ .prettierrc*
65
+ .eslintrc*
66
+ .eslintignore
67
+ biome.json
68
+ tsconfig.json
69
+ tsconfig.*.json
70
+ vite.config.*
71
+ webpack.config.*
72
+ rollup.config.*
73
+ babel.config.*
74
+ .babelrc*
75
+ .npmrc
76
+ .yarnrc*
77
+ bunfig.toml
78
+
79
+ # Source code (not needed in node_modules)
80
+ src
81
+ lib/src
82
+ source
83
+
84
+ # Development dependencies markers
85
+ .peerDependencies
86
+ .optionalDependencies
87
+
88
+ # CI/CD and automation
89
+ .github
90
+ .gitlab-ci.yml
91
+ .travis.yml
92
+ .circleci
93
+ azure-pipelines.yml
94
+ Jenkinsfile
95
+ .drone.yml
96
+
97
+ # IDE and editor files
98
+ .vscode
99
+ .idea
100
+ .sublime-project
101
+ .sublime-workspace
102
+ *.swp
103
+ *.swo
104
+ *~
105
+ .DS_Store
106
+
107
+ # Build artifacts (keep only dist/lib)
108
+ build
109
+ out
110
+ .next
111
+ .nuxt
112
+ .output
113
+ coverage
114
+ .nyc_output
115
+
116
+ # Package manager lock files (not needed in node_modules)
117
+ package-lock.json
118
+ yarn.lock
119
+ pnpm-lock.yaml
120
+ bun.lockb
121
+ """
122
+
123
+
124
+ def generate_bunignore():
125
+ """
126
+ Generate .bunignore file for the workspace root.
127
+
128
+ This file tells Bun which files to exclude when installing packages,
129
+ reducing node_modules size by ~30-40% without affecting functionality.
130
+
131
+ Returns:
132
+ .bunignore content string
133
+ """
134
+ header = Utils.get_template_header(
135
+ 'bunignore',
136
+ 'Docker.generate_bunignore()',
137
+ 'workspace-root',
138
+ 'PRODUCTION OPTIMIZATION'
139
+ )
140
+
141
+ return header + _get_common_bunignore_rules()
142
+
@@ -0,0 +1,150 @@
1
+ # =============================================================================
2
+ # 🐳 TILT SDK - DOCKERIGNORE GENERATORS (modular)
3
+ # =============================================================================
4
+ # Path: .tilt/topologies/platform/docker/dockerignore.star
5
+ # Purpose: .dockerignore generation helpers extracted from .tilt/providers/docker.star
6
+ # =============================================================================
7
+
8
+ # Import shared utilities for template headers
9
+ load('../../../tilt/common/utils.star', 'Utils')
10
+
11
+
12
+ def _get_common_dockerignore_rules():
13
+ """Get common .dockerignore rules for all service types."""
14
+ return """# Development files
15
+ node_modules
16
+ .git
17
+ .gitignore
18
+ .DS_Store
19
+ .env
20
+ .env.*
21
+ !.env.example
22
+
23
+ # IDE files
24
+ .vscode
25
+ .idea
26
+ *.swp
27
+ *~
28
+
29
+ # Build artifacts
30
+ coverage
31
+ *.log
32
+ npm-debug.log*
33
+ yarn-debug.log*
34
+
35
+ # Documentation
36
+ *.md
37
+ *.adoc
38
+ docs/
39
+ README*
40
+
41
+ # Configuration files not needed in production
42
+ .prettierrc
43
+ .eslintrc*
44
+ biome.json
45
+ tsconfig.tsbuildinfo
46
+ playwright.config.ts
47
+ playwright.config.autogenerated.ts
48
+ playwright.config.js
49
+ playwright.config.mjs
50
+ playwright.config.cjs
51
+ playwright.config.mts
52
+ playwright.config.cts
53
+ playwright.config.tsx
54
+
55
+ # Temporary files
56
+ tmp/
57
+ .cache/
58
+ .tmp/
59
+
60
+ # Shared packages source code (published to Verdaccio, installed via bun)
61
+ # These are not needed in Docker build context
62
+ shared-platform-engineering/
63
+ !shared-platform-engineering/docker-templates/
64
+ shared-product-engineering/
65
+ cli-platform-engineering/
66
+ shared-ddd-layers/
67
+ """
68
+
69
+
70
+ def _get_backend_specific_rules():
71
+ """Get backend-specific .dockerignore rules."""
72
+ return """# Test files
73
+ **/__tests__
74
+ **/__mocks__
75
+ *.test.ts
76
+ *.spec.ts
77
+ test-results
78
+ playwright-report
79
+
80
+ # Config files
81
+ vitest.config.ts
82
+ """
83
+
84
+
85
+ def _get_frontend_specific_rules():
86
+ """Get frontend-specific .dockerignore rules."""
87
+ return """# Test files
88
+ **/__tests__
89
+ **/__mocks__
90
+ *.test.ts
91
+ *.test.tsx
92
+ *.spec.ts
93
+ *.spec.tsx
94
+ **/*.stories.tsx
95
+ test-results
96
+ playwright-report
97
+ e2e/
98
+ cucumber/
99
+
100
+ # Config files
101
+ # vite.config.ts
102
+ # vite.config.autogenerated.ts
103
+ # vite.config.frontend.autogenerated.ts
104
+ # vite.config.backend.autogenerated.ts
105
+ vitest.config.ts
106
+
107
+ # Build artifacts (dist is included in final image)
108
+ .next
109
+ .nuxt
110
+ .output
111
+ """
112
+
113
+
114
+ def _get_migrator_specific_rules():
115
+ """Get migrator-specific .dockerignore rules."""
116
+ return """# Test files (migrators typically don't have tests)
117
+ **/__tests__
118
+ **/__mocks__
119
+ *.test.ts
120
+ *.spec.ts
121
+
122
+ # Build artifacts
123
+ dist
124
+ """
125
+
126
+
127
+ def generate_dockerignore(res_path, resource_type='backend'):
128
+ """
129
+ Generate .dockerignore file for a service.
130
+ """
131
+ # Generate header using shared utility
132
+ header = Utils.get_template_header(
133
+ 'dockerignore',
134
+ 'Docker.generate_dockerignore()',
135
+ res_path.split('/')[-1],
136
+ resource_type.upper()
137
+ )
138
+
139
+ # Start with common rules
140
+ content = header + _get_common_dockerignore_rules()
141
+
142
+ # Add service-specific rules
143
+ if resource_type == 'frontend':
144
+ content += _get_frontend_specific_rules()
145
+ elif resource_type == 'migrator':
146
+ content += _get_migrator_specific_rules()
147
+ else: # backend
148
+ content += _get_backend_specific_rules()
149
+
150
+ return content
@@ -0,0 +1,170 @@
1
+ # =============================================================================
2
+ # 🐳 PLATFORM DOCKER CONSTANTS
3
+ # =============================================================================
4
+ # Centralized configuration constants for Docker Compose generation.
5
+ # All DATABASE_URL formats, project names, runtime versions, and other
6
+ # shared constants are defined here to ensure consistency across the topology.
7
+ # =============================================================================
8
+
9
+ # Load project name from project.json (makes TDK CLI portable across projects)
10
+ # Falls back to 'tdk_project' / 'tdk-project' if project.json not found
11
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
12
+ def _load_project_names():
13
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
14
+ project_json_path = '.tdk/project.json'
15
+ if project_root:
16
+ project_json_path = project_root + '/' + project_json_path
17
+
18
+ if os.path.exists(project_json_path):
19
+ _project_json = read_json(project_json_path)
20
+ _PROJECT_NAME_HYPHEN = _project_json.get('project', {}).get('name', 'tdk-project')
21
+ # Convert hyphenated name to underscore (e.g., "my-project" -> "my_project")
22
+ _PROJECT_NAME = _PROJECT_NAME_HYPHEN.replace('-', '_')
23
+ return _PROJECT_NAME, _PROJECT_NAME_HYPHEN
24
+ return "tdk_project", "tdk-project"
25
+
26
+ _PROJECT_NAME, _PROJECT_NAME_HYPHEN = _load_project_names()
27
+
28
+ # Project name constants
29
+ PROJECT_NAME = _PROJECT_NAME
30
+ PROJECT_NAME_HYPHEN = _PROJECT_NAME_HYPHEN
31
+
32
+ # Domain constants
33
+ LOCAL_DOMAIN = PROJECT_NAME_HYPHEN + ".localhost"
34
+ APP_SUBDOMAIN_PREFIX = "app"
35
+ API_SUBDOMAIN_PREFIX = "api"
36
+ APP_LOCAL_DOMAIN = APP_SUBDOMAIN_PREFIX + "." + LOCAL_DOMAIN
37
+ API_LOCAL_DOMAIN = API_SUBDOMAIN_PREFIX + "." + LOCAL_DOMAIN
38
+ EMAIL_DOMAIN = PROJECT_NAME_HYPHEN + ".local"
39
+
40
+ # NPM scope constant
41
+ NPM_SCOPE = "@" + PROJECT_NAME_HYPHEN + "/"
42
+
43
+ # Bun runtime constants
44
+ BUN_VERSION = "1.3.11"
45
+ BUN_IMAGE = "oven/bun:" + BUN_VERSION + "-alpine"
46
+
47
+ # Database connection constants
48
+ DB_USER = PROJECT_NAME
49
+ DB_HOST = PROJECT_NAME + "_postgres"
50
+ DB_PORT = "5432"
51
+ # ⚠️ SECURITY: No default password - must be provided via DB_PASSWORD env var
52
+ DB_PASSWORD_SHELL = "${DB_PASSWORD}" # Requires DB_PASSWORD to be set
53
+ DB_SCHEMA = "public"
54
+
55
+ # Network names
56
+ NETWORK_TRAEFIK_PUBLIC = PROJECT_NAME + "_traefik-public"
57
+ NETWORK_BACKEND = PROJECT_NAME + "_backend"
58
+ NETWORK_DATABASE = PROJECT_NAME + "_database"
59
+ NETWORK_INFISICAL = PROJECT_NAME + "_infisical-network"
60
+ NETWORK_PROXY = PROJECT_NAME + "_proxy"
61
+
62
+ # NATS constants
63
+ NATS_HOST = PROJECT_NAME + "_nats"
64
+ NATS_PORT = "4222"
65
+ NATS_URL = "nats://" + NATS_HOST + ":" + NATS_PORT
66
+
67
+ # Verdaccio constants
68
+ VERDACCIO_PORT = 4873
69
+ VERDACCIO_HOST = "localhost"
70
+ VERDACCIO_HOST_DOCKER = "host.docker.internal"
71
+ VERDACCIO_CONTAINER_NAME = PROJECT_NAME_HYPHEN + "-verdaccio"
72
+ VERDACCIO_URL_LOCAL = "http://" + VERDACCIO_HOST + ":" + str(VERDACCIO_PORT)
73
+ VERDACCIO_URL_DOCKER = "http://" + VERDACCIO_HOST_DOCKER + ":" + str(VERDACCIO_PORT)
74
+ VERDACCIO_NETWORK = PROJECT_NAME + "_verdaccio-network"
75
+ VERDACCIO_NPM_REGISTRY = "https://registry.npmjs.org/"
76
+ # Resource and service names
77
+ VERDACCIO_RESOURCE_NAME = "verdaccio"
78
+ VERDACCIO_CONNECT_NETWORK_RESOURCE = "verdaccio-connect-network"
79
+ VERDACCIO_DOMAIN = "verdaccio"
80
+ VERDACCIO_TRAEFIK_HOST = "verdaccio.localhost"
81
+
82
+ # Helper function to generate database name
83
+ def get_db_name(domain_or_service):
84
+ """Returns standardized database name for a domain or service."""
85
+ return PROJECT_NAME + "_" + domain_or_service.replace("-", "_")
86
+
87
+ # Base JDBC URL format (without database name)
88
+ def get_database_url_base():
89
+ """Returns base DATABASE_URL format without database name."""
90
+ return "postgresql://" + DB_USER + ":" + DB_PASSWORD_SHELL + "@" + DB_HOST + ":" + DB_PORT + "/"
91
+
92
+ # Complete DATABASE_URL with database name (for .env files)
93
+ def get_database_url_for_env(db_name):
94
+ """Returns DATABASE_URL format for .env files (shell syntax preserved)."""
95
+ return get_database_url_base() + db_name + "?schema=" + DB_SCHEMA
96
+
97
+ # Complete DATABASE_URL with database name (for shell scripts)
98
+ def get_database_url_for_shell(db_name):
99
+ """Returns DATABASE_URL format for shell scripts."""
100
+ return "postgresql://" + DB_USER + ":$DB_PASSWORD@" + DB_HOST + ":" + DB_PORT + "/" + db_name + "?schema=" + DB_SCHEMA
101
+
102
+ # Docker Compose environment variable format with fallback
103
+ def get_compose_env_database_url(db_name):
104
+ """Returns Docker Compose environment variable format with fallback."""
105
+ base_url = get_database_url_for_env(db_name)
106
+ return "${{DATABASE_URL:-" + base_url + "}}"
107
+
108
+ # Tilt resource DATABASE_URL format (for Starlark .format() with host/port placeholders)
109
+ def get_tilt_database_url_template():
110
+ """Returns DATABASE_URL template with {host} and {port} placeholders for .format()."""
111
+ # ⚠️ SECURITY: No default password - DB_PASSWORD must be set
112
+ return "postgresql://" + PROJECT_NAME + ":${DB_PASSWORD}@{host}:{port}/{db}?schema=public"
113
+
114
+ # Database config entry for config.star
115
+ DB_CONFIG = {
116
+ "host": DB_HOST,
117
+ "port": int(DB_PORT),
118
+ "user": DB_USER,
119
+ "password": DB_PASSWORD_SHELL,
120
+ "name_prefix": PROJECT_NAME + "_",
121
+ }
122
+
123
+ PlatformDockerConstants = struct(
124
+ PROJECT_NAME = PROJECT_NAME,
125
+ PROJECT_NAME_HYPHEN = PROJECT_NAME_HYPHEN,
126
+ LOCAL_DOMAIN = LOCAL_DOMAIN,
127
+ APP_SUBDOMAIN_PREFIX = APP_SUBDOMAIN_PREFIX,
128
+ API_SUBDOMAIN_PREFIX = API_SUBDOMAIN_PREFIX,
129
+ APP_LOCAL_DOMAIN = APP_LOCAL_DOMAIN,
130
+ API_LOCAL_DOMAIN = API_LOCAL_DOMAIN,
131
+ EMAIL_DOMAIN = EMAIL_DOMAIN,
132
+ NPM_SCOPE = NPM_SCOPE,
133
+ BUN_VERSION = BUN_VERSION,
134
+ BUN_IMAGE = BUN_IMAGE,
135
+ DB_USER = DB_USER,
136
+ DB_HOST = DB_HOST,
137
+ DB_PORT = DB_PORT,
138
+ DB_PASSWORD_SHELL = DB_PASSWORD_SHELL,
139
+ DB_SCHEMA = DB_SCHEMA,
140
+ NETWORK_TRAEFIK_PUBLIC = NETWORK_TRAEFIK_PUBLIC,
141
+ NETWORK_BACKEND = NETWORK_BACKEND,
142
+ NETWORK_DATABASE = NETWORK_DATABASE,
143
+ NETWORK_INFISICAL = NETWORK_INFISICAL,
144
+ NETWORK_PROXY = NETWORK_PROXY,
145
+ NATS_HOST = NATS_HOST,
146
+ NATS_PORT = NATS_PORT,
147
+ NATS_URL = NATS_URL,
148
+ # Verdaccio constants
149
+ VERDACCIO_PORT = VERDACCIO_PORT,
150
+ VERDACCIO_HOST = VERDACCIO_HOST,
151
+ VERDACCIO_HOST_DOCKER = VERDACCIO_HOST_DOCKER,
152
+ VERDACCIO_CONTAINER_NAME = VERDACCIO_CONTAINER_NAME,
153
+ VERDACCIO_URL_LOCAL = VERDACCIO_URL_LOCAL,
154
+ VERDACCIO_URL_DOCKER = VERDACCIO_URL_DOCKER,
155
+ VERDACCIO_NETWORK = VERDACCIO_NETWORK,
156
+ VERDACCIO_NPM_REGISTRY = VERDACCIO_NPM_REGISTRY,
157
+ VERDACCIO_RESOURCE_NAME = VERDACCIO_RESOURCE_NAME,
158
+ VERDACCIO_CONNECT_NETWORK_RESOURCE = VERDACCIO_CONNECT_NETWORK_RESOURCE,
159
+ VERDACCIO_DOMAIN = VERDACCIO_DOMAIN,
160
+ VERDACCIO_TRAEFIK_HOST = VERDACCIO_TRAEFIK_HOST,
161
+ DB_CONFIG = DB_CONFIG,
162
+ get_db_name = get_db_name,
163
+ get_database_url_base = get_database_url_base,
164
+ get_database_url_for_env = get_database_url_for_env,
165
+ get_database_url_for_shell = get_database_url_for_shell,
166
+ get_compose_env_database_url = get_compose_env_database_url,
167
+ get_tilt_database_url_template = get_tilt_database_url_template,
168
+ )
169
+
170
+ CONSTANTS = {}
@@ -0,0 +1,54 @@
1
+ # Dockerfile generation exports
2
+ # === INLINED CONSTANTS for pure extension loading ===
3
+ BASE_PORT_FRONTEND = 3000
4
+ BASE_PORT_BACKEND = 4000
5
+ # === END INLINED CONSTANTS ===
6
+
7
+
8
+ load('../generators/golden_docker_generator_v2.star', 'L4_generate_orchestrator')
9
+
10
+
11
+ 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=True, use_shared_libs=True, use_prisma=False, use_golden=True, manifest=None):
12
+ """Generate Dockerfile for frontend services."""
13
+ return L4_generate_orchestrator(
14
+ res_path=res_path,
15
+ res_type='frontend',
16
+ resource_name=resource_name,
17
+ use_nginx=use_nginx,
18
+ port=port,
19
+ target_path=target_path,
20
+ build_cmd=build_cmd,
21
+ cmd=cmd,
22
+ use_infisical=use_infisical,
23
+ use_shared_libs=use_shared_libs,
24
+ use_prisma=use_prisma,
25
+ use_golden=use_golden,
26
+ manifest=manifest,
27
+ )
28
+
29
+ def generate_app_dockerfile(res_path, resource_name, port=BASE_PORT_BACKEND, build_cmd='bun run build', cmd='bun run start', use_infisical=True, use_shared_libs=True, use_prisma=True, use_golden=True, manifest=None):
30
+ """Generate Dockerfile for backend/app services."""
31
+ return L4_generate_orchestrator(
32
+ res_path=res_path,
33
+ res_type='backend',
34
+ resource_name=resource_name,
35
+ port=port,
36
+ build_cmd=build_cmd,
37
+ cmd=cmd,
38
+ use_infisical=use_infisical,
39
+ use_shared_libs=use_shared_libs,
40
+ use_prisma=use_prisma,
41
+ use_golden=use_golden,
42
+ manifest=manifest,
43
+ )
44
+
45
+ def generate_migrator_dockerfile(res_path, resource_name, use_infisical=True, use_golden=True, manifest=None):
46
+ """Generate Dockerfile for database migrator services."""
47
+ return L4_generate_orchestrator(
48
+ res_path=res_path,
49
+ res_type='migrator',
50
+ resource_name=resource_name,
51
+ use_infisical=use_infisical,
52
+ use_golden=use_golden,
53
+ manifest=manifest,
54
+ )
@@ -0,0 +1,73 @@
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.18"
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 = True, 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
+ has_prisma_config=prisma_config_exists,
68
+ manifest=manifest,
69
+ ),
70
+ )
71
+ dockerfile = "\n\n".join(parts)
72
+ footer = Utils.get_template_header("dockerfile", "golden_docker_generator_v2.L4_generate_orchestrator", resource_name, "Use docker_build(dockerfile_contents=...) in Tiltfile")
73
+ return dockerfile + "\n\n" + footer
@@ -0,0 +1,27 @@
1
+ load(
2
+ "./dockerfile/dockerfile.star",
3
+ "generate_frontend_dockerfile",
4
+ "generate_app_dockerfile",
5
+ "generate_migrator_dockerfile",
6
+ )
7
+ load("./config/dockerignore.star", "generate_dockerignore")
8
+ load(
9
+ "./compose/compose.star",
10
+ "generate_frontend_compose",
11
+ "generate_backend_compose_entry",
12
+ "generate_app_compose_from_entries",
13
+ "generate_migrator_compose",
14
+ )
15
+ load("./build/golden_image.star", "GoldenImage")
16
+
17
+ Docker = struct(
18
+ frontend = generate_frontend_dockerfile,
19
+ backend = generate_app_dockerfile,
20
+ migrator = generate_migrator_dockerfile,
21
+ generate_dockerignore = generate_dockerignore,
22
+ frontend_compose = generate_frontend_compose,
23
+ backend_compose = generate_backend_compose_entry,
24
+ app_compose = generate_app_compose_from_entries,
25
+ migrator_compose = generate_migrator_compose,
26
+ golden_image = GoldenImage,
27
+ )
@@ -0,0 +1,23 @@
1
+ """
2
+ Bun Helper Functions
3
+ """
4
+
5
+ def bun_hoisted_packages_symlink_fix():
6
+ """
7
+ Fix all Bun-hoisted package symlinks in node_modules.
8
+
9
+ When packages are installed with Bun's isolated store, they may be symlinked
10
+ from node_modules to .bun/. These symlinks break when copied to Docker.
11
+ This function recreates the necessary symlinks for runtime resolution.
12
+
13
+ Handles:
14
+ - Regular packages with nested node_modules (e.g., hono)
15
+ - Scoped packages (@hono/*, @prisma/*)
16
+ """
17
+ return (
18
+ "# Fix Bun hoisted package symlinks that break when copied to Docker\n"
19
+ + "USER root\n"
20
+ + "COPY shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh /usr/local/bin/bun-hoisted-symlink-fix.sh\n"
21
+ + "RUN chmod +x /usr/local/bin/bun-hoisted-symlink-fix.sh && /usr/local/bin/bun-hoisted-symlink-fix.sh\n"
22
+ + "USER bun\n"
23
+ )