@jayalfredprufrock/confetti 0.2.1 → 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/dist/index.cjs CHANGED
@@ -153,7 +153,7 @@ 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);
@@ -183,7 +183,7 @@ const makeConfig = (input) => {
183
183
  };
184
184
  confetti[CONFETTI] = "CONFETTI";
185
185
  return confetti;
186
- };
186
+ }
187
187
  //#endregion
188
188
  exports.CONFETTI = CONFETTI;
189
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 { 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 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 = (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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"}
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
@@ -107,7 +107,8 @@ type Confetti<C> = {
107
107
  type GetConfig<T> = T extends Confetti<infer C> ? ResolvedConfig<C> : never;
108
108
  //#endregion
109
109
  //#region src/make-config.d.ts
110
- 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>;
111
112
  //#endregion
112
113
  //#region src/util.d.ts
113
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
@@ -107,7 +107,8 @@ type Confetti<C> = {
107
107
  type GetConfig<T> = T extends Confetti<infer C> ? ResolvedConfig<C> : never;
108
108
  //#endregion
109
109
  //#region src/make-config.d.ts
110
- 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>;
111
112
  //#endregion
112
113
  //#region src/util.d.ts
113
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,7 +152,7 @@ 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);
@@ -182,7 +182,7 @@ const makeConfig = (input) => {
182
182
  };
183
183
  confetti[CONFETTI] = "CONFETTI";
184
184
  return confetti;
185
- };
185
+ }
186
186
  //#endregion
187
187
  export { CONFETTI, DATA, DEFAULT, ENV, TYPE, buildEntry, coerceFromString, entriesIter, getAtPath, invokeAsync, invokeSync, isConfetti, isConfigValPerEnv, isNestedConfig, isObj, isThenable, makeConfig, resolveEntryAsync, resolveEntrySync, resolveSubtreeAsync, resolveSubtreeSync };
188
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 { 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 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 = (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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"}
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.1",
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": {