@forklaunch/core 0.3.3 → 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 +2 -1
- package/lib/services/index.d.ts +119 -41
- package/lib/services/index.js +12 -1
- package/lib/services/index.js.map +1 -0
- package/lib/services/index.mjs +14 -1
- 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
|
-
|
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>;
|
24
58
|
};
|
25
|
-
type ScopedDependencyFactory<
|
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];
|
26
64
|
|
27
|
-
declare class ConfigInjector<
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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;
|
44
103
|
}
|
45
|
-
declare class ValidConfigInjector<
|
46
|
-
|
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
@@ -29,6 +29,7 @@ module.exports = __toCommonJS(services_exports);
|
|
29
29
|
|
30
30
|
// src/services/configInjector.ts
|
31
31
|
var import_common = require("@forklaunch/common");
|
32
|
+
var import_validator = require("@forklaunch/validator");
|
32
33
|
|
33
34
|
// src/services/guards/isConstructed.ts
|
34
35
|
function isConstructed(value) {
|
@@ -101,7 +102,7 @@ var ConfigInjector = class _ConfigInjector {
|
|
101
102
|
context ?? {}
|
102
103
|
);
|
103
104
|
}
|
104
|
-
|
105
|
+
safeValidateConfigSingletons() {
|
105
106
|
const validNonSchemaSingletons = Object.entries(this.configShapes).reduce(
|
106
107
|
(acc, [key, value]) => {
|
107
108
|
if (this.dependenciesDefinition[key].lifetime === 0 /* Singleton */ && !this.schemaValidator.isSchema(value) && isConstructor(value)) {
|
@@ -174,6 +175,15 @@ var ConfigInjector = class _ConfigInjector {
|
|
174
175
|
)
|
175
176
|
};
|
176
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
|
+
}
|
177
187
|
resolve(token, context, resolutionPath = []) {
|
178
188
|
const instance = this.instances[token];
|
179
189
|
if (!instance) {
|
@@ -247,3 +257,4 @@ function getEnvVar(name) {
|
|
247
257
|
ValidConfigInjector,
|
248
258
|
getEnvVar
|
249
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)) {
|
@@ -145,6 +148,15 @@ var ConfigInjector = class _ConfigInjector {
|
|
145
148
|
)
|
146
149
|
};
|
147
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
|
+
}
|
148
160
|
resolve(token, context, resolutionPath = []) {
|
149
161
|
const instance = this.instances[token];
|
150
162
|
if (!instance) {
|
@@ -217,3 +229,4 @@ export {
|
|
217
229
|
ValidConfigInjector,
|
218
230
|
getEnvVar
|
219
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
|
-
});
|
package/lib/database/index.mjs
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
var __defProp = Object.defineProperty;
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
3
|
-
var __decorateClass = (decorators, target, key, kind) => {
|
4
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
5
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
6
|
-
if (decorator = decorators[i])
|
7
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
8
|
-
if (kind && result) __defProp(target, key, result);
|
9
|
-
return result;
|
10
|
-
};
|
11
|
-
|
12
|
-
// src/database/mikro/models/entities/base.entity.ts
|
13
|
-
import { v4 } from "uuid";
|
14
|
-
import { PrimaryKey, Property } from "@mikro-orm/core";
|
15
|
-
var BaseEntity = class {
|
16
|
-
id = v4();
|
17
|
-
createdAt = /* @__PURE__ */ new Date();
|
18
|
-
updatedAt = /* @__PURE__ */ new Date();
|
19
|
-
};
|
20
|
-
__decorateClass([
|
21
|
-
PrimaryKey({ type: "uuid" })
|
22
|
-
], BaseEntity.prototype, "id", 2);
|
23
|
-
__decorateClass([
|
24
|
-
Property()
|
25
|
-
], BaseEntity.prototype, "createdAt", 2);
|
26
|
-
__decorateClass([
|
27
|
-
Property({ onUpdate: () => /* @__PURE__ */ new Date() })
|
28
|
-
], BaseEntity.prototype, "updatedAt", 2);
|
29
|
-
|
30
|
-
// src/database/mikro/models/entities/mongo.base.entity.ts
|
31
|
-
import { PrimaryKey as PrimaryKey2, Property as Property2, SerializedPrimaryKey } from "@mikro-orm/core";
|
32
|
-
var MongoBaseEntity = class {
|
33
|
-
_id;
|
34
|
-
id;
|
35
|
-
createdAt = /* @__PURE__ */ new Date();
|
36
|
-
updatedAt = /* @__PURE__ */ new Date();
|
37
|
-
};
|
38
|
-
__decorateClass([
|
39
|
-
PrimaryKey2()
|
40
|
-
], MongoBaseEntity.prototype, "_id", 2);
|
41
|
-
__decorateClass([
|
42
|
-
SerializedPrimaryKey()
|
43
|
-
], MongoBaseEntity.prototype, "id", 2);
|
44
|
-
__decorateClass([
|
45
|
-
Property2()
|
46
|
-
], MongoBaseEntity.prototype, "createdAt", 2);
|
47
|
-
__decorateClass([
|
48
|
-
Property2({ onUpdate: () => /* @__PURE__ */ new Date() })
|
49
|
-
], MongoBaseEntity.prototype, "updatedAt", 2);
|
50
|
-
export {
|
51
|
-
BaseEntity,
|
52
|
-
MongoBaseEntity
|
53
|
-
};
|