@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,98 @@
1
+ /**
2
+ * Upsert Command
3
+ *
4
+ * Workflow: Input -> Resolve -> Parse -> Validate -> Serialize -> Push
5
+ */
6
+ import * as Effect from 'effect/Effect';
7
+ import { pipe } from 'effect/Function';
8
+ import {} from '../config.js';
9
+ import { encryptionVerificationFailedError, } from '../errors.js';
10
+ import { checkProviderGuards } from '../providers/guards.js';
11
+ import { EncryptionType } from '../providers/Provider.js';
12
+ import { getProvider } from '../providers/registry.js';
13
+ import { loadSchemaWithDefaults } from '../schema/loader.js';
14
+ import { parseValue, serializeValue } from '../schema/parser.js';
15
+ import { resolvePath } from '../schema/resolver.js';
16
+ import { validate } from '../schema/validator.js';
17
+ // --------------------------------------------------------------------------
18
+ // Helper Functions
19
+ // --------------------------------------------------------------------------
20
+ /**
21
+ * Read value from stdin
22
+ */
23
+ function readFromStdin() {
24
+ return Effect.promise(async () => {
25
+ const chunks = [];
26
+ for await (const chunk of process.stdin) {
27
+ chunks.push(chunk);
28
+ }
29
+ return Buffer.concat(chunks).toString('utf-8').trim();
30
+ });
31
+ }
32
+ // --------------------------------------------------------------------------
33
+ // Upsert Command
34
+ // --------------------------------------------------------------------------
35
+ /**
36
+ * Execute the upsert workflow
37
+ */
38
+ export function executeUpsert(options) {
39
+ return pipe(
40
+ // 1. Load schema
41
+ loadSchemaWithDefaults(options.config.schema, options.config.validation), Effect.flatMap(({ adapter, schema }) =>
42
+ // 2. Resolve and canonicalize the key path
43
+ pipe(resolvePath(schema, options.key, adapter), Effect.map((resolved) => ({ resolved, adapter })))), Effect.flatMap(({ adapter, resolved }) => {
44
+ const canonicalKey = resolved.canonicalPath;
45
+ // 3. Get the value
46
+ const valueEffect = options.stdin ? readFromStdin() : Effect.succeed(options.value ?? '');
47
+ return pipe(valueEffect, Effect.flatMap((rawValue) =>
48
+ // 4. Parse the value according to schema
49
+ pipe(parseValue(rawValue, resolved.schema, canonicalKey, options.type ?? 'auto', adapter), Effect.flatMap((parsedValue) =>
50
+ // 5. Validate the parsed value
51
+ pipe(validate(parsedValue, resolved.schema, adapter), Effect.map((validatedValue) => ({
52
+ canonicalKey,
53
+ validatedValue,
54
+ resolvedSchema: resolved.schema,
55
+ adapter,
56
+ })))))));
57
+ }), Effect.flatMap(({ adapter, canonicalKey, resolvedSchema, validatedValue }) => {
58
+ // 6. Serialize back to provider string format
59
+ const serialized = serializeValue(validatedValue, resolvedSchema, adapter);
60
+ const { config, service, skipEncryptionCheck = false } = options;
61
+ const ctx = {
62
+ prefix: config.ssmPrefix,
63
+ service,
64
+ env: config.env,
65
+ };
66
+ // 7. Get provider and push
67
+ return pipe(getProvider(config.provider), Effect.flatMap((provider) => pipe(checkProviderGuards(provider, ctx, config.providerGuards), Effect.flatMap(() => provider.upsert(ctx, canonicalKey, serialized)), Effect.flatMap(() => {
68
+ // 8. Verify encryption if supported and not skipped
69
+ if (!skipEncryptionCheck && provider.capabilities.encryptionVerification && provider.verifyEncryption) {
70
+ return pipe(provider.verifyEncryption(ctx, canonicalKey), Effect.map((encType) => {
71
+ if (encType !== EncryptionType.SECURE_STRING) {
72
+ console.error(`[config-o-tron] Warning: ${encryptionVerificationFailedError(canonicalKey).message}`);
73
+ return false;
74
+ }
75
+ return true;
76
+ }));
77
+ }
78
+ return Effect.succeed(true);
79
+ }), Effect.map((encrypted) => ({
80
+ canonicalKey,
81
+ value: validatedValue,
82
+ serialized,
83
+ encrypted,
84
+ })))));
85
+ }));
86
+ }
87
+ /**
88
+ * Run upsert and print result
89
+ */
90
+ export function runUpsert(options) {
91
+ return pipe(executeUpsert(options), Effect.map((result) => {
92
+ console.log(`Successfully wrote ${result.canonicalKey} to ${options.config.ssmPrefix}/${options.config.env}/${options.service}`);
93
+ if (!result.encrypted) {
94
+ console.warn('[config-o-tron] Warning: Value may not be encrypted as SecureString');
95
+ }
96
+ }));
97
+ }
98
+ //# sourceMappingURL=upsert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert.js","sourceRoot":"","sources":["../../src/commands/upsert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=upsert.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert.test.d.ts","sourceRoot":"","sources":["../../src/commands/upsert.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Upsert Command Tests
3
+ */
4
+ import { Readable } from 'node:stream';
5
+ import * as Effect from 'effect/Effect';
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
+ import {} from '../config.js';
8
+ import { EncryptionType } from '../providers/Provider.js';
9
+ import { registerProvider } from '../providers/registry.js';
10
+ import { createTestConfig, registerMockProviderWithData, schemaBasicPath } from '../test/fixtures/index.js';
11
+ import { executeUpsert, runUpsert } from './upsert.js';
12
+ describe('Upsert Command', () => {
13
+ let consoleSpy;
14
+ let consoleWarnSpy;
15
+ const baseConfig = createTestConfig({ schema: schemaBasicPath });
16
+ const buildConfig = (provider, overrides = {}) => ({
17
+ ...baseConfig,
18
+ provider,
19
+ ...overrides,
20
+ });
21
+ let providerCounter = 0;
22
+ const registerCustomProvider = (provider) => {
23
+ const name = `custom-provider-${providerCounter++}`;
24
+ registerProvider(name, () => provider);
25
+ return name;
26
+ };
27
+ beforeEach(() => {
28
+ consoleSpy = vi.spyOn(console, 'log').mockImplementation(vi.fn());
29
+ consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(vi.fn());
30
+ });
31
+ afterEach(() => {
32
+ vi.restoreAllMocks();
33
+ });
34
+ describe('executeUpsert', () => {
35
+ it('should upsert a string value', async () => {
36
+ const { name } = registerMockProviderWithData();
37
+ const result = await Effect.runPromise(executeUpsert({
38
+ service: 'api',
39
+ key: 'database.host',
40
+ value: 'localhost',
41
+ config: buildConfig(name),
42
+ }));
43
+ expect(result.canonicalKey).toBe('database.host');
44
+ expect(result.value).toBe('localhost');
45
+ expect(result.serialized).toBe('localhost');
46
+ });
47
+ it('should upsert an integer value', async () => {
48
+ const { name } = registerMockProviderWithData();
49
+ const result = await Effect.runPromise(executeUpsert({
50
+ service: 'api',
51
+ key: 'database.port',
52
+ value: '5432',
53
+ config: buildConfig(name),
54
+ }));
55
+ expect(result.canonicalKey).toBe('database.port');
56
+ expect(result.value).toBe(5432);
57
+ expect(result.serialized).toBe('5432');
58
+ });
59
+ it('should fail for invalid value type', async () => {
60
+ const { name } = registerMockProviderWithData();
61
+ const exit = await Effect.runPromiseExit(executeUpsert({
62
+ service: 'api',
63
+ key: 'database.port',
64
+ value: 'not-a-number',
65
+ config: buildConfig(name),
66
+ }));
67
+ expect(exit._tag).toBe('Failure');
68
+ });
69
+ it('should fail for constraint violation', async () => {
70
+ const { name } = registerMockProviderWithData();
71
+ const exit = await Effect.runPromiseExit(executeUpsert({
72
+ service: 'api',
73
+ key: 'database.port',
74
+ value: '99999',
75
+ config: buildConfig(name),
76
+ }));
77
+ expect(exit._tag).toBe('Failure');
78
+ });
79
+ it('should fail for unknown key', async () => {
80
+ const { name } = registerMockProviderWithData();
81
+ const exit = await Effect.runPromiseExit(executeUpsert({
82
+ service: 'api',
83
+ key: 'unknown.key',
84
+ value: 'value',
85
+ config: buildConfig(name),
86
+ }));
87
+ expect(exit._tag).toBe('Failure');
88
+ });
89
+ it('should store value in provider', async () => {
90
+ const { name, provider } = registerMockProviderWithData();
91
+ await Effect.runPromise(executeUpsert({
92
+ service: 'api',
93
+ key: 'database.host',
94
+ value: 'myhost.example.com',
95
+ config: buildConfig(name),
96
+ }));
97
+ const stored = await Effect.runPromise(provider.fetch({ prefix: '/config-o-tron', service: 'api', env: 'dev' }));
98
+ expect(stored['database.host']).toBe('myhost.example.com');
99
+ });
100
+ it('should use explicit type when provided', async () => {
101
+ const { name } = registerMockProviderWithData();
102
+ const result = await Effect.runPromise(executeUpsert({
103
+ service: 'api',
104
+ key: 'database.port',
105
+ value: '8080',
106
+ type: 'int',
107
+ config: buildConfig(name),
108
+ }));
109
+ expect(result.value).toBe(8080);
110
+ });
111
+ it('should read value from stdin when requested', async () => {
112
+ const { name } = registerMockProviderWithData();
113
+ const stdinDescriptor = Object.getOwnPropertyDescriptor(process, 'stdin');
114
+ const mockStdin = Readable.from([Buffer.from('5432\n')]);
115
+ Object.defineProperty(process, 'stdin', { value: mockStdin });
116
+ try {
117
+ const result = await Effect.runPromise(executeUpsert({
118
+ service: 'api',
119
+ key: 'database.port',
120
+ stdin: true,
121
+ config: buildConfig(name),
122
+ }));
123
+ expect(result.value).toBe(5432);
124
+ }
125
+ finally {
126
+ if (stdinDescriptor) {
127
+ Object.defineProperty(process, 'stdin', stdinDescriptor);
128
+ }
129
+ }
130
+ });
131
+ it('should skip encryption verification when requested', async () => {
132
+ const { name, provider } = registerMockProviderWithData();
133
+ const verifySpy = vi.spyOn(provider, 'verifyEncryption');
134
+ const result = await Effect.runPromise(executeUpsert({
135
+ service: 'api',
136
+ key: 'database.host',
137
+ value: 'localhost',
138
+ skipEncryptionCheck: true,
139
+ config: buildConfig(name),
140
+ }));
141
+ expect(result.encrypted).toBe(true);
142
+ expect(verifySpy).not.toHaveBeenCalled();
143
+ });
144
+ it('should default to empty string when value is missing', async () => {
145
+ const { name } = registerMockProviderWithData();
146
+ const result = await Effect.runPromise(executeUpsert({
147
+ service: 'api',
148
+ key: 'database.host',
149
+ config: buildConfig(name),
150
+ }));
151
+ expect(result.value).toBe('');
152
+ expect(result.serialized).toBe('');
153
+ });
154
+ });
155
+ describe('runUpsert', () => {
156
+ it('should print success message', async () => {
157
+ const { name } = registerMockProviderWithData();
158
+ await Effect.runPromise(runUpsert({
159
+ service: 'api',
160
+ key: 'database.host',
161
+ value: 'localhost',
162
+ config: buildConfig(name),
163
+ }));
164
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Successfully wrote database.host'));
165
+ });
166
+ it('should warn if value may not be encrypted', async () => {
167
+ const { provider } = registerMockProviderWithData();
168
+ const nonEncryptingProvider = {
169
+ ...provider,
170
+ capabilities: { ...provider.capabilities, encryptionVerification: true },
171
+ verifyEncryption: () => Effect.succeed(EncryptionType.STRING),
172
+ };
173
+ const name = registerCustomProvider(nonEncryptingProvider);
174
+ await Effect.runPromise(runUpsert({
175
+ service: 'api',
176
+ key: 'database.host',
177
+ value: 'localhost',
178
+ config: buildConfig(name),
179
+ }));
180
+ expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining('Warning: Value may not be encrypted'));
181
+ });
182
+ });
183
+ });
184
+ //# sourceMappingURL=upsert.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert.test.js","sourceRoot":"","sources":["../../src/commands/upsert.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import * as Effect from 'effect/Effect';
2
+ import { type ResolvedConfig } from '../config.js';
3
+ import { type ConfigOTronError, type SystemError, type ValidationError } from '../errors.js';
4
+ export type ValidateOptions = {
5
+ readonly file: string;
6
+ readonly format?: 'env' | 'json' | undefined;
7
+ readonly config: ResolvedConfig;
8
+ };
9
+ export type ValidateResult = {
10
+ readonly valid: boolean;
11
+ readonly errors: ReadonlyArray<ValidationError>;
12
+ readonly parsed: Record<string, unknown>;
13
+ readonly warnings: ReadonlyArray<string>;
14
+ };
15
+ /**
16
+ * Execute the validate workflow
17
+ */
18
+ export declare function executeValidate(options: ValidateOptions): Effect.Effect<ValidateResult, SystemError | ValidationError | ConfigOTronError>;
19
+ /**
20
+ * Run validate and print results
21
+ */
22
+ export declare function runValidate(options: ValidateOptions): Effect.Effect<boolean, SystemError | ValidationError | ConfigOTronError>;
23
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,WAAW,EAEhB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AAatB,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC1C,CAAC;AAMF;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,GACvB,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,GAAG,eAAe,GAAG,gBAAgB,CAAC,CA6GjF;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,eAAe,GACvB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,eAAe,GAAG,gBAAgB,CAAC,CAwB1E"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Validate Command
3
+ *
4
+ * Workflow: Input -> Parse -> Validate -> Report
5
+ */
6
+ import * as fs from 'node:fs';
7
+ import * as Effect from 'effect/Effect';
8
+ import { pipe } from 'effect/Function';
9
+ import {} from '../config.js';
10
+ import { fileNotFoundError, formatError, unknownKeysError, } from '../errors.js';
11
+ import { flatten, pathToEnvKey } from '../lib/flatten.js';
12
+ import { detectFormat, parseEnvContent } from '../lib/format.js';
13
+ import { validateAll } from '../schema/index.js';
14
+ import { loadSchemaWithDefaults } from '../schema/loader.js';
15
+ import { parseProviderKV } from '../schema/parser.js';
16
+ import { getAllLeafPaths, validateKeyPathSegments } from '../schema/resolver.js';
17
+ // --------------------------------------------------------------------------
18
+ // Validate Command
19
+ // --------------------------------------------------------------------------
20
+ /**
21
+ * Execute the validate workflow
22
+ */
23
+ export function executeValidate(options) {
24
+ return pipe(Effect.sync(() => {
25
+ // 1. Check file exists
26
+ if (!fs.existsSync(options.file)) {
27
+ return { exists: false, content: '' };
28
+ }
29
+ return { exists: true, content: '' };
30
+ }), Effect.flatMap(({ exists }) => {
31
+ if (!exists) {
32
+ return Effect.fail(fileNotFoundError(options.file));
33
+ }
34
+ // 2. Read file content
35
+ return Effect.try({
36
+ try: () => fs.readFileSync(options.file, 'utf-8'),
37
+ catch: () => fileNotFoundError(options.file),
38
+ });
39
+ }), Effect.flatMap((content) => {
40
+ // 3. Detect or use specified format
41
+ const format = options.format ?? detectFormat(content);
42
+ if (format === 'unknown') {
43
+ return Effect.fail(fileNotFoundError(`Unable to detect format of ${options.file}`));
44
+ }
45
+ return pipe(loadSchemaWithDefaults(options.config.schema, options.config.validation), Effect.flatMap(({ adapter, schema }) => {
46
+ if (format === 'json') {
47
+ return pipe(Effect.try({
48
+ try: () => JSON.parse(content),
49
+ catch: () => fileNotFoundError(`Invalid JSON in ${options.file}`),
50
+ }), Effect.flatMap((parsed) => pipe(collectUnknownKeys(parsed, schema, adapter), Effect.flatMap((unknownKeys) => {
51
+ if (unknownKeys.length > 0 && options.config.strict) {
52
+ return Effect.fail(unknownKeysError(unknownKeys));
53
+ }
54
+ const warnings = unknownKeys.length > 0 ? [`Unknown keys in ${options.file}: ${unknownKeys.join(', ')}`] : [];
55
+ return pipe(validateAll(parsed, schema, adapter), Effect.map((result) => ({
56
+ valid: result.errors.length === 0,
57
+ errors: result.errors,
58
+ parsed: result.value,
59
+ warnings,
60
+ })));
61
+ }))));
62
+ }
63
+ const envMap = parseEnvContent(content);
64
+ const envKeyMap = buildEnvKeyMap(schema, adapter, options.config.separator);
65
+ const unknownEnvKeys = Object.keys(envMap).filter((key) => !envKeyMap.has(key));
66
+ if (unknownEnvKeys.length > 0 && options.config.strict) {
67
+ return Effect.fail(unknownKeysError(unknownEnvKeys));
68
+ }
69
+ const warnings = unknownEnvKeys.length > 0 ? [`Unknown keys in ${options.file}: ${unknownEnvKeys.join(', ')}`] : [];
70
+ const kv = {};
71
+ for (const [envKey, value] of Object.entries(envMap)) {
72
+ const path = envKeyMap.get(envKey);
73
+ if (!path) {
74
+ continue;
75
+ }
76
+ kv[path] = value;
77
+ }
78
+ return pipe(parseProviderKV(kv, schema, adapter), Effect.flatMap((parsedResult) => {
79
+ if (parsedResult.unknownKeys.length > 0 && options.config.strict) {
80
+ return Effect.fail(unknownKeysError(parsedResult.unknownKeys));
81
+ }
82
+ const combinedWarnings = parsedResult.unknownKeys.length > 0
83
+ ? warnings.concat(`Unknown keys in ${options.file}: ${parsedResult.unknownKeys.join(', ')}`)
84
+ : warnings;
85
+ return pipe(validateAll(parsedResult.parsed, schema, adapter), Effect.map((result) => ({
86
+ valid: result.errors.length === 0,
87
+ errors: result.errors,
88
+ parsed: result.value,
89
+ warnings: combinedWarnings,
90
+ })));
91
+ }));
92
+ }));
93
+ }));
94
+ }
95
+ /**
96
+ * Run validate and print results
97
+ */
98
+ export function runValidate(options) {
99
+ return pipe(executeValidate(options), Effect.map((result) => {
100
+ for (const warning of result.warnings) {
101
+ console.error(`[config-o-tron] Warning: ${warning}`);
102
+ }
103
+ if (result.valid) {
104
+ console.log(`Validation passed: ${options.file}`);
105
+ return true;
106
+ }
107
+ console.error(`Validation failed: ${options.file}`);
108
+ console.error('');
109
+ for (const error of result.errors) {
110
+ console.error(formatError(error));
111
+ console.error('');
112
+ }
113
+ return false;
114
+ }));
115
+ }
116
+ // --------------------------------------------------------------------------
117
+ // Helpers
118
+ // --------------------------------------------------------------------------
119
+ function buildEnvKeyMap(schema, adapter, separator) {
120
+ const envKeyMap = new Map();
121
+ const leafPaths = getAllLeafPaths(schema, adapter)
122
+ .map((entry) => entry.path)
123
+ .filter((path) => path.length > 0);
124
+ for (const path of leafPaths) {
125
+ envKeyMap.set(pathToEnvKey(path, separator), path);
126
+ }
127
+ return envKeyMap;
128
+ }
129
+ function collectUnknownKeys(parsed, schema, adapter) {
130
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
131
+ return Effect.succeed([]);
132
+ }
133
+ const leafPaths = getAllLeafPaths(schema, adapter).map((entry) => entry.path);
134
+ const knownPaths = new Set(leafPaths.filter((path) => path.length > 0));
135
+ const flat = flatten(parsed);
136
+ return pipe(Effect.forEach(Object.keys(flat), (key) => validateKeyPathSegments(key)), Effect.map(() => Object.keys(flat).filter((key) => !knownPaths.has(key))));
137
+ }
138
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.test.d.ts","sourceRoot":"","sources":["../../src/commands/validate.test.ts"],"names":[],"mappings":""}