@cqrs-ddd/pipeline 0.5.2 → 0.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/dist/create-pipeline.d.ts +3 -5
- package/dist/create-pipeline.d.ts.map +1 -1
- package/dist/create-pipeline.js +13 -51
- package/dist/create-pipeline.js.map +1 -1
- package/dist/helpers/postgres-table.d.ts +21 -0
- package/dist/helpers/postgres-table.d.ts.map +1 -0
- package/dist/helpers/postgres-table.js +30 -0
- package/dist/helpers/postgres-table.js.map +1 -0
- package/dist/helpers/principal-partition.d.ts +16 -0
- package/dist/helpers/principal-partition.d.ts.map +1 -0
- package/dist/helpers/principal-partition.js +22 -0
- package/dist/helpers/principal-partition.js.map +1 -0
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/http-response.interface.d.ts +10 -0
- package/dist/interfaces/http-response.interface.d.ts.map +1 -0
- package/dist/interfaces/http-response.interface.js +3 -0
- package/dist/interfaces/http-response.interface.js.map +1 -0
- package/dist/interfaces/pipeline-behavior-contract.interface.d.ts +19 -2
- package/dist/interfaces/pipeline-behavior-contract.interface.d.ts.map +1 -1
- package/dist/interfaces/pipeline-behavior-contract.interface.js +19 -0
- package/dist/interfaces/pipeline-behavior-contract.interface.js.map +1 -1
- package/dist/interfaces/pipeline-handler-meta.interface.d.ts +2 -2
- package/dist/interfaces/pipeline-handler-meta.interface.d.ts.map +1 -1
- package/dist/interfaces/pipeline.context.interface.d.ts +2 -2
- package/dist/interfaces/pipeline.context.interface.d.ts.map +1 -1
- package/dist/interfaces/postgres-queryable.interface.d.ts +12 -0
- package/dist/interfaces/postgres-queryable.interface.d.ts.map +1 -0
- package/dist/interfaces/postgres-queryable.interface.js +3 -0
- package/dist/interfaces/postgres-queryable.interface.js.map +1 -0
- package/dist/pipeline.context.d.ts +3 -3
- package/dist/pipeline.context.d.ts.map +1 -1
- package/dist/pipeline.context.js.map +1 -1
- package/dist/services/pipeline-contracts.d.ts +2 -2
- package/dist/services/pipeline-contracts.d.ts.map +1 -1
- package/dist/services/pipeline-plan.d.ts +1 -3
- package/dist/services/pipeline-plan.d.ts.map +1 -1
- package/dist/services/pipeline-plan.js.map +1 -1
- package/dist/services/pipeline-setup.d.ts +106 -0
- package/dist/services/pipeline-setup.d.ts.map +1 -0
- package/dist/services/pipeline-setup.js +154 -0
- package/dist/services/pipeline-setup.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -3,10 +3,8 @@ import type { ContextSources } from './interfaces/context-source.interface.js';
|
|
|
3
3
|
import type { IPipelineBehavior } from './interfaces/pipeline.behavior.interface.js';
|
|
4
4
|
import type { PipelineLogger } from './logger.js';
|
|
5
5
|
import type { GlobalBehaviorsOptions } from './options/global-behaviors.options.js';
|
|
6
|
-
import { type
|
|
7
|
-
import type { Constructor } from './types.js';
|
|
8
|
-
/** The kinds a wrapped function or a request declares. */
|
|
9
|
-
export type DeclaredKind = Exclude<RequestKind, 'unknown'>;
|
|
6
|
+
import { type DiagnosticsMode } from './services/pipeline-setup.js';
|
|
7
|
+
import type { Constructor, DeclaredKind } from './types.js';
|
|
10
8
|
/**
|
|
11
9
|
* Brand by which a request tells a pipeline its kind, so a wrapped method needs no
|
|
12
10
|
* `kind` option; the request's class name then names the operation. `@cqrs-ddd/core`
|
|
@@ -44,7 +42,7 @@ export interface PipelineOptions {
|
|
|
44
42
|
* (`'off'`).
|
|
45
43
|
* @default 'strict'
|
|
46
44
|
*/
|
|
47
|
-
diagnostics?:
|
|
45
|
+
diagnostics?: DiagnosticsMode;
|
|
48
46
|
/**
|
|
49
47
|
* Receives the `'warn'` diagnostics, and is the logger of a `LoggingBehavior` the pipeline
|
|
50
48
|
* constructs itself (one placed without an instance in `behaviors`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-pipeline.d.ts","sourceRoot":"","sources":["../src/create-pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-pipeline.d.ts","sourceRoot":"","sources":["../src/create-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAErF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAMpF,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI5D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,eAAuC,CAAC;AAEjE,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACzC;;;;OAIG;IACH,eAAe,CAAC,EAAE,sBAAsB,GAAG,sBAAsB,EAAE,CAAC;IACpE,kEAAkE;IAClE,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;;;;OAIG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,mDAAmD;IACnD,IAAI,CAAC,EAAE,SAAS,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;CAClD;AAGD,KAAK,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,IAAI;IACnB,CAAC,CAAC,SAAS,WAAW,EACpB,EAAE,EAAE,CAAC,GACJ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,2BAA2B,GAAG,CAAC,CAAC;IAC5E,CACE,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,UAAU,EAAE,kBAAkB,GAC7B,kBAAkB,CAAC;CACvB;AAED,yDAAyD;AACzD,MAAM,WAAW,QAAQ;IACvB;;;;;;;OAOG;IACH,IAAI,CAAC,GAAG,OAAO,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC;CACvE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAyBtE"}
|
package/dist/create-pipeline.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { getBehaviorId } from './helpers/behavior-id.js';
|
|
5
|
-
import { PipelineConfigurationError, } from './interfaces/pipeline-behavior-contract.interface.js';
|
|
6
|
-
import { validateBehaviorContracts } from './services/pipeline-contracts.js';
|
|
7
|
-
import { compilePipelinePlan, toGlobalConfigs, } from './services/pipeline-plan.js';
|
|
2
|
+
import { normalizeBehaviorEntries } from './helpers/behavior-entries.js';
|
|
3
|
+
import { compilePipelinePlan } from './services/pipeline-plan.js';
|
|
8
4
|
import { createPipelineRunner, } from './services/pipeline-runner.js';
|
|
5
|
+
import { behaviorOptionsOf, createBehaviorResolver, reportDiagnostics, validatePlan, } from './services/pipeline-setup.js';
|
|
9
6
|
const KINDS = ['command', 'query', 'event'];
|
|
10
7
|
/**
|
|
11
8
|
* Brand by which a request tells a pipeline its kind, so a wrapped method needs no
|
|
@@ -56,40 +53,18 @@ export function createPipeline(options = {}) {
|
|
|
56
53
|
sources,
|
|
57
54
|
diagnostics,
|
|
58
55
|
logger,
|
|
59
|
-
|
|
56
|
+
behavior: createBehaviorResolver({
|
|
57
|
+
owner: 'createPipeline',
|
|
58
|
+
given: options.behaviors ?? [],
|
|
59
|
+
globalBehaviors,
|
|
60
|
+
logger,
|
|
61
|
+
}),
|
|
60
62
|
};
|
|
61
|
-
for (const config of toGlobalConfigs(globalBehaviors)) {
|
|
62
|
-
for (const entry of [...(config.before ?? []), ...(config.after ?? [])]) {
|
|
63
|
-
instanceOf(setup, behaviorEntryType(entry, 'createPipeline globalBehaviors'));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
63
|
function wrap(...input) {
|
|
67
64
|
return wrapperOf(toDeclaration(setup, input));
|
|
68
65
|
}
|
|
69
66
|
return { wrap };
|
|
70
67
|
}
|
|
71
|
-
function indexBehaviors(behaviors) {
|
|
72
|
-
const instances = new Map();
|
|
73
|
-
for (const behavior of behaviors) {
|
|
74
|
-
const type = behavior.constructor;
|
|
75
|
-
const id = getBehaviorId(type);
|
|
76
|
-
if (instances.has(id)) {
|
|
77
|
-
throw new TypeError(`createPipeline: two instances of ${type.name}; pass one per behavior class.`);
|
|
78
|
-
}
|
|
79
|
-
instances.set(id, behavior);
|
|
80
|
-
}
|
|
81
|
-
return instances;
|
|
82
|
-
}
|
|
83
|
-
function instanceOf(setup, type) {
|
|
84
|
-
const id = getBehaviorId(type);
|
|
85
|
-
let instance = setup.instances.get(id);
|
|
86
|
-
if (!instance) {
|
|
87
|
-
instance =
|
|
88
|
-
id === LOGGING_ID ? new LoggingBehavior(setup.logger) : new type();
|
|
89
|
-
setup.instances.set(id, instance);
|
|
90
|
-
}
|
|
91
|
-
return instance;
|
|
92
|
-
}
|
|
93
68
|
function toDeclaration(setup, input) {
|
|
94
69
|
const [first] = input;
|
|
95
70
|
const hasOptions = typeof first === 'object' && first !== null && !Array.isArray(first);
|
|
@@ -156,7 +131,7 @@ function bind(declaration, fn, methodKey) {
|
|
|
156
131
|
function createRunner(operation, kind) {
|
|
157
132
|
const { setup, options, fn, label, handlerType } = operation;
|
|
158
133
|
const { plan, behaviors } = compile(operation, kind);
|
|
159
|
-
const behaviorOptions = plan
|
|
134
|
+
const behaviorOptions = behaviorOptionsOf(plan);
|
|
160
135
|
return createPipelineRunner(fn, (request, self) => {
|
|
161
136
|
const handlerName = options.name ?? `${ownerName(self)}.${label}`;
|
|
162
137
|
return {
|
|
@@ -181,27 +156,14 @@ function compile(operation, requestKind) {
|
|
|
181
156
|
: undefined,
|
|
182
157
|
globalBehaviors: setup.globalBehaviors,
|
|
183
158
|
});
|
|
184
|
-
const behaviors = plan.behaviorTypes.map(
|
|
159
|
+
const behaviors = plan.behaviorTypes.map(setup.behavior);
|
|
185
160
|
if (setup.diagnostics !== 'off') {
|
|
186
161
|
const found = [];
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
handlerType: Object,
|
|
190
|
-
handlerName,
|
|
191
|
-
requestKind,
|
|
192
|
-
resolvedBehaviors: new Map(behaviors.map((b, i) => [i, b])),
|
|
193
|
-
diagnostics: found,
|
|
194
|
-
});
|
|
195
|
-
if (found.length > 0 && setup.diagnostics === 'strict') {
|
|
196
|
-
throw new PipelineConfigurationError(found);
|
|
197
|
-
}
|
|
198
|
-
for (const d of found) {
|
|
199
|
-
setup.logger.warn(`[Pipeline Diagnostic] '${d.handlerName}' with behavior '${d.behaviorName}': ${d.message}. Fix: ${d.fix}`);
|
|
200
|
-
}
|
|
162
|
+
validatePlan(plan, { handlerType: Object, handlerName, kind: requestKind }, behaviors, found);
|
|
163
|
+
reportDiagnostics(found, setup.diagnostics, setup.logger);
|
|
201
164
|
}
|
|
202
165
|
return { plan, behaviors };
|
|
203
166
|
}
|
|
204
|
-
const LOGGING_ID = getBehaviorId(LoggingBehavior);
|
|
205
167
|
function brandOf(request) {
|
|
206
168
|
if (typeof request !== 'object' || request === null)
|
|
207
169
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-pipeline.js","sourceRoot":"","sources":["../src/create-pipeline.ts"],"names":[],"mappings":"AAAA,sEAAsE;
|
|
1
|
+
{"version":3,"file":"create-pipeline.js","sourceRoot":"","sources":["../src/create-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refuses a table name that is not safe to interpolate into SQL text.
|
|
3
|
+
*
|
|
4
|
+
* A table name cannot be a query parameter, so a Postgres store writes it into
|
|
5
|
+
* the statement. Only `table` or `schema.table` made of unquoted identifiers
|
|
6
|
+
* (letters, digits and `_`, not starting with a digit) passes.
|
|
7
|
+
*
|
|
8
|
+
* @param table - Table name from the store options, optionally schema-qualified.
|
|
9
|
+
* @param purpose - What the table holds, for the error message (e.g. `'audit'`).
|
|
10
|
+
* @param example - A valid table name for the error message (e.g. `'audit_log'`).
|
|
11
|
+
* @returns `table`, unchanged.
|
|
12
|
+
* @throws Error when `table` is not a safe identifier.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* assertSafeTable('audit.audit_log', 'audit', 'audit_log'); // 'audit.audit_log'
|
|
17
|
+
* assertSafeTable('x; DROP TABLE y', 'audit', 'audit_log'); // throws
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function assertSafeTable(table: string, purpose: string, example: string): string;
|
|
21
|
+
//# sourceMappingURL=postgres-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-table.d.ts","sourceRoot":"","sources":["../../src/helpers/postgres-table.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,MAAM,CAQR"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
2
|
+
/** Allows `table` or `schema.table` made of unquoted SQL identifiers only. */
|
|
3
|
+
const SAFE_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$/;
|
|
4
|
+
/**
|
|
5
|
+
* Refuses a table name that is not safe to interpolate into SQL text.
|
|
6
|
+
*
|
|
7
|
+
* A table name cannot be a query parameter, so a Postgres store writes it into
|
|
8
|
+
* the statement. Only `table` or `schema.table` made of unquoted identifiers
|
|
9
|
+
* (letters, digits and `_`, not starting with a digit) passes.
|
|
10
|
+
*
|
|
11
|
+
* @param table - Table name from the store options, optionally schema-qualified.
|
|
12
|
+
* @param purpose - What the table holds, for the error message (e.g. `'audit'`).
|
|
13
|
+
* @param example - A valid table name for the error message (e.g. `'audit_log'`).
|
|
14
|
+
* @returns `table`, unchanged.
|
|
15
|
+
* @throws Error when `table` is not a safe identifier.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* assertSafeTable('audit.audit_log', 'audit', 'audit_log'); // 'audit.audit_log'
|
|
20
|
+
* assertSafeTable('x; DROP TABLE y', 'audit', 'audit_log'); // throws
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function assertSafeTable(table, purpose, example) {
|
|
24
|
+
if (!SAFE_IDENTIFIER.test(table)) {
|
|
25
|
+
throw new Error(`Invalid ${purpose} table name "${table}". ` +
|
|
26
|
+
`Use an unquoted identifier like "${example}" or "schema.${example}".`);
|
|
27
|
+
}
|
|
28
|
+
return table;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=postgres-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-table.js","sourceRoot":"","sources":["../../src/helpers/postgres-table.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,8EAA8E;AAC9E,MAAM,eAAe,GAAG,qDAAqD,CAAC;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAa,EACb,OAAe,EACf,OAAe;IAEf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,WAAW,OAAO,gBAAgB,KAAK,KAAK;YAC1C,oCAAoC,OAAO,gBAAgB,OAAO,IAAI,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The principal segments of a partitioned key: each value trimmed, or `undefined`
|
|
3
|
+
* when the principal is absent or one of its parts is empty. The caller decides
|
|
4
|
+
* what an absent principal means: an error, a skipped key or a shared bucket.
|
|
5
|
+
*
|
|
6
|
+
* @param value - The caller's identifier, or its parts, such as `[type, id]`.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* principalSegments(' u-1 '); // ['u-1']
|
|
11
|
+
* principalSegments(['user', 'u-1']); // ['user', 'u-1']
|
|
12
|
+
* principalSegments(['user', '']); // undefined
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function principalSegments(value: string | readonly string[] | undefined | null): string[] | undefined;
|
|
16
|
+
//# sourceMappingURL=principal-partition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principal-partition.d.ts","sourceRoot":"","sources":["../../src/helpers/principal-partition.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GACnD,MAAM,EAAE,GAAG,SAAS,CAOtB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
2
|
+
/**
|
|
3
|
+
* The principal segments of a partitioned key: each value trimmed, or `undefined`
|
|
4
|
+
* when the principal is absent or one of its parts is empty. The caller decides
|
|
5
|
+
* what an absent principal means: an error, a skipped key or a shared bucket.
|
|
6
|
+
*
|
|
7
|
+
* @param value - The caller's identifier, or its parts, such as `[type, id]`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* principalSegments(' u-1 '); // ['u-1']
|
|
12
|
+
* principalSegments(['user', 'u-1']); // ['user', 'u-1']
|
|
13
|
+
* principalSegments(['user', '']); // undefined
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export function principalSegments(value) {
|
|
17
|
+
const segments = (typeof value === 'string' ? [value] : (value ?? [])).map((segment) => (typeof segment === 'string' ? segment.trim() : ''));
|
|
18
|
+
return segments.length > 0 && segments.every((segment) => segment !== '')
|
|
19
|
+
? segments
|
|
20
|
+
: undefined;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=principal-partition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principal-partition.js","sourceRoot":"","sources":["../../src/helpers/principal-partition.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAoD;IAEpD,MAAM,QAAQ,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CACxE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACjE,CAAC;IACF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC;QACvE,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './behaviors/logging.behavior.js';
|
|
2
2
|
export { pipelineStore, SET_REQUEST, SET_TENANT_ID, } from './constants/pipeline-context.constants.js';
|
|
3
|
-
export { createPipeline, type
|
|
3
|
+
export { createPipeline, type Pipeline, type PipelineOptions, REQUEST_KIND, type Wrap, type WrapOptions, } from './create-pipeline.js';
|
|
4
4
|
export type { PipelineBehaviorEntry, PipelineBehaviorTuple, } from './entries.js';
|
|
5
5
|
export { MissingPartitionError } from './errors/missing-partition.error.js';
|
|
6
6
|
export * from './errors/missing-pipeline-item.error.js';
|
|
@@ -9,19 +9,24 @@ export { type BehaviorEntryAccumulators, behaviorEntryType, normalizeBehaviorEnt
|
|
|
9
9
|
export { type BehaviorId, getBehaviorId, PIPELINE_BEHAVIOR_ID, } from './helpers/behavior-id.js';
|
|
10
10
|
export { type LoggingIntentOptions, logging, } from './helpers/logging.intent.js';
|
|
11
11
|
export { toPostgresJson } from './helpers/postgres-json.js';
|
|
12
|
+
export { assertSafeTable } from './helpers/postgres-table.js';
|
|
13
|
+
export { principalSegments } from './helpers/principal-partition.js';
|
|
12
14
|
export { replaceRequest } from './helpers/replace-request.js';
|
|
13
15
|
export { type TenantPartitionOptions, tenantSegments, } from './helpers/tenant-partition.js';
|
|
14
16
|
export type { ContextSource, ContextSources, CorrelationSource, } from './interfaces/context-source.interface.js';
|
|
17
|
+
export type { HttpResponse } from './interfaces/http-response.interface.js';
|
|
15
18
|
export * from './interfaces/pipeline.behavior.interface.js';
|
|
16
19
|
export * from './interfaces/pipeline.context.interface.js';
|
|
17
20
|
export * from './interfaces/pipeline-behavior-contract.interface.js';
|
|
18
21
|
export * from './interfaces/pipeline-handler-meta.interface.js';
|
|
22
|
+
export type { PostgresQueryableLike } from './interfaces/postgres-queryable.interface.js';
|
|
19
23
|
export { type LogLevel, type PinoLike, type PipelineLogger, pinoLogger, } from './logger.js';
|
|
20
24
|
export type { GlobalBehaviorScope, GlobalBehaviorsOptions, } from './options/global-behaviors.options.js';
|
|
21
25
|
export * from './pipeline.context.js';
|
|
22
26
|
export * from './pipeline-items.js';
|
|
23
27
|
export { validateBehaviorContracts } from './services/pipeline-contracts.js';
|
|
24
|
-
export { compilePipelinePlan, type PipelineDeclaration,
|
|
28
|
+
export { compilePipelinePlan, type PipelineDeclaration, toGlobalConfigs, } from './services/pipeline-plan.js';
|
|
25
29
|
export { createPipelineRunner, type PipelineRunner, } from './services/pipeline-runner.js';
|
|
26
|
-
export type
|
|
30
|
+
export { type BehaviorResolver, compileHandlerPlan, createBehaviorResolver, createHandlerRunner, type DiagnosticsMode, type PipelinePlan, reportDiagnostics, } from './services/pipeline-setup.js';
|
|
31
|
+
export type { Constructor, DeclaredKind, RequestKind } from './types.js';
|
|
27
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,iCAAiC,CAAC;AAChD,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,cAAc,EACd,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,iCAAiC,CAAC;AAChD,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,YAAY,EACZ,KAAK,IAAI,EACT,KAAK,WAAW,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,cAAc,yCAAyC,CAAC;AACxD,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,yBAAyB,EAC9B,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,UAAU,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,oBAAoB,EACzB,OAAO,GACR,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EACL,KAAK,sBAAsB,EAC3B,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAC5E,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,sDAAsD,CAAC;AACrE,cAAc,iDAAiD,CAAC;AAChE,YAAY,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,uCAAuC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EACL,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,GACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,8 @@ export { behaviorEntryType, normalizeBehaviorEntries, } from './helpers/behavior
|
|
|
9
9
|
export { getBehaviorId, PIPELINE_BEHAVIOR_ID, } from './helpers/behavior-id.js';
|
|
10
10
|
export { logging, } from './helpers/logging.intent.js';
|
|
11
11
|
export { toPostgresJson } from './helpers/postgres-json.js';
|
|
12
|
+
export { assertSafeTable } from './helpers/postgres-table.js';
|
|
13
|
+
export { principalSegments } from './helpers/principal-partition.js';
|
|
12
14
|
export { replaceRequest } from './helpers/replace-request.js';
|
|
13
15
|
export { tenantSegments, } from './helpers/tenant-partition.js';
|
|
14
16
|
export * from './interfaces/pipeline.behavior.interface.js';
|
|
@@ -21,4 +23,5 @@ export * from './pipeline-items.js';
|
|
|
21
23
|
export { validateBehaviorContracts } from './services/pipeline-contracts.js';
|
|
22
24
|
export { compilePipelinePlan, toGlobalConfigs, } from './services/pipeline-plan.js';
|
|
23
25
|
export { createPipelineRunner, } from './services/pipeline-runner.js';
|
|
26
|
+
export { compileHandlerPlan, createBehaviorResolver, createHandlerRunner, reportDiagnostics, } from './services/pipeline-setup.js';
|
|
24
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,cAAc,iCAAiC,CAAC;AAChD,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,cAAc,iCAAiC,CAAC;AAChD,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,cAAc,EAGd,YAAY,GAGb,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,cAAc,yCAAyC,CAAC;AACxD,OAAO,EAIL,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,aAAa,EACb,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,OAAO,GACR,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAEL,cAAc,GACf,MAAM,+BAA+B,CAAC;AAOvC,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,sDAAsD,CAAC;AACrE,cAAc,iDAAiD,CAAC;AAEhE,OAAO,EAIL,UAAU,GACX,MAAM,aAAa,CAAC;AAKrB,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EACL,mBAAmB,EAEnB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EAGnB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An HTTP answer for an error: status, JSON body and headers. The `http` entry point of
|
|
3
|
+
* each pipeline package returns it from `toHttpResponse`; no package sends it.
|
|
4
|
+
*/
|
|
5
|
+
export interface HttpResponse {
|
|
6
|
+
status: number;
|
|
7
|
+
body: Record<string, unknown>;
|
|
8
|
+
headers: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=http-response.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-response.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/http-response.interface.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-response.interface.js","sourceRoot":"","sources":["../../src/interfaces/http-response.interface.ts"],"names":[],"mappings":"AAAA,sEAAsE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Constructor } from '../types.js';
|
|
1
|
+
import type { Constructor, DeclaredKind } from '../types.js';
|
|
2
2
|
import type { IPipelineBehavior } from './pipeline.behavior.interface.js';
|
|
3
3
|
/**
|
|
4
4
|
* Well-known symbol for declaring an optional {@link IPipelineBehaviorContract}
|
|
@@ -15,7 +15,7 @@ export interface PipelineBehaviorValidationContext {
|
|
|
15
15
|
/** The name of the CQRS handler. */
|
|
16
16
|
handlerName: string;
|
|
17
17
|
/** The request kind of the handler ('command' | 'query' | 'event'). */
|
|
18
|
-
requestKind:
|
|
18
|
+
requestKind: DeclaredKind;
|
|
19
19
|
/**
|
|
20
20
|
* Source where this behavior was declared for the current handler:
|
|
21
21
|
* - `'handler'`: declared at the call site, such as `pipeline.wrap(options, ...entries)`.
|
|
@@ -47,6 +47,23 @@ export interface PipelineBehaviorDiagnostic {
|
|
|
47
47
|
/** Concrete remediation recommendation to resolve the issue. */
|
|
48
48
|
fix: string;
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* The one diagnostic a contract validator returns for a violation, named after the
|
|
52
|
+
* handler under validation.
|
|
53
|
+
*
|
|
54
|
+
* @param behaviorName - The behavior that reports it, such as `CacheBehavior.name`.
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* validate: (context) =>
|
|
58
|
+
* context.effectiveOptions?.key
|
|
59
|
+
* ? undefined
|
|
60
|
+
* : behaviorDiagnostic(context, CacheBehavior.name, {
|
|
61
|
+
* message: 'Active CacheBehavior requires an explicit `key` factory',
|
|
62
|
+
* fix: 'Provide a key factory in the cache({ key }) entry.',
|
|
63
|
+
* }),
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function behaviorDiagnostic(context: Pick<PipelineBehaviorValidationContext, 'handlerName'>, behaviorName: string, violation: Pick<PipelineBehaviorDiagnostic, 'message' | 'fix'>): PipelineBehaviorDiagnostic[];
|
|
50
67
|
/**
|
|
51
68
|
* Static ordering constraints relative to other pipeline behaviors.
|
|
52
69
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-behavior-contract.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/pipeline-behavior-contract.interface.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline-behavior-contract.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/pipeline-behavior-contract.interface.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,0BAA0B,eAEtC,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,iCAAiC;IAChD,8BAA8B;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,WAAW,EAAE,YAAY,CAAC;IAC1B;;;;;OAKG;IACH,iBAAiB,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjD,kGAAkG;IAClG,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACtD,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACpD,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACnD,mFAAmF;IACnF,sBAAsB,EAAE,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACtE,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,IAAI,CAAC,iCAAiC,EAAE,aAAa,CAAC,EAC/D,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,IAAI,CAAC,0BAA0B,EAAE,SAAS,GAAG,KAAK,CAAC,GAC7D,0BAA0B,EAAE,CAE9B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,yBAAyB;IACxC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,CAAC;IACxD,8EAA8E;IAC9E,KAAK,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,yBAAyB,GACzB,CAAC,CACC,OAAO,EAAE,iCAAiC,KACvC,yBAAyB,GAAG,SAAS,CAAC,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CACT,OAAO,EAAE,iCAAiC,KACvC,0BAA0B,EAAE,GAAG,SAAS,CAAC;CAC/C;AAED;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;aAEjC,WAAW,EAAE,SAAS,0BAA0B,EAAE;IADpE,YACkB,WAAW,EAAE,SAAS,0BAA0B,EAAE,EAYnE;CACF"}
|
|
@@ -4,6 +4,25 @@
|
|
|
4
4
|
* on a pipeline behavior class.
|
|
5
5
|
*/
|
|
6
6
|
export const PIPELINE_BEHAVIOR_CONTRACT = Symbol.for('@cqrs-ddd/pipeline:behavior-contract');
|
|
7
|
+
/**
|
|
8
|
+
* The one diagnostic a contract validator returns for a violation, named after the
|
|
9
|
+
* handler under validation.
|
|
10
|
+
*
|
|
11
|
+
* @param behaviorName - The behavior that reports it, such as `CacheBehavior.name`.
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* validate: (context) =>
|
|
15
|
+
* context.effectiveOptions?.key
|
|
16
|
+
* ? undefined
|
|
17
|
+
* : behaviorDiagnostic(context, CacheBehavior.name, {
|
|
18
|
+
* message: 'Active CacheBehavior requires an explicit `key` factory',
|
|
19
|
+
* fix: 'Provide a key factory in the cache({ key }) entry.',
|
|
20
|
+
* }),
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function behaviorDiagnostic(context, behaviorName, violation) {
|
|
24
|
+
return [{ handlerName: context.handlerName, behaviorName, ...violation }];
|
|
25
|
+
}
|
|
7
26
|
/**
|
|
8
27
|
* Thrown when a function is wrapped, or when an adapter starts, if deterministic
|
|
9
28
|
* pipeline policy misconfigurations or ordering violations are detected.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-behavior-contract.interface.js","sourceRoot":"","sources":["../../src/interfaces/pipeline-behavior-contract.interface.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAKtE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,GAAG,CAClD,sCAAsC,CACvC,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline-behavior-contract.interface.js","sourceRoot":"","sources":["../../src/interfaces/pipeline-behavior-contract.interface.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAKtE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,GAAG,CAClD,sCAAsC,CACvC,CAAC;AA8CF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA+D,EAC/D,YAAoB,EACpB,SAA8D;IAE9D,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;AAC5E,CAAC;AAoDD;;;GAGG;AACH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAEjC,WAAW;IAD7B,YACkB,WAAkD;QAElE,MAAM,SAAS,GAAG,WAAW;aAC1B,GAAG,CACF,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CACT,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,OAAO,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,GAAG,EAAE,CACtF;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,KAAK,CACH,uCAAuC,WAAW,CAAC,MAAM,eAAe,SAAS,EAAE,CACpF,CAAC;2BAVc,WAAW;QAW3B,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BehaviorId } from '../helpers/behavior-id.js';
|
|
2
|
-
import type { Constructor } from '../types.js';
|
|
2
|
+
import type { Constructor, RequestKind } from '../types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Pre-computed handler metadata, resolved once, before the first execution.
|
|
5
5
|
* Avoids per-request reflection and string operations.
|
|
@@ -7,7 +7,7 @@ import type { Constructor } from '../types.js';
|
|
|
7
7
|
export interface PipelineHandlerMeta {
|
|
8
8
|
readonly handlerType: Constructor;
|
|
9
9
|
readonly handlerName: string;
|
|
10
|
-
readonly requestKind:
|
|
10
|
+
readonly requestKind: RequestKind;
|
|
11
11
|
readonly behaviorOptions?: Map<BehaviorId, Record<string, unknown>>;
|
|
12
12
|
/** The operation name; absent, the request's class name. */
|
|
13
13
|
readonly requestName?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-handler-meta.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/pipeline-handler-meta.interface.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline-handler-meta.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/pipeline-handler-meta.interface.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpE,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Constructor } from '../types.js';
|
|
1
|
+
import type { Constructor, RequestKind } from '../types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Rich context available to every pipeline behavior during execution.
|
|
4
4
|
*
|
|
@@ -33,7 +33,7 @@ export interface IPipelineContext<TRequest = unknown, TResponse = unknown> {
|
|
|
33
33
|
/** The handler class name string, e.g. "CreateUserHandler". */
|
|
34
34
|
readonly handlerName: string;
|
|
35
35
|
/** 'command', 'query', or 'event': declared when wrapping, or read from the request's brand. */
|
|
36
|
-
readonly requestKind:
|
|
36
|
+
readonly requestKind: RequestKind;
|
|
37
37
|
/** UTC timestamp when the pipeline execution started. */
|
|
38
38
|
readonly startedAt: Date;
|
|
39
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.context.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/pipeline.context.interface.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.context.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/pipeline.context.interface.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB,CAAC,QAAQ,GAAG,OAAO,EAAE,SAAS,GAAG,OAAO;IACvE;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAE3B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE5C,uDAAuD;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,gGAAgG;IAChG,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IAEzB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC;IAEzC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C;;;;;OAKG;IACH,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,YAAY,EAAE,WAAW,GACxB,CAAC,GAAG,SAAS,CAAC;CAClB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal structural shape of a `pg` `Pool` / `Client`. Declared here so no
|
|
3
|
+
* package hard-depends on `pg` — a real `Pool` or `Client` satisfies it.
|
|
4
|
+
* Add it in your app: `pnpm add pg`.
|
|
5
|
+
*
|
|
6
|
+
* `TResult` is the part of the query result the caller reads; the default
|
|
7
|
+
* `unknown` suits a caller that only writes.
|
|
8
|
+
*/
|
|
9
|
+
export interface PostgresQueryableLike<TResult = unknown> {
|
|
10
|
+
query(text: string, values?: unknown[]): Promise<TResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=postgres-queryable.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-queryable.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/postgres-queryable.interface.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB,CAAC,OAAO,GAAG,OAAO;IACtD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-queryable.interface.js","sourceRoot":"","sources":["../../src/interfaces/postgres-queryable.interface.ts"],"names":[],"mappings":"AAAA,sEAAsE"}
|
|
@@ -2,7 +2,7 @@ import { SET_CORRELATION_ID, SET_REQUEST, SET_RESPONSE, SET_TENANT_ID } from './
|
|
|
2
2
|
import { type BehaviorId } from './helpers/behavior-id.js';
|
|
3
3
|
import { IPipelineContext } from './interfaces/pipeline.context.interface.js';
|
|
4
4
|
import { PipelineHandlerMeta } from './interfaces/pipeline-handler-meta.interface.js';
|
|
5
|
-
import type { Constructor } from './types.js';
|
|
5
|
+
import type { Constructor, RequestKind } from './types.js';
|
|
6
6
|
/**
|
|
7
7
|
* Abstract base class with shared implementation for all pipeline contexts.
|
|
8
8
|
*
|
|
@@ -36,7 +36,7 @@ export declare abstract class BasePipelineContext<TRequest = unknown, TResponse
|
|
|
36
36
|
abstract readonly requestName: string;
|
|
37
37
|
abstract readonly handlerType: Constructor;
|
|
38
38
|
abstract readonly handlerName: string;
|
|
39
|
-
abstract readonly requestKind:
|
|
39
|
+
abstract readonly requestKind: RequestKind;
|
|
40
40
|
readonly startedAt: Date;
|
|
41
41
|
/**
|
|
42
42
|
* Bag for sharing arbitrary data between behaviors in the same execution.
|
|
@@ -74,7 +74,7 @@ export declare class PipelineContext<TRequest = unknown, TResponse = unknown> ex
|
|
|
74
74
|
readonly requestName: string;
|
|
75
75
|
readonly handlerType: Constructor;
|
|
76
76
|
readonly handlerName: string;
|
|
77
|
-
readonly requestKind:
|
|
77
|
+
readonly requestKind: RequestKind;
|
|
78
78
|
protected readonly behaviorOptionsMap: Map<BehaviorId, Record<string, unknown>> | undefined;
|
|
79
79
|
private _request;
|
|
80
80
|
/** The input of this execution, or the replacement a behavior handed in. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.context.d.ts","sourceRoot":"","sources":["../src/pipeline.context.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,aAAa,EACd,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.context.d.ts","sourceRoot":"","sources":["../src/pipeline.context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.context.js","sourceRoot":"","sources":["../src/pipeline.context.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,aAAa,GACd,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAmB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAM1E;;;;;;;;;;GAUG;AACH,MAAM,OAAgB,mBAAmB;IAK/B,cAAc,GAAG,EAAE,CAAC;IAE5B,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,iEAAiE;IACjE,CAAC,kBAAkB,CAAC,CAAC,KAAa;QAChC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAEO,SAAS,GAAuB,SAAS,CAAC;IAElD;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACH,CAAC,aAAa,CAAC,CAAC,KAAyB;QACvC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IASQ,SAAS,CAAO;IACzB;;;OAGG;IACM,KAAK,CAAgC;IAE9C,2EAA2E;IACnE,SAAS,GAA0B,SAAS,CAAC;IAErD,2DAA2D;IAC3D,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,CAAC,YAAY,CAAC,CAAC,KAA4B;QACzC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAUD;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAChB,YAAyB;QAEzB,OAAO,IAAI,CAAC,kBAAkB,EAAE,GAAG,CACjC,aAAa,CAAC,YAA8C,CAAC,CAC7C,CAAC;IACrB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,eAGX,SAAQ,mBAAwC;IACvC,WAAW,CAAwB;IACnC,WAAW,CAAS;IACpB,WAAW,CAAc;IACzB,WAAW,CAAS;IACpB,WAAW,
|
|
1
|
+
{"version":3,"file":"pipeline.context.js","sourceRoot":"","sources":["../src/pipeline.context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type BehaviorId } from '../helpers/behavior-id.js';
|
|
2
2
|
import type { IPipelineBehavior } from '../interfaces/pipeline.behavior.interface.js';
|
|
3
3
|
import { type PipelineBehaviorDiagnostic } from '../interfaces/pipeline-behavior-contract.interface.js';
|
|
4
|
-
import type { Constructor } from '../types.js';
|
|
4
|
+
import type { Constructor, DeclaredKind } from '../types.js';
|
|
5
5
|
/**
|
|
6
6
|
* Validates the ordering rules and option contracts that behavior classes declare
|
|
7
7
|
* through `PIPELINE_BEHAVIOR_CONTRACT`, appending a diagnostic per violation. Framework
|
|
@@ -16,7 +16,7 @@ import type { Constructor } from '../types.js';
|
|
|
16
16
|
export declare function validateBehaviorContracts(params: {
|
|
17
17
|
handlerType: Constructor;
|
|
18
18
|
handlerName: string;
|
|
19
|
-
requestKind:
|
|
19
|
+
requestKind: DeclaredKind;
|
|
20
20
|
behaviorTypes: Constructor<IPipelineBehavior>[];
|
|
21
21
|
resolvedBehaviors: Map<number, IPipelineBehavior>;
|
|
22
22
|
mergedOptions: Map<BehaviorId, Record<string, unknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-contracts.d.ts","sourceRoot":"","sources":["../../src/services/pipeline-contracts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAGL,KAAK,0BAA0B,EAGhC,MAAM,uDAAuD,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline-contracts.d.ts","sourceRoot":"","sources":["../../src/services/pipeline-contracts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAGL,KAAK,0BAA0B,EAGhC,MAAM,uDAAuD,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,YAAY,CAAC;IAC1B,aAAa,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAChD,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAClD,aAAa,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,cAAc,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,aAAa,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,oBAAoB,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACxD,iBAAiB,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACnC,WAAW,EAAE,0BAA0B,EAAE,CAAC;CAC3C,GAAG,IAAI,CA2BP"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { type BehaviorId } from '../helpers/behavior-id.js';
|
|
2
2
|
import type { IPipelineBehavior } from '../interfaces/pipeline.behavior.interface.js';
|
|
3
3
|
import type { GlobalBehaviorsOptions } from '../options/global-behaviors.options.js';
|
|
4
|
-
import type { Constructor } from '../types.js';
|
|
5
|
-
/** The request kinds a pipeline distinguishes; `unknown` matches only `scope: 'all'`. */
|
|
6
|
-
export type RequestKind = 'command' | 'query' | 'event' | 'unknown';
|
|
4
|
+
import type { Constructor, RequestKind } from '../types.js';
|
|
7
5
|
/** What a handler, or a wrapped function, declares for its pipeline. */
|
|
8
6
|
export interface PipelineDeclaration {
|
|
9
7
|
/** Name used in configuration error messages. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-plan.d.ts","sourceRoot":"","sources":["../../src/services/pipeline-plan.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"pipeline-plan.d.ts","sourceRoot":"","sources":["../../src/services/pipeline-plan.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,iEAAiE;IACjE,oBAAoB,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACxD,8CAA8C;IAC9C,cAAc,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,gDAAgD;IAChD,oBAAoB,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACxD,eAAe,CAAC,EAAE,sBAAsB,GAAG,sBAAsB,EAAE,CAAC;CACrE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,mBAAmB;;;;;;;;EAmCnE;AA0FD,yEAAyE;AACzE,wBAAgB,eAAe,CAC7B,eAAe,EACX,sBAAsB,GACtB,sBAAsB,EAAE,GACxB,SAAS,GACZ,sBAAsB,EAAE,CAG1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-plan.js","sourceRoot":"","sources":["../../src/services/pipeline-plan.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAGtE,OAAO,EAEL,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAmB,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline-plan.js","sourceRoot":"","sources":["../../src/services/pipeline-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { type AnyClass } from '../handler-pipeline.js';
|
|
2
|
+
import { type BehaviorId } from '../helpers/behavior-id.js';
|
|
3
|
+
import type { ContextSources } from '../interfaces/context-source.interface.js';
|
|
4
|
+
import type { IPipelineBehavior } from '../interfaces/pipeline.behavior.interface.js';
|
|
5
|
+
import { type PipelineBehaviorDiagnostic } from '../interfaces/pipeline-behavior-contract.interface.js';
|
|
6
|
+
import type { PipelineLogger } from '../logger.js';
|
|
7
|
+
import type { GlobalBehaviorsOptions } from '../options/global-behaviors.options.js';
|
|
8
|
+
import type { Constructor, DeclaredKind } from '../types.js';
|
|
9
|
+
import { compilePipelinePlan } from './pipeline-plan.js';
|
|
10
|
+
import { type PipelineRunner } from './pipeline-runner.js';
|
|
11
|
+
/** The effective behaviors and options of one operation; see `compilePipelinePlan`. */
|
|
12
|
+
export type PipelinePlan = ReturnType<typeof compilePipelinePlan>;
|
|
13
|
+
/** What a behavior contract violation does: throw, log a warning, or nothing. */
|
|
14
|
+
export type DiagnosticsMode = 'strict' | 'warn' | 'off';
|
|
15
|
+
/** Returns the one instance of a behavior class. */
|
|
16
|
+
export type BehaviorResolver = (type: Constructor<IPipelineBehavior>) => IPipelineBehavior;
|
|
17
|
+
/**
|
|
18
|
+
* Builds the resolver of the one instance per behavior class: the instance given for
|
|
19
|
+
* that class, else `LoggingBehavior` on `logger`, else one built with no arguments. The
|
|
20
|
+
* global behaviors are built here, so one that cannot be built fails at once.
|
|
21
|
+
*
|
|
22
|
+
* @param options.owner - The factory named in error messages, such as `createPipeline`.
|
|
23
|
+
* @throws TypeError on a malformed global entry or two given instances of one class.
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const behavior = createBehaviorResolver({
|
|
27
|
+
* owner: 'createCqrs',
|
|
28
|
+
* given: [new AuditBehavior(sink)],
|
|
29
|
+
* globalBehaviors: { before: [LoggingBehavior] },
|
|
30
|
+
* logger: console,
|
|
31
|
+
* });
|
|
32
|
+
* behavior(AuditBehavior); // the given instance
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function createBehaviorResolver(options: {
|
|
36
|
+
owner: string;
|
|
37
|
+
given: readonly IPipelineBehavior[];
|
|
38
|
+
globalBehaviors: GlobalBehaviorsOptions | GlobalBehaviorsOptions[] | undefined;
|
|
39
|
+
logger: PipelineLogger;
|
|
40
|
+
}): BehaviorResolver;
|
|
41
|
+
/**
|
|
42
|
+
* Applies the diagnostics mode to the contract violations found: `'strict'` throws them
|
|
43
|
+
* together, `'warn'` logs each one, `'off'` does nothing.
|
|
44
|
+
*
|
|
45
|
+
* @throws PipelineConfigurationError in `'strict'` mode when `found` is not empty.
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const found: PipelineBehaviorDiagnostic[] = [];
|
|
49
|
+
* createHandlerRunner({ handlerType, kind, plan, method, behaviors, diagnostics: found });
|
|
50
|
+
* reportDiagnostics(found, 'strict', console);
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function reportDiagnostics(found: readonly PipelineBehaviorDiagnostic[], mode: DiagnosticsMode, logger: Pick<PipelineLogger, 'warn'>): void;
|
|
54
|
+
/**
|
|
55
|
+
* Compiles the pipeline a handler class declares with `@UsePipeline` and
|
|
56
|
+
* `@SkipPipeline`, together with the global behaviors that match its kind.
|
|
57
|
+
*
|
|
58
|
+
* @throws Error when the handler both declares and skips one behavior.
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const plan = compileHandlerPlan(CreateUserHandler, 'command', globalBehaviors);
|
|
62
|
+
* plan.behaviorTypes; // [LoggingBehavior, AuditBehavior]
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function compileHandlerPlan(handlerType: AnyClass, kind: DeclaredKind, globalBehaviors?: GlobalBehaviorsOptions | GlobalBehaviorsOptions[]): PipelinePlan;
|
|
66
|
+
/** Appends the contract violations of a plan's resolved behaviors to `diagnostics`. */
|
|
67
|
+
export declare function validatePlan(plan: PipelinePlan, handler: {
|
|
68
|
+
handlerType: Constructor;
|
|
69
|
+
handlerName: string;
|
|
70
|
+
kind: DeclaredKind;
|
|
71
|
+
}, behaviors: readonly IPipelineBehavior[], diagnostics: PipelineBehaviorDiagnostic[]): void;
|
|
72
|
+
/** The options map a context reads, absent when no behavior has options. */
|
|
73
|
+
export declare function behaviorOptionsOf(plan: PipelinePlan): Map<BehaviorId, Record<string, unknown>> | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Binds a handler method to its compiled pipeline: validates the behavior contracts,
|
|
76
|
+
* reports the chain, and returns the runner the bus or the adapter calls per request.
|
|
77
|
+
*
|
|
78
|
+
* @param binding.method - The handler's `execute` or `handle`; its name is logged.
|
|
79
|
+
* @param binding.behaviors - The instances of `plan.behaviorTypes`, in order.
|
|
80
|
+
* @param binding.diagnostics - Receives contract violations; absent, none are checked.
|
|
81
|
+
* @param binding.log - Receives one line naming the chain, when the handler has one.
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* const plan = compileHandlerPlan(CreateUserHandler, 'command', globalBehaviors);
|
|
85
|
+
* const run = createHandlerRunner({
|
|
86
|
+
* handlerType: CreateUserHandler,
|
|
87
|
+
* kind: 'command',
|
|
88
|
+
* plan,
|
|
89
|
+
* method: CreateUserHandler.prototype.execute,
|
|
90
|
+
* behaviors: plan.behaviorTypes.map(behavior),
|
|
91
|
+
* sources,
|
|
92
|
+
* });
|
|
93
|
+
* await run(handler, command);
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare function createHandlerRunner(binding: {
|
|
97
|
+
handlerType: Constructor;
|
|
98
|
+
kind: DeclaredKind;
|
|
99
|
+
plan: PipelinePlan;
|
|
100
|
+
method: (this: unknown, ...args: any[]) => unknown;
|
|
101
|
+
behaviors: readonly IPipelineBehavior[];
|
|
102
|
+
sources?: ContextSources;
|
|
103
|
+
diagnostics?: PipelineBehaviorDiagnostic[];
|
|
104
|
+
log?: (message: string) => void;
|
|
105
|
+
}): PipelineRunner;
|
|
106
|
+
//# sourceMappingURL=pipeline-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-setup.d.ts","sourceRoot":"","sources":["../../src/services/pipeline-setup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,EACL,KAAK,0BAA0B,EAEhC,MAAM,uDAAuD,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAmB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAE9B,uFAAuF;AACvF,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAElE,iFAAiF;AACjF,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAExD,oDAAoD;AACpD,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,WAAW,CAAC,iBAAiB,CAAC,KACjC,iBAAiB,CAAC;AAIvB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACpC,eAAe,EACX,sBAAsB,GACtB,sBAAsB,EAAE,GACxB,SAAS,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,gBAAgB,CA8BnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,0BAA0B,EAAE,EAC5C,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GACnC,IAAI,CAQN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,QAAQ,EACrB,IAAI,EAAE,YAAY,EAClB,eAAe,CAAC,EAAE,sBAAsB,GAAG,sBAAsB,EAAE,GAClE,YAAY,CAUd;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE;IACP,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;CACpB,EACD,SAAS,EAAE,SAAS,iBAAiB,EAAE,EACvC,WAAW,EAAE,0BAA0B,EAAE,GACxC,IAAI,CASN;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,wDAEnD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,YAAY,CAAC;IAEnB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC;IACnD,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACxC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,WAAW,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC3C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,cAAc,CA+BjB"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
2
|
+
import { LoggingBehavior } from '../behaviors/logging.behavior.js';
|
|
3
|
+
import { pipelineOf } from '../handler-pipeline.js';
|
|
4
|
+
import { behaviorEntryType } from '../helpers/behavior-entries.js';
|
|
5
|
+
import { getBehaviorId } from '../helpers/behavior-id.js';
|
|
6
|
+
import { PipelineConfigurationError, } from '../interfaces/pipeline-behavior-contract.interface.js';
|
|
7
|
+
import { validateBehaviorContracts } from './pipeline-contracts.js';
|
|
8
|
+
import { compilePipelinePlan, toGlobalConfigs } from './pipeline-plan.js';
|
|
9
|
+
import { createPipelineRunner, } from './pipeline-runner.js';
|
|
10
|
+
const LOGGING_ID = getBehaviorId(LoggingBehavior);
|
|
11
|
+
/**
|
|
12
|
+
* Builds the resolver of the one instance per behavior class: the instance given for
|
|
13
|
+
* that class, else `LoggingBehavior` on `logger`, else one built with no arguments. The
|
|
14
|
+
* global behaviors are built here, so one that cannot be built fails at once.
|
|
15
|
+
*
|
|
16
|
+
* @param options.owner - The factory named in error messages, such as `createPipeline`.
|
|
17
|
+
* @throws TypeError on a malformed global entry or two given instances of one class.
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const behavior = createBehaviorResolver({
|
|
21
|
+
* owner: 'createCqrs',
|
|
22
|
+
* given: [new AuditBehavior(sink)],
|
|
23
|
+
* globalBehaviors: { before: [LoggingBehavior] },
|
|
24
|
+
* logger: console,
|
|
25
|
+
* });
|
|
26
|
+
* behavior(AuditBehavior); // the given instance
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function createBehaviorResolver(options) {
|
|
30
|
+
const { owner, given, globalBehaviors, logger } = options;
|
|
31
|
+
const instances = new Map();
|
|
32
|
+
for (const instance of given) {
|
|
33
|
+
const type = instance.constructor;
|
|
34
|
+
const id = getBehaviorId(type);
|
|
35
|
+
if (instances.has(id)) {
|
|
36
|
+
throw new TypeError(`${owner}: two instances of ${type.name}; pass one per behavior class.`);
|
|
37
|
+
}
|
|
38
|
+
instances.set(id, instance);
|
|
39
|
+
}
|
|
40
|
+
const resolve = (type) => {
|
|
41
|
+
const id = getBehaviorId(type);
|
|
42
|
+
let instance = instances.get(id);
|
|
43
|
+
if (!instance) {
|
|
44
|
+
instance = id === LOGGING_ID ? new LoggingBehavior(logger) : new type();
|
|
45
|
+
instances.set(id, instance);
|
|
46
|
+
}
|
|
47
|
+
return instance;
|
|
48
|
+
};
|
|
49
|
+
for (const config of toGlobalConfigs(globalBehaviors)) {
|
|
50
|
+
for (const entry of [...(config.before ?? []), ...(config.after ?? [])]) {
|
|
51
|
+
resolve(behaviorEntryType(entry, `${owner} globalBehaviors`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return resolve;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Applies the diagnostics mode to the contract violations found: `'strict'` throws them
|
|
58
|
+
* together, `'warn'` logs each one, `'off'` does nothing.
|
|
59
|
+
*
|
|
60
|
+
* @throws PipelineConfigurationError in `'strict'` mode when `found` is not empty.
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* const found: PipelineBehaviorDiagnostic[] = [];
|
|
64
|
+
* createHandlerRunner({ handlerType, kind, plan, method, behaviors, diagnostics: found });
|
|
65
|
+
* reportDiagnostics(found, 'strict', console);
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export function reportDiagnostics(found, mode, logger) {
|
|
69
|
+
if (mode === 'off' || found.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
if (mode === 'strict')
|
|
72
|
+
throw new PipelineConfigurationError(found);
|
|
73
|
+
for (const d of found) {
|
|
74
|
+
logger.warn(`[Pipeline Diagnostic] '${d.handlerName}' with behavior '${d.behaviorName}': ${d.message}. Fix: ${d.fix}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Compiles the pipeline a handler class declares with `@UsePipeline` and
|
|
79
|
+
* `@SkipPipeline`, together with the global behaviors that match its kind.
|
|
80
|
+
*
|
|
81
|
+
* @throws Error when the handler both declares and skips one behavior.
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* const plan = compileHandlerPlan(CreateUserHandler, 'command', globalBehaviors);
|
|
85
|
+
* plan.behaviorTypes; // [LoggingBehavior, AuditBehavior]
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export function compileHandlerPlan(handlerType, kind, globalBehaviors) {
|
|
89
|
+
const declared = pipelineOf(handlerType);
|
|
90
|
+
return compilePipelinePlan({
|
|
91
|
+
handlerName: handlerType.name,
|
|
92
|
+
requestKind: kind,
|
|
93
|
+
handlerBehaviorTypes: declared.types,
|
|
94
|
+
handlerOptions: declared.options,
|
|
95
|
+
skippedBehaviorTypes: declared.skipped,
|
|
96
|
+
globalBehaviors,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** Appends the contract violations of a plan's resolved behaviors to `diagnostics`. */
|
|
100
|
+
export function validatePlan(plan, handler, behaviors, diagnostics) {
|
|
101
|
+
validateBehaviorContracts({
|
|
102
|
+
...plan,
|
|
103
|
+
handlerType: handler.handlerType,
|
|
104
|
+
handlerName: handler.handlerName,
|
|
105
|
+
requestKind: handler.kind,
|
|
106
|
+
resolvedBehaviors: new Map(behaviors.map((b, i) => [i, b])),
|
|
107
|
+
diagnostics,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/** The options map a context reads, absent when no behavior has options. */
|
|
111
|
+
export function behaviorOptionsOf(plan) {
|
|
112
|
+
return plan.mergedOptions.size > 0 ? plan.mergedOptions : undefined;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Binds a handler method to its compiled pipeline: validates the behavior contracts,
|
|
116
|
+
* reports the chain, and returns the runner the bus or the adapter calls per request.
|
|
117
|
+
*
|
|
118
|
+
* @param binding.method - The handler's `execute` or `handle`; its name is logged.
|
|
119
|
+
* @param binding.behaviors - The instances of `plan.behaviorTypes`, in order.
|
|
120
|
+
* @param binding.diagnostics - Receives contract violations; absent, none are checked.
|
|
121
|
+
* @param binding.log - Receives one line naming the chain, when the handler has one.
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* const plan = compileHandlerPlan(CreateUserHandler, 'command', globalBehaviors);
|
|
125
|
+
* const run = createHandlerRunner({
|
|
126
|
+
* handlerType: CreateUserHandler,
|
|
127
|
+
* kind: 'command',
|
|
128
|
+
* plan,
|
|
129
|
+
* method: CreateUserHandler.prototype.execute,
|
|
130
|
+
* behaviors: plan.behaviorTypes.map(behavior),
|
|
131
|
+
* sources,
|
|
132
|
+
* });
|
|
133
|
+
* await run(handler, command);
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
export function createHandlerRunner(binding) {
|
|
137
|
+
const { handlerType, kind, plan, method, behaviors } = binding;
|
|
138
|
+
const handlerName = handlerType.name;
|
|
139
|
+
if (plan.hasPipeline) {
|
|
140
|
+
const methodName = kind === 'event' ? 'handle' : 'execute';
|
|
141
|
+
const chain = plan.behaviorTypes.map((type) => type.name).join(' → ');
|
|
142
|
+
binding.log?.(`Wrapping ${handlerName}.${methodName}() [${kind}] with pipeline: [${chain}]`);
|
|
143
|
+
}
|
|
144
|
+
if (binding.diagnostics) {
|
|
145
|
+
validatePlan(plan, { handlerType, handlerName, kind }, behaviors, binding.diagnostics);
|
|
146
|
+
}
|
|
147
|
+
return createPipelineRunner(method, {
|
|
148
|
+
handlerType,
|
|
149
|
+
handlerName,
|
|
150
|
+
requestKind: kind,
|
|
151
|
+
behaviorOptions: behaviorOptionsOf(plan),
|
|
152
|
+
}, behaviors, plan.hasPipeline, binding.sources);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=pipeline-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-setup.js","sourceRoot":"","sources":["../../src/services/pipeline-setup.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
/** A class, as `new` accepts it. Behaviors, requests and handlers are identified by theirs. */
|
|
2
2
|
export type Constructor<T = unknown> = new (...args: any[]) => T;
|
|
3
|
+
/** The request kinds a pipeline distinguishes; `unknown` matches only `scope: 'all'`. */
|
|
4
|
+
export type RequestKind = 'command' | 'query' | 'event' | 'unknown';
|
|
5
|
+
/** The kinds a wrapped function or a request declares. */
|
|
6
|
+
export type DeclaredKind = Exclude<RequestKind, 'unknown'>;
|
|
3
7
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,+FAA+F;AAE/F,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,+FAA+F;AAE/F,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEjE,yFAAyF;AACzF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpE,0DAA0D;AAC1D,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cqrs-ddd/pipeline",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Framework-neutral pipeline engine: wrap functions and methods with behaviors such as logging, caching or idempotency",
|
|
5
5
|
"author": "Aristotelis",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"access": "public"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@cqrs-ddd/safe-stringify": "^0.
|
|
48
|
-
"@cqrs-ddd/untyped": "^0.
|
|
49
|
-
"@cqrs-ddd/uuidv7": "^0.
|
|
47
|
+
"@cqrs-ddd/safe-stringify": "^0.6.0",
|
|
48
|
+
"@cqrs-ddd/untyped": "^0.6.0",
|
|
49
|
+
"@cqrs-ddd/uuidv7": "^0.6.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@vitest/coverage-v8": "^5.0.5",
|