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 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
- public buildRoutes() {
91
- return {
92
- deleteItem: buildFastifyNoPayloadRoute(
93
- MyController.contracts.deleteItem,
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
- req.log.info(req.params.userId)
96
- await reply.status(204).send()
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 registerDependenciesParams, } from './lib/DIContext.js';
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 { InferRequestFromContract } from './lib/typeUtils.js';
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,GACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,4BAA4B,CAAA"}
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"}
@@ -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 registerDependenciesParams<Dependencies, ExternalDependencies> = {
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: registerDependenciesParams<Dependencies, ExternalDependencies>, externalDependencies: ExternalDependencies): void;
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>;
@@ -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
- this.controllerResolvers.push(...Object.values(module.resolveControllers()));
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,sEAAsE;AACtE,MAAM,OAAO,SAAS;IACH,OAAO,CAA4B;IACpC,aAAa,CAAe;IAC5B,WAAW,CAA+B;IAC1D,8EAA8E;IAC7D,mBAAmB,CAAiB;IAErD,YAAY,WAA4B,EAAE,OAAmC;QAC3E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC;YACrC,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,IAAI;YACf,WAAW;YACX,WAAW,EAAE,IAAI;YACjB,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAA;QACF,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAA;IAC/B,CAAC;IAED,oBAAoB,CAClB,MAAsE,EACtE,oBAA0C;QAE1C,MAAM,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAA;QAC7D,MAAM,QAAQ,GAA0C,EAAE,CAAA;QAE1D,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;YAEvF,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;gBACnC,2DAA2D;gBAC3D,QAAQ,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;YACvC,CAAC;YAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAC3B,GAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAyB,CACvE,CAAA;QACH,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAEnC,KAAK,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACrF,MAAM,eAAe,GAAG,EAAE,GAAI,gBAAsC,EAAE,CAAA;YAEtE,2CAA2C;YAC3C,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;YACxE,aAAa;YACb,IAAI,eAAe,CAAC,QAAQ,KAAK,gBAAgB,CAAC,QAAQ,EAAE,CAAC;gBAC3D,aAAa;gBACb,eAAe,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAA;YACtD,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,cAAc,CAAC,GAAoB;QACjC,KAAK,MAAM,kBAAkB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1D,wEAAwE;YACxE,MAAM,UAAU,GAA4B,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YACxF,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;YACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAA;QACzC,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAA;IACxC,CAAC;CACF"}
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: 10,
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;AAGhC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,6BAA6B,GAC9B,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,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,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"}
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.0.0",
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
  }
@@ -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 {};
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=typeUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"typeUtils.js","sourceRoot":"","sources":["../../lib/typeUtils.ts"],"names":[],"mappings":""}