@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.
- package/README.md +326 -0
- package/dist/bin/ketrics.d.ts +8 -0
- package/dist/bin/ketrics.d.ts.map +1 -0
- package/dist/bin/ketrics.js +12 -0
- package/dist/bin/ketrics.js.map +1 -0
- package/dist/src/cli.d.ts +11 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +77 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/build.d.ts +10 -0
- package/dist/src/commands/build.d.ts.map +1 -0
- package/dist/src/commands/build.js +35 -0
- package/dist/src/commands/build.js.map +1 -0
- package/dist/src/commands/create.d.ts +11 -0
- package/dist/src/commands/create.d.ts.map +1 -0
- package/dist/src/commands/create.js +170 -0
- package/dist/src/commands/create.js.map +1 -0
- package/dist/src/commands/deploy.d.ts +11 -0
- package/dist/src/commands/deploy.d.ts.map +1 -0
- package/dist/src/commands/deploy.js +105 -0
- package/dist/src/commands/deploy.js.map +1 -0
- package/dist/src/commands/run.d.ts +11 -0
- package/dist/src/commands/run.d.ts.map +1 -0
- package/dist/src/commands/run.js +236 -0
- package/dist/src/commands/run.js.map +1 -0
- package/dist/src/commands/validate.d.ts +10 -0
- package/dist/src/commands/validate.d.ts.map +1 -0
- package/dist/src/commands/validate.js +46 -0
- package/dist/src/commands/validate.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +29 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/services/api-client.d.ts +14 -0
- package/dist/src/services/api-client.d.ts.map +1 -0
- package/dist/src/services/api-client.js +57 -0
- package/dist/src/services/api-client.js.map +1 -0
- package/dist/src/services/build-service.d.ts +40 -0
- package/dist/src/services/build-service.d.ts.map +1 -0
- package/dist/src/services/build-service.js +130 -0
- package/dist/src/services/build-service.js.map +1 -0
- package/dist/src/services/config-service.d.ts +35 -0
- package/dist/src/services/config-service.d.ts.map +1 -0
- package/dist/src/services/config-service.js +204 -0
- package/dist/src/services/config-service.js.map +1 -0
- package/dist/src/services/template-service.d.ts +51 -0
- package/dist/src/services/template-service.d.ts.map +1 -0
- package/dist/src/services/template-service.js +214 -0
- package/dist/src/services/template-service.js.map +1 -0
- package/dist/src/services/upload-service.d.ts +13 -0
- package/dist/src/services/upload-service.d.ts.map +1 -0
- package/dist/src/services/upload-service.js +54 -0
- package/dist/src/services/upload-service.js.map +1 -0
- package/dist/src/services/zip-service.d.ts +55 -0
- package/dist/src/services/zip-service.d.ts.map +1 -0
- package/dist/src/services/zip-service.js +219 -0
- package/dist/src/services/zip-service.js.map +1 -0
- package/dist/src/types/index.d.ts +188 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +50 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +52 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +95 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/spinner.d.ts +15 -0
- package/dist/src/utils/spinner.d.ts.map +1 -0
- package/dist/src/utils/spinner.js +38 -0
- package/dist/src/utils/spinner.js.map +1 -0
- package/package.json +47 -0
- package/templates/ketrics-app-v1/.env.example +17 -0
- package/templates/ketrics-app-v1/README.md +134 -0
- package/templates/ketrics-app-v1/backend/package-lock.json +716 -0
- package/templates/ketrics-app-v1/backend/package.json +18 -0
- package/templates/ketrics-app-v1/backend/src/index.ts +41 -0
- package/templates/ketrics-app-v1/backend/src/volume.ts +48 -0
- package/templates/ketrics-app-v1/backend/tsconfig.json +16 -0
- package/templates/ketrics-app-v1/frontend/index.html +13 -0
- package/templates/ketrics-app-v1/frontend/package-lock.json +1981 -0
- package/templates/ketrics-app-v1/frontend/package.json +24 -0
- package/templates/ketrics-app-v1/frontend/src/App.css +121 -0
- package/templates/ketrics-app-v1/frontend/src/App.tsx +109 -0
- package/templates/ketrics-app-v1/frontend/src/main.tsx +10 -0
- package/templates/ketrics-app-v1/frontend/src/services/index.ts +55 -0
- package/templates/ketrics-app-v1/frontend/tsconfig.json +21 -0
- package/templates/ketrics-app-v1/frontend/tsconfig.node.json +11 -0
- package/templates/ketrics-app-v1/frontend/vite.config.ts +11 -0
- package/templates/ketrics-app-v1/ketrics.config.json +10 -0
- package/templates/ketrics-app-v1/tests/test.echo.json +13 -0
- package/templates/ketrics-app-v1/tests/test.greet.json +11 -0
- 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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"}
|