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.
Files changed (62) hide show
  1. package/.dev-env.example.yml +71 -0
  2. package/LICENSE +21 -0
  3. package/README.md +128 -0
  4. package/dist/cli/index.d.ts +3 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +176 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/commands/generate.d.ts +5 -0
  9. package/dist/commands/generate.d.ts.map +1 -0
  10. package/dist/commands/generate.js +62 -0
  11. package/dist/commands/generate.js.map +1 -0
  12. package/dist/commands/setup.d.ts +7 -0
  13. package/dist/commands/setup.d.ts.map +1 -0
  14. package/dist/commands/setup.js +123 -0
  15. package/dist/commands/setup.js.map +1 -0
  16. package/dist/commands/share.d.ts +11 -0
  17. package/dist/commands/share.d.ts.map +1 -0
  18. package/dist/commands/share.js +113 -0
  19. package/dist/commands/share.js.map +1 -0
  20. package/dist/commands/snapshot.d.ts +4 -0
  21. package/dist/commands/snapshot.d.ts.map +1 -0
  22. package/dist/commands/snapshot.js +75 -0
  23. package/dist/commands/snapshot.js.map +1 -0
  24. package/dist/core/config/loader.d.ts +10 -0
  25. package/dist/core/config/loader.d.ts.map +1 -0
  26. package/dist/core/config/loader.js +137 -0
  27. package/dist/core/config/loader.js.map +1 -0
  28. package/dist/core/config/validator.d.ts +10 -0
  29. package/dist/core/config/validator.d.ts.map +1 -0
  30. package/dist/core/config/validator.js +63 -0
  31. package/dist/core/config/validator.js.map +1 -0
  32. package/dist/core/docker/compose-generator.d.ts +10 -0
  33. package/dist/core/docker/compose-generator.d.ts.map +1 -0
  34. package/dist/core/docker/compose-generator.js +133 -0
  35. package/dist/core/docker/compose-generator.js.map +1 -0
  36. package/dist/core/snapshot/storage.d.ts +13 -0
  37. package/dist/core/snapshot/storage.d.ts.map +1 -0
  38. package/dist/core/snapshot/storage.js +99 -0
  39. package/dist/core/snapshot/storage.js.map +1 -0
  40. package/dist/types/config.d.ts +378 -0
  41. package/dist/types/config.d.ts.map +1 -0
  42. package/dist/types/config.js +61 -0
  43. package/dist/types/config.js.map +1 -0
  44. package/dist/utils/exec.d.ts +11 -0
  45. package/dist/utils/exec.d.ts.map +1 -0
  46. package/dist/utils/exec.js +63 -0
  47. package/dist/utils/exec.js.map +1 -0
  48. package/dist/utils/file-ops.d.ts +10 -0
  49. package/dist/utils/file-ops.d.ts.map +1 -0
  50. package/dist/utils/file-ops.js +150 -0
  51. package/dist/utils/file-ops.js.map +1 -0
  52. package/dist/utils/load-execa.js +4 -0
  53. package/dist/utils/logger.d.ts +21 -0
  54. package/dist/utils/logger.d.ts.map +1 -0
  55. package/dist/utils/logger.js +94 -0
  56. package/dist/utils/logger.js.map +1 -0
  57. package/dist/utils/platform.d.ts +12 -0
  58. package/dist/utils/platform.d.ts.map +1 -0
  59. package/dist/utils/platform.js +103 -0
  60. package/dist/utils/platform.js.map +1 -0
  61. package/package.json +72 -0
  62. package/templates/docker-compose.hbs +31 -0
@@ -0,0 +1,113 @@
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.sanitizeConfigForShare = sanitizeConfigForShare;
37
+ exports.runShareExport = runShareExport;
38
+ exports.runShareImport = runShareImport;
39
+ const path = __importStar(require("path"));
40
+ const yaml = __importStar(require("js-yaml"));
41
+ const loader_1 = require("../core/config/loader");
42
+ const config_1 = require("../types/config");
43
+ const file_ops_1 = require("../utils/file-ops");
44
+ const logger_1 = require("../utils/logger");
45
+ function sanitizeConfigForShare(config) {
46
+ const out = {
47
+ ...config,
48
+ dependencies: config.dependencies?.map((d) => ({ ...d })) ?? [],
49
+ databases: config.databases?.map((db) => {
50
+ const { password, user, ...rest } = db;
51
+ const sanitized = { ...rest };
52
+ if (user)
53
+ sanitized.user = '${DB_USER}';
54
+ if (password !== undefined)
55
+ sanitized.password = '${DB_PASSWORD}';
56
+ return sanitized;
57
+ }) ?? [],
58
+ services: config.services?.map((s) => ({ ...s })) ?? [],
59
+ env: config.env && Object.keys(config.env).length > 0
60
+ ? Object.fromEntries(Object.keys(config.env).map((k) => [k, `\${${k}}`]))
61
+ : {},
62
+ health_checks: config.health_checks?.map((h) => {
63
+ const { connection_string, url, ...rest } = h;
64
+ const sanitized = { ...rest };
65
+ if (connection_string)
66
+ sanitized.connection_string = '${CONNECTION_STRING}';
67
+ if (url && (url.includes('://') && url.includes('@')))
68
+ sanitized.url = '${HEALTH_CHECK_URL}';
69
+ else if (url)
70
+ sanitized.url = url;
71
+ return sanitized;
72
+ }) ?? [],
73
+ };
74
+ return out;
75
+ }
76
+ async function runShareExport(options = {}) {
77
+ const projectRoot = await (0, loader_1.findProjectRoot)(process.cwd());
78
+ const config = await (0, loader_1.loadConfig)(projectRoot);
79
+ const sanitized = sanitizeConfigForShare(config);
80
+ const yamlContent = yaml.dump(sanitized, { lineWidth: -1 });
81
+ const outputFile = options.output ?? 'dev-env.shared.yml';
82
+ const outPath = path.isAbsolute(outputFile) ? outputFile : path.join(projectRoot, outputFile);
83
+ await (0, file_ops_1.writeFile)(outPath, yamlContent);
84
+ logger_1.logger.success(`Exported sanitized config to ${outputFile}`);
85
+ }
86
+ async function runShareImport(filePath, options = {}) {
87
+ if (!(await (0, file_ops_1.fileExists)(filePath))) {
88
+ throw new Error(`File not found: ${filePath}`);
89
+ }
90
+ const content = await (0, file_ops_1.readFile)(filePath);
91
+ let raw;
92
+ try {
93
+ raw = yaml.load(content);
94
+ }
95
+ catch (e) {
96
+ const msg = e instanceof Error ? e.message : String(e);
97
+ throw new Error(`Invalid YAML in ${filePath}: ${msg}`);
98
+ }
99
+ const parsed = config_1.DevEnvConfigSchema.safeParse(raw);
100
+ if (!parsed.success) {
101
+ const issues = parsed.error.issues
102
+ .map((i) => ` - ${i.path.join('.')}: ${i.message}`)
103
+ .join('\n');
104
+ throw new Error(`Invalid dev-env config in ${filePath}:\n${issues}`);
105
+ }
106
+ const projectRoot = await (0, loader_1.findProjectRoot)(process.cwd());
107
+ const outputFile = options.output ?? '.dev-env.yml';
108
+ const outPath = path.isAbsolute(outputFile) ? outputFile : path.join(projectRoot, outputFile);
109
+ const yamlContent = yaml.dump(parsed.data, { lineWidth: -1 });
110
+ await (0, file_ops_1.writeFile)(outPath, yamlContent);
111
+ logger_1.logger.success(`Imported config to ${outputFile}`);
112
+ }
113
+ //# sourceMappingURL=share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.js","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function runSnapshotCreate(name?: string): Promise<void>;
2
+ export declare function runSnapshotList(): Promise<void>;
3
+ export declare function runSnapshotRestore(name: string): Promise<void>;
4
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAMA,wBAAsB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAarD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpE"}
@@ -0,0 +1,75 @@
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.runSnapshotCreate = runSnapshotCreate;
37
+ exports.runSnapshotList = runSnapshotList;
38
+ exports.runSnapshotRestore = runSnapshotRestore;
39
+ const path = __importStar(require("path"));
40
+ const loader_1 = require("../core/config/loader");
41
+ const storage_1 = require("../core/snapshot/storage");
42
+ const file_ops_1 = require("../utils/file-ops");
43
+ const logger_1 = require("../utils/logger");
44
+ async function runSnapshotCreate(name) {
45
+ const projectRoot = await (0, loader_1.findProjectRoot)(process.cwd());
46
+ await (0, loader_1.loadConfig)(projectRoot);
47
+ const configPath = path.join(projectRoot, '.dev-env.yml');
48
+ const configYaml = await (0, file_ops_1.readFile)(configPath);
49
+ const snapshotName = name && name.trim() ? name.trim() : `snapshot-${new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)}`;
50
+ const meta = await (0, storage_1.createSnapshot)(projectRoot, snapshotName, configYaml);
51
+ logger_1.logger.success(`Snapshot "${meta.name}" created at ${meta.createdAt}`);
52
+ }
53
+ async function runSnapshotList() {
54
+ const projectRoot = await (0, loader_1.findProjectRoot)(process.cwd());
55
+ const snapshots = await (0, storage_1.listSnapshots)(projectRoot);
56
+ if (snapshots.length === 0) {
57
+ logger_1.logger.info('No snapshots found. Create one with: envkit snapshot create [name]');
58
+ return;
59
+ }
60
+ logger_1.logger.step(`Found ${snapshots.length} snapshot(s):`);
61
+ for (const s of snapshots) {
62
+ logger_1.logger.info(` ${s.name} (${s.createdAt})`);
63
+ }
64
+ }
65
+ async function runSnapshotRestore(name) {
66
+ if (!name || !name.trim()) {
67
+ throw new Error('Snapshot name is required. List snapshots with: envkit snapshot list');
68
+ }
69
+ const projectRoot = await (0, loader_1.findProjectRoot)(process.cwd());
70
+ const configYaml = await (0, storage_1.getSnapshotConfig)(projectRoot, name.trim());
71
+ const configPath = path.join(projectRoot, '.dev-env.yml');
72
+ await (0, file_ops_1.writeFile)(configPath, configYaml);
73
+ logger_1.logger.success(`Restored snapshot "${name.trim()}" to .dev-env.yml`);
74
+ }
75
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,8CAYC;AAED,0CAaC;AAED,gDAYC;AA/CD,2CAA6B;AAC7B,kDAAoE;AACpE,sDAA4F;AAC5F,gDAAwD;AACxD,4CAAyC;AAElC,KAAK,UAAU,iBAAiB,CAAC,IAAa;IACnD,MAAM,WAAW,GAAG,MAAM,IAAA,wBAAe,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,MAAM,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;IAE9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,IAAA,mBAAQ,EAAC,UAAU,CAAC,CAAC;IAE9C,MAAM,YAAY,GAChB,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAChH,MAAM,IAAI,GAAG,MAAM,IAAA,wBAAc,EAAC,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAEzE,eAAM,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AACzE,CAAC;AAEM,KAAK,UAAU,eAAe;IACnC,MAAM,WAAW,GAAG,MAAM,IAAA,wBAAe,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,IAAA,uBAAa,EAAC,WAAW,CAAC,CAAC;IAEnD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,eAAe,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,eAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,IAAA,wBAAe,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,IAAA,2BAAiB,EAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAErE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,IAAA,oBAAS,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAExC,eAAM,CAAC,OAAO,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { DevEnvConfig } from '../../types/config';
2
+ export declare function loadEnvFile(projectRoot: string): Promise<void>;
3
+ /**
4
+ * Resolve environment variable references in strings
5
+ * Supports ${VAR_NAME} syntax
6
+ */
7
+ export declare function resolveEnvVars(value: string, env?: Record<string, string>): string;
8
+ export declare function loadConfig(projectRoot?: string): Promise<DevEnvConfig>;
9
+ export declare function findProjectRoot(startPath?: string): Promise<string>;
10
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/config/loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AAGtE,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,MAAM,CAWtF;AAID,wBAAsB,UAAU,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2C3F;AAmBD,wBAAsB,eAAe,CAAC,SAAS,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBxF"}
@@ -0,0 +1,137 @@
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.loadEnvFile = loadEnvFile;
37
+ exports.resolveEnvVars = resolveEnvVars;
38
+ exports.loadConfig = loadConfig;
39
+ exports.findProjectRoot = findProjectRoot;
40
+ const yaml = __importStar(require("js-yaml"));
41
+ const path = __importStar(require("path"));
42
+ const dotenv = __importStar(require("dotenv"));
43
+ const file_ops_1 = require("../../utils/file-ops");
44
+ const logger_1 = require("../../utils/logger");
45
+ const config_1 = require("../../types/config");
46
+ const platform_1 = require("../../utils/platform");
47
+ async function loadEnvFile(projectRoot) {
48
+ const envPath = path.join(projectRoot, '.env');
49
+ if (await (0, file_ops_1.fileExists)(envPath)) {
50
+ dotenv.config({ path: envPath });
51
+ logger_1.logger.debug(`Loaded environment variables from ${envPath}`);
52
+ }
53
+ else {
54
+ logger_1.logger.debug(`No .env file found at ${envPath}`);
55
+ }
56
+ }
57
+ /**
58
+ * Resolve environment variable references in strings
59
+ * Supports ${VAR_NAME} syntax
60
+ */
61
+ function resolveEnvVars(value, env = {}) {
62
+ const mergedEnv = { ...process.env, ...env };
63
+ return value.replace(/\$\{([^}]+)\}/g, (match, varName) => {
64
+ const value = mergedEnv[varName];
65
+ if (value === undefined) {
66
+ logger_1.logger.warn(`Environment variable ${varName} is not set`);
67
+ return match;
68
+ }
69
+ return value;
70
+ });
71
+ }
72
+ //Load and parse .dev-env.yml configuration file
73
+ async function loadConfig(projectRoot = process.cwd()) {
74
+ const configPath = path.join(projectRoot, '.dev-env.yml');
75
+ if (!(await (0, file_ops_1.fileExists)(configPath))) {
76
+ throw new Error(`Configuration file not found: ${configPath}\n` +
77
+ `Please create a .dev-env.yml file in your project root.`);
78
+ }
79
+ try {
80
+ await loadEnvFile(projectRoot);
81
+ const content = await (0, file_ops_1.readFile)(configPath);
82
+ const rawConfig = yaml.load(content);
83
+ const resolvedConfig = resolveEnvVarsInConfig(rawConfig);
84
+ const config = config_1.DevEnvConfigSchema.parse(resolvedConfig);
85
+ logger_1.logger.debug(`Loaded configuration from ${configPath}`);
86
+ return config;
87
+ }
88
+ catch (error) {
89
+ if (error.name === 'ZodError') {
90
+ const issues = error.issues.map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`).join('\n');
91
+ throw new Error(`Invalid configuration file:\n${issues}\n` +
92
+ `Please check your .dev-env.yml file.`);
93
+ }
94
+ if (error.message.includes('YAMLException')) {
95
+ throw new Error(`Failed to parse YAML configuration: ${error.message}\n` +
96
+ `Please check the syntax of your .dev-env.yml file.`);
97
+ }
98
+ throw error;
99
+ }
100
+ }
101
+ function resolveEnvVarsInConfig(obj) {
102
+ if (typeof obj === 'string') {
103
+ return resolveEnvVars(obj);
104
+ }
105
+ else if (Array.isArray(obj)) {
106
+ return obj.map(item => resolveEnvVarsInConfig(item));
107
+ }
108
+ else if (obj !== null && typeof obj === 'object') {
109
+ const resolved = {};
110
+ for (const [key, value] of Object.entries(obj)) {
111
+ resolved[key] = resolveEnvVarsInConfig(value);
112
+ }
113
+ return resolved;
114
+ }
115
+ return obj;
116
+ }
117
+ //Find project root by looking for .dev-env.yml or other project markers
118
+ async function findProjectRoot(startPath = process.cwd()) {
119
+ let currentPath = (0, platform_1.resolvePath)(startPath);
120
+ const root = path.parse(currentPath).root;
121
+ while (currentPath !== root) {
122
+ const configPath = path.join(currentPath, '.dev-env.yml');
123
+ if (await (0, file_ops_1.fileExists)(configPath)) {
124
+ return currentPath;
125
+ }
126
+ const markers = ['package.json', 'requirements.txt', 'Cargo.toml', 'go.mod'];
127
+ for (const marker of markers) {
128
+ const markerPath = path.join(currentPath, marker);
129
+ if (await (0, file_ops_1.fileExists)(markerPath)) {
130
+ return currentPath;
131
+ }
132
+ }
133
+ currentPath = path.dirname(currentPath);
134
+ }
135
+ return process.cwd();
136
+ }
137
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { DevEnvConfig } from '../../types/config';
2
+ /**
3
+ * Validate configuration object
4
+ */
5
+ export declare function validateConfig(config: any): DevEnvConfig;
6
+ /**
7
+ * Check for common configuration issues and warn
8
+ */
9
+ export declare function checkConfigWarnings(config: DevEnvConfig): void;
10
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/core/config/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AAGtE;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,YAAY,CAcxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAyC9D"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateConfig = validateConfig;
4
+ exports.checkConfigWarnings = checkConfigWarnings;
5
+ const config_1 = require("../../types/config");
6
+ const logger_1 = require("../../utils/logger");
7
+ /**
8
+ * Validate configuration object
9
+ */
10
+ function validateConfig(config) {
11
+ try {
12
+ return config_1.DevEnvConfigSchema.parse(config);
13
+ }
14
+ catch (error) {
15
+ if (error.name === 'ZodError') {
16
+ const issues = error.issues.map((issue) => {
17
+ const path = issue.path.join('.');
18
+ return ` - ${path}: ${issue.message}`;
19
+ }).join('\n');
20
+ throw new Error(`Configuration validation failed:\n${issues}`);
21
+ }
22
+ throw error;
23
+ }
24
+ }
25
+ /**
26
+ * Check for common configuration issues and warn
27
+ */
28
+ function checkConfigWarnings(config) {
29
+ // Check for passwords in config (should be in .env)
30
+ const configStr = JSON.stringify(config);
31
+ if (configStr.includes('password') && !configStr.includes('${')) {
32
+ logger_1.logger.warn('Warning: Passwords detected in configuration file.\n' +
33
+ 'Consider using environment variables (${VAR_NAME}) and .env file for secrets.');
34
+ }
35
+ // Check for missing database credentials
36
+ config.databases?.forEach((db, index) => {
37
+ if (db.type === 'postgresql' || db.type === 'mysql' || db.type === 'mariadb') {
38
+ if (!db.user || !db.password) {
39
+ logger_1.logger.warn(`Database ${index + 1} (${db.type}) is missing user or password.\n` +
40
+ 'Make sure to set these via environment variables or .env file.');
41
+ }
42
+ }
43
+ });
44
+ // Check for port conflicts
45
+ const ports = new Set();
46
+ config.databases?.forEach(db => {
47
+ if (db.port) {
48
+ if (ports.has(db.port)) {
49
+ logger_1.logger.warn(`Port ${db.port} is used by multiple services. This may cause conflicts.`);
50
+ }
51
+ ports.add(db.port);
52
+ }
53
+ });
54
+ config.services?.forEach(service => {
55
+ if (service.port) {
56
+ if (ports.has(service.port)) {
57
+ logger_1.logger.warn(`Port ${service.port} is used by multiple services. This may cause conflicts.`);
58
+ }
59
+ ports.add(service.port);
60
+ }
61
+ });
62
+ }
63
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/core/config/validator.ts"],"names":[],"mappings":";;AAMA,wCAcC;AAKD,kDAyCC;AAlED,+CAAsE;AACtE,+CAA4C;AAE5C;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAW;IACxC,IAAI,CAAC;QACH,OAAO,2BAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE;gBAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClC,OAAO,OAAO,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,MAAoB;IACtD,oDAAoD;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,eAAM,CAAC,IAAI,CACT,sDAAsD;YACtD,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;QACtC,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7E,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAC7B,eAAM,CAAC,IAAI,CACT,YAAY,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,kCAAkC;oBACnE,gEAAgE,CACjE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE;QAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,0DAA0D,CAAC,CAAC;YACzF,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;QACjC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,eAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,IAAI,0DAA0D,CAAC,CAAC;YAC9F,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { DevEnvConfig } from '../../types/config';
2
+ export interface ComposeService {
3
+ name: string;
4
+ image: string;
5
+ version?: string;
6
+ ports: string[];
7
+ env: Record<string, string>;
8
+ }
9
+ export declare function generateComposeContent(config: DevEnvConfig, templatesDir: string): string;
10
+ //# sourceMappingURL=compose-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-generator.d.ts","sourceRoot":"","sources":["../../../src/core/docker/compose-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAsED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAiBzF"}
@@ -0,0 +1,133 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generateComposeContent = generateComposeContent;
40
+ const handlebars_1 = __importDefault(require("handlebars"));
41
+ const path = __importStar(require("path"));
42
+ const fs = __importStar(require("fs"));
43
+ const DB_IMAGES = {
44
+ postgresql: 'postgres',
45
+ mysql: 'mysql',
46
+ mariadb: 'mariadb',
47
+ mongodb: 'mongo',
48
+ redis: 'redis',
49
+ sqlite: '',
50
+ };
51
+ function databaseToComposeService(db, index) {
52
+ const image = DB_IMAGES[db.type];
53
+ if (!image)
54
+ return null;
55
+ const name = db.name ?? `${db.type}_${index + 1}`.replace(/-/g, '_');
56
+ const port = db.port ?? (db.type === 'postgresql' ? 5432 : db.type === 'redis' ? 6379 : db.type === 'mysql' || db.type === 'mariadb' ? 3306 : 27017);
57
+ const ports = [`${port}:${port}`];
58
+ const env = {};
59
+ if (db.type === 'postgresql') {
60
+ if (db.user)
61
+ env.POSTGRES_USER = db.user;
62
+ if (db.password)
63
+ env.POSTGRES_PASSWORD = db.password;
64
+ if (db.database)
65
+ env.POSTGRES_DB = db.database;
66
+ }
67
+ else if (db.type === 'mysql' || db.type === 'mariadb') {
68
+ if (db.password)
69
+ env.MYSQL_ROOT_PASSWORD = db.password;
70
+ if (db.database)
71
+ env.MYSQL_DATABASE = db.database;
72
+ if (db.user)
73
+ env.MYSQL_USER = db.user;
74
+ if (db.password && db.user)
75
+ env.MYSQL_PASSWORD = db.password;
76
+ }
77
+ else if (db.type === 'mongodb') {
78
+ if (db.user)
79
+ env.MONGO_INITDB_ROOT_USERNAME = db.user;
80
+ if (db.password)
81
+ env.MONGO_INITDB_ROOT_PASSWORD = db.password;
82
+ if (db.database)
83
+ env.MONGO_INITDB_DATABASE = db.database;
84
+ }
85
+ return {
86
+ name,
87
+ image,
88
+ version: db.version,
89
+ ports,
90
+ env,
91
+ };
92
+ }
93
+ function serviceToComposeService(svc, index) {
94
+ const name = `${svc.type}_${index + 1}`.replace(/-/g, '_');
95
+ const ports = [];
96
+ if (svc.port)
97
+ ports.push(`${svc.port}:${svc.port}`);
98
+ if (svc.management_port)
99
+ ports.push(`${svc.management_port}:${svc.management_port}`);
100
+ return {
101
+ name,
102
+ image: svc.type,
103
+ version: svc.version,
104
+ ports,
105
+ env: {},
106
+ };
107
+ }
108
+ function loadComposeTemplate(templatesDir) {
109
+ const templatePath = path.join(templatesDir, 'docker-compose.hbs');
110
+ try {
111
+ return fs.readFileSync(templatePath, 'utf-8');
112
+ }
113
+ catch (err) {
114
+ const msg = err instanceof Error ? err.message : String(err);
115
+ throw new Error(`Docker Compose template not found at ${templatePath}. ${msg}`);
116
+ }
117
+ }
118
+ function generateComposeContent(config, templatesDir) {
119
+ const services = [];
120
+ config.databases?.forEach((db, i) => {
121
+ const s = databaseToComposeService(db, i);
122
+ if (s)
123
+ services.push(s);
124
+ });
125
+ config.services?.forEach((svc, i) => {
126
+ services.push(serviceToComposeService(svc, i));
127
+ });
128
+ const networkName = config.docker?.network_name ?? 'dev-network';
129
+ const template = loadComposeTemplate(templatesDir);
130
+ const compiled = handlebars_1.default.compile(template);
131
+ return compiled({ services, networkName });
132
+ }
133
+ //# sourceMappingURL=compose-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-generator.js","sourceRoot":"","sources":["../../../src/core/docker/compose-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const SNAPSHOT_DIR_NAME = ".devkit";
2
+ export declare const SNAPSHOTS_SUBDIR = "snapshots";
3
+ export declare const SNAPSHOT_CONFIG_FILENAME = "dev-env.yml";
4
+ export interface SnapshotMeta {
5
+ name: string;
6
+ createdAt: string;
7
+ }
8
+ export declare function sanitizeSnapshotName(name: string): string;
9
+ export declare function getSnapshotDir(projectRoot: string): string;
10
+ export declare function createSnapshot(projectRoot: string, name: string, configYaml: string): Promise<SnapshotMeta>;
11
+ export declare function listSnapshots(projectRoot: string): Promise<SnapshotMeta[]>;
12
+ export declare function getSnapshotConfig(projectRoot: string, name: string): Promise<string>;
13
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/core/snapshot/storage.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAC5C,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,CAavB;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwBhF;AAGD,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY1F"}