composable.env 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.
@@ -0,0 +1,564 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as ini from 'ini';
4
+ import * as yaml from 'yaml';
5
+ import { ContractManager } from './contracts.js';
6
+ export class EnvironmentBuilder {
7
+ constructor(configDir, outputPath, envName) {
8
+ this.envName = envName;
9
+ this.configDir = configDir;
10
+ this.outputPath = outputPath;
11
+ this.contracts = new ContractManager(configDir);
12
+ }
13
+ async initialize() {
14
+ await this.contracts.initialize();
15
+ }
16
+ /**
17
+ * Build environment from a named profile.
18
+ *
19
+ * Convention:
20
+ * - default.json lists ALL component names
21
+ * - Profile JSON files are optional (only needed for explicit overrides)
22
+ * - Profiles can extend other profiles via "extends"
23
+ * - For each component: [default] section + profile-named section(s) layer on top
24
+ */
25
+ async buildFromProfile(profileName) {
26
+ try {
27
+ await this.initialize();
28
+ const defaultPath = path.join(this.configDir, 'env', 'profiles', 'default.json');
29
+ if (!fs.existsSync(defaultPath)) {
30
+ return {
31
+ success: false,
32
+ envPath: this.outputPath,
33
+ errors: ['default.json not found — required to list all components'],
34
+ };
35
+ }
36
+ const defaultData = JSON.parse(fs.readFileSync(defaultPath, 'utf8'));
37
+ const allComponents = defaultData.components || [];
38
+ let profileOverrides = {};
39
+ let profileData;
40
+ let inheritanceChain = [profileName];
41
+ if (profileName === 'default') {
42
+ profileData = {
43
+ name: defaultData.name || 'Default',
44
+ description: defaultData.description || 'Default environment',
45
+ components: {},
46
+ };
47
+ inheritanceChain = [];
48
+ }
49
+ else {
50
+ const profilePath = path.join(this.configDir, 'env', 'profiles', `${profileName}.json`);
51
+ if (fs.existsSync(profilePath)) {
52
+ const loaded = this.loadProfileWithInheritance(profileName);
53
+ profileOverrides = loaded.profileOverrides;
54
+ profileData = loaded.profileData;
55
+ inheritanceChain = loaded.inheritanceChain;
56
+ }
57
+ else {
58
+ profileData = {
59
+ name: profileName,
60
+ description: `Auto-generated from [${profileName}] sections`,
61
+ components: {},
62
+ };
63
+ inheritanceChain = [profileName];
64
+ }
65
+ }
66
+ // Build merged components: [default] + inheritance chain sections per component
67
+ const mergedComponents = {};
68
+ for (const component of allComponents) {
69
+ const sections = ['default'];
70
+ if (profileOverrides[component]) {
71
+ const override = profileOverrides[component];
72
+ Array.isArray(override) ? sections.push(...override) : sections.push(override);
73
+ }
74
+ else if (inheritanceChain.length > 0) {
75
+ sections.push(...inheritanceChain);
76
+ }
77
+ for (const chainProfile of inheritanceChain) {
78
+ if (!sections.includes(chainProfile))
79
+ sections.push(chainProfile);
80
+ }
81
+ mergedComponents[component] = sections;
82
+ }
83
+ profileData.components = mergedComponents;
84
+ return this.buildServiceEnvironments(profileData, profileName);
85
+ }
86
+ catch (error) {
87
+ return {
88
+ success: false,
89
+ envPath: this.outputPath,
90
+ errors: [`Failed to load profile: ${error}`],
91
+ };
92
+ }
93
+ }
94
+ /**
95
+ * Build environment from an explicit component map.
96
+ * Writes a single .env file to outputPath.
97
+ */
98
+ async buildFromComponents(components, profile) {
99
+ try {
100
+ const envVars = {};
101
+ const warnings = [];
102
+ for (const [component, environments] of Object.entries(components)) {
103
+ if (!environments)
104
+ continue;
105
+ const componentPath = path.join(this.configDir, 'env', 'components', `${component}.env`);
106
+ if (!fs.existsSync(componentPath)) {
107
+ return {
108
+ success: false,
109
+ envPath: this.outputPath,
110
+ errors: [`Component file not found: ${component}.env`],
111
+ };
112
+ }
113
+ const envList = Array.isArray(environments) ? environments : [environments];
114
+ for (const environment of envList) {
115
+ const componentConfig = this.loadComponentConfig(componentPath, environment);
116
+ if (!componentConfig) {
117
+ return {
118
+ success: false,
119
+ envPath: this.outputPath,
120
+ errors: [`Section '${environment}' not found in ${component}.env`],
121
+ };
122
+ }
123
+ Object.assign(envVars, componentConfig);
124
+ }
125
+ }
126
+ this.loadSharedFiles(envVars);
127
+ const resolvedVars = this.resolveVariables(envVars);
128
+ // Write single .env file
129
+ const lines = Object.entries(resolvedVars).map(([k, v]) => `${k}=${this.formatEnvValue(v)}`);
130
+ await fs.promises.writeFile(this.outputPath, lines.join('\n') + '\n', 'utf8');
131
+ if (profile && this.contracts.getContracts().size > 0) {
132
+ const validation = this.validateAllContracts(resolvedVars);
133
+ warnings.push(...validation.warnings);
134
+ if (!validation.valid) {
135
+ return {
136
+ success: false,
137
+ envPath: this.outputPath,
138
+ errors: validation.errors,
139
+ warnings: warnings.length > 0 ? warnings : undefined,
140
+ };
141
+ }
142
+ }
143
+ return {
144
+ success: true,
145
+ envPath: this.outputPath,
146
+ profile,
147
+ warnings: warnings.length > 0 ? warnings : undefined,
148
+ };
149
+ }
150
+ catch (error) {
151
+ return {
152
+ success: false,
153
+ envPath: this.outputPath,
154
+ errors: [`Build failed: ${error}`],
155
+ };
156
+ }
157
+ }
158
+ /**
159
+ * Generate a service's .env file from the resolved variable pool.
160
+ */
161
+ async generateServiceEnvFile(serviceName, systemVars, outputPath, currentEnv) {
162
+ const serviceVars = this.contracts.mapContractVariables(serviceName, systemVars);
163
+ const contract = this.contracts.getContracts().get(serviceName);
164
+ const serviceEnvPath = outputPath || `.env.${serviceName}`;
165
+ const allVars = { ...serviceVars };
166
+ if (currentEnv)
167
+ allVars['CURRENT_ENV'] = currentEnv;
168
+ const envLines = [];
169
+ if (allVars['CURRENT_ENV']) {
170
+ envLines.push(`CURRENT_ENV=${this.formatEnvValue(allVars['CURRENT_ENV'])}`);
171
+ }
172
+ if (contract?.required) {
173
+ for (const appVar of Object.keys(contract.required)) {
174
+ if (appVar in allVars && appVar !== 'CURRENT_ENV') {
175
+ envLines.push(`${appVar}=${this.formatEnvValue(allVars[appVar])}`);
176
+ }
177
+ }
178
+ }
179
+ if (contract?.secret) {
180
+ for (const appVar of Object.keys(contract.secret)) {
181
+ if (appVar in allVars && !envLines.some(l => l.startsWith(`${appVar}=`))) {
182
+ envLines.push(`${appVar}=${this.formatEnvValue(allVars[appVar])}`);
183
+ }
184
+ }
185
+ }
186
+ if (contract?.optional) {
187
+ for (const appVar of Object.keys(contract.optional)) {
188
+ if (appVar in allVars && !envLines.some(l => l.startsWith(`${appVar}=`))) {
189
+ envLines.push(`${appVar}=${this.formatEnvValue(allVars[appVar])}`);
190
+ }
191
+ }
192
+ }
193
+ if (contract?.defaults) {
194
+ for (const appVar of Object.keys(contract.defaults)) {
195
+ if (appVar in allVars && !envLines.some(l => l.startsWith(`${appVar}=`))) {
196
+ envLines.push(`${appVar}=${this.formatEnvValue(allVars[appVar])}`);
197
+ }
198
+ }
199
+ }
200
+ await fs.promises.writeFile(serviceEnvPath, envLines.join('\n') + '\n', 'utf8');
201
+ }
202
+ listProfiles() {
203
+ try {
204
+ const profilesDir = path.join(this.configDir, 'env', 'profiles');
205
+ return fs
206
+ .readdirSync(profilesDir)
207
+ .filter(f => f.endsWith('.json'))
208
+ .map(file => {
209
+ try {
210
+ const profile = JSON.parse(fs.readFileSync(path.join(profilesDir, file), 'utf8'));
211
+ return { name: file.replace('.json', ''), description: profile.description };
212
+ }
213
+ catch {
214
+ return { name: file.replace('.json', ''), description: 'Invalid profile file' };
215
+ }
216
+ });
217
+ }
218
+ catch {
219
+ return [];
220
+ }
221
+ }
222
+ // ─── Private helpers ────────────────────────────────────────────────────────
223
+ async buildServiceEnvironments(profile, profileName) {
224
+ const errors = [];
225
+ const warnings = [];
226
+ const generatedFiles = [];
227
+ try {
228
+ const componentPool = await this.loadComponentPool(profile.components);
229
+ // Load .env.shared (team values) then .env.local (personal overrides)
230
+ this.loadSharedFiles(componentPool);
231
+ const resolvedPool = this.resolveVariables(componentPool);
232
+ const availableContracts = this.contracts.getContracts();
233
+ // Validate all contracts before writing any files (atomic)
234
+ for (const [serviceName] of availableContracts) {
235
+ const validation = this.contracts.validateContract(serviceName, resolvedPool);
236
+ if (!validation.valid) {
237
+ errors.push(`Service '${serviceName}' missing required variables: ${validation.missing.join(', ')}`);
238
+ }
239
+ if (validation.warnings.length > 0) {
240
+ warnings.push(...validation.warnings.map(w => `[${serviceName}] ${w}`));
241
+ }
242
+ if (validation.valid) {
243
+ const contract = availableContracts.get(serviceName);
244
+ const total = Object.keys(contract.required).length +
245
+ Object.keys(contract.secret || {}).length;
246
+ const optional = Object.keys(contract.optional || {}).length;
247
+ if (total > 0) {
248
+ warnings.push(`[${serviceName}] ✅ ${total} required variables validated (${optional} optional)`);
249
+ }
250
+ }
251
+ }
252
+ if (errors.length > 0) {
253
+ return {
254
+ success: false,
255
+ envPath: this.outputPath,
256
+ errors,
257
+ warnings: warnings.length > 0 ? warnings : undefined,
258
+ };
259
+ }
260
+ // All valid — write .env files
261
+ for (const [serviceName, contract] of availableContracts) {
262
+ if (!contract.location) {
263
+ throw new Error(`Contract '${serviceName}' is missing required 'location' field`);
264
+ }
265
+ if (!this.envName) {
266
+ throw new Error('Environment name required. Pass it as the third constructor argument (e.g., "production").');
267
+ }
268
+ const outputPath = `${contract.location}/.env.${this.envName}`;
269
+ const outputDir = path.dirname(outputPath);
270
+ if (!fs.existsSync(outputDir)) {
271
+ await fs.promises.mkdir(outputDir, { recursive: true });
272
+ }
273
+ await this.generateServiceEnvFile(serviceName, resolvedPool, outputPath, profileName);
274
+ generatedFiles.push(outputPath);
275
+ }
276
+ if (profile.docker) {
277
+ const dockerPath = await this.generateDockerCompose(profile, resolvedPool);
278
+ if (dockerPath)
279
+ generatedFiles.push(dockerPath);
280
+ }
281
+ return {
282
+ success: true,
283
+ envPath: generatedFiles.join(', '),
284
+ profile,
285
+ warnings: warnings.length > 0 ? warnings : undefined,
286
+ };
287
+ }
288
+ catch (error) {
289
+ return {
290
+ success: false,
291
+ envPath: this.outputPath,
292
+ errors: [`Failed to build environments: ${error}`],
293
+ };
294
+ }
295
+ }
296
+ /**
297
+ * Load .env.shared (team) and .env.local (personal) from env/ root.
298
+ * .env.local always takes precedence.
299
+ */
300
+ loadSharedFiles(pool) {
301
+ const envDir = path.join(this.configDir, 'env');
302
+ const sharedPath = path.join(envDir, '.env.shared');
303
+ if (fs.existsSync(sharedPath)) {
304
+ Object.assign(pool, this.loadEnvFile(sharedPath));
305
+ }
306
+ const localPath = path.join(envDir, '.env.local');
307
+ if (fs.existsSync(localPath)) {
308
+ Object.assign(pool, this.loadEnvFile(localPath));
309
+ }
310
+ }
311
+ async loadComponentPool(components) {
312
+ const pool = {};
313
+ for (const [component, environments] of Object.entries(components)) {
314
+ if (!environments)
315
+ continue;
316
+ const envList = Array.isArray(environments) ? environments : [environments];
317
+ const componentPath = path.join(this.configDir, 'env', 'components', `${component}.env`);
318
+ if (!fs.existsSync(componentPath)) {
319
+ throw new Error(`Component file not found: ${component}.env`);
320
+ }
321
+ for (const environment of envList) {
322
+ const config = this.loadComponentConfig(componentPath, environment);
323
+ if (!config) {
324
+ if (environment === 'default') {
325
+ throw new Error(`[default] section not found in ${component}.env — required`);
326
+ }
327
+ continue; // Optional profile-named sections are silently skipped
328
+ }
329
+ Object.assign(pool, config);
330
+ }
331
+ }
332
+ return pool;
333
+ }
334
+ loadProfileWithInheritance(profileName, visited = new Set()) {
335
+ if (visited.has(profileName)) {
336
+ throw new Error(`Circular profile inheritance: ${Array.from(visited).join(' -> ')} -> ${profileName}`);
337
+ }
338
+ visited.add(profileName);
339
+ const profilePath = path.join(this.configDir, 'env', 'profiles', `${profileName}.json`);
340
+ if (!fs.existsSync(profilePath)) {
341
+ throw new Error(`Profile not found: ${profileName}.json`);
342
+ }
343
+ const raw = JSON.parse(fs.readFileSync(profilePath, 'utf8'));
344
+ if (raw.extends) {
345
+ const parent = this.loadProfileWithInheritance(raw.extends, new Set(visited));
346
+ const mergedComponents = { ...parent.profileOverrides, ...raw.components };
347
+ return {
348
+ profileData: {
349
+ ...parent.profileData,
350
+ ...raw,
351
+ components: mergedComponents,
352
+ },
353
+ profileOverrides: mergedComponents,
354
+ inheritanceChain: [...parent.inheritanceChain, profileName],
355
+ };
356
+ }
357
+ return {
358
+ profileData: raw,
359
+ profileOverrides: raw.components || {},
360
+ inheritanceChain: [profileName],
361
+ };
362
+ }
363
+ loadComponentConfig(filePath, environment) {
364
+ try {
365
+ const content = fs.readFileSync(filePath, 'utf8');
366
+ const config = ini.parse(content);
367
+ const quotedValues = this.extractQuotedValues(content, environment);
368
+ const envConfig = config[environment];
369
+ if (!envConfig)
370
+ return null;
371
+ const namespace = config['NAMESPACE'];
372
+ const result = {};
373
+ for (const [key, value] of Object.entries(envConfig)) {
374
+ const finalKey = namespace ? `${namespace}_${key}` : key;
375
+ result[finalKey] = quotedValues[key] || value;
376
+ }
377
+ return result;
378
+ }
379
+ catch (error) {
380
+ throw new Error(`Failed to parse ${filePath}: ${error}`);
381
+ }
382
+ }
383
+ extractQuotedValues(content, environment) {
384
+ const quoted = {};
385
+ const lines = content.split('\n');
386
+ let inTarget = false;
387
+ for (const line of lines) {
388
+ const trimmed = line.trim();
389
+ if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
390
+ inTarget = trimmed.slice(1, -1) === environment;
391
+ continue;
392
+ }
393
+ if (!inTarget || !trimmed || trimmed.startsWith('#'))
394
+ continue;
395
+ const match = trimmed.match(/^([^=]+)="([^"]*)"$/);
396
+ if (match) {
397
+ const [, key, value] = match;
398
+ quoted[key.trim()] = `"${value}"`;
399
+ }
400
+ }
401
+ return quoted;
402
+ }
403
+ loadEnvFile(filePath) {
404
+ try {
405
+ const vars = {};
406
+ for (const line of fs.readFileSync(filePath, 'utf8').split('\n')) {
407
+ const trimmed = line.trim();
408
+ if (trimmed && !trimmed.startsWith('#')) {
409
+ const [key, ...valueParts] = trimmed.split('=');
410
+ if (key && valueParts.length > 0) {
411
+ vars[key.trim()] = valueParts.join('=').trim();
412
+ }
413
+ }
414
+ }
415
+ return vars;
416
+ }
417
+ catch (error) {
418
+ throw new Error(`Failed to load ${filePath}: ${error}`);
419
+ }
420
+ }
421
+ resolveVariables(vars) {
422
+ const resolved = { ...vars };
423
+ const maxPasses = 10;
424
+ let pass = 0;
425
+ let hasUnresolved = true;
426
+ while (hasUnresolved && pass < maxPasses) {
427
+ hasUnresolved = false;
428
+ pass++;
429
+ for (const [key, value] of Object.entries(resolved)) {
430
+ const str = typeof value === 'string' ? value : String(value);
431
+ if (/\$\{([^}]+)\}/.test(str)) {
432
+ const newValue = str.replace(/\$\{([^}]+)\}/g, (match, varName) => {
433
+ const replacement = resolved[varName] || process.env[varName];
434
+ if (replacement !== undefined)
435
+ return replacement;
436
+ hasUnresolved = true;
437
+ return match;
438
+ });
439
+ if (newValue !== str) {
440
+ resolved[key] = newValue;
441
+ hasUnresolved = true;
442
+ }
443
+ }
444
+ }
445
+ }
446
+ if (pass >= maxPasses) {
447
+ console.warn(`⚠️ Variable resolution hit ${maxPasses} passes — possible circular reference.`);
448
+ }
449
+ for (const [key, value] of Object.entries(resolved)) {
450
+ if (typeof value === 'string' && /\$\{([^}]+)\}/.test(value)) {
451
+ const unresolved = value.match(/\$\{([^}]+)\}/g) || [];
452
+ console.warn(`⚠️ Unresolved variables in ${key}: ${unresolved.join(', ')}`);
453
+ }
454
+ }
455
+ return resolved;
456
+ }
457
+ validateAllContracts(systemVars) {
458
+ const errors = [];
459
+ const warnings = [];
460
+ for (const [serviceName] of this.contracts.getContracts()) {
461
+ const validation = this.contracts.validateContract(serviceName, systemVars);
462
+ if (!validation.valid) {
463
+ errors.push(`Service '${serviceName}' missing required variables: ${validation.missing.join(', ')}`);
464
+ }
465
+ warnings.push(...validation.warnings.map(w => `[${serviceName}] ${w}`));
466
+ }
467
+ return { valid: errors.length === 0, errors, warnings };
468
+ }
469
+ formatEnvValue(value) {
470
+ let str = typeof value === 'string' ? value : String(value);
471
+ // Strip existing outer quotes
472
+ if ((str.startsWith('"') && str.endsWith('"')) ||
473
+ (str.startsWith("'") && str.endsWith("'"))) {
474
+ str = str.slice(1, -1);
475
+ }
476
+ // Quote JSON values with single quotes
477
+ if (str.trim().startsWith('[') || str.trim().startsWith('{')) {
478
+ return `'${str.replace(/'/g, "'\\''")}'`;
479
+ }
480
+ // Don't quote variable substitutions or URLs
481
+ if (/^\$\{[^}]+\}$/.test(str) || /^[a-z]+:\/\//.test(str)) {
482
+ return str;
483
+ }
484
+ // Quote values with spaces or special characters
485
+ if (/[\s;&|<>(){}[\]$`"'\\]/.test(str)) {
486
+ return `'${str}'`;
487
+ }
488
+ return str;
489
+ }
490
+ async generateDockerCompose(profile, resolvedVars) {
491
+ if (!profile.docker)
492
+ return null;
493
+ const dockerCompose = {
494
+ version: '3.8',
495
+ services: {},
496
+ networks: profile.docker.networks || {},
497
+ volumes: profile.docker.volumes || {},
498
+ };
499
+ for (const [serviceName, serviceConfig] of Object.entries(profile.docker.services)) {
500
+ if (this.shouldIncludeService(serviceConfig, profile, resolvedVars)) {
501
+ dockerCompose.services[serviceName] = this.processServiceConfig(serviceConfig, resolvedVars);
502
+ }
503
+ }
504
+ const outputPath = './docker-compose.yaml';
505
+ await fs.promises.writeFile(outputPath, yaml.stringify(dockerCompose), 'utf8');
506
+ return outputPath;
507
+ }
508
+ shouldIncludeService(serviceConfig, profile, resolvedVars) {
509
+ if (!serviceConfig.condition)
510
+ return true;
511
+ return this.evaluateCondition(serviceConfig.condition, profile, resolvedVars);
512
+ }
513
+ processServiceConfig(serviceConfig, resolvedVars) {
514
+ const processed = { ...serviceConfig };
515
+ delete processed.condition;
516
+ if (processed.environment) {
517
+ processed.env_file = processed.environment;
518
+ delete processed.environment;
519
+ }
520
+ if (processed.build || processed.image) {
521
+ processed.platform = 'linux/amd64';
522
+ }
523
+ return this.substituteVariables(processed, resolvedVars);
524
+ }
525
+ evaluateCondition(condition, profile, _resolvedVars) {
526
+ try {
527
+ const includesMatch = condition.match(/components\.(\w+)\s+includes\s+['"]([^'"]+)['"]/);
528
+ if (includesMatch) {
529
+ const [, componentName, expectedValue] = includesMatch;
530
+ const val = profile.components[componentName];
531
+ return Array.isArray(val) ? val.includes(expectedValue) : val === expectedValue;
532
+ }
533
+ const equalsMatch = condition.match(/components\.(\w+)\s*===\s*['"]([^'"]+)['"]/);
534
+ if (equalsMatch) {
535
+ const [, componentName, expectedValue] = equalsMatch;
536
+ const val = profile.components[componentName];
537
+ return Array.isArray(val) ? val.includes(expectedValue) : val === expectedValue;
538
+ }
539
+ console.warn(`Unrecognized condition: ${condition}`);
540
+ return true;
541
+ }
542
+ catch {
543
+ return true;
544
+ }
545
+ }
546
+ substituteVariables(obj, vars) {
547
+ if (typeof obj === 'string') {
548
+ return obj.replace(/\$\{([^}]+)\}/g, (match, varName) => {
549
+ return vars[varName] || process.env[varName] || match;
550
+ });
551
+ }
552
+ if (Array.isArray(obj))
553
+ return obj.map(item => this.substituteVariables(item, vars));
554
+ if (obj && typeof obj === 'object') {
555
+ const result = {};
556
+ for (const [key, value] of Object.entries(obj)) {
557
+ result[key] = this.substituteVariables(value, vars);
558
+ }
559
+ return result;
560
+ }
561
+ return obj;
562
+ }
563
+ }
564
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * A contract declares what environment variables a service requires.
3
+ * The builder validates and maps the composed variable pool against each contract,
4
+ * then generates a .env file at the service's location.
5
+ */
6
+ export interface ServiceContract {
7
+ name: string;
8
+ location?: string;
9
+ required: Record<string, string>;
10
+ optional?: Record<string, string>;
11
+ secret?: Record<string, string>;
12
+ defaults?: Record<string, string>;
13
+ }
14
+ export declare class ContractManager {
15
+ private contractsDir;
16
+ private contracts;
17
+ constructor(configDir: string);
18
+ initialize(): Promise<void>;
19
+ private loadContracts;
20
+ /**
21
+ * Validate that all required variables for a service are present in the pool.
22
+ */
23
+ validateContract(serviceName: string, systemVars: Record<string, string>): {
24
+ valid: boolean;
25
+ missing: string[];
26
+ warnings: string[];
27
+ };
28
+ /**
29
+ * Map the resolved variable pool to a service's own variable names.
30
+ * Supports direct mapping and template strings: "${HOST}:${PORT}"
31
+ */
32
+ mapContractVariables(serviceName: string, systemVars: Record<string, string>): Record<string, string>;
33
+ /**
34
+ * Resolve a single var name, supporting fallback chains: "VAR1 : VAR2 : VAR3"
35
+ */
36
+ private resolveVariable;
37
+ /**
38
+ * Resolve a mapping — direct variable name or template "${HOST}:${PORT}"
39
+ */
40
+ private resolveMapping;
41
+ getContracts(): Map<string, ServiceContract>;
42
+ }
43
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/contracts.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAA2C;gBAEhD,SAAS,EAAE,MAAM;IAIvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAInB,aAAa;IAwC3B;;OAEG;IACH,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IA0C5D;;;OAGG;IACH,oBAAoB,CAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAwCzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;CAG7C"}