@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.
- package/lib/cache/index.js +1 -0
- package/lib/cache/index.js.map +1 -0
- package/lib/cache/index.mjs +1 -0
- package/lib/cache/index.mjs.map +1 -0
- package/lib/controllers/index.js +1 -0
- package/lib/controllers/index.js.map +1 -0
- package/lib/controllers/index.mjs +1 -0
- package/lib/controllers/index.mjs.map +1 -0
- package/lib/dtoMapper/index.d.mts +6 -7
- package/lib/dtoMapper/index.d.ts +6 -7
- package/lib/dtoMapper/index.js +1 -0
- package/lib/dtoMapper/index.js.map +1 -0
- package/lib/dtoMapper/index.mjs +1 -0
- package/lib/dtoMapper/index.mjs.map +1 -0
- package/lib/http/index.js +1 -0
- package/lib/http/index.js.map +1 -0
- package/lib/http/index.mjs +1 -0
- package/lib/http/index.mjs.map +1 -0
- package/lib/services/index.d.mts +6 -5
- package/lib/services/index.d.ts +120 -42
- package/lib/services/index.js +22 -5
- package/lib/services/index.js.map +1 -0
- package/lib/services/index.mjs +23 -5
- package/lib/services/index.mjs.map +1 -0
- package/package.json +3 -9
- package/lib/base.entity-DNfmMOgd.d.mts +0 -27
- package/lib/base.entity-DNfmMOgd.d.ts +0 -27
- package/lib/database/index.d.mts +0 -37
- package/lib/database/index.d.ts +0 -37
- package/lib/database/index.js +0 -78
- package/lib/database/index.mjs +0 -53
package/lib/services/index.d.ts
CHANGED
@@ -1,49 +1,111 @@
|
|
1
|
-
import {
|
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
|
-
|
6
|
-
|
7
|
-
|
10
|
+
Singleton = 0,
|
11
|
+
Transient = 1,
|
12
|
+
Scoped = 2
|
8
13
|
}
|
9
14
|
type Singleton<Value> = {
|
10
|
-
|
11
|
-
|
15
|
+
lifetime: Lifetime.Singleton;
|
16
|
+
value: Value;
|
12
17
|
};
|
13
18
|
type Constructed<Args, Return> = {
|
14
|
-
|
15
|
-
|
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 (
|
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> = (
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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<
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
128
|
+
fork: <Options>(options?: Options) => EntityManager;
|
67
129
|
};
|
68
130
|
|
69
|
-
export {
|
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
|
+
};
|
package/lib/services/index.js
CHANGED
@@ -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
|
-
|
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
|
-
|
163
|
-
|
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"]}
|
package/lib/services/index.mjs
CHANGED
@@ -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
|
-
|
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
|
-
|
135
|
-
|
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.
|
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.
|
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/
|
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 };
|
package/lib/database/index.d.mts
DELETED
@@ -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 };
|
package/lib/database/index.d.ts
DELETED
@@ -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 };
|
package/lib/database/index.js
DELETED
@@ -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
|
-
});
|