@wcaservices/config 1.1.1 → 1.1.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
@@ -10,8 +10,8 @@ var RequiredEnvironmentVariableError = class extends EnvironmentVariableError {
10
10
  };
11
11
 
12
12
  //#endregion
13
- //#region src/environment/EnvironmentVariables.ts
14
- var EnvironmentVariables = class {
13
+ //#region src/environment/EnvironmentVariableDefinition.ts
14
+ var EnvironmentVariableDefinition = class {
15
15
  constructor(variables) {
16
16
  this.variables = variables;
17
17
  return new Proxy(this, {
@@ -76,7 +76,7 @@ var EnvironmentVariables = class {
76
76
  //#endregion
77
77
  //#region src/environment/defineEnvironmentVariables.ts
78
78
  function defineEnvironmentVariables(variables) {
79
- const instance = new EnvironmentVariables(variables);
79
+ const instance = new EnvironmentVariableDefinition(variables);
80
80
  instance.validate();
81
81
  return instance;
82
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/environment/Errors.ts","../src/environment/EnvironmentVariables.ts","../src/environment/defineEnvironmentVariables.ts"],"sourcesContent":["import type { EnvironmentVariableConfig } from './Types.ts';\n\nexport class EnvironmentVariableError extends Error {\n}\n\nexport class RequiredEnvironmentVariableError extends EnvironmentVariableError {\n constructor(public readonly config: EnvironmentVariableConfig & { name: string }) {\n super(`Required environment variable \"${config.name}\" is missing. Make sure one is set before starting the process!`);\n }\n}","import { envFlag } from '@wcaservices/util/lib';\nimport { EnvironmentVariableError, RequiredEnvironmentVariableError } from './Errors.ts';\nimport type { VariableDefinitionMap, VariableOutputType } from './Types.ts';\n\nexport class EnvironmentVariables<TVariables extends VariableDefinitionMap> {\n constructor(protected readonly variables: TVariables) {\n return new Proxy(this, {\n get(target, prop, receiver) {\n if (prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n return target.getVariable(prop as string);\n },\n set(target, prop, value, receiver) {\n return target.setVariable(prop as string, value);\n }\n })\n }\n \n public validate(): void {\n this.validateRequiredVariables();\n }\n \n protected validateRequiredVariables(): void {\n Object.entries(this.variables).forEach(([key, config]) => {\n if (!config.required) {\n return;\n }\n \n const value = this.getVariable(key);\n \n if (typeof value === 'undefined') {\n throw new RequiredEnvironmentVariableError(Object.assign({ name: key }, config));\n }\n })\n }\n \n protected getVariable(key: string): unknown {\n const config = this.variables[key];\n \n if (!config) {\n throw new EnvironmentVariableError(`No configuration found for environment variable '${key}'`);\n }\n \n const originalValue = process.env[key] ?? config.default;\n let value: unknown = originalValue;\n const cast = config.type ?? 'default';\n \n if (config.required && typeof value === 'undefined') {\n throw new RequiredEnvironmentVariableError(Object.assign({ name: key }, config));\n }\n \n switch (cast) {\n case 'BOOLEAN':\n value = envFlag(key);\n break;\n case 'NUMBER':\n value = Number(value);\n if (Number.isNaN(value)) {\n throw new EnvironmentVariableError(`Invalid number type for '${key}': ${originalValue}`);\n }\n break;\n case 'JSON':\n JSON.parse(String(value));\n break;\n }\n \n if (config.transform) {\n value = config.transform(value);\n }\n \n return value;\n }\n \n protected setVariable(key: string, value: unknown): boolean {\n const config = this.variables[key];\n \n if (!config) {\n throw new EnvironmentVariableError(`No configuration found for environment variable '${key}'`);\n }\n \n if (config.transform) {\n throw new EnvironmentVariableError('Setting environment variables with transform functions is not yet supported.');\n }\n \n switch (config.type) {\n case 'BOOLEAN':\n case 'NUMBER':\n case 'default':\n process.env[key] = String(value);\n return true;\n case 'JSON':\n process.env[key] = JSON.stringify(value);\n return true;\n }\n \n throw new EnvironmentVariableError(`Invalid type '${config.type}' for environment variable '${key}'`);\n }\n}\n\nexport type EnvironmentVariablesInstance<TVariables extends VariableDefinitionMap> = EnvironmentVariables<TVariables> & {\n [key in keyof TVariables]: VariableOutputType<TVariables[key]>;\n}","import { EnvironmentVariables, type EnvironmentVariablesInstance } from './EnvironmentVariables.ts';\nimport type { VariableDefinitionMap } from './Types.ts';\n\nexport function defineEnvironmentVariables<\n TVariables extends VariableDefinitionMap\n>(variables: TVariables): EnvironmentVariablesInstance<TVariables> {\n const instance = new EnvironmentVariables(variables);\n \n instance.validate();\n \n // @ts-expect-error Type mismatch between result and explicit return type\n return instance;\n}\n\n"],"mappings":";;;AAEA,IAAa,2BAAb,cAA8C,MAAM;AAGpD,IAAa,mCAAb,cAAsD,yBAAyB;CAC3E,YAAY,AAAgB,QAAsD;AAC9E,QAAM,kCAAkC,OAAO,KAAK,iEAAiE;EAD7F;;;;;;ACFhC,IAAa,uBAAb,MAA4E;CACxE,YAAY,AAAmB,WAAuB;EAAvB;AAC3B,SAAO,IAAI,MAAM,MAAM;GACnB,IAAI,QAAQ,MAAM,UAAU;AACxB,QAAI,QAAQ,OACR,QAAO,QAAQ,IAAI,QAAQ,MAAM,SAAS;AAE9C,WAAO,OAAO,YAAY,KAAe;;GAE7C,IAAI,QAAQ,MAAM,OAAO,UAAU;AAC/B,WAAO,OAAO,YAAY,MAAgB,MAAM;;GAEvD,CAAC;;CAGN,AAAO,WAAiB;AACpB,OAAK,2BAA2B;;CAGpC,AAAU,4BAAkC;AACxC,SAAO,QAAQ,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,YAAY;AACtD,OAAI,CAAC,OAAO,SACR;AAKJ,OAAI,OAFU,KAAK,YAAY,IAAI,KAEd,YACjB,OAAM,IAAI,iCAAiC,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;IAEtF;;CAGN,AAAU,YAAY,KAAsB;EACxC,MAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,CAAC,OACD,OAAM,IAAI,yBAAyB,oDAAoD,IAAI,GAAG;EAGlG,MAAM,gBAAgB,QAAQ,IAAI,QAAQ,OAAO;EACjD,IAAI,QAAiB;EACrB,MAAM,OAAO,OAAO,QAAQ;AAE5B,MAAI,OAAO,YAAY,OAAO,UAAU,YACpC,OAAM,IAAI,iCAAiC,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;AAGpF,UAAQ,MAAR;GACI,KAAK;AACD,+CAAgB,IAAI;AACpB;GACJ,KAAK;AACD,YAAQ,OAAO,MAAM;AACrB,QAAI,OAAO,MAAM,MAAM,CACnB,OAAM,IAAI,yBAAyB,4BAA4B,IAAI,KAAK,gBAAgB;AAE5F;GACJ,KAAK;AACD,SAAK,MAAM,OAAO,MAAM,CAAC;AACzB;;AAGR,MAAI,OAAO,UACP,SAAQ,OAAO,UAAU,MAAM;AAGnC,SAAO;;CAGX,AAAU,YAAY,KAAa,OAAyB;EACxD,MAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,CAAC,OACD,OAAM,IAAI,yBAAyB,oDAAoD,IAAI,GAAG;AAGlG,MAAI,OAAO,UACP,OAAM,IAAI,yBAAyB,+EAA+E;AAGtH,UAAQ,OAAO,MAAf;GACI,KAAK;GACL,KAAK;GACL,KAAK;AACD,YAAQ,IAAI,OAAO,OAAO,MAAM;AAChC,WAAO;GACX,KAAK;AACD,YAAQ,IAAI,OAAO,KAAK,UAAU,MAAM;AACxC,WAAO;;AAGf,QAAM,IAAI,yBAAyB,iBAAiB,OAAO,KAAK,8BAA8B,IAAI,GAAG;;;;;;AC7F7G,SAAgB,2BAEd,WAAiE;CAC/D,MAAM,WAAW,IAAI,qBAAqB,UAAU;AAEpD,UAAS,UAAU;AAGnB,QAAO"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/environment/Errors.ts","../src/environment/EnvironmentVariableDefinition.ts","../src/environment/defineEnvironmentVariables.ts"],"sourcesContent":["import type { EnvironmentVariableConfig } from './Types.ts';\n\nexport class EnvironmentVariableError extends Error {\n}\n\nexport class RequiredEnvironmentVariableError extends EnvironmentVariableError {\n constructor(public readonly config: EnvironmentVariableConfig & { name: string }) {\n super(`Required environment variable \"${config.name}\" is missing. Make sure one is set before starting the process!`);\n }\n}","import { envFlag } from '@wcaservices/util/lib';\nimport { EnvironmentVariableError, RequiredEnvironmentVariableError } from './Errors.ts';\nimport type { VariableDefinitionMap, VariableOutputType } from './Types.ts';\n\nexport class EnvironmentVariableDefinition<TVariables extends VariableDefinitionMap> {\n constructor(protected readonly variables: TVariables) {\n return new Proxy(this, {\n get(target, prop, receiver) {\n if (prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n return target.getVariable(prop as string);\n },\n set(target, prop, value, receiver) {\n return target.setVariable(prop as string, value);\n }\n })\n }\n \n public validate(): void {\n this.validateRequiredVariables();\n }\n \n protected validateRequiredVariables(): void {\n Object.entries(this.variables).forEach(([key, config]) => {\n if (!config.required) {\n return;\n }\n \n const value = this.getVariable(key);\n \n if (typeof value === 'undefined') {\n throw new RequiredEnvironmentVariableError(Object.assign({ name: key }, config));\n }\n })\n }\n \n protected getVariable(key: string): unknown {\n const config = this.variables[key];\n \n if (!config) {\n throw new EnvironmentVariableError(`No configuration found for environment variable '${key}'`);\n }\n \n const originalValue = process.env[key] ?? config.default;\n let value: unknown = originalValue;\n const cast = config.type ?? 'default';\n \n if (config.required && typeof value === 'undefined') {\n throw new RequiredEnvironmentVariableError(Object.assign({ name: key }, config));\n }\n \n switch (cast) {\n case 'BOOLEAN':\n value = envFlag(key);\n break;\n case 'NUMBER':\n value = Number(value);\n if (Number.isNaN(value)) {\n throw new EnvironmentVariableError(`Invalid number type for '${key}': ${originalValue}`);\n }\n break;\n case 'JSON':\n JSON.parse(String(value));\n break;\n }\n \n if (config.transform) {\n value = config.transform(value);\n }\n \n return value;\n }\n \n protected setVariable(key: string, value: unknown): boolean {\n const config = this.variables[key];\n \n if (!config) {\n throw new EnvironmentVariableError(`No configuration found for environment variable '${key}'`);\n }\n \n if (config.transform) {\n throw new EnvironmentVariableError('Setting environment variables with transform functions is not yet supported.');\n }\n \n switch (config.type) {\n case 'BOOLEAN':\n case 'NUMBER':\n case 'default':\n process.env[key] = String(value);\n return true;\n case 'JSON':\n process.env[key] = JSON.stringify(value);\n return true;\n }\n \n throw new EnvironmentVariableError(`Invalid type '${config.type}' for environment variable '${key}'`);\n }\n}\n\nexport type EnvironmentVariablesInstance<TVariables extends VariableDefinitionMap> = EnvironmentVariableDefinition<TVariables> & {\n [key in keyof TVariables]: VariableOutputType<TVariables[key]>;\n}","import { EnvironmentVariableDefinition, type EnvironmentVariablesInstance } from './EnvironmentVariableDefinition.ts';\nimport type { VariableDefinitionMap } from './Types.ts';\n\nexport function defineEnvironmentVariables<\n TVariables extends VariableDefinitionMap\n>(variables: TVariables): EnvironmentVariablesInstance<TVariables> {\n const instance = new EnvironmentVariableDefinition(variables);\n \n instance.validate();\n \n // @ts-expect-error Type mismatch between result and explicit return type\n return instance;\n}\n\nexport { type EnvironmentVariablesInstance, type EnvironmentVariableDefinition }"],"mappings":";;;AAEA,IAAa,2BAAb,cAA8C,MAAM;AAGpD,IAAa,mCAAb,cAAsD,yBAAyB;CAC3E,YAAY,AAAgB,QAAsD;AAC9E,QAAM,kCAAkC,OAAO,KAAK,iEAAiE;EAD7F;;;;;;ACFhC,IAAa,gCAAb,MAAqF;CACjF,YAAY,AAAmB,WAAuB;EAAvB;AAC3B,SAAO,IAAI,MAAM,MAAM;GACnB,IAAI,QAAQ,MAAM,UAAU;AACxB,QAAI,QAAQ,OACR,QAAO,QAAQ,IAAI,QAAQ,MAAM,SAAS;AAE9C,WAAO,OAAO,YAAY,KAAe;;GAE7C,IAAI,QAAQ,MAAM,OAAO,UAAU;AAC/B,WAAO,OAAO,YAAY,MAAgB,MAAM;;GAEvD,CAAC;;CAGN,AAAO,WAAiB;AACpB,OAAK,2BAA2B;;CAGpC,AAAU,4BAAkC;AACxC,SAAO,QAAQ,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,YAAY;AACtD,OAAI,CAAC,OAAO,SACR;AAKJ,OAAI,OAFU,KAAK,YAAY,IAAI,KAEd,YACjB,OAAM,IAAI,iCAAiC,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;IAEtF;;CAGN,AAAU,YAAY,KAAsB;EACxC,MAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,CAAC,OACD,OAAM,IAAI,yBAAyB,oDAAoD,IAAI,GAAG;EAGlG,MAAM,gBAAgB,QAAQ,IAAI,QAAQ,OAAO;EACjD,IAAI,QAAiB;EACrB,MAAM,OAAO,OAAO,QAAQ;AAE5B,MAAI,OAAO,YAAY,OAAO,UAAU,YACpC,OAAM,IAAI,iCAAiC,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;AAGpF,UAAQ,MAAR;GACI,KAAK;AACD,+CAAgB,IAAI;AACpB;GACJ,KAAK;AACD,YAAQ,OAAO,MAAM;AACrB,QAAI,OAAO,MAAM,MAAM,CACnB,OAAM,IAAI,yBAAyB,4BAA4B,IAAI,KAAK,gBAAgB;AAE5F;GACJ,KAAK;AACD,SAAK,MAAM,OAAO,MAAM,CAAC;AACzB;;AAGR,MAAI,OAAO,UACP,SAAQ,OAAO,UAAU,MAAM;AAGnC,SAAO;;CAGX,AAAU,YAAY,KAAa,OAAyB;EACxD,MAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,CAAC,OACD,OAAM,IAAI,yBAAyB,oDAAoD,IAAI,GAAG;AAGlG,MAAI,OAAO,UACP,OAAM,IAAI,yBAAyB,+EAA+E;AAGtH,UAAQ,OAAO,MAAf;GACI,KAAK;GACL,KAAK;GACL,KAAK;AACD,YAAQ,IAAI,OAAO,OAAO,MAAM;AAChC,WAAO;GACX,KAAK;AACD,YAAQ,IAAI,OAAO,KAAK,UAAU,MAAM;AACxC,WAAO;;AAGf,QAAM,IAAI,yBAAyB,iBAAiB,OAAO,KAAK,8BAA8B,IAAI,GAAG;;;;;;AC7F7G,SAAgB,2BAEd,WAAiE;CAC/D,MAAM,WAAW,IAAI,8BAA8B,UAAU;AAE7D,UAAS,UAAU;AAGnB,QAAO"}
package/dist/index.d.cts CHANGED
@@ -1,9 +1,9 @@
1
1
  //#region src/environment/Types.d.ts
2
- interface EnvironmentVariableConfig<TRequired extends boolean = boolean, TTypeCast extends keyof VariableTypeCast = keyof VariableTypeCast, TTransform = unknown> {
3
- required?: TRequired;
4
- type?: TTypeCast;
5
- default?: VariableTypeCast[TTypeCast];
6
- transform?: TransformFn<any, TTransform>;
2
+ interface EnvironmentVariableConfig {
3
+ required?: boolean;
4
+ type?: keyof VariableTypeCast;
5
+ default?: any;
6
+ transform?: (value: any) => any;
7
7
  }
8
8
  type VariableDefinitionMap = { [key in keyof NodeJS.ProcessEnv]: EnvironmentVariableConfig };
9
9
  type VariableOutputType<TConfig extends EnvironmentVariableConfig, TTypeCast extends keyof VariableTypeCast = (TConfig['type'] extends keyof VariableTypeCast ? TConfig['type'] : 'default'), TType = VariableTypeCast[TTypeCast], TCastOutputType = (TConfig['required'] extends true ? TType : TType | undefined)> = TConfig['transform'] extends TransformFn<TCastOutputType, infer TTransformOutput> ? TTransformOutput : TCastOutputType;
@@ -27,8 +27,8 @@ interface VariableTypeCast {
27
27
  JSON: unknown;
28
28
  }
29
29
  //#endregion
30
- //#region src/environment/EnvironmentVariables.d.ts
31
- declare class EnvironmentVariables<TVariables extends VariableDefinitionMap> {
30
+ //#region src/environment/EnvironmentVariableDefinition.d.ts
31
+ declare class EnvironmentVariableDefinition<TVariables extends VariableDefinitionMap> {
32
32
  protected readonly variables: TVariables;
33
33
  constructor(variables: TVariables);
34
34
  validate(): void;
@@ -36,10 +36,10 @@ declare class EnvironmentVariables<TVariables extends VariableDefinitionMap> {
36
36
  protected getVariable(key: string): unknown;
37
37
  protected setVariable(key: string, value: unknown): boolean;
38
38
  }
39
- type EnvironmentVariablesInstance<TVariables extends VariableDefinitionMap> = EnvironmentVariables<TVariables> & { [key in keyof TVariables]: VariableOutputType<TVariables[key]> };
39
+ type EnvironmentVariablesInstance<TVariables extends VariableDefinitionMap> = EnvironmentVariableDefinition<TVariables> & { [key in keyof TVariables]: VariableOutputType<TVariables[key]> };
40
40
  //#endregion
41
41
  //#region src/environment/defineEnvironmentVariables.d.ts
42
42
  declare function defineEnvironmentVariables<TVariables extends VariableDefinitionMap>(variables: TVariables): EnvironmentVariablesInstance<TVariables>;
43
43
  //#endregion
44
- export { defineEnvironmentVariables };
44
+ export { type EnvironmentVariableDefinition, type EnvironmentVariablesInstance, defineEnvironmentVariables };
45
45
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  //#region src/environment/Types.d.ts
2
- interface EnvironmentVariableConfig<TRequired extends boolean = boolean, TTypeCast extends keyof VariableTypeCast = keyof VariableTypeCast, TTransform = unknown> {
3
- required?: TRequired;
4
- type?: TTypeCast;
5
- default?: VariableTypeCast[TTypeCast];
6
- transform?: TransformFn<any, TTransform>;
2
+ interface EnvironmentVariableConfig {
3
+ required?: boolean;
4
+ type?: keyof VariableTypeCast;
5
+ default?: any;
6
+ transform?: (value: any) => any;
7
7
  }
8
8
  type VariableDefinitionMap = { [key in keyof NodeJS.ProcessEnv]: EnvironmentVariableConfig };
9
9
  type VariableOutputType<TConfig extends EnvironmentVariableConfig, TTypeCast extends keyof VariableTypeCast = (TConfig['type'] extends keyof VariableTypeCast ? TConfig['type'] : 'default'), TType = VariableTypeCast[TTypeCast], TCastOutputType = (TConfig['required'] extends true ? TType : TType | undefined)> = TConfig['transform'] extends TransformFn<TCastOutputType, infer TTransformOutput> ? TTransformOutput : TCastOutputType;
@@ -27,8 +27,8 @@ interface VariableTypeCast {
27
27
  JSON: unknown;
28
28
  }
29
29
  //#endregion
30
- //#region src/environment/EnvironmentVariables.d.ts
31
- declare class EnvironmentVariables<TVariables extends VariableDefinitionMap> {
30
+ //#region src/environment/EnvironmentVariableDefinition.d.ts
31
+ declare class EnvironmentVariableDefinition<TVariables extends VariableDefinitionMap> {
32
32
  protected readonly variables: TVariables;
33
33
  constructor(variables: TVariables);
34
34
  validate(): void;
@@ -36,10 +36,10 @@ declare class EnvironmentVariables<TVariables extends VariableDefinitionMap> {
36
36
  protected getVariable(key: string): unknown;
37
37
  protected setVariable(key: string, value: unknown): boolean;
38
38
  }
39
- type EnvironmentVariablesInstance<TVariables extends VariableDefinitionMap> = EnvironmentVariables<TVariables> & { [key in keyof TVariables]: VariableOutputType<TVariables[key]> };
39
+ type EnvironmentVariablesInstance<TVariables extends VariableDefinitionMap> = EnvironmentVariableDefinition<TVariables> & { [key in keyof TVariables]: VariableOutputType<TVariables[key]> };
40
40
  //#endregion
41
41
  //#region src/environment/defineEnvironmentVariables.d.ts
42
42
  declare function defineEnvironmentVariables<TVariables extends VariableDefinitionMap>(variables: TVariables): EnvironmentVariablesInstance<TVariables>;
43
43
  //#endregion
44
- export { defineEnvironmentVariables };
44
+ export { type EnvironmentVariableDefinition, type EnvironmentVariablesInstance, defineEnvironmentVariables };
45
45
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -10,8 +10,8 @@ var RequiredEnvironmentVariableError = class extends EnvironmentVariableError {
10
10
  };
11
11
 
12
12
  //#endregion
13
- //#region src/environment/EnvironmentVariables.ts
14
- var EnvironmentVariables = class {
13
+ //#region src/environment/EnvironmentVariableDefinition.ts
14
+ var EnvironmentVariableDefinition = class {
15
15
  constructor(variables) {
16
16
  this.variables = variables;
17
17
  return new Proxy(this, {
@@ -76,7 +76,7 @@ var EnvironmentVariables = class {
76
76
  //#endregion
77
77
  //#region src/environment/defineEnvironmentVariables.ts
78
78
  function defineEnvironmentVariables(variables) {
79
- const instance = new EnvironmentVariables(variables);
79
+ const instance = new EnvironmentVariableDefinition(variables);
80
80
  instance.validate();
81
81
  return instance;
82
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/environment/Errors.ts","../src/environment/EnvironmentVariables.ts","../src/environment/defineEnvironmentVariables.ts"],"sourcesContent":["import type { EnvironmentVariableConfig } from './Types.ts';\n\nexport class EnvironmentVariableError extends Error {\n}\n\nexport class RequiredEnvironmentVariableError extends EnvironmentVariableError {\n constructor(public readonly config: EnvironmentVariableConfig & { name: string }) {\n super(`Required environment variable \"${config.name}\" is missing. Make sure one is set before starting the process!`);\n }\n}","import { envFlag } from '@wcaservices/util/lib';\nimport { EnvironmentVariableError, RequiredEnvironmentVariableError } from './Errors.ts';\nimport type { VariableDefinitionMap, VariableOutputType } from './Types.ts';\n\nexport class EnvironmentVariables<TVariables extends VariableDefinitionMap> {\n constructor(protected readonly variables: TVariables) {\n return new Proxy(this, {\n get(target, prop, receiver) {\n if (prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n return target.getVariable(prop as string);\n },\n set(target, prop, value, receiver) {\n return target.setVariable(prop as string, value);\n }\n })\n }\n \n public validate(): void {\n this.validateRequiredVariables();\n }\n \n protected validateRequiredVariables(): void {\n Object.entries(this.variables).forEach(([key, config]) => {\n if (!config.required) {\n return;\n }\n \n const value = this.getVariable(key);\n \n if (typeof value === 'undefined') {\n throw new RequiredEnvironmentVariableError(Object.assign({ name: key }, config));\n }\n })\n }\n \n protected getVariable(key: string): unknown {\n const config = this.variables[key];\n \n if (!config) {\n throw new EnvironmentVariableError(`No configuration found for environment variable '${key}'`);\n }\n \n const originalValue = process.env[key] ?? config.default;\n let value: unknown = originalValue;\n const cast = config.type ?? 'default';\n \n if (config.required && typeof value === 'undefined') {\n throw new RequiredEnvironmentVariableError(Object.assign({ name: key }, config));\n }\n \n switch (cast) {\n case 'BOOLEAN':\n value = envFlag(key);\n break;\n case 'NUMBER':\n value = Number(value);\n if (Number.isNaN(value)) {\n throw new EnvironmentVariableError(`Invalid number type for '${key}': ${originalValue}`);\n }\n break;\n case 'JSON':\n JSON.parse(String(value));\n break;\n }\n \n if (config.transform) {\n value = config.transform(value);\n }\n \n return value;\n }\n \n protected setVariable(key: string, value: unknown): boolean {\n const config = this.variables[key];\n \n if (!config) {\n throw new EnvironmentVariableError(`No configuration found for environment variable '${key}'`);\n }\n \n if (config.transform) {\n throw new EnvironmentVariableError('Setting environment variables with transform functions is not yet supported.');\n }\n \n switch (config.type) {\n case 'BOOLEAN':\n case 'NUMBER':\n case 'default':\n process.env[key] = String(value);\n return true;\n case 'JSON':\n process.env[key] = JSON.stringify(value);\n return true;\n }\n \n throw new EnvironmentVariableError(`Invalid type '${config.type}' for environment variable '${key}'`);\n }\n}\n\nexport type EnvironmentVariablesInstance<TVariables extends VariableDefinitionMap> = EnvironmentVariables<TVariables> & {\n [key in keyof TVariables]: VariableOutputType<TVariables[key]>;\n}","import { EnvironmentVariables, type EnvironmentVariablesInstance } from './EnvironmentVariables.ts';\nimport type { VariableDefinitionMap } from './Types.ts';\n\nexport function defineEnvironmentVariables<\n TVariables extends VariableDefinitionMap\n>(variables: TVariables): EnvironmentVariablesInstance<TVariables> {\n const instance = new EnvironmentVariables(variables);\n \n instance.validate();\n \n // @ts-expect-error Type mismatch between result and explicit return type\n return instance;\n}\n\n"],"mappings":";;;AAEA,IAAa,2BAAb,cAA8C,MAAM;AAGpD,IAAa,mCAAb,cAAsD,yBAAyB;CAC3E,YAAY,AAAgB,QAAsD;AAC9E,QAAM,kCAAkC,OAAO,KAAK,iEAAiE;EAD7F;;;;;;ACFhC,IAAa,uBAAb,MAA4E;CACxE,YAAY,AAAmB,WAAuB;EAAvB;AAC3B,SAAO,IAAI,MAAM,MAAM;GACnB,IAAI,QAAQ,MAAM,UAAU;AACxB,QAAI,QAAQ,OACR,QAAO,QAAQ,IAAI,QAAQ,MAAM,SAAS;AAE9C,WAAO,OAAO,YAAY,KAAe;;GAE7C,IAAI,QAAQ,MAAM,OAAO,UAAU;AAC/B,WAAO,OAAO,YAAY,MAAgB,MAAM;;GAEvD,CAAC;;CAGN,AAAO,WAAiB;AACpB,OAAK,2BAA2B;;CAGpC,AAAU,4BAAkC;AACxC,SAAO,QAAQ,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,YAAY;AACtD,OAAI,CAAC,OAAO,SACR;AAKJ,OAAI,OAFU,KAAK,YAAY,IAAI,KAEd,YACjB,OAAM,IAAI,iCAAiC,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;IAEtF;;CAGN,AAAU,YAAY,KAAsB;EACxC,MAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,CAAC,OACD,OAAM,IAAI,yBAAyB,oDAAoD,IAAI,GAAG;EAGlG,MAAM,gBAAgB,QAAQ,IAAI,QAAQ,OAAO;EACjD,IAAI,QAAiB;EACrB,MAAM,OAAO,OAAO,QAAQ;AAE5B,MAAI,OAAO,YAAY,OAAO,UAAU,YACpC,OAAM,IAAI,iCAAiC,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;AAGpF,UAAQ,MAAR;GACI,KAAK;AACD,YAAQ,QAAQ,IAAI;AACpB;GACJ,KAAK;AACD,YAAQ,OAAO,MAAM;AACrB,QAAI,OAAO,MAAM,MAAM,CACnB,OAAM,IAAI,yBAAyB,4BAA4B,IAAI,KAAK,gBAAgB;AAE5F;GACJ,KAAK;AACD,SAAK,MAAM,OAAO,MAAM,CAAC;AACzB;;AAGR,MAAI,OAAO,UACP,SAAQ,OAAO,UAAU,MAAM;AAGnC,SAAO;;CAGX,AAAU,YAAY,KAAa,OAAyB;EACxD,MAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,CAAC,OACD,OAAM,IAAI,yBAAyB,oDAAoD,IAAI,GAAG;AAGlG,MAAI,OAAO,UACP,OAAM,IAAI,yBAAyB,+EAA+E;AAGtH,UAAQ,OAAO,MAAf;GACI,KAAK;GACL,KAAK;GACL,KAAK;AACD,YAAQ,IAAI,OAAO,OAAO,MAAM;AAChC,WAAO;GACX,KAAK;AACD,YAAQ,IAAI,OAAO,KAAK,UAAU,MAAM;AACxC,WAAO;;AAGf,QAAM,IAAI,yBAAyB,iBAAiB,OAAO,KAAK,8BAA8B,IAAI,GAAG;;;;;;AC7F7G,SAAgB,2BAEd,WAAiE;CAC/D,MAAM,WAAW,IAAI,qBAAqB,UAAU;AAEpD,UAAS,UAAU;AAGnB,QAAO"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/environment/Errors.ts","../src/environment/EnvironmentVariableDefinition.ts","../src/environment/defineEnvironmentVariables.ts"],"sourcesContent":["import type { EnvironmentVariableConfig } from './Types.ts';\n\nexport class EnvironmentVariableError extends Error {\n}\n\nexport class RequiredEnvironmentVariableError extends EnvironmentVariableError {\n constructor(public readonly config: EnvironmentVariableConfig & { name: string }) {\n super(`Required environment variable \"${config.name}\" is missing. Make sure one is set before starting the process!`);\n }\n}","import { envFlag } from '@wcaservices/util/lib';\nimport { EnvironmentVariableError, RequiredEnvironmentVariableError } from './Errors.ts';\nimport type { VariableDefinitionMap, VariableOutputType } from './Types.ts';\n\nexport class EnvironmentVariableDefinition<TVariables extends VariableDefinitionMap> {\n constructor(protected readonly variables: TVariables) {\n return new Proxy(this, {\n get(target, prop, receiver) {\n if (prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n return target.getVariable(prop as string);\n },\n set(target, prop, value, receiver) {\n return target.setVariable(prop as string, value);\n }\n })\n }\n \n public validate(): void {\n this.validateRequiredVariables();\n }\n \n protected validateRequiredVariables(): void {\n Object.entries(this.variables).forEach(([key, config]) => {\n if (!config.required) {\n return;\n }\n \n const value = this.getVariable(key);\n \n if (typeof value === 'undefined') {\n throw new RequiredEnvironmentVariableError(Object.assign({ name: key }, config));\n }\n })\n }\n \n protected getVariable(key: string): unknown {\n const config = this.variables[key];\n \n if (!config) {\n throw new EnvironmentVariableError(`No configuration found for environment variable '${key}'`);\n }\n \n const originalValue = process.env[key] ?? config.default;\n let value: unknown = originalValue;\n const cast = config.type ?? 'default';\n \n if (config.required && typeof value === 'undefined') {\n throw new RequiredEnvironmentVariableError(Object.assign({ name: key }, config));\n }\n \n switch (cast) {\n case 'BOOLEAN':\n value = envFlag(key);\n break;\n case 'NUMBER':\n value = Number(value);\n if (Number.isNaN(value)) {\n throw new EnvironmentVariableError(`Invalid number type for '${key}': ${originalValue}`);\n }\n break;\n case 'JSON':\n JSON.parse(String(value));\n break;\n }\n \n if (config.transform) {\n value = config.transform(value);\n }\n \n return value;\n }\n \n protected setVariable(key: string, value: unknown): boolean {\n const config = this.variables[key];\n \n if (!config) {\n throw new EnvironmentVariableError(`No configuration found for environment variable '${key}'`);\n }\n \n if (config.transform) {\n throw new EnvironmentVariableError('Setting environment variables with transform functions is not yet supported.');\n }\n \n switch (config.type) {\n case 'BOOLEAN':\n case 'NUMBER':\n case 'default':\n process.env[key] = String(value);\n return true;\n case 'JSON':\n process.env[key] = JSON.stringify(value);\n return true;\n }\n \n throw new EnvironmentVariableError(`Invalid type '${config.type}' for environment variable '${key}'`);\n }\n}\n\nexport type EnvironmentVariablesInstance<TVariables extends VariableDefinitionMap> = EnvironmentVariableDefinition<TVariables> & {\n [key in keyof TVariables]: VariableOutputType<TVariables[key]>;\n}","import { EnvironmentVariableDefinition, type EnvironmentVariablesInstance } from './EnvironmentVariableDefinition.ts';\nimport type { VariableDefinitionMap } from './Types.ts';\n\nexport function defineEnvironmentVariables<\n TVariables extends VariableDefinitionMap\n>(variables: TVariables): EnvironmentVariablesInstance<TVariables> {\n const instance = new EnvironmentVariableDefinition(variables);\n \n instance.validate();\n \n // @ts-expect-error Type mismatch between result and explicit return type\n return instance;\n}\n\nexport { type EnvironmentVariablesInstance, type EnvironmentVariableDefinition }"],"mappings":";;;AAEA,IAAa,2BAAb,cAA8C,MAAM;AAGpD,IAAa,mCAAb,cAAsD,yBAAyB;CAC3E,YAAY,AAAgB,QAAsD;AAC9E,QAAM,kCAAkC,OAAO,KAAK,iEAAiE;EAD7F;;;;;;ACFhC,IAAa,gCAAb,MAAqF;CACjF,YAAY,AAAmB,WAAuB;EAAvB;AAC3B,SAAO,IAAI,MAAM,MAAM;GACnB,IAAI,QAAQ,MAAM,UAAU;AACxB,QAAI,QAAQ,OACR,QAAO,QAAQ,IAAI,QAAQ,MAAM,SAAS;AAE9C,WAAO,OAAO,YAAY,KAAe;;GAE7C,IAAI,QAAQ,MAAM,OAAO,UAAU;AAC/B,WAAO,OAAO,YAAY,MAAgB,MAAM;;GAEvD,CAAC;;CAGN,AAAO,WAAiB;AACpB,OAAK,2BAA2B;;CAGpC,AAAU,4BAAkC;AACxC,SAAO,QAAQ,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,YAAY;AACtD,OAAI,CAAC,OAAO,SACR;AAKJ,OAAI,OAFU,KAAK,YAAY,IAAI,KAEd,YACjB,OAAM,IAAI,iCAAiC,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;IAEtF;;CAGN,AAAU,YAAY,KAAsB;EACxC,MAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,CAAC,OACD,OAAM,IAAI,yBAAyB,oDAAoD,IAAI,GAAG;EAGlG,MAAM,gBAAgB,QAAQ,IAAI,QAAQ,OAAO;EACjD,IAAI,QAAiB;EACrB,MAAM,OAAO,OAAO,QAAQ;AAE5B,MAAI,OAAO,YAAY,OAAO,UAAU,YACpC,OAAM,IAAI,iCAAiC,OAAO,OAAO,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;AAGpF,UAAQ,MAAR;GACI,KAAK;AACD,YAAQ,QAAQ,IAAI;AACpB;GACJ,KAAK;AACD,YAAQ,OAAO,MAAM;AACrB,QAAI,OAAO,MAAM,MAAM,CACnB,OAAM,IAAI,yBAAyB,4BAA4B,IAAI,KAAK,gBAAgB;AAE5F;GACJ,KAAK;AACD,SAAK,MAAM,OAAO,MAAM,CAAC;AACzB;;AAGR,MAAI,OAAO,UACP,SAAQ,OAAO,UAAU,MAAM;AAGnC,SAAO;;CAGX,AAAU,YAAY,KAAa,OAAyB;EACxD,MAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,CAAC,OACD,OAAM,IAAI,yBAAyB,oDAAoD,IAAI,GAAG;AAGlG,MAAI,OAAO,UACP,OAAM,IAAI,yBAAyB,+EAA+E;AAGtH,UAAQ,OAAO,MAAf;GACI,KAAK;GACL,KAAK;GACL,KAAK;AACD,YAAQ,IAAI,OAAO,OAAO,MAAM;AAChC,WAAO;GACX,KAAK;AACD,YAAQ,IAAI,OAAO,KAAK,UAAU,MAAM;AACxC,WAAO;;AAGf,QAAM,IAAI,yBAAyB,iBAAiB,OAAO,KAAK,8BAA8B,IAAI,GAAG;;;;;;AC7F7G,SAAgB,2BAEd,WAAiE;CAC/D,MAAM,WAAW,IAAI,8BAA8B,UAAU;AAE7D,UAAS,UAAU;AAGnB,QAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wcaservices/config",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "Jørgen Vatle <Jorgen@WcAServices.net> (https://github.com/JorgenVatle)",