@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,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flatten/Unflatten Tests
|
|
3
|
+
*/
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { camelToScreamingSnake, envKeyToPath, flatten, getSortedKeys, pathToEnvKey, screamingSnakeToCamel, toEnvMap, unflatten, } from './flatten.js';
|
|
6
|
+
describe('flatten', () => {
|
|
7
|
+
describe('flatten', () => {
|
|
8
|
+
it('should flatten simple object', () => {
|
|
9
|
+
const input = {
|
|
10
|
+
database: {
|
|
11
|
+
host: 'localhost',
|
|
12
|
+
port: 5432,
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
const result = flatten(input);
|
|
16
|
+
expect(result).toEqual({
|
|
17
|
+
'database.host': 'localhost',
|
|
18
|
+
'database.port': 5432,
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
it('should flatten deeply nested object', () => {
|
|
22
|
+
const input = {
|
|
23
|
+
level1: {
|
|
24
|
+
level2: {
|
|
25
|
+
level3: {
|
|
26
|
+
value: 'deep',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const result = flatten(input);
|
|
32
|
+
expect(result).toEqual({
|
|
33
|
+
'level1.level2.level3.value': 'deep',
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('should handle arrays as values', () => {
|
|
37
|
+
const input = {
|
|
38
|
+
config: {
|
|
39
|
+
tags: ['a', 'b', 'c'],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
const result = flatten(input);
|
|
43
|
+
expect(result).toEqual({
|
|
44
|
+
'config.tags': ['a', 'b', 'c'],
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it('should handle null values', () => {
|
|
48
|
+
const input = {
|
|
49
|
+
nullable: null,
|
|
50
|
+
nested: {
|
|
51
|
+
also: null,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const result = flatten(input);
|
|
55
|
+
expect(result).toEqual({
|
|
56
|
+
nullable: null,
|
|
57
|
+
'nested.also': null,
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it('should handle empty object', () => {
|
|
61
|
+
const result = flatten({});
|
|
62
|
+
expect(result).toEqual({});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('unflatten', () => {
|
|
66
|
+
it('should unflatten simple paths', () => {
|
|
67
|
+
const input = {
|
|
68
|
+
'database.host': 'localhost',
|
|
69
|
+
'database.port': '5432',
|
|
70
|
+
};
|
|
71
|
+
const result = unflatten(input);
|
|
72
|
+
expect(result).toEqual({
|
|
73
|
+
database: {
|
|
74
|
+
host: 'localhost',
|
|
75
|
+
port: '5432',
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
it('should unflatten deep paths', () => {
|
|
80
|
+
const input = {
|
|
81
|
+
'a.b.c.d': 'value',
|
|
82
|
+
};
|
|
83
|
+
const result = unflatten(input);
|
|
84
|
+
expect(result).toEqual({
|
|
85
|
+
a: {
|
|
86
|
+
b: {
|
|
87
|
+
c: {
|
|
88
|
+
d: 'value',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
it('should handle multiple paths to same object', () => {
|
|
95
|
+
const input = {
|
|
96
|
+
'db.host': 'localhost',
|
|
97
|
+
'db.port': '5432',
|
|
98
|
+
'db.name': 'mydb',
|
|
99
|
+
};
|
|
100
|
+
const result = unflatten(input);
|
|
101
|
+
expect(result).toEqual({
|
|
102
|
+
db: {
|
|
103
|
+
host: 'localhost',
|
|
104
|
+
port: '5432',
|
|
105
|
+
name: 'mydb',
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('pathToEnvKey', () => {
|
|
111
|
+
it('should convert dot notation to SCREAMING_SNAKE_CASE', () => {
|
|
112
|
+
expect(pathToEnvKey('database.host')).toBe('DATABASE_HOST');
|
|
113
|
+
expect(pathToEnvKey('server.port')).toBe('SERVER_PORT');
|
|
114
|
+
});
|
|
115
|
+
it('should handle camelCase segments', () => {
|
|
116
|
+
expect(pathToEnvKey('myService.apiKey')).toBe('MY_SERVICE_API_KEY');
|
|
117
|
+
expect(pathToEnvKey('database.connectionString')).toBe('DATABASE_CONNECTION_STRING');
|
|
118
|
+
});
|
|
119
|
+
it('should handle single segment', () => {
|
|
120
|
+
expect(pathToEnvKey('port')).toBe('PORT');
|
|
121
|
+
expect(pathToEnvKey('apiKey')).toBe('API_KEY');
|
|
122
|
+
});
|
|
123
|
+
it('should handle custom separator', () => {
|
|
124
|
+
expect(pathToEnvKey('database.host', '__')).toBe('DATABASE__HOST');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('envKeyToPath', () => {
|
|
128
|
+
it('should convert SCREAMING_SNAKE_CASE to dot notation', () => {
|
|
129
|
+
expect(envKeyToPath('DATABASE_HOST')).toBe('database.host');
|
|
130
|
+
expect(envKeyToPath('SERVER_PORT')).toBe('server.port');
|
|
131
|
+
});
|
|
132
|
+
it('should handle single word', () => {
|
|
133
|
+
expect(envKeyToPath('PORT')).toBe('port');
|
|
134
|
+
});
|
|
135
|
+
it('should handle custom separator', () => {
|
|
136
|
+
expect(envKeyToPath('DATABASE__HOST', '__')).toBe('database.host');
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('camelToScreamingSnake', () => {
|
|
140
|
+
it('should convert camelCase', () => {
|
|
141
|
+
expect(camelToScreamingSnake('timeoutMs')).toBe('TIMEOUT_MS');
|
|
142
|
+
expect(camelToScreamingSnake('enableBeta')).toBe('ENABLE_BETA');
|
|
143
|
+
});
|
|
144
|
+
it('should handle consecutive uppercase', () => {
|
|
145
|
+
expect(camelToScreamingSnake('APIKey')).toBe('API_KEY');
|
|
146
|
+
});
|
|
147
|
+
it('should handle already uppercase', () => {
|
|
148
|
+
expect(camelToScreamingSnake('API')).toBe('API');
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('screamingSnakeToCamel', () => {
|
|
152
|
+
it('should convert SCREAMING_SNAKE_CASE to camelCase', () => {
|
|
153
|
+
expect(screamingSnakeToCamel('TIMEOUT_MS')).toBe('timeoutMs');
|
|
154
|
+
expect(screamingSnakeToCamel('ENABLE_BETA')).toBe('enableBeta');
|
|
155
|
+
});
|
|
156
|
+
it('should handle single word', () => {
|
|
157
|
+
expect(screamingSnakeToCamel('PORT')).toBe('port');
|
|
158
|
+
});
|
|
159
|
+
it('should handle multiple underscores', () => {
|
|
160
|
+
expect(screamingSnakeToCamel('MY_LONG_VARIABLE_NAME')).toBe('myLongVariableName');
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('toEnvMap', () => {
|
|
164
|
+
it('should convert nested object to env map', () => {
|
|
165
|
+
const obj = {
|
|
166
|
+
database: {
|
|
167
|
+
host: 'localhost',
|
|
168
|
+
port: 5432,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
const result = toEnvMap(obj);
|
|
172
|
+
expect(result).toEqual({
|
|
173
|
+
DATABASE_HOST: 'localhost',
|
|
174
|
+
DATABASE_PORT: 5432,
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
it('should handle camelCase keys', () => {
|
|
178
|
+
const obj = {
|
|
179
|
+
apiKey: 'secret',
|
|
180
|
+
timeoutMs: 5000,
|
|
181
|
+
};
|
|
182
|
+
const result = toEnvMap(obj);
|
|
183
|
+
expect(result).toEqual({
|
|
184
|
+
API_KEY: 'secret',
|
|
185
|
+
TIMEOUT_MS: 5000,
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
it('should handle custom separator', () => {
|
|
189
|
+
const obj = {
|
|
190
|
+
database: {
|
|
191
|
+
host: 'localhost',
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
const result = toEnvMap(obj, '__');
|
|
195
|
+
expect(result).toEqual({
|
|
196
|
+
DATABASE__HOST: 'localhost',
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
it('should handle empty object', () => {
|
|
200
|
+
const result = toEnvMap({});
|
|
201
|
+
expect(result).toEqual({});
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe('getSortedKeys', () => {
|
|
205
|
+
it('should sort keys case-insensitively', () => {
|
|
206
|
+
const obj = {
|
|
207
|
+
Zebra: 1,
|
|
208
|
+
apple: 2,
|
|
209
|
+
BANANA: 3,
|
|
210
|
+
};
|
|
211
|
+
const result = getSortedKeys(obj);
|
|
212
|
+
expect(result).toEqual(['apple', 'BANANA', 'Zebra']);
|
|
213
|
+
});
|
|
214
|
+
it('should handle empty object', () => {
|
|
215
|
+
const result = getSortedKeys({});
|
|
216
|
+
expect(result).toEqual([]);
|
|
217
|
+
});
|
|
218
|
+
it('should handle keys with same lowercase', () => {
|
|
219
|
+
const obj = {
|
|
220
|
+
AAA: 1,
|
|
221
|
+
aaa: 2,
|
|
222
|
+
Aaa: 3,
|
|
223
|
+
};
|
|
224
|
+
const result = getSortedKeys(obj);
|
|
225
|
+
// All have same lowercase, order is stable
|
|
226
|
+
expect(result).toHaveLength(3);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=flatten.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten.test.js","sourceRoot":"","sources":["../../src/lib/flatten.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type FormatOptions = {
|
|
2
|
+
readonly separator?: string;
|
|
3
|
+
readonly sortKeys?: boolean;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Format a configuration object as .env content
|
|
7
|
+
*
|
|
8
|
+
* @param config - The configuration object (nested or flat)
|
|
9
|
+
* @param options - Format options
|
|
10
|
+
* @returns .env file content as string
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatEnv(config: Record<string, unknown>, options?: FormatOptions): string;
|
|
13
|
+
/**
|
|
14
|
+
* Format a configuration object as JSON content
|
|
15
|
+
*
|
|
16
|
+
* @param config - The configuration object
|
|
17
|
+
* @param pretty - Whether to pretty-print (default: true)
|
|
18
|
+
* @returns JSON content as string
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatJson(config: Record<string, unknown>, pretty?: boolean): string;
|
|
21
|
+
/**
|
|
22
|
+
* Format a configuration object in the specified format
|
|
23
|
+
*
|
|
24
|
+
* @param config - The configuration object
|
|
25
|
+
* @param format - Output format ("env" or "json")
|
|
26
|
+
* @param options - Format options
|
|
27
|
+
* @returns Formatted content as string
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatConfig(config: Record<string, unknown>, format: 'env' | 'json', options?: FormatOptions): string;
|
|
30
|
+
/**
|
|
31
|
+
* Parse .env file content
|
|
32
|
+
*
|
|
33
|
+
* @param content - .env file content
|
|
34
|
+
* @returns Flat key-value map
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseEnvContent(content: string): Record<string, string>;
|
|
37
|
+
/**
|
|
38
|
+
* Detect file format from content
|
|
39
|
+
*/
|
|
40
|
+
export declare function detectFormat(content: string): 'env' | 'json' | 'unknown';
|
|
41
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AA4EF;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAwB9F;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,UAAO,GAAG,MAAM,CAEjF;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAOR;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgCvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAoBxE"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Formatting
|
|
3
|
+
*
|
|
4
|
+
* Converts configuration objects to .env or JSON format
|
|
5
|
+
*/
|
|
6
|
+
import { flatten, getSortedKeys, pathToEnvKey } from './flatten.js';
|
|
7
|
+
// --------------------------------------------------------------------------
|
|
8
|
+
// Value Serialization
|
|
9
|
+
// --------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Check if a string needs quoting in .env format
|
|
12
|
+
*/
|
|
13
|
+
function needsQuoting(value) {
|
|
14
|
+
// Needs quoting if:
|
|
15
|
+
// - Contains spaces, #, =, newlines, or $
|
|
16
|
+
// - Starts or ends with whitespace
|
|
17
|
+
// - Is empty
|
|
18
|
+
if (value.length === 0) {
|
|
19
|
+
// Empty string can be KEY= without quotes
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (value.startsWith(' ') || value.endsWith(' '))
|
|
23
|
+
return true;
|
|
24
|
+
if (/[\s#=$\n]/.test(value))
|
|
25
|
+
return true;
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Escape a string for double-quoted .env value
|
|
30
|
+
*/
|
|
31
|
+
function escapeEnvValue(value) {
|
|
32
|
+
return value
|
|
33
|
+
.replace(/\\/g, '\\\\') // Backslash first
|
|
34
|
+
.replace(/"/g, '\\"') // Quotes
|
|
35
|
+
.replace(/\n/g, '\\n'); // Newlines
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Serialize a value for .env format
|
|
39
|
+
*/
|
|
40
|
+
function serializeEnvValue(value) {
|
|
41
|
+
if (value === undefined) {
|
|
42
|
+
// Omit undefined values
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
if (value === null) {
|
|
46
|
+
// Omit null values in .env format
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
if (typeof value === 'string') {
|
|
50
|
+
if (needsQuoting(value)) {
|
|
51
|
+
return `"${escapeEnvValue(value)}"`;
|
|
52
|
+
}
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
if (typeof value === 'number') {
|
|
56
|
+
return String(value);
|
|
57
|
+
}
|
|
58
|
+
if (typeof value === 'boolean') {
|
|
59
|
+
return value ? 'true' : 'false';
|
|
60
|
+
}
|
|
61
|
+
if (Array.isArray(value) || typeof value === 'object') {
|
|
62
|
+
// Arrays and objects are serialized as minified JSON
|
|
63
|
+
const json = JSON.stringify(value);
|
|
64
|
+
// JSON always needs quoting since it contains special chars
|
|
65
|
+
return `"${escapeEnvValue(json)}"`;
|
|
66
|
+
}
|
|
67
|
+
return String(value);
|
|
68
|
+
}
|
|
69
|
+
// --------------------------------------------------------------------------
|
|
70
|
+
// Format Functions
|
|
71
|
+
// --------------------------------------------------------------------------
|
|
72
|
+
/**
|
|
73
|
+
* Format a configuration object as .env content
|
|
74
|
+
*
|
|
75
|
+
* @param config - The configuration object (nested or flat)
|
|
76
|
+
* @param options - Format options
|
|
77
|
+
* @returns .env file content as string
|
|
78
|
+
*/
|
|
79
|
+
export function formatEnv(config, options = {}) {
|
|
80
|
+
const separator = options.separator ?? '_';
|
|
81
|
+
const sortKeys = options.sortKeys ?? true;
|
|
82
|
+
// Flatten if nested
|
|
83
|
+
const flat = flatten(config);
|
|
84
|
+
// Convert to env keys
|
|
85
|
+
const envMap = {};
|
|
86
|
+
for (const [path, value] of Object.entries(flat)) {
|
|
87
|
+
const envKey = pathToEnvKey(path, separator);
|
|
88
|
+
const serialized = serializeEnvValue(value);
|
|
89
|
+
if (serialized !== undefined) {
|
|
90
|
+
envMap[envKey] = serialized;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Sort keys
|
|
94
|
+
const keys = sortKeys ? getSortedKeys(envMap) : Object.keys(envMap);
|
|
95
|
+
// Build output
|
|
96
|
+
const lines = keys.map((key) => `${key}=${envMap[key]}`);
|
|
97
|
+
return lines.join('\n') + (lines.length > 0 ? '\n' : '');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Format a configuration object as JSON content
|
|
101
|
+
*
|
|
102
|
+
* @param config - The configuration object
|
|
103
|
+
* @param pretty - Whether to pretty-print (default: true)
|
|
104
|
+
* @returns JSON content as string
|
|
105
|
+
*/
|
|
106
|
+
export function formatJson(config, pretty = true) {
|
|
107
|
+
return pretty ? JSON.stringify(config, null, 2) + '\n' : JSON.stringify(config) + '\n';
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Format a configuration object in the specified format
|
|
111
|
+
*
|
|
112
|
+
* @param config - The configuration object
|
|
113
|
+
* @param format - Output format ("env" or "json")
|
|
114
|
+
* @param options - Format options
|
|
115
|
+
* @returns Formatted content as string
|
|
116
|
+
*/
|
|
117
|
+
export function formatConfig(config, format, options = {}) {
|
|
118
|
+
switch (format) {
|
|
119
|
+
case 'env':
|
|
120
|
+
return formatEnv(config, options);
|
|
121
|
+
case 'json':
|
|
122
|
+
return formatJson(config);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// --------------------------------------------------------------------------
|
|
126
|
+
// Parse Functions (for validate command)
|
|
127
|
+
// --------------------------------------------------------------------------
|
|
128
|
+
/**
|
|
129
|
+
* Parse .env file content
|
|
130
|
+
*
|
|
131
|
+
* @param content - .env file content
|
|
132
|
+
* @returns Flat key-value map
|
|
133
|
+
*/
|
|
134
|
+
export function parseEnvContent(content) {
|
|
135
|
+
const result = {};
|
|
136
|
+
const lines = content.split('\n');
|
|
137
|
+
for (const line of lines) {
|
|
138
|
+
const trimmed = line.trim();
|
|
139
|
+
// Skip empty lines and comments
|
|
140
|
+
if (trimmed === '' || trimmed.startsWith('#')) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// Find the first = sign
|
|
144
|
+
const eqIndex = trimmed.indexOf('=');
|
|
145
|
+
if (eqIndex === -1) {
|
|
146
|
+
continue; // Invalid line, skip
|
|
147
|
+
}
|
|
148
|
+
const key = trimmed.slice(0, eqIndex);
|
|
149
|
+
let value = trimmed.slice(eqIndex + 1);
|
|
150
|
+
// Handle quoted values
|
|
151
|
+
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
152
|
+
value = value.slice(1, -1);
|
|
153
|
+
// Unescape
|
|
154
|
+
value = value.replace(/\\n/g, '\n').replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
|
155
|
+
}
|
|
156
|
+
result[key] = value;
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Detect file format from content
|
|
162
|
+
*/
|
|
163
|
+
export function detectFormat(content) {
|
|
164
|
+
const trimmed = content.trim();
|
|
165
|
+
// Check for JSON
|
|
166
|
+
if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
|
|
167
|
+
try {
|
|
168
|
+
JSON.parse(trimmed);
|
|
169
|
+
return 'json';
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Not valid JSON
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Check for .env format (KEY=VALUE lines)
|
|
176
|
+
const lines = trimmed.split('\n').filter((l) => l.trim() !== '' && !l.trim().startsWith('#'));
|
|
177
|
+
if (lines.length > 0 && lines.every((l) => /^[A-Z_][A-Z0-9_]*=/.test(l.trim()))) {
|
|
178
|
+
return 'env';
|
|
179
|
+
}
|
|
180
|
+
return 'unknown';
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAWpE,6EAA6E;AAC7E,sBAAsB;AACtB,6EAA6E;AAE7E;;GAEG;AACH,SAAS,YAAY,CAAC,KAAa;IACjC,oBAAoB;IACpB,0CAA0C;IAC1C,mCAAmC;IACnC,aAAa;IACb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,0CAA0C;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,kBAAkB;SACzC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;SAC9B,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,wBAAwB;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,kCAAkC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;QACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtD,qDAAqD;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,4DAA4D;QAC5D,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,6EAA6E;AAC7E,mBAAmB;AACnB,6EAA6E;AAE7E;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,MAA+B,EAAE,UAAyB,EAAE;IACpF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IAE1C,oBAAoB;IACpB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7B,sBAAsB;IACtB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,YAAY;IACZ,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpE,eAAe;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,MAA+B,EAAE,MAAM,GAAG,IAAI;IACvE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACzF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,MAA+B,EAC/B,MAAsB,EACtB,UAAyB,EAAE;IAE3B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,yCAAyC;AACzC,6EAA6E;AAE7E;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,gCAAgC;QAChC,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,wBAAwB;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,SAAS,CAAC,qBAAqB;QACjC,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAEvC,uBAAuB;QACvB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3B,WAAW;YACX,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,iBAAiB;IACjB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.test.d.ts","sourceRoot":"","sources":["../../src/lib/format.test.ts"],"names":[],"mappings":""}
|