@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.
Files changed (243) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +131 -0
  3. package/dist/api.d.ts +24 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +44 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/cli.d.ts +8 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +267 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/delete.d.ts +22 -0
  12. package/dist/commands/delete.d.ts.map +1 -0
  13. package/dist/commands/delete.js +105 -0
  14. package/dist/commands/delete.js.map +1 -0
  15. package/dist/commands/delete.test.d.ts +2 -0
  16. package/dist/commands/delete.test.d.ts.map +1 -0
  17. package/dist/commands/delete.test.js +165 -0
  18. package/dist/commands/delete.test.js.map +1 -0
  19. package/dist/commands/export.d.ts +31 -0
  20. package/dist/commands/export.d.ts.map +1 -0
  21. package/dist/commands/export.js +117 -0
  22. package/dist/commands/export.js.map +1 -0
  23. package/dist/commands/export.test.d.ts +2 -0
  24. package/dist/commands/export.test.d.ts.map +1 -0
  25. package/dist/commands/export.test.js +173 -0
  26. package/dist/commands/export.test.js.map +1 -0
  27. package/dist/commands/index.d.ts +10 -0
  28. package/dist/commands/index.d.ts.map +1 -0
  29. package/dist/commands/index.js +10 -0
  30. package/dist/commands/index.js.map +1 -0
  31. package/dist/commands/list.d.ts +37 -0
  32. package/dist/commands/list.d.ts.map +1 -0
  33. package/dist/commands/list.js +107 -0
  34. package/dist/commands/list.js.map +1 -0
  35. package/dist/commands/list.test.d.ts +2 -0
  36. package/dist/commands/list.test.d.ts.map +1 -0
  37. package/dist/commands/list.test.js +275 -0
  38. package/dist/commands/list.test.js.map +1 -0
  39. package/dist/commands/snapshot.d.ts +67 -0
  40. package/dist/commands/snapshot.d.ts.map +1 -0
  41. package/dist/commands/snapshot.js +261 -0
  42. package/dist/commands/snapshot.js.map +1 -0
  43. package/dist/commands/snapshot.test.d.ts +2 -0
  44. package/dist/commands/snapshot.test.d.ts.map +1 -0
  45. package/dist/commands/snapshot.test.js +527 -0
  46. package/dist/commands/snapshot.test.js.map +1 -0
  47. package/dist/commands/upsert.d.ts +33 -0
  48. package/dist/commands/upsert.d.ts.map +1 -0
  49. package/dist/commands/upsert.js +98 -0
  50. package/dist/commands/upsert.js.map +1 -0
  51. package/dist/commands/upsert.test.d.ts +2 -0
  52. package/dist/commands/upsert.test.d.ts.map +1 -0
  53. package/dist/commands/upsert.test.js +184 -0
  54. package/dist/commands/upsert.test.js.map +1 -0
  55. package/dist/commands/validate.d.ts +23 -0
  56. package/dist/commands/validate.d.ts.map +1 -0
  57. package/dist/commands/validate.js +138 -0
  58. package/dist/commands/validate.js.map +1 -0
  59. package/dist/commands/validate.test.d.ts +2 -0
  60. package/dist/commands/validate.test.d.ts.map +1 -0
  61. package/dist/commands/validate.test.js +210 -0
  62. package/dist/commands/validate.test.js.map +1 -0
  63. package/dist/config.d.ts +75 -0
  64. package/dist/config.d.ts.map +1 -0
  65. package/dist/config.js +212 -0
  66. package/dist/config.js.map +1 -0
  67. package/dist/errors.d.ts +107 -0
  68. package/dist/errors.d.ts.map +1 -0
  69. package/dist/errors.js +362 -0
  70. package/dist/errors.js.map +1 -0
  71. package/dist/index.d.ts +10 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +8 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/lib/flatten.d.ts +84 -0
  76. package/dist/lib/flatten.d.ts.map +1 -0
  77. package/dist/lib/flatten.js +158 -0
  78. package/dist/lib/flatten.js.map +1 -0
  79. package/dist/lib/flatten.test.d.ts +2 -0
  80. package/dist/lib/flatten.test.d.ts.map +1 -0
  81. package/dist/lib/flatten.test.js +230 -0
  82. package/dist/lib/flatten.test.js.map +1 -0
  83. package/dist/lib/format.d.ts +41 -0
  84. package/dist/lib/format.d.ts.map +1 -0
  85. package/dist/lib/format.js +182 -0
  86. package/dist/lib/format.js.map +1 -0
  87. package/dist/lib/format.test.d.ts +2 -0
  88. package/dist/lib/format.test.d.ts.map +1 -0
  89. package/dist/lib/format.test.js +317 -0
  90. package/dist/lib/format.test.js.map +1 -0
  91. package/dist/lib/index.d.ts +8 -0
  92. package/dist/lib/index.d.ts.map +1 -0
  93. package/dist/lib/index.js +8 -0
  94. package/dist/lib/index.js.map +1 -0
  95. package/dist/lib/merge.d.ts +42 -0
  96. package/dist/lib/merge.d.ts.map +1 -0
  97. package/dist/lib/merge.js +167 -0
  98. package/dist/lib/merge.js.map +1 -0
  99. package/dist/lib/merge.test.d.ts +2 -0
  100. package/dist/lib/merge.test.d.ts.map +1 -0
  101. package/dist/lib/merge.test.js +218 -0
  102. package/dist/lib/merge.test.js.map +1 -0
  103. package/dist/lib/redact.d.ts +29 -0
  104. package/dist/lib/redact.d.ts.map +1 -0
  105. package/dist/lib/redact.js +77 -0
  106. package/dist/lib/redact.js.map +1 -0
  107. package/dist/lib/redact.test.d.ts +2 -0
  108. package/dist/lib/redact.test.d.ts.map +1 -0
  109. package/dist/lib/redact.test.js +192 -0
  110. package/dist/lib/redact.test.js.map +1 -0
  111. package/dist/providers/AwsSsmProvider.d.ts +3 -0
  112. package/dist/providers/AwsSsmProvider.d.ts.map +1 -0
  113. package/dist/providers/AwsSsmProvider.js +230 -0
  114. package/dist/providers/AwsSsmProvider.js.map +1 -0
  115. package/dist/providers/AwsSsmProvider.test.d.ts +5 -0
  116. package/dist/providers/AwsSsmProvider.test.d.ts.map +1 -0
  117. package/dist/providers/AwsSsmProvider.test.js +200 -0
  118. package/dist/providers/AwsSsmProvider.test.js.map +1 -0
  119. package/dist/providers/MockProvider.d.ts +21 -0
  120. package/dist/providers/MockProvider.d.ts.map +1 -0
  121. package/dist/providers/MockProvider.js +118 -0
  122. package/dist/providers/MockProvider.js.map +1 -0
  123. package/dist/providers/MockProvider.test.d.ts +2 -0
  124. package/dist/providers/MockProvider.test.d.ts.map +1 -0
  125. package/dist/providers/MockProvider.test.js +166 -0
  126. package/dist/providers/MockProvider.test.js.map +1 -0
  127. package/dist/providers/Provider.d.ts +95 -0
  128. package/dist/providers/Provider.d.ts.map +1 -0
  129. package/dist/providers/Provider.js +49 -0
  130. package/dist/providers/Provider.js.map +1 -0
  131. package/dist/providers/Provider.test.d.ts +2 -0
  132. package/dist/providers/Provider.test.d.ts.map +1 -0
  133. package/dist/providers/Provider.test.js +136 -0
  134. package/dist/providers/Provider.test.js.map +1 -0
  135. package/dist/providers/guards.d.ts +13 -0
  136. package/dist/providers/guards.d.ts.map +1 -0
  137. package/dist/providers/guards.js +60 -0
  138. package/dist/providers/guards.js.map +1 -0
  139. package/dist/providers/guards.test.d.ts +2 -0
  140. package/dist/providers/guards.test.d.ts.map +1 -0
  141. package/dist/providers/guards.test.js +84 -0
  142. package/dist/providers/guards.test.js.map +1 -0
  143. package/dist/providers/index.d.ts +8 -0
  144. package/dist/providers/index.d.ts.map +1 -0
  145. package/dist/providers/index.js +8 -0
  146. package/dist/providers/index.js.map +1 -0
  147. package/dist/providers/registry.d.ts +27 -0
  148. package/dist/providers/registry.d.ts.map +1 -0
  149. package/dist/providers/registry.js +50 -0
  150. package/dist/providers/registry.js.map +1 -0
  151. package/dist/providers/registry.test.d.ts +5 -0
  152. package/dist/providers/registry.test.d.ts.map +1 -0
  153. package/dist/providers/registry.test.js +89 -0
  154. package/dist/providers/registry.test.js.map +1 -0
  155. package/dist/schema/index.d.ts +8 -0
  156. package/dist/schema/index.d.ts.map +1 -0
  157. package/dist/schema/index.js +8 -0
  158. package/dist/schema/index.js.map +1 -0
  159. package/dist/schema/loader.d.ts +21 -0
  160. package/dist/schema/loader.d.ts.map +1 -0
  161. package/dist/schema/loader.js +68 -0
  162. package/dist/schema/loader.js.map +1 -0
  163. package/dist/schema/loader.test.d.ts +2 -0
  164. package/dist/schema/loader.test.d.ts.map +1 -0
  165. package/dist/schema/loader.test.js +111 -0
  166. package/dist/schema/loader.test.js.map +1 -0
  167. package/dist/schema/parser.d.ts +17 -0
  168. package/dist/schema/parser.d.ts.map +1 -0
  169. package/dist/schema/parser.js +55 -0
  170. package/dist/schema/parser.js.map +1 -0
  171. package/dist/schema/parser.test.d.ts +2 -0
  172. package/dist/schema/parser.test.d.ts.map +1 -0
  173. package/dist/schema/parser.test.js +62 -0
  174. package/dist/schema/parser.test.js.map +1 -0
  175. package/dist/schema/resolver.d.ts +16 -0
  176. package/dist/schema/resolver.d.ts.map +1 -0
  177. package/dist/schema/resolver.js +41 -0
  178. package/dist/schema/resolver.js.map +1 -0
  179. package/dist/schema/resolver.test.d.ts +2 -0
  180. package/dist/schema/resolver.test.d.ts.map +1 -0
  181. package/dist/schema/resolver.test.js +77 -0
  182. package/dist/schema/resolver.test.js.map +1 -0
  183. package/dist/schema/validator.d.ts +16 -0
  184. package/dist/schema/validator.d.ts.map +1 -0
  185. package/dist/schema/validator.js +21 -0
  186. package/dist/schema/validator.js.map +1 -0
  187. package/dist/schema/validator.test.d.ts +2 -0
  188. package/dist/schema/validator.test.d.ts.map +1 -0
  189. package/dist/schema/validator.test.js +40 -0
  190. package/dist/schema/validator.test.js.map +1 -0
  191. package/dist/test/fixtures/index.d.ts +39 -0
  192. package/dist/test/fixtures/index.d.ts.map +1 -0
  193. package/dist/test/fixtures/index.js +85 -0
  194. package/dist/test/fixtures/index.js.map +1 -0
  195. package/dist/test/fixtures/schema.basic.d.ts +16 -0
  196. package/dist/test/fixtures/schema.basic.d.ts.map +1 -0
  197. package/dist/test/fixtures/schema.basic.js +16 -0
  198. package/dist/test/fixtures/schema.basic.js.map +1 -0
  199. package/dist/test/fixtures/schema.basic.zod.d.ts +58 -0
  200. package/dist/test/fixtures/schema.basic.zod.d.ts.map +1 -0
  201. package/dist/test/fixtures/schema.basic.zod.js +16 -0
  202. package/dist/test/fixtures/schema.basic.zod.js.map +1 -0
  203. package/dist/validation/effect.d.ts +3 -0
  204. package/dist/validation/effect.d.ts.map +1 -0
  205. package/dist/validation/effect.js +368 -0
  206. package/dist/validation/effect.js.map +1 -0
  207. package/dist/validation/effect.test.d.ts +2 -0
  208. package/dist/validation/effect.test.d.ts.map +1 -0
  209. package/dist/validation/effect.test.js +137 -0
  210. package/dist/validation/effect.test.js.map +1 -0
  211. package/dist/validation/hash.d.ts +2 -0
  212. package/dist/validation/hash.d.ts.map +1 -0
  213. package/dist/validation/hash.js +27 -0
  214. package/dist/validation/hash.js.map +1 -0
  215. package/dist/validation/hash.test.d.ts +2 -0
  216. package/dist/validation/hash.test.d.ts.map +1 -0
  217. package/dist/validation/hash.test.js +25 -0
  218. package/dist/validation/hash.test.js.map +1 -0
  219. package/dist/validation/index.d.ts +7 -0
  220. package/dist/validation/index.d.ts.map +1 -0
  221. package/dist/validation/index.js +11 -0
  222. package/dist/validation/index.js.map +1 -0
  223. package/dist/validation/parse.d.ts +7 -0
  224. package/dist/validation/parse.d.ts.map +1 -0
  225. package/dist/validation/parse.js +44 -0
  226. package/dist/validation/parse.js.map +1 -0
  227. package/dist/validation/parse.test.d.ts +2 -0
  228. package/dist/validation/parse.test.d.ts.map +1 -0
  229. package/dist/validation/parse.test.js +47 -0
  230. package/dist/validation/parse.test.js.map +1 -0
  231. package/dist/validation/types.d.ts +33 -0
  232. package/dist/validation/types.d.ts.map +1 -0
  233. package/dist/validation/types.js +2 -0
  234. package/dist/validation/types.js.map +1 -0
  235. package/dist/validation/zod.d.ts +3 -0
  236. package/dist/validation/zod.d.ts.map +1 -0
  237. package/dist/validation/zod.js +326 -0
  238. package/dist/validation/zod.js.map +1 -0
  239. package/dist/validation/zod.test.d.ts +2 -0
  240. package/dist/validation/zod.test.d.ts.map +1 -0
  241. package/dist/validation/zod.test.js +161 -0
  242. package/dist/validation/zod.test.js.map +1 -0
  243. 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,8 @@
1
+ /**
2
+ * Lib module exports
3
+ */
4
+ export * from './merge.js';
5
+ export * from './flatten.js';
6
+ export * from './format.js';
7
+ export * from './redact.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * Lib module exports
3
+ */
4
+ export * from './merge.js';
5
+ export * from './flatten.js';
6
+ export * from './format.js';
7
+ export * from './redact.js';
8
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=merge.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.d.ts","sourceRoot":"","sources":["../../src/lib/merge.test.ts"],"names":[],"mappings":""}