@jeengbe/config 0.0.0 → 0.0.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/dist/ast.d.mts +1 -1
- package/dist/ast.d.mts.map +1 -1
- package/dist/ast.mjs +1 -1
- package/dist/ast.mjs.map +1 -1
- package/dist/env.d.mts +2 -3
- package/dist/env.d.mts.map +1 -1
- package/dist/env.mjs +2 -1
- package/dist/env.mjs.map +1 -1
- package/dist/if-enabled.mjs +1 -1
- package/dist/if-enabled.mjs.map +1 -1
- package/dist/validation.d.mts +9 -0
- package/dist/validation.d.mts.map +1 -0
- package/dist/validation.mjs +14 -0
- package/dist/validation.mjs.map +1 -0
- package/package.json +11 -5
package/dist/ast.d.mts
CHANGED
package/dist/ast.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.d.mts","names":[],"sources":["../src/ast.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ast.d.mts","names":[],"sources":["../src/ast.ts"],"mappings":";;cAGM;cAEO,QAAQ;WAIR,WACP,cACA,YAAY,uCACT,iBAAiB;oBANE;EAE1B,YACW,WACP,cACA,YAAY,uCACT,iBAAiB;EAGxB,UAAU,GAAG,YAAY,OAAO,MAAM,iBAAiB,KAAK,QAAQ;;cAKzD,cAAc,WAAW,QAAQ;WAEjC;mBACQ;EAFnB,YACW,aACQ,gBAAgB,8BAA8B,iBAAiB;EASlF,YAAY,cAAc;EAMjB,UAAU,GAAG,YAAY,OAAO,MAAM,iBAAiB,KAAK,cAAc;;KAKzE,UAAU;GAAsB,cAAc;;KAE9C,aAAa,UAAU,WACjC,UAAU,cAAc,KACpB,IACA,UAAU,eAAe,cACpB,WAAW,IAAI,aAAa,EAAE;KAG7B,OAAO,KAAK,iBAAgB,uBAAsB,WAAW,IAAI,OAAO,EAAE,SAAQ"}
|
package/dist/ast.mjs
CHANGED
package/dist/ast.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast.mjs","names":[],"sources":["../src/ast.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"ast.mjs","names":[],"sources":["../src/ast.ts"],"sourcesContent":["import type { ValidationResult } from './validation.js';\nimport { Either } from '@jeengbe/prelude';\n\nconst nodeType = Symbol('type');\n\nexport class EnvNode<T> {\n declare private readonly [nodeType]: T;\n\n constructor(\n readonly validate: (\n path: string,\n loadValue: (key: string) => string | undefined,\n ) => ValidationResult<T>,\n ) {}\n\n transform<U>(transform: (value: T) => ValidationResult<U>): EnvNode<U> {\n return new EnvNode((path, loadValue) => this.validate(path, loadValue).flatMap(transform));\n }\n}\n\nexport class ScalarEnvNode<T> extends EnvNode<T> {\n constructor(\n readonly key: string,\n private readonly validateValue: (value: string | undefined) => ValidationResult<T>,\n ) {\n super((path, loadValue) => {\n return validateValue(loadValue(key)).leftMap((errors) =>\n errors.map((error) => `${key} (${path}): ${error}`),\n );\n });\n }\n\n optional(): ScalarEnvNode<T | undefined> {\n return new ScalarEnvNode<T | undefined>(this.key, (value) =>\n value === undefined ? Either.right(undefined) : this.validateValue(value),\n );\n }\n\n override transform<U>(transform: (value: T) => ValidationResult<U>): ScalarEnvNode<U> {\n return new ScalarEnvNode(this.key, (value) => this.validateValue(value).flatMap(transform));\n }\n}\n\nexport type EnvSpec = EnvNode<unknown> | { [key: string]: EnvSpec };\n\nexport type InferEnvSpec<T extends EnvSpec> =\n T extends EnvNode<infer U>\n ? U\n : T extends Record<string, EnvSpec>\n ? { [K in keyof T]: InferEnvSpec<T[K]> }\n : never;\n\nexport type Pretty<T> = T extends infer U extends object ? { [K in keyof U]: Pretty<U[K]> } : T;\n"],"mappings":";;;AAGA,MAAM,WAAW,OAAO,MAAM;AAE9B,IAAa,UAAb,MAAa,QAAW;CAIX;CADX,YACE,AAAS,UAIT;EAJS;CAIR;CAEH,UAAa,WAA0D;EACrE,OAAO,IAAI,SAAS,MAAM,cAAc,KAAK,SAAS,MAAM,SAAS,CAAC,CAAC,QAAQ,SAAS,CAAC;CAC3F;AACF;AAEA,IAAa,gBAAb,MAAa,sBAAyB,QAAW;CAEpC;CACQ;CAFnB,YACE,AAAS,KACT,AAAiB,eACjB;EACA,OAAO,MAAM,cAAc;GACzB,OAAO,cAAc,UAAU,GAAG,CAAC,CAAC,CAAC,SAAS,WAC5C,OAAO,KAAK,UAAU,GAAG,IAAI,IAAI,KAAK,KAAK,OAAO,CACpD;EACF,CAAC;EAPQ;EACQ;CAOnB;CAEA,WAAyC;EACvC,OAAO,IAAI,cAA6B,KAAK,MAAM,UACjD,UAAU,YAAY,OAAO,MAAM,SAAS,IAAI,KAAK,cAAc,KAAK,CAC1E;CACF;CAEA,AAAS,UAAa,WAAgE;EACpF,OAAO,IAAI,cAAc,KAAK,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,CAAC,QAAQ,SAAS,CAAC;CAC5F;AACF"}
|
package/dist/env.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { ValidationResult } from "./validation.mjs";
|
|
1
2
|
import { EnvNode, EnvSpec, InferEnvSpec, Pretty, ScalarEnvNode } from "./ast.mjs";
|
|
2
|
-
import { ValidationResult } from "@prisjakt/utils";
|
|
3
3
|
//#region src/env.d.ts
|
|
4
4
|
declare const env: {
|
|
5
5
|
string(key: string, defaultValue?: string): ScalarEnvNode<string>;
|
|
@@ -11,8 +11,7 @@ declare const env: {
|
|
|
11
11
|
discriminate<K extends string, V extends string, M extends Partial<Record<V, Record<string, EnvSpec>>>>(discriminatorKey: K, discriminatorValueType: ScalarEnvNode<V>, mapping: M): EnvNode<DiscriminatorResult<K, V, M>>;
|
|
12
12
|
load<S extends EnvSpec>(spec: S): Pretty<InferEnvSpec<S>>;
|
|
13
13
|
};
|
|
14
|
-
type DiscriminatorResult<K extends string, V extends string, M extends Partial<Record<V, Record<string, EnvSpec>>>> = Pretty<V extends unknown
|
|
15
|
-
? Record<K, V> & InferEnvSpec<M[V] extends EnvSpec ? M[V] : {}> : never>;
|
|
14
|
+
type DiscriminatorResult<K extends string, V extends string, M extends Partial<Record<V, Record<string, EnvSpec>>>> = Pretty<V extends unknown ? Record<K, V> & InferEnvSpec<M[V] extends EnvSpec ? M[V] : {}> : never>;
|
|
16
15
|
//#endregion
|
|
17
16
|
export { env };
|
|
18
17
|
//# sourceMappingURL=env.d.mts.map
|
package/dist/env.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.mts","names":[],"sources":["../src/env.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"env.d.mts","names":[],"sources":["../src/env.ts"],"mappings":";;;cAMa;EACX,OAAM,aAAY,wBAA0B;EAI5C,OAAM,aAAY,wBAA0B;EAc5C,QAAO,aAAY,yBAA2B;EAa9C,WAAW,kBAAgB,aACd,iBACM,KAAG,eACL,IACd,cAAc;EAcjB,OAAO,GAAC,aACK,YACC,kBAAkB,iBAAiB,IAAE,eAClC,IACd,cAAc;EAWjB,MAAM,GAAC,UAAY,cAAc,IAAE,wBAA0B,MAAM,iBAAiB;EAoBpF,aACE,kBACA,kBACA,UAAU,QAAQ,OAAO,GAAG,eAAe,YAAU,kBAEnC,GAAC,wBACK,cAAc,IAAE,SAC/B,IACR,QAAQ,oBAAoB,GAAG,GAAG;EAkBrC,KAAK,UAAU,SAAO,MAAQ,IAAI,OAAO,aAAa;;KASnD,oBACH,kBACA,kBACA,UAAU,QAAQ,OAAO,GAAG,eAAe,cACzC,OAGF,oBAAoB,OAAO,GAAG,KAAK,aAAa,EAAE,WAAW,UAAU,EAAE"}
|
package/dist/env.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EnvNode, ScalarEnvNode } from "./ast.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { arrayIncludes, combineValidationResults } from "./validation.mjs";
|
|
3
|
+
import { Either } from "@jeengbe/prelude";
|
|
3
4
|
|
|
4
5
|
//#region src/env.ts
|
|
5
6
|
const env = {
|
package/dist/env.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.mjs","names":[],"sources":["../src/env.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"env.mjs","names":[],"sources":["../src/env.ts"],"sourcesContent":["import type { EnvSpec, InferEnvSpec, Pretty } from './ast.js';\nimport { EnvNode, ScalarEnvNode } from './ast.js';\nimport type { ValidationResult } from './validation.js';\nimport { arrayIncludes, combineValidationResults } from './validation.js';\nimport { Either } from '@jeengbe/prelude';\n\nexport const env = {\n string(key: string, defaultValue?: string): ScalarEnvNode<string> {\n return env.custom(key, (value) => Either.right(value), defaultValue);\n },\n\n number(key: string, defaultValue?: number): ScalarEnvNode<number> {\n return env.custom(\n key,\n (value) => {\n if (/^-?\\d+(?:\\.\\d+)?$/.test(value)) {\n return Either.right(Number(value));\n }\n\n return Either.left(['invalid number']);\n },\n defaultValue,\n );\n },\n\n boolean(key: string, defaultValue?: boolean): ScalarEnvNode<boolean> {\n return env.custom(\n key,\n (value) => {\n if (value.toLowerCase() === 'true') return Either.right(true);\n if (value.toLowerCase() === 'false') return Either.right(false);\n\n return Either.left([\"invalid boolean (must be 'true' or 'false')\"]);\n },\n defaultValue,\n );\n },\n\n enum<const T extends string>(\n key: string,\n values: readonly T[],\n defaultValue?: T,\n ): ScalarEnvNode<T> {\n return env.custom(\n key,\n (value) => {\n if (arrayIncludes(values, value)) return Either.right(value);\n\n return Either.left([\n `invalid enum value (must be one of: ${values.map((v) => `'${v}'`).join(', ')})`,\n ]);\n },\n defaultValue,\n );\n },\n\n custom<T>(\n key: string,\n transform: (value: string) => ValidationResult<T>,\n defaultValue?: T,\n ): ScalarEnvNode<T> {\n return new ScalarEnvNode(key, (value) => {\n if (value === undefined) {\n if (defaultValue !== undefined) return Either.right(defaultValue);\n return Either.left(['required']);\n }\n\n return transform(value);\n });\n },\n\n array<T>(itemType: ScalarEnvNode<T>, defaultValue?: readonly T[]): EnvNode<readonly T[]> {\n return new EnvNode((path, loadValue) => {\n const value = loadValue(itemType.key);\n if (value === undefined) {\n if (defaultValue !== undefined) return Either.right(defaultValue);\n return Either.left([`${itemType.key} (${path}): required`]);\n }\n if (value === '') return Either.right([]);\n\n return combineValidationResults(\n ...value\n .split(',')\n .map((v) => v.trim() || undefined)\n .map((v, i) =>\n itemType.validate(`${path}.${i}`, (k) => (k === itemType.key ? v : undefined)),\n ),\n );\n });\n },\n\n discriminate<\n K extends string,\n V extends string,\n M extends Partial<Record<V, Record<string, EnvSpec>>>,\n >(\n discriminatorKey: K,\n discriminatorValueType: ScalarEnvNode<V>,\n mapping: M,\n ): EnvNode<DiscriminatorResult<K, V, M>> {\n return new EnvNode((path, loadValue) => {\n return discriminatorValueType.validate(path, loadValue).flatMap((discriminatorValue) => {\n return resolveNode<NonNullable<M[keyof M]> | {}>(\n path,\n mapping[discriminatorValue] ?? {},\n loadValue,\n ).map(\n (mappingValues) =>\n ({\n [discriminatorKey]: discriminatorValue,\n ...mappingValues,\n }) as DiscriminatorResult<K, V, M>,\n );\n });\n });\n },\n\n load<S extends EnvSpec>(spec: S): Pretty<InferEnvSpec<S>> {\n return resolveNode('$', spec, (key) => process.env[key]?.trim() || undefined).getOrElse(\n (errors) => {\n throw new Error(`Failed to load config: ${errors.join(', ')}`);\n },\n );\n },\n};\n\ntype DiscriminatorResult<\n K extends string,\n V extends string,\n M extends Partial<Record<V, Record<string, EnvSpec>>>,\n> = Pretty<\n // This \"redundant\" condition is necessary to make sure that 'DiscriminatorResult' distributes over\n // the union type V\n V extends unknown ? Record<K, V> & InferEnvSpec<M[V] extends EnvSpec ? M[V] : {}> : never\n>;\n\nfunction resolveNode<S extends EnvSpec>(\n path: string,\n spec: S,\n loadValue: (key: string) => string | undefined,\n): ValidationResult<Pretty<InferEnvSpec<S>>> {\n if (spec instanceof EnvNode) {\n return (spec as EnvNode<Pretty<InferEnvSpec<S>>>).validate(path, loadValue);\n }\n\n return combineValidationResults(\n ...Object.entries(spec).map(([key, value]) =>\n resolveNode(`${path}.${key}`, value, loadValue).map((v) => [key, v] as const),\n ),\n ).map((entries) => Object.fromEntries(entries) as Pretty<InferEnvSpec<S>>);\n}\n"],"mappings":"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"}
|
package/dist/if-enabled.mjs
CHANGED
package/dist/if-enabled.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"if-enabled.mjs","names":[],"sources":["../src/if-enabled.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"if-enabled.mjs","names":[],"sources":["../src/if-enabled.ts"],"sourcesContent":["import type { EnvNode, EnvSpec, InferEnvSpec } from './ast.js';\nimport { env } from './env.js';\nimport type { ValidationResult } from './validation.js';\nimport { Either } from '@jeengbe/prelude';\n\ntype IfEnabled<T> =\n | ({\n enabled: true;\n } & T)\n | { enabled: false };\n\nexport function ifEnabled<T extends Record<string, EnvSpec>>(\n envVar: string,\n config: T,\n defaultEnabled = false,\n): EnvNode<IfEnabled<InferEnvSpec<T>>> {\n // Since discriminate only works with string values, we need to bridge 'true' -> 'enabled' -> true\n return env\n .discriminate(\n 'enabled',\n env\n .boolean(envVar, defaultEnabled)\n .transform(\n (v): ValidationResult<'enabled' | 'disabled'> => Either.right(v ? 'enabled' : 'disabled'),\n ),\n {\n enabled: config,\n },\n )\n .transform((value): ValidationResult<IfEnabled<InferEnvSpec<T>>> => {\n if (value.enabled === 'enabled') {\n return Either.right({\n ...value,\n enabled: true,\n });\n }\n\n return Either.right({\n enabled: false,\n });\n });\n}\n"],"mappings":";;;;AAWA,SAAgB,UACd,QACA,QACA,iBAAiB,OACoB;CAErC,OAAO,IACJ,aACC,WACA,IACG,QAAQ,QAAQ,cAAc,CAAC,CAC/B,WACE,MAAgD,OAAO,MAAM,IAAI,YAAY,UAAU,CAC1F,GACF,EACE,SAAS,OACX,CACF,CAAC,CACA,WAAW,UAAwD;EAClE,IAAI,MAAM,YAAY,WAAW;GAC/B,OAAO,OAAO,MAAM;IAClB,GAAG;IACH,SAAS;GACX,CAAC;EACH;EAEA,OAAO,OAAO,MAAM,EAClB,SAAS,MACX,CAAC;CACH,CAAC;AACL"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Either } from "@jeengbe/prelude";
|
|
2
|
+
//#region src/validation.d.ts
|
|
3
|
+
type ValidationResult<T> = Either<readonly string[], T>;
|
|
4
|
+
type CombineValidationResult<T extends readonly ValidationResult<unknown>[]> = ValidationResult<{ [K in keyof T]: T[K] extends ValidationResult<infer U> ? U : never; }>;
|
|
5
|
+
declare function combineValidationResults<const U extends readonly ValidationResult<unknown>[]>(...results: U): CombineValidationResult<U>;
|
|
6
|
+
declare function arrayIncludes<const T extends string>(arr: readonly T[], val: unknown): val is T;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { ValidationResult, arrayIncludes, combineValidationResults };
|
|
9
|
+
//# sourceMappingURL=validation.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.mts","names":[],"sources":["../src/validation.ts"],"mappings":";;KAEY,iBAAiB,KAAK,0BAA0B;KAEvD,wBAAwB,mBAAmB,+BAA+B,oBAC5E,WAAW,IAAI,EAAE,WAAW,uBAAuB,KAAK;iBAG3C,+BAA+B,mBAAmB,gCAC7D,SAAS,IACX,wBAAwB;iBAQX,oBAAoB,kBAAkB,cAAc,KAAK,eAAe,OAAO"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Either } from "@jeengbe/prelude";
|
|
2
|
+
|
|
3
|
+
//#region src/validation.ts
|
|
4
|
+
function combineValidationResults(...results) {
|
|
5
|
+
const errors = results.filter((r) => r.isLeft()).flatMap((r) => r.getLeft());
|
|
6
|
+
return errors.length ? Either.left(errors) : Either.right(results.map((r) => r.get()));
|
|
7
|
+
}
|
|
8
|
+
function arrayIncludes(arr, val) {
|
|
9
|
+
return arr.includes(val);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
export { arrayIncludes, combineValidationResults };
|
|
14
|
+
//# sourceMappingURL=validation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.mjs","names":[],"sources":["../src/validation.ts"],"sourcesContent":["import { Either } from '@jeengbe/prelude';\n\nexport type ValidationResult<T> = Either<readonly string[], T>;\n\ntype CombineValidationResult<T extends readonly ValidationResult<unknown>[]> = ValidationResult<{\n [K in keyof T]: T[K] extends ValidationResult<infer U> ? U : never;\n}>;\n\nexport function combineValidationResults<const U extends readonly ValidationResult<unknown>[]>(\n ...results: U\n): CombineValidationResult<U> {\n const errors = results.filter((r) => r.isLeft()).flatMap((r) => r.getLeft());\n\n return errors.length\n ? Either.left(errors)\n : (Either.right(results.map((r) => r.get())) as CombineValidationResult<U>);\n}\n\nexport function arrayIncludes<const T extends string>(arr: readonly T[], val: unknown): val is T {\n return arr.includes(val as T);\n}\n"],"mappings":";;;AAQA,SAAgB,yBACd,GAAG,SACyB;CAC5B,MAAM,SAAS,QAAQ,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,CAAC;CAE3E,OAAO,OAAO,SACV,OAAO,KAAK,MAAM,IACjB,OAAO,MAAM,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/C;AAEA,SAAgB,cAAsC,KAAmB,KAAwB;CAC/F,OAAO,IAAI,SAAS,GAAQ;AAC9B"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jeengbe/config",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1",
|
|
4
4
|
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/jeengbe/ts-packages.git",
|
|
8
|
+
"directory": "packages/config"
|
|
9
|
+
},
|
|
5
10
|
"files": [
|
|
6
11
|
"dist",
|
|
7
12
|
"src",
|
|
@@ -9,6 +14,8 @@
|
|
|
9
14
|
],
|
|
10
15
|
"type": "module",
|
|
11
16
|
"sideEffects": false,
|
|
17
|
+
"main": "./dist/index.mjs",
|
|
18
|
+
"typings": "./dist/index.d.mts",
|
|
12
19
|
"exports": {
|
|
13
20
|
".": {
|
|
14
21
|
"types": "./dist/index.d.mts",
|
|
@@ -19,7 +26,7 @@
|
|
|
19
26
|
"access": "public"
|
|
20
27
|
},
|
|
21
28
|
"dependencies": {
|
|
22
|
-
"@jeengbe/prelude": "0.0.
|
|
29
|
+
"@jeengbe/prelude": "0.0.1"
|
|
23
30
|
},
|
|
24
31
|
"devDependencies": {
|
|
25
32
|
"oxfmt": "^0.60.0",
|
|
@@ -27,12 +34,11 @@
|
|
|
27
34
|
"tsdown": "^0.22.14",
|
|
28
35
|
"typescript": "^7.0.2",
|
|
29
36
|
"vitest": "^4.1.10",
|
|
30
|
-
"@jeengbe/scaffolding": "0.0.
|
|
37
|
+
"@jeengbe/scaffolding": "0.0.1"
|
|
31
38
|
},
|
|
32
39
|
"scripts": {
|
|
33
40
|
"build": "tsdown",
|
|
34
41
|
"lint": "oxlint --fix . && oxfmt --write .",
|
|
35
|
-
"test": "vitest"
|
|
36
|
-
"typecheck": "tsc"
|
|
42
|
+
"test": "vitest"
|
|
37
43
|
}
|
|
38
44
|
}
|