@tdk-landscape/tdk-cli-core 1.3.87 → 1.3.89

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 (34) hide show
  1. package/README.md +4 -4
  2. package/cli/dist/backend-frameworks/elysia.js +39 -0
  3. package/cli/dist/backend-frameworks/express.js +50 -0
  4. package/cli/dist/backend-frameworks/fastify.js +44 -0
  5. package/cli/dist/backend-frameworks/registry.js +45 -0
  6. package/cli/dist/backend-frameworks/types.js +2 -0
  7. package/cli/dist/backend-languages/go.js +98 -0
  8. package/cli/dist/backend-languages/registry.js +2 -0
  9. package/cli/dist/commands/resource.js +35 -8
  10. package/cli/dist/frontend-frameworks/lit.js +65 -0
  11. package/cli/dist/frontend-frameworks/preact.js +63 -0
  12. package/cli/dist/frontend-frameworks/qwik.js +62 -0
  13. package/cli/dist/frontend-frameworks/registry.js +16 -3
  14. package/cli/dist/frontend-frameworks/solid.js +63 -0
  15. package/cli/dist/frontend-frameworks/svelte.js +68 -0
  16. package/cli/dist/frontend-frameworks/vanilla.js +60 -0
  17. package/cli/dist/utils/service-manifest.js +1 -0
  18. package/cli/package.json +2 -2
  19. package/engine/schemas/service-schema.json +30 -7
  20. package/engine/topologies/platform/docker/compose/compose.star +9 -1
  21. package/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +34 -3
  22. package/engine/topologies/platform/docker/index.star +2 -0
  23. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +10 -1
  24. package/engine/topologies/tilt/generators/validators.star +4 -3
  25. package/engine/topologies/tilt/generators/vite/frameworks/lit.star +90 -0
  26. package/engine/topologies/tilt/generators/vite/frameworks/preact.star +92 -0
  27. package/engine/topologies/tilt/generators/vite/frameworks/qwik.star +92 -0
  28. package/engine/topologies/tilt/generators/vite/frameworks/solid.star +92 -0
  29. package/engine/topologies/tilt/generators/vite/frameworks/svelte.star +92 -0
  30. package/engine/topologies/tilt/generators/vite/frameworks/vanilla.star +90 -0
  31. package/engine/topologies/tilt/generators/vite/frontend.star +30 -0
  32. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +7 -0
  33. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +2 -2
  34. package/package.json +2 -2
@@ -0,0 +1,92 @@
1
+ # Qwik-specific Vite templates for frontend resources.
2
+
3
+ QWIK_VITE_FRONTEND = """{header}
4
+ import {{ resolve }} from 'node:path';
5
+ import {{ qwikVite }} from '@builder.io/qwik/optimizer';
6
+ import {{ defineConfig }} from 'vite';
7
+
8
+ export default defineConfig({{
9
+ base: '{base_path}',
10
+ build: {{
11
+ cssCodeSplit: false,
12
+ minify: false,
13
+ modulePreload: false,
14
+ rollupOptions: {{
15
+ output: {{
16
+ entryFileNames: '[name].js',
17
+ format: 'esm',
18
+ }},
19
+ }},
20
+ target: 'esnext',
21
+ }},
22
+ define: {{
23
+ global: 'globalThis',
24
+ }},
25
+ optimizeDeps: {{
26
+ include: [{optimize_deps_include}],
27
+ }},
28
+ plugins: [qwikVite({{ csr: true }})],
29
+ preview: {{
30
+ host: '0.0.0.0',
31
+ port: {port},
32
+ }},
33
+ resolve: {{
34
+ alias: {{
35
+ '@/autogenerated': resolve(__dirname),
36
+ '@': resolve(__dirname, '../src'),
37
+ 'set-cookie-parser': resolve(__dirname, '../src/utils/empty-module.js'),
38
+ {internal_aliases}
39
+ }},
40
+ }},
41
+ server: {{
42
+ host: '0.0.0.0',
43
+ port: {port},
44
+ hmr: {{
45
+ port: {hmr_port},
46
+ }},
47
+ {proxy_config}
48
+ }},
49
+ }});
50
+ """
51
+
52
+ QWIK_VITE_FRONTEND_BUILD = """{header}
53
+ import {{ resolve }} from 'node:path';
54
+ import {{ qwikVite }} from '@builder.io/qwik/optimizer';
55
+ import {{ defineConfig }} from 'vite';
56
+
57
+ export default defineConfig({{
58
+ mode: 'production',
59
+ base: '{base_path}',
60
+ build: {{
61
+ cssCodeSplit: false,
62
+ minify: true,
63
+ modulePreload: false,
64
+ rollupOptions: {{
65
+ output: {{
66
+ entryFileNames: '[name].js',
67
+ format: 'esm',
68
+ manualChunks: undefined,
69
+ }},
70
+ }},
71
+ target: 'esnext',
72
+ }},
73
+ define: {{
74
+ global: 'globalThis',
75
+ __DEV__: 'false',
76
+ 'process.env.NODE_ENV': '"production"',
77
+ }},
78
+ optimizeDeps: {{
79
+ include: [{optimize_deps_include}],
80
+ }},
81
+ plugins: [qwikVite({{ csr: true }})],
82
+ resolve: {{
83
+ alias: {{
84
+ '@/autogenerated': resolve(__dirname),
85
+ '@': resolve(__dirname, '../src'),
86
+ 'set-cookie-parser': resolve(__dirname, '../src/utils/empty-module.js'),
87
+ }},
88
+ conditions: ['browser', 'import', 'module', 'es2020', 'default'],
89
+ mainFields: ['browser', 'module', 'jsnext:main', 'jsnext', 'main'],
90
+ }},
91
+ }});
92
+ """
@@ -0,0 +1,92 @@
1
+ # Solid-specific Vite templates for frontend resources.
2
+
3
+ SOLID_VITE_FRONTEND = """{header}
4
+ import {{ resolve }} from 'node:path';
5
+ import solid from 'vite-plugin-solid';
6
+ import {{ defineConfig }} from 'vite';
7
+
8
+ export default defineConfig({{
9
+ base: '{base_path}',
10
+ build: {{
11
+ cssCodeSplit: false,
12
+ minify: false,
13
+ modulePreload: false,
14
+ rollupOptions: {{
15
+ output: {{
16
+ entryFileNames: '[name].js',
17
+ format: 'esm',
18
+ }},
19
+ }},
20
+ target: 'esnext',
21
+ }},
22
+ define: {{
23
+ global: 'globalThis',
24
+ }},
25
+ optimizeDeps: {{
26
+ include: [{optimize_deps_include}],
27
+ }},
28
+ plugins: [solid()],
29
+ preview: {{
30
+ host: '0.0.0.0',
31
+ port: {port},
32
+ }},
33
+ resolve: {{
34
+ alias: {{
35
+ '@/autogenerated': resolve(__dirname),
36
+ '@': resolve(__dirname, '../src'),
37
+ 'set-cookie-parser': resolve(__dirname, '../src/utils/empty-module.js'),
38
+ {internal_aliases}
39
+ }},
40
+ }},
41
+ server: {{
42
+ host: '0.0.0.0',
43
+ port: {port},
44
+ hmr: {{
45
+ port: {hmr_port},
46
+ }},
47
+ {proxy_config}
48
+ }},
49
+ }});
50
+ """
51
+
52
+ SOLID_VITE_FRONTEND_BUILD = """{header}
53
+ import {{ resolve }} from 'node:path';
54
+ import solid from 'vite-plugin-solid';
55
+ import {{ defineConfig }} from 'vite';
56
+
57
+ export default defineConfig({{
58
+ mode: 'production',
59
+ base: '{base_path}',
60
+ build: {{
61
+ cssCodeSplit: false,
62
+ minify: true,
63
+ modulePreload: false,
64
+ rollupOptions: {{
65
+ output: {{
66
+ entryFileNames: '[name].js',
67
+ format: 'esm',
68
+ manualChunks: undefined,
69
+ }},
70
+ }},
71
+ target: 'esnext',
72
+ }},
73
+ define: {{
74
+ global: 'globalThis',
75
+ __DEV__: 'false',
76
+ 'process.env.NODE_ENV': '"production"',
77
+ }},
78
+ optimizeDeps: {{
79
+ include: [{optimize_deps_include}],
80
+ }},
81
+ plugins: [solid()],
82
+ resolve: {{
83
+ alias: {{
84
+ '@/autogenerated': resolve(__dirname),
85
+ '@': resolve(__dirname, '../src'),
86
+ 'set-cookie-parser': resolve(__dirname, '../src/utils/empty-module.js'),
87
+ }},
88
+ conditions: ['browser', 'import', 'module', 'es2020', 'default'],
89
+ mainFields: ['browser', 'module', 'jsnext:main', 'jsnext', 'main'],
90
+ }},
91
+ }});
92
+ """
@@ -0,0 +1,92 @@
1
+ # Svelte-specific Vite templates for frontend resources.
2
+
3
+ SVELTE_VITE_FRONTEND = """{header}
4
+ import {{ resolve }} from 'node:path';
5
+ import {{ svelte }} from '@sveltejs/vite-plugin-svelte';
6
+ import {{ defineConfig }} from 'vite';
7
+
8
+ export default defineConfig({{
9
+ base: '{base_path}',
10
+ build: {{
11
+ cssCodeSplit: false,
12
+ minify: false,
13
+ modulePreload: false,
14
+ rollupOptions: {{
15
+ output: {{
16
+ entryFileNames: '[name].js',
17
+ format: 'esm',
18
+ }},
19
+ }},
20
+ target: 'esnext',
21
+ }},
22
+ define: {{
23
+ global: 'globalThis',
24
+ }},
25
+ optimizeDeps: {{
26
+ include: [{optimize_deps_include}],
27
+ }},
28
+ plugins: [svelte()],
29
+ preview: {{
30
+ host: '0.0.0.0',
31
+ port: {port},
32
+ }},
33
+ resolve: {{
34
+ alias: {{
35
+ '@/autogenerated': resolve(__dirname),
36
+ '@': resolve(__dirname, '../src'),
37
+ 'set-cookie-parser': resolve(__dirname, '../src/utils/empty-module.js'),
38
+ {internal_aliases}
39
+ }},
40
+ }},
41
+ server: {{
42
+ host: '0.0.0.0',
43
+ port: {port},
44
+ hmr: {{
45
+ port: {hmr_port},
46
+ }},
47
+ {proxy_config}
48
+ }},
49
+ }});
50
+ """
51
+
52
+ SVELTE_VITE_FRONTEND_BUILD = """{header}
53
+ import {{ resolve }} from 'node:path';
54
+ import {{ svelte }} from '@sveltejs/vite-plugin-svelte';
55
+ import {{ defineConfig }} from 'vite';
56
+
57
+ export default defineConfig({{
58
+ mode: 'production',
59
+ base: '{base_path}',
60
+ build: {{
61
+ cssCodeSplit: false,
62
+ minify: true,
63
+ modulePreload: false,
64
+ rollupOptions: {{
65
+ output: {{
66
+ entryFileNames: '[name].js',
67
+ format: 'esm',
68
+ manualChunks: undefined,
69
+ }},
70
+ }},
71
+ target: 'esnext',
72
+ }},
73
+ define: {{
74
+ global: 'globalThis',
75
+ __DEV__: 'false',
76
+ 'process.env.NODE_ENV': '"production"',
77
+ }},
78
+ optimizeDeps: {{
79
+ include: [{optimize_deps_include}],
80
+ }},
81
+ plugins: [svelte()],
82
+ resolve: {{
83
+ alias: {{
84
+ '@/autogenerated': resolve(__dirname),
85
+ '@': resolve(__dirname, '../src'),
86
+ 'set-cookie-parser': resolve(__dirname, '../src/utils/empty-module.js'),
87
+ }},
88
+ conditions: ['browser', 'import', 'module', 'es2020', 'default'],
89
+ mainFields: ['browser', 'module', 'jsnext:main', 'jsnext', 'main'],
90
+ }},
91
+ }});
92
+ """
@@ -0,0 +1,90 @@
1
+ # Vanilla TypeScript-specific Vite templates for frontend resources.
2
+
3
+ VANILLA_VITE_FRONTEND = """{header}
4
+ import {{ resolve }} from 'node:path';
5
+ import {{ defineConfig }} from 'vite';
6
+
7
+ export default defineConfig({{
8
+ base: '{base_path}',
9
+ build: {{
10
+ cssCodeSplit: false,
11
+ minify: false,
12
+ modulePreload: false,
13
+ rollupOptions: {{
14
+ output: {{
15
+ entryFileNames: '[name].js',
16
+ format: 'esm',
17
+ }},
18
+ }},
19
+ target: 'esnext',
20
+ }},
21
+ define: {{
22
+ global: 'globalThis',
23
+ }},
24
+ optimizeDeps: {{
25
+ include: [{optimize_deps_include}],
26
+ }},
27
+ plugins: [],
28
+ preview: {{
29
+ host: '0.0.0.0',
30
+ port: {port},
31
+ }},
32
+ resolve: {{
33
+ alias: {{
34
+ '@/autogenerated': resolve(__dirname),
35
+ '@': resolve(__dirname, '../src'),
36
+ 'set-cookie-parser': resolve(__dirname, '../src/utils/empty-module.js'),
37
+ {internal_aliases}
38
+ }},
39
+ }},
40
+ server: {{
41
+ host: '0.0.0.0',
42
+ port: {port},
43
+ hmr: {{
44
+ port: {hmr_port},
45
+ }},
46
+ {proxy_config}
47
+ }},
48
+ }});
49
+ """
50
+
51
+ VANILLA_VITE_FRONTEND_BUILD = """{header}
52
+ import {{ resolve }} from 'node:path';
53
+ import {{ defineConfig }} from 'vite';
54
+
55
+ export default defineConfig({{
56
+ mode: 'production',
57
+ base: '{base_path}',
58
+ build: {{
59
+ cssCodeSplit: false,
60
+ minify: true,
61
+ modulePreload: false,
62
+ rollupOptions: {{
63
+ output: {{
64
+ entryFileNames: '[name].js',
65
+ format: 'esm',
66
+ manualChunks: undefined,
67
+ }},
68
+ }},
69
+ target: 'esnext',
70
+ }},
71
+ define: {{
72
+ global: 'globalThis',
73
+ __DEV__: 'false',
74
+ 'process.env.NODE_ENV': '"production"',
75
+ }},
76
+ optimizeDeps: {{
77
+ include: [{optimize_deps_include}],
78
+ }},
79
+ plugins: [],
80
+ resolve: {{
81
+ alias: {{
82
+ '@/autogenerated': resolve(__dirname),
83
+ '@': resolve(__dirname, '../src'),
84
+ 'set-cookie-parser': resolve(__dirname, '../src/utils/empty-module.js'),
85
+ }},
86
+ conditions: ['browser', 'import', 'module', 'es2020', 'default'],
87
+ mainFields: ['browser', 'module', 'jsnext:main', 'jsnext', 'main'],
88
+ }},
89
+ }});
90
+ """
@@ -17,6 +17,12 @@ load('../../../../topologies/tilt/manifest/constants.star', 'GENERATED_CONFIG_FI
17
17
 
18
18
  load('./frameworks/react.star', 'REACT_VITE_FRONTEND', 'REACT_VITE_FRONTEND_BUILD')
19
19
  load('./frameworks/vue.star', 'VUE_VITE_FRONTEND', 'VUE_VITE_FRONTEND_BUILD')
20
+ load('./frameworks/svelte.star', 'SVELTE_VITE_FRONTEND', 'SVELTE_VITE_FRONTEND_BUILD')
21
+ load('./frameworks/preact.star', 'PREACT_VITE_FRONTEND', 'PREACT_VITE_FRONTEND_BUILD')
22
+ load('./frameworks/lit.star', 'LIT_VITE_FRONTEND', 'LIT_VITE_FRONTEND_BUILD')
23
+ load('./frameworks/solid.star', 'SOLID_VITE_FRONTEND', 'SOLID_VITE_FRONTEND_BUILD')
24
+ load('./frameworks/qwik.star', 'QWIK_VITE_FRONTEND', 'QWIK_VITE_FRONTEND_BUILD')
25
+ load('./frameworks/vanilla.star', 'VANILLA_VITE_FRONTEND', 'VANILLA_VITE_FRONTEND_BUILD')
20
26
  load('../../../platform/docker/networking/api_path_constants.star', 'get_frontend_base_path')
21
27
  load('./helpers.star',
22
28
  'build_header',
@@ -38,6 +44,30 @@ _FRAMEWORK_TEMPLATES = {
38
44
  'dev': VUE_VITE_FRONTEND,
39
45
  'build': VUE_VITE_FRONTEND_BUILD,
40
46
  },
47
+ 'svelte': {
48
+ 'dev': SVELTE_VITE_FRONTEND,
49
+ 'build': SVELTE_VITE_FRONTEND_BUILD,
50
+ },
51
+ 'preact': {
52
+ 'dev': PREACT_VITE_FRONTEND,
53
+ 'build': PREACT_VITE_FRONTEND_BUILD,
54
+ },
55
+ 'lit': {
56
+ 'dev': LIT_VITE_FRONTEND,
57
+ 'build': LIT_VITE_FRONTEND_BUILD,
58
+ },
59
+ 'solid': {
60
+ 'dev': SOLID_VITE_FRONTEND,
61
+ 'build': SOLID_VITE_FRONTEND_BUILD,
62
+ },
63
+ 'qwik': {
64
+ 'dev': QWIK_VITE_FRONTEND,
65
+ 'build': QWIK_VITE_FRONTEND_BUILD,
66
+ },
67
+ 'vanilla': {
68
+ 'dev': VANILLA_VITE_FRONTEND,
69
+ 'build': VANILLA_VITE_FRONTEND_BUILD,
70
+ },
41
71
  }
42
72
 
43
73
  def _normalize_vite_base_path(base_path):
@@ -220,7 +220,14 @@ def _build_live_update_rules(res_path, full_res_path, syncs, project_root='', la
220
220
 
221
221
  Python backends reload their own process after a sync (uvicorn --reload), so they have
222
222
  no Bun install step. A changed pyproject.toml is not synced, so Tilt rebuilds the image instead.
223
+ Go backends have no live update at all (see the early return).
223
224
  """
225
+ # Go is compiled into the image and has no reload process, so syncing sources would leave the old
226
+ # binary running. Return before any sync() step is built (Tilt rejects sync steps that are created
227
+ # but never used): no live-update rules means Tilt rebuilds the image when a watched file changes.
228
+ if language == 'go':
229
+ return []
230
+
224
231
  live_update_rules = []
225
232
  for sync_path in syncs:
226
233
  # Python images never read the npm/Bun registry config, and the engine does not
@@ -310,7 +310,7 @@ def _generate_all_configs_for_resource(
310
310
 
311
311
  app_type = manifest.get('appType', 'backend')
312
312
  is_frontend = resource_config.get('frontend', False) or app_type == 'frontend'
313
- # Python backends own their runtime files (package/pyproject, Dockerfile,
313
+ # Provider-owned backends (Python, Go) own their runtime files (package/pyproject, Dockerfile,
314
314
  # reload command). Bun-only configs below (Vite, tsconfig, Prisma, bunfig) are skipped.
315
315
  provider_owned = Docker.is_provider_owned_language(manifest)
316
316
  if provider_owned:
@@ -318,7 +318,7 @@ def _generate_all_configs_for_resource(
318
318
  # COPY error halfway through the image build.
319
319
  root = ctx.get('project_root', '')
320
320
  prefix = (root.rstrip('/') + '/' if root else '') + resource_path + '/'
321
- for required in ['pyproject.toml', 'src/main.py']:
321
+ for required in Docker.language_required_files.get(manifest.get('language'), []):
322
322
  if not os.path.exists(prefix + required):
323
323
  fail("{}: language '{}' requires {} but {}{} does not exist".format(
324
324
  resource_name, manifest.get('language'), required, resource_path + '/', required))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tdk-landscape/tdk-cli-core",
3
- "version": "1.3.87",
3
+ "version": "1.3.89",
4
4
  "description": "TDK CLI — start services on your laptop.",
5
5
  "homepage": "https://tdk-landscape.github.io/tdk-website",
6
6
  "repository": {
@@ -67,7 +67,7 @@
67
67
  ],
68
68
  "license": "MIT",
69
69
  "dependencies": {
70
- "chalk": "^5.3.0",
70
+ "chalk": "^6.0.1",
71
71
  "commander": "^15.0.0",
72
72
  "handlebars": "^4.7.8",
73
73
  "ink": "^7.1.1",