@pulumix/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/dev/env-builder.d.ts +9 -0
  2. package/dist/dev/env-builder.d.ts.map +1 -0
  3. package/dist/dev/env-builder.js +67 -0
  4. package/dist/dev/env-builder.js.map +1 -0
  5. package/dist/dev/index.d.ts +20 -0
  6. package/dist/dev/index.d.ts.map +1 -0
  7. package/dist/dev/index.js +272 -0
  8. package/dist/dev/index.js.map +1 -0
  9. package/dist/dev/local-runner.d.ts +13 -0
  10. package/dist/dev/local-runner.d.ts.map +1 -0
  11. package/dist/dev/local-runner.js +100 -0
  12. package/dist/dev/local-runner.js.map +1 -0
  13. package/dist/dev/port-forward.d.ts +10 -0
  14. package/dist/dev/port-forward.d.ts.map +1 -0
  15. package/dist/dev/port-forward.js +146 -0
  16. package/dist/dev/port-forward.js.map +1 -0
  17. package/dist/dev/service-swap.d.ts +27 -0
  18. package/dist/dev/service-swap.d.ts.map +1 -0
  19. package/dist/dev/service-swap.js +272 -0
  20. package/dist/dev/service-swap.js.map +1 -0
  21. package/dist/dev/types.d.ts +60 -0
  22. package/dist/dev/types.d.ts.map +1 -0
  23. package/dist/dev/types.js +28 -0
  24. package/dist/dev/types.js.map +1 -0
  25. package/dist/docker.d.ts +55 -0
  26. package/dist/docker.d.ts.map +1 -0
  27. package/dist/docker.js +331 -0
  28. package/dist/docker.js.map +1 -0
  29. package/dist/index.d.ts +12 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +29 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/orchestrator/events.d.ts +28 -0
  34. package/dist/orchestrator/events.d.ts.map +1 -0
  35. package/dist/orchestrator/events.js +142 -0
  36. package/dist/orchestrator/events.js.map +1 -0
  37. package/dist/orchestrator/index.d.ts +32 -0
  38. package/dist/orchestrator/index.d.ts.map +1 -0
  39. package/dist/orchestrator/index.js +722 -0
  40. package/dist/orchestrator/index.js.map +1 -0
  41. package/dist/types/errors.d.ts +76 -0
  42. package/dist/types/errors.d.ts.map +1 -0
  43. package/dist/types/errors.js +271 -0
  44. package/dist/types/errors.js.map +1 -0
  45. package/dist/types/events.d.ts +100 -0
  46. package/dist/types/events.d.ts.map +1 -0
  47. package/dist/types/events.js +40 -0
  48. package/dist/types/events.js.map +1 -0
  49. package/dist/types/manifest.d.ts +121 -0
  50. package/dist/types/manifest.d.ts.map +1 -0
  51. package/dist/types/manifest.js +3 -0
  52. package/dist/types/manifest.js.map +1 -0
  53. package/dist/types/service.d.ts +35 -0
  54. package/dist/types/service.d.ts.map +1 -0
  55. package/dist/types/service.js +3 -0
  56. package/dist/types/service.js.map +1 -0
  57. package/dist/utils/kubernetes.d.ts +10 -0
  58. package/dist/utils/kubernetes.d.ts.map +1 -0
  59. package/dist/utils/kubernetes.js +38 -0
  60. package/dist/utils/kubernetes.js.map +1 -0
  61. package/dist/validation/manifest.d.ts +5 -0
  62. package/dist/validation/manifest.d.ts.map +1 -0
  63. package/dist/validation/manifest.js +114 -0
  64. package/dist/validation/manifest.js.map +1 -0
  65. package/package.json +49 -0
  66. package/src/schemas/service-manifest.schema.json +267 -0
@@ -0,0 +1,9 @@
1
+ import { DevConfig, LocalDevService, PortForwardMapping } from './types';
2
+ export declare function serviceToEnvVar(serviceName: string): string;
3
+ export declare function getServiceProtocol(serviceName: string): string;
4
+ export declare function isDatabaseService(serviceName: string): boolean;
5
+ export declare function buildPortForwardUrl(mapping: PortForwardMapping): string;
6
+ export declare function buildLocalServiceUrl(localService: LocalDevService): string;
7
+ export declare function buildDevEnvironment(targetService: LocalDevService, allLocalServices: LocalDevService[], portForwards: PortForwardMapping[], devConfig: DevConfig): Record<string, string>;
8
+ export declare function buildAllDevEnvironments(localServices: LocalDevService[], portForwards: PortForwardMapping[]): Map<string, Record<string, string>>;
9
+ //# sourceMappingURL=env-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-builder.d.ts","sourceRoot":"","sources":["../../src/dev/env-builder.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,SAAS,EACT,eAAe,EACf,kBAAkB,EAGnB,MAAM,SAAS,CAAA;AAUhB,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK3D;AAOD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAY9D;AAKD,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG9D;AAKD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CASvE;AAKD,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,eAAe,GAAG,MAAM,CAE1E;AASD,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,eAAe,EAC9B,gBAAgB,EAAE,eAAe,EAAE,EACnC,YAAY,EAAE,kBAAkB,EAAE,EAClC,SAAS,EAAE,SAAS,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BxB;AAOD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,eAAe,EAAE,EAChC,YAAY,EAAE,kBAAkB,EAAE,GACjC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAcrC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serviceToEnvVar = serviceToEnvVar;
4
+ exports.getServiceProtocol = getServiceProtocol;
5
+ exports.isDatabaseService = isDatabaseService;
6
+ exports.buildPortForwardUrl = buildPortForwardUrl;
7
+ exports.buildLocalServiceUrl = buildLocalServiceUrl;
8
+ exports.buildDevEnvironment = buildDevEnvironment;
9
+ exports.buildAllDevEnvironments = buildAllDevEnvironments;
10
+ const types_1 = require("./types");
11
+ function serviceToEnvVar(serviceName) {
12
+ return serviceName
13
+ .toUpperCase()
14
+ .replace(/-/g, '_')
15
+ + '_URL';
16
+ }
17
+ function getServiceProtocol(serviceName) {
18
+ const lowerName = serviceName.toLowerCase();
19
+ for (const [key, protocol] of Object.entries(types_1.PROTOCOL_PREFIXES)) {
20
+ if (lowerName.includes(key)) {
21
+ return protocol;
22
+ }
23
+ }
24
+ return 'http';
25
+ }
26
+ function isDatabaseService(serviceName) {
27
+ const lowerName = serviceName.toLowerCase();
28
+ return Object.keys(types_1.STANDARD_PORTS).some(key => lowerName.includes(key));
29
+ }
30
+ function buildPortForwardUrl(mapping) {
31
+ const protocol = mapping.protocol || getServiceProtocol(mapping.serviceName);
32
+ if (['postgres', 'postgresql', 'mysql', 'redis', 'mongodb', 'mongo'].includes(protocol)) {
33
+ return `${protocol}://localhost:${mapping.localPort}`;
34
+ }
35
+ return `${protocol}://localhost:${mapping.localPort}`;
36
+ }
37
+ function buildLocalServiceUrl(localService) {
38
+ return `http://localhost:${localService.localPort}`;
39
+ }
40
+ function buildDevEnvironment(targetService, allLocalServices, portForwards, devConfig) {
41
+ const env = {};
42
+ for (const localService of allLocalServices) {
43
+ if (localService.service.name === targetService.service.name) {
44
+ continue;
45
+ }
46
+ const envVar = serviceToEnvVar(localService.service.name);
47
+ env[envVar] = buildLocalServiceUrl(localService);
48
+ }
49
+ for (const mapping of portForwards) {
50
+ const envVar = mapping.envVar || serviceToEnvVar(mapping.serviceName);
51
+ env[envVar] = buildPortForwardUrl(mapping);
52
+ }
53
+ if (devConfig.env) {
54
+ Object.assign(env, devConfig.env);
55
+ }
56
+ env.NODE_ENV = 'development';
57
+ return env;
58
+ }
59
+ function buildAllDevEnvironments(localServices, portForwards) {
60
+ const envMap = new Map();
61
+ for (const localService of localServices) {
62
+ const env = buildDevEnvironment(localService, localServices, portForwards, localService.devConfig);
63
+ envMap.set(localService.service.name, env);
64
+ }
65
+ return envMap;
66
+ }
67
+ //# sourceMappingURL=env-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-builder.js","sourceRoot":"","sources":["../../src/dev/env-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { EitherAsync } from 'purify-ts/EitherAsync';
2
+ import { DeployError } from '../types/errors';
3
+ import { OrchestratorEventEmitter } from '../orchestrator/events';
4
+ import { DevOrchestratorConfig, DevOrchestratorResult } from './types';
5
+ export * from './types';
6
+ export * from './port-forward';
7
+ export * from './local-runner';
8
+ export * from './env-builder';
9
+ export * from './service-swap';
10
+ export declare class DevOrchestrator {
11
+ private readonly eventEmitter;
12
+ private portForwardHandles;
13
+ private devServerHandles;
14
+ private serviceSwapHandles;
15
+ private stopped;
16
+ constructor(eventEmitter?: OrchestratorEventEmitter);
17
+ dev(config: DevOrchestratorConfig): EitherAsync<DeployError, DevOrchestratorResult>;
18
+ stop(): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAGL,WAAW,EACZ,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,wBAAwB,EAAsB,MAAM,wBAAwB,CAAA;AACrF,OAAO,EAEL,qBAAqB,EACrB,qBAAqB,EAStB,MAAM,SAAS,CAAA;AAUhB,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AA4G9B,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,OAAO,CAAQ;gBAEX,YAAY,CAAC,EAAE,wBAAwB;IAOnD,GAAG,CAAC,MAAM,EAAE,qBAAqB,GAAG,WAAW,CAAC,WAAW,EAAE,qBAAqB,CAAC;IA0L7E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB5B"}
@@ -0,0 +1,272 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
36
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.DevOrchestrator = void 0;
40
+ const EitherAsync_1 = require("purify-ts/EitherAsync");
41
+ const fs = __importStar(require("fs"));
42
+ const yaml = __importStar(require("yaml"));
43
+ const errors_1 = require("../types/errors");
44
+ const orchestrator_1 = require("../orchestrator");
45
+ const events_1 = require("../orchestrator/events");
46
+ const types_1 = require("./types");
47
+ const port_forward_1 = require("./port-forward");
48
+ const local_runner_1 = require("./local-runner");
49
+ const env_builder_1 = require("./env-builder");
50
+ const service_swap_1 = require("./service-swap");
51
+ __exportStar(require("./types"), exports);
52
+ __exportStar(require("./port-forward"), exports);
53
+ __exportStar(require("./local-runner"), exports);
54
+ __exportStar(require("./env-builder"), exports);
55
+ __exportStar(require("./service-swap"), exports);
56
+ function getDevConfig(service) {
57
+ const dev = service.rawConfig.dev;
58
+ if (!dev)
59
+ return undefined;
60
+ return {
61
+ command: dev.command || 'npm run dev',
62
+ port: dev.port || 3000,
63
+ env: dev.env,
64
+ cwd: dev.cwd,
65
+ };
66
+ }
67
+ function computeTransitiveDependencies(services, targetNames) {
68
+ const serviceMap = new Map(services.map(s => [s.name, s]));
69
+ const deps = new Set();
70
+ const visit = (name) => {
71
+ const service = serviceMap.get(name);
72
+ if (!service)
73
+ return;
74
+ for (const dep of service.dependencies) {
75
+ if (!deps.has(dep)) {
76
+ deps.add(dep);
77
+ visit(dep);
78
+ }
79
+ }
80
+ };
81
+ for (const name of targetNames) {
82
+ visit(name);
83
+ }
84
+ return deps;
85
+ }
86
+ function hasRunningPods(service) {
87
+ const observability = service.rawConfig.observability;
88
+ return observability?.health !== undefined;
89
+ }
90
+ function computePortForwardMappings(clusterServices, namespace) {
91
+ const mappings = [];
92
+ let httpPortCounter = types_1.HTTP_PORT_BASE;
93
+ for (const service of clusterServices) {
94
+ if (!hasRunningPods(service)) {
95
+ continue;
96
+ }
97
+ const serviceName = service.name.toLowerCase();
98
+ const protocol = (0, env_builder_1.getServiceProtocol)(serviceName);
99
+ if ((0, env_builder_1.isDatabaseService)(serviceName)) {
100
+ const standardPort = Object.entries(types_1.STANDARD_PORTS).find(([key]) => serviceName.includes(key))?.[1] ?? 80;
101
+ mappings.push({
102
+ serviceName: service.name,
103
+ namespace,
104
+ remotePort: standardPort,
105
+ localPort: standardPort,
106
+ envVar: `${service.name.toUpperCase().replace(/-/g, '_')}_URL`,
107
+ protocol,
108
+ });
109
+ }
110
+ else {
111
+ mappings.push({
112
+ serviceName: service.name,
113
+ namespace,
114
+ remotePort: 80,
115
+ localPort: httpPortCounter++,
116
+ envVar: `${service.name.toUpperCase().replace(/-/g, '_')}_URL`,
117
+ protocol: 'http',
118
+ });
119
+ }
120
+ }
121
+ return mappings;
122
+ }
123
+ class DevOrchestrator {
124
+ eventEmitter;
125
+ portForwardHandles = [];
126
+ devServerHandles = [];
127
+ serviceSwapHandles = [];
128
+ stopped = false;
129
+ constructor(eventEmitter) {
130
+ this.eventEmitter = eventEmitter ?? (0, events_1.createEventEmitter)();
131
+ }
132
+ dev(config) {
133
+ return (0, EitherAsync_1.EitherAsync)(async ({ liftEither, throwE }) => {
134
+ const { rootPath, stackName, devServices: devServiceNames, onOutput } = config;
135
+ await liftEither(await (0, port_forward_1.checkKubectl)());
136
+ const staleState = (0, service_swap_1.loadDevState)(rootPath);
137
+ if (staleState) {
138
+ this.eventEmitter.emitLog('info', 'Cleaning up from previous dev session...');
139
+ await (0, service_swap_1.restoreFromStaleState)(rootPath);
140
+ }
141
+ this.eventEmitter.emitPhaseStart('discovery');
142
+ const allServices = await liftEither(await (0, orchestrator_1.discoverServices)(rootPath));
143
+ this.eventEmitter.emitPhaseComplete('discovery');
144
+ const serviceMap = new Map(allServices.map(s => [s.name, s]));
145
+ const devServices = [];
146
+ for (const name of devServiceNames) {
147
+ const service = serviceMap.get(name);
148
+ if (!service) {
149
+ return throwE((0, errors_1.createDiscoveryError)('RootConfigNotFound', `Service '${name}' not found. Available services: ${allServices.map(s => s.name).join(', ')}`, rootPath));
150
+ }
151
+ devServices.push(service);
152
+ }
153
+ const localServices = [];
154
+ let devPortCounter = types_1.DEV_SERVER_PORT_BASE;
155
+ for (const service of devServices) {
156
+ const devConfig = getDevConfig(service);
157
+ if (!devConfig) {
158
+ return throwE((0, errors_1.createConfigError)('MissingRequiredField', `Service '${service.name}' is missing 'dev' config in pulumix.yaml. Add:\n\ndev:\n command: npm run dev\n port: 3000`, stackName, 'dev'));
159
+ }
160
+ localServices.push({
161
+ service,
162
+ devConfig,
163
+ localPort: devConfig.port || devPortCounter++,
164
+ });
165
+ }
166
+ const devServiceNamesSet = new Set(devServiceNames);
167
+ const transitiveDeps = computeTransitiveDependencies(allServices, devServiceNames);
168
+ const clusterServiceNames = [...transitiveDeps].filter(name => !devServiceNamesSet.has(name));
169
+ const clusterServices = clusterServiceNames
170
+ .map(name => serviceMap.get(name))
171
+ .filter((s) => s !== undefined);
172
+ const rootConfigPath = `${rootPath}/pulumix.yaml`;
173
+ let namespace = stackName;
174
+ let baseDomain;
175
+ try {
176
+ const rootConfigContent = fs.readFileSync(rootConfigPath, 'utf-8');
177
+ const rootConfig = yaml.parse(rootConfigContent);
178
+ const stacks = rootConfig.stacks;
179
+ if (stacks?.[stackName]?.namespace) {
180
+ namespace = stacks[stackName].namespace;
181
+ }
182
+ if (stacks?.[stackName]?.baseDomain) {
183
+ baseDomain = stacks[stackName].baseDomain;
184
+ }
185
+ }
186
+ catch {
187
+ }
188
+ if (!baseDomain && localServices.length > 0) {
189
+ const firstService = localServices[0].service;
190
+ const stacks = firstService.rawConfig.stacks;
191
+ const stackConfig = stacks?.[stackName];
192
+ if (stackConfig?.baseDomain) {
193
+ baseDomain = stackConfig.baseDomain;
194
+ }
195
+ }
196
+ if (clusterServices.length > 0) {
197
+ this.eventEmitter.emitLog('info', `Cluster services (should already be deployed): ${clusterServiceNames.join(', ')}`);
198
+ this.eventEmitter.emitLog('info', `Run 'pulumix deploy ${stackName}' first if not already deployed`);
199
+ }
200
+ const portForwardMappings = computePortForwardMappings(clusterServices, namespace);
201
+ if (portForwardMappings.length > 0) {
202
+ this.eventEmitter.emitTaskStart('port-forward', 'Setting up port-forwards...');
203
+ const pfResult = await (0, port_forward_1.startPortForwards)(portForwardMappings);
204
+ if (pfResult.isLeft()) {
205
+ this.eventEmitter.emitTaskComplete('port-forward', false);
206
+ return throwE(pfResult.extract());
207
+ }
208
+ this.portForwardHandles = pfResult.extract();
209
+ this.eventEmitter.emitTaskComplete('port-forward', true);
210
+ }
211
+ const envs = (0, env_builder_1.buildAllDevEnvironments)(localServices, portForwardMappings);
212
+ const devServerNames = localServices.map(s => s.service.name).join(', ');
213
+ this.eventEmitter.emitTaskStart('dev-server', `Starting ${devServerNames}...`);
214
+ this.devServerHandles = (0, local_runner_1.runDevServers)(localServices, envs, (serviceName, line) => {
215
+ if (onOutput) {
216
+ onOutput(`[${serviceName}] ${line}`);
217
+ }
218
+ });
219
+ this.eventEmitter.emitTaskComplete('dev-server', true);
220
+ const ingressUrls = [];
221
+ if (baseDomain) {
222
+ for (const localService of localServices) {
223
+ if (!hasRunningPods(localService.service)) {
224
+ continue;
225
+ }
226
+ const taskId = `swap-${localService.service.name}`;
227
+ this.eventEmitter.emitTaskStart(taskId, `Swapping ${localService.service.name} to local...`);
228
+ const swapResult = await (0, service_swap_1.swapServiceToLocal)(localService.service.name, namespace, localService.localPort, rootPath);
229
+ if (swapResult.isLeft()) {
230
+ this.eventEmitter.emitTaskComplete(taskId, false, true);
231
+ }
232
+ else {
233
+ this.serviceSwapHandles.push(swapResult.extract());
234
+ const ingressUrl = `http://${localService.service.name}.${baseDomain}`;
235
+ ingressUrls.push(ingressUrl);
236
+ this.eventEmitter.emitTaskComplete(taskId, true);
237
+ }
238
+ }
239
+ }
240
+ return {
241
+ success: true,
242
+ stack: stackName,
243
+ namespace,
244
+ baseDomain,
245
+ devServices: localServices,
246
+ portForwards: portForwardMappings,
247
+ devServerHandles: this.devServerHandles,
248
+ portForwardHandles: this.portForwardHandles,
249
+ serviceSwapHandles: this.serviceSwapHandles,
250
+ ingressUrls,
251
+ };
252
+ });
253
+ }
254
+ async stop() {
255
+ if (this.stopped)
256
+ return;
257
+ this.stopped = true;
258
+ (0, local_runner_1.stopDevServers)(this.devServerHandles);
259
+ for (const handle of this.serviceSwapHandles) {
260
+ try {
261
+ await handle.restore();
262
+ }
263
+ catch (err) {
264
+ console.error(`Failed to restore ${handle.serviceName}:`, err);
265
+ }
266
+ }
267
+ (0, port_forward_1.stopPortForwards)(this.portForwardHandles);
268
+ await new Promise(resolve => setTimeout(resolve, 500));
269
+ }
270
+ }
271
+ exports.DevOrchestrator = DevOrchestrator;
272
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { DevServerHandle, LocalDevService } from './types';
2
+ export declare function parseDevCommand(command: string): {
3
+ cmd: string;
4
+ args: string[];
5
+ };
6
+ export declare function runDevServer(localService: LocalDevService, env: Record<string, string>, onOutput: (serviceName: string, line: string) => void): DevServerHandle;
7
+ export declare function runDevServers(localServices: LocalDevService[], envs: Map<string, Record<string, string>>, onOutput: (serviceName: string, line: string) => void): DevServerHandle[];
8
+ export declare function stopDevServers(handles: DevServerHandle[]): void;
9
+ export declare function waitForAnyExit(handles: DevServerHandle[]): Promise<{
10
+ handle: DevServerHandle;
11
+ exitCode: number;
12
+ }>;
13
+ //# sourceMappingURL=local-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runner.d.ts","sourceRoot":"","sources":["../../src/dev/local-runner.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAU1D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAMhF;AAKD,wBAAgB,YAAY,CAC1B,YAAY,EAAE,eAAe,EAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GACpD,eAAe,CAwEjB;AAKD,wBAAgB,aAAa,CAC3B,aAAa,EAAE,eAAe,EAAE,EAChC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACzC,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GACpD,eAAe,EAAE,CAUnB;AAKD,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAQ/D;AAMD,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,EAAE,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAOxD"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseDevCommand = parseDevCommand;
7
+ exports.runDevServer = runDevServer;
8
+ exports.runDevServers = runDevServers;
9
+ exports.stopDevServers = stopDevServers;
10
+ exports.waitForAnyExit = waitForAnyExit;
11
+ const child_process_1 = require("child_process");
12
+ const path_1 = __importDefault(require("path"));
13
+ function parseDevCommand(command) {
14
+ const parts = command.trim().split(/\s+/);
15
+ const cmd = parts[0] ?? 'npm';
16
+ const args = parts.slice(1);
17
+ return { cmd, args };
18
+ }
19
+ function runDevServer(localService, env, onOutput) {
20
+ const { service, devConfig, localPort } = localService;
21
+ const { cmd, args } = parseDevCommand(devConfig.command);
22
+ const cwd = devConfig.cwd
23
+ ? path_1.default.resolve(service.path, devConfig.cwd)
24
+ : service.path;
25
+ const processEnv = {
26
+ ...process.env,
27
+ ...env,
28
+ ...devConfig.env,
29
+ PORT: String(localPort),
30
+ };
31
+ const proc = (0, child_process_1.spawn)(cmd, args, {
32
+ cwd,
33
+ env: processEnv,
34
+ stdio: ['inherit', 'pipe', 'pipe'],
35
+ shell: true,
36
+ });
37
+ proc.stdout?.on('data', (data) => {
38
+ const lines = data.toString().split('\n');
39
+ for (const line of lines) {
40
+ if (line.trim()) {
41
+ onOutput(service.name, line);
42
+ }
43
+ }
44
+ });
45
+ proc.stderr?.on('data', (data) => {
46
+ const lines = data.toString().split('\n');
47
+ for (const line of lines) {
48
+ if (line.trim()) {
49
+ onOutput(service.name, line);
50
+ }
51
+ }
52
+ });
53
+ const exited = new Promise((resolve) => {
54
+ proc.on('close', (code) => {
55
+ resolve(code ?? 1);
56
+ });
57
+ proc.on('error', () => {
58
+ resolve(1);
59
+ });
60
+ });
61
+ return {
62
+ kill: () => {
63
+ proc.kill('SIGTERM');
64
+ setTimeout(() => {
65
+ if (!proc.killed) {
66
+ proc.kill('SIGKILL');
67
+ }
68
+ }, 5000);
69
+ },
70
+ exited,
71
+ serviceName: service.name,
72
+ port: localPort,
73
+ };
74
+ }
75
+ function runDevServers(localServices, envs, onOutput) {
76
+ const handles = [];
77
+ for (const localService of localServices) {
78
+ const env = envs.get(localService.service.name) ?? {};
79
+ const handle = runDevServer(localService, env, onOutput);
80
+ handles.push(handle);
81
+ }
82
+ return handles;
83
+ }
84
+ function stopDevServers(handles) {
85
+ for (const handle of handles) {
86
+ try {
87
+ handle.kill();
88
+ }
89
+ catch {
90
+ }
91
+ }
92
+ }
93
+ async function waitForAnyExit(handles) {
94
+ const results = handles.map(async (handle) => ({
95
+ handle,
96
+ exitCode: await handle.exited
97
+ }));
98
+ return Promise.race(results);
99
+ }
100
+ //# sourceMappingURL=local-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runner.js","sourceRoot":"","sources":["../../src/dev/local-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { DeployError } from '../types/errors';
2
+ import { Either } from 'purify-ts/Either';
3
+ import { PortForwardMapping, PortForwardHandle } from './types';
4
+ export declare function checkKubectl(): Promise<Either<DeployError, true>>;
5
+ export declare function checkPortAvailable(port: number): Promise<boolean>;
6
+ export declare function waitForPort(port: number, timeoutMs?: number): Promise<boolean>;
7
+ export declare function startPortForward(mapping: PortForwardMapping, kubeContext?: string): Promise<Either<DeployError, PortForwardHandle>>;
8
+ export declare function startPortForwards(mappings: PortForwardMapping[], kubeContext?: string): Promise<Either<DeployError, PortForwardHandle[]>>;
9
+ export declare function stopPortForwards(handles: PortForwardHandle[]): void;
10
+ //# sourceMappingURL=port-forward.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-forward.d.ts","sourceRoot":"","sources":["../../src/dev/port-forward.ts"],"names":[],"mappings":"AAQA,OAAO,EAAyB,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,EAAE,MAAM,EAAe,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAK/D,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CA4BvE;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBjE;AAKD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,OAAO,CAAC,CAqClB;AAKD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,kBAAkB,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CA+EjD;AAKD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAgBnD;AAKD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAQnE"}