opinionated-machine 2.0.0 → 2.2.0
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/README.md +17 -8
- package/dist/index.d.ts +5 -5
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/AbstractTestContextFactory.d.ts +23 -0
- package/dist/lib/AbstractTestContextFactory.js +39 -0
- package/dist/lib/AbstractTestContextFactory.js.map +1 -0
- package/dist/lib/DIContext.d.ts +4 -4
- package/dist/lib/DIContext.js +4 -3
- package/dist/lib/DIContext.js.map +1 -1
- package/dist/lib/diConfigUtils.d.ts +1 -0
- package/dist/lib/diConfigUtils.js +1 -0
- package/dist/lib/diConfigUtils.js.map +1 -1
- package/dist/lib/resolverFunctions.d.ts +7 -0
- package/dist/lib/resolverFunctions.js +19 -3
- package/dist/lib/resolverFunctions.js.map +1 -1
- package/package.json +12 -14
- package/dist/lib/typeUtils.d.ts +0 -19
- package/dist/lib/typeUtils.js +0 -2
- package/dist/lib/typeUtils.js.map +0 -1
package/README.md
CHANGED
|
@@ -86,18 +86,27 @@ const contract = buildDeleteRoute({
|
|
|
86
86
|
|
|
87
87
|
export class MyController extends AbstractController<typeof MyController.contracts> {
|
|
88
88
|
public static contracts = { deleteItem: contract } as const
|
|
89
|
+
private readonly service: Service
|
|
89
90
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
constructor({ service }: ModuleDependencies) {
|
|
92
|
+
super()
|
|
93
|
+
this.service = testService
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private deleteItem = buildFastifyNoPayloadRoute(
|
|
97
|
+
TestController.contracts.deleteItem,
|
|
94
98
|
async (req, reply) => {
|
|
95
|
-
|
|
96
|
-
|
|
99
|
+
req.log.info(req.params.userId)
|
|
100
|
+
this.service.execute()
|
|
101
|
+
await reply.status(204).send()
|
|
97
102
|
},
|
|
98
|
-
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
public buildRoutes() {
|
|
106
|
+
return {
|
|
107
|
+
deleteItem: this.deleteItem,
|
|
108
|
+
}
|
|
99
109
|
}
|
|
100
|
-
}
|
|
101
110
|
}
|
|
102
111
|
```
|
|
103
112
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { DIContext, type DependencyInjectionOptions, type
|
|
1
|
+
export { DIContext, type DependencyInjectionOptions, type RegisterDependenciesParams, } from './lib/DIContext.js';
|
|
2
2
|
export { AbstractModule, type MandatoryNameAndRegistrationPair } from './lib/AbstractModule.js';
|
|
3
|
-
export { ENABLE_ALL, resolveJobQueuesEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled, isJobWorkersEnabled, } from './lib/diConfigUtils.js';
|
|
3
|
+
export { ENABLE_ALL, resolveJobQueuesEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled, isJobWorkersEnabled, isPeriodicJobEnabled, } from './lib/diConfigUtils.js';
|
|
4
4
|
export { AbstractController } from './lib/AbstractController.js';
|
|
5
|
-
export { asJobQueueClass, asJobWorkerClass, asMessageQueueHandlerClass, asControllerClass, asSingletonClass, } from './lib/resolverFunctions.js';
|
|
6
|
-
export type { JobQueueModuleOptions, MessageQueueConsumerModuleOptions, JobWorkerModuleOptions, } from './lib/resolverFunctions.js';
|
|
7
|
-
export type
|
|
5
|
+
export { asJobQueueClass, asJobWorkerClass, asMessageQueueHandlerClass, asControllerClass, asSingletonClass, asPeriodicJobClass, asSingletonFunction, } from './lib/resolverFunctions.js';
|
|
6
|
+
export type { PeriodicJobOptions, JobQueueModuleOptions, MessageQueueConsumerModuleOptions, JobWorkerModuleOptions, } from './lib/resolverFunctions.js';
|
|
7
|
+
export { AbstractTestContextFactory, type CreateTestContextParams, type ConfigOverrides, } from './lib/AbstractTestContextFactory.js';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { DIContext, } from './lib/DIContext.js';
|
|
2
2
|
export { AbstractModule } from './lib/AbstractModule.js';
|
|
3
|
-
export { ENABLE_ALL, resolveJobQueuesEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled, isJobWorkersEnabled, } from './lib/diConfigUtils.js';
|
|
3
|
+
export { ENABLE_ALL, resolveJobQueuesEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled, isJobWorkersEnabled, isPeriodicJobEnabled, } from './lib/diConfigUtils.js';
|
|
4
4
|
export { AbstractController } from './lib/AbstractController.js';
|
|
5
|
-
export { asJobQueueClass, asJobWorkerClass, asMessageQueueHandlerClass, asControllerClass, asSingletonClass, } from './lib/resolverFunctions.js';
|
|
5
|
+
export { asJobQueueClass, asJobWorkerClass, asMessageQueueHandlerClass, asControllerClass, asSingletonClass, asPeriodicJobClass, asSingletonFunction, } from './lib/resolverFunctions.js';
|
|
6
|
+
export { AbstractTestContextFactory, } from './lib/AbstractTestContextFactory.js';
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAGV,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,cAAc,EAAyC,MAAM,yBAAyB,CAAA;AAC/F,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,iBAAiB,EACjB,6BAA6B,EAC7B,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAGV,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,cAAc,EAAyC,MAAM,yBAAyB,CAAA;AAC/F,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,iBAAiB,EACjB,6BAA6B,EAC7B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,4BAA4B,CAAA;AASnC,OAAO,EACL,0BAA0B,GAG3B,MAAM,qCAAqC,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type NameAndRegistrationPair } from 'awilix';
|
|
2
|
+
import type { AbstractModule } from './AbstractModule.js';
|
|
3
|
+
import { DIContext, type DependencyInjectionOptions } from './DIContext.js';
|
|
4
|
+
type NestedPartial<T> = {
|
|
5
|
+
[P in keyof T]?: NestedPartial<T[P]>;
|
|
6
|
+
};
|
|
7
|
+
export type ConfigOverrides<Config> = NestedPartial<Config>;
|
|
8
|
+
export type CreateTestContextParams<Dependencies, Config extends object> = {
|
|
9
|
+
modules?: readonly AbstractModule<unknown>[];
|
|
10
|
+
diOptions?: DependencyInjectionOptions;
|
|
11
|
+
dependencyOverrides?: NameAndRegistrationPair<Dependencies>;
|
|
12
|
+
configOverrides?: ConfigOverrides<Config>;
|
|
13
|
+
};
|
|
14
|
+
export declare abstract class AbstractTestContextFactory<Dependencies extends object, ExternalDependencies, Config extends object> {
|
|
15
|
+
private readonly externalDependencies;
|
|
16
|
+
protected configDependencyId: string;
|
|
17
|
+
private readonly allModules;
|
|
18
|
+
constructor(externalDependencies: ExternalDependencies, allModules: readonly AbstractModule<unknown>[]);
|
|
19
|
+
resetExternalDependencies(): void;
|
|
20
|
+
abstract resolveBaseAppConfig(): Config;
|
|
21
|
+
createTestContext(params?: CreateTestContextParams<Dependencies, Config>): Promise<DIContext<Dependencies, ExternalDependencies>>;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createContainer } from 'awilix';
|
|
2
|
+
import { merge } from 'ts-deepmerge';
|
|
3
|
+
import { DIContext } from './DIContext.js';
|
|
4
|
+
import { asSingletonFunction } from './resolverFunctions.js';
|
|
5
|
+
export class AbstractTestContextFactory {
|
|
6
|
+
externalDependencies;
|
|
7
|
+
configDependencyId = 'config'; // override in subclass if different
|
|
8
|
+
allModules;
|
|
9
|
+
constructor(externalDependencies, allModules) {
|
|
10
|
+
this.externalDependencies = externalDependencies;
|
|
11
|
+
this.allModules = allModules;
|
|
12
|
+
}
|
|
13
|
+
resetExternalDependencies() {
|
|
14
|
+
// Override if necessary
|
|
15
|
+
}
|
|
16
|
+
async createTestContext(params = {}) {
|
|
17
|
+
const diContainer = createContainer({
|
|
18
|
+
injectionMode: 'PROXY',
|
|
19
|
+
});
|
|
20
|
+
const context = new DIContext(diContainer, params.diOptions ?? {});
|
|
21
|
+
const dependencyOverrides = params.configOverrides
|
|
22
|
+
? {
|
|
23
|
+
...params.dependencyOverrides,
|
|
24
|
+
[this.configDependencyId]: asSingletonFunction(() => {
|
|
25
|
+
// biome-ignore lint/style/noNonNullAssertion: there is a ternary condition above
|
|
26
|
+
return merge(this.resolveBaseAppConfig(), params.configOverrides);
|
|
27
|
+
}),
|
|
28
|
+
}
|
|
29
|
+
: params.dependencyOverrides;
|
|
30
|
+
const modules = params.modules ?? this.allModules;
|
|
31
|
+
context.registerDependencies({
|
|
32
|
+
dependencyOverrides,
|
|
33
|
+
modules,
|
|
34
|
+
}, this.externalDependencies, false);
|
|
35
|
+
await context.init();
|
|
36
|
+
return context;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=AbstractTestContextFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractTestContextFactory.js","sourceRoot":"","sources":["../../lib/AbstractTestContextFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,eAAe,EAAE,MAAM,QAAQ,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAEpC,OAAO,EAAE,SAAS,EAAmC,MAAM,gBAAgB,CAAA;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAe5D,MAAM,OAAgB,0BAA0B;IAK7B,oBAAoB,CAAsB;IACjD,kBAAkB,GAAG,QAAQ,CAAA,CAAC,oCAAoC;IAC3D,UAAU,CAAoC;IAE/D,YACE,oBAA0C,EAC1C,UAA8C;QAE9C,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAA;QAChD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,yBAAyB;QACvB,wBAAwB;IAC1B,CAAC;IAID,KAAK,CAAC,iBAAiB,CACrB,SAAwD,EAAE;QAE1D,MAAM,WAAW,GAAG,eAAe,CAAC;YAClC,aAAa,EAAE,OAAO;SACvB,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,IAAI,SAAS,CAC3B,WAAW,EACX,MAAM,CAAC,SAAS,IAAI,EAAE,CACvB,CAAA;QAED,MAAM,mBAAmB,GAAG,MAAM,CAAC,eAAe;YAChD,CAAC,CAAE;gBACC,GAAG,MAAM,CAAC,mBAAmB;gBAC7B,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,mBAAmB,CAAC,GAAG,EAAE;oBAClD,iFAAiF;oBACjF,OAAO,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,eAAgB,CAAC,CAAA;gBACpE,CAAC,CAAC;aACuC;YAC7C,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAA;QAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAA;QACjD,OAAO,CAAC,oBAAoB,CAC1B;YACE,mBAAmB;YACnB,OAAO;SACR,EACD,IAAI,CAAC,oBAAoB,EACzB,KAAK,CACN,CAAA;QAED,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QAEpB,OAAO,OAAO,CAAA;IAChB,CAAC;CACF"}
|
package/dist/lib/DIContext.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { AwilixManager } from 'awilix-manager';
|
|
|
3
3
|
import type { FastifyInstance } from 'fastify';
|
|
4
4
|
import type { AbstractModule } from './AbstractModule.js';
|
|
5
5
|
import type { ENABLE_ALL } from './diConfigUtils.js';
|
|
6
|
-
export type
|
|
6
|
+
export type RegisterDependenciesParams<Dependencies, ExternalDependencies> = {
|
|
7
7
|
modules: readonly AbstractModule<unknown, ExternalDependencies>[];
|
|
8
8
|
dependencyOverrides?: NameAndRegistrationPair<Dependencies>;
|
|
9
9
|
};
|
|
@@ -11,15 +11,15 @@ export type DependencyInjectionOptions = {
|
|
|
11
11
|
jobQueuesEnabled?: false | typeof ENABLE_ALL | string[];
|
|
12
12
|
jobWorkersEnabled?: false | typeof ENABLE_ALL | string[];
|
|
13
13
|
messageQueueConsumersEnabled?: false | typeof ENABLE_ALL | string[];
|
|
14
|
-
periodicJobsEnabled?: false | typeof ENABLE_ALL;
|
|
14
|
+
periodicJobsEnabled?: false | typeof ENABLE_ALL | string[];
|
|
15
15
|
};
|
|
16
|
-
export declare class DIContext<Dependencies extends object, ExternalDependencies =
|
|
16
|
+
export declare class DIContext<Dependencies extends object, ExternalDependencies = undefined> {
|
|
17
17
|
private readonly options;
|
|
18
18
|
readonly awilixManager: AwilixManager;
|
|
19
19
|
readonly diContainer: AwilixContainer<Dependencies>;
|
|
20
20
|
private readonly controllerResolvers;
|
|
21
21
|
constructor(diContainer: AwilixContainer, options: DependencyInjectionOptions);
|
|
22
|
-
registerDependencies(params:
|
|
22
|
+
registerDependencies(params: RegisterDependenciesParams<Dependencies, ExternalDependencies>, externalDependencies: ExternalDependencies, resolveControllers?: boolean): void;
|
|
23
23
|
registerRoutes(app: FastifyInstance): void;
|
|
24
24
|
destroy(): Promise<void>;
|
|
25
25
|
init(): Promise<void>;
|
package/dist/lib/DIContext.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { AwilixManager } from 'awilix-manager';
|
|
2
|
-
// biome-ignore lint/complexity/noBannedTypes: default is empty object
|
|
3
2
|
export class DIContext {
|
|
4
3
|
options;
|
|
5
4
|
awilixManager;
|
|
@@ -18,7 +17,7 @@ export class DIContext {
|
|
|
18
17
|
});
|
|
19
18
|
this.controllerResolvers = [];
|
|
20
19
|
}
|
|
21
|
-
registerDependencies(params, externalDependencies) {
|
|
20
|
+
registerDependencies(params, externalDependencies, resolveControllers = true) {
|
|
22
21
|
const _dependencyOverrides = params.dependencyOverrides ?? {};
|
|
23
22
|
const diConfig = {};
|
|
24
23
|
for (const module of params.modules) {
|
|
@@ -27,7 +26,9 @@ export class DIContext {
|
|
|
27
26
|
// @ts-expect-error we can't really ensure type-safety here
|
|
28
27
|
diConfig[key] = resolvedDIConfig[key];
|
|
29
28
|
}
|
|
30
|
-
|
|
29
|
+
if (resolveControllers) {
|
|
30
|
+
this.controllerResolvers.push(...Object.values(module.resolveControllers()));
|
|
31
|
+
}
|
|
31
32
|
}
|
|
32
33
|
this.diContainer.register(diConfig);
|
|
33
34
|
for (const [dependencyKey, _dependencyValue] of Object.entries(_dependencyOverrides)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DIContext.js","sourceRoot":"","sources":["../../lib/DIContext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAkB9C,
|
|
1
|
+
{"version":3,"file":"DIContext.js","sourceRoot":"","sources":["../../lib/DIContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,6 @@ import type { DependencyInjectionOptions } from './DIContext.js';
|
|
|
2
2
|
export declare const ENABLE_ALL: unique symbol;
|
|
3
3
|
export declare const resolveJobQueuesEnabled: (options: DependencyInjectionOptions) => boolean | string[];
|
|
4
4
|
export declare const isJobWorkersEnabled: (enabled?: false | typeof ENABLE_ALL | string[], name?: string) => boolean;
|
|
5
|
+
export declare const isPeriodicJobEnabled: (enabled?: false | typeof ENABLE_ALL | string[], name?: string) => boolean;
|
|
5
6
|
export declare const isJobQueueEnabled: (enabled?: false | typeof ENABLE_ALL | string[], name?: string) => boolean;
|
|
6
7
|
export declare const isMessageQueueConsumerEnabled: (messageQueueConsumersEnabled?: false | typeof ENABLE_ALL | string[], name?: string) => boolean;
|
|
@@ -13,6 +13,7 @@ export const resolveJobQueuesEnabled = (options) => {
|
|
|
13
13
|
return false;
|
|
14
14
|
};
|
|
15
15
|
export const isJobWorkersEnabled = (enabled, name) => isEnabled(enabled, name);
|
|
16
|
+
export const isPeriodicJobEnabled = (enabled, name) => isEnabled(enabled, name);
|
|
16
17
|
export const isJobQueueEnabled = (enabled, name) => {
|
|
17
18
|
if (!enabled) {
|
|
18
19
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diConfigUtils.js","sourceRoot":"","sources":["../../lib/diConfigUtils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAmC,EACf,EAAE;IACtB,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAA;IACpC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAA;IAC3D,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAA8C,EAC9C,IAAa,EACJ,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAEtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAA8C,EAC9C,IAAa,EACJ,EAAE;IACX,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,4BAAmE,EACnE,IAAa,EACJ,EAAE,CAAC,SAAS,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAA;AAE3D,MAAM,SAAS,GAAG,CAChB,MAAwD,EACxD,IAAa,EACJ,EAAE;IACX,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"diConfigUtils.js","sourceRoot":"","sources":["../../lib/diConfigUtils.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAmC,EACf,EAAE;IACtB,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAA;IACpC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAA;IAC3D,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAA8C,EAC9C,IAAa,EACJ,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAA8C,EAC9C,IAAa,EACJ,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAEtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAA8C,EAC9C,IAAa,EACJ,EAAE;IACX,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,4BAAmE,EACnE,IAAa,EACJ,EAAE,CAAC,SAAS,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAA;AAE3D,MAAM,SAAS,GAAG,CAChB,MAAwD,EACxD,IAAa,EACJ,EAAE;IACX,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { BuildResolver, BuildResolverOptions, Constructor, DisposableResolver } from 'awilix';
|
|
2
|
+
import type { FunctionReturning } from 'awilix/lib/container';
|
|
2
3
|
import type { DependencyInjectionOptions } from './DIContext.js';
|
|
3
4
|
export declare function asSingletonClass<T = object>(Type: Constructor<T>, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
|
|
5
|
+
export declare function asSingletonFunction<T>(fn: FunctionReturning<T>, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
|
|
4
6
|
export declare function asControllerClass<T = object>(Type: Constructor<T>, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
|
|
5
7
|
export type MessageQueueConsumerModuleOptions = {
|
|
6
8
|
queueName: string;
|
|
@@ -12,6 +14,11 @@ export type JobWorkerModuleOptions = {
|
|
|
12
14
|
diOptions: DependencyInjectionOptions;
|
|
13
15
|
};
|
|
14
16
|
export declare function asJobWorkerClass<T = object>(Type: Constructor<T>, workerOptions: JobWorkerModuleOptions, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
|
|
17
|
+
export type PeriodicJobOptions = {
|
|
18
|
+
jobName: string;
|
|
19
|
+
diOptions: DependencyInjectionOptions;
|
|
20
|
+
};
|
|
21
|
+
export declare function asPeriodicJobClass<T = object>(Type: Constructor<T>, workerOptions: PeriodicJobOptions, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
|
|
15
22
|
export type JobQueueModuleOptions = {
|
|
16
23
|
queueName?: string;
|
|
17
24
|
diOptions: DependencyInjectionOptions;
|
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import { asClass } from 'awilix';
|
|
2
|
-
import { isJobQueueEnabled, isJobWorkersEnabled, isMessageQueueConsumerEnabled, } from './diConfigUtils.js';
|
|
1
|
+
import { asClass, asFunction } from 'awilix';
|
|
2
|
+
import { isJobQueueEnabled, isJobWorkersEnabled, isMessageQueueConsumerEnabled, isPeriodicJobEnabled, } from './diConfigUtils.js';
|
|
3
3
|
export function asSingletonClass(Type, opts) {
|
|
4
4
|
return asClass(Type, {
|
|
5
5
|
...opts,
|
|
6
6
|
lifetime: 'SINGLETON',
|
|
7
7
|
});
|
|
8
8
|
}
|
|
9
|
+
export function asSingletonFunction(fn, opts) {
|
|
10
|
+
return asFunction(fn, {
|
|
11
|
+
...opts,
|
|
12
|
+
lifetime: 'SINGLETON',
|
|
13
|
+
});
|
|
14
|
+
}
|
|
9
15
|
export function asControllerClass(Type, opts) {
|
|
10
16
|
return asClass(Type, {
|
|
11
17
|
...opts,
|
|
@@ -28,12 +34,22 @@ export function asJobWorkerClass(Type, workerOptions, opts) {
|
|
|
28
34
|
// these follow background-jobs-common conventions
|
|
29
35
|
asyncInit: 'start',
|
|
30
36
|
asyncDispose: 'dispose',
|
|
31
|
-
asyncDisposePriority:
|
|
37
|
+
asyncDisposePriority: 15,
|
|
32
38
|
enabled: isJobWorkersEnabled(workerOptions.diOptions.jobWorkersEnabled, workerOptions.queueName),
|
|
33
39
|
lifetime: 'SINGLETON',
|
|
34
40
|
...opts,
|
|
35
41
|
});
|
|
36
42
|
}
|
|
43
|
+
export function asPeriodicJobClass(Type, workerOptions, opts) {
|
|
44
|
+
return asClass(Type, {
|
|
45
|
+
// this follows background-jobs-common conventions
|
|
46
|
+
eagerInject: 'register',
|
|
47
|
+
asyncDispose: 'dispose',
|
|
48
|
+
enabled: isPeriodicJobEnabled(workerOptions.diOptions.periodicJobsEnabled, workerOptions.jobName),
|
|
49
|
+
lifetime: 'SINGLETON',
|
|
50
|
+
...opts,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
37
53
|
export function asJobQueueClass(Type, queueOptions, opts) {
|
|
38
54
|
return asClass(Type, {
|
|
39
55
|
// these follow background-jobs-common conventions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolverFunctions.js","sourceRoot":"","sources":["../../lib/resolverFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"resolverFunctions.js","sourceRoot":"","sources":["../../lib/resolverFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAI5C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,UAAU,gBAAgB,CAC9B,IAAoB,EACpB,IAA8B;IAE9B,OAAO,OAAO,CAAC,IAAI,EAAE;QACnB,GAAG,IAAI;QACP,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAAwB,EACxB,IAA8B;IAE9B,OAAO,UAAU,CAAC,EAAE,EAAE;QACpB,GAAG,IAAI;QACP,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAoB,EACpB,IAA8B;IAE9B,OAAO,OAAO,CAAC,IAAI,EAAE;QACnB,GAAG,IAAI;QACP,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAA;AACJ,CAAC;AAOD,MAAM,UAAU,0BAA0B,CACxC,IAAoB,EACpB,SAA4C,EAC5C,IAA8B;IAE9B,OAAO,OAAO,CAAC,IAAI,EAAE;QACnB,iDAAiD;QACjD,SAAS,EAAE,OAAO;QAClB,YAAY,EAAE,OAAO;QACrB,oBAAoB,EAAE,EAAE;QAExB,OAAO,EAAE,6BAA6B,CACpC,SAAS,CAAC,SAAS,CAAC,4BAA4B,EAChD,SAAS,CAAC,SAAS,CACpB;QACD,QAAQ,EAAE,WAAW;QACrB,GAAG,IAAI;KACR,CAAC,CAAA;AACJ,CAAC;AAOD,MAAM,UAAU,gBAAgB,CAC9B,IAAoB,EACpB,aAAqC,EACrC,IAA8B;IAE9B,OAAO,OAAO,CAAC,IAAI,EAAE;QACnB,kDAAkD;QAClD,SAAS,EAAE,OAAO;QAClB,YAAY,EAAE,SAAS;QACvB,oBAAoB,EAAE,EAAE;QAExB,OAAO,EAAE,mBAAmB,CAC1B,aAAa,CAAC,SAAS,CAAC,iBAAiB,EACzC,aAAa,CAAC,SAAS,CACxB;QACD,QAAQ,EAAE,WAAW;QACrB,GAAG,IAAI;KACR,CAAC,CAAA;AACJ,CAAC;AAOD,MAAM,UAAU,kBAAkB,CAChC,IAAoB,EACpB,aAAiC,EACjC,IAA8B;IAE9B,OAAO,OAAO,CAAC,IAAI,EAAE;QACnB,kDAAkD;QAClD,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,SAAS;QAEvB,OAAO,EAAE,oBAAoB,CAC3B,aAAa,CAAC,SAAS,CAAC,mBAAmB,EAC3C,aAAa,CAAC,OAAO,CACtB;QACD,QAAQ,EAAE,WAAW;QACrB,GAAG,IAAI;KACR,CAAC,CAAA;AACJ,CAAC;AAOD,MAAM,UAAU,eAAe,CAC7B,IAAoB,EACpB,YAAmC,EACnC,IAA8B;IAE9B,OAAO,OAAO,CAAC,IAAI,EAAE;QACnB,kDAAkD;QAClD,SAAS,EAAE,OAAO;QAClB,YAAY,EAAE,SAAS;QACvB,oBAAoB,EAAE,EAAE;QAExB,OAAO,EAAE,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC,SAAS,CAAC;QAC3F,QAAQ,EAAE,WAAW;QACrB,GAAG,IAAI;KACR,CAAC,CAAA;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opinionated-machine",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Very opinionated DI framework for fastify, built on top of awilix ",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./package.json": "./package.json"
|
|
11
|
+
},
|
|
8
12
|
"maintainers": [
|
|
9
13
|
{
|
|
10
14
|
"name": "Igor Savin",
|
|
@@ -12,7 +16,7 @@
|
|
|
12
16
|
}
|
|
13
17
|
],
|
|
14
18
|
"scripts": {
|
|
15
|
-
"build": "tsc -p tsconfig.build.json",
|
|
19
|
+
"build": "rimraf dist && tsc -p tsconfig.build.json",
|
|
16
20
|
"lint": "biome check . && tsc",
|
|
17
21
|
"lint:fix": "biome check --write .",
|
|
18
22
|
"test": "vitest --coverage",
|
|
@@ -22,6 +26,9 @@
|
|
|
22
26
|
"type": "git",
|
|
23
27
|
"url": "git+https://github.com/kibertoad/opinionated-machine.git"
|
|
24
28
|
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"ts-deepmerge": "^7.0.2"
|
|
31
|
+
},
|
|
25
32
|
"peerDependencies": {
|
|
26
33
|
"@lokalise/fastify-api-contracts": ">=1.4.4",
|
|
27
34
|
"@lokalise/universal-ts-utils": ">=4.2.0",
|
|
@@ -44,6 +51,7 @@
|
|
|
44
51
|
"fastify": "^5.2.2",
|
|
45
52
|
"fastify-type-provider-zod": "^4.0.2",
|
|
46
53
|
"vitest": "^3.0.9",
|
|
54
|
+
"rimraf": "^6.0.1",
|
|
47
55
|
"typescript": "^5.8.2",
|
|
48
56
|
"zod": "^3.24.2"
|
|
49
57
|
},
|
|
@@ -51,17 +59,7 @@
|
|
|
51
59
|
"publishConfig": {
|
|
52
60
|
"access": "public"
|
|
53
61
|
},
|
|
54
|
-
"keywords": [
|
|
55
|
-
"dependency",
|
|
56
|
-
"injection",
|
|
57
|
-
"opinionated",
|
|
58
|
-
"awilix",
|
|
59
|
-
"di"
|
|
60
|
-
],
|
|
62
|
+
"keywords": ["dependency", "injection", "opinionated", "awilix", "di"],
|
|
61
63
|
"homepage": "https://github.com/kibertoad/opinionated-machine",
|
|
62
|
-
"files": [
|
|
63
|
-
"README.md",
|
|
64
|
-
"LICENSE",
|
|
65
|
-
"dist/*"
|
|
66
|
-
]
|
|
64
|
+
"files": ["README.md", "LICENSE", "dist/*"]
|
|
67
65
|
}
|
package/dist/lib/typeUtils.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { FastifyRequest } from 'fastify';
|
|
2
|
-
import type { z } from 'zod';
|
|
3
|
-
type InferredOptionalSchema<Schema> = Schema extends z.Schema ? z.infer<Schema> : never;
|
|
4
|
-
/**
|
|
5
|
-
* Infer fastify request type from a contract
|
|
6
|
-
*/
|
|
7
|
-
export type InferRequestFromContract<Contract extends {
|
|
8
|
-
requestHeaderSchema?: z.Schema;
|
|
9
|
-
requestPathParamsSchema?: z.Schema;
|
|
10
|
-
requestQuerySchema?: z.Schema;
|
|
11
|
-
successResponseBodySchema: z.Schema;
|
|
12
|
-
}> = FastifyRequest<{
|
|
13
|
-
Body: never;
|
|
14
|
-
Headers: InferredOptionalSchema<Contract['requestHeaderSchema']>;
|
|
15
|
-
Params: InferredOptionalSchema<Contract['requestPathParamsSchema']>;
|
|
16
|
-
Querystring: InferredOptionalSchema<Contract['requestQuerySchema']>;
|
|
17
|
-
Reply: InferredOptionalSchema<Contract['successResponseBodySchema']>;
|
|
18
|
-
}>;
|
|
19
|
-
export {};
|
package/dist/lib/typeUtils.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"typeUtils.js","sourceRoot":"","sources":["../../lib/typeUtils.ts"],"names":[],"mappings":""}
|