@tdk-landscape/tdk-cli-core 1.3.26 → 1.3.29
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/discovery/TILT_DISCOVERY.star +3 -0
- package/discovery/config.star +5 -0
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +67 -78
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/resource.d.ts +1 -1
- package/dist/commands/resource.d.ts.map +1 -1
- package/dist/commands/resource.js +30 -19
- package/dist/commands/resource.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +3 -7
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +3 -4
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/generator/extension-fetch.d.ts +7 -17
- package/dist/generator/extension-fetch.d.ts.map +1 -1
- package/dist/generator/extension-fetch.js +38 -24
- package/dist/generator/extension-fetch.js.map +1 -1
- package/dist/generator/template-engine.d.ts.map +1 -1
- package/dist/generator/template-engine.js +16 -1
- package/dist/generator/template-engine.js.map +1 -1
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +2 -7
- package/dist/utils/command-helpers.js.map +1 -1
- package/dist/utils/env-validator.d.ts.map +1 -1
- package/dist/utils/env-validator.js +15 -1
- package/dist/utils/env-validator.js.map +1 -1
- package/dist/utils/prompt.d.ts +28 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +79 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/resource-features.d.ts +1 -0
- package/dist/utils/resource-features.d.ts.map +1 -1
- package/dist/utils/resource-features.js +11 -0
- package/dist/utils/resource-features.js.map +1 -1
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +5 -1
- package/engine/topologies/tilt/generators/npmrc.star +26 -4
- package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +18 -7
- package/engine/topologies/tilt/generators/vite/helpers.star +23 -13
- package/engine/topologies/tilt/resources/infra-loader.star +34 -1
- package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +18 -8
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-features.d.ts","sourceRoot":"","sources":["../../src/utils/resource-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"resource-features.d.ts","sourceRoot":"","sources":["../../src/utils/resource-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAgJ7D,CAAC;AAEF;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,CAejF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,EAAE,CAErF"}
|
|
@@ -123,6 +123,17 @@ export const RESOURCE_FEATURES = {
|
|
|
123
123
|
generator_file: "engine/topologies/tilt/generators/agents_md.star",
|
|
124
124
|
output_file: ".autogenerated/AGENTS.md",
|
|
125
125
|
},
|
|
126
|
+
ddd: {
|
|
127
|
+
name: "ddd",
|
|
128
|
+
description: "Domain-driven design folder structure (domain/application/infrastructure/presentation) " +
|
|
129
|
+
"and matching @domain/@application/@infrastructure/@presentation/@test path aliases " +
|
|
130
|
+
"(Premium - requires TDK_LICENSE_KEY; see hasDddLicense() in extension-fetch.ts)",
|
|
131
|
+
applies_to: ["backend", "worker", "migrator"],
|
|
132
|
+
enabled_by_default: false,
|
|
133
|
+
category: "premium",
|
|
134
|
+
generator_file: "engine/topologies/tilt/generators/vite/helpers.star, engine/topologies/tilt/generators/typescript/backend_tsconfig.star",
|
|
135
|
+
output_file: ".autogenerated/vite.config.*.ts, .autogenerated/tsconfig.*.json",
|
|
136
|
+
},
|
|
126
137
|
};
|
|
127
138
|
/**
|
|
128
139
|
* Get default features for a resource type
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-features.js","sourceRoot":"","sources":["../../src/utils/resource-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"resource-features.js","sourceRoot":"","sources":["../../src/utils/resource-features.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,MAAM,CAAC,MAAM,iBAAiB,GAAoC;IAChE,+EAA+E;IAC/E,sBAAsB;IACtB,+EAA+E;IAC/E,YAAY,EAAE;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,+EAA+E;QAC5F,UAAU,EAAE,CAAC,UAAU,CAAC;QACxB,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,wEAAwE;QACxF,WAAW,EAAE,8BAA8B;KAC5C;IAED,YAAY,EAAE;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,yDAAyD;QACtE,UAAU,EAAE,CAAC,UAAU,CAAC;QACxB,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,wEAAwE;QACxF,WAAW,EAAE,uBAAuB;KACrC;IAED,WAAW,EAAE;QACX,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,4CAA4C;QACzD,UAAU,EAAE,CAAC,UAAU,CAAC;QACxB,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,wEAAwE;QACxF,WAAW,EAAE,6BAA6B;KAC3C;IAED,+EAA+E;IAC/E,qBAAqB;IACrB,+EAA+E;IAC/E,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wEAAwE;QACrF,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC7C,kBAAkB,EAAE,IAAI;QACxB,cAAc,EAAE,iEAAiE;QACjF,WAAW,EAAE,+CAA+C;KAC7D;IAED,+EAA+E;IAC/E,0EAA0E;IAC1E,+EAA+E;IAC/E,mFAAmF;IACnF,kCAAkC;IAElC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC;QAC1C,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,oDAAoD;QACpE,WAAW,EAAE,iCAAiC;KAC/C;IAED,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,sDAAsD;QACnE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,+CAA+C;QAC/D,WAAW,EAAE,gCAAgC;KAC9C;IAED,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,sDAAsD;QACnE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,iFAAiF;QACjG,WAAW,EAAE,+BAA+B;KAC7C;IAED,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,qDAAqD;QAClE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,8CAA8C;QAC9D,WAAW,EAAE,wBAAwB;KACtC;IAED,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kDAAkD;QAC/D,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,8CAA8C;QAC9D,WAAW,EAAE,6BAA6B;KAC3C;IAED,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,6DAA6D;QAC1E,UAAU,EAAE,CAAC,UAAU,CAAC;QACxB,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,mDAAmD;QACnE,WAAW,EAAE,2BAA2B;KACzC;IAED,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,wCAAwC;QACrD,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC7C,kBAAkB,EAAE,IAAI,EAAE,iBAAiB;QAC3C,cAAc,EAAE,mEAAmE;QACnF,WAAW,EAAE,sBAAsB;KACpC;IAED,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,iEAAiE;QAC9E,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;QACnC,kBAAkB,EAAE,KAAK,EAAE,yCAAyC;QACpE,cAAc,EAAE,qEAAqE;QACrF,WAAW,EAAE,qCAAqC;KACnD;IAED,WAAW,EAAE;QACX,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,6IAA6I;QAC/I,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAChE,kBAAkB,EAAE,IAAI,EAAE,kDAAkD;QAC5E,cAAc,EAAE,kDAAkD;QAClE,WAAW,EAAE,0BAA0B;KACxC;IAED,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,WAAW,EACT,yFAAyF;YACzF,qFAAqF;YACrF,iFAAiF;QACnF,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC7C,kBAAkB,EAAE,KAAK;QACzB,QAAQ,EAAE,SAAS;QACnB,cAAc,EACZ,yHAAyH;QAC3H,WAAW,EAAE,iEAAiE;KAC/E;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAAC,OAAqB;IACrE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/D,IACE,OAAO,CAAC,kBAAkB;YAC1B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpC,kEAAkE;YAClE,CAAC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EACjE,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAqB;IAChE,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -197,7 +197,11 @@ def L3_generate_production_purger(res_path, use_golden = True):
|
|
|
197
197
|
+ "COPY " + res_path_rel + "/package.json ./package.json\n"
|
|
198
198
|
+ "COPY " + res_path_rel + "/" + AUTOGENERATED_CONFIG_PATHS['bunfig_docker'] + " ./bunfig.toml\n"
|
|
199
199
|
+ "COPY " + res_path_rel + "/" + AUTOGENERATED_CONFIG_PATHS['npmrc_docker'] + " ./.npmrc\n"
|
|
200
|
-
|
|
200
|
+
# NOTE: no COPY --from=l2_deps_manifest /cache/bun here - a cache mount's
|
|
201
|
+
# contents are never committed to a stage's filesystem, so COPY --from can't
|
|
202
|
+
# read them (BuildKit fails with "snapshot ... does not exist" on finalize).
|
|
203
|
+
# The --mount=type=cache below already shares the same warmed /cache/bun
|
|
204
|
+
# cache across stages via its target+sharing=shared, with no COPY needed.
|
|
201
205
|
# sharing=shared allows parallel builds without lock contention (Bun cache is atomic)
|
|
202
206
|
+ "RUN --mount=type=cache,target=/cache/bun,sharing=shared bun install --production --cache-dir=/cache/bun\n"
|
|
203
207
|
+ "# Option 2: Aggressive node_modules pruning to reduce size\n"
|
|
@@ -38,7 +38,7 @@ load("../../../topologies/tilt/manifest/constants.star", "PACKAGE_CONFIG_FILENAM
|
|
|
38
38
|
# 📝 NPMRC GENERATORS
|
|
39
39
|
# =============================================================================
|
|
40
40
|
|
|
41
|
-
def generate_npmrc(resource_path, registry_url, is_docker, write_fn):
|
|
41
|
+
def generate_npmrc(resource_path, registry_url, is_docker, write_fn, verdaccio_enabled=True):
|
|
42
42
|
"""
|
|
43
43
|
Generate .npmrc for NPM registry configuration.
|
|
44
44
|
|
|
@@ -47,13 +47,16 @@ def generate_npmrc(resource_path, registry_url, is_docker, write_fn):
|
|
|
47
47
|
registry_url: Verdaccio registry URL
|
|
48
48
|
is_docker: If True, generates .npmrc.docker.autogenerated, else .npmrc
|
|
49
49
|
write_fn: File writer function
|
|
50
|
+
verdaccio_enabled: If False, scoped packages fall back to public npm (default True)
|
|
50
51
|
"""
|
|
51
52
|
registry_host = registry_url.replace("http://", "").replace("https://", "").rstrip("/")
|
|
52
53
|
|
|
53
54
|
target_dir = resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER
|
|
54
55
|
generated_filename = PACKAGE_CONFIG_FILENAMES['npmrc_docker_autogenerated'] if is_docker else PACKAGE_CONFIG_FILENAMES['npmrc']
|
|
55
56
|
header = Utils.get_template_header("npmrc", target_dir + "/" + generated_filename)
|
|
56
|
-
|
|
57
|
+
|
|
58
|
+
if verdaccio_enabled:
|
|
59
|
+
content = """{header}
|
|
57
60
|
registry=https://registry.npmjs.org/
|
|
58
61
|
@{npm_scope}:registry={registry_url}/
|
|
59
62
|
@tdk-landscape:registry={registry_url}/
|
|
@@ -62,6 +65,13 @@ registry=https://registry.npmjs.org/
|
|
|
62
65
|
//{registry_host}/:_password=YWRtaW4=
|
|
63
66
|
//{registry_host}/:email=admin@example.com
|
|
64
67
|
//{registry_host}/:always-auth=true""".format(header=header, registry_url=registry_url, registry_host=registry_host, npm_scope=_NPM_SCOPE)
|
|
68
|
+
else:
|
|
69
|
+
# Verdaccio not enabled (no license key) — all scopes use public npm
|
|
70
|
+
content = """{header}
|
|
71
|
+
registry=https://registry.npmjs.org/
|
|
72
|
+
@{npm_scope}:registry=https://registry.npmjs.org/
|
|
73
|
+
@tdk-landscape:registry=https://registry.npmjs.org/
|
|
74
|
+
@identity:registry=https://registry.npmjs.org/""".format(header=header, npm_scope=_NPM_SCOPE)
|
|
65
75
|
|
|
66
76
|
filename = generated_filename
|
|
67
77
|
write_fn(target_dir + '/' + filename, content)
|
|
@@ -71,7 +81,7 @@ registry=https://registry.npmjs.org/
|
|
|
71
81
|
# 📝 BUNFIG GENERATORS
|
|
72
82
|
# =============================================================================
|
|
73
83
|
|
|
74
|
-
def generate_bunfig(resource_path, registry_url, is_docker, write_fn):
|
|
84
|
+
def generate_bunfig(resource_path, registry_url, is_docker, write_fn, verdaccio_enabled=True):
|
|
75
85
|
"""
|
|
76
86
|
Generate bunfig.toml for Bun package manager configuration.
|
|
77
87
|
|
|
@@ -80,11 +90,14 @@ def generate_bunfig(resource_path, registry_url, is_docker, write_fn):
|
|
|
80
90
|
registry_url: Verdaccio registry URL
|
|
81
91
|
is_docker: If True, generates bunfig.docker.autogenerated.toml, else bunfig.toml
|
|
82
92
|
write_fn: File writer function
|
|
93
|
+
verdaccio_enabled: If False, scoped packages fall back to public npm (default True)
|
|
83
94
|
"""
|
|
84
95
|
target_dir = resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER
|
|
85
96
|
generated_filename = PACKAGE_CONFIG_FILENAMES['bunfig_docker_autogenerated'] if is_docker else PACKAGE_CONFIG_FILENAMES['bunfig']
|
|
86
97
|
header = Utils.get_template_header("bunfig", target_dir + "/" + generated_filename)
|
|
87
|
-
|
|
98
|
+
|
|
99
|
+
if verdaccio_enabled:
|
|
100
|
+
content = """{header}
|
|
88
101
|
[install]
|
|
89
102
|
linker = "isolated"
|
|
90
103
|
linkWorkspacePackages = true
|
|
@@ -96,6 +109,15 @@ registry = "https://registry.npmjs.org"
|
|
|
96
109
|
"@identity" = {{ url = "{registry_url}/" }}
|
|
97
110
|
|
|
98
111
|
""".format(header=header, registry_url=registry_url, npm_scope=_NPM_SCOPE)
|
|
112
|
+
else:
|
|
113
|
+
# Verdaccio not enabled (no license key) — all scopes use public npm
|
|
114
|
+
content = """{header}
|
|
115
|
+
[install]
|
|
116
|
+
linker = "isolated"
|
|
117
|
+
linkWorkspacePackages = true
|
|
118
|
+
registry = "https://registry.npmjs.org"
|
|
119
|
+
|
|
120
|
+
""".format(header=header)
|
|
99
121
|
|
|
100
122
|
filename = generated_filename
|
|
101
123
|
write_fn(target_dir + '/' + filename, content)
|
|
@@ -11,7 +11,7 @@ load("../../../../topologies/tilt/manifest/constants.star", "GENERATED_CONFIG_FI
|
|
|
11
11
|
# Backend TSConfig Generator
|
|
12
12
|
# =============================================================================
|
|
13
13
|
|
|
14
|
-
def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_deps=None, is_docker=True):
|
|
14
|
+
def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_deps=None, is_docker=True, features=None):
|
|
15
15
|
"""
|
|
16
16
|
Generate tsconfig for backend services.
|
|
17
17
|
|
|
@@ -21,16 +21,21 @@ def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_dep
|
|
|
21
21
|
write_fn: Write function for file output
|
|
22
22
|
internal_deps: Optional internal dependencies map
|
|
23
23
|
is_docker: Whether generating for Docker context
|
|
24
|
+
features: Resource's service.json features: [] array (for the premium
|
|
25
|
+
"ddd" feature - see generate_backend_path_aliases() in vite/helpers.star)
|
|
24
26
|
"""
|
|
25
27
|
# When tsconfig is in .autogenerated/ folder, paths are relative to parent
|
|
26
28
|
paths = {
|
|
27
29
|
"@/*": ["../src/*"],
|
|
28
|
-
"@application/*": ["../src/application/*"],
|
|
29
|
-
"@domain/*": ["../src/domain/*"],
|
|
30
|
-
"@infrastructure/*": ["../src/infrastructure/*"],
|
|
31
|
-
"@presentation/*": ["../src/presentation/*"],
|
|
32
30
|
"@prisma/client": [prisma_path]
|
|
33
31
|
}
|
|
32
|
+
# DDD is premium - same gate as generate_backend_path_aliases() in vite/helpers.star.
|
|
33
|
+
ddd_enabled = features and 'ddd' in features and os.environ.get('TDK_LICENSE_KEY', '') != ''
|
|
34
|
+
if ddd_enabled:
|
|
35
|
+
paths["@application/*"] = ["../src/application/*"]
|
|
36
|
+
paths["@domain/*"] = ["../src/domain/*"]
|
|
37
|
+
paths["@infrastructure/*"] = ["../src/infrastructure/*"]
|
|
38
|
+
paths["@presentation/*"] = ["../src/presentation/*"]
|
|
34
39
|
root_dir = "../src"
|
|
35
40
|
if internal_deps and not is_docker:
|
|
36
41
|
sorted_deps = sorted(internal_deps.items())
|
|
@@ -54,7 +59,12 @@ def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_dep
|
|
|
54
59
|
"allowSyntheticDefaultImports": True,
|
|
55
60
|
"outDir": "../dist",
|
|
56
61
|
"rootDir": root_dir,
|
|
57
|
-
"
|
|
62
|
+
# "bun" (not "node"): @types/bun is a direct devDependency so it's always
|
|
63
|
+
# linked at the top level under any linker mode (including Docker's
|
|
64
|
+
# isolated linker), while @types/node is only a transitive dependency of
|
|
65
|
+
# bun-types and isn't hoisted to the top level under the isolated linker -
|
|
66
|
+
# "types": ["node"] fails to resolve there even though it works locally.
|
|
67
|
+
"types": ["bun"],
|
|
58
68
|
}
|
|
59
69
|
content = {
|
|
60
70
|
"compilerOptions": compiler_options,
|
|
@@ -103,7 +113,8 @@ def generate_backend_tsconfig(resource_path, prisma_path, write_fn, internal_dep
|
|
|
103
113
|
"allowSyntheticDefaultImports": True,
|
|
104
114
|
"outDir": "./dist",
|
|
105
115
|
"rootDir": docker_root_dir,
|
|
106
|
-
"
|
|
116
|
+
# See note above: "bun" resolves under the isolated linker, "node" doesn't.
|
|
117
|
+
"types": ["bun"],
|
|
107
118
|
}
|
|
108
119
|
docker_content = {
|
|
109
120
|
"compilerOptions": docker_compiler_options,
|
|
@@ -154,20 +154,30 @@ def generate_proxy_block(api_base_path, backend_port, additional_routes, stack='
|
|
|
154
154
|
|
|
155
155
|
|
|
156
156
|
def generate_backend_path_aliases(resource_path, manifest):
|
|
157
|
-
"""Generate TypeScript path aliases for DDD architecture."""
|
|
157
|
+
"""Generate TypeScript path aliases for DDD architecture (Premium - requires TDK_LICENSE_KEY)."""
|
|
158
158
|
lines = []
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
159
|
+
|
|
160
|
+
# DDD is a premium feature: requires both "ddd" in the resource's service.json
|
|
161
|
+
# features: [] AND a configured license key. The key presence check here is a
|
|
162
|
+
# cheap belt-and-suspenders guard (mirrors _load_verdaccio in infra-loader.star) -
|
|
163
|
+
# it can't verify the key actually grants "ddd" (Starlark has no fetch), so a
|
|
164
|
+
# hand-edited features: ["ddd"] with no key at all is still blocked, but real
|
|
165
|
+
# entitlement is checked client-side by hasDddLicense() in extension-fetch.ts
|
|
166
|
+
# before the CLI ever writes "ddd" into a resource's features array.
|
|
167
|
+
ddd_enabled = 'ddd' in manifest.get('features', []) and os.environ.get('TDK_LICENSE_KEY', '') != ''
|
|
168
|
+
|
|
169
|
+
if ddd_enabled:
|
|
170
|
+
ddd_aliases = [
|
|
171
|
+
('@application', './src/application'),
|
|
172
|
+
('@domain', './src/domain'),
|
|
173
|
+
('@infrastructure', './src/infrastructure'),
|
|
174
|
+
('@presentation', './src/presentation'),
|
|
175
|
+
('@test', './src/tests'),
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
for alias, rel_path in ddd_aliases:
|
|
179
|
+
lines.append(" '" + alias + "': path.resolve(__dirname, '" + rel_path + "'),")
|
|
180
|
+
|
|
171
181
|
resource_parts = []
|
|
172
182
|
for p in resource_path.split('/'):
|
|
173
183
|
if p:
|
|
@@ -131,7 +131,11 @@ def _load_database_management(should_enable, root_prefix="", env_file=None, writ
|
|
|
131
131
|
# =============================================================================
|
|
132
132
|
|
|
133
133
|
def _load_verdaccio(should_enable, root_prefix="", env_file=None):
|
|
134
|
-
"""Load Verdaccio private npm registry."""
|
|
134
|
+
"""Load Verdaccio private npm registry (premium feature — requires TDK_LICENSE_KEY)."""
|
|
135
|
+
# Verdaccio is a premium feature. Skip entirely when no license key is set.
|
|
136
|
+
if not os.environ.get("TDK_LICENSE_KEY", ""):
|
|
137
|
+
print("ℹ️ Verdaccio skipped — TDK_LICENSE_KEY not set (premium feature)")
|
|
138
|
+
return
|
|
135
139
|
if not should_enable(PlatformDockerConstants.VERDACCIO_RESOURCE_NAME):
|
|
136
140
|
print("DEBUG INFRA: Verdaccio not enabled")
|
|
137
141
|
return
|
|
@@ -184,8 +188,37 @@ def _load_infisical(should_enable, root_prefix="", env_file=None):
|
|
|
184
188
|
# 🌐 PROXY (Traefik)
|
|
185
189
|
# =============================================================================
|
|
186
190
|
|
|
191
|
+
def _stop_conflicting_traefik():
|
|
192
|
+
"""Auto-stop another TDK project's standalone Traefik if it already holds
|
|
193
|
+
host port 80/8080, so `tdk up` on a new project always wins over a stale
|
|
194
|
+
Traefik left running from a previous one.
|
|
195
|
+
|
|
196
|
+
Each standalone project gets its own container name and Docker network
|
|
197
|
+
(see PlatformDockerConstants.PROJECT_NAME), but the host ports are hardcoded
|
|
198
|
+
to 80/8080 so `api.{project}.localhost` works without a port suffix. That
|
|
199
|
+
means only one standalone project's Traefik can run at a time. Without this,
|
|
200
|
+
starting a second project while another's Traefik is still running fails
|
|
201
|
+
deep inside `docker compose up` with a cryptic "port is already allocated"
|
|
202
|
+
networking error instead of just taking over the port.
|
|
203
|
+
"""
|
|
204
|
+
own_container = PlatformDockerConstants.PROJECT_NAME + "_traefik"
|
|
205
|
+
result = str(local(
|
|
206
|
+
"docker ps --filter 'publish=80' --filter 'publish=8080' --format '{{.Names}}' 2>/dev/null || true",
|
|
207
|
+
quiet=True, echo_off=True,
|
|
208
|
+
)).strip()
|
|
209
|
+
for container in result.split("\n"):
|
|
210
|
+
container = container.strip()
|
|
211
|
+
if container and container != own_container:
|
|
212
|
+
print("🛑 Stopping Traefik from another TDK project ('{}') — it was holding host port 80/8080".format(container))
|
|
213
|
+
local(
|
|
214
|
+
"docker stop '{}' >/dev/null 2>&1 || true".format(container),
|
|
215
|
+
quiet=True, echo_off=True,
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
|
|
187
219
|
def _load_standalone_traefik(root_prefix, env_file, write_fn):
|
|
188
220
|
"""Generate and load a self-contained Traefik compose for standalone projects."""
|
|
221
|
+
_stop_conflicting_traefik()
|
|
189
222
|
compose_rel = ".tdk/.tdk-out/docker-compose.traefik.yml"
|
|
190
223
|
content = generate_standalone_traefik_compose()
|
|
191
224
|
if write_fn:
|
|
@@ -151,7 +151,7 @@ def _build_generated_file_list(resource_config, resource_path, manifest):
|
|
|
151
151
|
files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['dockerfile_app'])
|
|
152
152
|
dockerfile_rel_path = resource_config.get('dockerfile', '')
|
|
153
153
|
if dockerfile_rel_path:
|
|
154
|
-
dockerfile_path = resource_path
|
|
154
|
+
dockerfile_path = resource_path + "/" + dockerfile_rel_path
|
|
155
155
|
files.append(dockerfile_path + '.dockerignore')
|
|
156
156
|
|
|
157
157
|
# TS config(s)
|
|
@@ -372,7 +372,15 @@ def _generate_all_configs_for_resource(
|
|
|
372
372
|
if dockerfile_rel_path:
|
|
373
373
|
resource_type = 'frontend' if is_frontend else ('migrator' if 'migrator' in resource_config['name'] else 'backend')
|
|
374
374
|
dockerignore_content = Docker.generate_dockerignore(resource_path, resource_type)
|
|
375
|
-
|
|
375
|
+
# dockerfile_rel_path (e.g. ".autogenerated/Dockerfile.app.autogenerated") is relative
|
|
376
|
+
# to this resource's OWN directory - same convention _register_docker_build uses in
|
|
377
|
+
# apply_compose_resource_registration.star. Stripping a path segment here (previously
|
|
378
|
+
# resource_path.rsplit('/', 1)[0]) pointed at the parent STACK directory instead, so
|
|
379
|
+
# every sibling service in a stack (e.g. dashboard-api and dashboard-app under
|
|
380
|
+
# services/app) collided on one shared dockerignore file, each overwriting it with a
|
|
381
|
+
# different (backend vs frontend) ruleset on every Tiltfile load - a real diff every
|
|
382
|
+
# single run, which Tilt saw as a file change and used to trigger an infinite reload loop.
|
|
383
|
+
dockerfile_path = resource_path + "/" + dockerfile_rel_path
|
|
376
384
|
dockerignore_path = dockerfile_path + ".dockerignore"
|
|
377
385
|
write_file(dockerignore_path, dockerignore_content)
|
|
378
386
|
|
|
@@ -396,8 +404,9 @@ def _generate_all_configs_for_resource(
|
|
|
396
404
|
TSConfig.frontend(resource_path, write_file, internal_deps=internal_deps_map, is_docker=False)
|
|
397
405
|
else:
|
|
398
406
|
prisma_path = resource_config.get('prisma_client_path', './node_modules/.prisma/client')
|
|
399
|
-
|
|
400
|
-
TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=
|
|
407
|
+
resource_features = manifest.get('features', [])
|
|
408
|
+
TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=True, features=resource_features)
|
|
409
|
+
TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=False, features=resource_features)
|
|
401
410
|
|
|
402
411
|
# Prisma config
|
|
403
412
|
db_name = _get_db_name_for_resource(resource_name, resource_config['name'])
|
|
@@ -407,10 +416,11 @@ def _generate_all_configs_for_resource(
|
|
|
407
416
|
# ==========================================================================
|
|
408
417
|
# 8. PACKAGE CONFIGS (npmrc, bunfig)
|
|
409
418
|
# ==========================================================================
|
|
410
|
-
|
|
411
|
-
PackageConfig.
|
|
412
|
-
PackageConfig.
|
|
413
|
-
PackageConfig.
|
|
419
|
+
verdaccio_enabled = global_config.get('verdaccio_enabled', True)
|
|
420
|
+
PackageConfig.npmrc(resource_path=resource_path, registry_url=global_config['verdaccio_url_docker'], is_docker=True, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
|
|
421
|
+
PackageConfig.bunfig(resource_path=resource_path, registry_url=global_config['verdaccio_url_docker'], is_docker=True, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
|
|
422
|
+
PackageConfig.npmrc(resource_path=resource_path, registry_url=global_config['verdaccio_url_local'], is_docker=False, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
|
|
423
|
+
PackageConfig.bunfig(resource_path=resource_path, registry_url=global_config['verdaccio_url_local'], is_docker=False, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
|
|
414
424
|
|
|
415
425
|
# ==========================================================================
|
|
416
426
|
# 9. YAML MANIFEST (for verification)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tdk-landscape/tdk-cli-core",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.29",
|
|
4
4
|
"description": "TDK CLI - Tilt Development Kit command line interface",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"tdk",
|
|
@@ -58,7 +58,6 @@
|
|
|
58
58
|
"ink": "^7.0.1",
|
|
59
59
|
"ink-select-input": "^6.2.0",
|
|
60
60
|
"ora": "^8.0.0",
|
|
61
|
-
"prompts": "^2.4.2",
|
|
62
61
|
"react": "^19.2.5"
|
|
63
62
|
},
|
|
64
63
|
"devDependencies": {
|
|
@@ -66,6 +65,7 @@
|
|
|
66
65
|
"@types/inquirer": "^9.0.0",
|
|
67
66
|
"@types/node": "^20.0.0",
|
|
68
67
|
"knip": "^6.35.1",
|
|
68
|
+
"react-devtools-core": "^6.1.1",
|
|
69
69
|
"typescript": "^7.0.2",
|
|
70
70
|
"vite": "^6.0.0",
|
|
71
71
|
"vitest": "^5.0.0"
|