@forklaunch/core 0.3.2 → 0.3.4

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.
@@ -1,49 +1,111 @@
1
- import { AnySchemaValidator, IdiomaticSchema, Schema, ParseResult } from '@forklaunch/validator';
1
+ import {
2
+ AnySchemaValidator,
3
+ IdiomaticSchema,
4
+ ParseResult,
5
+ Schema
6
+ } from '@forklaunch/validator';
2
7
  import { EntityManager as EntityManager$1 } from '@mikro-orm/core';
3
8
 
4
9
  declare enum Lifetime {
5
- Singleton = 0,
6
- Transient = 1,
7
- Scoped = 2
10
+ Singleton = 0,
11
+ Transient = 1,
12
+ Scoped = 2
8
13
  }
9
14
  type Singleton<Value> = {
10
- lifetime: Lifetime.Singleton;
11
- value: Value;
15
+ lifetime: Lifetime.Singleton;
16
+ value: Value;
12
17
  };
13
18
  type Constructed<Args, Return> = {
14
- lifetime: Lifetime.Transient | Lifetime.Scoped;
15
- factory: (args: Args, resolve: <T extends keyof Args>(token: T, context?: Record<string, unknown>) => Args[T], context: Record<string, unknown>) => Return;
19
+ lifetime: Lifetime.Transient | Lifetime.Scoped;
20
+ factory: (
21
+ args: Args,
22
+ resolve: <T extends keyof Args>(
23
+ token: T,
24
+ context?: Record<string, unknown>
25
+ ) => Args[T],
26
+ context: Record<string, unknown>
27
+ ) => Return;
16
28
  };
17
29
  type Constructor = new (...args: never[]) => unknown;
18
- type SchemaConstructor<SV extends AnySchemaValidator> = new (...args: unknown[]) => IdiomaticSchema<SV>;
30
+ type SchemaConstructor<SV extends AnySchemaValidator> = new (
31
+ ...args: unknown[]
32
+ ) => IdiomaticSchema<SV>;
19
33
  type Function = (...args: never[]) => unknown;
20
- type SchemaFunction<SV extends AnySchemaValidator> = (args: unknown) => IdiomaticSchema<SV>;
21
- type ConfigValidator<SV extends AnySchemaValidator> = Record<string, Function | SchemaFunction<SV> | Constructor | SchemaConstructor<SV> | IdiomaticSchema<SV>>;
22
- type ResolvedConfigValidator<SV extends AnySchemaValidator, CV extends ConfigValidator<SV>> = {
23
- [M in keyof CV]: CV[M] extends SchemaConstructor<SV> ? Schema<InstanceType<CV[M]>, SV> : CV[M] extends SchemaFunction<SV> ? Schema<ReturnType<CV[M]>, SV> : CV[M] extends Function ? ReturnType<CV[M]> : CV[M] extends Constructor ? InstanceType<CV[M]> : Schema<CV[M], SV>;
24
- };
25
- type ScopedDependencyFactory<SV extends AnySchemaValidator, CV extends ConfigValidator<SV>, M extends keyof CV> = (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[M];
26
- type ValidConfigInjector<SV extends AnySchemaValidator, CV extends ConfigValidator<SV>> = ConfigInjector<SV, CV> & {
27
- validResolvedConfigValidator: void;
34
+ type SchemaFunction<SV extends AnySchemaValidator> = (
35
+ args: unknown
36
+ ) => IdiomaticSchema<SV>;
37
+ type ConfigValidator<SV extends AnySchemaValidator> = Record<
38
+ string,
39
+ | Function
40
+ | SchemaFunction<SV>
41
+ | Constructor
42
+ | SchemaConstructor<SV>
43
+ | IdiomaticSchema<SV>
44
+ >;
45
+ type ResolvedConfigValidator<
46
+ SV extends AnySchemaValidator,
47
+ CV extends ConfigValidator<SV>
48
+ > = {
49
+ [M in keyof CV]: CV[M] extends SchemaConstructor<SV>
50
+ ? Schema<InstanceType<CV[M]>, SV>
51
+ : CV[M] extends SchemaFunction<SV>
52
+ ? Schema<ReturnType<CV[M]>, SV>
53
+ : CV[M] extends Function
54
+ ? ReturnType<CV[M]>
55
+ : CV[M] extends Constructor
56
+ ? InstanceType<CV[M]>
57
+ : Schema<CV[M], SV>;
28
58
  };
59
+ type ScopedDependencyFactory<
60
+ SV extends AnySchemaValidator,
61
+ CV extends ConfigValidator<SV>,
62
+ M extends keyof CV
63
+ > = (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[M];
29
64
 
30
- declare class ConfigInjector<SV extends AnySchemaValidator, CV extends ConfigValidator<SV>> {
31
- private schemaValidator;
32
- private configShapes;
33
- private dependenciesDefinition;
34
- instances: {
35
- [K in keyof CV]?: ResolvedConfigValidator<SV, CV>[K];
36
- };
37
- private loadSingletons;
38
- private resolveInstance;
39
- constructor(schemaValidator: SV, configShapes: CV, dependenciesDefinition: {
40
- [K in keyof CV]: Singleton<ResolvedConfigValidator<SV, CV>[K]> | Constructed<Omit<ResolvedConfigValidator<SV, CV>, K>, ResolvedConfigValidator<SV, CV>[K]>;
41
- });
42
- validateConfigSingletons(): ParseResult<ValidConfigInjector<SV, CV>>;
43
- resolve<T extends keyof CV>(token: T, context?: Record<string, unknown>, resolutionPath?: (keyof CV)[]): ResolvedConfigValidator<SV, CV>[T];
44
- scopedResolver<T extends keyof CV>(token: T, context?: Record<string, unknown>, resolutionPath?: (keyof CV)[]): (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[T];
45
- createScope(): ConfigInjector<SV, CV>;
46
- dispose(): void;
65
+ declare class ConfigInjector<
66
+ SV extends AnySchemaValidator,
67
+ CV extends ConfigValidator<SV>
68
+ > {
69
+ private schemaValidator;
70
+ private configShapes;
71
+ private dependenciesDefinition;
72
+ instances: {
73
+ [K in keyof CV]?: ResolvedConfigValidator<SV, CV>[K];
74
+ };
75
+ private loadSingletons;
76
+ private resolveInstance;
77
+ constructor(
78
+ schemaValidator: SV,
79
+ configShapes: CV,
80
+ dependenciesDefinition: {
81
+ [K in keyof CV]:
82
+ | Singleton<ResolvedConfigValidator<SV, CV>[K]>
83
+ | Constructed<
84
+ Omit<ResolvedConfigValidator<SV, CV>, K>,
85
+ ResolvedConfigValidator<SV, CV>[K]
86
+ >;
87
+ }
88
+ );
89
+ safeValidateConfigSingletons(): ParseResult<ValidConfigInjector<SV, CV>>;
90
+ validateConfigSingletons(configName: string): ValidConfigInjector<SV, CV>;
91
+ resolve<T extends keyof CV>(
92
+ token: T,
93
+ context?: Record<string, unknown>,
94
+ resolutionPath?: (keyof CV)[]
95
+ ): ResolvedConfigValidator<SV, CV>[T];
96
+ scopedResolver<T extends keyof CV>(
97
+ token: T,
98
+ context?: Record<string, unknown>,
99
+ resolutionPath?: (keyof CV)[]
100
+ ): (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[T];
101
+ createScope(): ConfigInjector<SV, CV>;
102
+ dispose(): void;
103
+ }
104
+ declare class ValidConfigInjector<
105
+ SV extends AnySchemaValidator,
106
+ CV extends ConfigValidator<SV>
107
+ > extends ConfigInjector<SV, CV> {
108
+ validConfigInjector: void;
47
109
  }
48
110
 
49
111
  declare function getEnvVar(name: string): string;
@@ -54,16 +116,32 @@ declare function getEnvVar(name: string): string;
54
116
  * @interface BaseService
55
117
  */
56
118
  interface BaseService {
57
- /**
58
- * The EntityManager instance for managing entities.
59
- *
60
- * @type {EntityManager}
61
- */
62
- em: EntityManager$1;
119
+ /**
120
+ * The EntityManager instance for managing entities.
121
+ *
122
+ * @type {EntityManager}
123
+ */
124
+ em: EntityManager$1;
63
125
  }
64
126
 
65
127
  type EntityManager = {
66
- fork: <Options>(options?: Options) => EntityManager;
128
+ fork: <Options>(options?: Options) => EntityManager;
67
129
  };
68
130
 
69
- export { type BaseService, ConfigInjector, type ConfigValidator, type Constructed, type Constructor, type EntityManager, type Function, Lifetime, type ResolvedConfigValidator, type SchemaConstructor, type SchemaFunction, type ScopedDependencyFactory, type Singleton, type ValidConfigInjector, getEnvVar };
131
+ export {
132
+ ConfigInjector,
133
+ getEnvVar,
134
+ Lifetime,
135
+ ValidConfigInjector,
136
+ type BaseService,
137
+ type ConfigValidator,
138
+ type Constructed,
139
+ type Constructor,
140
+ type EntityManager,
141
+ type Function,
142
+ type ResolvedConfigValidator,
143
+ type SchemaConstructor,
144
+ type SchemaFunction,
145
+ type ScopedDependencyFactory,
146
+ type Singleton
147
+ };
@@ -22,12 +22,14 @@ var services_exports = {};
22
22
  __export(services_exports, {
23
23
  ConfigInjector: () => ConfigInjector,
24
24
  Lifetime: () => Lifetime,
25
+ ValidConfigInjector: () => ValidConfigInjector,
25
26
  getEnvVar: () => getEnvVar
26
27
  });
27
28
  module.exports = __toCommonJS(services_exports);
28
29
 
29
30
  // src/services/configInjector.ts
30
31
  var import_common = require("@forklaunch/common");
32
+ var import_validator = require("@forklaunch/validator");
31
33
 
32
34
  // src/services/guards/isConstructed.ts
33
35
  function isConstructed(value) {
@@ -100,7 +102,7 @@ var ConfigInjector = class _ConfigInjector {
100
102
  context ?? {}
101
103
  );
102
104
  }
103
- validateConfigSingletons() {
105
+ safeValidateConfigSingletons() {
104
106
  const validNonSchemaSingletons = Object.entries(this.configShapes).reduce(
105
107
  (acc, [key, value]) => {
106
108
  if (this.dependenciesDefinition[key].lifetime === 0 /* Singleton */ && !this.schemaValidator.isSchema(value) && isConstructor(value)) {
@@ -158,10 +160,11 @@ var ConfigInjector = class _ConfigInjector {
158
160
  const configKeys = Object.keys(this.configShapes);
159
161
  return validNonSchemaSingletons.ok && schemaSingletonParseResult.ok ? {
160
162
  ok: true,
161
- value: {
162
- validResolvedConfigValidator: void 0,
163
- ...this
164
- }
163
+ value: new ValidConfigInjector(
164
+ this.schemaValidator,
165
+ this.configShapes,
166
+ this.dependenciesDefinition
167
+ )
165
168
  } : {
166
169
  ok: false,
167
170
  errors: [
@@ -172,6 +175,15 @@ var ConfigInjector = class _ConfigInjector {
172
175
  )
173
176
  };
174
177
  }
178
+ validateConfigSingletons(configName) {
179
+ const safeValidateResult = this.safeValidateConfigSingletons();
180
+ if (safeValidateResult.ok) {
181
+ return safeValidateResult.value;
182
+ }
183
+ throw new Error(
184
+ (0, import_validator.prettyPrintParseErrors)(safeValidateResult.errors, configName)
185
+ );
186
+ }
175
187
  resolve(token, context, resolutionPath = []) {
176
188
  const instance = this.instances[token];
177
189
  if (!instance) {
@@ -229,6 +241,9 @@ var ConfigInjector = class _ConfigInjector {
229
241
  this.loadSingletons();
230
242
  }
231
243
  };
244
+ var ValidConfigInjector = class extends ConfigInjector {
245
+ validConfigInjector;
246
+ };
232
247
 
233
248
  // src/services/getEnvVar.ts
234
249
  function getEnvVar(name) {
@@ -239,5 +254,7 @@ function getEnvVar(name) {
239
254
  0 && (module.exports = {
240
255
  ConfigInjector,
241
256
  Lifetime,
257
+ ValidConfigInjector,
242
258
  getEnvVar
243
259
  });
260
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/index.ts","../../src/services/configInjector.ts","../../src/services/guards/isConstructed.ts","../../src/services/guards/isConstructor.ts","../../src/services/types/configInjector.types.ts","../../src/services/getEnvVar.ts"],"sourcesContent":["export * from './configInjector';\nexport * from './getEnvVar';\nexport * from './interfaces/baseService';\nexport * from './types/configInjector.types';\nexport * from './types/entityManager.types';\n","import { extractArgumentNames, isNever } from '@forklaunch/common';\nimport {\n AnySchemaValidator,\n IdiomaticSchema,\n ParseResult,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\nimport { isConstructed } from './guards/isConstructed';\nimport { isConstructor } from './guards/isConstructor';\nimport {\n ConfigValidator,\n Constructed,\n Lifetime,\n ResolvedConfigValidator,\n SchemaConstructor,\n SchemaFunction,\n Singleton\n} from './types/configInjector.types';\n\nexport class ConfigInjector<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> {\n instances: {\n [K in keyof CV]?: ResolvedConfigValidator<SV, CV>[K];\n } = {};\n\n private loadSingletons(): void {\n for (const token in this.dependenciesDefinition) {\n const definition = this.dependenciesDefinition[token];\n if (definition.lifetime === Lifetime.Singleton) {\n this.instances[token] = definition.value;\n }\n }\n }\n\n private resolveInstance<T extends keyof CV>(\n token: T,\n definition: Constructed<\n Omit<ResolvedConfigValidator<SV, CV>, T>,\n ResolvedConfigValidator<SV, CV>[T]\n >,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): ResolvedConfigValidator<SV, CV>[T] {\n const injectorArgument = extractArgumentNames(definition.factory)[0];\n // short circuit as no args\n if (injectorArgument === '_args') {\n return definition.factory(\n {} as Omit<ResolvedConfigValidator<SV, CV>, T>,\n this.resolve.bind(this),\n context ?? ({} as Record<string, unknown>)\n );\n }\n\n if (!injectorArgument.startsWith('{') || !injectorArgument.endsWith('}')) {\n throw new Error(\n `Invalid injector argument for ${String(\n token\n )}: ${injectorArgument}. Please use object destructuring syntax: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment.`\n );\n }\n const resolvedArguments = Object.fromEntries(\n injectorArgument\n .replace('{', '')\n .replace('}', '')\n .split(',')\n .map((arg) => arg.split(':')[0].trim())\n .map((arg) => {\n const newResolutionPath = [...resolutionPath, token];\n if (resolutionPath.includes(arg)) {\n throw new Error(\n `Circular dependency detected: ${newResolutionPath.join(\n ' -> '\n )} -> ${arg}`\n );\n }\n const resolvedArg = this.resolve(arg, context, newResolutionPath);\n return [arg, resolvedArg];\n })\n ) as unknown as Omit<ResolvedConfigValidator<SV, CV>, T>;\n return definition.factory(\n resolvedArguments,\n this.resolve.bind(this),\n context ?? ({} as Record<string, unknown>)\n );\n }\n\n constructor(\n private schemaValidator: SV,\n private configShapes: CV,\n private dependenciesDefinition: {\n [K in keyof CV]:\n | Singleton<ResolvedConfigValidator<SV, CV>[K]>\n | Constructed<\n Omit<ResolvedConfigValidator<SV, CV>, K>,\n ResolvedConfigValidator<SV, CV>[K]\n >;\n }\n ) {\n this.loadSingletons();\n }\n\n safeValidateConfigSingletons(): ParseResult<ValidConfigInjector<SV, CV>> {\n const validNonSchemaSingletons = Object.entries(this.configShapes).reduce<\n ParseResult<ResolvedConfigValidator<SV, CV>>\n >(\n (acc, [key, value]) => {\n if (\n this.dependenciesDefinition[key].lifetime === Lifetime.Singleton &&\n !(this.schemaValidator as SchemaValidator).isSchema<\n SchemaFunction<SV> | SchemaConstructor<SV> | IdiomaticSchema<SV>\n >(value) &&\n isConstructor(value)\n ) {\n if (!(this.dependenciesDefinition[key].value instanceof value)) {\n const expected = value.name;\n const receivedValue: unknown =\n this.dependenciesDefinition[key].value;\n const received = isConstructed(receivedValue)\n ? receivedValue.constructor.name\n : typeof receivedValue;\n\n if (acc.ok) {\n acc = {\n ok: false,\n errors: []\n };\n }\n acc.errors?.push({\n message: `Expected ${expected}, received ${received}`,\n path: [key]\n });\n } else {\n if (acc.ok) {\n acc = {\n ok: true,\n value: {\n ...acc.value,\n [key]: this.dependenciesDefinition[key].value\n }\n };\n }\n }\n return acc;\n }\n return acc;\n },\n {\n ok: true,\n value: {} as ResolvedConfigValidator<SV, CV>\n }\n );\n\n const singletons = Object.fromEntries(\n Object.entries(this.configShapes).filter(\n ([key, value]) =>\n this.dependenciesDefinition[key].lifetime === Lifetime.Singleton &&\n (this.schemaValidator as SchemaValidator).isSchema(value)\n )\n );\n const schemaSingletonParseResult = (\n this.schemaValidator as SchemaValidator\n ).parse(\n (this.schemaValidator as SchemaValidator).schemify(singletons),\n Object.fromEntries(\n Object.keys(singletons).map((key) => {\n const dependency = this.dependenciesDefinition[key];\n return [\n key,\n dependency.lifetime === Lifetime.Singleton\n ? dependency.value\n : undefined\n ];\n })\n )\n );\n\n const configKeys = Object.keys(this.configShapes);\n\n return validNonSchemaSingletons.ok && schemaSingletonParseResult.ok\n ? {\n ok: true as const,\n value: new ValidConfigInjector<SV, CV>(\n this.schemaValidator,\n this.configShapes,\n this.dependenciesDefinition\n )\n }\n : {\n ok: false as const,\n errors: [\n ...(!validNonSchemaSingletons.ok && validNonSchemaSingletons.errors\n ? validNonSchemaSingletons.errors\n : []),\n ...(!schemaSingletonParseResult.ok &&\n schemaSingletonParseResult.errors\n ? schemaSingletonParseResult.errors\n : [])\n ].sort(\n (a, b) =>\n configKeys.indexOf(a.path[0]) - configKeys.indexOf(b.path[0])\n )\n };\n }\n\n validateConfigSingletons(configName: string): ValidConfigInjector<SV, CV> {\n const safeValidateResult = this.safeValidateConfigSingletons();\n\n if (safeValidateResult.ok) {\n return safeValidateResult.value;\n }\n\n throw new Error(\n prettyPrintParseErrors(safeValidateResult.errors, configName)\n );\n }\n\n resolve<T extends keyof CV>(\n token: T,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): ResolvedConfigValidator<SV, CV>[T] {\n const instance = this.instances[token];\n if (!instance) {\n const definition = this.dependenciesDefinition[token];\n\n if (!definition) {\n throw new Error(`Unable to resolve dependency ${String(token)}`);\n }\n\n switch (definition.lifetime) {\n case Lifetime.Singleton: {\n return definition.value;\n }\n case Lifetime.Scoped: {\n const scopedInstance = this.resolveInstance<T>(\n token,\n definition,\n context,\n resolutionPath\n );\n this.instances[token] = scopedInstance;\n return scopedInstance;\n }\n case Lifetime.Transient: {\n return this.resolveInstance<T>(\n token,\n definition,\n context,\n resolutionPath\n );\n }\n default: {\n isNever(definition);\n throw new Error(\n `Unable to resolve lifetime for dependency ${String(\n token\n )}, ${resolutionPath}`\n );\n }\n }\n } else {\n return instance;\n }\n }\n\n scopedResolver<T extends keyof CV>(\n token: T,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[T] {\n return (scope) =>\n (scope ?? this.createScope()).resolve<T>(token, context, resolutionPath);\n }\n\n createScope(): ConfigInjector<SV, CV> {\n return new ConfigInjector<SV, CV>(\n this.schemaValidator,\n this.configShapes,\n this.dependenciesDefinition\n );\n }\n\n dispose(): void {\n this.instances = {};\n this.loadSingletons();\n }\n}\n\nexport class ValidConfigInjector<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> extends ConfigInjector<SV, CV> {\n validConfigInjector!: void;\n}\n","import { Constructed } from '../types/configInjector.types';\n\nexport function isConstructed(\n value: unknown\n): value is Constructed<unknown, unknown> {\n return (\n typeof value === 'object' &&\n value != null &&\n 'constructor' in value &&\n value.constructor != null\n );\n}\n","import { Constructor } from '../types/configInjector.types';\n\nexport function isConstructor(value: unknown): value is Constructor {\n return (\n typeof value === 'function' &&\n value.constructor != null &&\n value.prototype != null\n );\n}\n","import {\n AnySchemaValidator,\n IdiomaticSchema,\n Schema\n} from '@forklaunch/validator';\nimport { ConfigInjector } from '../configInjector';\n\nexport enum Lifetime {\n Singleton,\n Transient,\n Scoped\n}\n\nexport type Singleton<Value> = {\n lifetime: Lifetime.Singleton;\n value: Value;\n};\n\nexport type Constructed<Args, Return> = {\n lifetime: Lifetime.Transient | Lifetime.Scoped;\n factory: (\n args: Args,\n resolve: <T extends keyof Args>(\n token: T,\n context?: Record<string, unknown>\n ) => Args[T],\n context: Record<string, unknown>\n ) => Return;\n};\n\nexport type Constructor = new (...args: never[]) => unknown;\nexport type SchemaConstructor<SV extends AnySchemaValidator> = new (\n ...args: unknown[]\n) => IdiomaticSchema<SV>;\nexport type Function = (...args: never[]) => unknown;\nexport type SchemaFunction<SV extends AnySchemaValidator> = (\n args: unknown\n) => IdiomaticSchema<SV>;\n\nexport type ConfigValidator<SV extends AnySchemaValidator> = Record<\n string,\n | Function\n | SchemaFunction<SV>\n | Constructor\n | SchemaConstructor<SV>\n | IdiomaticSchema<SV>\n>;\n\nexport type ResolvedConfigValidator<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> = {\n [M in keyof CV]: CV[M] extends SchemaConstructor<SV>\n ? Schema<InstanceType<CV[M]>, SV>\n : CV[M] extends SchemaFunction<SV>\n ? Schema<ReturnType<CV[M]>, SV>\n : CV[M] extends Function\n ? ReturnType<CV[M]>\n : CV[M] extends Constructor\n ? InstanceType<CV[M]>\n : Schema<CV[M], SV>;\n};\n\nexport type ScopedDependencyFactory<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>,\n M extends keyof CV\n> = (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[M];\n","// This is a simple function that returns the value of an environment variable.\n// It casts a potentially undefined value to a string, since it will be validated in order to be bootstrapped.\n\nexport function getEnvVar(name: string): string {\n const value = process.env[name];\n return value as string;\n}\n"],"mappings":"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","names":["Lifetime"]}
@@ -1,5 +1,8 @@
1
1
  // src/services/configInjector.ts
2
2
  import { extractArgumentNames, isNever } from "@forklaunch/common";
3
+ import {
4
+ prettyPrintParseErrors
5
+ } from "@forklaunch/validator";
3
6
 
4
7
  // src/services/guards/isConstructed.ts
5
8
  function isConstructed(value) {
@@ -72,7 +75,7 @@ var ConfigInjector = class _ConfigInjector {
72
75
  context ?? {}
73
76
  );
74
77
  }
75
- validateConfigSingletons() {
78
+ safeValidateConfigSingletons() {
76
79
  const validNonSchemaSingletons = Object.entries(this.configShapes).reduce(
77
80
  (acc, [key, value]) => {
78
81
  if (this.dependenciesDefinition[key].lifetime === 0 /* Singleton */ && !this.schemaValidator.isSchema(value) && isConstructor(value)) {
@@ -130,10 +133,11 @@ var ConfigInjector = class _ConfigInjector {
130
133
  const configKeys = Object.keys(this.configShapes);
131
134
  return validNonSchemaSingletons.ok && schemaSingletonParseResult.ok ? {
132
135
  ok: true,
133
- value: {
134
- validResolvedConfigValidator: void 0,
135
- ...this
136
- }
136
+ value: new ValidConfigInjector(
137
+ this.schemaValidator,
138
+ this.configShapes,
139
+ this.dependenciesDefinition
140
+ )
137
141
  } : {
138
142
  ok: false,
139
143
  errors: [
@@ -144,6 +148,15 @@ var ConfigInjector = class _ConfigInjector {
144
148
  )
145
149
  };
146
150
  }
151
+ validateConfigSingletons(configName) {
152
+ const safeValidateResult = this.safeValidateConfigSingletons();
153
+ if (safeValidateResult.ok) {
154
+ return safeValidateResult.value;
155
+ }
156
+ throw new Error(
157
+ prettyPrintParseErrors(safeValidateResult.errors, configName)
158
+ );
159
+ }
147
160
  resolve(token, context, resolutionPath = []) {
148
161
  const instance = this.instances[token];
149
162
  if (!instance) {
@@ -201,6 +214,9 @@ var ConfigInjector = class _ConfigInjector {
201
214
  this.loadSingletons();
202
215
  }
203
216
  };
217
+ var ValidConfigInjector = class extends ConfigInjector {
218
+ validConfigInjector;
219
+ };
204
220
 
205
221
  // src/services/getEnvVar.ts
206
222
  function getEnvVar(name) {
@@ -210,5 +226,7 @@ function getEnvVar(name) {
210
226
  export {
211
227
  ConfigInjector,
212
228
  Lifetime,
229
+ ValidConfigInjector,
213
230
  getEnvVar
214
231
  };
232
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/configInjector.ts","../../src/services/guards/isConstructed.ts","../../src/services/guards/isConstructor.ts","../../src/services/types/configInjector.types.ts","../../src/services/getEnvVar.ts"],"sourcesContent":["import { extractArgumentNames, isNever } from '@forklaunch/common';\nimport {\n AnySchemaValidator,\n IdiomaticSchema,\n ParseResult,\n prettyPrintParseErrors,\n SchemaValidator\n} from '@forklaunch/validator';\nimport { isConstructed } from './guards/isConstructed';\nimport { isConstructor } from './guards/isConstructor';\nimport {\n ConfigValidator,\n Constructed,\n Lifetime,\n ResolvedConfigValidator,\n SchemaConstructor,\n SchemaFunction,\n Singleton\n} from './types/configInjector.types';\n\nexport class ConfigInjector<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> {\n instances: {\n [K in keyof CV]?: ResolvedConfigValidator<SV, CV>[K];\n } = {};\n\n private loadSingletons(): void {\n for (const token in this.dependenciesDefinition) {\n const definition = this.dependenciesDefinition[token];\n if (definition.lifetime === Lifetime.Singleton) {\n this.instances[token] = definition.value;\n }\n }\n }\n\n private resolveInstance<T extends keyof CV>(\n token: T,\n definition: Constructed<\n Omit<ResolvedConfigValidator<SV, CV>, T>,\n ResolvedConfigValidator<SV, CV>[T]\n >,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): ResolvedConfigValidator<SV, CV>[T] {\n const injectorArgument = extractArgumentNames(definition.factory)[0];\n // short circuit as no args\n if (injectorArgument === '_args') {\n return definition.factory(\n {} as Omit<ResolvedConfigValidator<SV, CV>, T>,\n this.resolve.bind(this),\n context ?? ({} as Record<string, unknown>)\n );\n }\n\n if (!injectorArgument.startsWith('{') || !injectorArgument.endsWith('}')) {\n throw new Error(\n `Invalid injector argument for ${String(\n token\n )}: ${injectorArgument}. Please use object destructuring syntax: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment.`\n );\n }\n const resolvedArguments = Object.fromEntries(\n injectorArgument\n .replace('{', '')\n .replace('}', '')\n .split(',')\n .map((arg) => arg.split(':')[0].trim())\n .map((arg) => {\n const newResolutionPath = [...resolutionPath, token];\n if (resolutionPath.includes(arg)) {\n throw new Error(\n `Circular dependency detected: ${newResolutionPath.join(\n ' -> '\n )} -> ${arg}`\n );\n }\n const resolvedArg = this.resolve(arg, context, newResolutionPath);\n return [arg, resolvedArg];\n })\n ) as unknown as Omit<ResolvedConfigValidator<SV, CV>, T>;\n return definition.factory(\n resolvedArguments,\n this.resolve.bind(this),\n context ?? ({} as Record<string, unknown>)\n );\n }\n\n constructor(\n private schemaValidator: SV,\n private configShapes: CV,\n private dependenciesDefinition: {\n [K in keyof CV]:\n | Singleton<ResolvedConfigValidator<SV, CV>[K]>\n | Constructed<\n Omit<ResolvedConfigValidator<SV, CV>, K>,\n ResolvedConfigValidator<SV, CV>[K]\n >;\n }\n ) {\n this.loadSingletons();\n }\n\n safeValidateConfigSingletons(): ParseResult<ValidConfigInjector<SV, CV>> {\n const validNonSchemaSingletons = Object.entries(this.configShapes).reduce<\n ParseResult<ResolvedConfigValidator<SV, CV>>\n >(\n (acc, [key, value]) => {\n if (\n this.dependenciesDefinition[key].lifetime === Lifetime.Singleton &&\n !(this.schemaValidator as SchemaValidator).isSchema<\n SchemaFunction<SV> | SchemaConstructor<SV> | IdiomaticSchema<SV>\n >(value) &&\n isConstructor(value)\n ) {\n if (!(this.dependenciesDefinition[key].value instanceof value)) {\n const expected = value.name;\n const receivedValue: unknown =\n this.dependenciesDefinition[key].value;\n const received = isConstructed(receivedValue)\n ? receivedValue.constructor.name\n : typeof receivedValue;\n\n if (acc.ok) {\n acc = {\n ok: false,\n errors: []\n };\n }\n acc.errors?.push({\n message: `Expected ${expected}, received ${received}`,\n path: [key]\n });\n } else {\n if (acc.ok) {\n acc = {\n ok: true,\n value: {\n ...acc.value,\n [key]: this.dependenciesDefinition[key].value\n }\n };\n }\n }\n return acc;\n }\n return acc;\n },\n {\n ok: true,\n value: {} as ResolvedConfigValidator<SV, CV>\n }\n );\n\n const singletons = Object.fromEntries(\n Object.entries(this.configShapes).filter(\n ([key, value]) =>\n this.dependenciesDefinition[key].lifetime === Lifetime.Singleton &&\n (this.schemaValidator as SchemaValidator).isSchema(value)\n )\n );\n const schemaSingletonParseResult = (\n this.schemaValidator as SchemaValidator\n ).parse(\n (this.schemaValidator as SchemaValidator).schemify(singletons),\n Object.fromEntries(\n Object.keys(singletons).map((key) => {\n const dependency = this.dependenciesDefinition[key];\n return [\n key,\n dependency.lifetime === Lifetime.Singleton\n ? dependency.value\n : undefined\n ];\n })\n )\n );\n\n const configKeys = Object.keys(this.configShapes);\n\n return validNonSchemaSingletons.ok && schemaSingletonParseResult.ok\n ? {\n ok: true as const,\n value: new ValidConfigInjector<SV, CV>(\n this.schemaValidator,\n this.configShapes,\n this.dependenciesDefinition\n )\n }\n : {\n ok: false as const,\n errors: [\n ...(!validNonSchemaSingletons.ok && validNonSchemaSingletons.errors\n ? validNonSchemaSingletons.errors\n : []),\n ...(!schemaSingletonParseResult.ok &&\n schemaSingletonParseResult.errors\n ? schemaSingletonParseResult.errors\n : [])\n ].sort(\n (a, b) =>\n configKeys.indexOf(a.path[0]) - configKeys.indexOf(b.path[0])\n )\n };\n }\n\n validateConfigSingletons(configName: string): ValidConfigInjector<SV, CV> {\n const safeValidateResult = this.safeValidateConfigSingletons();\n\n if (safeValidateResult.ok) {\n return safeValidateResult.value;\n }\n\n throw new Error(\n prettyPrintParseErrors(safeValidateResult.errors, configName)\n );\n }\n\n resolve<T extends keyof CV>(\n token: T,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): ResolvedConfigValidator<SV, CV>[T] {\n const instance = this.instances[token];\n if (!instance) {\n const definition = this.dependenciesDefinition[token];\n\n if (!definition) {\n throw new Error(`Unable to resolve dependency ${String(token)}`);\n }\n\n switch (definition.lifetime) {\n case Lifetime.Singleton: {\n return definition.value;\n }\n case Lifetime.Scoped: {\n const scopedInstance = this.resolveInstance<T>(\n token,\n definition,\n context,\n resolutionPath\n );\n this.instances[token] = scopedInstance;\n return scopedInstance;\n }\n case Lifetime.Transient: {\n return this.resolveInstance<T>(\n token,\n definition,\n context,\n resolutionPath\n );\n }\n default: {\n isNever(definition);\n throw new Error(\n `Unable to resolve lifetime for dependency ${String(\n token\n )}, ${resolutionPath}`\n );\n }\n }\n } else {\n return instance;\n }\n }\n\n scopedResolver<T extends keyof CV>(\n token: T,\n context?: Record<string, unknown>,\n resolutionPath: (keyof CV)[] = []\n ): (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[T] {\n return (scope) =>\n (scope ?? this.createScope()).resolve<T>(token, context, resolutionPath);\n }\n\n createScope(): ConfigInjector<SV, CV> {\n return new ConfigInjector<SV, CV>(\n this.schemaValidator,\n this.configShapes,\n this.dependenciesDefinition\n );\n }\n\n dispose(): void {\n this.instances = {};\n this.loadSingletons();\n }\n}\n\nexport class ValidConfigInjector<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> extends ConfigInjector<SV, CV> {\n validConfigInjector!: void;\n}\n","import { Constructed } from '../types/configInjector.types';\n\nexport function isConstructed(\n value: unknown\n): value is Constructed<unknown, unknown> {\n return (\n typeof value === 'object' &&\n value != null &&\n 'constructor' in value &&\n value.constructor != null\n );\n}\n","import { Constructor } from '../types/configInjector.types';\n\nexport function isConstructor(value: unknown): value is Constructor {\n return (\n typeof value === 'function' &&\n value.constructor != null &&\n value.prototype != null\n );\n}\n","import {\n AnySchemaValidator,\n IdiomaticSchema,\n Schema\n} from '@forklaunch/validator';\nimport { ConfigInjector } from '../configInjector';\n\nexport enum Lifetime {\n Singleton,\n Transient,\n Scoped\n}\n\nexport type Singleton<Value> = {\n lifetime: Lifetime.Singleton;\n value: Value;\n};\n\nexport type Constructed<Args, Return> = {\n lifetime: Lifetime.Transient | Lifetime.Scoped;\n factory: (\n args: Args,\n resolve: <T extends keyof Args>(\n token: T,\n context?: Record<string, unknown>\n ) => Args[T],\n context: Record<string, unknown>\n ) => Return;\n};\n\nexport type Constructor = new (...args: never[]) => unknown;\nexport type SchemaConstructor<SV extends AnySchemaValidator> = new (\n ...args: unknown[]\n) => IdiomaticSchema<SV>;\nexport type Function = (...args: never[]) => unknown;\nexport type SchemaFunction<SV extends AnySchemaValidator> = (\n args: unknown\n) => IdiomaticSchema<SV>;\n\nexport type ConfigValidator<SV extends AnySchemaValidator> = Record<\n string,\n | Function\n | SchemaFunction<SV>\n | Constructor\n | SchemaConstructor<SV>\n | IdiomaticSchema<SV>\n>;\n\nexport type ResolvedConfigValidator<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>\n> = {\n [M in keyof CV]: CV[M] extends SchemaConstructor<SV>\n ? Schema<InstanceType<CV[M]>, SV>\n : CV[M] extends SchemaFunction<SV>\n ? Schema<ReturnType<CV[M]>, SV>\n : CV[M] extends Function\n ? ReturnType<CV[M]>\n : CV[M] extends Constructor\n ? InstanceType<CV[M]>\n : Schema<CV[M], SV>;\n};\n\nexport type ScopedDependencyFactory<\n SV extends AnySchemaValidator,\n CV extends ConfigValidator<SV>,\n M extends keyof CV\n> = (scope?: ConfigInjector<SV, CV>) => ResolvedConfigValidator<SV, CV>[M];\n","// This is a simple function that returns the value of an environment variable.\n// It casts a potentially undefined value to a string, since it will be validated in order to be bootstrapped.\n\nexport function getEnvVar(name: string): string {\n const value = process.env[name];\n return value as string;\n}\n"],"mappings":"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","names":["Lifetime"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forklaunch/core",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "forklaunch-js core package. Contains useful building blocks.",
5
5
  "homepage": "https://github.com/forklaunch/forklaunch-js#readme",
6
6
  "bugs": {
@@ -25,12 +25,6 @@
25
25
  "require": "./lib/controllers/index.js",
26
26
  "default": "./lib/controllers/index.js"
27
27
  },
28
- "./database": {
29
- "types": "./lib/database/index.d.ts",
30
- "import": "./lib/database/index.mjs",
31
- "require": "./lib/database/index.js",
32
- "default": "./lib/database/index.js"
33
- },
34
28
  "./dtoMapper": {
35
29
  "types": "./lib/dtoMapper/index.d.ts",
36
30
  "import": "./lib/dtoMapper/index.mjs",
@@ -66,7 +60,7 @@
66
60
  "redis": "^4.7.0",
67
61
  "uuid": "^11.0.5",
68
62
  "@forklaunch/common": "0.2.0",
69
- "@forklaunch/validator": "0.4.1"
63
+ "@forklaunch/validator": "0.4.2"
70
64
  },
71
65
  "devDependencies": {
72
66
  "@eslint/js": "^9.17.0",
@@ -86,7 +80,7 @@
86
80
  "typescript-eslint": "^8.19.1"
87
81
  },
88
82
  "scripts": {
89
- "build": "tsc --noEmit && tsup ./src/cache/index.ts ./src/controllers/index.ts ./src/database/index.ts ./src/dtoMapper/index.ts ./src/http/index.ts ./src/services/index.ts --format cjs,esm --no-splitting --dts --tsconfig tsconfig.json --out-dir lib --clean",
83
+ "build": "tsc --noEmit && tsup ./src/cache/index.ts ./src/controllers/index.ts ./src/database/mikro/models/entities/base.entity.ts ./src/database/mikro/models/entities/mongo.base.entity.ts ./src/database/mikro/models/entities/role.entity.ts ./src/database/mikro/models/entities/user.entity.ts ./src/dtoMapper/index.ts ./src/http/index.ts ./src/services/index.ts --format cjs,esm --no-splitting --dts --tsconfig tsconfig.json --out-dir lib --clean --sourcemap",
90
84
  "clean": "rm -rf lib pnpm.lock.yaml node_modules",
91
85
  "docs": "typedoc --out docs *",
92
86
  "format": "prettier --ignore-path=.prettierignore --config .prettierrc '**/*.{ts,tsx,json}' --write",
@@ -1,27 +0,0 @@
1
- /**
2
- * Abstract class representing a base entity.
3
- */
4
- declare abstract class BaseEntity {
5
- /**
6
- * The unique identifier for the entity.
7
- *
8
- * @type {string}
9
- * @readonly
10
- */
11
- id: string;
12
- /**
13
- * The date when the entity was created.
14
- *
15
- * @type {Date}
16
- */
17
- createdAt: Date;
18
- /**
19
- * The date when the entity was last updated.
20
- *
21
- * @type {Date}
22
- * @readonly
23
- */
24
- updatedAt: Date;
25
- }
26
-
27
- export { BaseEntity as B };
@@ -1,27 +0,0 @@
1
- /**
2
- * Abstract class representing a base entity.
3
- */
4
- declare abstract class BaseEntity {
5
- /**
6
- * The unique identifier for the entity.
7
- *
8
- * @type {string}
9
- * @readonly
10
- */
11
- id: string;
12
- /**
13
- * The date when the entity was created.
14
- *
15
- * @type {Date}
16
- */
17
- createdAt: Date;
18
- /**
19
- * The date when the entity was last updated.
20
- *
21
- * @type {Date}
22
- * @readonly
23
- */
24
- updatedAt: Date;
25
- }
26
-
27
- export { BaseEntity as B };
@@ -1,37 +0,0 @@
1
- export { B as BaseEntity } from '../base.entity-DNfmMOgd.mjs';
2
- import { ObjectId } from '@mikro-orm/mongodb';
3
-
4
- /**
5
- * Abstract class representing a base entity.
6
- */
7
- declare abstract class MongoBaseEntity {
8
- /**
9
- * The serialized unique identifier for the entity.
10
- *
11
- * @type {string}
12
- * @readonly
13
- */
14
- _id: ObjectId;
15
- /**
16
- * The unique identifier for the entity.
17
- *
18
- * @type {string}
19
- * @readonly
20
- */
21
- id: string;
22
- /**
23
- * The date when the entity was created.
24
- *
25
- * @type {Date}
26
- */
27
- createdAt: Date;
28
- /**
29
- * The date when the entity was last updated.
30
- *
31
- * @type {Date}
32
- * @readonly
33
- */
34
- updatedAt: Date;
35
- }
36
-
37
- export { MongoBaseEntity };
@@ -1,37 +0,0 @@
1
- export { B as BaseEntity } from '../base.entity-DNfmMOgd.js';
2
- import { ObjectId } from '@mikro-orm/mongodb';
3
-
4
- /**
5
- * Abstract class representing a base entity.
6
- */
7
- declare abstract class MongoBaseEntity {
8
- /**
9
- * The serialized unique identifier for the entity.
10
- *
11
- * @type {string}
12
- * @readonly
13
- */
14
- _id: ObjectId;
15
- /**
16
- * The unique identifier for the entity.
17
- *
18
- * @type {string}
19
- * @readonly
20
- */
21
- id: string;
22
- /**
23
- * The date when the entity was created.
24
- *
25
- * @type {Date}
26
- */
27
- createdAt: Date;
28
- /**
29
- * The date when the entity was last updated.
30
- *
31
- * @type {Date}
32
- * @readonly
33
- */
34
- updatedAt: Date;
35
- }
36
-
37
- export { MongoBaseEntity };
@@ -1,78 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var __decorateClass = (decorators, target, key, kind) => {
20
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
21
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
22
- if (decorator = decorators[i])
23
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
24
- if (kind && result) __defProp(target, key, result);
25
- return result;
26
- };
27
-
28
- // src/database/index.ts
29
- var database_exports = {};
30
- __export(database_exports, {
31
- BaseEntity: () => BaseEntity,
32
- MongoBaseEntity: () => MongoBaseEntity
33
- });
34
- module.exports = __toCommonJS(database_exports);
35
-
36
- // src/database/mikro/models/entities/base.entity.ts
37
- var import_uuid = require("uuid");
38
- var import_core = require("@mikro-orm/core");
39
- var BaseEntity = class {
40
- id = (0, import_uuid.v4)();
41
- createdAt = /* @__PURE__ */ new Date();
42
- updatedAt = /* @__PURE__ */ new Date();
43
- };
44
- __decorateClass([
45
- (0, import_core.PrimaryKey)({ type: "uuid" })
46
- ], BaseEntity.prototype, "id", 2);
47
- __decorateClass([
48
- (0, import_core.Property)()
49
- ], BaseEntity.prototype, "createdAt", 2);
50
- __decorateClass([
51
- (0, import_core.Property)({ onUpdate: () => /* @__PURE__ */ new Date() })
52
- ], BaseEntity.prototype, "updatedAt", 2);
53
-
54
- // src/database/mikro/models/entities/mongo.base.entity.ts
55
- var import_core2 = require("@mikro-orm/core");
56
- var MongoBaseEntity = class {
57
- _id;
58
- id;
59
- createdAt = /* @__PURE__ */ new Date();
60
- updatedAt = /* @__PURE__ */ new Date();
61
- };
62
- __decorateClass([
63
- (0, import_core2.PrimaryKey)()
64
- ], MongoBaseEntity.prototype, "_id", 2);
65
- __decorateClass([
66
- (0, import_core2.SerializedPrimaryKey)()
67
- ], MongoBaseEntity.prototype, "id", 2);
68
- __decorateClass([
69
- (0, import_core2.Property)()
70
- ], MongoBaseEntity.prototype, "createdAt", 2);
71
- __decorateClass([
72
- (0, import_core2.Property)({ onUpdate: () => /* @__PURE__ */ new Date() })
73
- ], MongoBaseEntity.prototype, "updatedAt", 2);
74
- // Annotate the CommonJS export names for ESM import in node:
75
- 0 && (module.exports = {
76
- BaseEntity,
77
- MongoBaseEntity
78
- });