@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,166 @@
1
+ /**
2
+ * MockProvider Tests
3
+ */
4
+ import * as Effect from 'effect/Effect';
5
+ import { beforeEach, describe, expect, it } from 'vitest';
6
+ import { createMockProvider, mockProvider } from './MockProvider.js';
7
+ describe('MockProvider', () => {
8
+ const ctx = {
9
+ prefix: '/config-o-tron',
10
+ service: 'test-service',
11
+ env: 'dev',
12
+ };
13
+ describe('mockProvider (default instance)', () => {
14
+ it('should have expected capabilities', () => {
15
+ expect(mockProvider.capabilities.secureWrite).toBe(true);
16
+ expect(mockProvider.capabilities.encryptionVerification).toBe(true);
17
+ });
18
+ it('should have name mock', () => {
19
+ expect(mockProvider.name).toBe('mock');
20
+ });
21
+ });
22
+ describe('createMockProvider', () => {
23
+ it('should create provider with empty storage', async () => {
24
+ const provider = createMockProvider();
25
+ const result = await Effect.runPromise(provider.fetch(ctx));
26
+ expect(result).toEqual({});
27
+ });
28
+ it('should create provider with initial data', async () => {
29
+ const storageKey = `${ctx.prefix}/${ctx.env}/${ctx.service}`;
30
+ const provider = createMockProvider({
31
+ [storageKey]: {
32
+ 'database.host': 'localhost',
33
+ 'database.port': '5432',
34
+ },
35
+ });
36
+ const result = await Effect.runPromise(provider.fetch(ctx));
37
+ expect(result).toEqual({
38
+ 'database.host': 'localhost',
39
+ 'database.port': '5432',
40
+ });
41
+ });
42
+ it('should expose storage for inspection', () => {
43
+ const provider = createMockProvider();
44
+ expect(provider.storage).toBeDefined();
45
+ expect(provider.storage.size).toBe(0);
46
+ });
47
+ });
48
+ describe('fetch', () => {
49
+ let provider;
50
+ beforeEach(() => {
51
+ provider = createMockProvider();
52
+ });
53
+ it('should fetch empty object when no data', async () => {
54
+ const result = await Effect.runPromise(provider.fetch(ctx));
55
+ expect(result).toEqual({});
56
+ });
57
+ it('should fetch service-specific data', async () => {
58
+ const ctx1 = { ...ctx, service: 'service-1' };
59
+ const ctx2 = { ...ctx, service: 'service-2' };
60
+ await Effect.runPromise(provider.upsert(ctx1, 'key1', 'value1'));
61
+ await Effect.runPromise(provider.upsert(ctx2, 'key2', 'value2'));
62
+ const result1 = await Effect.runPromise(provider.fetch(ctx1));
63
+ const result2 = await Effect.runPromise(provider.fetch(ctx2));
64
+ expect(result1).toEqual({ key1: 'value1' });
65
+ expect(result2).toEqual({ key2: 'value2' });
66
+ });
67
+ it('should fetch env-specific data', async () => {
68
+ const devCtx = { ...ctx, env: 'dev' };
69
+ const prodCtx = { ...ctx, env: 'prod' };
70
+ await Effect.runPromise(provider.upsert(devCtx, 'url', 'http://dev.local'));
71
+ await Effect.runPromise(provider.upsert(prodCtx, 'url', 'https://prod.example.com'));
72
+ const devResult = await Effect.runPromise(provider.fetch(devCtx));
73
+ const prodResult = await Effect.runPromise(provider.fetch(prodCtx));
74
+ expect(devResult).toEqual({ url: 'http://dev.local' });
75
+ expect(prodResult).toEqual({ url: 'https://prod.example.com' });
76
+ });
77
+ });
78
+ describe('upsert', () => {
79
+ let provider;
80
+ beforeEach(() => {
81
+ provider = createMockProvider();
82
+ });
83
+ it('should add new key', async () => {
84
+ await Effect.runPromise(provider.upsert(ctx, 'new.key', 'new-value'));
85
+ const result = await Effect.runPromise(provider.fetch(ctx));
86
+ expect(result['new.key']).toBe('new-value');
87
+ });
88
+ it('should update existing key', async () => {
89
+ await Effect.runPromise(provider.upsert(ctx, 'existing.key', 'old-value'));
90
+ await Effect.runPromise(provider.upsert(ctx, 'existing.key', 'new-value'));
91
+ const result = await Effect.runPromise(provider.fetch(ctx));
92
+ expect(result['existing.key']).toBe('new-value');
93
+ });
94
+ it('should preserve other keys when upserting', async () => {
95
+ await Effect.runPromise(provider.upsert(ctx, 'key1', 'value1'));
96
+ await Effect.runPromise(provider.upsert(ctx, 'key2', 'value2'));
97
+ await Effect.runPromise(provider.upsert(ctx, 'key1', 'updated'));
98
+ const result = await Effect.runPromise(provider.fetch(ctx));
99
+ expect(result).toEqual({
100
+ key1: 'updated',
101
+ key2: 'value2',
102
+ });
103
+ });
104
+ });
105
+ describe('delete', () => {
106
+ let provider;
107
+ beforeEach(() => {
108
+ provider = createMockProvider();
109
+ });
110
+ it('should delete existing key', async () => {
111
+ await Effect.runPromise(provider.upsert(ctx, 'key1', 'value1'));
112
+ await Effect.runPromise(provider.upsert(ctx, 'key2', 'value2'));
113
+ await Effect.runPromise(provider.delete(ctx, 'key1'));
114
+ const result = await Effect.runPromise(provider.fetch(ctx));
115
+ expect(result).toEqual({ key2: 'value2' });
116
+ });
117
+ it('should fail when deleting non-existent key', async () => {
118
+ await expect(Effect.runPromise(provider.delete(ctx, 'nonexistent'))).rejects.toThrow();
119
+ });
120
+ });
121
+ describe('verifyEncryption', () => {
122
+ it('should return SecureString by default', async () => {
123
+ const provider = createMockProvider();
124
+ await Effect.runPromise(provider.upsert(ctx, 'secret.key', 'secret-value'));
125
+ const result = await Effect.runPromise(provider.verifyEncryption(ctx, 'secret.key'));
126
+ expect(result).toBe('SecureString');
127
+ });
128
+ });
129
+ describe('checkGuards', () => {
130
+ it('should no-op when guards are empty', async () => {
131
+ const provider = createMockProvider();
132
+ await expect(Effect.runPromise(provider.checkGuards(ctx, {}))).resolves.toBeUndefined();
133
+ });
134
+ it('should no-op when guards are undefined', async () => {
135
+ const provider = createMockProvider();
136
+ await expect(Effect.runPromise(provider.checkGuards(ctx, undefined))).resolves.toBeUndefined();
137
+ });
138
+ it('should fail when guards are not an object', async () => {
139
+ const provider = createMockProvider();
140
+ await expect(Effect.runPromise(provider.checkGuards(ctx, 'not-an-object'))).rejects.toThrowError();
141
+ });
142
+ it('should fail when guard values have invalid types', async () => {
143
+ const provider = createMockProvider();
144
+ await expect(Effect.runPromise(provider.checkGuards(ctx, { prefix: 123 }))).rejects.toThrowError();
145
+ await expect(Effect.runPromise(provider.checkGuards(ctx, { service: 456 }))).rejects.toThrowError();
146
+ await expect(Effect.runPromise(provider.checkGuards(ctx, { env: 789 }))).rejects.toThrowError();
147
+ });
148
+ it('should fail when guard values do not match context', async () => {
149
+ const provider = createMockProvider();
150
+ await expect(Effect.runPromise(provider.checkGuards(ctx, { env: 'prod' }))).rejects.toThrowError();
151
+ });
152
+ it('should fail when prefix does not match', async () => {
153
+ const provider = createMockProvider();
154
+ await expect(Effect.runPromise(provider.checkGuards(ctx, { prefix: '/other' }))).rejects.toThrowError();
155
+ });
156
+ it('should fail when service does not match', async () => {
157
+ const provider = createMockProvider();
158
+ await expect(Effect.runPromise(provider.checkGuards(ctx, { service: 'other-service' }))).rejects.toThrowError();
159
+ });
160
+ it('should pass when guard values match context', async () => {
161
+ const provider = createMockProvider();
162
+ await expect(Effect.runPromise(provider.checkGuards(ctx, { env: 'dev', service: ctx.service }))).resolves.toBeUndefined();
163
+ });
164
+ });
165
+ });
166
+ //# sourceMappingURL=MockProvider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockProvider.test.js","sourceRoot":"","sources":["../../src/providers/MockProvider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Provider Interface
3
+ *
4
+ * Defines the contract for configuration providers (AWS SSM, AWS Secrets Manager, Vault, etc.)
5
+ */
6
+ import type { Effect } from 'effect';
7
+ import type { ProviderError } from '../errors.js';
8
+ /**
9
+ * Context for provider operations
10
+ */
11
+ export type ProviderContext = {
12
+ readonly prefix: string;
13
+ readonly service: string;
14
+ readonly env: string;
15
+ };
16
+ /**
17
+ * Key-value map using canonical key paths (dot notation) to raw provider strings
18
+ * Example: { "database.url": "postgres://...", "api.timeoutMs": "6500" }
19
+ */
20
+ export type ProviderKV = Record<string, string>;
21
+ /**
22
+ * Encryption type for stored values
23
+ */
24
+ export declare const EncryptionType: {
25
+ readonly SECURE_STRING: "SecureString";
26
+ readonly STRING: "String";
27
+ readonly UNKNOWN: "Unknown";
28
+ };
29
+ export type EncryptionTypeValue = (typeof EncryptionType)[keyof typeof EncryptionType];
30
+ /**
31
+ * Provider capabilities
32
+ */
33
+ export type ProviderCapabilities = {
34
+ readonly secureWrite?: boolean;
35
+ readonly encryptionVerification?: boolean;
36
+ readonly transactions?: boolean;
37
+ };
38
+ /**
39
+ * Provider interface
40
+ *
41
+ * All providers must implement fetch, upsert, and delete.
42
+ * Optional: verifyEncryption if capabilities.encryptionVerification is true.
43
+ */
44
+ export type Provider = {
45
+ readonly name: string;
46
+ readonly capabilities: ProviderCapabilities;
47
+ /**
48
+ * Optional provider-specific guard check
49
+ */
50
+ readonly checkGuards?: (ctx: ProviderContext, guards?: unknown) => Effect.Effect<void, ProviderError>;
51
+ /**
52
+ * Fetch all key-value pairs for the given context
53
+ * Returns canonical key paths (dot notation) mapped to string values
54
+ */
55
+ readonly fetch: (ctx: ProviderContext) => Effect.Effect<ProviderKV, ProviderError>;
56
+ /**
57
+ * Upsert a single key-value pair
58
+ * keyPath is in canonical dot notation (e.g., "database.url")
59
+ * value is the string-encoded value
60
+ */
61
+ readonly upsert: (ctx: ProviderContext, keyPath: string, value: string) => Effect.Effect<void, ProviderError>;
62
+ /**
63
+ * Delete a single key
64
+ * keyPath is in canonical dot notation
65
+ */
66
+ readonly delete: (ctx: ProviderContext, keyPath: string) => Effect.Effect<void, ProviderError>;
67
+ /**
68
+ * Verify encryption type for a key (optional)
69
+ * Only available if capabilities.encryptionVerification is true
70
+ */
71
+ readonly verifyEncryption?: (ctx: ProviderContext, keyPath: string) => Effect.Effect<EncryptionTypeValue, ProviderError>;
72
+ };
73
+ /**
74
+ * Convert canonical dot path to SSM slash path
75
+ * Example: "database.url" -> "database/url"
76
+ */
77
+ export declare function dotToSlashPath(dotPath: string): string;
78
+ /**
79
+ * Convert SSM slash path to canonical dot path
80
+ * Example: "database/url" -> "database.url"
81
+ */
82
+ export declare function slashToDotPath(slashPath: string): string;
83
+ /**
84
+ * Build the full SSM parameter path
85
+ * Example: buildFullPath({ prefix: "/config-o-tron", service: "api", env: "prod" }, "database.url")
86
+ * -> "/config-o-tron/prod/api/database/url"
87
+ */
88
+ export declare function buildFullPath(ctx: ProviderContext, keyPath: string): string;
89
+ /**
90
+ * Extract the key path from a full SSM parameter path
91
+ * Example: extractKeyPath("/config-o-tron/prod/api/database/url", { prefix: "/config-o-tron", service: "api", env: "prod" })
92
+ * -> "database.url"
93
+ */
94
+ export declare function extractKeyPath(fullPath: string, ctx: ProviderContext): string;
95
+ //# sourceMappingURL=Provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../src/providers/Provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMlD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAEvF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAEtG;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAEnF;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAE9G;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAE/F;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAC1B,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;CACxD,CAAC;AAMF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAI3E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAO7E"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Encryption type for stored values
3
+ */
4
+ export const EncryptionType = {
5
+ SECURE_STRING: 'SecureString',
6
+ STRING: 'String',
7
+ UNKNOWN: 'Unknown',
8
+ };
9
+ // --------------------------------------------------------------------------
10
+ // Utility Functions
11
+ // --------------------------------------------------------------------------
12
+ /**
13
+ * Convert canonical dot path to SSM slash path
14
+ * Example: "database.url" -> "database/url"
15
+ */
16
+ export function dotToSlashPath(dotPath) {
17
+ return dotPath.replace(/\./g, '/');
18
+ }
19
+ /**
20
+ * Convert SSM slash path to canonical dot path
21
+ * Example: "database/url" -> "database.url"
22
+ */
23
+ export function slashToDotPath(slashPath) {
24
+ return slashPath.replace(/\//g, '.');
25
+ }
26
+ /**
27
+ * Build the full SSM parameter path
28
+ * Example: buildFullPath({ prefix: "/config-o-tron", service: "api", env: "prod" }, "database.url")
29
+ * -> "/config-o-tron/prod/api/database/url"
30
+ */
31
+ export function buildFullPath(ctx, keyPath) {
32
+ const prefix = ctx.prefix.endsWith('/') ? ctx.prefix.slice(0, -1) : ctx.prefix;
33
+ const slashKeyPath = dotToSlashPath(keyPath);
34
+ return `${prefix}/${ctx.env}/${ctx.service}/${slashKeyPath}`;
35
+ }
36
+ /**
37
+ * Extract the key path from a full SSM parameter path
38
+ * Example: extractKeyPath("/config-o-tron/prod/api/database/url", { prefix: "/config-o-tron", service: "api", env: "prod" })
39
+ * -> "database.url"
40
+ */
41
+ export function extractKeyPath(fullPath, ctx) {
42
+ const prefix = ctx.prefix.endsWith('/') ? ctx.prefix.slice(0, -1) : ctx.prefix;
43
+ const basePrefix = `${prefix}/${ctx.env}/${ctx.service}/`;
44
+ if (fullPath.startsWith(basePrefix)) {
45
+ return slashToDotPath(fullPath.slice(basePrefix.length));
46
+ }
47
+ return slashToDotPath(fullPath);
48
+ }
49
+ //# sourceMappingURL=Provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Provider.js","sourceRoot":"","sources":["../../src/providers/Provider.ts"],"names":[],"mappings":"AA4BA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,aAAa,EAAE,cAAc;IAC7B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;CACV,CAAC;AAyDX,6EAA6E;AAC7E,oBAAoB;AACpB,6EAA6E;AAE7E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAoB,EAAE,OAAe;IACjE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IAC/E,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,GAAG,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,YAAY,EAAE,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,GAAoB;IACnE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IAC/E,MAAM,UAAU,GAAG,GAAG,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,CAAC;IAC1D,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Provider.test.d.ts","sourceRoot":"","sources":["../../src/providers/Provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Provider Utility Tests
3
+ */
4
+ import { describe, expect, it } from 'vitest';
5
+ import { buildFullPath, dotToSlashPath, EncryptionType, extractKeyPath, slashToDotPath, } from './Provider.js';
6
+ describe('Provider', () => {
7
+ describe('EncryptionType', () => {
8
+ it('should have correct values', () => {
9
+ expect(EncryptionType.SECURE_STRING).toBe('SecureString');
10
+ expect(EncryptionType.STRING).toBe('String');
11
+ expect(EncryptionType.UNKNOWN).toBe('Unknown');
12
+ });
13
+ });
14
+ describe('dotToSlashPath', () => {
15
+ it('should convert single dot to slash', () => {
16
+ expect(dotToSlashPath('database.url')).toBe('database/url');
17
+ });
18
+ it('should convert multiple dots to slashes', () => {
19
+ expect(dotToSlashPath('database.connection.url')).toBe('database/connection/url');
20
+ });
21
+ it('should handle single segment (no dots)', () => {
22
+ expect(dotToSlashPath('database')).toBe('database');
23
+ });
24
+ it('should handle empty string', () => {
25
+ expect(dotToSlashPath('')).toBe('');
26
+ });
27
+ it('should handle deep nesting', () => {
28
+ expect(dotToSlashPath('a.b.c.d.e.f')).toBe('a/b/c/d/e/f');
29
+ });
30
+ });
31
+ describe('slashToDotPath', () => {
32
+ it('should convert single slash to dot', () => {
33
+ expect(slashToDotPath('database/url')).toBe('database.url');
34
+ });
35
+ it('should convert multiple slashes to dots', () => {
36
+ expect(slashToDotPath('database/connection/url')).toBe('database.connection.url');
37
+ });
38
+ it('should handle single segment (no slashes)', () => {
39
+ expect(slashToDotPath('database')).toBe('database');
40
+ });
41
+ it('should handle empty string', () => {
42
+ expect(slashToDotPath('')).toBe('');
43
+ });
44
+ it('should handle deep nesting', () => {
45
+ expect(slashToDotPath('a/b/c/d/e/f')).toBe('a.b.c.d.e.f');
46
+ });
47
+ });
48
+ describe('buildFullPath', () => {
49
+ const ctx = {
50
+ prefix: '/config-o-tron',
51
+ service: 'api',
52
+ env: 'prod',
53
+ };
54
+ it('should build full path for simple key', () => {
55
+ expect(buildFullPath(ctx, 'database.url')).toBe('/config-o-tron/prod/api/database/url');
56
+ });
57
+ it('should build full path for nested key', () => {
58
+ expect(buildFullPath(ctx, 'database.connection.url')).toBe('/config-o-tron/prod/api/database/connection/url');
59
+ });
60
+ it('should build full path for single segment key', () => {
61
+ expect(buildFullPath(ctx, 'timeout')).toBe('/config-o-tron/prod/api/timeout');
62
+ });
63
+ it('should handle different context values', () => {
64
+ const customCtx = {
65
+ prefix: '/custom',
66
+ service: 'myapp',
67
+ env: 'staging',
68
+ };
69
+ expect(buildFullPath(customCtx, 'api.key')).toBe('/custom/staging/myapp/api/key');
70
+ });
71
+ it('should handle context with empty prefix', () => {
72
+ const ctxNoPrefix = {
73
+ prefix: '',
74
+ service: 'api',
75
+ env: 'prod',
76
+ };
77
+ expect(buildFullPath(ctxNoPrefix, 'database.url')).toBe('/prod/api/database/url');
78
+ });
79
+ it('should trim trailing slashes in prefix', () => {
80
+ const ctxWithSlash = {
81
+ prefix: '/config-o-tron/',
82
+ service: 'api',
83
+ env: 'prod',
84
+ };
85
+ expect(buildFullPath(ctxWithSlash, 'database.url')).toBe('/config-o-tron/prod/api/database/url');
86
+ });
87
+ });
88
+ describe('extractKeyPath', () => {
89
+ const ctx = {
90
+ prefix: '/config-o-tron',
91
+ service: 'api',
92
+ env: 'prod',
93
+ };
94
+ it('should extract key path from full path', () => {
95
+ expect(extractKeyPath('/config-o-tron/prod/api/database/url', ctx)).toBe('database.url');
96
+ });
97
+ it('should extract nested key path', () => {
98
+ expect(extractKeyPath('/config-o-tron/prod/api/database/connection/url', ctx)).toBe('database.connection.url');
99
+ });
100
+ it('should extract single segment key path', () => {
101
+ expect(extractKeyPath('/config-o-tron/prod/api/timeout', ctx)).toBe('timeout');
102
+ });
103
+ it('should handle path that does not match prefix', () => {
104
+ // When path doesn't start with the expected prefix, it just converts slashes to dots
105
+ expect(extractKeyPath('/other/path/value', ctx)).toBe('.other.path.value');
106
+ });
107
+ it('should handle different context values', () => {
108
+ const customCtx = {
109
+ prefix: '/custom',
110
+ service: 'myapp',
111
+ env: 'staging',
112
+ };
113
+ expect(extractKeyPath('/custom/staging/myapp/api/key', customCtx)).toBe('api.key');
114
+ });
115
+ it('should trim trailing slashes in prefix when extracting', () => {
116
+ const ctxWithSlash = {
117
+ prefix: '/config-o-tron/',
118
+ service: 'api',
119
+ env: 'prod',
120
+ };
121
+ expect(extractKeyPath('/config-o-tron/prod/api/database/url', ctxWithSlash)).toBe('database.url');
122
+ });
123
+ it('should handle non-matching paths with trailing slash prefix', () => {
124
+ const ctxWithSlash = {
125
+ prefix: '/config-o-tron/',
126
+ service: 'api',
127
+ env: 'prod',
128
+ };
129
+ expect(extractKeyPath('/other/path/value', ctxWithSlash)).toBe('.other.path.value');
130
+ });
131
+ it('should handle empty key path', () => {
132
+ expect(extractKeyPath('/config-o-tron/prod/api/', ctx)).toBe('');
133
+ });
134
+ });
135
+ });
136
+ //# sourceMappingURL=Provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Provider.test.js","sourceRoot":"","sources":["../../src/providers/Provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Provider Guards
3
+ *
4
+ * Utilities for resolving and invoking provider guard checks.
5
+ */
6
+ import * as Effect from 'effect/Effect';
7
+ import { type ProviderGuardsConfig } from '../config.js';
8
+ import { type ProviderError } from '../errors.js';
9
+ import { type Provider, type ProviderContext } from './Provider.js';
10
+ export declare function getProviderGuardConfig(providerName: string, providerGuards: ProviderGuardsConfig): unknown | undefined;
11
+ export declare function shouldIgnoreProviderGuards(): boolean;
12
+ export declare function checkProviderGuards(provider: Provider, ctx: ProviderContext, providerGuards: ProviderGuardsConfig): Effect.Effect<void, ProviderError>;
13
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/providers/guards.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAoBpE,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,oBAAoB,GACnC,OAAO,GAAG,SAAS,CAkBrB;AAMD,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,eAAe,EACpB,cAAc,EAAE,oBAAoB,GACnC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAepC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Provider Guards
3
+ *
4
+ * Utilities for resolving and invoking provider guard checks.
5
+ */
6
+ import * as Effect from 'effect/Effect';
7
+ import {} from '../config.js';
8
+ import {} from '../errors.js';
9
+ import {} from './Provider.js';
10
+ // --------------------------------------------------------------------------
11
+ // Helpers
12
+ // --------------------------------------------------------------------------
13
+ function normalizeProviderName(name) {
14
+ return name.toLowerCase();
15
+ }
16
+ function isGuardOverrideEnabled(value) {
17
+ if (!value)
18
+ return false;
19
+ const normalized = value.trim().toLowerCase();
20
+ return normalized === '1' || normalized === 'true';
21
+ }
22
+ // --------------------------------------------------------------------------
23
+ // Guard Resolution
24
+ // --------------------------------------------------------------------------
25
+ export function getProviderGuardConfig(providerName, providerGuards) {
26
+ const direct = providerGuards[providerName];
27
+ if (direct !== undefined) {
28
+ return direct;
29
+ }
30
+ const normalized = normalizeProviderName(providerName);
31
+ const normalizedDirect = providerGuards[normalized];
32
+ if (normalizedDirect !== undefined) {
33
+ return normalizedDirect;
34
+ }
35
+ const matchedKey = Object.keys(providerGuards).find((key) => normalizeProviderName(key) === normalized);
36
+ if (matchedKey) {
37
+ return providerGuards[matchedKey];
38
+ }
39
+ return undefined;
40
+ }
41
+ // --------------------------------------------------------------------------
42
+ // Guard Invocation
43
+ // --------------------------------------------------------------------------
44
+ export function shouldIgnoreProviderGuards() {
45
+ return isGuardOverrideEnabled(process.env.CONFIG_O_TRON_IGNORE_PROVIDER_GUARDS);
46
+ }
47
+ export function checkProviderGuards(provider, ctx, providerGuards) {
48
+ if (!provider.checkGuards) {
49
+ return Effect.void;
50
+ }
51
+ if (shouldIgnoreProviderGuards()) {
52
+ return Effect.void;
53
+ }
54
+ const guardConfig = getProviderGuardConfig(provider.name, providerGuards);
55
+ if (guardConfig === undefined) {
56
+ return Effect.void;
57
+ }
58
+ return provider.checkGuards(ctx, guardConfig);
59
+ }
60
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/providers/guards.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAA6B,MAAM,cAAc,CAAC;AACzD,OAAO,EAAsB,MAAM,cAAc,CAAC;AAClD,OAAO,EAAuC,MAAM,eAAe,CAAC;AAEpE,6EAA6E;AAC7E,UAAU;AACV,6EAA6E;AAE7E,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAyB;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,MAAM,CAAC;AACrD,CAAC;AAED,6EAA6E;AAC7E,mBAAmB;AACnB,6EAA6E;AAE7E,MAAM,UAAU,sBAAsB,CACpC,YAAoB,EACpB,cAAoC;IAEpC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,CAAC;IACxG,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,cAAc,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,6EAA6E;AAC7E,mBAAmB;AACnB,6EAA6E;AAE7E,MAAM,UAAU,0BAA0B;IACxC,OAAO,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAkB,EAClB,GAAoB,EACpB,cAAoC;IAEpC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,0BAA0B,EAAE,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1E,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=guards.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.test.d.ts","sourceRoot":"","sources":["../../src/providers/guards.test.ts"],"names":[],"mappings":""}