@jayalfredprufrock/confetti 0.1.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +251 -0
- package/dist/index.cjs +167 -88
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +90 -28
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +90 -28
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +154 -86
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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_VAR: unique symbol = Symbol.for(\"CONFETTI_ENV_VAR\");\nexport const DATA: unique symbol = Symbol.for(\"CONFETTI_DATA\");\n","import { CONFETTI, DATA, DEFAULT, ENV_VAR } from \"./symbols\";\nimport type { Confetti, ConfigFlatMapContext, ConfigVal, ConfigValPerEnv, Obj } 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_VAR in 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 configFlatMap = <T>(\n env: string,\n obj: Obj,\n map: (context: ConfigFlatMapContext) => T | T[],\n _currentPath = \"\",\n): T[] => {\n return Object.entries(obj).flatMap(([key, value]) => {\n const path = `${_currentPath}${key}`;\n\n if (isObj(value)) {\n if (isConfigValPerEnv(value)) {\n let unresolvedValue: ConfigVal | undefined;\n\n // first resolve environment variable if it exists\n if (value[ENV_VAR] && process.env[value[ENV_VAR]] !== undefined) {\n try {\n unresolvedValue = JSON.parse(process.env[value[ENV_VAR]]!);\n } catch {\n unresolvedValue = process.env[value[ENV_VAR]];\n }\n }\n // second resolve any explicit environment value\n else if (value[env] !== undefined) {\n unresolvedValue = value[env];\n }\n // finally look for a default value\n else if (value[DEFAULT] !== undefined) {\n unresolvedValue = value[DEFAULT];\n }\n\n if (unresolvedValue === undefined) {\n throw new Error(`Unable to find '${env}' config value at '${path}`);\n }\n\n return map({ path, unresolvedValue, envVar: value[ENV_VAR], data: value[DATA] });\n }\n\n return configFlatMap(env, value, map, `${path}.`);\n }\n\n return map({ path, unresolvedValue: value as ConfigVal });\n });\n};\n\nexport const setAtPath = (obj: Obj, path: string, value: unknown) => {\n const segments = path.split(\".\");\n\n let objAtSeg: any = obj;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i] ?? \"\";\n if (segments.length === i + 1) {\n objAtSeg[segment] = value;\n } else {\n if (!isObj(objAtSeg[segment])) {\n objAtSeg[segment] = {};\n }\n objAtSeg = objAtSeg[segment];\n }\n }\n};\n","import { CONFETTI } from \"./symbols\";\nimport type { Confetti, Config, ConfigFlatMapContext, Obj, ResolvedConfig } from \"./types\";\nimport { configFlatMap, setAtPath } from \"./util\";\n\nexport const makeConfig = <C extends Config>(makeConfig: (env: string) => C): Confetti<C> => {\n const confetti = (env: string) => {\n const config = makeConfig(env);\n\n const flatMap = <T>(transform: (context: ConfigFlatMapContext) => T | T[]) =>\n configFlatMap<T>(env, config, transform);\n\n const contextByPath = Object.fromEntries(flatMap((context) => [[context.path, context]]));\n\n const resolveValue = async (path: string): Promise<any> => {\n const context = contextByPath[path];\n if (!context) throw new Error(`Invalid config path '${path}'.`);\n const { unresolvedValue } = context;\n const value =\n typeof unresolvedValue === \"function\" ? await unresolvedValue(context) : unresolvedValue;\n if (value === undefined) {\n throw new Error(`Config value at '${path}' resolved to undefined.`);\n }\n return value;\n };\n\n const resolveValueSync = (path: string): any => {\n const context = contextByPath[path];\n if (!context) throw new Error(`Invalid config path '${path}'.`);\n const { unresolvedValue } = context;\n if (typeof unresolvedValue === \"function\") {\n throw new Error(`Cannot resolve config value at \"${path}\" synchronously.`);\n }\n return unresolvedValue;\n };\n\n const resolve = async (): Promise<any> => {\n const resolvedConfig: Obj = {};\n const promises = Object.keys(contextByPath).map(async (path) => {\n return resolveValue(path).then((resolvedValue) =>\n setAtPath(resolvedConfig, path, resolvedValue),\n );\n });\n\n await Promise.all(promises);\n\n return resolvedConfig;\n };\n\n const resolveSync = (): any => {\n const resolvedConfig: Obj = {};\n for (const path of Object.keys(contextByPath)) {\n setAtPath(resolvedConfig, path, resolveValueSync(path));\n }\n return resolvedConfig as ResolvedConfig<C>;\n };\n\n const resolveEnv = async (): Promise<any> => {\n const envVars: Obj<string> = {};\n const promises = Object.values(contextByPath).flatMap(async (context) => {\n const { envVar } = context;\n if (!envVar) return [];\n return resolveValue(context.path).then((resolvedValue) => {\n envVars[envVar] = JSON.stringify(resolvedValue);\n });\n });\n\n await Promise.all(promises);\n\n return envVars;\n };\n\n return {\n config,\n flatMap,\n resolveValue,\n resolveValueSync,\n resolve,\n resolveSync,\n resolveEnv,\n };\n };\n\n confetti[CONFETTI] = \"CONFETTI\" as const;\n\n return confetti;\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 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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jayalfredprufrock/confetti",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
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": {
|