@jayalfredprufrock/confetti 0.2.0 → 0.2.2

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/README.md CHANGED
@@ -105,6 +105,9 @@ cfg.get("feature.enabled"); // true (typed as boolean)
105
105
 
106
106
  // Entire subtrees are fine too — everything resolves synchronously.
107
107
  cfg.get("feature"); // { enabled: true, limit: 50 }
108
+
109
+ // Omit the path to get the entire resolved config.
110
+ cfg.get(); // { appName, port, feature: {...}, apiUrl, ... }
108
111
  ```
109
112
 
110
113
  _If a leaf cannot be resolved syncronously, `get` throws. See `resolve` below for handling async configuration._
@@ -149,6 +152,11 @@ const password = await cfg.resolve("dbPassword", async (ctx) => {
149
152
  const secret = await secretsClient.getSecretValue({ SecretId: ctx.data });
150
153
  return secret.SecretString;
151
154
  });
155
+
156
+ // Omit the path to resolve the entire config — fetcher is invoked per leaf that needs it.
157
+ const fullConfig = await cfg.resolve(async (ctx) => {
158
+ /* ... */
159
+ });
152
160
  ```
153
161
 
154
162
  Rules:
@@ -230,13 +238,13 @@ for (const [path, entry] of cfg.entries()) {
230
238
 
231
239
  ## API
232
240
 
233
- | Method | Signature | Notes |
234
- | ------------------ | --------------------------------------------------- | ------------------------------------------------------------------------------ |
235
- | `makeConfig` | `(config \| (env) => config) => Confetti` | Accepts a config object or factory fn. |
236
- | `confetti(env)` | `(env: string) => Accessor` | Binds an environment. |
237
- | `accessor.get` | `(path) => value` | Sync. Throws if async resolution is required. |
238
- | `accessor.resolve` | `(path, fetcher) => Promise<value>` | Async. Fetcher invoked per leaf that needs it. |
239
- | `accessor.entries` | `(startPath?) => IterableIterator<[string, Entry]>` | Lazy iterator of every leaf with its metadata; optionally scoped to a subtree. |
241
+ | Method | Signature | Notes |
242
+ | ------------------ | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
243
+ | `makeConfig` | `(config \| (env) => config) => Confetti` | Accepts a config object or factory fn. |
244
+ | `confetti(env)` | `(env: string) => Accessor` | Binds an environment. |
245
+ | `accessor.get` | `(path?) => value` | Sync. Path is optional — omit to get the full resolved config. Throws if async resolution is required. |
246
+ | `accessor.resolve` | `(path?, fetcher) => Promise<value>` | Async. Path is optional — omit to resolve the full config. Fetcher invoked per leaf that needs it. |
247
+ | `accessor.entries` | `(startPath?) => IterableIterator<[string, Entry]>` | Lazy iterator of every leaf with its metadata; optionally scoped to a subtree. |
240
248
 
241
249
  ## License
242
250
 
package/dist/index.cjs CHANGED
@@ -153,17 +153,21 @@ const resolveSubtreeAsync = async (node, prefix, env, fetcher) => {
153
153
  };
154
154
  //#endregion
155
155
  //#region src/make-config.ts
156
- const makeConfig = (input) => {
156
+ function makeConfig(input) {
157
157
  const factory = typeof input === "function" ? input : () => input;
158
158
  const confetti = (env) => {
159
159
  const config = factory(env);
160
160
  const get = (path) => {
161
+ if (!path) return resolveSubtreeSync(config, "", env);
161
162
  const node = getAtPath(config, path);
162
163
  return isNestedConfig(node) ? resolveSubtreeSync(node, path, env) : resolveEntrySync(buildEntry(node, path, env), env);
163
164
  };
164
- const resolve = async (path, fetcher) => {
165
+ const resolve = async (pathOrFetcher, maybeFetcher) => {
166
+ if (typeof pathOrFetcher === "function") return resolveSubtreeAsync(config, "", env, pathOrFetcher);
167
+ const path = pathOrFetcher;
168
+ const fetcher = maybeFetcher;
165
169
  const node = getAtPath(config, path);
166
- return isNestedConfig(node) ? await resolveSubtreeAsync(node, path, env, fetcher) : await resolveEntryAsync(buildEntry(node, path, env), env, fetcher);
170
+ return isNestedConfig(node) ? resolveSubtreeAsync(node, path, env, fetcher) : resolveEntryAsync(buildEntry(node, path, env), env, fetcher);
167
171
  };
168
172
  const entries = (startPath) => {
169
173
  const root = startPath ? getAtPath(config, startPath) : config;
@@ -179,7 +183,7 @@ const makeConfig = (input) => {
179
183
  };
180
184
  confetti[CONFETTI] = "CONFETTI";
181
185
  return confetti;
182
- };
186
+ }
183
187
  //#endregion
184
188
  exports.CONFETTI = CONFETTI;
185
189
  exports.DATA = DATA;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/symbols.ts","../src/util.ts","../src/make-config.ts"],"sourcesContent":["export const CONFETTI: unique symbol = Symbol.for(\"CONFETTI\");\nexport const DEFAULT: unique symbol = Symbol.for(\"CONFETTI_DEFAULT\");\nexport const ENV: unique symbol = Symbol.for(\"CONFETTI_ENV\");\nexport const DATA: unique symbol = Symbol.for(\"CONFETTI_DATA\");\nexport const TYPE: unique symbol = Symbol.for(\"CONFETTI_TYPE\");\n","import { CONFETTI, DATA, DEFAULT, ENV, TYPE } from \"./symbols\";\nimport type {\n ConfigEntry,\n Confetti,\n ConfigValPerEnv,\n Fetcher,\n FetcherContext,\n Obj,\n TypeTag,\n} from \"./types\";\n\nexport const isObj = (val: unknown): val is Obj => {\n return val !== null && typeof val === \"object\" && !Array.isArray(val);\n};\n\nexport const isConfigValPerEnv = (val: unknown): val is ConfigValPerEnv => {\n return isObj(val) && (DEFAULT in val || DATA in val || ENV in val || TYPE in val);\n};\n\nexport const isNestedConfig = (val: unknown): val is Obj => {\n return isObj(val) && !isConfigValPerEnv(val);\n};\n\nexport const isConfetti = (val: unknown): val is Confetti<any> => {\n return typeof val === \"function\" && Object.hasOwn(val, CONFETTI);\n};\n\nexport const isThenable = (v: unknown): v is PromiseLike<unknown> => {\n return (\n v !== null &&\n typeof v === \"object\" &&\n \"then\" in v &&\n typeof (v as { then: unknown }).then === \"function\"\n );\n};\n\nexport const getAtPath = (config: Obj, path: string): unknown => {\n if (!path) return config;\n const segments = path.split(\".\");\n let node: unknown = config;\n for (const segment of segments) {\n if (!isNestedConfig(node)) {\n throw new Error(`Invalid config path '${path}'.`);\n }\n node = node[segment];\n if (node === undefined) {\n throw new Error(`Invalid config path '${path}'.`);\n }\n }\n return node;\n};\n\nconst matchesType = (val: unknown, type: TypeTag): boolean => {\n if (type === \"string\") return typeof val === \"string\";\n if (type === \"number\") return typeof val === \"number\" && !Number.isNaN(val);\n if (type === \"boolean\") return typeof val === \"boolean\";\n if (!Array.isArray(val)) return false;\n const elem = type.slice(0, -2);\n return val.every((x) => typeof x === elem);\n};\n\nexport const coerceFromString = (raw: string, type: TypeTag, path: string): unknown => {\n if (type === \"string\") return raw;\n if (type === \"number\") {\n if (raw === \"\") throw new Error(`Cannot coerce empty string to number at '${path}'.`);\n const n = Number(raw);\n if (Number.isNaN(n)) throw new Error(`Cannot coerce '${raw}' to number at '${path}'.`);\n return n;\n }\n if (type === \"boolean\") {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n throw new Error(`Cannot coerce '${raw}' to boolean at '${path}' (expected 'true' or 'false').`);\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (invalid JSON).`);\n }\n if (!Array.isArray(parsed)) {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (not an array).`);\n }\n const elem = type.slice(0, -2);\n if (!parsed.every((x) => typeof x === elem)) {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (element type mismatch).`);\n }\n return parsed;\n};\n\nconst coerceFetched = (fetched: unknown, type: TypeTag | undefined, path: string): unknown => {\n if (type === undefined) {\n if (typeof fetched !== \"string\") {\n throw new Error(\n `Fetcher for '${path}' must return a string (add [TYPE] to use non-string values).`,\n );\n }\n return fetched;\n }\n if (typeof fetched === \"string\") return coerceFromString(fetched, type, path);\n if (matchesType(fetched, type)) return fetched;\n throw new Error(`Fetcher for '${path}' returned value that doesn't match [TYPE] '${type}'.`);\n};\n\nexport const buildEntry = (node: unknown, path: string, env: string): ConfigEntry => {\n if (!isConfigValPerEnv(node)) {\n return { path, value: node };\n }\n\n const envVar = node[ENV];\n const data = node[DATA];\n const defaultVal = node[DEFAULT];\n const typeTag = node[TYPE];\n const entry: ConfigEntry = { path };\n\n if (envVar && process.env[envVar] !== undefined) {\n const raw = process.env[envVar]!;\n entry.value = typeTag ? coerceFromString(raw, typeTag, path) : raw;\n } else if (node[env] !== undefined) {\n entry.value = node[env];\n }\n\n if (defaultVal !== undefined) entry.default = defaultVal;\n if (envVar) entry.envVar = envVar;\n if (data !== undefined) entry.data = data;\n if (typeTag !== undefined) entry.type = typeTag;\n\n return entry;\n};\n\nexport function* entriesIter(\n config: Obj,\n env: string,\n pathPrefix = \"\",\n): IterableIterator<[string, ConfigEntry]> {\n for (const [key, value] of Object.entries(config)) {\n const path = pathPrefix + key;\n if (isNestedConfig(value)) {\n yield* entriesIter(value, env, `${path}.`);\n } else {\n yield [path, buildEntry(value, path, env)];\n }\n }\n}\n\nexport const invokeSync = (source: unknown, path: string, env: string): unknown => {\n if (typeof source !== \"function\") return source;\n const result = (source as (env: string) => unknown)(env);\n if (isThenable(result)) {\n throw new Error(`Config at '${path}' requires async resolution (use resolve).`);\n }\n return result;\n};\n\nexport const invokeAsync = async (source: unknown, env: string): Promise<unknown> => {\n return typeof source === \"function\" ? await (source as (env: string) => unknown)(env) : source;\n};\n\nexport const resolveEntrySync = (entry: ConfigEntry, env: string): unknown => {\n if (\"value\" in entry) return invokeSync(entry.value, entry.path, env);\n if (\"default\" in entry) return invokeSync(entry.default, entry.path, env);\n throw new Error(`Config at '${entry.path}' requires async resolution (use resolve).`);\n};\n\nexport const resolveEntryAsync = async (\n entry: ConfigEntry,\n env: string,\n fetcher: Fetcher,\n): Promise<unknown> => {\n if (\"value\" in entry) return invokeAsync(entry.value, env);\n\n if (entry.envVar !== undefined || entry.data !== undefined) {\n const ctx: FetcherContext = {\n env,\n default: entry.default,\n envVar: entry.envVar,\n data: entry.data,\n type: entry.type,\n };\n const fetched = await fetcher(ctx);\n if (fetched !== undefined) return coerceFetched(fetched, entry.type, entry.path);\n }\n\n if (\"default\" in entry) return invokeAsync(entry.default, env);\n throw new Error(`Unable to resolve config value at '${entry.path}'.`);\n};\n\nexport const resolveSubtreeSync = (node: Obj, prefix: string, env: string): Obj => {\n const result: Obj = {};\n for (const [key, child] of Object.entries(node)) {\n const path = prefix ? `${prefix}.${key}` : key;\n result[key] = isNestedConfig(child)\n ? resolveSubtreeSync(child, path, env)\n : resolveEntrySync(buildEntry(child, path, env), env);\n }\n return result;\n};\n\nexport const resolveSubtreeAsync = async (\n node: Obj,\n prefix: string,\n env: string,\n fetcher: Fetcher,\n): Promise<Obj> => {\n const keys = Object.keys(node);\n const values = await Promise.all(\n keys.map((key) => {\n const child = node[key];\n const path = prefix ? `${prefix}.${key}` : key;\n return isNestedConfig(child)\n ? resolveSubtreeAsync(child, path, env, fetcher)\n : resolveEntryAsync(buildEntry(child, path, env), env, fetcher);\n }),\n );\n const result: Obj = {};\n keys.forEach((key, i) => {\n result[key] = values[i];\n });\n return result;\n};\n","import { CONFETTI } from \"./symbols\";\nimport type {\n Confetti,\n Config,\n ConfigEntry,\n Fetcher,\n Paths,\n SubtreePaths,\n ValidateConfig,\n ValueAtPath,\n} from \"./types\";\nimport {\n buildEntry,\n entriesIter,\n getAtPath,\n isNestedConfig,\n resolveEntryAsync,\n resolveEntrySync,\n resolveSubtreeAsync,\n resolveSubtreeSync,\n} from \"./util\";\n\nexport const makeConfig = <const C extends Config>(\n input: (C & ValidateConfig<C>) | ((env: string) => C & ValidateConfig<C>),\n): Confetti<C> => {\n const factory = typeof input === \"function\" ? input : () => input;\n\n const confetti = (env: string) => {\n const config = factory(env);\n\n const get = <P extends Paths<C> & string>(path: P): ValueAtPath<C, P> => {\n const node = getAtPath(config, path);\n const resolved = isNestedConfig(node)\n ? resolveSubtreeSync(node, path, env)\n : resolveEntrySync(buildEntry(node, path, env), env);\n return resolved as ValueAtPath<C, P>;\n };\n\n const resolve = async <P extends Paths<C> & string>(\n path: P,\n fetcher: Fetcher,\n ): Promise<ValueAtPath<C, P>> => {\n const node = getAtPath(config, path);\n const resolved = isNestedConfig(node)\n ? await resolveSubtreeAsync(node, path, env, fetcher)\n : await resolveEntryAsync(buildEntry(node, path, env), env, fetcher);\n return resolved as ValueAtPath<C, P>;\n };\n\n const entries = (\n startPath?: SubtreePaths<C> & string,\n ): IterableIterator<[string, ConfigEntry]> => {\n const root = startPath ? getAtPath(config, startPath) : config;\n if (!isNestedConfig(root)) {\n throw new Error(`'${startPath}' is not a config subtree.`);\n }\n return entriesIter(root, env, startPath ? `${startPath}.` : \"\");\n };\n\n return { config, get, resolve, entries };\n };\n\n confetti[CONFETTI] = \"CONFETTI\" as const;\n\n return confetti as Confetti<C>;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/symbols.ts","../src/util.ts","../src/make-config.ts"],"sourcesContent":["export const CONFETTI: unique symbol = Symbol.for(\"CONFETTI\");\nexport const DEFAULT: unique symbol = Symbol.for(\"CONFETTI_DEFAULT\");\nexport const ENV: unique symbol = Symbol.for(\"CONFETTI_ENV\");\nexport const DATA: unique symbol = Symbol.for(\"CONFETTI_DATA\");\nexport const TYPE: unique symbol = Symbol.for(\"CONFETTI_TYPE\");\n","import { CONFETTI, DATA, DEFAULT, ENV, TYPE } from \"./symbols\";\nimport type {\n ConfigEntry,\n Confetti,\n ConfigValPerEnv,\n Fetcher,\n FetcherContext,\n Obj,\n TypeTag,\n} from \"./types\";\n\nexport const isObj = (val: unknown): val is Obj => {\n return val !== null && typeof val === \"object\" && !Array.isArray(val);\n};\n\nexport const isConfigValPerEnv = (val: unknown): val is ConfigValPerEnv => {\n return isObj(val) && (DEFAULT in val || DATA in val || ENV in val || TYPE in val);\n};\n\nexport const isNestedConfig = (val: unknown): val is Obj => {\n return isObj(val) && !isConfigValPerEnv(val);\n};\n\nexport const isConfetti = (val: unknown): val is Confetti<any> => {\n return typeof val === \"function\" && Object.hasOwn(val, CONFETTI);\n};\n\nexport const isThenable = (v: unknown): v is PromiseLike<unknown> => {\n return (\n v !== null &&\n typeof v === \"object\" &&\n \"then\" in v &&\n typeof (v as { then: unknown }).then === \"function\"\n );\n};\n\nexport const getAtPath = (config: Obj, path: string): unknown => {\n if (!path) return config;\n const segments = path.split(\".\");\n let node: unknown = config;\n for (const segment of segments) {\n if (!isNestedConfig(node)) {\n throw new Error(`Invalid config path '${path}'.`);\n }\n node = node[segment];\n if (node === undefined) {\n throw new Error(`Invalid config path '${path}'.`);\n }\n }\n return node;\n};\n\nconst matchesType = (val: unknown, type: TypeTag): boolean => {\n if (type === \"string\") return typeof val === \"string\";\n if (type === \"number\") return typeof val === \"number\" && !Number.isNaN(val);\n if (type === \"boolean\") return typeof val === \"boolean\";\n if (!Array.isArray(val)) return false;\n const elem = type.slice(0, -2);\n return val.every((x) => typeof x === elem);\n};\n\nexport const coerceFromString = (raw: string, type: TypeTag, path: string): unknown => {\n if (type === \"string\") return raw;\n if (type === \"number\") {\n if (raw === \"\") throw new Error(`Cannot coerce empty string to number at '${path}'.`);\n const n = Number(raw);\n if (Number.isNaN(n)) throw new Error(`Cannot coerce '${raw}' to number at '${path}'.`);\n return n;\n }\n if (type === \"boolean\") {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n throw new Error(`Cannot coerce '${raw}' to boolean at '${path}' (expected 'true' or 'false').`);\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (invalid JSON).`);\n }\n if (!Array.isArray(parsed)) {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (not an array).`);\n }\n const elem = type.slice(0, -2);\n if (!parsed.every((x) => typeof x === elem)) {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (element type mismatch).`);\n }\n return parsed;\n};\n\nconst coerceFetched = (fetched: unknown, type: TypeTag | undefined, path: string): unknown => {\n if (type === undefined) {\n if (typeof fetched !== \"string\") {\n throw new Error(\n `Fetcher for '${path}' must return a string (add [TYPE] to use non-string values).`,\n );\n }\n return fetched;\n }\n if (typeof fetched === \"string\") return coerceFromString(fetched, type, path);\n if (matchesType(fetched, type)) return fetched;\n throw new Error(`Fetcher for '${path}' returned value that doesn't match [TYPE] '${type}'.`);\n};\n\nexport const buildEntry = (node: unknown, path: string, env: string): ConfigEntry => {\n if (!isConfigValPerEnv(node)) {\n return { path, value: node };\n }\n\n const envVar = node[ENV];\n const data = node[DATA];\n const defaultVal = node[DEFAULT];\n const typeTag = node[TYPE];\n const entry: ConfigEntry = { path };\n\n if (envVar && process.env[envVar] !== undefined) {\n const raw = process.env[envVar]!;\n entry.value = typeTag ? coerceFromString(raw, typeTag, path) : raw;\n } else if (node[env] !== undefined) {\n entry.value = node[env];\n }\n\n if (defaultVal !== undefined) entry.default = defaultVal;\n if (envVar) entry.envVar = envVar;\n if (data !== undefined) entry.data = data;\n if (typeTag !== undefined) entry.type = typeTag;\n\n return entry;\n};\n\nexport function* entriesIter(\n config: Obj,\n env: string,\n pathPrefix = \"\",\n): IterableIterator<[string, ConfigEntry]> {\n for (const [key, value] of Object.entries(config)) {\n const path = pathPrefix + key;\n if (isNestedConfig(value)) {\n yield* entriesIter(value, env, `${path}.`);\n } else {\n yield [path, buildEntry(value, path, env)];\n }\n }\n}\n\nexport const invokeSync = (source: unknown, path: string, env: string): unknown => {\n if (typeof source !== \"function\") return source;\n const result = (source as (env: string) => unknown)(env);\n if (isThenable(result)) {\n throw new Error(`Config at '${path}' requires async resolution (use resolve).`);\n }\n return result;\n};\n\nexport const invokeAsync = async (source: unknown, env: string): Promise<unknown> => {\n return typeof source === \"function\" ? await (source as (env: string) => unknown)(env) : source;\n};\n\nexport const resolveEntrySync = (entry: ConfigEntry, env: string): unknown => {\n if (\"value\" in entry) return invokeSync(entry.value, entry.path, env);\n if (\"default\" in entry) return invokeSync(entry.default, entry.path, env);\n throw new Error(`Config at '${entry.path}' requires async resolution (use resolve).`);\n};\n\nexport const resolveEntryAsync = async (\n entry: ConfigEntry,\n env: string,\n fetcher: Fetcher,\n): Promise<unknown> => {\n if (\"value\" in entry) return invokeAsync(entry.value, env);\n\n if (entry.envVar !== undefined || entry.data !== undefined) {\n const ctx: FetcherContext = {\n env,\n default: entry.default,\n envVar: entry.envVar,\n data: entry.data,\n type: entry.type,\n };\n const fetched = await fetcher(ctx);\n if (fetched !== undefined) return coerceFetched(fetched, entry.type, entry.path);\n }\n\n if (\"default\" in entry) return invokeAsync(entry.default, env);\n throw new Error(`Unable to resolve config value at '${entry.path}'.`);\n};\n\nexport const resolveSubtreeSync = (node: Obj, prefix: string, env: string): Obj => {\n const result: Obj = {};\n for (const [key, child] of Object.entries(node)) {\n const path = prefix ? `${prefix}.${key}` : key;\n result[key] = isNestedConfig(child)\n ? resolveSubtreeSync(child, path, env)\n : resolveEntrySync(buildEntry(child, path, env), env);\n }\n return result;\n};\n\nexport const resolveSubtreeAsync = async (\n node: Obj,\n prefix: string,\n env: string,\n fetcher: Fetcher,\n): Promise<Obj> => {\n const keys = Object.keys(node);\n const values = await Promise.all(\n keys.map((key) => {\n const child = node[key];\n const path = prefix ? `${prefix}.${key}` : key;\n return isNestedConfig(child)\n ? resolveSubtreeAsync(child, path, env, fetcher)\n : resolveEntryAsync(buildEntry(child, path, env), env, fetcher);\n }),\n );\n const result: Obj = {};\n keys.forEach((key, i) => {\n result[key] = values[i];\n });\n return result;\n};\n","import { CONFETTI } from \"./symbols\";\nimport type { Confetti, Config, ConfigEntry, Fetcher, SubtreePaths, ValidateConfig } from \"./types\";\nimport {\n buildEntry,\n entriesIter,\n getAtPath,\n isNestedConfig,\n resolveEntryAsync,\n resolveEntrySync,\n resolveSubtreeAsync,\n resolveSubtreeSync,\n} from \"./util\";\n\nexport function makeConfig<const C extends Config>(\n input: (env: string) => C & ValidateConfig<C>,\n): Confetti<C>;\nexport function makeConfig<const C extends Config>(input: C & ValidateConfig<C>): Confetti<C>;\nexport function makeConfig<const C extends Config>(\n input: (C & ValidateConfig<C>) | ((env: string) => C & ValidateConfig<C>),\n): Confetti<C> {\n const factory = typeof input === \"function\" ? input : () => input;\n\n const confetti = (env: string) => {\n const config = factory(env);\n\n const get = (path?: string): unknown => {\n if (!path) return resolveSubtreeSync(config, \"\", env);\n const node = getAtPath(config, path);\n return isNestedConfig(node)\n ? resolveSubtreeSync(node, path, env)\n : resolveEntrySync(buildEntry(node, path, env), env);\n };\n\n const resolve = async (\n pathOrFetcher: string | Fetcher,\n maybeFetcher?: Fetcher,\n ): Promise<unknown> => {\n if (typeof pathOrFetcher === \"function\") {\n return resolveSubtreeAsync(config, \"\", env, pathOrFetcher);\n }\n const path = pathOrFetcher;\n const fetcher = maybeFetcher!;\n const node = getAtPath(config, path);\n return isNestedConfig(node)\n ? resolveSubtreeAsync(node, path, env, fetcher)\n : resolveEntryAsync(buildEntry(node, path, env), env, fetcher);\n };\n\n const entries = (\n startPath?: SubtreePaths<C> & string,\n ): IterableIterator<[string, ConfigEntry]> => {\n const root = startPath ? getAtPath(config, startPath) : config;\n if (!isNestedConfig(root)) {\n throw new Error(`'${startPath}' is not a config subtree.`);\n }\n return entriesIter(root, env, startPath ? `${startPath}.` : \"\");\n };\n\n return { config, get, resolve, entries };\n };\n\n confetti[CONFETTI] = \"CONFETTI\" as const;\n\n return confetti as Confetti<C>;\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -97,7 +97,9 @@ type Confetti<C> = {
97
97
  [CONFETTI]: "CONFETTI";
98
98
  (env: string): {
99
99
  config: C;
100
+ get(): ResolvedConfig<C>;
100
101
  get<P extends Paths<C> & string>(path: P): ValueAtPath<C, P>;
102
+ resolve(fetcher: Fetcher): Promise<ResolvedConfig<C>>;
101
103
  resolve<P extends Paths<C> & string>(path: P, fetcher: Fetcher): Promise<ValueAtPath<C, P>>;
102
104
  entries(startPath?: SubtreePaths<C> & string): IterableIterator<[string, ConfigEntry]>;
103
105
  };
@@ -105,7 +107,8 @@ type Confetti<C> = {
105
107
  type GetConfig<T> = T extends Confetti<infer C> ? ResolvedConfig<C> : never;
106
108
  //#endregion
107
109
  //#region src/make-config.d.ts
108
- declare const makeConfig: <const C extends Config>(input: (C & ValidateConfig<C>) | ((env: string) => C & ValidateConfig<C>)) => Confetti<C>;
110
+ declare function makeConfig<const C extends Config>(input: (env: string) => C & ValidateConfig<C>): Confetti<C>;
111
+ declare function makeConfig<const C extends Config>(input: C & ValidateConfig<C>): Confetti<C>;
109
112
  //#endregion
110
113
  //#region src/util.d.ts
111
114
  declare const isObj: (val: unknown) => val is Obj;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/symbols.ts","../src/types.ts","../src/make-config.ts","../src/util.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/symbols.ts","../src/types.ts","../src/make-config.ts","../src/util.ts"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -97,7 +97,9 @@ type Confetti<C> = {
97
97
  [CONFETTI]: "CONFETTI";
98
98
  (env: string): {
99
99
  config: C;
100
+ get(): ResolvedConfig<C>;
100
101
  get<P extends Paths<C> & string>(path: P): ValueAtPath<C, P>;
102
+ resolve(fetcher: Fetcher): Promise<ResolvedConfig<C>>;
101
103
  resolve<P extends Paths<C> & string>(path: P, fetcher: Fetcher): Promise<ValueAtPath<C, P>>;
102
104
  entries(startPath?: SubtreePaths<C> & string): IterableIterator<[string, ConfigEntry]>;
103
105
  };
@@ -105,7 +107,8 @@ type Confetti<C> = {
105
107
  type GetConfig<T> = T extends Confetti<infer C> ? ResolvedConfig<C> : never;
106
108
  //#endregion
107
109
  //#region src/make-config.d.ts
108
- declare const makeConfig: <const C extends Config>(input: (C & ValidateConfig<C>) | ((env: string) => C & ValidateConfig<C>)) => Confetti<C>;
110
+ declare function makeConfig<const C extends Config>(input: (env: string) => C & ValidateConfig<C>): Confetti<C>;
111
+ declare function makeConfig<const C extends Config>(input: C & ValidateConfig<C>): Confetti<C>;
109
112
  //#endregion
110
113
  //#region src/util.d.ts
111
114
  declare const isObj: (val: unknown) => val is Obj;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/symbols.ts","../src/types.ts","../src/make-config.ts","../src/util.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/symbols.ts","../src/types.ts","../src/make-config.ts","../src/util.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -152,17 +152,21 @@ const resolveSubtreeAsync = async (node, prefix, env, fetcher) => {
152
152
  };
153
153
  //#endregion
154
154
  //#region src/make-config.ts
155
- const makeConfig = (input) => {
155
+ function makeConfig(input) {
156
156
  const factory = typeof input === "function" ? input : () => input;
157
157
  const confetti = (env) => {
158
158
  const config = factory(env);
159
159
  const get = (path) => {
160
+ if (!path) return resolveSubtreeSync(config, "", env);
160
161
  const node = getAtPath(config, path);
161
162
  return isNestedConfig(node) ? resolveSubtreeSync(node, path, env) : resolveEntrySync(buildEntry(node, path, env), env);
162
163
  };
163
- const resolve = async (path, fetcher) => {
164
+ const resolve = async (pathOrFetcher, maybeFetcher) => {
165
+ if (typeof pathOrFetcher === "function") return resolveSubtreeAsync(config, "", env, pathOrFetcher);
166
+ const path = pathOrFetcher;
167
+ const fetcher = maybeFetcher;
164
168
  const node = getAtPath(config, path);
165
- return isNestedConfig(node) ? await resolveSubtreeAsync(node, path, env, fetcher) : await resolveEntryAsync(buildEntry(node, path, env), env, fetcher);
169
+ return isNestedConfig(node) ? resolveSubtreeAsync(node, path, env, fetcher) : resolveEntryAsync(buildEntry(node, path, env), env, fetcher);
166
170
  };
167
171
  const entries = (startPath) => {
168
172
  const root = startPath ? getAtPath(config, startPath) : config;
@@ -178,7 +182,7 @@ const makeConfig = (input) => {
178
182
  };
179
183
  confetti[CONFETTI] = "CONFETTI";
180
184
  return confetti;
181
- };
185
+ }
182
186
  //#endregion
183
187
  export { CONFETTI, DATA, DEFAULT, ENV, TYPE, buildEntry, coerceFromString, entriesIter, getAtPath, invokeAsync, invokeSync, isConfetti, isConfigValPerEnv, isNestedConfig, isObj, isThenable, makeConfig, resolveEntryAsync, resolveEntrySync, resolveSubtreeAsync, resolveSubtreeSync };
184
188
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/symbols.ts","../src/util.ts","../src/make-config.ts"],"sourcesContent":["export const CONFETTI: unique symbol = Symbol.for(\"CONFETTI\");\nexport const DEFAULT: unique symbol = Symbol.for(\"CONFETTI_DEFAULT\");\nexport const ENV: unique symbol = Symbol.for(\"CONFETTI_ENV\");\nexport const DATA: unique symbol = Symbol.for(\"CONFETTI_DATA\");\nexport const TYPE: unique symbol = Symbol.for(\"CONFETTI_TYPE\");\n","import { CONFETTI, DATA, DEFAULT, ENV, TYPE } from \"./symbols\";\nimport type {\n ConfigEntry,\n Confetti,\n ConfigValPerEnv,\n Fetcher,\n FetcherContext,\n Obj,\n TypeTag,\n} from \"./types\";\n\nexport const isObj = (val: unknown): val is Obj => {\n return val !== null && typeof val === \"object\" && !Array.isArray(val);\n};\n\nexport const isConfigValPerEnv = (val: unknown): val is ConfigValPerEnv => {\n return isObj(val) && (DEFAULT in val || DATA in val || ENV in val || TYPE in val);\n};\n\nexport const isNestedConfig = (val: unknown): val is Obj => {\n return isObj(val) && !isConfigValPerEnv(val);\n};\n\nexport const isConfetti = (val: unknown): val is Confetti<any> => {\n return typeof val === \"function\" && Object.hasOwn(val, CONFETTI);\n};\n\nexport const isThenable = (v: unknown): v is PromiseLike<unknown> => {\n return (\n v !== null &&\n typeof v === \"object\" &&\n \"then\" in v &&\n typeof (v as { then: unknown }).then === \"function\"\n );\n};\n\nexport const getAtPath = (config: Obj, path: string): unknown => {\n if (!path) return config;\n const segments = path.split(\".\");\n let node: unknown = config;\n for (const segment of segments) {\n if (!isNestedConfig(node)) {\n throw new Error(`Invalid config path '${path}'.`);\n }\n node = node[segment];\n if (node === undefined) {\n throw new Error(`Invalid config path '${path}'.`);\n }\n }\n return node;\n};\n\nconst matchesType = (val: unknown, type: TypeTag): boolean => {\n if (type === \"string\") return typeof val === \"string\";\n if (type === \"number\") return typeof val === \"number\" && !Number.isNaN(val);\n if (type === \"boolean\") return typeof val === \"boolean\";\n if (!Array.isArray(val)) return false;\n const elem = type.slice(0, -2);\n return val.every((x) => typeof x === elem);\n};\n\nexport const coerceFromString = (raw: string, type: TypeTag, path: string): unknown => {\n if (type === \"string\") return raw;\n if (type === \"number\") {\n if (raw === \"\") throw new Error(`Cannot coerce empty string to number at '${path}'.`);\n const n = Number(raw);\n if (Number.isNaN(n)) throw new Error(`Cannot coerce '${raw}' to number at '${path}'.`);\n return n;\n }\n if (type === \"boolean\") {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n throw new Error(`Cannot coerce '${raw}' to boolean at '${path}' (expected 'true' or 'false').`);\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (invalid JSON).`);\n }\n if (!Array.isArray(parsed)) {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (not an array).`);\n }\n const elem = type.slice(0, -2);\n if (!parsed.every((x) => typeof x === elem)) {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (element type mismatch).`);\n }\n return parsed;\n};\n\nconst coerceFetched = (fetched: unknown, type: TypeTag | undefined, path: string): unknown => {\n if (type === undefined) {\n if (typeof fetched !== \"string\") {\n throw new Error(\n `Fetcher for '${path}' must return a string (add [TYPE] to use non-string values).`,\n );\n }\n return fetched;\n }\n if (typeof fetched === \"string\") return coerceFromString(fetched, type, path);\n if (matchesType(fetched, type)) return fetched;\n throw new Error(`Fetcher for '${path}' returned value that doesn't match [TYPE] '${type}'.`);\n};\n\nexport const buildEntry = (node: unknown, path: string, env: string): ConfigEntry => {\n if (!isConfigValPerEnv(node)) {\n return { path, value: node };\n }\n\n const envVar = node[ENV];\n const data = node[DATA];\n const defaultVal = node[DEFAULT];\n const typeTag = node[TYPE];\n const entry: ConfigEntry = { path };\n\n if (envVar && process.env[envVar] !== undefined) {\n const raw = process.env[envVar]!;\n entry.value = typeTag ? coerceFromString(raw, typeTag, path) : raw;\n } else if (node[env] !== undefined) {\n entry.value = node[env];\n }\n\n if (defaultVal !== undefined) entry.default = defaultVal;\n if (envVar) entry.envVar = envVar;\n if (data !== undefined) entry.data = data;\n if (typeTag !== undefined) entry.type = typeTag;\n\n return entry;\n};\n\nexport function* entriesIter(\n config: Obj,\n env: string,\n pathPrefix = \"\",\n): IterableIterator<[string, ConfigEntry]> {\n for (const [key, value] of Object.entries(config)) {\n const path = pathPrefix + key;\n if (isNestedConfig(value)) {\n yield* entriesIter(value, env, `${path}.`);\n } else {\n yield [path, buildEntry(value, path, env)];\n }\n }\n}\n\nexport const invokeSync = (source: unknown, path: string, env: string): unknown => {\n if (typeof source !== \"function\") return source;\n const result = (source as (env: string) => unknown)(env);\n if (isThenable(result)) {\n throw new Error(`Config at '${path}' requires async resolution (use resolve).`);\n }\n return result;\n};\n\nexport const invokeAsync = async (source: unknown, env: string): Promise<unknown> => {\n return typeof source === \"function\" ? await (source as (env: string) => unknown)(env) : source;\n};\n\nexport const resolveEntrySync = (entry: ConfigEntry, env: string): unknown => {\n if (\"value\" in entry) return invokeSync(entry.value, entry.path, env);\n if (\"default\" in entry) return invokeSync(entry.default, entry.path, env);\n throw new Error(`Config at '${entry.path}' requires async resolution (use resolve).`);\n};\n\nexport const resolveEntryAsync = async (\n entry: ConfigEntry,\n env: string,\n fetcher: Fetcher,\n): Promise<unknown> => {\n if (\"value\" in entry) return invokeAsync(entry.value, env);\n\n if (entry.envVar !== undefined || entry.data !== undefined) {\n const ctx: FetcherContext = {\n env,\n default: entry.default,\n envVar: entry.envVar,\n data: entry.data,\n type: entry.type,\n };\n const fetched = await fetcher(ctx);\n if (fetched !== undefined) return coerceFetched(fetched, entry.type, entry.path);\n }\n\n if (\"default\" in entry) return invokeAsync(entry.default, env);\n throw new Error(`Unable to resolve config value at '${entry.path}'.`);\n};\n\nexport const resolveSubtreeSync = (node: Obj, prefix: string, env: string): Obj => {\n const result: Obj = {};\n for (const [key, child] of Object.entries(node)) {\n const path = prefix ? `${prefix}.${key}` : key;\n result[key] = isNestedConfig(child)\n ? resolveSubtreeSync(child, path, env)\n : resolveEntrySync(buildEntry(child, path, env), env);\n }\n return result;\n};\n\nexport const resolveSubtreeAsync = async (\n node: Obj,\n prefix: string,\n env: string,\n fetcher: Fetcher,\n): Promise<Obj> => {\n const keys = Object.keys(node);\n const values = await Promise.all(\n keys.map((key) => {\n const child = node[key];\n const path = prefix ? `${prefix}.${key}` : key;\n return isNestedConfig(child)\n ? resolveSubtreeAsync(child, path, env, fetcher)\n : resolveEntryAsync(buildEntry(child, path, env), env, fetcher);\n }),\n );\n const result: Obj = {};\n keys.forEach((key, i) => {\n result[key] = values[i];\n });\n return result;\n};\n","import { CONFETTI } from \"./symbols\";\nimport type {\n Confetti,\n Config,\n ConfigEntry,\n Fetcher,\n Paths,\n SubtreePaths,\n ValidateConfig,\n ValueAtPath,\n} from \"./types\";\nimport {\n buildEntry,\n entriesIter,\n getAtPath,\n isNestedConfig,\n resolveEntryAsync,\n resolveEntrySync,\n resolveSubtreeAsync,\n resolveSubtreeSync,\n} from \"./util\";\n\nexport const makeConfig = <const C extends Config>(\n input: (C & ValidateConfig<C>) | ((env: string) => C & ValidateConfig<C>),\n): Confetti<C> => {\n const factory = typeof input === \"function\" ? input : () => input;\n\n const confetti = (env: string) => {\n const config = factory(env);\n\n const get = <P extends Paths<C> & string>(path: P): ValueAtPath<C, P> => {\n const node = getAtPath(config, path);\n const resolved = isNestedConfig(node)\n ? resolveSubtreeSync(node, path, env)\n : resolveEntrySync(buildEntry(node, path, env), env);\n return resolved as ValueAtPath<C, P>;\n };\n\n const resolve = async <P extends Paths<C> & string>(\n path: P,\n fetcher: Fetcher,\n ): Promise<ValueAtPath<C, P>> => {\n const node = getAtPath(config, path);\n const resolved = isNestedConfig(node)\n ? await resolveSubtreeAsync(node, path, env, fetcher)\n : await resolveEntryAsync(buildEntry(node, path, env), env, fetcher);\n return resolved as ValueAtPath<C, P>;\n };\n\n const entries = (\n startPath?: SubtreePaths<C> & string,\n ): IterableIterator<[string, ConfigEntry]> => {\n const root = startPath ? getAtPath(config, startPath) : config;\n if (!isNestedConfig(root)) {\n throw new Error(`'${startPath}' is not a config subtree.`);\n }\n return entriesIter(root, env, startPath ? `${startPath}.` : \"\");\n };\n\n return { config, get, resolve, entries };\n };\n\n confetti[CONFETTI] = \"CONFETTI\" as const;\n\n return confetti as Confetti<C>;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/symbols.ts","../src/util.ts","../src/make-config.ts"],"sourcesContent":["export const CONFETTI: unique symbol = Symbol.for(\"CONFETTI\");\nexport const DEFAULT: unique symbol = Symbol.for(\"CONFETTI_DEFAULT\");\nexport const ENV: unique symbol = Symbol.for(\"CONFETTI_ENV\");\nexport const DATA: unique symbol = Symbol.for(\"CONFETTI_DATA\");\nexport const TYPE: unique symbol = Symbol.for(\"CONFETTI_TYPE\");\n","import { CONFETTI, DATA, DEFAULT, ENV, TYPE } from \"./symbols\";\nimport type {\n ConfigEntry,\n Confetti,\n ConfigValPerEnv,\n Fetcher,\n FetcherContext,\n Obj,\n TypeTag,\n} from \"./types\";\n\nexport const isObj = (val: unknown): val is Obj => {\n return val !== null && typeof val === \"object\" && !Array.isArray(val);\n};\n\nexport const isConfigValPerEnv = (val: unknown): val is ConfigValPerEnv => {\n return isObj(val) && (DEFAULT in val || DATA in val || ENV in val || TYPE in val);\n};\n\nexport const isNestedConfig = (val: unknown): val is Obj => {\n return isObj(val) && !isConfigValPerEnv(val);\n};\n\nexport const isConfetti = (val: unknown): val is Confetti<any> => {\n return typeof val === \"function\" && Object.hasOwn(val, CONFETTI);\n};\n\nexport const isThenable = (v: unknown): v is PromiseLike<unknown> => {\n return (\n v !== null &&\n typeof v === \"object\" &&\n \"then\" in v &&\n typeof (v as { then: unknown }).then === \"function\"\n );\n};\n\nexport const getAtPath = (config: Obj, path: string): unknown => {\n if (!path) return config;\n const segments = path.split(\".\");\n let node: unknown = config;\n for (const segment of segments) {\n if (!isNestedConfig(node)) {\n throw new Error(`Invalid config path '${path}'.`);\n }\n node = node[segment];\n if (node === undefined) {\n throw new Error(`Invalid config path '${path}'.`);\n }\n }\n return node;\n};\n\nconst matchesType = (val: unknown, type: TypeTag): boolean => {\n if (type === \"string\") return typeof val === \"string\";\n if (type === \"number\") return typeof val === \"number\" && !Number.isNaN(val);\n if (type === \"boolean\") return typeof val === \"boolean\";\n if (!Array.isArray(val)) return false;\n const elem = type.slice(0, -2);\n return val.every((x) => typeof x === elem);\n};\n\nexport const coerceFromString = (raw: string, type: TypeTag, path: string): unknown => {\n if (type === \"string\") return raw;\n if (type === \"number\") {\n if (raw === \"\") throw new Error(`Cannot coerce empty string to number at '${path}'.`);\n const n = Number(raw);\n if (Number.isNaN(n)) throw new Error(`Cannot coerce '${raw}' to number at '${path}'.`);\n return n;\n }\n if (type === \"boolean\") {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n throw new Error(`Cannot coerce '${raw}' to boolean at '${path}' (expected 'true' or 'false').`);\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (invalid JSON).`);\n }\n if (!Array.isArray(parsed)) {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (not an array).`);\n }\n const elem = type.slice(0, -2);\n if (!parsed.every((x) => typeof x === elem)) {\n throw new Error(`Cannot coerce '${raw}' to ${type} at '${path}' (element type mismatch).`);\n }\n return parsed;\n};\n\nconst coerceFetched = (fetched: unknown, type: TypeTag | undefined, path: string): unknown => {\n if (type === undefined) {\n if (typeof fetched !== \"string\") {\n throw new Error(\n `Fetcher for '${path}' must return a string (add [TYPE] to use non-string values).`,\n );\n }\n return fetched;\n }\n if (typeof fetched === \"string\") return coerceFromString(fetched, type, path);\n if (matchesType(fetched, type)) return fetched;\n throw new Error(`Fetcher for '${path}' returned value that doesn't match [TYPE] '${type}'.`);\n};\n\nexport const buildEntry = (node: unknown, path: string, env: string): ConfigEntry => {\n if (!isConfigValPerEnv(node)) {\n return { path, value: node };\n }\n\n const envVar = node[ENV];\n const data = node[DATA];\n const defaultVal = node[DEFAULT];\n const typeTag = node[TYPE];\n const entry: ConfigEntry = { path };\n\n if (envVar && process.env[envVar] !== undefined) {\n const raw = process.env[envVar]!;\n entry.value = typeTag ? coerceFromString(raw, typeTag, path) : raw;\n } else if (node[env] !== undefined) {\n entry.value = node[env];\n }\n\n if (defaultVal !== undefined) entry.default = defaultVal;\n if (envVar) entry.envVar = envVar;\n if (data !== undefined) entry.data = data;\n if (typeTag !== undefined) entry.type = typeTag;\n\n return entry;\n};\n\nexport function* entriesIter(\n config: Obj,\n env: string,\n pathPrefix = \"\",\n): IterableIterator<[string, ConfigEntry]> {\n for (const [key, value] of Object.entries(config)) {\n const path = pathPrefix + key;\n if (isNestedConfig(value)) {\n yield* entriesIter(value, env, `${path}.`);\n } else {\n yield [path, buildEntry(value, path, env)];\n }\n }\n}\n\nexport const invokeSync = (source: unknown, path: string, env: string): unknown => {\n if (typeof source !== \"function\") return source;\n const result = (source as (env: string) => unknown)(env);\n if (isThenable(result)) {\n throw new Error(`Config at '${path}' requires async resolution (use resolve).`);\n }\n return result;\n};\n\nexport const invokeAsync = async (source: unknown, env: string): Promise<unknown> => {\n return typeof source === \"function\" ? await (source as (env: string) => unknown)(env) : source;\n};\n\nexport const resolveEntrySync = (entry: ConfigEntry, env: string): unknown => {\n if (\"value\" in entry) return invokeSync(entry.value, entry.path, env);\n if (\"default\" in entry) return invokeSync(entry.default, entry.path, env);\n throw new Error(`Config at '${entry.path}' requires async resolution (use resolve).`);\n};\n\nexport const resolveEntryAsync = async (\n entry: ConfigEntry,\n env: string,\n fetcher: Fetcher,\n): Promise<unknown> => {\n if (\"value\" in entry) return invokeAsync(entry.value, env);\n\n if (entry.envVar !== undefined || entry.data !== undefined) {\n const ctx: FetcherContext = {\n env,\n default: entry.default,\n envVar: entry.envVar,\n data: entry.data,\n type: entry.type,\n };\n const fetched = await fetcher(ctx);\n if (fetched !== undefined) return coerceFetched(fetched, entry.type, entry.path);\n }\n\n if (\"default\" in entry) return invokeAsync(entry.default, env);\n throw new Error(`Unable to resolve config value at '${entry.path}'.`);\n};\n\nexport const resolveSubtreeSync = (node: Obj, prefix: string, env: string): Obj => {\n const result: Obj = {};\n for (const [key, child] of Object.entries(node)) {\n const path = prefix ? `${prefix}.${key}` : key;\n result[key] = isNestedConfig(child)\n ? resolveSubtreeSync(child, path, env)\n : resolveEntrySync(buildEntry(child, path, env), env);\n }\n return result;\n};\n\nexport const resolveSubtreeAsync = async (\n node: Obj,\n prefix: string,\n env: string,\n fetcher: Fetcher,\n): Promise<Obj> => {\n const keys = Object.keys(node);\n const values = await Promise.all(\n keys.map((key) => {\n const child = node[key];\n const path = prefix ? `${prefix}.${key}` : key;\n return isNestedConfig(child)\n ? resolveSubtreeAsync(child, path, env, fetcher)\n : resolveEntryAsync(buildEntry(child, path, env), env, fetcher);\n }),\n );\n const result: Obj = {};\n keys.forEach((key, i) => {\n result[key] = values[i];\n });\n return result;\n};\n","import { CONFETTI } from \"./symbols\";\nimport type { Confetti, Config, ConfigEntry, Fetcher, SubtreePaths, ValidateConfig } from \"./types\";\nimport {\n buildEntry,\n entriesIter,\n getAtPath,\n isNestedConfig,\n resolveEntryAsync,\n resolveEntrySync,\n resolveSubtreeAsync,\n resolveSubtreeSync,\n} from \"./util\";\n\nexport function makeConfig<const C extends Config>(\n input: (env: string) => C & ValidateConfig<C>,\n): Confetti<C>;\nexport function makeConfig<const C extends Config>(input: C & ValidateConfig<C>): Confetti<C>;\nexport function makeConfig<const C extends Config>(\n input: (C & ValidateConfig<C>) | ((env: string) => C & ValidateConfig<C>),\n): Confetti<C> {\n const factory = typeof input === \"function\" ? input : () => input;\n\n const confetti = (env: string) => {\n const config = factory(env);\n\n const get = (path?: string): unknown => {\n if (!path) return resolveSubtreeSync(config, \"\", env);\n const node = getAtPath(config, path);\n return isNestedConfig(node)\n ? resolveSubtreeSync(node, path, env)\n : resolveEntrySync(buildEntry(node, path, env), env);\n };\n\n const resolve = async (\n pathOrFetcher: string | Fetcher,\n maybeFetcher?: Fetcher,\n ): Promise<unknown> => {\n if (typeof pathOrFetcher === \"function\") {\n return resolveSubtreeAsync(config, \"\", env, pathOrFetcher);\n }\n const path = pathOrFetcher;\n const fetcher = maybeFetcher!;\n const node = getAtPath(config, path);\n return isNestedConfig(node)\n ? resolveSubtreeAsync(node, path, env, fetcher)\n : resolveEntryAsync(buildEntry(node, path, env), env, fetcher);\n };\n\n const entries = (\n startPath?: SubtreePaths<C> & string,\n ): IterableIterator<[string, ConfigEntry]> => {\n const root = startPath ? getAtPath(config, startPath) : config;\n if (!isNestedConfig(root)) {\n throw new Error(`'${startPath}' is not a config subtree.`);\n }\n return entriesIter(root, env, startPath ? `${startPath}.` : \"\");\n };\n\n return { config, get, resolve, entries };\n };\n\n confetti[CONFETTI] = \"CONFETTI\" as const;\n\n return confetti as Confetti<C>;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jayalfredprufrock/confetti",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Describe your backend API as a contract and get a fully-typed http client without a compile step.",
5
5
  "homepage": "https://github.com/jayalfredprufrock/confetti#readme",
6
6
  "bugs": {