@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 +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;AAAA,MAAa,WAA0B,OAAO,IAAI,WAAW;AAC7D,MAAa,UAAyB,OAAO,IAAI,mBAAmB;AACpE,MAAa,MAAqB,OAAO,IAAI,eAAe;AAC5D,MAAa,OAAsB,OAAO,IAAI,gBAAgB;AAC9D,MAAa,OAAsB,OAAO,IAAI,gBAAgB;;;ACO9D,MAAa,SAAS,QAA6B;AACjD,QAAO,QAAQ,QAAQ,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,IAAI;;AAGvE,MAAa,qBAAqB,QAAyC;AACzE,QAAO,MAAM,IAAI,KAAK,WAAW,OAAO,QAAQ,OAAO,OAAO,OAAO,QAAQ;;AAG/E,MAAa,kBAAkB,QAA6B;AAC1D,QAAO,MAAM,IAAI,IAAI,CAAC,kBAAkB,IAAI;;AAG9C,MAAa,cAAc,QAAuC;AAChE,QAAO,OAAO,QAAQ,cAAc,OAAO,OAAO,KAAK,SAAS;;AAGlE,MAAa,cAAc,MAA0C;AACnE,QACE,MAAM,QACN,OAAO,MAAM,YACb,UAAU,KACV,OAAQ,EAAwB,SAAS;;AAI7C,MAAa,aAAa,QAAa,SAA0B;AAC/D,KAAI,CAAC,KAAM,QAAO;CAClB,MAAM,WAAW,KAAK,MAAM,IAAI;CAChC,IAAI,OAAgB;AACpB,MAAK,MAAM,WAAW,UAAU;AAC9B,MAAI,CAAC,eAAe,KAAK,CACvB,OAAM,IAAI,MAAM,wBAAwB,KAAK,IAAI;AAEnD,SAAO,KAAK;AACZ,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,wBAAwB,KAAK,IAAI;;AAGrD,QAAO;;AAGT,MAAM,eAAe,KAAc,SAA2B;AAC5D,KAAI,SAAS,SAAU,QAAO,OAAO,QAAQ;AAC7C,KAAI,SAAS,SAAU,QAAO,OAAO,QAAQ,YAAY,CAAC,OAAO,MAAM,IAAI;AAC3E,KAAI,SAAS,UAAW,QAAO,OAAO,QAAQ;AAC9C,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,QAAO;CAChC,MAAM,OAAO,KAAK,MAAM,GAAG,GAAG;AAC9B,QAAO,IAAI,OAAO,MAAM,OAAO,MAAM,KAAK;;AAG5C,MAAa,oBAAoB,KAAa,MAAe,SAA0B;AACrF,KAAI,SAAS,SAAU,QAAO;AAC9B,KAAI,SAAS,UAAU;AACrB,MAAI,QAAQ,GAAI,OAAM,IAAI,MAAM,4CAA4C,KAAK,IAAI;EACrF,MAAM,IAAI,OAAO,IAAI;AACrB,MAAI,OAAO,MAAM,EAAE,CAAE,OAAM,IAAI,MAAM,kBAAkB,IAAI,kBAAkB,KAAK,IAAI;AACtF,SAAO;;AAET,KAAI,SAAS,WAAW;AACtB,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,QAAS,QAAO;AAC5B,QAAM,IAAI,MAAM,kBAAkB,IAAI,mBAAmB,KAAK,iCAAiC;;CAEjG,IAAI;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,IAAI;SAClB;AACN,QAAM,IAAI,MAAM,kBAAkB,IAAI,OAAO,KAAK,OAAO,KAAK,mBAAmB;;AAEnF,KAAI,CAAC,MAAM,QAAQ,OAAO,CACxB,OAAM,IAAI,MAAM,kBAAkB,IAAI,OAAO,KAAK,OAAO,KAAK,mBAAmB;CAEnF,MAAM,OAAO,KAAK,MAAM,GAAG,GAAG;AAC9B,KAAI,CAAC,OAAO,OAAO,MAAM,OAAO,MAAM,KAAK,CACzC,OAAM,IAAI,MAAM,kBAAkB,IAAI,OAAO,KAAK,OAAO,KAAK,4BAA4B;AAE5F,QAAO;;AAGT,MAAM,iBAAiB,SAAkB,MAA2B,SAA0B;AAC5F,KAAI,SAAS,KAAA,GAAW;AACtB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,MACR,gBAAgB,KAAK,+DACtB;AAEH,SAAO;;AAET,KAAI,OAAO,YAAY,SAAU,QAAO,iBAAiB,SAAS,MAAM,KAAK;AAC7E,KAAI,YAAY,SAAS,KAAK,CAAE,QAAO;AACvC,OAAM,IAAI,MAAM,gBAAgB,KAAK,8CAA8C,KAAK,IAAI;;AAG9F,MAAa,cAAc,MAAe,MAAc,QAA6B;AACnF,KAAI,CAAC,kBAAkB,KAAK,CAC1B,QAAO;EAAE;EAAM,OAAO;EAAM;CAG9B,MAAM,SAAS,KAAK;CACpB,MAAM,OAAO,KAAK;CAClB,MAAM,aAAa,KAAK;CACxB,MAAM,UAAU,KAAK;CACrB,MAAM,QAAqB,EAAE,MAAM;AAEnC,KAAI,UAAU,QAAQ,IAAI,YAAY,KAAA,GAAW;EAC/C,MAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,QAAQ,UAAU,iBAAiB,KAAK,SAAS,KAAK,GAAG;YACtD,KAAK,SAAS,KAAA,EACvB,OAAM,QAAQ,KAAK;AAGrB,KAAI,eAAe,KAAA,EAAW,OAAM,UAAU;AAC9C,KAAI,OAAQ,OAAM,SAAS;AAC3B,KAAI,SAAS,KAAA,EAAW,OAAM,OAAO;AACrC,KAAI,YAAY,KAAA,EAAW,OAAM,OAAO;AAExC,QAAO;;AAGT,UAAiB,YACf,QACA,KACA,aAAa,IAC4B;AACzC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;EACjD,MAAM,OAAO,aAAa;AAC1B,MAAI,eAAe,MAAM,CACvB,QAAO,YAAY,OAAO,KAAK,GAAG,KAAK,GAAG;MAE1C,OAAM,CAAC,MAAM,WAAW,OAAO,MAAM,IAAI,CAAC;;;AAKhD,MAAa,cAAc,QAAiB,MAAc,QAAyB;AACjF,KAAI,OAAO,WAAW,WAAY,QAAO;CACzC,MAAM,SAAU,OAAoC,IAAI;AACxD,KAAI,WAAW,OAAO,CACpB,OAAM,IAAI,MAAM,cAAc,KAAK,4CAA4C;AAEjF,QAAO;;AAGT,MAAa,cAAc,OAAO,QAAiB,QAAkC;AACnF,QAAO,OAAO,WAAW,aAAa,MAAO,OAAoC,IAAI,GAAG;;AAG1F,MAAa,oBAAoB,OAAoB,QAAyB;AAC5E,KAAI,WAAW,MAAO,QAAO,WAAW,MAAM,OAAO,MAAM,MAAM,IAAI;AACrE,KAAI,aAAa,MAAO,QAAO,WAAW,MAAM,SAAS,MAAM,MAAM,IAAI;AACzE,OAAM,IAAI,MAAM,cAAc,MAAM,KAAK,4CAA4C;;AAGvF,MAAa,oBAAoB,OAC/B,OACA,KACA,YACqB;AACrB,KAAI,WAAW,MAAO,QAAO,YAAY,MAAM,OAAO,IAAI;AAE1D,KAAI,MAAM,WAAW,KAAA,KAAa,MAAM,SAAS,KAAA,GAAW;EAQ1D,MAAM,UAAU,MAAM,QAPM;GAC1B;GACA,SAAS,MAAM;GACf,QAAQ,MAAM;GACd,MAAM,MAAM;GACZ,MAAM,MAAM;GACb,CACiC;AAClC,MAAI,YAAY,KAAA,EAAW,QAAO,cAAc,SAAS,MAAM,MAAM,MAAM,KAAK;;AAGlF,KAAI,aAAa,MAAO,QAAO,YAAY,MAAM,SAAS,IAAI;AAC9D,OAAM,IAAI,MAAM,sCAAsC,MAAM,KAAK,IAAI;;AAGvE,MAAa,sBAAsB,MAAW,QAAgB,QAAqB;CACjF,MAAM,SAAc,EAAE;AACtB,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,EAAE;EAC/C,MAAM,OAAO,SAAS,GAAG,OAAO,GAAG,QAAQ;AAC3C,SAAO,OAAO,eAAe,MAAM,GAC/B,mBAAmB,OAAO,MAAM,IAAI,GACpC,iBAAiB,WAAW,OAAO,MAAM,IAAI,EAAE,IAAI;;AAEzD,QAAO;;AAGT,MAAa,sBAAsB,OACjC,MACA,QACA,KACA,YACiB;CACjB,MAAM,OAAO,OAAO,KAAK,KAAK;CAC9B,MAAM,SAAS,MAAM,QAAQ,IAC3B,KAAK,KAAK,QAAQ;EAChB,MAAM,QAAQ,KAAK;EACnB,MAAM,OAAO,SAAS,GAAG,OAAO,GAAG,QAAQ;AAC3C,SAAO,eAAe,MAAM,GACxB,oBAAoB,OAAO,MAAM,KAAK,QAAQ,GAC9C,kBAAkB,WAAW,OAAO,MAAM,IAAI,EAAE,KAAK,QAAQ;GACjE,CACH;CACD,MAAM,SAAc,EAAE;AACtB,MAAK,SAAS,KAAK,MAAM;AACvB,SAAO,OAAO,OAAO;GACrB;AACF,QAAO;;;;AC7MT,MAAa,cACX,UACgB;CAChB,MAAM,UAAU,OAAO,UAAU,aAAa,cAAc;CAE5D,MAAM,YAAY,QAAgB;EAChC,MAAM,SAAS,QAAQ,IAAI;EAE3B,MAAM,OAAO,SAA2B;AACtC,OAAI,CAAC,KAAM,QAAO,mBAAmB,QAAQ,IAAI,IAAI;GACrD,MAAM,OAAO,UAAU,QAAQ,KAAK;AACpC,UAAO,eAAe,KAAK,GACvB,mBAAmB,MAAM,MAAM,IAAI,GACnC,iBAAiB,WAAW,MAAM,MAAM,IAAI,EAAE,IAAI;;EAGxD,MAAM,UAAU,OACd,eACA,iBACqB;AACrB,OAAI,OAAO,kBAAkB,WAC3B,QAAO,oBAAoB,QAAQ,IAAI,KAAK,cAAc;GAE5D,MAAM,OAAO;GACb,MAAM,UAAU;GAChB,MAAM,OAAO,UAAU,QAAQ,KAAK;AACpC,UAAO,eAAe,KAAK,GACvB,oBAAoB,MAAM,MAAM,KAAK,QAAQ,GAC7C,kBAAkB,WAAW,MAAM,MAAM,IAAI,EAAE,KAAK,QAAQ;;EAGlE,MAAM,WACJ,cAC4C;GAC5C,MAAM,OAAO,YAAY,UAAU,QAAQ,UAAU,GAAG;AACxD,OAAI,CAAC,eAAe,KAAK,CACvB,OAAM,IAAI,MAAM,IAAI,UAAU,4BAA4B;AAE5D,UAAO,YAAY,MAAM,KAAK,YAAY,GAAG,UAAU,KAAK,GAAG;;AAGjE,SAAO;GAAE;GAAQ;GAAK;GAAS;GAAS;;AAG1C,UAAS,YAAY;AAErB,QAAO"}
|
|
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
|
|
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;
|
package/dist/index.d.cts.map
CHANGED
|
@@ -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
|
|
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;
|
package/dist/index.d.mts.map
CHANGED
|
@@ -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
|
-
|
|
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
|
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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": {
|