opinionated-machine 2.7.1 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/DIContext.d.ts +1 -1
- package/dist/lib/diConfigUtils.d.ts +1 -1
- package/dist/lib/diConfigUtils.js +1 -1
- package/dist/lib/diConfigUtils.js.map +1 -1
- package/dist/lib/resolverFunctions.d.ts +2 -2
- package/dist/lib/resolverFunctions.js +3 -3
- package/dist/lib/resolverFunctions.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -34,7 +34,7 @@ export class MyModule extends AbstractModule<ModuleDependencies, ExternalDepende
|
|
|
34
34
|
// by default init and disposal methods from `background-jobs-commons` job workers
|
|
35
35
|
// will be assumed. If different values are necessary, pass second config object
|
|
36
36
|
// and specify "asyncInit" and "asyncDispose" fields
|
|
37
|
-
jobWorker:
|
|
37
|
+
jobWorker: asEnqueuedJobWorkerClass(JobWorker, {
|
|
38
38
|
queueName: JobWorker.QUEUE_ID,
|
|
39
39
|
diOptions,
|
|
40
40
|
}),
|
|
@@ -125,7 +125,17 @@ const container = createContainer({
|
|
|
125
125
|
injectionMode: 'PROXY',
|
|
126
126
|
})
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
type AppConfig = {
|
|
129
|
+
DATABASE_URL: string
|
|
130
|
+
// ...
|
|
131
|
+
// everything related to app configuration
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
type ExternalDependencies = {
|
|
135
|
+
logger: Logger // most likely you would like to reuse logger instance from fastify app
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const context = new DIContext<ModuleDependencies, AppConfig, ExternalDependencies>(container, {
|
|
129
139
|
messageQueueConsumersEnabled: [MessageQueueConsumer.QUEUE_ID],
|
|
130
140
|
jobQueuesEnabled: false,
|
|
131
141
|
jobWorkersEnabled: false,
|
|
@@ -134,7 +144,14 @@ const context = new DIContext<ModuleDependencies>(container, {
|
|
|
134
144
|
|
|
135
145
|
context.registerDependencies({
|
|
136
146
|
modules: [module],
|
|
137
|
-
|
|
147
|
+
secondaryModules: [someOtherModule] // only dependencies marked as public are injected from secondary modules. This is useful for catching encapsulation violations in integration tests.
|
|
148
|
+
dependencyOverrides: {}, // dependency overrides if necessary, usually for testing purposes
|
|
149
|
+
configOverrides: {}, // config overrides if necessary, will be merged with value inside existing config
|
|
150
|
+
configDependencyId?: string // what is the dependency id in the graph for the config entity. Only used for config overrides. Default value is `config`
|
|
151
|
+
},
|
|
152
|
+
// external dependencies that are instantiated outside of DI
|
|
153
|
+
{
|
|
154
|
+
logger: app.logger
|
|
138
155
|
})
|
|
139
156
|
|
|
140
157
|
const app = fastify()
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { DIContext, type DependencyInjectionOptions, type RegisterDependenciesParams, } from './lib/DIContext.js';
|
|
2
2
|
export { AbstractModule, type MandatoryNameAndRegistrationPair, type UnionToIntersection, } from './lib/AbstractModule.js';
|
|
3
|
-
export { ENABLE_ALL, resolveJobQueuesEnabled, isAnyMessageQueueConsumerEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled,
|
|
3
|
+
export { ENABLE_ALL, resolveJobQueuesEnabled, isAnyMessageQueueConsumerEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled, isEnqueuedJobWorkersEnabled, isPeriodicJobEnabled, } from './lib/diConfigUtils.js';
|
|
4
4
|
export { AbstractController } from './lib/AbstractController.js';
|
|
5
|
-
export { asJobQueueClass,
|
|
6
|
-
export type { PeriodicJobOptions, JobQueueModuleOptions, MessageQueueConsumerModuleOptions,
|
|
5
|
+
export { asJobQueueClass, asEnqueuedJobWorkerClass, asMessageQueueHandlerClass, asControllerClass, asSingletonClass, asPeriodicJobClass, asSingletonFunction, asServiceClass, asRepositoryClass, asUseCaseClass, } from './lib/resolverFunctions.js';
|
|
6
|
+
export type { PeriodicJobOptions, JobQueueModuleOptions, MessageQueueConsumerModuleOptions, EnqueuedJobWorkerModuleOptions, } from './lib/resolverFunctions.js';
|
|
7
7
|
export { AbstractTestContextFactory, type CreateTestContextParams, } from './lib/AbstractTestContextFactory.js';
|
|
8
8
|
export type { NestedPartial } from './lib/configUtils.ts';
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { DIContext, } from './lib/DIContext.js';
|
|
2
2
|
export { AbstractModule, } from './lib/AbstractModule.js';
|
|
3
|
-
export { ENABLE_ALL, resolveJobQueuesEnabled, isAnyMessageQueueConsumerEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled,
|
|
3
|
+
export { ENABLE_ALL, resolveJobQueuesEnabled, isAnyMessageQueueConsumerEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled, isEnqueuedJobWorkersEnabled, isPeriodicJobEnabled, } from './lib/diConfigUtils.js';
|
|
4
4
|
export { AbstractController } from './lib/AbstractController.js';
|
|
5
|
-
export { asJobQueueClass,
|
|
5
|
+
export { asJobQueueClass, asEnqueuedJobWorkerClass, asMessageQueueHandlerClass, asControllerClass, asSingletonClass, asPeriodicJobClass, asSingletonFunction, asServiceClass, asRepositoryClass, asUseCaseClass, } from './lib/resolverFunctions.js';
|
|
6
6
|
export { AbstractTestContextFactory, } from './lib/AbstractTestContextFactory.js';
|
|
7
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,EACL,cAAc,GAGf,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,gCAAgC,EAChC,iBAAiB,EACjB,6BAA6B,EAC7B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAGV,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,cAAc,GAGf,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,gCAAgC,EAChC,iBAAiB,EACjB,6BAA6B,EAC7B,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,cAAc,GACf,MAAM,4BAA4B,CAAA;AASnC,OAAO,EACL,0BAA0B,GAE3B,MAAM,qCAAqC,CAAA"}
|
package/dist/lib/DIContext.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export type RegisterDependenciesParams<Dependencies, Config, ExternalDependencie
|
|
|
13
13
|
};
|
|
14
14
|
export type DependencyInjectionOptions = {
|
|
15
15
|
jobQueuesEnabled?: false | typeof ENABLE_ALL | string[];
|
|
16
|
-
|
|
16
|
+
enqueuedJobWorkersEnabled?: false | typeof ENABLE_ALL | string[];
|
|
17
17
|
messageQueueConsumersEnabled?: false | typeof ENABLE_ALL | string[];
|
|
18
18
|
periodicJobsEnabled?: false | typeof ENABLE_ALL | string[];
|
|
19
19
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
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
|
-
export declare const
|
|
4
|
+
export declare const isEnqueuedJobWorkersEnabled: (enabled?: false | typeof ENABLE_ALL | string[], name?: string) => boolean;
|
|
5
5
|
export declare const isPeriodicJobEnabled: (enabled?: false | typeof ENABLE_ALL | string[], name?: string) => boolean;
|
|
6
6
|
export declare const isJobQueueEnabled: (enabled?: false | typeof ENABLE_ALL | string[], name?: string) => boolean;
|
|
7
7
|
export declare const isMessageQueueConsumerEnabled: (messageQueueConsumersEnabled?: false | typeof ENABLE_ALL | string[], name?: string) => boolean;
|
|
@@ -12,7 +12,7 @@ export const resolveJobQueuesEnabled = (options) => {
|
|
|
12
12
|
}
|
|
13
13
|
return false;
|
|
14
14
|
};
|
|
15
|
-
export const
|
|
15
|
+
export const isEnqueuedJobWorkersEnabled = (enabled, name) => isEnabled(enabled, name);
|
|
16
16
|
export const isPeriodicJobEnabled = (enabled, name) => isEnabled(enabled, name);
|
|
17
17
|
export const isJobQueueEnabled = (enabled, name) => {
|
|
18
18
|
if (!enabled) {
|
|
@@ -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,
|
|
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,2BAA2B,GAAG,CACzC,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,CAAC,MAAM,gCAAgC,GAAG,CAAC,OAAmC,EAAW,EAAE,CAC/F,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAA;AAExC,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"}
|
|
@@ -17,11 +17,11 @@ export type MessageQueueConsumerModuleOptions = {
|
|
|
17
17
|
diOptions: DependencyInjectionOptions;
|
|
18
18
|
};
|
|
19
19
|
export declare function asMessageQueueHandlerClass<T = object>(Type: Constructor<T>, mqOptions: MessageQueueConsumerModuleOptions, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
|
|
20
|
-
export type
|
|
20
|
+
export type EnqueuedJobWorkerModuleOptions = {
|
|
21
21
|
queueName: string;
|
|
22
22
|
diOptions: DependencyInjectionOptions;
|
|
23
23
|
};
|
|
24
|
-
export declare function
|
|
24
|
+
export declare function asEnqueuedJobWorkerClass<T = object>(Type: Constructor<T>, workerOptions: EnqueuedJobWorkerModuleOptions, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
|
|
25
25
|
export type PeriodicJobOptions = {
|
|
26
26
|
jobName: string;
|
|
27
27
|
diOptions: DependencyInjectionOptions;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { asClass, asFunction } from 'awilix';
|
|
2
|
-
import {
|
|
2
|
+
import { isEnqueuedJobWorkersEnabled, isJobQueueEnabled, isMessageQueueConsumerEnabled, isPeriodicJobEnabled, } from './diConfigUtils.js';
|
|
3
3
|
export function asSingletonClass(Type, opts) {
|
|
4
4
|
return asClass(Type, {
|
|
5
5
|
...opts,
|
|
@@ -52,14 +52,14 @@ export function asMessageQueueHandlerClass(Type, mqOptions, opts) {
|
|
|
52
52
|
...opts,
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
|
-
export function
|
|
55
|
+
export function asEnqueuedJobWorkerClass(Type, workerOptions, opts) {
|
|
56
56
|
return asClass(Type, {
|
|
57
57
|
// these follow background-jobs-common conventions
|
|
58
58
|
asyncInit: 'start',
|
|
59
59
|
asyncDispose: 'dispose',
|
|
60
60
|
asyncDisposePriority: 15,
|
|
61
61
|
public: false,
|
|
62
|
-
enabled:
|
|
62
|
+
enabled: isEnqueuedJobWorkersEnabled(workerOptions.diOptions.enqueuedJobWorkersEnabled, workerOptions.queueName),
|
|
63
63
|
lifetime: 'SINGLETON',
|
|
64
64
|
...opts,
|
|
65
65
|
});
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"resolverFunctions.js","sourceRoot":"","sources":["../../lib/resolverFunctions.ts"],"names":[],"mappings":"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"}
|