glasswork 1.5.0 → 1.6.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/CHANGELOG.md +54 -1
- package/README.md +6 -2
- package/dist/audit/audit-logger.d.ts +6 -1
- package/dist/audit/audit-logger.d.ts.map +1 -1
- package/dist/audit/audit-logger.js +6 -1
- package/dist/audit/audit-logger.js.map +1 -1
- package/dist/auth/assert.d.ts +4 -0
- package/dist/auth/assert.d.ts.map +1 -1
- package/dist/auth/assert.js +7 -3
- package/dist/auth/assert.js.map +1 -1
- package/dist/auth/better-auth-provider.js +13 -4
- package/dist/auth/better-auth-provider.js.map +1 -1
- package/dist/auth/errors.d.ts +17 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +23 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/index.d.ts +2 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/middleware.d.ts +13 -0
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +19 -8
- package/dist/auth/middleware.js.map +1 -1
- package/dist/auth/types.d.ts +4 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/config/providers.d.ts.map +1 -1
- package/dist/config/providers.js +5 -4
- package/dist/config/providers.js.map +1 -1
- package/dist/core/bootstrap.d.ts +2 -2
- package/dist/core/bootstrap.d.ts.map +1 -1
- package/dist/core/bootstrap.js +142 -68
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/core/contract.d.ts +9 -2
- package/dist/core/contract.d.ts.map +1 -1
- package/dist/core/contract.js +2 -1
- package/dist/core/contract.js.map +1 -1
- package/dist/core/errors.d.ts +16 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +31 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/glasswork-config.d.ts +42 -0
- package/dist/core/glasswork-config.d.ts.map +1 -0
- package/dist/core/glasswork-config.js +2 -0
- package/dist/core/glasswork-config.js.map +1 -0
- package/dist/core/index.d.ts +6 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/job-services.d.ts +16 -0
- package/dist/core/job-services.d.ts.map +1 -0
- package/dist/core/job-services.js +19 -0
- package/dist/core/job-services.js.map +1 -0
- package/dist/core/lifecycle.d.ts +29 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +98 -15
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/module-graph.d.ts +2 -0
- package/dist/core/module-graph.d.ts.map +1 -1
- package/dist/core/module-graph.js +63 -10
- package/dist/core/module-graph.js.map +1 -1
- package/dist/core/module-inspection.d.ts +44 -0
- package/dist/core/module-inspection.d.ts.map +1 -0
- package/dist/core/module-inspection.js +114 -0
- package/dist/core/module-inspection.js.map +1 -0
- package/dist/core/module-runtime.d.ts +8 -0
- package/dist/core/module-runtime.d.ts.map +1 -1
- package/dist/core/module-runtime.js +60 -6
- package/dist/core/module-runtime.js.map +1 -1
- package/dist/core/request-scope.js +1 -1
- package/dist/core/request-scope.js.map +1 -1
- package/dist/core/types.d.ts +98 -7
- package/dist/core/types.d.ts.map +1 -1
- package/dist/email/ses.d.ts +7 -0
- package/dist/email/ses.d.ts.map +1 -0
- package/dist/email/ses.js +6 -0
- package/dist/email/ses.js.map +1 -0
- package/dist/email/smtp.d.ts +7 -0
- package/dist/email/smtp.d.ts.map +1 -0
- package/dist/email/smtp.js +6 -0
- package/dist/email/smtp.js.map +1 -0
- package/dist/email/transports/ses-transport.d.ts.map +1 -1
- package/dist/email/transports/ses-transport.js +6 -4
- package/dist/email/transports/ses-transport.js.map +1 -1
- package/dist/email/transports/smtp-transport.d.ts +40 -0
- package/dist/email/transports/smtp-transport.d.ts.map +1 -0
- package/dist/email/transports/smtp-transport.js +67 -0
- package/dist/email/transports/smtp-transport.js.map +1 -0
- package/dist/http/error-handler.d.ts +7 -1
- package/dist/http/error-handler.d.ts.map +1 -1
- package/dist/http/error-handler.js +18 -6
- package/dist/http/error-handler.js.map +1 -1
- package/dist/http/error-response.dto.d.ts +6 -0
- package/dist/http/error-response.dto.d.ts.map +1 -1
- package/dist/http/error-response.dto.js +6 -0
- package/dist/http/error-response.dto.js.map +1 -1
- package/dist/http/errors.d.ts +12 -0
- package/dist/http/errors.d.ts.map +1 -1
- package/dist/http/errors.js +35 -23
- package/dist/http/errors.js.map +1 -1
- package/dist/http/index.d.ts +1 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/http/index.js.map +1 -1
- package/dist/http/route-authorization.d.ts.map +1 -1
- package/dist/http/route-authorization.js +3 -3
- package/dist/http/route-authorization.js.map +1 -1
- package/dist/http/route-helpers.d.ts +2 -1
- package/dist/http/route-helpers.d.ts.map +1 -1
- package/dist/http/route-helpers.js +29 -2
- package/dist/http/route-helpers.js.map +1 -1
- package/dist/http/route-openapi-context.d.ts +15 -1
- package/dist/http/route-openapi-context.d.ts.map +1 -1
- package/dist/http/route-openapi-context.js.map +1 -1
- package/dist/http/route-response.d.ts +6 -2
- package/dist/http/route-response.d.ts.map +1 -1
- package/dist/http/route-response.js +36 -16
- package/dist/http/route-response.js.map +1 -1
- package/dist/http/route-types.d.ts +12 -4
- package/dist/http/route-types.d.ts.map +1 -1
- package/dist/http/route-types.js.map +1 -1
- package/dist/http/route-validation.d.ts.map +1 -1
- package/dist/http/route-validation.js +21 -1
- package/dist/http/route-validation.js.map +1 -1
- package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts +1 -0
- package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/eventbridge-scheduler-driver.js +12 -2
- package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
- package/dist/jobs/drivers/mock-driver.d.ts +4 -0
- package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/mock-driver.js +10 -3
- package/dist/jobs/drivers/mock-driver.js.map +1 -1
- package/dist/jobs/drivers/sqs-driver.d.ts +1 -1
- package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/sqs-driver.js +8 -2
- package/dist/jobs/drivers/sqs-driver.js.map +1 -1
- package/dist/jobs/errors.d.ts +14 -1
- package/dist/jobs/errors.d.ts.map +1 -1
- package/dist/jobs/errors.js +19 -2
- package/dist/jobs/errors.js.map +1 -1
- package/dist/jobs/index.d.ts +3 -3
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/jobs/job-service.d.ts +46 -7
- package/dist/jobs/job-service.d.ts.map +1 -1
- package/dist/jobs/job-service.js +63 -9
- package/dist/jobs/job-service.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +6 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +6 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/jobs/sqs.d.ts +7 -0
- package/dist/jobs/sqs.d.ts.map +1 -0
- package/dist/jobs/sqs.js +7 -0
- package/dist/jobs/sqs.js.map +1 -0
- package/dist/jobs/types.d.ts +6 -1
- package/dist/jobs/types.d.ts.map +1 -1
- package/dist/jobs/utils.d.ts +6 -0
- package/dist/jobs/utils.d.ts.map +1 -1
- package/dist/jobs/utils.js +8 -0
- package/dist/jobs/utils.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +5 -4
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/observability/exception-tracking.d.ts +23 -0
- package/dist/observability/exception-tracking.d.ts.map +1 -1
- package/dist/observability/exception-tracking.js +101 -6
- package/dist/observability/exception-tracking.js.map +1 -1
- package/dist/observability/index.d.ts +1 -1
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +1 -1
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/sanitizers.d.ts.map +1 -1
- package/dist/observability/sanitizers.js +2 -0
- package/dist/observability/sanitizers.js.map +1 -1
- package/dist/openapi/drift.d.ts +17 -2
- package/dist/openapi/drift.d.ts.map +1 -1
- package/dist/openapi/drift.js +79 -5
- package/dist/openapi/drift.js.map +1 -1
- package/dist/openapi/openapi.d.ts.map +1 -1
- package/dist/openapi/openapi.js +2 -1
- package/dist/openapi/openapi.js.map +1 -1
- package/dist/utils/environment.d.ts +10 -2
- package/dist/utils/environment.d.ts.map +1 -1
- package/dist/utils/environment.js +20 -3
- package/dist/utils/environment.js.map +1 -1
- package/dist/utils/module-interop.d.ts +9 -0
- package/dist/utils/module-interop.d.ts.map +1 -0
- package/dist/utils/module-interop.js +16 -0
- package/dist/utils/module-interop.js.map +1 -0
- package/dist/utils/optional-dependency.d.ts +6 -0
- package/dist/utils/optional-dependency.d.ts.map +1 -0
- package/dist/utils/optional-dependency.js +16 -0
- package/dist/utils/optional-dependency.js.map +1 -0
- package/dist/utils/serialize-prisma-types.d.ts +51 -15
- package/dist/utils/serialize-prisma-types.d.ts.map +1 -1
- package/dist/utils/serialize-prisma-types.js +47 -16
- package/dist/utils/serialize-prisma-types.js.map +1 -1
- package/package.json +56 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-services.js","sourceRoot":"","sources":["../../src/core/job-services.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAUhE,yFAAyF;AACzF,MAAM,UAAU,kBAAkB,CAChC,QAAiC,EACjC,OAAe;IAEf,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,QAAQ,GAAI,QAAoC,CAAC,YAAY,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAE,QAAgC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjG,CAAC"}
|
package/dist/core/lifecycle.d.ts
CHANGED
|
@@ -1,7 +1,35 @@
|
|
|
1
1
|
import { type AwilixContainer } from 'awilix';
|
|
2
2
|
import type { Logger } from '../utils/logger.js';
|
|
3
3
|
/**
|
|
4
|
-
* Execute lifecycle hooks on
|
|
4
|
+
* Execute lifecycle hooks on singleton and value providers in parallel.
|
|
5
|
+
*
|
|
6
|
+
* `onModuleInit` creates every singleton to initialize it. `onModuleDestroy` only reaches
|
|
7
|
+
* singletons that were already created, so shutdown never constructs a provider just to
|
|
8
|
+
* destroy it. Every hook runs to completion before failures are reported: one failure is
|
|
9
|
+
* rethrown as-is, several are combined in an `AggregateError`.
|
|
5
10
|
*/
|
|
6
11
|
export declare function executeLifecycleHooks(container: AwilixContainer, hook: 'onModuleInit' | 'onModuleDestroy', logger: Logger): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Stops the providers a container owns: destroy hooks first, then the Awilix disposers of
|
|
14
|
+
* resolved registrations. Value providers are borrowed and have no disposer. Disposers run
|
|
15
|
+
* even when a destroy hook failed.
|
|
16
|
+
*/
|
|
17
|
+
export declare function shutdownContainer(container: AwilixContainer, logger: Logger): Promise<void>;
|
|
18
|
+
/** Rethrows a single failure unchanged and combines several in an AggregateError. */
|
|
19
|
+
export declare function throwFailures(failures: unknown[], message: string): void;
|
|
20
|
+
export interface ApplicationLifecycle {
|
|
21
|
+
start(): Promise<void>;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Runs an application's start and stop steps at most once.
|
|
26
|
+
*
|
|
27
|
+
* Concurrent calls share one promise, so `start()` only resolves after the start step has
|
|
28
|
+
* finished. A failed start keeps rejecting with its original error. `stop()` waits for a
|
|
29
|
+
* pending start to settle before it runs, and `start()` rejects once `stop()` was called.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createApplicationLifecycle(steps: {
|
|
32
|
+
start: () => Promise<void>;
|
|
33
|
+
stop: () => Promise<void>;
|
|
34
|
+
}): ApplicationLifecycle;
|
|
7
35
|
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAqC,MAAM,QAAQ,CAAC;AACjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,cAAc,GAAG,iBAAiB,EACxC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BjG;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKxE;AAcD,MAAM,WAAW,oBAAoB;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,GAAG,oBAAoB,CAoBvB"}
|
package/dist/core/lifecycle.js
CHANGED
|
@@ -1,27 +1,83 @@
|
|
|
1
1
|
import { Lifetime } from 'awilix';
|
|
2
2
|
/**
|
|
3
|
-
* Execute lifecycle hooks on
|
|
3
|
+
* Execute lifecycle hooks on singleton and value providers in parallel.
|
|
4
|
+
*
|
|
5
|
+
* `onModuleInit` creates every singleton to initialize it. `onModuleDestroy` only reaches
|
|
6
|
+
* singletons that were already created, so shutdown never constructs a provider just to
|
|
7
|
+
* destroy it. Every hook runs to completion before failures are reported: one failure is
|
|
8
|
+
* rethrown as-is, several are combined in an `AggregateError`.
|
|
4
9
|
*/
|
|
5
10
|
export async function executeLifecycleHooks(container, hook, logger) {
|
|
6
11
|
const cradle = container.cradle;
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
const lifetime =
|
|
12
|
+
// Awilix rebuilds `registrations` on every access; read it once.
|
|
13
|
+
const registrations = container.registrations;
|
|
14
|
+
const names = Object.keys(registrations).filter((name) => {
|
|
15
|
+
const lifetime = registrations[name]?.lifetime;
|
|
11
16
|
if (lifetime && lifetime !== Lifetime.SINGLETON)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
return false;
|
|
18
|
+
return hook === 'onModuleInit' || !lifetime || container.cache.has(name);
|
|
19
|
+
});
|
|
20
|
+
const results = await Promise.allSettled(names.map(async (name) => {
|
|
21
|
+
try {
|
|
22
|
+
const service = cradle[name];
|
|
23
|
+
if (!hasHook(service, hook))
|
|
24
|
+
return;
|
|
15
25
|
logger.debug(`Executing ${hook} for ${name}`);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}));
|
|
26
|
+
await service[hook]();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
logger.error(`Error in ${hook} for ${name}`, error);
|
|
30
|
+
throw error;
|
|
22
31
|
}
|
|
32
|
+
}));
|
|
33
|
+
throwFailures(results.flatMap((result) => (result.status === 'rejected' ? [result.reason] : [])), `${hook} failed`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Stops the providers a container owns: destroy hooks first, then the Awilix disposers of
|
|
37
|
+
* resolved registrations. Value providers are borrowed and have no disposer. Disposers run
|
|
38
|
+
* even when a destroy hook failed.
|
|
39
|
+
*/
|
|
40
|
+
export async function shutdownContainer(container, logger) {
|
|
41
|
+
const failures = [];
|
|
42
|
+
await executeLifecycleHooks(container, 'onModuleDestroy', logger).catch((error) => {
|
|
43
|
+
failures.push(error);
|
|
44
|
+
});
|
|
45
|
+
// Awilix uses Promise.all for disposal. Preserve its cache ownership, but collect each
|
|
46
|
+
// disposer failure so its promise waits for every close before shutdown rejects.
|
|
47
|
+
for (const [name, entry] of container.cache) {
|
|
48
|
+
const resolver = entry.resolver;
|
|
49
|
+
const dispose = resolver.dispose;
|
|
50
|
+
if (!dispose)
|
|
51
|
+
continue;
|
|
52
|
+
container.cache.set(name, {
|
|
53
|
+
...entry,
|
|
54
|
+
resolver: {
|
|
55
|
+
...resolver,
|
|
56
|
+
dispose: async (value) => {
|
|
57
|
+
try {
|
|
58
|
+
await dispose.call(resolver, value);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.error(`Error while disposing provider ${String(name)}`, error);
|
|
62
|
+
failures.push(error);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
await container.dispose().catch((error) => {
|
|
69
|
+
logger.error('Error while disposing providers', error);
|
|
70
|
+
failures.push(error);
|
|
71
|
+
});
|
|
72
|
+
throwFailures(failures, 'Shutdown failed');
|
|
73
|
+
}
|
|
74
|
+
/** Rethrows a single failure unchanged and combines several in an AggregateError. */
|
|
75
|
+
export function throwFailures(failures, message) {
|
|
76
|
+
if (failures.length === 1)
|
|
77
|
+
throw failures[0];
|
|
78
|
+
if (failures.length > 1) {
|
|
79
|
+
throw new AggregateError(failures, `${message} (${failures.length} errors)`);
|
|
23
80
|
}
|
|
24
|
-
await Promise.all(promises);
|
|
25
81
|
}
|
|
26
82
|
function hasHook(service, hook) {
|
|
27
83
|
return (service !== null &&
|
|
@@ -29,4 +85,31 @@ function hasHook(service, hook) {
|
|
|
29
85
|
hook in service &&
|
|
30
86
|
typeof service[hook] === 'function');
|
|
31
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Runs an application's start and stop steps at most once.
|
|
90
|
+
*
|
|
91
|
+
* Concurrent calls share one promise, so `start()` only resolves after the start step has
|
|
92
|
+
* finished. A failed start keeps rejecting with its original error. `stop()` waits for a
|
|
93
|
+
* pending start to settle before it runs, and `start()` rejects once `stop()` was called.
|
|
94
|
+
*/
|
|
95
|
+
export function createApplicationLifecycle(steps) {
|
|
96
|
+
let starting;
|
|
97
|
+
let stopping;
|
|
98
|
+
return {
|
|
99
|
+
start() {
|
|
100
|
+
if (stopping) {
|
|
101
|
+
return Promise.reject(new Error('Application has been stopped and cannot start again'));
|
|
102
|
+
}
|
|
103
|
+
starting ??= steps.start();
|
|
104
|
+
return starting;
|
|
105
|
+
},
|
|
106
|
+
stop() {
|
|
107
|
+
stopping ??= (async () => {
|
|
108
|
+
await starting?.catch(() => undefined);
|
|
109
|
+
await steps.stop();
|
|
110
|
+
})();
|
|
111
|
+
return stopping;
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
32
115
|
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,5 +21,7 @@ export declare function resolveAsyncFactoryProviders(container: AwilixContainer,
|
|
|
21
21
|
/** Factory dependency metadata used to order asynchronous initialization. */
|
|
22
22
|
export interface DependencyResolver extends Resolver<unknown> {
|
|
23
23
|
dependencies?: string[];
|
|
24
|
+
/** Awilix disposer, set by `.disposer()`. */
|
|
25
|
+
dispose?: (value: unknown) => unknown;
|
|
24
26
|
}
|
|
25
27
|
//# sourceMappingURL=module-graph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-graph.d.ts","sourceRoot":"","sources":["../../src/core/module-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAe,YAAY,EAAgC,MAAM,YAAY,CAAC;AAE1F;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,YAAY,GAAG,YAAY,EAAE,CAyBvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CA4C9D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,MAAM,EAAE,CAeV;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"module-graph.d.ts","sourceRoot":"","sources":["../../src/core/module-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAe,YAAY,EAAgC,MAAM,YAAY,CAAC;AAE1F;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,YAAY,GAAG,YAAY,EAAE,CAyBvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CA4C9D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,MAAM,EAAE,CAeV;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAoCf;AAyBD,6EAA6E;AAC7E,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,CAAC,OAAO,CAAC;IAC3D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CACvC"}
|
|
@@ -96,13 +96,21 @@ export async function resolveAsyncFactoryProviders(container, names, logger) {
|
|
|
96
96
|
if (visiting.has(name))
|
|
97
97
|
throw new Error(`Circular async factory dependency: ${[...visiting, name].join(' -> ')}`);
|
|
98
98
|
visiting.add(name);
|
|
99
|
-
const registration = container.
|
|
99
|
+
const registration = container.getRegistration(name);
|
|
100
100
|
for (const dependency of registration?.dependencies ?? [])
|
|
101
101
|
await initialize(dependency);
|
|
102
102
|
if (pending.has(name)) {
|
|
103
103
|
logger?.debug(` - Resolving async factory: ${name}`);
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
let value;
|
|
105
|
+
try {
|
|
106
|
+
value = await container.resolve(name);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// Disposal must not receive the rejected promise cached for this singleton.
|
|
110
|
+
container.cache.delete(name);
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
registerResolvedValue(container, name, value, registration?.dispose);
|
|
106
114
|
}
|
|
107
115
|
visiting.delete(name);
|
|
108
116
|
completed.add(name);
|
|
@@ -116,6 +124,23 @@ export async function resolveAsyncFactoryProviders(container, names, logger) {
|
|
|
116
124
|
throw error;
|
|
117
125
|
}
|
|
118
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Replaces an async factory with its resolved value. The cached promise is dropped, and a
|
|
129
|
+
* disposer moves to a singleton holding the value so that disposal receives the value.
|
|
130
|
+
*/
|
|
131
|
+
function registerResolvedValue(container, name, value, dispose) {
|
|
132
|
+
container.cache.delete(name);
|
|
133
|
+
if (!dispose) {
|
|
134
|
+
container.register({ [name]: asValue(value) });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
container.register({
|
|
138
|
+
[name]: asFunction(() => value)
|
|
139
|
+
.singleton()
|
|
140
|
+
.disposer(dispose),
|
|
141
|
+
});
|
|
142
|
+
container.resolve(name);
|
|
143
|
+
}
|
|
119
144
|
function registerProvider(provider, container, moduleName, logger) {
|
|
120
145
|
if (typeof provider === 'function') {
|
|
121
146
|
registerClassProvider(provider, container, logger);
|
|
@@ -130,7 +155,7 @@ function registerProvider(provider, container, moduleName, logger) {
|
|
|
130
155
|
return undefined;
|
|
131
156
|
}
|
|
132
157
|
if ('useFactory' in provider) {
|
|
133
|
-
return registerFactoryProvider(provider, container, logger);
|
|
158
|
+
return registerFactoryProvider(provider, container, moduleName, logger);
|
|
134
159
|
}
|
|
135
160
|
throw new Error(`Invalid provider configuration in module "${moduleName}"`);
|
|
136
161
|
}
|
|
@@ -144,10 +169,13 @@ function registerClassProvider(provider, container, logger) {
|
|
|
144
169
|
function registerExplicitClassProvider(provider, container, logger) {
|
|
145
170
|
const name = typeof provider.provide === 'string' ? provider.provide : camelCase(provider.provide.name);
|
|
146
171
|
const scope = provider.scope || 'SINGLETON';
|
|
172
|
+
if (provider.dispose && scope === 'TRANSIENT') {
|
|
173
|
+
throw new Error(`Provider "${name}": dispose requires SINGLETON or SCOPED scope`);
|
|
174
|
+
}
|
|
147
175
|
logger.debug(` - Registering ${name} (scope: ${scope})`);
|
|
148
|
-
const registration = asClass(provider.useClass);
|
|
176
|
+
const registration = applyScopeToRegistration(asClass(provider.useClass), scope);
|
|
149
177
|
container.register({
|
|
150
|
-
[name]:
|
|
178
|
+
[name]: provider.dispose ? registration.disposer(provider.dispose) : registration,
|
|
151
179
|
});
|
|
152
180
|
}
|
|
153
181
|
function registerValueProvider(provider, container, logger) {
|
|
@@ -156,23 +184,48 @@ function registerValueProvider(provider, container, logger) {
|
|
|
156
184
|
[provider.provide]: asValue(provider.useValue),
|
|
157
185
|
});
|
|
158
186
|
}
|
|
159
|
-
function registerFactoryProvider(provider, container, logger) {
|
|
187
|
+
function registerFactoryProvider(provider, container, moduleName, logger) {
|
|
160
188
|
const scope = provider.scope || 'SINGLETON';
|
|
189
|
+
if (provider.dispose && scope === 'TRANSIENT') {
|
|
190
|
+
throw new Error(`Provider "${provider.provide}": dispose requires SINGLETON or SCOPED scope`);
|
|
191
|
+
}
|
|
161
192
|
const factory = provider.useFactory;
|
|
162
|
-
const isAsync = isAsyncFunction(factory);
|
|
193
|
+
const isAsync = provider.async ?? isAsyncFunction(factory);
|
|
163
194
|
if (isAsync && scope !== 'SINGLETON') {
|
|
164
195
|
throw new Error(`Async factory "${provider.provide}" must use SINGLETON scope`);
|
|
165
196
|
}
|
|
166
197
|
logger.debug(` - Registering ${provider.provide} (factory${isAsync ? ' async' : ''}, scope: ${scope})`);
|
|
167
|
-
const
|
|
198
|
+
const create = isAsync || scope !== 'SINGLETON'
|
|
199
|
+
? factory
|
|
200
|
+
: rejectPromiseResult(factory, provider.provide, moduleName);
|
|
201
|
+
const registration = applyScopeToRegistration(Object.assign(asFunction(create), { dependencies: provider.inject ?? [] }), scope);
|
|
168
202
|
container.register({
|
|
169
|
-
[provider.provide]:
|
|
203
|
+
[provider.provide]: provider.dispose ? registration.disposer(provider.dispose) : registration,
|
|
170
204
|
});
|
|
171
205
|
return isAsync ? provider.provide : undefined;
|
|
172
206
|
}
|
|
173
207
|
function isAsyncFunction(fn) {
|
|
174
208
|
return fn.constructor.name === 'AsyncFunction';
|
|
175
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* A singleton factory that is not known to be async would hand its pending promise to every
|
|
212
|
+
* consumer. Fail with the fix instead of awaiting it implicitly.
|
|
213
|
+
*/
|
|
214
|
+
function rejectPromiseResult(factory, name, moduleName) {
|
|
215
|
+
return (...args) => {
|
|
216
|
+
const value = factory(...args);
|
|
217
|
+
if (isThenable(value)) {
|
|
218
|
+
void Promise.resolve(value).catch(() => undefined);
|
|
219
|
+
throw new Error(`Factory "${name}" in module "${moduleName}" returned a Promise. Use an async function or set async: true so bootstrap awaits it.`);
|
|
220
|
+
}
|
|
221
|
+
return value;
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function isThenable(value) {
|
|
225
|
+
return ((typeof value === 'object' || typeof value === 'function') &&
|
|
226
|
+
value !== null &&
|
|
227
|
+
typeof value.then === 'function');
|
|
228
|
+
}
|
|
176
229
|
function applyScopeToRegistration(registration, scope) {
|
|
177
230
|
if (scope === 'SCOPED') {
|
|
178
231
|
return registration.scoped();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-graph.js","sourceRoot":"","sources":["../../src/core/module-graph.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"module-graph.js","sourceRoot":"","sources":["../../src/core/module-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ModuleConfig } from './types.js';
|
|
2
|
+
export interface ModuleGraphProvider {
|
|
3
|
+
name: string;
|
|
4
|
+
kind: 'class' | 'factory' | 'value';
|
|
5
|
+
/** Value providers have no Awilix lifetime. */
|
|
6
|
+
scope: 'SINGLETON' | 'SCOPED' | 'TRANSIENT' | 'VALUE';
|
|
7
|
+
/** Async factories are awaited during bootstrap. */
|
|
8
|
+
async: boolean;
|
|
9
|
+
exported: boolean;
|
|
10
|
+
/** Dependencies declared with `inject`. Constructor dependencies are not analyzed. */
|
|
11
|
+
inject: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface ModuleGraphNode {
|
|
14
|
+
name: string;
|
|
15
|
+
basePath?: string;
|
|
16
|
+
/** `deferred` marks a `forwardRef()` import. */
|
|
17
|
+
imports: Array<{
|
|
18
|
+
module: string;
|
|
19
|
+
deferred: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
/** Provider names the module exports, including re-exports of imported modules. */
|
|
22
|
+
exports: string[];
|
|
23
|
+
providers: ModuleGraphProvider[];
|
|
24
|
+
jobs: string[];
|
|
25
|
+
hasRoutes: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface ModuleGraph {
|
|
28
|
+
root: string;
|
|
29
|
+
modules: ModuleGraphNode[];
|
|
30
|
+
/** Module cycles closed by `forwardRef()` imports, as module names from first to last. */
|
|
31
|
+
cycles: string[][];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Describe the module graph of an application without creating any provider.
|
|
35
|
+
*
|
|
36
|
+
* Runs the same checks as bootstrap: duplicate module and provider names, undeferred import
|
|
37
|
+
* cycles, ambiguous imports, unknown exports and `inject` dependencies that a module cannot
|
|
38
|
+
* see. It does not run factories, route factories or lifecycle hooks, so it needs no
|
|
39
|
+
* database, network or credentials.
|
|
40
|
+
*/
|
|
41
|
+
export declare function inspectModuleGraph(root: ModuleConfig): ModuleGraph;
|
|
42
|
+
/** Render a module graph as a Mermaid flowchart. Deferred imports use dotted arrows. */
|
|
43
|
+
export declare function moduleGraphToMermaid(graph: ModuleGraph): string;
|
|
44
|
+
//# sourceMappingURL=module-inspection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-inspection.d.ts","sourceRoot":"","sources":["../../src/core/module-inspection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,+CAA+C;IAC/C,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,oDAAoD;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,sFAAsF;IACtF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtD,mFAAmF;IACnF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,0FAA0F;IAC1F,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAwBlE;AAqED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAoB/D"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { createLogger } from '../utils/logger.js';
|
|
2
|
+
import { getProviderName, resolveModule } from './module.js';
|
|
3
|
+
import { collectModules, validateNoCycles } from './module-graph.js';
|
|
4
|
+
import { ModuleRuntime } from './module-runtime.js';
|
|
5
|
+
/**
|
|
6
|
+
* Describe the module graph of an application without creating any provider.
|
|
7
|
+
*
|
|
8
|
+
* Runs the same checks as bootstrap: duplicate module and provider names, undeferred import
|
|
9
|
+
* cycles, ambiguous imports, unknown exports and `inject` dependencies that a module cannot
|
|
10
|
+
* see. It does not run factories, route factories or lifecycle hooks, so it needs no
|
|
11
|
+
* database, network or credentials.
|
|
12
|
+
*/
|
|
13
|
+
export function inspectModuleGraph(root) {
|
|
14
|
+
const modules = collectModules(root);
|
|
15
|
+
validateNoCycles(modules);
|
|
16
|
+
const runtime = new ModuleRuntime(modules, createLogger('ModuleGraph', 'silent'));
|
|
17
|
+
return {
|
|
18
|
+
root: root.name,
|
|
19
|
+
modules: modules.map((module) => {
|
|
20
|
+
const exported = new Set(runtime.exportedNames(module));
|
|
21
|
+
return {
|
|
22
|
+
name: module.name,
|
|
23
|
+
...(module.basePath ? { basePath: module.basePath } : {}),
|
|
24
|
+
imports: (module.imports ?? []).map((reference) => ({
|
|
25
|
+
module: resolveModule(reference).name,
|
|
26
|
+
deferred: 'forwardRef' in reference,
|
|
27
|
+
})),
|
|
28
|
+
exports: [...exported],
|
|
29
|
+
providers: (module.providers ?? []).map((provider) => describeProvider(provider, exported)),
|
|
30
|
+
jobs: (module.jobs ?? []).map((job) => job.name),
|
|
31
|
+
hasRoutes: Boolean(module.routes),
|
|
32
|
+
};
|
|
33
|
+
}),
|
|
34
|
+
cycles: findDeferredCycles(modules),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function describeProvider(provider, exported) {
|
|
38
|
+
const name = getProviderName(provider);
|
|
39
|
+
const base = { name, exported: exported.has(name), inject: [] };
|
|
40
|
+
if (typeof provider === 'function') {
|
|
41
|
+
return { ...base, kind: 'class', scope: 'SINGLETON', async: false };
|
|
42
|
+
}
|
|
43
|
+
if ('useValue' in provider) {
|
|
44
|
+
return { ...base, kind: 'value', scope: 'VALUE', async: false };
|
|
45
|
+
}
|
|
46
|
+
if ('useClass' in provider) {
|
|
47
|
+
return { ...base, kind: 'class', scope: provider.scope ?? 'SINGLETON', async: false };
|
|
48
|
+
}
|
|
49
|
+
const declared = provider.async;
|
|
50
|
+
return {
|
|
51
|
+
...base,
|
|
52
|
+
kind: 'factory',
|
|
53
|
+
scope: provider.scope ?? 'SINGLETON',
|
|
54
|
+
async: declared ?? provider.useFactory.constructor.name === 'AsyncFunction',
|
|
55
|
+
inject: provider.inject ?? [],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Every deferred edge that leads back to its importer closes a deliberate cycle. */
|
|
59
|
+
function findDeferredCycles(modules) {
|
|
60
|
+
const edges = new Map(modules.map((module) => [
|
|
61
|
+
module.name,
|
|
62
|
+
(module.imports ?? []).map((reference) => resolveModule(reference).name),
|
|
63
|
+
]));
|
|
64
|
+
const cycles = [];
|
|
65
|
+
for (const module of modules) {
|
|
66
|
+
for (const reference of module.imports ?? []) {
|
|
67
|
+
if (!('forwardRef' in reference))
|
|
68
|
+
continue;
|
|
69
|
+
const path = shortestPath(edges, resolveModule(reference).name, module.name);
|
|
70
|
+
if (path)
|
|
71
|
+
cycles.push([module.name, ...path]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return cycles;
|
|
75
|
+
}
|
|
76
|
+
function shortestPath(edges, from, to) {
|
|
77
|
+
const previous = new Map([[from, null]]);
|
|
78
|
+
const queue = [from];
|
|
79
|
+
while (queue.length > 0) {
|
|
80
|
+
const current = queue.shift();
|
|
81
|
+
if (current === to) {
|
|
82
|
+
const path = [];
|
|
83
|
+
for (let node = to; node; node = previous.get(node)) {
|
|
84
|
+
path.unshift(node);
|
|
85
|
+
}
|
|
86
|
+
return path;
|
|
87
|
+
}
|
|
88
|
+
for (const next of edges.get(current) ?? []) {
|
|
89
|
+
if (!previous.has(next)) {
|
|
90
|
+
previous.set(next, current);
|
|
91
|
+
queue.push(next);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
/** Render a module graph as a Mermaid flowchart. Deferred imports use dotted arrows. */
|
|
98
|
+
export function moduleGraphToMermaid(graph) {
|
|
99
|
+
const ids = new Map(graph.modules.map((module, index) => [module.name, `m_${index}`]));
|
|
100
|
+
const id = (name) => ids.get(name);
|
|
101
|
+
const label = (name) => name.replace(/[&<>"#\r\n]/g, (character) => `#${character.charCodeAt(0)};`);
|
|
102
|
+
const lines = ['flowchart LR'];
|
|
103
|
+
for (const module of graph.modules) {
|
|
104
|
+
const providers = module.providers.length;
|
|
105
|
+
lines.push(` ${id(module.name)}["${label(module.name)}<br/>${providers} provider${providers === 1 ? '' : 's'}, ${module.exports.length} exported"]`);
|
|
106
|
+
}
|
|
107
|
+
for (const module of graph.modules) {
|
|
108
|
+
for (const imported of module.imports) {
|
|
109
|
+
lines.push(` ${id(module.name)} ${imported.deferred ? '-.->' : '-->'} ${id(imported.module)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return lines.join('\n');
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=module-inspection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-inspection.js","sourceRoot":"","sources":["../../src/core/module-inspection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type AwilixContainer } from 'awilix';
|
|
2
2
|
import type { Logger } from '../utils/logger.js';
|
|
3
|
+
import { type JobServicesScope } from './job-services.js';
|
|
3
4
|
import type { ModuleConfig } from './types.js';
|
|
4
5
|
/** Module names are translated only at the edge; Awilix owns caching and lifetimes. */
|
|
5
6
|
export declare class ModuleRuntime {
|
|
@@ -8,6 +9,13 @@ export declare class ModuleRuntime {
|
|
|
8
9
|
readonly container: AwilixContainer<{}>;
|
|
9
10
|
readonly asyncFactories: string[];
|
|
10
11
|
constructor(modules: ModuleConfig[], logger: Logger);
|
|
12
|
+
/** Names a module exports, including re-exports of imported modules. */
|
|
13
|
+
exportedNames(module: ModuleConfig): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Opens a scope in the module that declares a job, as the worker does for each attempt.
|
|
16
|
+
* Returns undefined for jobs that no module declares.
|
|
17
|
+
*/
|
|
18
|
+
jobServices(jobName: string): JobServicesScope | undefined;
|
|
11
19
|
/** A container view exposes only local providers and direct imports' exports. */
|
|
12
20
|
forModule(module: ModuleConfig, container?: AwilixContainer<{}>): AwilixContainer;
|
|
13
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-runtime.d.ts","sourceRoot":"","sources":["../../src/core/module-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAMrB,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"module-runtime.d.ts","sourceRoot":"","sources":["../../src/core/module-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAMrB,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,uFAAuF;AACvF,qBAAa,aAAa;;IAUtB,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE;IATlC,QAAQ,CAAC,SAAS,sBAAyE;IAC3F,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAM;IAOvC,YACW,OAAO,EAAE,YAAY,EAAE,EAChC,MAAM,EAAE,MAAM,EAsBf;IAgGD,wEAAwE;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAE5C;IA8CD;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAQzD;IAED,iFAAiF;IACjF,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,sBAAiB,GAAG,eAAe,CAM3E;CA6EF"}
|