@konker.dev/config-o-tron 0.0.1
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/LICENSE +15 -0
- package/README.md +131 -0
- package/dist/api.d.ts +24 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +44 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +267 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/delete.d.ts +22 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +105 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/delete.test.d.ts +2 -0
- package/dist/commands/delete.test.d.ts.map +1 -0
- package/dist/commands/delete.test.js +165 -0
- package/dist/commands/delete.test.js.map +1 -0
- package/dist/commands/export.d.ts +31 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +117 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/export.test.d.ts +2 -0
- package/dist/commands/export.test.d.ts.map +1 -0
- package/dist/commands/export.test.js +173 -0
- package/dist/commands/export.test.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +10 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/list.d.ts +37 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +107 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/list.test.d.ts +2 -0
- package/dist/commands/list.test.d.ts.map +1 -0
- package/dist/commands/list.test.js +275 -0
- package/dist/commands/list.test.js.map +1 -0
- package/dist/commands/snapshot.d.ts +67 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +261 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/snapshot.test.d.ts +2 -0
- package/dist/commands/snapshot.test.d.ts.map +1 -0
- package/dist/commands/snapshot.test.js +527 -0
- package/dist/commands/snapshot.test.js.map +1 -0
- package/dist/commands/upsert.d.ts +33 -0
- package/dist/commands/upsert.d.ts.map +1 -0
- package/dist/commands/upsert.js +98 -0
- package/dist/commands/upsert.js.map +1 -0
- package/dist/commands/upsert.test.d.ts +2 -0
- package/dist/commands/upsert.test.d.ts.map +1 -0
- package/dist/commands/upsert.test.js +184 -0
- package/dist/commands/upsert.test.js.map +1 -0
- package/dist/commands/validate.d.ts +23 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +138 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/validate.test.d.ts +2 -0
- package/dist/commands/validate.test.d.ts.map +1 -0
- package/dist/commands/validate.test.js +210 -0
- package/dist/commands/validate.test.js.map +1 -0
- package/dist/config.d.ts +75 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +212 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +107 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +362 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/flatten.d.ts +84 -0
- package/dist/lib/flatten.d.ts.map +1 -0
- package/dist/lib/flatten.js +158 -0
- package/dist/lib/flatten.js.map +1 -0
- package/dist/lib/flatten.test.d.ts +2 -0
- package/dist/lib/flatten.test.d.ts.map +1 -0
- package/dist/lib/flatten.test.js +230 -0
- package/dist/lib/flatten.test.js.map +1 -0
- package/dist/lib/format.d.ts +41 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +182 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/format.test.d.ts +2 -0
- package/dist/lib/format.test.d.ts.map +1 -0
- package/dist/lib/format.test.js +317 -0
- package/dist/lib/format.test.js.map +1 -0
- package/dist/lib/index.d.ts +8 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +8 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/merge.d.ts +42 -0
- package/dist/lib/merge.d.ts.map +1 -0
- package/dist/lib/merge.js +167 -0
- package/dist/lib/merge.js.map +1 -0
- package/dist/lib/merge.test.d.ts +2 -0
- package/dist/lib/merge.test.d.ts.map +1 -0
- package/dist/lib/merge.test.js +218 -0
- package/dist/lib/merge.test.js.map +1 -0
- package/dist/lib/redact.d.ts +29 -0
- package/dist/lib/redact.d.ts.map +1 -0
- package/dist/lib/redact.js +77 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/redact.test.d.ts +2 -0
- package/dist/lib/redact.test.d.ts.map +1 -0
- package/dist/lib/redact.test.js +192 -0
- package/dist/lib/redact.test.js.map +1 -0
- package/dist/providers/AwsSsmProvider.d.ts +3 -0
- package/dist/providers/AwsSsmProvider.d.ts.map +1 -0
- package/dist/providers/AwsSsmProvider.js +230 -0
- package/dist/providers/AwsSsmProvider.js.map +1 -0
- package/dist/providers/AwsSsmProvider.test.d.ts +5 -0
- package/dist/providers/AwsSsmProvider.test.d.ts.map +1 -0
- package/dist/providers/AwsSsmProvider.test.js +200 -0
- package/dist/providers/AwsSsmProvider.test.js.map +1 -0
- package/dist/providers/MockProvider.d.ts +21 -0
- package/dist/providers/MockProvider.d.ts.map +1 -0
- package/dist/providers/MockProvider.js +118 -0
- package/dist/providers/MockProvider.js.map +1 -0
- package/dist/providers/MockProvider.test.d.ts +2 -0
- package/dist/providers/MockProvider.test.d.ts.map +1 -0
- package/dist/providers/MockProvider.test.js +166 -0
- package/dist/providers/MockProvider.test.js.map +1 -0
- package/dist/providers/Provider.d.ts +95 -0
- package/dist/providers/Provider.d.ts.map +1 -0
- package/dist/providers/Provider.js +49 -0
- package/dist/providers/Provider.js.map +1 -0
- package/dist/providers/Provider.test.d.ts +2 -0
- package/dist/providers/Provider.test.d.ts.map +1 -0
- package/dist/providers/Provider.test.js +136 -0
- package/dist/providers/Provider.test.js.map +1 -0
- package/dist/providers/guards.d.ts +13 -0
- package/dist/providers/guards.d.ts.map +1 -0
- package/dist/providers/guards.js +60 -0
- package/dist/providers/guards.js.map +1 -0
- package/dist/providers/guards.test.d.ts +2 -0
- package/dist/providers/guards.test.d.ts.map +1 -0
- package/dist/providers/guards.test.js +84 -0
- package/dist/providers/guards.test.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/registry.d.ts +27 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +50 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/registry.test.d.ts +5 -0
- package/dist/providers/registry.test.d.ts.map +1 -0
- package/dist/providers/registry.test.js +89 -0
- package/dist/providers/registry.test.js.map +1 -0
- package/dist/schema/index.d.ts +8 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +8 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/loader.d.ts +21 -0
- package/dist/schema/loader.d.ts.map +1 -0
- package/dist/schema/loader.js +68 -0
- package/dist/schema/loader.js.map +1 -0
- package/dist/schema/loader.test.d.ts +2 -0
- package/dist/schema/loader.test.d.ts.map +1 -0
- package/dist/schema/loader.test.js +111 -0
- package/dist/schema/loader.test.js.map +1 -0
- package/dist/schema/parser.d.ts +17 -0
- package/dist/schema/parser.d.ts.map +1 -0
- package/dist/schema/parser.js +55 -0
- package/dist/schema/parser.js.map +1 -0
- package/dist/schema/parser.test.d.ts +2 -0
- package/dist/schema/parser.test.d.ts.map +1 -0
- package/dist/schema/parser.test.js +62 -0
- package/dist/schema/parser.test.js.map +1 -0
- package/dist/schema/resolver.d.ts +16 -0
- package/dist/schema/resolver.d.ts.map +1 -0
- package/dist/schema/resolver.js +41 -0
- package/dist/schema/resolver.js.map +1 -0
- package/dist/schema/resolver.test.d.ts +2 -0
- package/dist/schema/resolver.test.d.ts.map +1 -0
- package/dist/schema/resolver.test.js +77 -0
- package/dist/schema/resolver.test.js.map +1 -0
- package/dist/schema/validator.d.ts +16 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +21 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema/validator.test.d.ts +2 -0
- package/dist/schema/validator.test.d.ts.map +1 -0
- package/dist/schema/validator.test.js +40 -0
- package/dist/schema/validator.test.js.map +1 -0
- package/dist/test/fixtures/index.d.ts +39 -0
- package/dist/test/fixtures/index.d.ts.map +1 -0
- package/dist/test/fixtures/index.js +85 -0
- package/dist/test/fixtures/index.js.map +1 -0
- package/dist/test/fixtures/schema.basic.d.ts +16 -0
- package/dist/test/fixtures/schema.basic.d.ts.map +1 -0
- package/dist/test/fixtures/schema.basic.js +16 -0
- package/dist/test/fixtures/schema.basic.js.map +1 -0
- package/dist/test/fixtures/schema.basic.zod.d.ts +58 -0
- package/dist/test/fixtures/schema.basic.zod.d.ts.map +1 -0
- package/dist/test/fixtures/schema.basic.zod.js +16 -0
- package/dist/test/fixtures/schema.basic.zod.js.map +1 -0
- package/dist/validation/effect.d.ts +3 -0
- package/dist/validation/effect.d.ts.map +1 -0
- package/dist/validation/effect.js +368 -0
- package/dist/validation/effect.js.map +1 -0
- package/dist/validation/effect.test.d.ts +2 -0
- package/dist/validation/effect.test.d.ts.map +1 -0
- package/dist/validation/effect.test.js +137 -0
- package/dist/validation/effect.test.js.map +1 -0
- package/dist/validation/hash.d.ts +2 -0
- package/dist/validation/hash.d.ts.map +1 -0
- package/dist/validation/hash.js +27 -0
- package/dist/validation/hash.js.map +1 -0
- package/dist/validation/hash.test.d.ts +2 -0
- package/dist/validation/hash.test.d.ts.map +1 -0
- package/dist/validation/hash.test.js +25 -0
- package/dist/validation/hash.test.js.map +1 -0
- package/dist/validation/index.d.ts +7 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +11 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/parse.d.ts +7 -0
- package/dist/validation/parse.d.ts.map +1 -0
- package/dist/validation/parse.js +44 -0
- package/dist/validation/parse.js.map +1 -0
- package/dist/validation/parse.test.d.ts +2 -0
- package/dist/validation/parse.test.d.ts.map +1 -0
- package/dist/validation/parse.test.js +47 -0
- package/dist/validation/parse.test.js.map +1 -0
- package/dist/validation/types.d.ts +33 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +2 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/zod.d.ts +3 -0
- package/dist/validation/zod.d.ts.map +1 -0
- package/dist/validation/zod.js +326 -0
- package/dist/validation/zod.js.map +1 -0
- package/dist/validation/zod.test.d.ts +2 -0
- package/dist/validation/zod.test.d.ts.map +1 -0
- package/dist/validation/zod.test.js +161 -0
- package/dist/validation/zod.test.js.map +1 -0
- package/package.json +242 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format Utilities Tests
|
|
3
|
+
*/
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { detectFormat, formatConfig, formatEnv, formatJson, parseEnvContent } from './format.js';
|
|
6
|
+
describe('format', () => {
|
|
7
|
+
describe('detectFormat', () => {
|
|
8
|
+
it('should detect JSON object', () => {
|
|
9
|
+
expect(detectFormat('{"key": "value"}')).toBe('json');
|
|
10
|
+
expect(detectFormat(' {\n "key": 1\n}')).toBe('json');
|
|
11
|
+
});
|
|
12
|
+
it('should detect JSON array', () => {
|
|
13
|
+
expect(detectFormat('[1, 2, 3]')).toBe('json');
|
|
14
|
+
});
|
|
15
|
+
it('should detect env format', () => {
|
|
16
|
+
expect(detectFormat('KEY=value')).toBe('env');
|
|
17
|
+
expect(detectFormat('KEY=value\nKEY2=value2')).toBe('env');
|
|
18
|
+
});
|
|
19
|
+
it('should detect env with comments', () => {
|
|
20
|
+
expect(detectFormat('# comment\nKEY=value')).toBe('env');
|
|
21
|
+
});
|
|
22
|
+
it('should return unknown for empty content', () => {
|
|
23
|
+
expect(detectFormat('')).toBe('unknown');
|
|
24
|
+
expect(detectFormat(' ')).toBe('unknown');
|
|
25
|
+
});
|
|
26
|
+
it('should return unknown for ambiguous content', () => {
|
|
27
|
+
expect(detectFormat('just some text')).toBe('unknown');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('formatEnv', () => {
|
|
31
|
+
it('should format simple key-value pairs', () => {
|
|
32
|
+
const data = {
|
|
33
|
+
database: {
|
|
34
|
+
host: 'localhost',
|
|
35
|
+
port: 5432,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
const result = formatEnv(data);
|
|
39
|
+
expect(result).toContain('DATABASE_HOST=localhost');
|
|
40
|
+
expect(result).toContain('DATABASE_PORT=5432');
|
|
41
|
+
});
|
|
42
|
+
it('should quote values with spaces', () => {
|
|
43
|
+
const data = {
|
|
44
|
+
my: {
|
|
45
|
+
value: 'hello world',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const result = formatEnv(data);
|
|
49
|
+
expect(result).toContain('MY_VALUE="hello world"');
|
|
50
|
+
});
|
|
51
|
+
it('should escape special characters in quoted values', () => {
|
|
52
|
+
const data = {
|
|
53
|
+
my: {
|
|
54
|
+
value: 'has "quote" inside',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
const result = formatEnv(data);
|
|
58
|
+
// Value has spaces so it will be quoted, and internal quotes are escaped
|
|
59
|
+
expect(result).toContain('MY_VALUE="has \\"quote\\" inside"');
|
|
60
|
+
});
|
|
61
|
+
it('should sort keys alphabetically', () => {
|
|
62
|
+
const data = {
|
|
63
|
+
z: { key: 'z' },
|
|
64
|
+
a: { key: 'a' },
|
|
65
|
+
m: { key: 'm' },
|
|
66
|
+
};
|
|
67
|
+
const result = formatEnv(data);
|
|
68
|
+
const lines = result.trim().split('\n');
|
|
69
|
+
expect(lines[0]).toContain('A_KEY');
|
|
70
|
+
expect(lines[1]).toContain('M_KEY');
|
|
71
|
+
expect(lines[2]).toContain('Z_KEY');
|
|
72
|
+
});
|
|
73
|
+
it('should handle custom separator', () => {
|
|
74
|
+
const data = {
|
|
75
|
+
database: { host: 'localhost' },
|
|
76
|
+
};
|
|
77
|
+
const result = formatEnv(data, { separator: '__' });
|
|
78
|
+
expect(result).toContain('DATABASE__HOST=localhost');
|
|
79
|
+
});
|
|
80
|
+
it('should omit undefined values', () => {
|
|
81
|
+
const data = {
|
|
82
|
+
defined: 'value',
|
|
83
|
+
notDefined: undefined,
|
|
84
|
+
};
|
|
85
|
+
const result = formatEnv(data);
|
|
86
|
+
expect(result).toContain('DEFINED=value');
|
|
87
|
+
expect(result).not.toContain('NOT_DEFINED');
|
|
88
|
+
});
|
|
89
|
+
it('should omit null values', () => {
|
|
90
|
+
const data = {
|
|
91
|
+
defined: 'value',
|
|
92
|
+
nullValue: null,
|
|
93
|
+
};
|
|
94
|
+
const result = formatEnv(data);
|
|
95
|
+
expect(result).toContain('DEFINED=value');
|
|
96
|
+
expect(result).not.toContain('NULL_VALUE');
|
|
97
|
+
});
|
|
98
|
+
it('should format boolean values', () => {
|
|
99
|
+
const data = {
|
|
100
|
+
enabled: true,
|
|
101
|
+
disabled: false,
|
|
102
|
+
};
|
|
103
|
+
const result = formatEnv(data);
|
|
104
|
+
expect(result).toContain('ENABLED=true');
|
|
105
|
+
expect(result).toContain('DISABLED=false');
|
|
106
|
+
});
|
|
107
|
+
it('should format arrays as quoted JSON', () => {
|
|
108
|
+
const data = {
|
|
109
|
+
tags: ['a', 'b', 'c'],
|
|
110
|
+
};
|
|
111
|
+
const result = formatEnv(data);
|
|
112
|
+
expect(result).toContain('TAGS="[\\"a\\",\\"b\\",\\"c\\"]"');
|
|
113
|
+
});
|
|
114
|
+
it('should format objects as quoted JSON', () => {
|
|
115
|
+
const data = {
|
|
116
|
+
nested: { key: 'value' },
|
|
117
|
+
};
|
|
118
|
+
const result = formatEnv(data);
|
|
119
|
+
// Object should be flattened
|
|
120
|
+
expect(result).toContain('NESTED_KEY=value');
|
|
121
|
+
});
|
|
122
|
+
it('should quote values that start with whitespace', () => {
|
|
123
|
+
const data = {
|
|
124
|
+
key: ' leading',
|
|
125
|
+
};
|
|
126
|
+
const result = formatEnv(data);
|
|
127
|
+
expect(result).toContain('KEY=" leading"');
|
|
128
|
+
});
|
|
129
|
+
it('should quote values that end with whitespace', () => {
|
|
130
|
+
const data = {
|
|
131
|
+
key: 'trailing ',
|
|
132
|
+
};
|
|
133
|
+
const result = formatEnv(data);
|
|
134
|
+
expect(result).toContain('KEY="trailing "');
|
|
135
|
+
});
|
|
136
|
+
it('should allow empty string values without quotes', () => {
|
|
137
|
+
const data = {
|
|
138
|
+
empty: '',
|
|
139
|
+
};
|
|
140
|
+
const result = formatEnv(data);
|
|
141
|
+
expect(result).toContain('EMPTY=');
|
|
142
|
+
expect(result).not.toContain('EMPTY=""');
|
|
143
|
+
});
|
|
144
|
+
it('should quote values with hash sign', () => {
|
|
145
|
+
const data = {
|
|
146
|
+
key: 'value#comment',
|
|
147
|
+
};
|
|
148
|
+
const result = formatEnv(data);
|
|
149
|
+
expect(result).toContain('KEY="value#comment"');
|
|
150
|
+
});
|
|
151
|
+
it('should quote values with dollar sign', () => {
|
|
152
|
+
const data = {
|
|
153
|
+
key: 'value$var',
|
|
154
|
+
};
|
|
155
|
+
const result = formatEnv(data);
|
|
156
|
+
expect(result).toContain('KEY="value$var"');
|
|
157
|
+
});
|
|
158
|
+
it('should escape newlines in values', () => {
|
|
159
|
+
const data = {
|
|
160
|
+
key: 'line1\nline2',
|
|
161
|
+
};
|
|
162
|
+
const result = formatEnv(data);
|
|
163
|
+
expect(result).toContain('KEY="line1\\nline2"');
|
|
164
|
+
});
|
|
165
|
+
it('should escape backslashes in values with special chars', () => {
|
|
166
|
+
// Backslashes alone don't trigger quoting, but with other special chars they get escaped
|
|
167
|
+
const data = {
|
|
168
|
+
key: 'path\\to\\file with space',
|
|
169
|
+
};
|
|
170
|
+
const result = formatEnv(data);
|
|
171
|
+
expect(result).toContain('KEY="path\\\\to\\\\file with space"');
|
|
172
|
+
});
|
|
173
|
+
it('should not sort keys when sortKeys is false', () => {
|
|
174
|
+
const data = {
|
|
175
|
+
z: 'z',
|
|
176
|
+
a: 'a',
|
|
177
|
+
};
|
|
178
|
+
const result = formatEnv(data, { sortKeys: false });
|
|
179
|
+
const lines = result.trim().split('\n');
|
|
180
|
+
expect(lines[0]).toContain('Z=');
|
|
181
|
+
expect(lines[1]).toContain('A=');
|
|
182
|
+
});
|
|
183
|
+
it('should return empty string for empty data', () => {
|
|
184
|
+
const result = formatEnv({});
|
|
185
|
+
expect(result).toBe('');
|
|
186
|
+
});
|
|
187
|
+
it('should handle bigint values as string', () => {
|
|
188
|
+
const data = {
|
|
189
|
+
big: BigInt(12345678901234567890n),
|
|
190
|
+
};
|
|
191
|
+
const result = formatEnv(data);
|
|
192
|
+
expect(result).toContain('BIG=');
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe('formatJson', () => {
|
|
196
|
+
it('should format flat object', () => {
|
|
197
|
+
const data = {
|
|
198
|
+
host: 'localhost',
|
|
199
|
+
port: 5432,
|
|
200
|
+
};
|
|
201
|
+
const result = formatJson(data);
|
|
202
|
+
const parsed = JSON.parse(result);
|
|
203
|
+
expect(parsed).toEqual(data);
|
|
204
|
+
});
|
|
205
|
+
it('should format nested object', () => {
|
|
206
|
+
const data = {
|
|
207
|
+
database: {
|
|
208
|
+
host: 'localhost',
|
|
209
|
+
port: 5432,
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
const result = formatJson(data);
|
|
213
|
+
const parsed = JSON.parse(result);
|
|
214
|
+
expect(parsed).toEqual(data);
|
|
215
|
+
});
|
|
216
|
+
it('should pretty print with indentation', () => {
|
|
217
|
+
const data = { key: 'value' };
|
|
218
|
+
const result = formatJson(data);
|
|
219
|
+
expect(result).toContain('\n');
|
|
220
|
+
expect(result).toContain(' ');
|
|
221
|
+
});
|
|
222
|
+
it('should minify when pretty is false', () => {
|
|
223
|
+
const data = { key: 'value' };
|
|
224
|
+
const result = formatJson(data, false);
|
|
225
|
+
expect(result.trim()).toBe('{"key":"value"}');
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
describe('parseEnvContent', () => {
|
|
229
|
+
it('should parse simple key-value pairs', () => {
|
|
230
|
+
const content = 'KEY=value\nKEY2=value2';
|
|
231
|
+
const result = parseEnvContent(content);
|
|
232
|
+
expect(result).toEqual({
|
|
233
|
+
KEY: 'value',
|
|
234
|
+
KEY2: 'value2',
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
it('should handle quoted values', () => {
|
|
238
|
+
const content = 'KEY="hello world"';
|
|
239
|
+
const result = parseEnvContent(content);
|
|
240
|
+
expect(result).toEqual({ KEY: 'hello world' });
|
|
241
|
+
});
|
|
242
|
+
it('should handle single-quoted values', () => {
|
|
243
|
+
const content = "KEY='hello world'";
|
|
244
|
+
const result = parseEnvContent(content);
|
|
245
|
+
expect(result).toEqual({ KEY: 'hello world' });
|
|
246
|
+
});
|
|
247
|
+
it('should skip comments', () => {
|
|
248
|
+
const content = '# comment\nKEY=value\n# another comment';
|
|
249
|
+
const result = parseEnvContent(content);
|
|
250
|
+
expect(result).toEqual({ KEY: 'value' });
|
|
251
|
+
});
|
|
252
|
+
it('should skip empty lines', () => {
|
|
253
|
+
const content = 'KEY1=value1\n\n\nKEY2=value2';
|
|
254
|
+
const result = parseEnvContent(content);
|
|
255
|
+
expect(result).toEqual({
|
|
256
|
+
KEY1: 'value1',
|
|
257
|
+
KEY2: 'value2',
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
it('should handle values with equals sign', () => {
|
|
261
|
+
const content = 'URL=https://example.com?foo=bar';
|
|
262
|
+
const result = parseEnvContent(content);
|
|
263
|
+
expect(result).toEqual({ URL: 'https://example.com?foo=bar' });
|
|
264
|
+
});
|
|
265
|
+
it('should skip lines without equals sign', () => {
|
|
266
|
+
const content = 'KEY=value\ninvalid line\nKEY2=value2';
|
|
267
|
+
const result = parseEnvContent(content);
|
|
268
|
+
expect(result).toEqual({
|
|
269
|
+
KEY: 'value',
|
|
270
|
+
KEY2: 'value2',
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
it('should unescape escaped characters in quoted values', () => {
|
|
274
|
+
const content = 'KEY="line1\\nline2\\\\path"';
|
|
275
|
+
const result = parseEnvContent(content);
|
|
276
|
+
expect(result).toEqual({ KEY: 'line1\nline2\\path' });
|
|
277
|
+
});
|
|
278
|
+
it('should unescape escaped quotes in double-quoted values', () => {
|
|
279
|
+
const content = 'KEY="has \\"quote\\" inside"';
|
|
280
|
+
const result = parseEnvContent(content);
|
|
281
|
+
expect(result).toEqual({ KEY: 'has "quote" inside' });
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
describe('formatConfig', () => {
|
|
285
|
+
it('should format as env when format is env', () => {
|
|
286
|
+
const data = { key: 'value' };
|
|
287
|
+
const result = formatConfig(data, 'env');
|
|
288
|
+
expect(result).toContain('KEY=value');
|
|
289
|
+
});
|
|
290
|
+
it('should format as json when format is json', () => {
|
|
291
|
+
const data = { key: 'value' };
|
|
292
|
+
const result = formatConfig(data, 'json');
|
|
293
|
+
expect(result).toContain('"key"');
|
|
294
|
+
expect(result).toContain('"value"');
|
|
295
|
+
});
|
|
296
|
+
it('should pass options to formatEnv', () => {
|
|
297
|
+
const data = { database: { host: 'localhost' } };
|
|
298
|
+
const result = formatConfig(data, 'env', { separator: '__' });
|
|
299
|
+
expect(result).toContain('DATABASE__HOST=localhost');
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe('detectFormat edge cases', () => {
|
|
303
|
+
it('should return unknown for invalid JSON starting with {', () => {
|
|
304
|
+
expect(detectFormat('{ invalid json')).toBe('unknown');
|
|
305
|
+
});
|
|
306
|
+
it('should return unknown for invalid JSON starting with [', () => {
|
|
307
|
+
expect(detectFormat('[ invalid json')).toBe('unknown');
|
|
308
|
+
});
|
|
309
|
+
it('should detect env format with underscore keys', () => {
|
|
310
|
+
expect(detectFormat('MY_KEY=value\nOTHER_KEY=value2')).toBe('env');
|
|
311
|
+
});
|
|
312
|
+
it('should return unknown for lowercase env-like format', () => {
|
|
313
|
+
expect(detectFormat('lowercase=value')).toBe('unknown');
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
//# sourceMappingURL=format.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.test.js","sourceRoot":"","sources":["../../src/lib/format.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Merge Utilities
|
|
3
|
+
*
|
|
4
|
+
* Merges configuration objects with conflict detection
|
|
5
|
+
*/
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
export type MergeConflict = {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
readonly sourceA: string;
|
|
10
|
+
readonly sourceB: string;
|
|
11
|
+
readonly valueA: unknown;
|
|
12
|
+
readonly valueB: unknown;
|
|
13
|
+
readonly type: 'type-mismatch' | 'override';
|
|
14
|
+
};
|
|
15
|
+
export type MergeResult<T> = {
|
|
16
|
+
readonly merged: T;
|
|
17
|
+
readonly conflicts: ReadonlyArray<MergeConflict>;
|
|
18
|
+
};
|
|
19
|
+
export type MergeOptions = {
|
|
20
|
+
readonly strictMerge?: boolean | undefined;
|
|
21
|
+
readonly warnOnOverride?: boolean | undefined;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Merge multiple configuration objects in order
|
|
25
|
+
*
|
|
26
|
+
* @param sources - Array of [sourceName, sourceObject] pairs
|
|
27
|
+
* @param options - Merge options
|
|
28
|
+
*/
|
|
29
|
+
export declare function mergeConfigs(sources: ReadonlyArray<readonly [string, Record<string, unknown>]>, options?: MergeOptions): Effect.Effect<MergeResult<Record<string, unknown>>, Error>;
|
|
30
|
+
/**
|
|
31
|
+
* Filter conflicts to only include type mismatches
|
|
32
|
+
*/
|
|
33
|
+
export declare function getTypeMismatches(conflicts: ReadonlyArray<MergeConflict>): ReadonlyArray<MergeConflict>;
|
|
34
|
+
/**
|
|
35
|
+
* Filter conflicts to only include overrides
|
|
36
|
+
*/
|
|
37
|
+
export declare function getOverrides(conflicts: ReadonlyArray<MergeConflict>): ReadonlyArray<MergeConflict>;
|
|
38
|
+
/**
|
|
39
|
+
* Format conflicts for logging
|
|
40
|
+
*/
|
|
41
|
+
export declare function formatConflicts(conflicts: ReadonlyArray<MergeConflict>, redact?: boolean): string;
|
|
42
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/lib/merge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAOxC,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,UAAU,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/C,CAAC;AAwGF;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClE,OAAO,GAAE,YAAiB,GACzB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CA0C5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,CAEvG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,CAElG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,UAAO,GAAG,MAAM,CAW9F"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep Merge Utilities
|
|
3
|
+
*
|
|
4
|
+
* Merges configuration objects with conflict detection
|
|
5
|
+
*/
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import { pipe } from 'effect/Function';
|
|
8
|
+
// --------------------------------------------------------------------------
|
|
9
|
+
// Type Checking
|
|
10
|
+
// --------------------------------------------------------------------------
|
|
11
|
+
function isObject(value) {
|
|
12
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
function getTypeName(value) {
|
|
15
|
+
if (value === null)
|
|
16
|
+
return 'null';
|
|
17
|
+
if (Array.isArray(value))
|
|
18
|
+
return 'array';
|
|
19
|
+
return typeof value;
|
|
20
|
+
}
|
|
21
|
+
// --------------------------------------------------------------------------
|
|
22
|
+
// Deep Merge
|
|
23
|
+
// --------------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Deep merge two objects, tracking conflicts
|
|
26
|
+
*
|
|
27
|
+
* @param base - Base object (lower priority)
|
|
28
|
+
* @param overlay - Overlay object (higher priority, wins on conflict)
|
|
29
|
+
* @param sourceBase - Name of base source (for conflict reporting)
|
|
30
|
+
* @param sourceOverlay - Name of overlay source (for conflict reporting)
|
|
31
|
+
* @param pathPrefix - Current path prefix (for nested paths)
|
|
32
|
+
*/
|
|
33
|
+
function deepMergeWithConflicts(base, overlay, sourceBase, sourceOverlay, pathPrefix = '') {
|
|
34
|
+
const conflicts = [];
|
|
35
|
+
const result = { ...base };
|
|
36
|
+
for (const [key, overlayValue] of Object.entries(overlay)) {
|
|
37
|
+
const path = pathPrefix ? `${pathPrefix}.${key}` : key;
|
|
38
|
+
const baseValue = base[key];
|
|
39
|
+
if (baseValue === undefined) {
|
|
40
|
+
// New key, just add it
|
|
41
|
+
result[key] = overlayValue;
|
|
42
|
+
}
|
|
43
|
+
else if (isObject(baseValue) && isObject(overlayValue)) {
|
|
44
|
+
// Both are objects, recurse
|
|
45
|
+
const nested = deepMergeWithConflicts(baseValue, overlayValue, sourceBase, sourceOverlay, path);
|
|
46
|
+
result[key] = nested.merged;
|
|
47
|
+
conflicts.push(...nested.conflicts);
|
|
48
|
+
}
|
|
49
|
+
else if (Array.isArray(baseValue) || Array.isArray(overlayValue)) {
|
|
50
|
+
// Arrays are replaced entirely
|
|
51
|
+
if (Array.isArray(baseValue) && Array.isArray(overlayValue)) {
|
|
52
|
+
conflicts.push({
|
|
53
|
+
path,
|
|
54
|
+
sourceA: sourceBase,
|
|
55
|
+
sourceB: sourceOverlay,
|
|
56
|
+
valueA: baseValue,
|
|
57
|
+
valueB: overlayValue,
|
|
58
|
+
type: 'override',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Type mismatch: one is array, other is not
|
|
63
|
+
conflicts.push({
|
|
64
|
+
path,
|
|
65
|
+
sourceA: sourceBase,
|
|
66
|
+
sourceB: sourceOverlay,
|
|
67
|
+
valueA: baseValue,
|
|
68
|
+
valueB: overlayValue,
|
|
69
|
+
type: 'type-mismatch',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
result[key] = overlayValue;
|
|
73
|
+
}
|
|
74
|
+
else if (getTypeName(baseValue) !== getTypeName(overlayValue)) {
|
|
75
|
+
// Type mismatch
|
|
76
|
+
conflicts.push({
|
|
77
|
+
path,
|
|
78
|
+
sourceA: sourceBase,
|
|
79
|
+
sourceB: sourceOverlay,
|
|
80
|
+
valueA: baseValue,
|
|
81
|
+
valueB: overlayValue,
|
|
82
|
+
type: 'type-mismatch',
|
|
83
|
+
});
|
|
84
|
+
result[key] = overlayValue;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// Same type, override
|
|
88
|
+
if (baseValue !== overlayValue) {
|
|
89
|
+
conflicts.push({
|
|
90
|
+
path,
|
|
91
|
+
sourceA: sourceBase,
|
|
92
|
+
sourceB: sourceOverlay,
|
|
93
|
+
valueA: baseValue,
|
|
94
|
+
valueB: overlayValue,
|
|
95
|
+
type: 'override',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
result[key] = overlayValue;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { merged: result, conflicts };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Merge multiple configuration objects in order
|
|
105
|
+
*
|
|
106
|
+
* @param sources - Array of [sourceName, sourceObject] pairs
|
|
107
|
+
* @param options - Merge options
|
|
108
|
+
*/
|
|
109
|
+
export function mergeConfigs(sources, options = {}) {
|
|
110
|
+
return pipe(Effect.sync(() => {
|
|
111
|
+
if (sources.length === 0) {
|
|
112
|
+
return { merged: {}, conflicts: [], lastSourceName: '' };
|
|
113
|
+
}
|
|
114
|
+
const allConflicts = [];
|
|
115
|
+
let merged = {};
|
|
116
|
+
let lastSourceName = '';
|
|
117
|
+
for (const [sourceName, sourceObject] of sources) {
|
|
118
|
+
if (Object.keys(merged).length === 0) {
|
|
119
|
+
merged = { ...sourceObject };
|
|
120
|
+
lastSourceName = sourceName;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const result = deepMergeWithConflicts(merged, sourceObject, lastSourceName, sourceName);
|
|
124
|
+
merged = result.merged;
|
|
125
|
+
allConflicts.push(...result.conflicts);
|
|
126
|
+
lastSourceName = sourceName;
|
|
127
|
+
}
|
|
128
|
+
return { merged, conflicts: allConflicts, lastSourceName };
|
|
129
|
+
}), Effect.flatMap(({ conflicts, merged }) => {
|
|
130
|
+
// Check for type mismatches in strict mode
|
|
131
|
+
if (options.strictMerge) {
|
|
132
|
+
const typeMismatches = conflicts.filter((c) => c.type === 'type-mismatch');
|
|
133
|
+
if (typeMismatches.length > 0) {
|
|
134
|
+
const messages = typeMismatches.map((c) => `${c.path}: ${getTypeName(c.valueA)} (from ${c.sourceA}) vs ${getTypeName(c.valueB)} (from ${c.sourceB})`);
|
|
135
|
+
return Effect.fail(new Error(`Type conflicts during merge:\n${messages.join('\n')}`));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return Effect.succeed({ merged, conflicts });
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Filter conflicts to only include type mismatches
|
|
143
|
+
*/
|
|
144
|
+
export function getTypeMismatches(conflicts) {
|
|
145
|
+
return conflicts.filter((c) => c.type === 'type-mismatch');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Filter conflicts to only include overrides
|
|
149
|
+
*/
|
|
150
|
+
export function getOverrides(conflicts) {
|
|
151
|
+
return conflicts.filter((c) => c.type === 'override');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Format conflicts for logging
|
|
155
|
+
*/
|
|
156
|
+
export function formatConflicts(conflicts, redact = true) {
|
|
157
|
+
if (conflicts.length === 0)
|
|
158
|
+
return '';
|
|
159
|
+
const lines = conflicts.map((c) => {
|
|
160
|
+
const valueA = redact ? '<redacted>' : JSON.stringify(c.valueA);
|
|
161
|
+
const valueB = redact ? '<redacted>' : JSON.stringify(c.valueB);
|
|
162
|
+
const typeLabel = c.type === 'type-mismatch' ? '[TYPE MISMATCH]' : '[OVERRIDE]';
|
|
163
|
+
return ` ${typeLabel} ${c.path}: ${valueA} (${c.sourceA}) -> ${valueB} (${c.sourceB})`;
|
|
164
|
+
});
|
|
165
|
+
return lines.join('\n');
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/lib/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.test.d.ts","sourceRoot":"","sources":["../../src/lib/merge.test.ts"],"names":[],"mappings":""}
|