dev-env-kit 0.1.3
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/.dev-env.example.yml +71 -0
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +176 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/generate.d.ts +5 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +62 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/setup.d.ts +7 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +123 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/share.d.ts +11 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +113 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/snapshot.d.ts +4 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +75 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/core/config/loader.d.ts +10 -0
- package/dist/core/config/loader.d.ts.map +1 -0
- package/dist/core/config/loader.js +137 -0
- package/dist/core/config/loader.js.map +1 -0
- package/dist/core/config/validator.d.ts +10 -0
- package/dist/core/config/validator.d.ts.map +1 -0
- package/dist/core/config/validator.js +63 -0
- package/dist/core/config/validator.js.map +1 -0
- package/dist/core/docker/compose-generator.d.ts +10 -0
- package/dist/core/docker/compose-generator.d.ts.map +1 -0
- package/dist/core/docker/compose-generator.js +133 -0
- package/dist/core/docker/compose-generator.js.map +1 -0
- package/dist/core/snapshot/storage.d.ts +13 -0
- package/dist/core/snapshot/storage.d.ts.map +1 -0
- package/dist/core/snapshot/storage.js +99 -0
- package/dist/core/snapshot/storage.js.map +1 -0
- package/dist/types/config.d.ts +378 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +61 -0
- package/dist/types/config.js.map +1 -0
- package/dist/utils/exec.d.ts +11 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +63 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/file-ops.d.ts +10 -0
- package/dist/utils/file-ops.d.ts.map +1 -0
- package/dist/utils/file-ops.js +150 -0
- package/dist/utils/file-ops.js.map +1 -0
- package/dist/utils/load-execa.js +4 -0
- package/dist/utils/logger.d.ts +21 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +94 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/platform.d.ts +12 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +103 -0
- package/dist/utils/platform.js.map +1 -0
- package/package.json +72 -0
- package/templates/docker-compose.hbs +31 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.fileExists = fileExists;
|
|
37
|
+
exports.readFile = readFile;
|
|
38
|
+
exports.writeFile = writeFile;
|
|
39
|
+
exports.readJson = readJson;
|
|
40
|
+
exports.writeJson = writeJson;
|
|
41
|
+
exports.ensureDir = ensureDir;
|
|
42
|
+
exports.copy = copy;
|
|
43
|
+
exports.findFile = findFile;
|
|
44
|
+
exports.findFiles = findFiles;
|
|
45
|
+
const fs = __importStar(require("fs-extra"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const logger_1 = require("./logger");
|
|
48
|
+
async function fileExists(filePath) {
|
|
49
|
+
try {
|
|
50
|
+
await fs.access(filePath);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function readFile(filePath) {
|
|
58
|
+
try {
|
|
59
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger_1.logger.error(`Failed to read file: ${filePath}`, error.message);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function writeFile(filePath, content) {
|
|
67
|
+
try {
|
|
68
|
+
await fs.ensureDir(path.dirname(filePath));
|
|
69
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
logger_1.logger.error(`Failed to write file: ${filePath}`, error.message);
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function readJson(filePath) {
|
|
77
|
+
try {
|
|
78
|
+
const content = await readFile(filePath);
|
|
79
|
+
return JSON.parse(content);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logger_1.logger.error(`Failed to read JSON file: ${filePath}`, error.message);
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function writeJson(filePath, data, indent = 2) {
|
|
87
|
+
const content = JSON.stringify(data, null, indent);
|
|
88
|
+
await writeFile(filePath, content);
|
|
89
|
+
}
|
|
90
|
+
async function ensureDir(dirPath) {
|
|
91
|
+
try {
|
|
92
|
+
await fs.ensureDir(dirPath);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
logger_1.logger.error(`Failed to create directory: ${dirPath}`, error.message);
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function copy(src, dest) {
|
|
100
|
+
try {
|
|
101
|
+
await fs.copy(src, dest);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
logger_1.logger.error(`Failed to copy ${src} to ${dest}`, error.message);
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function findFile(dirPath, fileName) {
|
|
109
|
+
try {
|
|
110
|
+
const files = await fs.readdir(dirPath);
|
|
111
|
+
for (const file of files) {
|
|
112
|
+
const fullPath = path.join(dirPath, file);
|
|
113
|
+
const stat = await fs.stat(fullPath);
|
|
114
|
+
if (stat.isDirectory()) {
|
|
115
|
+
const found = await findFile(fullPath, fileName);
|
|
116
|
+
if (found)
|
|
117
|
+
return found;
|
|
118
|
+
}
|
|
119
|
+
else if (file === fileName) {
|
|
120
|
+
return fullPath;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function findFiles(dirPath, pattern) {
|
|
130
|
+
const results = [];
|
|
131
|
+
try {
|
|
132
|
+
const files = await fs.readdir(dirPath);
|
|
133
|
+
for (const file of files) {
|
|
134
|
+
const fullPath = path.join(dirPath, file);
|
|
135
|
+
const stat = await fs.stat(fullPath);
|
|
136
|
+
if (stat.isDirectory()) {
|
|
137
|
+
const subResults = await findFiles(fullPath, pattern);
|
|
138
|
+
results.push(...subResults);
|
|
139
|
+
}
|
|
140
|
+
else if (pattern.test(file)) {
|
|
141
|
+
results.push(fullPath);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
logger_1.logger.debug(`Error searching for files: ${error.message}`);
|
|
147
|
+
}
|
|
148
|
+
return results;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=file-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-ops.js","sourceRoot":"","sources":["../../src/utils/file-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare enum LogLevel {
|
|
2
|
+
DEBUG = 0,
|
|
3
|
+
INFO = 1,
|
|
4
|
+
WARN = 2,
|
|
5
|
+
ERROR = 3
|
|
6
|
+
}
|
|
7
|
+
declare class Logger {
|
|
8
|
+
private level;
|
|
9
|
+
private colors;
|
|
10
|
+
setLevel(level: LogLevel): void;
|
|
11
|
+
private formatMessage;
|
|
12
|
+
debug(message: string, ...args: any[]): void;
|
|
13
|
+
info(message: string, ...args: any[]): void;
|
|
14
|
+
warn(message: string, ...args: any[]): void;
|
|
15
|
+
error(message: string, ...args: any[]): void;
|
|
16
|
+
success(message: string): void;
|
|
17
|
+
step(message: string): void;
|
|
18
|
+
}
|
|
19
|
+
export declare const logger: Logger;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,MAAM,CAQZ;IAEF,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,OAAO,CAAC,aAAa;IASrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM5C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG5B;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.logger = exports.LogLevel = void 0;
|
|
37
|
+
const util = __importStar(require("util"));
|
|
38
|
+
var LogLevel;
|
|
39
|
+
(function (LogLevel) {
|
|
40
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
41
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
42
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
43
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
44
|
+
})(LogLevel || (exports.LogLevel = LogLevel = {}));
|
|
45
|
+
class Logger {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.level = LogLevel.INFO;
|
|
48
|
+
this.colors = {
|
|
49
|
+
reset: '\x1b[0m',
|
|
50
|
+
bright: '\x1b[1m',
|
|
51
|
+
red: '\x1b[31m',
|
|
52
|
+
green: '\x1b[32m',
|
|
53
|
+
yellow: '\x1b[33m',
|
|
54
|
+
blue: '\x1b[34m',
|
|
55
|
+
cyan: '\x1b[36m',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
setLevel(level) {
|
|
59
|
+
this.level = level;
|
|
60
|
+
}
|
|
61
|
+
formatMessage(level, message, ...args) {
|
|
62
|
+
const timestamp = new Date().toISOString();
|
|
63
|
+
const formattedArgs = args.map(arg => typeof arg === 'object' ? util.inspect(arg, { depth: 2 }) : String(arg)).join(' ');
|
|
64
|
+
return `[${timestamp}] [${level}] ${message}${formattedArgs ? ' ' + formattedArgs : ''}`;
|
|
65
|
+
}
|
|
66
|
+
debug(message, ...args) {
|
|
67
|
+
if (this.level <= LogLevel.DEBUG) {
|
|
68
|
+
console.debug(this.colors.cyan + this.formatMessage('DEBUG', message, ...args) + this.colors.reset);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
info(message, ...args) {
|
|
72
|
+
if (this.level <= LogLevel.INFO) {
|
|
73
|
+
console.log(this.colors.green + this.formatMessage('INFO', message, ...args) + this.colors.reset);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
warn(message, ...args) {
|
|
77
|
+
if (this.level <= LogLevel.WARN) {
|
|
78
|
+
console.warn(this.colors.yellow + this.formatMessage('WARN', message, ...args) + this.colors.reset);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
error(message, ...args) {
|
|
82
|
+
if (this.level <= LogLevel.ERROR) {
|
|
83
|
+
console.error(this.colors.red + this.formatMessage('ERROR', message, ...args) + this.colors.reset);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
success(message) {
|
|
87
|
+
console.log(this.colors.green + this.colors.bright + `✓ ${message}` + this.colors.reset);
|
|
88
|
+
}
|
|
89
|
+
step(message) {
|
|
90
|
+
console.log(this.colors.blue + `→ ${message}` + this.colors.reset);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.logger = new Logger();
|
|
94
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type Platform = 'windows' | 'macos' | 'linux';
|
|
2
|
+
export declare function detectOS(): Platform;
|
|
3
|
+
export declare function isWindows(): boolean;
|
|
4
|
+
export declare function getShell(): string;
|
|
5
|
+
export declare function getPathSeparator(): string;
|
|
6
|
+
export declare function normalizePath(filePath: string): string;
|
|
7
|
+
export declare function getExecutableExtension(): string;
|
|
8
|
+
export declare function joinPaths(...paths: string[]): string;
|
|
9
|
+
export declare function resolvePath(...paths: string[]): string;
|
|
10
|
+
export declare function getHomeDirectory(): string;
|
|
11
|
+
export declare function getTempDirectory(): string;
|
|
12
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAIrD,wBAAgB,QAAQ,IAAI,QAAQ,CAUnC;AAID,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAID,wBAAgB,QAAQ,IAAI,MAAM,CAQjC;AAID,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAID,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAID,wBAAgB,SAAS,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEpD;AAID,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD;AAID,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAID,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.detectOS = detectOS;
|
|
37
|
+
exports.isWindows = isWindows;
|
|
38
|
+
exports.getShell = getShell;
|
|
39
|
+
exports.getPathSeparator = getPathSeparator;
|
|
40
|
+
exports.normalizePath = normalizePath;
|
|
41
|
+
exports.getExecutableExtension = getExecutableExtension;
|
|
42
|
+
exports.joinPaths = joinPaths;
|
|
43
|
+
exports.resolvePath = resolvePath;
|
|
44
|
+
exports.getHomeDirectory = getHomeDirectory;
|
|
45
|
+
exports.getTempDirectory = getTempDirectory;
|
|
46
|
+
const os = __importStar(require("os"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
//Detect the operating system
|
|
49
|
+
function detectOS() {
|
|
50
|
+
const platform = process.platform;
|
|
51
|
+
if (platform === 'win32') {
|
|
52
|
+
return 'windows';
|
|
53
|
+
}
|
|
54
|
+
else if (platform === 'darwin') {
|
|
55
|
+
return 'macos';
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return 'linux';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//Check if running on Windows
|
|
62
|
+
function isWindows() {
|
|
63
|
+
return process.platform === 'win32';
|
|
64
|
+
}
|
|
65
|
+
//Get the appropriate shell for the platform
|
|
66
|
+
function getShell() {
|
|
67
|
+
if (isWindows()) {
|
|
68
|
+
// Prefer PowerShell, fallback to cmd
|
|
69
|
+
return process.env.SHELL?.includes('powershell') || process.env.PSModulePath
|
|
70
|
+
? 'powershell'
|
|
71
|
+
: 'cmd';
|
|
72
|
+
}
|
|
73
|
+
return 'bash';
|
|
74
|
+
}
|
|
75
|
+
//Get path separator for the platform
|
|
76
|
+
function getPathSeparator() {
|
|
77
|
+
return path.sep;
|
|
78
|
+
}
|
|
79
|
+
//Normalize a path for the current platform
|
|
80
|
+
function normalizePath(filePath) {
|
|
81
|
+
return path.normalize(filePath);
|
|
82
|
+
}
|
|
83
|
+
//Get executable extension for the platform
|
|
84
|
+
function getExecutableExtension() {
|
|
85
|
+
return isWindows() ? '.exe' : '';
|
|
86
|
+
}
|
|
87
|
+
//Join paths in a platform-agnostic way
|
|
88
|
+
function joinPaths(...paths) {
|
|
89
|
+
return path.join(...paths);
|
|
90
|
+
}
|
|
91
|
+
//Resolve a path relative to the current working directory
|
|
92
|
+
function resolvePath(...paths) {
|
|
93
|
+
return path.resolve(...paths);
|
|
94
|
+
}
|
|
95
|
+
//Get the home directory for the current user
|
|
96
|
+
function getHomeDirectory() {
|
|
97
|
+
return os.homedir();
|
|
98
|
+
}
|
|
99
|
+
//Get temporary directory for the platform
|
|
100
|
+
function getTempDirectory() {
|
|
101
|
+
return os.tmpdir();
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,4BAUC;AAID,8BAEC;AAID,4BAQC;AAID,4CAEC;AAID,sCAEC;AAID,wDAEC;AAID,8BAEC;AAID,kCAEC;AAID,4CAEC;AAID,4CAEC;AA7ED,uCAAyB;AACzB,2CAA6B;AAI5B,6BAA6B;AAE9B,SAAgB,QAAQ;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAEA,6BAA6B;AAE9B,SAAgB,SAAS;IACvB,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AACtC,CAAC;AAEA,4CAA4C;AAE7C,SAAgB,QAAQ;IACtB,IAAI,SAAS,EAAE,EAAE,CAAC;QAChB,qCAAqC;QACrC,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;YAC1E,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEA,qCAAqC;AAEtC,SAAgB,gBAAgB;IAC9B,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC;AAEA,2CAA2C;AAE5C,SAAgB,aAAa,CAAC,QAAgB;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAEA,2CAA2C;AAE5C,SAAgB,sBAAsB;IACpC,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AACnC,CAAC;AAEA,uCAAuC;AAExC,SAAgB,SAAS,CAAC,GAAG,KAAe;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAC7B,CAAC;AAEA,0DAA0D;AAE3D,SAAgB,WAAW,CAAC,GAAG,KAAe;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AAChC,CAAC;AAEA,6CAA6C;AAE9C,SAAgB,gBAAgB;IAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAEA,0CAA0C;AAE3C,SAAgB,gBAAgB;IAC9B,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;AACrB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dev-env-kit",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "One-command project setup, environment snapshots, and Docker Compose generation for local development",
|
|
5
|
+
"main": "dist/cli/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"envkit": "dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"templates",
|
|
12
|
+
"README.md",
|
|
13
|
+
".dev-env.example.yml"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc && node -e \"require('fs').copyFileSync('src/utils/load-execa.js','dist/utils/load-execa.js')\"",
|
|
17
|
+
"dev": "ts-node src/cli/index.ts",
|
|
18
|
+
"start": "node dist/cli/index.js",
|
|
19
|
+
"test": "jest",
|
|
20
|
+
"lint": "eslint src --ext .ts",
|
|
21
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"dev-environment",
|
|
26
|
+
"development",
|
|
27
|
+
"setup",
|
|
28
|
+
"docker",
|
|
29
|
+
"snapshot",
|
|
30
|
+
"local-development",
|
|
31
|
+
"devops",
|
|
32
|
+
"environment-manager",
|
|
33
|
+
"docker-compose",
|
|
34
|
+
"cli"
|
|
35
|
+
],
|
|
36
|
+
"author": "",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/nazarli-shabnam/devkit.git"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/nazarli-shabnam/devkit/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/nazarli-shabnam/devkit#readme",
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=16.0.0"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"commander": "^11.1.0",
|
|
51
|
+
"dotenv": "^16.3.1",
|
|
52
|
+
"execa": "^8.0.1",
|
|
53
|
+
"fs-extra": "^11.2.0",
|
|
54
|
+
"handlebars": "^4.7.8",
|
|
55
|
+
"js-yaml": "^4.1.0",
|
|
56
|
+
"zod": "^3.22.4"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/fs-extra": "^11.0.4",
|
|
60
|
+
"@types/jest": "^29.5.12",
|
|
61
|
+
"@types/js-yaml": "^4.0.9",
|
|
62
|
+
"@types/node": "^20.10.6",
|
|
63
|
+
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
|
64
|
+
"@typescript-eslint/parser": "^6.17.0",
|
|
65
|
+
"eslint": "^8.56.0",
|
|
66
|
+
"jest": "^29.7.0",
|
|
67
|
+
"prettier": "^3.1.1",
|
|
68
|
+
"ts-jest": "^29.1.2",
|
|
69
|
+
"ts-node": "^10.9.2",
|
|
70
|
+
"typescript": "^5.3.3"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
version: "3.8"
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
{{#each services}}
|
|
5
|
+
{{name}}:
|
|
6
|
+
image: {{image}}{{#if version}}:{{version}}{{/if}}
|
|
7
|
+
{{#if ports}}
|
|
8
|
+
ports:
|
|
9
|
+
{{#each ports}}
|
|
10
|
+
- "{{this}}"
|
|
11
|
+
{{/each}}
|
|
12
|
+
{{/if}}
|
|
13
|
+
{{#if env}}
|
|
14
|
+
environment:
|
|
15
|
+
{{#each env}}
|
|
16
|
+
- {{@key}}={{this}}
|
|
17
|
+
{{/each}}
|
|
18
|
+
{{/if}}
|
|
19
|
+
{{#if healthcheck}}
|
|
20
|
+
healthcheck:
|
|
21
|
+
{{#each healthcheck}}
|
|
22
|
+
{{@key}}: {{this}}
|
|
23
|
+
{{/each}}
|
|
24
|
+
{{/if}}
|
|
25
|
+
networks:
|
|
26
|
+
- {{../networkName}}
|
|
27
|
+
{{/each}}
|
|
28
|
+
|
|
29
|
+
networks:
|
|
30
|
+
{{networkName}}:
|
|
31
|
+
name: {{networkName}}
|