@tdk-landscape/tdk-cli-core 1.3.14
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/README.md +293 -0
- package/bin/tdk.js +14 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +64 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +294 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +220 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +176 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/down.d.ts +3 -0
- package/dist/commands/down.d.ts.map +1 -0
- package/dist/commands/down.js +32 -0
- package/dist/commands/down.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +130 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/networks.d.ts +3 -0
- package/dist/commands/networks.d.ts.map +1 -0
- package/dist/commands/networks.js +260 -0
- package/dist/commands/networks.js.map +1 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +360 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/projects.d.ts +3 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +71 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/resource.d.ts +69 -0
- package/dist/commands/resource.d.ts.map +1 -0
- package/dist/commands/resource.js +572 -0
- package/dist/commands/resource.js.map +1 -0
- package/dist/commands/resources.d.ts +3 -0
- package/dist/commands/resources.d.ts.map +1 -0
- package/dist/commands/resources.js +73 -0
- package/dist/commands/resources.js.map +1 -0
- package/dist/commands/stack.d.ts +3 -0
- package/dist/commands/stack.d.ts.map +1 -0
- package/dist/commands/stack.js +103 -0
- package/dist/commands/stack.js.map +1 -0
- package/dist/commands/stacks.d.ts +3 -0
- package/dist/commands/stacks.d.ts.map +1 -0
- package/dist/commands/stacks.js +43 -0
- package/dist/commands/stacks.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +71 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/ui.d.ts +3 -0
- package/dist/commands/ui.d.ts.map +1 -0
- package/dist/commands/ui.js +446 -0
- package/dist/commands/ui.js.map +1 -0
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +149 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/commands/upgrade.d.ts +3 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +454 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +9 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/components/Accessible.d.ts +8 -0
- package/dist/components/Accessible.d.ts.map +1 -0
- package/dist/components/Accessible.js +10 -0
- package/dist/components/Accessible.js.map +1 -0
- package/dist/components/BaseTooltip.d.ts +4 -0
- package/dist/components/BaseTooltip.d.ts.map +1 -0
- package/dist/components/BaseTooltip.js +28 -0
- package/dist/components/BaseTooltip.js.map +1 -0
- package/dist/components/DetailPanel.d.ts +4 -0
- package/dist/components/DetailPanel.d.ts.map +1 -0
- package/dist/components/DetailPanel.js +18 -0
- package/dist/components/DetailPanel.js.map +1 -0
- package/dist/components/FileTree.d.ts +4 -0
- package/dist/components/FileTree.d.ts.map +1 -0
- package/dist/components/FileTree.js +47 -0
- package/dist/components/FileTree.js.map +1 -0
- package/dist/components/ResourceSelectInput.d.ts +4 -0
- package/dist/components/ResourceSelectInput.d.ts.map +1 -0
- package/dist/components/ResourceSelectInput.js +7 -0
- package/dist/components/ResourceSelectInput.js.map +1 -0
- package/dist/components/ResourceTable.d.ts +4 -0
- package/dist/components/ResourceTable.d.ts.map +1 -0
- package/dist/components/ResourceTable.js +18 -0
- package/dist/components/ResourceTable.js.map +1 -0
- package/dist/components/TabBar.d.ts +4 -0
- package/dist/components/TabBar.d.ts.map +1 -0
- package/dist/components/TabBar.js +17 -0
- package/dist/components/TabBar.js.map +1 -0
- package/dist/components/Tooltip.d.ts +12 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +12 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +8 -0
- package/dist/components/index.js.map +1 -0
- package/dist/config/platform-standards.d.ts +159 -0
- package/dist/config/platform-standards.d.ts.map +1 -0
- package/dist/config/platform-standards.js +181 -0
- package/dist/config/platform-standards.js.map +1 -0
- package/dist/generator/extension-fetch.d.ts +9 -0
- package/dist/generator/extension-fetch.d.ts.map +1 -0
- package/dist/generator/extension-fetch.js +153 -0
- package/dist/generator/extension-fetch.js.map +1 -0
- package/dist/generator/template-engine.d.ts +60 -0
- package/dist/generator/template-engine.d.ts.map +1 -0
- package/dist/generator/template-engine.js +416 -0
- package/dist/generator/template-engine.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +236 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +17 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/cache.d.ts +19 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +64 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/command-helpers.d.ts +17 -0
- package/dist/utils/command-helpers.d.ts.map +1 -0
- package/dist/utils/command-helpers.js +48 -0
- package/dist/utils/command-helpers.js.map +1 -0
- package/dist/utils/constants.d.ts +50 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +100 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/discovery-context.d.ts +4 -0
- package/dist/utils/discovery-context.d.ts.map +1 -0
- package/dist/utils/discovery-context.js +39 -0
- package/dist/utils/discovery-context.js.map +1 -0
- package/dist/utils/docker.d.ts +3 -0
- package/dist/utils/docker.d.ts.map +1 -0
- package/dist/utils/docker.js +13 -0
- package/dist/utils/docker.js.map +1 -0
- package/dist/utils/env-validator.d.ts +15 -0
- package/dist/utils/env-validator.d.ts.map +1 -0
- package/dist/utils/env-validator.js +95 -0
- package/dist/utils/env-validator.js.map +1 -0
- package/dist/utils/errors.d.ts +28 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +127 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/file-helpers.d.ts +14 -0
- package/dist/utils/file-helpers.d.ts.map +1 -0
- package/dist/utils/file-helpers.js +45 -0
- package/dist/utils/file-helpers.js.map +1 -0
- package/dist/utils/formatting.d.ts +30 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +164 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +41 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/port-assignment.d.ts +6 -0
- package/dist/utils/port-assignment.d.ts.map +1 -0
- package/dist/utils/port-assignment.js +75 -0
- package/dist/utils/port-assignment.js.map +1 -0
- package/dist/utils/project-features.d.ts +23 -0
- package/dist/utils/project-features.d.ts.map +1 -0
- package/dist/utils/project-features.js +98 -0
- package/dist/utils/project-features.js.map +1 -0
- package/dist/utils/project-templates.d.ts +7 -0
- package/dist/utils/project-templates.d.ts.map +1 -0
- package/dist/utils/project-templates.js +24 -0
- package/dist/utils/project-templates.js.map +1 -0
- package/dist/utils/resource-features.d.ts +28 -0
- package/dist/utils/resource-features.d.ts.map +1 -0
- package/dist/utils/resource-features.js +148 -0
- package/dist/utils/resource-features.js.map +1 -0
- package/dist/utils/services.d.ts +18 -0
- package/dist/utils/services.d.ts.map +1 -0
- package/dist/utils/services.js +291 -0
- package/dist/utils/services.js.map +1 -0
- package/dist/utils/stack-features.d.ts +22 -0
- package/dist/utils/stack-features.d.ts.map +1 -0
- package/dist/utils/stack-features.js +13 -0
- package/dist/utils/stack-features.js.map +1 -0
- package/dist/utils/tar.d.ts +7 -0
- package/dist/utils/tar.d.ts.map +1 -0
- package/dist/utils/tar.js +21 -0
- package/dist/utils/tar.js.map +1 -0
- package/dist/utils/tilt.d.ts +18 -0
- package/dist/utils/tilt.d.ts.map +1 -0
- package/dist/utils/tilt.js +77 -0
- package/dist/utils/tilt.js.map +1 -0
- package/dist/utils/validation.d.ts +9 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +49 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +72 -0
- package/templates/.tiltignore.hbs +73 -0
- package/templates/TILT_RESOURCE_DEFAULTS.star.hbs +221 -0
- package/templates/TILT_TECH_STACK.star.hbs +150 -0
- package/templates/Tiltfile.hbs +295 -0
- package/templates/spec.master.hbs +186 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/utils/docker.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
/** True if Docker, Colima, or Podman is installed and its daemon is reachable. */
|
|
3
|
+
export function isDockerAvailable() {
|
|
4
|
+
for (const command of ["docker ps", "colima status", "podman ps"]) {
|
|
5
|
+
try {
|
|
6
|
+
execSync(command, { stdio: "ignore" });
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch { }
|
|
10
|
+
}
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/utils/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,kFAAkF;AAClF,MAAM,UAAU,iBAAiB;IAC/B,KAAK,MAAM,OAAO,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC;YACH,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface EnvVariable {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
required: boolean;
|
|
5
|
+
default?: string;
|
|
6
|
+
example?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function generateEnvFile(projectRoot: string): string;
|
|
9
|
+
export declare function validateEnvFile(projectRoot: string): {
|
|
10
|
+
missing: string[];
|
|
11
|
+
invalid: string[];
|
|
12
|
+
warnings: string[];
|
|
13
|
+
};
|
|
14
|
+
export declare function ensureEnvFile(projectRoot: string): boolean;
|
|
15
|
+
//# sourceMappingURL=env-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-validator.d.ts","sourceRoot":"","sources":["../../src/utils/env-validator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+BD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA0B3D;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG;IACpD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAwCA;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAS1D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const REQUIRED_ENV_VARS = [
|
|
4
|
+
{
|
|
5
|
+
name: "VERDACCIO_URL_DOCKER",
|
|
6
|
+
description: "Docker-internal URL for npm registry",
|
|
7
|
+
required: true,
|
|
8
|
+
default: "http://verdaccio:4873",
|
|
9
|
+
example: "http://verdaccio:4873",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: "VERDACCIO_URL",
|
|
13
|
+
description: "Local development URL for npm registry",
|
|
14
|
+
required: false,
|
|
15
|
+
default: "http://localhost:4873",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: "TILT_ENV",
|
|
19
|
+
description: "Tilt environment name",
|
|
20
|
+
required: true,
|
|
21
|
+
default: "dev",
|
|
22
|
+
example: "dev",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: "DATABASE_URL",
|
|
26
|
+
description: "PostgreSQL connection string",
|
|
27
|
+
required: false,
|
|
28
|
+
default: "postgresql://postgres:postgres@postgres:5432/app_dev",
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
export function generateEnvFile(projectRoot) {
|
|
32
|
+
const lines = [
|
|
33
|
+
"# 🔧 TDK Environment Configuration",
|
|
34
|
+
"# Auto-generated by TDK CLI - edit as needed",
|
|
35
|
+
"# These variables are required for services to run",
|
|
36
|
+
"#",
|
|
37
|
+
"# After editing, run: tdk config regenerate && tdk up",
|
|
38
|
+
"",
|
|
39
|
+
];
|
|
40
|
+
for (const envVar of REQUIRED_ENV_VARS) {
|
|
41
|
+
lines.push(`# ${envVar.description}`);
|
|
42
|
+
if (envVar.required) {
|
|
43
|
+
lines.push(`# ⚠️ REQUIRED - set this or services will fail`);
|
|
44
|
+
}
|
|
45
|
+
if (envVar.example) {
|
|
46
|
+
lines.push(`# Example: ${envVar.example}`);
|
|
47
|
+
}
|
|
48
|
+
lines.push(`${envVar.name}=${envVar.default || ""}`);
|
|
49
|
+
lines.push("");
|
|
50
|
+
}
|
|
51
|
+
return lines.join("\n");
|
|
52
|
+
}
|
|
53
|
+
export function validateEnvFile(projectRoot) {
|
|
54
|
+
const envPath = join(projectRoot, ".env");
|
|
55
|
+
const result = {
|
|
56
|
+
missing: [],
|
|
57
|
+
invalid: [],
|
|
58
|
+
warnings: [],
|
|
59
|
+
};
|
|
60
|
+
if (!existsSync(envPath)) {
|
|
61
|
+
return {
|
|
62
|
+
missing: REQUIRED_ENV_VARS.filter((v) => v.required).map((v) => v.name),
|
|
63
|
+
invalid: [],
|
|
64
|
+
warnings: [".env file not found - will be auto-generated"],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const envContent = readFileSync(envPath, "utf-8");
|
|
68
|
+
const envVars = new Set(envContent
|
|
69
|
+
.split("\n")
|
|
70
|
+
.filter((line) => !line.startsWith("#") && line.includes("="))
|
|
71
|
+
.map((line) => line.split("=")[0])
|
|
72
|
+
.filter((name) => name.length > 0));
|
|
73
|
+
for (const envVar of REQUIRED_ENV_VARS) {
|
|
74
|
+
if (envVar.required && !envVars.has(envVar.name)) {
|
|
75
|
+
result.missing.push(envVar.name);
|
|
76
|
+
}
|
|
77
|
+
if (envVars.has(envVar.name)) {
|
|
78
|
+
const match = envContent.match(new RegExp(`^${envVar.name}=(.*)$`, "m"));
|
|
79
|
+
const value = match ? match[1] : "";
|
|
80
|
+
if (!value.trim()) {
|
|
81
|
+
result.invalid.push(`${envVar.name} is set but empty`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
export function ensureEnvFile(projectRoot) {
|
|
88
|
+
const envPath = join(projectRoot, ".env");
|
|
89
|
+
if (!existsSync(envPath)) {
|
|
90
|
+
writeFileSync(envPath, generateEnvFile(projectRoot));
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=env-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-validator.js","sourceRoot":"","sources":["../../src/utils/env-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,MAAM,iBAAiB,GAAkB;IACvC;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,sCAAsC;QACnD,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE,uBAAuB;KACjC;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,wCAAwC;QACrD,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,uBAAuB;KACjC;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,uBAAuB;QACpC,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,KAAK;KACf;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,8BAA8B;QAC3C,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,sDAAsD;KAChE;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,KAAK,GAAa;QACtB,oCAAoC;QACpC,8CAA8C;QAC9C,oDAAoD;QACpD,GAAG;QACH,uDAAuD;QACvD,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAEtC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAmB;IAKjD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,EAAc;QACvB,OAAO,EAAE,EAAc;QACvB,QAAQ,EAAE,EAAc;KACzB,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACvE,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC,8CAA8C,CAAC;SAC3D,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,UAAU;SACP,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACjC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CACrC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,mBAAmB,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare function getErrorMessage(err: unknown): string;
|
|
2
|
+
export declare function logVerbose(message: string, err?: unknown): void;
|
|
3
|
+
declare class TdkError extends Error {
|
|
4
|
+
suggestions: string[];
|
|
5
|
+
exitCode: number;
|
|
6
|
+
constructor(message: string, suggestions?: string[], exitCode?: number);
|
|
7
|
+
display(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare const errorFactories: {
|
|
10
|
+
tiltNotInstalled: () => TdkError;
|
|
11
|
+
dockerNotAvailable: () => TdkError;
|
|
12
|
+
stackNotFound: (name: string) => TdkError;
|
|
13
|
+
resourceNotFound: (name: string) => TdkError;
|
|
14
|
+
directoryExists: (path: string) => TdkError;
|
|
15
|
+
invalidPath: (path: string) => TdkError;
|
|
16
|
+
notInProject: () => TdkError;
|
|
17
|
+
};
|
|
18
|
+
export declare function requireProjectRoot(): string;
|
|
19
|
+
export declare function runCommand<T>(action: () => Promise<T>, options?: {
|
|
20
|
+
verbose?: boolean;
|
|
21
|
+
}): Promise<T | never>;
|
|
22
|
+
export declare function withTiltCheck<T>(action: () => Promise<T>, options?: {
|
|
23
|
+
verbose?: boolean;
|
|
24
|
+
}): Promise<T | never>;
|
|
25
|
+
export declare function showErrorAndExit(message: string, exitCode?: number): never;
|
|
26
|
+
export declare function handleTiltFailure(command: "up" | "down", exitCode: number): never;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAK/D;AAED,cAAM,QAAS,SAAQ,KAAK;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IAExB,YAAY,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,EAAO,EAAE,QAAQ,GAAE,MAAU,EAK5E;IAED,OAAO,IAAI,IAAI,CAEd;CACF;AAED,eAAO,MAAM,cAAc;IACzB,gBAAgB;IAOhB,kBAAkB;IAOlB,aAAa,SAAS,MAAM;IAK5B,gBAAgB,SAAS,MAAM;IAK/B,eAAe,SAAS,MAAM;IAK9B,WAAW,SAAS,MAAM;IAK1B,YAAY;CAKb,CAAC;AAEF,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAOD,wBAAsB,UAAU,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CASpB;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CAoBpB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,KAAK,CAG7E;AAkBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAGjF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { isDockerAvailable } from "./docker.js";
|
|
3
|
+
import { findProjectRoot } from "./paths.js";
|
|
4
|
+
import { isTiltAvailable } from "./tilt.js";
|
|
5
|
+
const QUICKSTART_DOCS_URL = "https://tdk-landscape.github.io/tdk-website/docs/quickstart/";
|
|
6
|
+
export function getErrorMessage(err) {
|
|
7
|
+
return err instanceof Error ? err.message : String(err);
|
|
8
|
+
}
|
|
9
|
+
export function logVerbose(message, err) {
|
|
10
|
+
if (process.env.TDK_VERBOSE) {
|
|
11
|
+
const errMsg = err !== undefined ? `: ${getErrorMessage(err)}` : "";
|
|
12
|
+
console.warn(chalk.gray(`${message}${errMsg}`));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
class TdkError extends Error {
|
|
16
|
+
suggestions;
|
|
17
|
+
exitCode;
|
|
18
|
+
constructor(message, suggestions = [], exitCode = 1) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = "TdkError";
|
|
21
|
+
this.suggestions = suggestions;
|
|
22
|
+
this.exitCode = exitCode;
|
|
23
|
+
}
|
|
24
|
+
display() {
|
|
25
|
+
showError(this.message, undefined, this.suggestions);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export const errorFactories = {
|
|
29
|
+
tiltNotInstalled: () => new TdkError("Tilt CLI is not installed", [
|
|
30
|
+
"Install Tilt: `brew install tilt` (macOS)",
|
|
31
|
+
"Or download from: https://docs.tilt.dev/install.html",
|
|
32
|
+
"Verify with: `tilt version`",
|
|
33
|
+
`Setup guide: ${QUICKSTART_DOCS_URL}`,
|
|
34
|
+
]),
|
|
35
|
+
dockerNotAvailable: () => new TdkError("Docker (or a compatible container runtime) is not running", [
|
|
36
|
+
"Start Docker Desktop, then verify with: `docker ps`",
|
|
37
|
+
"Or start Colima: `colima start`",
|
|
38
|
+
"Or start the Docker service on Linux: `sudo systemctl start docker`",
|
|
39
|
+
`Setup guide: ${QUICKSTART_DOCS_URL}`,
|
|
40
|
+
]),
|
|
41
|
+
stackNotFound: (name) => new TdkError(`Stack "${name}" not found`, [
|
|
42
|
+
"Run `tdk stacks` to see available stacks",
|
|
43
|
+
"Run `tdk stack` to assign resources to a stack",
|
|
44
|
+
]),
|
|
45
|
+
resourceNotFound: (name) => new TdkError(`Resource "${name}" not found`, [
|
|
46
|
+
"Run `tdk resources` to list all resources",
|
|
47
|
+
"Check the resource name spelling",
|
|
48
|
+
]),
|
|
49
|
+
directoryExists: (path) => new TdkError(`Directory already exists: ${path}`, [
|
|
50
|
+
"Use `--path` to specify a different location",
|
|
51
|
+
"Remove the existing directory if no longer needed",
|
|
52
|
+
]),
|
|
53
|
+
invalidPath: (path) => new TdkError(`Invalid path: ${path}`, [
|
|
54
|
+
"Path must be within the project directory",
|
|
55
|
+
'Path cannot contain special characters like <>:"|?*',
|
|
56
|
+
]),
|
|
57
|
+
notInProject: () => new TdkError("Could not find project root (no Tiltfile found)", [
|
|
58
|
+
"Run this from within a project that has a Tiltfile",
|
|
59
|
+
"Run `tdk project` to initialize a new project",
|
|
60
|
+
]),
|
|
61
|
+
};
|
|
62
|
+
export function requireProjectRoot() {
|
|
63
|
+
const projectRoot = findProjectRoot();
|
|
64
|
+
if (!projectRoot) {
|
|
65
|
+
console.error(chalk.red("Error: Could not find project root (no Tiltfile found)."));
|
|
66
|
+
console.error(chalk.gray("Run this from within a project that has a Tiltfile."));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
return projectRoot;
|
|
70
|
+
}
|
|
71
|
+
function handleCommandError(err) {
|
|
72
|
+
console.error(chalk.red(`Error: ${getErrorMessage(err)}`));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
export async function runCommand(action, options) {
|
|
76
|
+
try {
|
|
77
|
+
return await action();
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (options?.verbose && err instanceof Error && err.stack) {
|
|
81
|
+
console.error(chalk.gray(err.stack));
|
|
82
|
+
}
|
|
83
|
+
return handleCommandError(err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export async function withTiltCheck(action, options) {
|
|
87
|
+
const problems = [];
|
|
88
|
+
if (!isDockerAvailable()) {
|
|
89
|
+
problems.push(errorFactories.dockerNotAvailable());
|
|
90
|
+
}
|
|
91
|
+
if (!(await isTiltAvailable())) {
|
|
92
|
+
problems.push(errorFactories.tiltNotInstalled());
|
|
93
|
+
}
|
|
94
|
+
if (problems.length > 0) {
|
|
95
|
+
console.error(chalk.red(`\nTDK can't start - missing prerequisites:\n`));
|
|
96
|
+
problems.forEach((problem, i) => {
|
|
97
|
+
if (i > 0)
|
|
98
|
+
console.error("");
|
|
99
|
+
problem.display();
|
|
100
|
+
});
|
|
101
|
+
console.error(chalk.gray(`\nRun \`tdk doctor\` for a full environment check.`));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
return runCommand(action, options);
|
|
105
|
+
}
|
|
106
|
+
export function showErrorAndExit(message, exitCode = 1) {
|
|
107
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
108
|
+
process.exit(exitCode);
|
|
109
|
+
}
|
|
110
|
+
/** Display a formatted error message. Does NOT exit. */
|
|
111
|
+
function showError(message, context, suggestions) {
|
|
112
|
+
console.error(chalk.red(`❌ ${message}`));
|
|
113
|
+
if (context) {
|
|
114
|
+
console.error(chalk.gray(` ${context}`));
|
|
115
|
+
}
|
|
116
|
+
if (suggestions && suggestions.length > 0) {
|
|
117
|
+
console.error(chalk.yellow("\n💡 Suggestions:"));
|
|
118
|
+
suggestions.forEach((s) => {
|
|
119
|
+
console.error(chalk.cyan(` → ${s}`));
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function handleTiltFailure(command, exitCode) {
|
|
124
|
+
console.error(chalk.red(`\ntilt ${command} failed with exit code ${exitCode}`));
|
|
125
|
+
process.exit(exitCode);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FileGenerationTask } from "../types/index.js";
|
|
2
|
+
export declare function writeFilesWithProgress(basePath: string, tasks: FileGenerationTask[], onProgress?: (task: FileGenerationTask, index: number, total: number) => void): void;
|
|
3
|
+
/**
|
|
4
|
+
* Write JSON data to a file.
|
|
5
|
+
* @param filePath - Path to the file
|
|
6
|
+
* @param data - JSON-serializable data
|
|
7
|
+
* @param space - Number of spaces for indentation (default: 2)
|
|
8
|
+
*/
|
|
9
|
+
export declare function writeJsonFile(filePath: string, data: unknown, space?: number): void;
|
|
10
|
+
export declare function writeJsonFileInDir(dir: string, filename: string, data: unknown, space?: number): void;
|
|
11
|
+
export declare function writeTextFile(filePath: string, content: string): void;
|
|
12
|
+
export declare function writeTextFileInDir(dir: string, filename: string, content: string): void;
|
|
13
|
+
export declare function ensureDirectory(dirPath: string): void;
|
|
14
|
+
//# sourceMappingURL=file-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/file-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,kBAAkB,EAAE,EAC3B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAC5E,IAAI,CAgBN;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,GAAE,MAAU,GAAG,IAAI,CAGtF;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,KAAK,GAAE,MAAU,GAChB,IAAI,CAGN;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAErE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGvF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIrD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
export function writeFilesWithProgress(basePath, tasks, onProgress) {
|
|
5
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
6
|
+
const task = tasks[i];
|
|
7
|
+
console.log(chalk.blue(`${task.emoji} ${task.description}...`));
|
|
8
|
+
if (task.type === "json") {
|
|
9
|
+
writeJsonFileInDir(basePath, task.filename, task.content);
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
writeTextFileInDir(basePath, task.filename, String(task.content));
|
|
13
|
+
}
|
|
14
|
+
if (onProgress) {
|
|
15
|
+
onProgress(task, i, tasks.length);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Write JSON data to a file.
|
|
21
|
+
* @param filePath - Path to the file
|
|
22
|
+
* @param data - JSON-serializable data
|
|
23
|
+
* @param space - Number of spaces for indentation (default: 2)
|
|
24
|
+
*/
|
|
25
|
+
export function writeJsonFile(filePath, data, space = 2) {
|
|
26
|
+
const content = `${JSON.stringify(data, null, space)}\n`;
|
|
27
|
+
writeFileSync(filePath, content, "utf-8");
|
|
28
|
+
}
|
|
29
|
+
export function writeJsonFileInDir(dir, filename, data, space = 2) {
|
|
30
|
+
const filePath = resolve(dir, filename);
|
|
31
|
+
writeJsonFile(filePath, data, space);
|
|
32
|
+
}
|
|
33
|
+
export function writeTextFile(filePath, content) {
|
|
34
|
+
writeFileSync(filePath, content, "utf-8");
|
|
35
|
+
}
|
|
36
|
+
export function writeTextFileInDir(dir, filename, content) {
|
|
37
|
+
const filePath = resolve(dir, filename);
|
|
38
|
+
writeTextFile(filePath, content);
|
|
39
|
+
}
|
|
40
|
+
export function ensureDirectory(dirPath) {
|
|
41
|
+
if (!existsSync(dirPath)) {
|
|
42
|
+
mkdirSync(dirPath, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=file-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-helpers.js","sourceRoot":"","sources":["../../src/utils/file-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,KAA2B,EAC3B,UAA6E;IAE7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC;QAEhE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAa,EAAE,KAAK,GAAW,CAAC;IAC9E,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;IACzD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,QAAgB,EAChB,IAAa,EACb,KAAK,GAAW,CAAC;IAEjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAe;IAC7D,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,QAAgB,EAAE,OAAe;IAC/E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { StatusValue } from "../types/index.js";
|
|
2
|
+
export declare function formatCount(count: number, singular: string, plural?: string): string;
|
|
3
|
+
export declare function formatDate(timestamp: string): string;
|
|
4
|
+
export declare function formatShortDate(timestamp: string): string;
|
|
5
|
+
export declare function getStatusColor(status: StatusValue): string;
|
|
6
|
+
export declare function getStatusIcon(status: StatusValue): string;
|
|
7
|
+
export declare function colorizeByStatus(text: string, status: StatusValue): string;
|
|
8
|
+
export declare function showEmptyState(itemType: "resources" | "stacks" | "services" | "stack-services", filterContext?: string): void;
|
|
9
|
+
export declare function showCancelled(message?: string): void;
|
|
10
|
+
export declare function showCommandHeader(title: string): void;
|
|
11
|
+
export declare function showAllSatisfyCondition(items: string, condition: string): void;
|
|
12
|
+
/** Default width for ASCII boxes */
|
|
13
|
+
export declare const DEFAULT_BOX_WIDTH = 62;
|
|
14
|
+
export declare function formatBoxLine(char?: string, width?: number): string;
|
|
15
|
+
export declare function formatCentered(text: string, width?: number): string;
|
|
16
|
+
export declare function formatPadded(text: string, width: number): string;
|
|
17
|
+
export declare function truncate(str: string, maxLength: number): string;
|
|
18
|
+
export declare function showSuccess(message: string): void;
|
|
19
|
+
export declare function showStep(message: string): void;
|
|
20
|
+
export declare function showDetail(message: string, indent?: number): void;
|
|
21
|
+
export declare function formatBytes(bytes: number): string;
|
|
22
|
+
/**
|
|
23
|
+
* Print a boxed header with title and optional subtitle.
|
|
24
|
+
* Consolidates common box formatting patterns from networks.ts and other commands.
|
|
25
|
+
* @param title - The main title to display
|
|
26
|
+
* @param subtitle - Optional subtitle (e.g., domain info)
|
|
27
|
+
* @param width - Box width (defaults to DEFAULT_BOX_WIDTH)
|
|
28
|
+
*/
|
|
29
|
+
export declare function printBoxedHeader(title: string, subtitle?: string, width?: number): void;
|
|
30
|
+
//# sourceMappingURL=formatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpF;AASD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGzD;AA8CD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAE1E;AA0BD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,gBAAgB,EAChE,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAgBN;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED,oCAAoC;AACpC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAY,EAAE,KAAK,GAAE,MAA0B,GAAG,MAAM,CAE3F;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAA8B,GAAG,MAAM,CAK1F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI,CAE5D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,GAAE,MAA0B,GAChC,IAAI,CAkBN"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
function pluralize(count, singular, plural) {
|
|
3
|
+
return count === 1 ? singular : plural || `${singular}s`;
|
|
4
|
+
}
|
|
5
|
+
export function formatCount(count, singular, plural) {
|
|
6
|
+
return `${count} ${pluralize(count, singular, plural)}`;
|
|
7
|
+
}
|
|
8
|
+
const DATE_FORMAT_OPTIONS = {
|
|
9
|
+
month: "short",
|
|
10
|
+
day: "numeric",
|
|
11
|
+
hour: "2-digit",
|
|
12
|
+
minute: "2-digit",
|
|
13
|
+
};
|
|
14
|
+
export function formatDate(timestamp) {
|
|
15
|
+
const date = new Date(timestamp);
|
|
16
|
+
return date.toLocaleString("en-US", DATE_FORMAT_OPTIONS);
|
|
17
|
+
}
|
|
18
|
+
export function formatShortDate(timestamp) {
|
|
19
|
+
const date = new Date(timestamp);
|
|
20
|
+
return date.toLocaleDateString("en-US", { month: "short", day: "numeric" });
|
|
21
|
+
}
|
|
22
|
+
const STATUS_CATEGORY_CONFIG = {
|
|
23
|
+
success: { color: "green", icon: "✓", chalkFn: chalk.green },
|
|
24
|
+
error: { color: "red", icon: "✗", chalkFn: chalk.red },
|
|
25
|
+
warning: { color: "yellow", icon: "○", chalkFn: chalk.yellow },
|
|
26
|
+
unknown: { color: "gray", icon: "?", chalkFn: chalk.gray },
|
|
27
|
+
};
|
|
28
|
+
function getStatusCategory(status) {
|
|
29
|
+
if (!status)
|
|
30
|
+
return "unknown";
|
|
31
|
+
const lowerStatus = status.toLowerCase();
|
|
32
|
+
if (lowerStatus === "ready" ||
|
|
33
|
+
lowerStatus === "healthy" ||
|
|
34
|
+
lowerStatus === "active" ||
|
|
35
|
+
lowerStatus === "running") {
|
|
36
|
+
return "success";
|
|
37
|
+
}
|
|
38
|
+
if (lowerStatus === "error" ||
|
|
39
|
+
lowerStatus === "failed" ||
|
|
40
|
+
lowerStatus === "critical" ||
|
|
41
|
+
lowerStatus === "stopped") {
|
|
42
|
+
return "error";
|
|
43
|
+
}
|
|
44
|
+
if (lowerStatus === "pending" ||
|
|
45
|
+
lowerStatus === "starting" ||
|
|
46
|
+
lowerStatus === "building" ||
|
|
47
|
+
lowerStatus === "degraded") {
|
|
48
|
+
return "warning";
|
|
49
|
+
}
|
|
50
|
+
return "unknown";
|
|
51
|
+
}
|
|
52
|
+
export function getStatusColor(status) {
|
|
53
|
+
return STATUS_CATEGORY_CONFIG[getStatusCategory(status)].color;
|
|
54
|
+
}
|
|
55
|
+
export function getStatusIcon(status) {
|
|
56
|
+
return STATUS_CATEGORY_CONFIG[getStatusCategory(status)].icon;
|
|
57
|
+
}
|
|
58
|
+
export function colorizeByStatus(text, status) {
|
|
59
|
+
return STATUS_CATEGORY_CONFIG[getStatusCategory(status)].chalkFn(text);
|
|
60
|
+
}
|
|
61
|
+
const EMPTY_STATE_CONFIG = {
|
|
62
|
+
resources: {
|
|
63
|
+
singular: "resource",
|
|
64
|
+
command: "tdk resource <name>",
|
|
65
|
+
context: "\nTo create a resource:",
|
|
66
|
+
},
|
|
67
|
+
stacks: {
|
|
68
|
+
singular: "stack",
|
|
69
|
+
command: "tdk stack <stack-name>",
|
|
70
|
+
context: "\nTo create a stack, use:",
|
|
71
|
+
},
|
|
72
|
+
services: {
|
|
73
|
+
singular: "service",
|
|
74
|
+
command: "tdk resource <name>",
|
|
75
|
+
context: "\nTo create a service:",
|
|
76
|
+
},
|
|
77
|
+
"stack-services": {
|
|
78
|
+
singular: "service",
|
|
79
|
+
command: "tdk resource <name> --stack <stack-name>",
|
|
80
|
+
context: "\nTo add services to this stack:",
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
export function showEmptyState(itemType, filterContext) {
|
|
84
|
+
const config = EMPTY_STATE_CONFIG[itemType];
|
|
85
|
+
if (filterContext) {
|
|
86
|
+
console.log(chalk.yellow(`No ${config.singular}s found${filterContext}.`));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.log(chalk.yellow(`No ${config.singular}s found.`));
|
|
90
|
+
}
|
|
91
|
+
console.log(chalk.gray(config.context));
|
|
92
|
+
console.log(chalk.gray(` ${config.command}`));
|
|
93
|
+
if (itemType === "stacks") {
|
|
94
|
+
console.log(chalk.gray("\nOr create a new resource with a stack:"));
|
|
95
|
+
console.log(chalk.gray(" tdk resource <name> --stack <stack-name>"));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export function showCancelled(message) {
|
|
99
|
+
console.log(chalk.yellow(message || "Cancelled."));
|
|
100
|
+
}
|
|
101
|
+
export function showCommandHeader(title) {
|
|
102
|
+
console.log(chalk.blue(`TDK ${title}\n`));
|
|
103
|
+
}
|
|
104
|
+
export function showAllSatisfyCondition(items, condition) {
|
|
105
|
+
console.log(chalk.green(`All ${items} are ${condition}!`));
|
|
106
|
+
}
|
|
107
|
+
/** Default width for ASCII boxes */
|
|
108
|
+
export const DEFAULT_BOX_WIDTH = 62;
|
|
109
|
+
export function formatBoxLine(char = "─", width = DEFAULT_BOX_WIDTH) {
|
|
110
|
+
return char.repeat(width);
|
|
111
|
+
}
|
|
112
|
+
export function formatCentered(text, width = DEFAULT_BOX_WIDTH - 2) {
|
|
113
|
+
const padding = Math.max(0, width - text.length);
|
|
114
|
+
const left = Math.floor(padding / 2);
|
|
115
|
+
const right = padding - left;
|
|
116
|
+
return " ".repeat(left) + text + " ".repeat(right);
|
|
117
|
+
}
|
|
118
|
+
export function formatPadded(text, width) {
|
|
119
|
+
if (text.length > width) {
|
|
120
|
+
return `${text.slice(0, width - 1)}…`;
|
|
121
|
+
}
|
|
122
|
+
return text.padEnd(width);
|
|
123
|
+
}
|
|
124
|
+
export function truncate(str, maxLength) {
|
|
125
|
+
if (str.length <= maxLength)
|
|
126
|
+
return str;
|
|
127
|
+
return `${str.slice(0, maxLength - 3)}...`;
|
|
128
|
+
}
|
|
129
|
+
export function showSuccess(message) {
|
|
130
|
+
console.log(chalk.green(`✓ ${message}`));
|
|
131
|
+
}
|
|
132
|
+
export function showStep(message) {
|
|
133
|
+
console.log(chalk.blue(message));
|
|
134
|
+
}
|
|
135
|
+
export function showDetail(message, indent = 2) {
|
|
136
|
+
console.log(chalk.gray(`${" ".repeat(indent)}${message}`));
|
|
137
|
+
}
|
|
138
|
+
export function formatBytes(bytes) {
|
|
139
|
+
if (bytes < 1024)
|
|
140
|
+
return `${bytes} B`;
|
|
141
|
+
if (bytes < 1024 * 1024)
|
|
142
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
143
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Print a boxed header with title and optional subtitle.
|
|
147
|
+
* Consolidates common box formatting patterns from networks.ts and other commands.
|
|
148
|
+
* @param title - The main title to display
|
|
149
|
+
* @param subtitle - Optional subtitle (e.g., domain info)
|
|
150
|
+
* @param width - Box width (defaults to DEFAULT_BOX_WIDTH)
|
|
151
|
+
*/
|
|
152
|
+
export function printBoxedHeader(title, subtitle, width = DEFAULT_BOX_WIDTH) {
|
|
153
|
+
const innerWidth = width - 2;
|
|
154
|
+
const line = "─".repeat(innerWidth);
|
|
155
|
+
console.log();
|
|
156
|
+
console.log(chalk.cyan(`╭${line}╮`));
|
|
157
|
+
console.log(chalk.cyan("│") + chalk.bold.white(formatCentered(title, innerWidth)) + chalk.cyan("│"));
|
|
158
|
+
if (subtitle) {
|
|
159
|
+
console.log(chalk.cyan(`├${line}┤`));
|
|
160
|
+
console.log(chalk.cyan("│") + chalk.gray(formatCentered(subtitle, innerWidth)) + chalk.cyan("│"));
|
|
161
|
+
}
|
|
162
|
+
console.log(chalk.cyan(`╰${line}╯`));
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAc,GAAG,MAAM,GAAG,IAAI,CAiBvE;AA2BD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { cwd } from "node:process";
|
|
4
|
+
import packageJson from "../../package.json" with { type: "json" };
|
|
5
|
+
export function findProjectRoot(startDir = cwd()) {
|
|
6
|
+
let currentDir = resolve(startDir);
|
|
7
|
+
const root = resolve("/");
|
|
8
|
+
while (currentDir !== root) {
|
|
9
|
+
if (existsSync(join(currentDir, ".tdk", "project.json"))) {
|
|
10
|
+
return currentDir;
|
|
11
|
+
}
|
|
12
|
+
const parentDir = dirname(currentDir);
|
|
13
|
+
if (parentDir === currentDir) {
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
currentDir = parentDir;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
let packageCache = null;
|
|
21
|
+
function getPackageInfo() {
|
|
22
|
+
if (packageCache) {
|
|
23
|
+
return packageCache;
|
|
24
|
+
}
|
|
25
|
+
// Imported JSON is bundled by Bun compile, unlike a runtime fs lookup from $bunfs.
|
|
26
|
+
const parsed = packageJson;
|
|
27
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
28
|
+
throw new Error("Invalid package.json: expected object");
|
|
29
|
+
}
|
|
30
|
+
const packageInfo = parsed;
|
|
31
|
+
packageCache = {
|
|
32
|
+
name: String(packageInfo.name ?? "@tdk/cli"),
|
|
33
|
+
version: String(packageInfo.version ?? "0.0.0"),
|
|
34
|
+
fullPackage: packageInfo,
|
|
35
|
+
};
|
|
36
|
+
return packageCache;
|
|
37
|
+
}
|
|
38
|
+
export function getPackageVersion() {
|
|
39
|
+
return getPackageInfo().version;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=paths.js.map
|