hanzio 1.1.0 → 1.2.0

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 (55) hide show
  1. package/README.md +70 -4
  2. package/dist/api-wrapper/builders.d.ts +13 -2
  3. package/dist/api-wrapper/errors.d.ts +1 -0
  4. package/dist/api-wrapper/headers.d.ts +2 -1
  5. package/dist/api-wrapper/transport.d.ts +8 -5
  6. package/dist/api-wrapper/types.d.ts +1 -0
  7. package/dist/cache/index.d.ts +26 -0
  8. package/dist/secrets/core.d.ts +47 -0
  9. package/dist/secrets/deadline.d.ts +6 -0
  10. package/dist/secrets/environment.d.ts +9 -0
  11. package/dist/secrets/errors.d.ts +11 -0
  12. package/dist/secrets/index.d.ts +13 -25
  13. package/dist/secrets/infisical-cli.d.ts +6 -0
  14. package/dist/secrets/infisical-config.d.ts +17 -0
  15. package/dist/secrets/infisical-session.d.ts +4 -0
  16. package/dist/secrets/infisical.d.ts +8 -13
  17. package/dist/secrets/loaders.d.ts +5 -12
  18. package/dist/secrets/vite.d.ts +7 -3
  19. package/dist/secrets/worker-loader.d.ts +9 -0
  20. package/dist/secrets/worker.d.ts +3 -0
  21. package/dist/src/api-wrapper/index.js +152 -122
  22. package/dist/src/index.js +3173 -2713
  23. package/dist/src/jwt/index.js +2 -2
  24. package/dist/src/p-queue/index.js +3 -3
  25. package/dist/src/secrets/index.js +670 -402
  26. package/dist/src/secrets/infisical.js +451 -168
  27. package/dist/src/secrets/loaders.js +467 -174
  28. package/dist/src/secrets/vite.js +33 -11
  29. package/dist/src/secrets/worker.js +275 -0
  30. package/dist/src/sitemap/index.js +1 -1
  31. package/dist/src/zod/index.js +7 -7
  32. package/dist/typedswitch/index.d.ts +9 -5
  33. package/package.json +12 -3
  34. package/src/api-wrapper/builders.ts +68 -43
  35. package/src/api-wrapper/create-client.ts +82 -62
  36. package/src/api-wrapper/errors.ts +10 -0
  37. package/src/api-wrapper/headers.ts +14 -1
  38. package/src/api-wrapper/redaction.ts +1 -0
  39. package/src/api-wrapper/transport.ts +34 -38
  40. package/src/api-wrapper/types.ts +1 -0
  41. package/src/cache/index.ts +228 -61
  42. package/src/secrets/core.ts +348 -0
  43. package/src/secrets/deadline.ts +69 -0
  44. package/src/secrets/environment.ts +69 -0
  45. package/src/secrets/errors.ts +29 -0
  46. package/src/secrets/index.ts +79 -210
  47. package/src/secrets/infisical-cli.ts +99 -0
  48. package/src/secrets/infisical-config.ts +70 -0
  49. package/src/secrets/infisical-session.ts +42 -0
  50. package/src/secrets/infisical.ts +214 -66
  51. package/src/secrets/loaders.ts +24 -48
  52. package/src/secrets/vite.ts +44 -15
  53. package/src/secrets/worker-loader.ts +56 -0
  54. package/src/secrets/worker.ts +4 -0
  55. package/src/typedswitch/index.ts +80 -69
@@ -74,15 +74,27 @@ type RawHandlerReturnType<T> = T extends (...args: any[]) => infer R ? R : never
74
74
 
75
75
  /** Get union of all raw return types from a cases object's values */
76
76
  type RawCasesReturnType<Cases> = {
77
- [K in keyof Cases]: Cases[K] extends undefined
77
+ [K in keyof Cases]: RawHandlerReturnType<Cases[K]>
78
+ }[keyof Cases]
79
+
80
+ /** Only required, defined handlers guarantee that a case is handled. */
81
+ type HandledCaseKeys<Cases> = {
82
+ // biome-ignore lint/complexity/noBannedTypes: Empty-object assignability detects optional keys and index signatures.
83
+ [K in keyof Cases]-?: {} extends Pick<Cases, K>
78
84
  ? never
79
- : RawHandlerReturnType<Cases[K]>
85
+ : undefined extends Cases[K]
86
+ ? never
87
+ : K
80
88
  }[keyof Cases]
81
89
 
82
90
  // ═══════════════════════════════════════════════════════════════════════════
83
91
  // String input mode types
84
92
  // ═══════════════════════════════════════════════════════════════════════════
85
93
 
94
+ // The exported case-map types below are annotation helpers for consumers who
95
+ // want to type reusable case maps. The typedSwitch overloads infer their own
96
+ // shapes and do not depend on these types.
97
+
86
98
  /** Cases for string input - all cases required */
87
99
  export type StringSwitchCases<T extends string, R> = {
88
100
  [K in T]: (value: K) => R | Promise<R>
@@ -118,67 +130,6 @@ export type PartialObjectSwitchCases<
118
130
  type Handler = (value: unknown) => unknown
119
131
  type CasesRecord = Record<string, Handler | undefined>
120
132
 
121
- function runSwitch(
122
- value: string | Record<string, unknown>,
123
- keyOrCases: string | CasesRecord,
124
- casesOrDefault?: CasesRecord | Handler,
125
- defaultCase?: Handler
126
- ): unknown {
127
- let key: string
128
- let cases: CasesRecord
129
- let defaultHandler: Handler | undefined
130
- let discriminantKey: string | undefined
131
-
132
- if (typeof value === 'string') {
133
- // String input: typedSwitch(string, cases, default?)
134
- key = value
135
- cases = keyOrCases as CasesRecord
136
- defaultHandler = casesOrDefault as Handler | undefined
137
- } else {
138
- // Object input: typedSwitch(obj, key, cases, default?)
139
- if (typeof keyOrCases !== 'string') {
140
- throw new Error(
141
- 'Invalid typedSwitch call: object mode requires a string discriminant key'
142
- )
143
- }
144
-
145
- discriminantKey = keyOrCases
146
- const discriminantValue = value[discriminantKey]
147
- if (typeof discriminantValue !== 'string') {
148
- throw new Error(
149
- `Invalid discriminant value for key "${discriminantKey}": expected string, received ${typeof discriminantValue}`
150
- )
151
- }
152
-
153
- key = discriminantValue
154
- cases = casesOrDefault as CasesRecord
155
- defaultHandler = defaultCase
156
- }
157
-
158
- const handler = cases[key]
159
-
160
- if (handler) {
161
- return handler(value)
162
- }
163
-
164
- if (defaultHandler) {
165
- return defaultHandler(value)
166
- }
167
-
168
- const availableCases = Object.keys(cases).join(', ')
169
- const availableCasesSuffix =
170
- availableCases.length > 0
171
- ? ` Available cases: ${availableCases}`
172
- : ' Available cases: (none)'
173
- const contextSuffix = discriminantKey
174
- ? ` (discriminant key: "${discriminantKey}")`
175
- : ''
176
-
177
- throw new Error(
178
- `Unhandled case: ${key}${contextSuffix}.${availableCasesSuffix}`
179
- )
180
- }
181
-
182
133
  // ═══════════════════════════════════════════════════════════════════════════
183
134
  // Function overloads
184
135
  // ═══════════════════════════════════════════════════════════════════════════
@@ -190,10 +141,11 @@ export function typedSwitch<
190
141
  >(value: T, cases: Cases): RawCasesReturnType<Cases>
191
142
 
192
143
  // String input - partial cases allowed (with default)
144
+ // The default handler only receives the cases not covered by `cases`.
193
145
  export function typedSwitch<
194
146
  T extends string,
195
147
  Cases extends { [K in T]?: (value: K) => unknown },
196
- DefaultCase extends (value: T) => unknown
148
+ DefaultCase extends (value: Exclude<T, HandledCaseKeys<Cases>>) => unknown
197
149
  >(
198
150
  value: T,
199
151
  cases: Cases,
@@ -202,19 +154,22 @@ export function typedSwitch<
202
154
 
203
155
  // Object input with key - all cases required (no default)
204
156
  export function typedSwitch<
205
- T extends Record<string, unknown>,
157
+ T extends object,
206
158
  K extends keyof T,
207
159
  TKey extends T[K] & string,
208
160
  Cases extends { [V in TKey]: (value: Extract<T, Record<K, V>>) => unknown }
209
161
  >(value: T, key: K, cases: Cases): RawCasesReturnType<Cases>
210
162
 
211
163
  // Object input with key - partial cases allowed (with default)
164
+ // The default handler only receives the union members not covered by `cases`.
212
165
  export function typedSwitch<
213
- T extends Record<string, unknown>,
166
+ T extends object,
214
167
  K extends keyof T,
215
168
  TKey extends T[K] & string,
216
169
  Cases extends { [V in TKey]?: (value: Extract<T, Record<K, V>>) => unknown },
217
- DefaultCase extends (value: T) => unknown
170
+ DefaultCase extends (
171
+ value: Exclude<T, Record<K, HandledCaseKeys<Cases> & string>>
172
+ ) => unknown
218
173
  >(
219
174
  value: T,
220
175
  key: K,
@@ -300,10 +255,66 @@ export function typedSwitch<
300
255
 
301
256
  // Implementation
302
257
  export function typedSwitch(
303
- value: string | Record<string, unknown>,
258
+ value: string | object,
304
259
  keyOrCases: string | CasesRecord,
305
260
  casesOrDefault?: CasesRecord | Handler,
306
261
  defaultCase?: Handler
307
262
  ): unknown {
308
- return runSwitch(value, keyOrCases, casesOrDefault, defaultCase)
263
+ let key: string
264
+ let cases: CasesRecord
265
+ let defaultHandler: Handler | undefined
266
+ let discriminantKey: string | undefined
267
+
268
+ if (typeof value === 'string') {
269
+ // String input: typedSwitch(string, cases, default?)
270
+ key = value
271
+ cases = keyOrCases as CasesRecord
272
+ defaultHandler = casesOrDefault as Handler | undefined
273
+ } else {
274
+ // Object input: typedSwitch(obj, key, cases, default?)
275
+ if (typeof keyOrCases !== 'string') {
276
+ throw new Error(
277
+ 'Invalid typedSwitch call: object mode requires a string discriminant key'
278
+ )
279
+ }
280
+
281
+ discriminantKey = keyOrCases
282
+ const discriminantValue = (value as Record<string, unknown>)[
283
+ discriminantKey
284
+ ]
285
+ if (typeof discriminantValue !== 'string') {
286
+ throw new Error(
287
+ `Invalid discriminant value for key "${discriminantKey}": expected string, received ${typeof discriminantValue}`
288
+ )
289
+ }
290
+
291
+ key = discriminantValue
292
+ cases = casesOrDefault as CasesRecord
293
+ defaultHandler = defaultCase
294
+ }
295
+
296
+ // Only own properties count as cases - a key like 'toString' must not
297
+ // resolve to an inherited Object.prototype method.
298
+ const handler = Object.hasOwn(cases, key) ? cases[key] : undefined
299
+
300
+ if (handler) {
301
+ return handler(value)
302
+ }
303
+
304
+ if (defaultHandler) {
305
+ return defaultHandler(value)
306
+ }
307
+
308
+ const availableCases = Object.keys(cases).join(', ')
309
+ const availableCasesSuffix =
310
+ availableCases.length > 0
311
+ ? ` Available cases: ${availableCases}`
312
+ : ' Available cases: (none)'
313
+ const contextSuffix = discriminantKey
314
+ ? ` (discriminant key: "${discriminantKey}")`
315
+ : ''
316
+
317
+ throw new Error(
318
+ `Unhandled case: ${key}${contextSuffix}.${availableCasesSuffix}`
319
+ )
309
320
  }