@ketrics/ketrics-cli 0.1.0

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 (91) hide show
  1. package/README.md +326 -0
  2. package/dist/bin/ketrics.d.ts +8 -0
  3. package/dist/bin/ketrics.d.ts.map +1 -0
  4. package/dist/bin/ketrics.js +12 -0
  5. package/dist/bin/ketrics.js.map +1 -0
  6. package/dist/src/cli.d.ts +11 -0
  7. package/dist/src/cli.d.ts.map +1 -0
  8. package/dist/src/cli.js +77 -0
  9. package/dist/src/cli.js.map +1 -0
  10. package/dist/src/commands/build.d.ts +10 -0
  11. package/dist/src/commands/build.d.ts.map +1 -0
  12. package/dist/src/commands/build.js +35 -0
  13. package/dist/src/commands/build.js.map +1 -0
  14. package/dist/src/commands/create.d.ts +11 -0
  15. package/dist/src/commands/create.d.ts.map +1 -0
  16. package/dist/src/commands/create.js +170 -0
  17. package/dist/src/commands/create.js.map +1 -0
  18. package/dist/src/commands/deploy.d.ts +11 -0
  19. package/dist/src/commands/deploy.d.ts.map +1 -0
  20. package/dist/src/commands/deploy.js +105 -0
  21. package/dist/src/commands/deploy.js.map +1 -0
  22. package/dist/src/commands/run.d.ts +11 -0
  23. package/dist/src/commands/run.d.ts.map +1 -0
  24. package/dist/src/commands/run.js +236 -0
  25. package/dist/src/commands/run.js.map +1 -0
  26. package/dist/src/commands/validate.d.ts +10 -0
  27. package/dist/src/commands/validate.d.ts.map +1 -0
  28. package/dist/src/commands/validate.js +46 -0
  29. package/dist/src/commands/validate.js.map +1 -0
  30. package/dist/src/index.d.ts +13 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +29 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/services/api-client.d.ts +14 -0
  35. package/dist/src/services/api-client.d.ts.map +1 -0
  36. package/dist/src/services/api-client.js +57 -0
  37. package/dist/src/services/api-client.js.map +1 -0
  38. package/dist/src/services/build-service.d.ts +40 -0
  39. package/dist/src/services/build-service.d.ts.map +1 -0
  40. package/dist/src/services/build-service.js +130 -0
  41. package/dist/src/services/build-service.js.map +1 -0
  42. package/dist/src/services/config-service.d.ts +35 -0
  43. package/dist/src/services/config-service.d.ts.map +1 -0
  44. package/dist/src/services/config-service.js +204 -0
  45. package/dist/src/services/config-service.js.map +1 -0
  46. package/dist/src/services/template-service.d.ts +51 -0
  47. package/dist/src/services/template-service.d.ts.map +1 -0
  48. package/dist/src/services/template-service.js +214 -0
  49. package/dist/src/services/template-service.js.map +1 -0
  50. package/dist/src/services/upload-service.d.ts +13 -0
  51. package/dist/src/services/upload-service.d.ts.map +1 -0
  52. package/dist/src/services/upload-service.js +54 -0
  53. package/dist/src/services/upload-service.js.map +1 -0
  54. package/dist/src/services/zip-service.d.ts +55 -0
  55. package/dist/src/services/zip-service.d.ts.map +1 -0
  56. package/dist/src/services/zip-service.js +219 -0
  57. package/dist/src/services/zip-service.js.map +1 -0
  58. package/dist/src/types/index.d.ts +188 -0
  59. package/dist/src/types/index.d.ts.map +1 -0
  60. package/dist/src/types/index.js +50 -0
  61. package/dist/src/types/index.js.map +1 -0
  62. package/dist/src/utils/logger.d.ts +52 -0
  63. package/dist/src/utils/logger.d.ts.map +1 -0
  64. package/dist/src/utils/logger.js +95 -0
  65. package/dist/src/utils/logger.js.map +1 -0
  66. package/dist/src/utils/spinner.d.ts +15 -0
  67. package/dist/src/utils/spinner.d.ts.map +1 -0
  68. package/dist/src/utils/spinner.js +38 -0
  69. package/dist/src/utils/spinner.js.map +1 -0
  70. package/package.json +47 -0
  71. package/templates/ketrics-app-v1/.env.example +17 -0
  72. package/templates/ketrics-app-v1/README.md +134 -0
  73. package/templates/ketrics-app-v1/backend/package-lock.json +716 -0
  74. package/templates/ketrics-app-v1/backend/package.json +18 -0
  75. package/templates/ketrics-app-v1/backend/src/index.ts +41 -0
  76. package/templates/ketrics-app-v1/backend/src/volume.ts +48 -0
  77. package/templates/ketrics-app-v1/backend/tsconfig.json +16 -0
  78. package/templates/ketrics-app-v1/frontend/index.html +13 -0
  79. package/templates/ketrics-app-v1/frontend/package-lock.json +1981 -0
  80. package/templates/ketrics-app-v1/frontend/package.json +24 -0
  81. package/templates/ketrics-app-v1/frontend/src/App.css +121 -0
  82. package/templates/ketrics-app-v1/frontend/src/App.tsx +109 -0
  83. package/templates/ketrics-app-v1/frontend/src/main.tsx +10 -0
  84. package/templates/ketrics-app-v1/frontend/src/services/index.ts +55 -0
  85. package/templates/ketrics-app-v1/frontend/tsconfig.json +21 -0
  86. package/templates/ketrics-app-v1/frontend/tsconfig.node.json +11 -0
  87. package/templates/ketrics-app-v1/frontend/vite.config.ts +11 -0
  88. package/templates/ketrics-app-v1/ketrics.config.json +10 -0
  89. package/templates/ketrics-app-v1/tests/test.echo.json +13 -0
  90. package/templates/ketrics-app-v1/tests/test.greet.json +11 -0
  91. package/templates/ketrics-app-v1/tests/test.info.json +9 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-service.d.ts","sourceRoot":"","sources":["../../../src/services/build-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAyBjF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CASxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKrE;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CA4BxD"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /**
3
+ * Build Service
4
+ *
5
+ * Handles building frontend and backend applications before deployment.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.validateBuildDirectory = validateBuildDirectory;
42
+ exports.runBuild = runBuild;
43
+ exports.getDistPath = getDistPath;
44
+ exports.validateDistDirectory = validateDistDirectory;
45
+ exports.buildAll = buildAll;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const child_process_1 = require("child_process");
49
+ /**
50
+ * Validate that a directory exists and has node_modules
51
+ */
52
+ function validateBuildDirectory(dir, name) {
53
+ const errors = [];
54
+ // Check directory exists
55
+ if (!fs.existsSync(dir)) {
56
+ errors.push(`${name}/ directory not found`);
57
+ return { valid: false, errors };
58
+ }
59
+ // Check node_modules exists
60
+ const nodeModulesPath = path.join(dir, 'node_modules');
61
+ if (!fs.existsSync(nodeModulesPath)) {
62
+ errors.push(`Missing node_modules in ${name}/. Run 'cd ${name} && npm install' first.`);
63
+ }
64
+ // Check package.json exists
65
+ const packageJsonPath = path.join(dir, 'package.json');
66
+ if (!fs.existsSync(packageJsonPath)) {
67
+ errors.push(`Missing package.json in ${name}/`);
68
+ }
69
+ return {
70
+ valid: errors.length === 0,
71
+ errors,
72
+ };
73
+ }
74
+ /**
75
+ * Run npm build in a directory
76
+ */
77
+ function runBuild(dir, name) {
78
+ try {
79
+ (0, child_process_1.execSync)('npm run build', {
80
+ cwd: dir,
81
+ stdio: 'inherit', // Show build output in console
82
+ });
83
+ }
84
+ catch {
85
+ throw new Error(`${name} build failed. Check the output above for errors.`);
86
+ }
87
+ }
88
+ /**
89
+ * Get the dist directory path for a build
90
+ */
91
+ function getDistPath(dir) {
92
+ return path.join(dir, 'dist');
93
+ }
94
+ /**
95
+ * Check if dist directory exists after build
96
+ */
97
+ function validateDistDirectory(dir, name) {
98
+ const distPath = getDistPath(dir);
99
+ if (!fs.existsSync(distPath)) {
100
+ throw new Error(`${name} build did not produce dist/ directory`);
101
+ }
102
+ }
103
+ /**
104
+ * Build both frontend and backend
105
+ */
106
+ function buildAll(projectDir) {
107
+ const frontendDir = path.join(projectDir, 'frontend');
108
+ const backendDir = path.join(projectDir, 'backend');
109
+ // Validate frontend
110
+ const frontendValidation = validateBuildDirectory(frontendDir, 'frontend');
111
+ if (!frontendValidation.valid) {
112
+ throw new Error(frontendValidation.errors.join('\n'));
113
+ }
114
+ // Validate backend
115
+ const backendValidation = validateBuildDirectory(backendDir, 'backend');
116
+ if (!backendValidation.valid) {
117
+ throw new Error(backendValidation.errors.join('\n'));
118
+ }
119
+ // Build frontend
120
+ runBuild(frontendDir, 'Frontend');
121
+ validateDistDirectory(frontendDir, 'Frontend');
122
+ // Build backend
123
+ runBuild(backendDir, 'Backend');
124
+ validateDistDirectory(backendDir, 'Backend');
125
+ return {
126
+ frontendDistPath: getDistPath(frontendDir),
127
+ backendDistPath: getDistPath(backendDir),
128
+ };
129
+ }
130
+ //# sourceMappingURL=build-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-service.js","sourceRoot":"","sources":["../../../src/services/build-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Config Service
3
+ *
4
+ * Loads and validates configuration from ketrics.config.json and .env files.
5
+ */
6
+ import { KetricsConfig, EnvConfig, FullConfig, ValidationResult } from '../types';
7
+ /**
8
+ * Load and parse ketrics.config.json
9
+ */
10
+ export declare function loadKetricsConfig(configPath?: string): KetricsConfig;
11
+ /**
12
+ * Load and parse .env file for Ketrics variables
13
+ */
14
+ export declare function loadEnvConfig(envPath?: string): EnvConfig;
15
+ /**
16
+ * Load full configuration (config + env)
17
+ */
18
+ export declare function loadFullConfig(configPath?: string, envPath?: string): FullConfig;
19
+ /**
20
+ * Validate configuration files without loading them fully
21
+ */
22
+ export declare function validateConfig(configPath?: string, envPath?: string): ValidationResult;
23
+ /**
24
+ * Check if config file exists
25
+ */
26
+ export declare function configExists(configPath?: string): boolean;
27
+ /**
28
+ * Get the default config file path
29
+ */
30
+ export declare function getDefaultConfigPath(): string;
31
+ /**
32
+ * Get the default env file path
33
+ */
34
+ export declare function getDefaultEnvPath(): string;
35
+ //# sourceMappingURL=config-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-service.d.ts","sourceRoot":"","sources":["../../../src/services/config-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAGL,aAAa,EACb,SAAS,EACT,UAAU,EACV,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAKlB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CA4BpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAoCzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,CAKhF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAoEtF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ /**
3
+ * Config Service
4
+ *
5
+ * Loads and validates configuration from ketrics.config.json and .env files.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.loadKetricsConfig = loadKetricsConfig;
42
+ exports.loadEnvConfig = loadEnvConfig;
43
+ exports.loadFullConfig = loadFullConfig;
44
+ exports.validateConfig = validateConfig;
45
+ exports.configExists = configExists;
46
+ exports.getDefaultConfigPath = getDefaultConfigPath;
47
+ exports.getDefaultEnvPath = getDefaultEnvPath;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const dotenv = __importStar(require("dotenv"));
51
+ const types_1 = require("../types");
52
+ const DEFAULT_CONFIG_FILE = 'ketrics.config.json';
53
+ const DEFAULT_ENV_FILE = '.env';
54
+ /**
55
+ * Load and parse ketrics.config.json
56
+ */
57
+ function loadKetricsConfig(configPath) {
58
+ const filePath = configPath || path.join(process.cwd(), DEFAULT_CONFIG_FILE);
59
+ if (!fs.existsSync(filePath)) {
60
+ throw new Error(`Configuration file not found: ${filePath}\nRun 'ketrics init' to create one.`);
61
+ }
62
+ const content = fs.readFileSync(filePath, 'utf-8');
63
+ let parsed;
64
+ try {
65
+ parsed = JSON.parse(content);
66
+ }
67
+ catch {
68
+ throw new Error(`Invalid JSON in configuration file: ${filePath}`);
69
+ }
70
+ const result = types_1.ketricsConfigSchema.safeParse(parsed);
71
+ if (!result.success) {
72
+ const errors = result.error.errors
73
+ .map((e) => ` - ${e.path.join('.')}: ${e.message}`)
74
+ .join('\n');
75
+ throw new Error(`Invalid configuration:\n${errors}`);
76
+ }
77
+ return result.data;
78
+ }
79
+ /**
80
+ * Load and parse .env file for Ketrics variables
81
+ */
82
+ function loadEnvConfig(envPath) {
83
+ const filePath = envPath || path.join(process.cwd(), DEFAULT_ENV_FILE);
84
+ if (!fs.existsSync(filePath)) {
85
+ throw new Error(`Environment file not found: ${filePath}\nCreate a .env file with KETRICS_TOKEN, KETRICS_API_URL, KETRICS_TENANT_ID, and KETRICS_APPLICATION_ID.`);
86
+ }
87
+ // Load .env file
88
+ const envConfig = dotenv.config({ path: filePath });
89
+ if (envConfig.error) {
90
+ throw new Error(`Error loading .env file: ${envConfig.error.message}`);
91
+ }
92
+ // Extract only KETRICS_* variables
93
+ const ketricsEnv = {
94
+ KETRICS_TOKEN: process.env.KETRICS_TOKEN || '',
95
+ KETRICS_API_URL: process.env.KETRICS_API_URL || '',
96
+ KETRICS_TENANT_ID: process.env.KETRICS_TENANT_ID || '',
97
+ KETRICS_APPLICATION_ID: process.env.KETRICS_APPLICATION_ID || '',
98
+ KETRICS_AUTH_TOKEN: process.env.KETRICS_AUTH_TOKEN,
99
+ KETRICS_RUNTIME_URL: process.env.KETRICS_RUNTIME_URL,
100
+ };
101
+ const result = types_1.envConfigSchema.safeParse(ketricsEnv);
102
+ if (!result.success) {
103
+ const errors = result.error.errors
104
+ .map((e) => ` - ${e.path.join('.')}: ${e.message}`)
105
+ .join('\n');
106
+ throw new Error(`Invalid environment configuration:\n${errors}`);
107
+ }
108
+ return result.data;
109
+ }
110
+ /**
111
+ * Load full configuration (config + env)
112
+ */
113
+ function loadFullConfig(configPath, envPath) {
114
+ const ketrics = loadKetricsConfig(configPath);
115
+ const env = loadEnvConfig(envPath);
116
+ return { ketrics, env };
117
+ }
118
+ /**
119
+ * Validate configuration files without loading them fully
120
+ */
121
+ function validateConfig(configPath, envPath) {
122
+ const errors = [];
123
+ const warnings = [];
124
+ // Check config file
125
+ const configFilePath = configPath || path.join(process.cwd(), DEFAULT_CONFIG_FILE);
126
+ if (!fs.existsSync(configFilePath)) {
127
+ errors.push(`Configuration file not found: ${configFilePath}`);
128
+ }
129
+ else {
130
+ try {
131
+ const content = fs.readFileSync(configFilePath, 'utf-8');
132
+ const parsed = JSON.parse(content);
133
+ const result = types_1.ketricsConfigSchema.safeParse(parsed);
134
+ if (!result.success) {
135
+ result.error.errors.forEach((e) => {
136
+ errors.push(`${e.path.join('.')}: ${e.message}`);
137
+ });
138
+ }
139
+ // Warnings
140
+ if (parsed.exclude?.length === 0) {
141
+ warnings.push('No exclude patterns defined - consider excluding node_modules, test files');
142
+ }
143
+ }
144
+ catch (e) {
145
+ errors.push(`Invalid JSON in configuration file: ${e.message}`);
146
+ }
147
+ }
148
+ // Check env file
149
+ const envFilePath = envPath || path.join(process.cwd(), DEFAULT_ENV_FILE);
150
+ if (!fs.existsSync(envFilePath)) {
151
+ errors.push(`Environment file not found: ${envFilePath}`);
152
+ }
153
+ else {
154
+ const envConfig = dotenv.config({ path: envFilePath });
155
+ if (envConfig.error) {
156
+ errors.push(`Error loading .env file: ${envConfig.error.message}`);
157
+ }
158
+ else {
159
+ const ketricsEnv = {
160
+ KETRICS_TOKEN: process.env.KETRICS_TOKEN || '',
161
+ KETRICS_API_URL: process.env.KETRICS_API_URL || '',
162
+ KETRICS_TENANT_ID: process.env.KETRICS_TENANT_ID || '',
163
+ KETRICS_APPLICATION_ID: process.env.KETRICS_APPLICATION_ID || '',
164
+ KETRICS_AUTH_TOKEN: process.env.KETRICS_AUTH_TOKEN,
165
+ KETRICS_RUNTIME_URL: process.env.KETRICS_RUNTIME_URL,
166
+ };
167
+ const result = types_1.envConfigSchema.safeParse(ketricsEnv);
168
+ if (!result.success) {
169
+ result.error.errors.forEach((e) => {
170
+ errors.push(`${e.path.join('.')}: ${e.message}`);
171
+ });
172
+ }
173
+ // Token format validation
174
+ if (ketricsEnv.KETRICS_TOKEN && !ketricsEnv.KETRICS_TOKEN.startsWith('ktd_')) {
175
+ warnings.push('KETRICS_TOKEN should start with "ktd_"');
176
+ }
177
+ }
178
+ }
179
+ return {
180
+ valid: errors.length === 0,
181
+ errors,
182
+ warnings,
183
+ };
184
+ }
185
+ /**
186
+ * Check if config file exists
187
+ */
188
+ function configExists(configPath) {
189
+ const filePath = configPath || path.join(process.cwd(), DEFAULT_CONFIG_FILE);
190
+ return fs.existsSync(filePath);
191
+ }
192
+ /**
193
+ * Get the default config file path
194
+ */
195
+ function getDefaultConfigPath() {
196
+ return path.join(process.cwd(), DEFAULT_CONFIG_FILE);
197
+ }
198
+ /**
199
+ * Get the default env file path
200
+ */
201
+ function getDefaultEnvPath() {
202
+ return path.join(process.cwd(), DEFAULT_ENV_FILE);
203
+ }
204
+ //# sourceMappingURL=config-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-service.js","sourceRoot":"","sources":["../../../src/services/config-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Template Service
3
+ *
4
+ * Handles template discovery, listing, and copying for the init command.
5
+ */
6
+ import type { TemplateInfo } from '../types';
7
+ /**
8
+ * Get list of available templates
9
+ */
10
+ export declare function getAvailableTemplates(): TemplateInfo[];
11
+ /**
12
+ * Get a specific template by name
13
+ */
14
+ export declare function getTemplate(name: string): TemplateInfo | undefined;
15
+ /**
16
+ * Validation result for destination directory
17
+ */
18
+ export interface DestinationValidation {
19
+ valid: boolean;
20
+ errors: string[];
21
+ }
22
+ /**
23
+ * Validate destination directory before copying template
24
+ */
25
+ export declare function validateDestination(destDir: string): DestinationValidation;
26
+ /**
27
+ * Copy template to destination directory
28
+ */
29
+ export declare function copyTemplate(template: TemplateInfo, destDir: string): void;
30
+ /**
31
+ * Get files that will be copied from template
32
+ */
33
+ export declare function getTemplateFiles(template: TemplateInfo): string[];
34
+ /**
35
+ * Update app name in project files
36
+ *
37
+ * Updates the name field in:
38
+ * - ketrics.config.json
39
+ * - frontend/package.json
40
+ * - backend/package.json
41
+ */
42
+ export declare function updateAppName(projectDir: string, appName: string): void;
43
+ /**
44
+ * Check if a directory exists
45
+ */
46
+ export declare function directoryExists(dirPath: string): boolean;
47
+ /**
48
+ * Create a directory
49
+ */
50
+ export declare function createDirectory(dirPath: string): void;
51
+ //# sourceMappingURL=template-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-service.d.ts","sourceRoot":"","sources":["../../../src/services/template-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAqB7C;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CA+BtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAGlE;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAsB1E;AAyBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAoBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAmBvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ /**
3
+ * Template Service
4
+ *
5
+ * Handles template discovery, listing, and copying for the init command.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.getAvailableTemplates = getAvailableTemplates;
42
+ exports.getTemplate = getTemplate;
43
+ exports.validateDestination = validateDestination;
44
+ exports.copyTemplate = copyTemplate;
45
+ exports.getTemplateFiles = getTemplateFiles;
46
+ exports.updateAppName = updateAppName;
47
+ exports.directoryExists = directoryExists;
48
+ exports.createDirectory = createDirectory;
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ /**
52
+ * Get the templates directory path
53
+ */
54
+ function getTemplatesDir() {
55
+ // When running from dist/, templates is at ../templates
56
+ // When running from src/, templates is at ../../templates
57
+ const distPath = path.join(__dirname, '../../templates');
58
+ const srcPath = path.join(__dirname, '../../../templates');
59
+ if (fs.existsSync(distPath)) {
60
+ return distPath;
61
+ }
62
+ if (fs.existsSync(srcPath)) {
63
+ return srcPath;
64
+ }
65
+ throw new Error('Templates directory not found');
66
+ }
67
+ /**
68
+ * Get list of available templates
69
+ */
70
+ function getAvailableTemplates() {
71
+ const templatesDir = getTemplatesDir();
72
+ const templates = [];
73
+ const entries = fs.readdirSync(templatesDir, { withFileTypes: true });
74
+ for (const entry of entries) {
75
+ if (!entry.isDirectory())
76
+ continue;
77
+ const templatePath = path.join(templatesDir, entry.name);
78
+ const configPath = path.join(templatePath, 'ketrics.config.json');
79
+ // Skip if no ketrics.config.json
80
+ if (!fs.existsSync(configPath))
81
+ continue;
82
+ try {
83
+ const configContent = fs.readFileSync(configPath, 'utf-8');
84
+ const config = JSON.parse(configContent);
85
+ templates.push({
86
+ name: entry.name,
87
+ path: templatePath,
88
+ description: config.description || 'No description available',
89
+ });
90
+ }
91
+ catch {
92
+ // Skip templates with invalid config
93
+ continue;
94
+ }
95
+ }
96
+ return templates;
97
+ }
98
+ /**
99
+ * Get a specific template by name
100
+ */
101
+ function getTemplate(name) {
102
+ const templates = getAvailableTemplates();
103
+ return templates.find((t) => t.name === name);
104
+ }
105
+ /**
106
+ * Validate destination directory before copying template
107
+ */
108
+ function validateDestination(destDir) {
109
+ const errors = [];
110
+ // Check for ketrics.config.json
111
+ if (fs.existsSync(path.join(destDir, 'ketrics.config.json'))) {
112
+ errors.push('Cannot initialize: ketrics.config.json already exists in this directory');
113
+ }
114
+ // Check for frontend/ directory
115
+ if (fs.existsSync(path.join(destDir, 'frontend'))) {
116
+ errors.push('Cannot initialize: frontend/ directory already exists');
117
+ }
118
+ // Check for backend/ directory
119
+ if (fs.existsSync(path.join(destDir, 'backend'))) {
120
+ errors.push('Cannot initialize: backend/ directory already exists');
121
+ }
122
+ return {
123
+ valid: errors.length === 0,
124
+ errors,
125
+ };
126
+ }
127
+ /**
128
+ * Copy directory recursively
129
+ */
130
+ function copyDirRecursive(src, dest) {
131
+ // Create destination directory
132
+ if (!fs.existsSync(dest)) {
133
+ fs.mkdirSync(dest, { recursive: true });
134
+ }
135
+ const entries = fs.readdirSync(src, { withFileTypes: true });
136
+ for (const entry of entries) {
137
+ const srcPath = path.join(src, entry.name);
138
+ const destPath = path.join(dest, entry.name);
139
+ if (entry.isDirectory()) {
140
+ copyDirRecursive(srcPath, destPath);
141
+ }
142
+ else {
143
+ fs.copyFileSync(srcPath, destPath);
144
+ }
145
+ }
146
+ }
147
+ /**
148
+ * Copy template to destination directory
149
+ */
150
+ function copyTemplate(template, destDir) {
151
+ copyDirRecursive(template.path, destDir);
152
+ }
153
+ /**
154
+ * Get files that will be copied from template
155
+ */
156
+ function getTemplateFiles(template) {
157
+ const files = [];
158
+ function collectFiles(dir, relativePath = '') {
159
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
160
+ for (const entry of entries) {
161
+ const fullPath = path.join(dir, entry.name);
162
+ const relPath = relativePath ? path.join(relativePath, entry.name) : entry.name;
163
+ if (entry.isDirectory()) {
164
+ collectFiles(fullPath, relPath);
165
+ }
166
+ else {
167
+ files.push(relPath);
168
+ }
169
+ }
170
+ }
171
+ collectFiles(template.path);
172
+ return files;
173
+ }
174
+ /**
175
+ * Update app name in project files
176
+ *
177
+ * Updates the name field in:
178
+ * - ketrics.config.json
179
+ * - frontend/package.json
180
+ * - backend/package.json
181
+ */
182
+ function updateAppName(projectDir, appName) {
183
+ const filesToUpdate = [
184
+ { path: path.join(projectDir, 'ketrics.config.json'), field: 'name' },
185
+ { path: path.join(projectDir, 'frontend', 'package.json'), field: 'name' },
186
+ { path: path.join(projectDir, 'backend', 'package.json'), field: 'name' },
187
+ ];
188
+ for (const file of filesToUpdate) {
189
+ if (!fs.existsSync(file.path))
190
+ continue;
191
+ try {
192
+ const content = fs.readFileSync(file.path, 'utf-8');
193
+ const json = JSON.parse(content);
194
+ json[file.field] = appName;
195
+ fs.writeFileSync(file.path, JSON.stringify(json, null, 2) + '\n', 'utf-8');
196
+ }
197
+ catch {
198
+ // Skip files that can't be parsed
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * Check if a directory exists
204
+ */
205
+ function directoryExists(dirPath) {
206
+ return fs.existsSync(dirPath);
207
+ }
208
+ /**
209
+ * Create a directory
210
+ */
211
+ function createDirectory(dirPath) {
212
+ fs.mkdirSync(dirPath, { recursive: true });
213
+ }
214
+ //# sourceMappingURL=template-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-service.js","sourceRoot":"","sources":["../../../src/services/template-service.ts"],"names":[],"mappings":"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"}