@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,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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"validate.test.d.ts","sourceRoot":"","sources":["../../src/commands/validate.test.ts"],"names":[],"mappings":""}
|