@futdevpro/fsm-dynamo 1.20.60 → 1.20.64
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/build/_collections/utils/operation-authz.util.d.ts.map +1 -1
- package/build/_collections/utils/operation-authz.util.js +5 -1
- package/build/_collections/utils/operation-authz.util.js.map +1 -1
- package/build/_collections/utils/operation-guardrails.util.d.ts +46 -0
- package/build/_collections/utils/operation-guardrails.util.d.ts.map +1 -0
- package/build/_collections/utils/operation-guardrails.util.js +138 -0
- package/build/_collections/utils/operation-guardrails.util.js.map +1 -0
- package/build/_collections/utils/operation-run.util.d.ts +6 -0
- package/build/_collections/utils/operation-run.util.d.ts.map +1 -1
- package/build/_collections/utils/operation-run.util.js +18 -1
- package/build/_collections/utils/operation-run.util.js.map +1 -1
- package/build/_collections/utils/operation-schema.util.d.ts +46 -0
- package/build/_collections/utils/operation-schema.util.d.ts.map +1 -0
- package/build/_collections/utils/operation-schema.util.js +138 -0
- package/build/_collections/utils/operation-schema.util.js.map +1 -0
- package/build/_enums/operation-if-match.type-enum.d.ts +17 -0
- package/build/_enums/operation-if-match.type-enum.d.ts.map +1 -0
- package/build/_enums/operation-if-match.type-enum.js +21 -0
- package/build/_enums/operation-if-match.type-enum.js.map +1 -0
- package/build/_models/control-models/operation-settings.control-model.d.ts +3 -0
- package/build/_models/control-models/operation-settings.control-model.d.ts.map +1 -1
- package/build/_models/control-models/operation-settings.control-model.js +16 -0
- package/build/_models/control-models/operation-settings.control-model.js.map +1 -1
- package/build/_models/interfaces/operation-guardrails.interface.d.ts +28 -0
- package/build/_models/interfaces/operation-guardrails.interface.d.ts.map +1 -0
- package/build/_models/interfaces/operation-guardrails.interface.js +3 -0
- package/build/_models/interfaces/operation-guardrails.interface.js.map +1 -0
- package/build/_models/interfaces/operation-json-schema.interface.d.ts +27 -0
- package/build/_models/interfaces/operation-json-schema.interface.d.ts.map +1 -0
- package/build/_models/interfaces/operation-json-schema.interface.js +3 -0
- package/build/_models/interfaces/operation-json-schema.interface.js.map +1 -0
- package/build/_models/interfaces/operation-patch-result.interface.d.ts +14 -0
- package/build/_models/interfaces/operation-patch-result.interface.d.ts.map +1 -0
- package/build/_models/interfaces/operation-patch-result.interface.js +3 -0
- package/build/_models/interfaces/operation-patch-result.interface.js.map +1 -0
- package/build/index.d.ts +6 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +6 -0
- package/build/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-authz.util.d.ts","sourceRoot":"","sources":["../../../src/_collections/utils/operation-authz.util.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kCAAkC,EACnC,MAAM,8DAA8D,CAAC;AAEtE,OAAO,EACL,mCAAmC,EACpC,MAAM,+DAA+D,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2DAA2D,CAAC;AAGvG;;;;;;;;;;;;;GAaG;AACH,qBAAa,wBAAwB;IACnC;;;;OAIG;IACH,MAAM,CAAC,KAAK,CACV,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAC3E,GAAG,EAAE,kCAAkC,GACtC,0BAA0B;
|
|
1
|
+
{"version":3,"file":"operation-authz.util.d.ts","sourceRoot":"","sources":["../../../src/_collections/utils/operation-authz.util.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kCAAkC,EACnC,MAAM,8DAA8D,CAAC;AAEtE,OAAO,EACL,mCAAmC,EACpC,MAAM,+DAA+D,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2DAA2D,CAAC;AAGvG;;;;;;;;;;;;;GAaG;AACH,qBAAa,wBAAwB;IACnC;;;;OAIG;IACH,MAAM,CAAC,KAAK,CACV,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAC3E,GAAG,EAAE,kCAAkC,GACtC,0BAA0B;IA8C7B;;;OAGG;IACH,MAAM,CAAC,MAAM,CACX,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAC3E,GAAG,EAAE,kCAAkC,GACtC,0BAA0B;IAM7B;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CACnB,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAC3E,GAAG,EAAE,kCAAkC,EACvC,MAAM,EAAE,MAAM,GACb,0BAA0B;IA6B7B,2FAA2F;IAC3F,MAAM,CAAC,eAAe,CACpB,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAC3E,GAAG,EAAE,kCAAkC,EACvC,MAAM,EAAE,MAAM,GACb,0BAA0B;IAM7B,8BAA8B;IAC9B,OAAO,CAAC,MAAM,CAAC,IAAI;IAInB,8FAA8F;IAC9F,OAAO,CAAC,MAAM,CAAC,aAAa;CAoB7B"}
|
|
@@ -40,7 +40,11 @@ class DyFM_OperationAuthz_Util {
|
|
|
40
40
|
return { allowed: true, warning: 'legacy-api-key' };
|
|
41
41
|
}
|
|
42
42
|
const requiredScope = operation?.authz?.apiKeyScope;
|
|
43
|
-
//
|
|
43
|
+
// a public operation without scope is reachable anonymously, so a scoped key must not be worse off
|
|
44
|
+
if (!requiredScope && !issuerRequired) {
|
|
45
|
+
return { allowed: true };
|
|
46
|
+
}
|
|
47
|
+
// least privilege: a scoped key can not reach a protected operation that belongs to no scope
|
|
44
48
|
if (!requiredScope) {
|
|
45
49
|
return DyFM_OperationAuthz_Util.deny('DyFM-OPZ-NSC', 403, `operation "${operation?.name}" declares no apiKeyScope, a scoped API key can not call it`);
|
|
46
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-authz.util.js","sourceRoot":"","sources":["../../../src/_collections/utils/operation-authz.util.ts"],"names":[],"mappings":";;;AAAA,oFAAgF;AAChF,kHAEsE;AACtE,0FAA8E;AAO9E;;;;;;;;;;;;;GAaG;AACH,MAAa,wBAAwB;IACnC;;;;OAIG;IACH,MAAM,CAAC,KAAK,CACV,SAA2E,EAC3E,GAAuC;QAEvC,MAAM,cAAc,GAAY,SAAS,EAAE,KAAK,EAAE,cAAc,KAAK,KAAK,CAAC;QAC3E,MAAM,QAAQ,GAA4B,GAAG,EAAE,QAAQ,IAAI,kDAAuB,CAAC,IAAI,CAAC;QAExF,mEAAmE;QACnE,IAAI,cAAc,IAAI,CAAC,QAAQ,KAAK,kDAAuB,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;YAClF,OAAO,wBAAwB,CAAC,IAAI,CAClC,cAAc,EAAE,GAAG,EAAE,cAAc,SAAS,EAAE,IAAI,oCAAoC,CACvF,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,IAAI,QAAQ,KAAK,kDAAuB,CAAC,MAAM,EAAE,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,4FAA4F;QAC5F,IAAI,oEAAkC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QACtD,CAAC;QAED,MAAM,aAAa,GAAuB,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC;QAExE,
|
|
1
|
+
{"version":3,"file":"operation-authz.util.js","sourceRoot":"","sources":["../../../src/_collections/utils/operation-authz.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { DyFM_OperationContext_ControlModel } from '../../_models/control-models/operation-context.control-model';
|
|
2
|
+
import { DyFM_OperationSettings_ControlModel } from '../../_models/control-models/operation-settings.control-model';
|
|
3
|
+
import { DyFM_OperationPatch_Result } from '../../_models/interfaces/operation-patch-result.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Transport-independent write guardrails of an operation (HP-DOPL MP-1.5, DMCP-009).
|
|
6
|
+
*
|
|
7
|
+
* Two phases, like the authorization:
|
|
8
|
+
* 1. `assertPreconditions` — before running (called by `DyFM_OperationRun_Util.execute`);
|
|
9
|
+
* 2. `assertIfMatch` / `filterPatch` — inside `run`, once the current entity is loaded.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const task: Task = await loadTask(id);
|
|
14
|
+
* DyFM_OperationGuardrails_Util.assertIfMatch(op, ctx, DyFM_OperationGuardrails_Util.buildEtag(task.__v));
|
|
15
|
+
* const { patch } = DyFM_OperationGuardrails_Util.filterPatch(op, input);
|
|
16
|
+
* if (!ctx.dryRun) await saveTask(id, patch);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare class DyFM_OperationGuardrails_Util {
|
|
20
|
+
/**
|
|
21
|
+
* Builds the etag of an entity from its document version (`__v`), as the organizer MCP does.
|
|
22
|
+
* @param version - the document version; a missing version counts as `0`
|
|
23
|
+
*/
|
|
24
|
+
static buildEtag(version: number | undefined): string;
|
|
25
|
+
/**
|
|
26
|
+
* Checks what can be checked without the entity: dry-run support and the presence of a required `ifMatch`.
|
|
27
|
+
* @throws a coded `DyFM_Error` (400 `DyFM-OPG-DRY` · 428 `DyFM-OPG-IFM`)
|
|
28
|
+
*/
|
|
29
|
+
static assertPreconditions(operation: DyFM_OperationSettings_ControlModel<unknown, unknown[], unknown>, ctx: DyFM_OperationContext_ControlModel): void;
|
|
30
|
+
/**
|
|
31
|
+
* Compares the caller's `ifMatch` with the entity's current etag.
|
|
32
|
+
* @param currentEtag - the etag of the entity as loaded now
|
|
33
|
+
* @throws 409 `DyFM-OPG-CNF` on mismatch (and 428 when a required `ifMatch` is missing)
|
|
34
|
+
*/
|
|
35
|
+
static assertIfMatch(operation: DyFM_OperationSettings_ControlModel<unknown, unknown[], unknown>, ctx: DyFM_OperationContext_ControlModel, currentEtag: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Applies the patch whitelist of the operation.
|
|
38
|
+
* @param patch - the caller-provided patch object
|
|
39
|
+
* @returns the whitelisted patch and the dropped field names (unchanged patch without a whitelist)
|
|
40
|
+
* @throws 400 `DyFM-OPG-PTY` (not an object) · `DyFM-OPG-PFD` (rejected fields) · `DyFM-OPG-PEM` (nothing left)
|
|
41
|
+
*/
|
|
42
|
+
static filterPatch(operation: DyFM_OperationSettings_ControlModel<unknown, unknown[], unknown>, patch: Record<string, unknown>, ctx?: DyFM_OperationContext_ControlModel): DyFM_OperationPatch_Result;
|
|
43
|
+
/** Builds a coded guardrail error carrying the operation, the requestId and the details. */
|
|
44
|
+
private static error;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=operation-guardrails.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-guardrails.util.d.ts","sourceRoot":"","sources":["../../../src/_collections/utils/operation-guardrails.util.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kCAAkC,EACnC,MAAM,8DAA8D,CAAC;AACtE,OAAO,EACL,mCAAmC,EACpC,MAAM,+DAA+D,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2DAA2D,CAAC;AAGvG;;;;;;;;;;;;;;GAcG;AACH,qBAAa,6BAA6B;IACxC;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;IAIrD;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CACxB,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAC3E,GAAG,EAAE,kCAAkC,GACtC,IAAI;IAmBP;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAClB,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAC3E,GAAG,EAAE,kCAAkC,EACvC,WAAW,EAAE,MAAM,GAClB,IAAI;IAiCP;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAChB,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAC3E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,CAAC,EAAE,kCAAkC,GACvC,0BAA0B;IA6C7B,4FAA4F;IAC5F,OAAO,CAAC,MAAM,CAAC,KAAK;CAerB"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyFM_OperationGuardrails_Util = void 0;
|
|
4
|
+
const operation_if_match_type_enum_1 = require("../../_enums/operation-if-match.type-enum");
|
|
5
|
+
const error_control_model_1 = require("../../_models/control-models/error.control-model");
|
|
6
|
+
/**
|
|
7
|
+
* Transport-independent write guardrails of an operation (HP-DOPL MP-1.5, DMCP-009).
|
|
8
|
+
*
|
|
9
|
+
* Two phases, like the authorization:
|
|
10
|
+
* 1. `assertPreconditions` — before running (called by `DyFM_OperationRun_Util.execute`);
|
|
11
|
+
* 2. `assertIfMatch` / `filterPatch` — inside `run`, once the current entity is loaded.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const task: Task = await loadTask(id);
|
|
16
|
+
* DyFM_OperationGuardrails_Util.assertIfMatch(op, ctx, DyFM_OperationGuardrails_Util.buildEtag(task.__v));
|
|
17
|
+
* const { patch } = DyFM_OperationGuardrails_Util.filterPatch(op, input);
|
|
18
|
+
* if (!ctx.dryRun) await saveTask(id, patch);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
class DyFM_OperationGuardrails_Util {
|
|
22
|
+
/**
|
|
23
|
+
* Builds the etag of an entity from its document version (`__v`), as the organizer MCP does.
|
|
24
|
+
* @param version - the document version; a missing version counts as `0`
|
|
25
|
+
*/
|
|
26
|
+
static buildEtag(version) {
|
|
27
|
+
return String(version || 0);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks what can be checked without the entity: dry-run support and the presence of a required `ifMatch`.
|
|
31
|
+
* @throws a coded `DyFM_Error` (400 `DyFM-OPG-DRY` · 428 `DyFM-OPG-IFM`)
|
|
32
|
+
*/
|
|
33
|
+
static assertPreconditions(operation, ctx) {
|
|
34
|
+
// a caller asking for a dry run must never cause a real write
|
|
35
|
+
if (ctx?.dryRun === true && operation?.guardrails?.dryRun !== true) {
|
|
36
|
+
throw DyFM_OperationGuardrails_Util.error({
|
|
37
|
+
errorCode: 'DyFM-OPG-DRY', status: 400, operation: operation, ctx: ctx,
|
|
38
|
+
message: `operation "${operation?.name}" does not support dryRun`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// a required precondition that is missing: the caller must fetch the entity first
|
|
42
|
+
if (operation?.guardrails?.ifMatch === operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type.required && !ctx?.ifMatch) {
|
|
43
|
+
throw DyFM_OperationGuardrails_Util.error({
|
|
44
|
+
errorCode: 'DyFM-OPG-IFM', status: 428, operation: operation, ctx: ctx,
|
|
45
|
+
message: `operation "${operation?.name}" requires ifMatch (the etag of the entity)`,
|
|
46
|
+
details: { suggestion: 'Fetch the entity and send its current etag as ifMatch.' },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Compares the caller's `ifMatch` with the entity's current etag.
|
|
52
|
+
* @param currentEtag - the etag of the entity as loaded now
|
|
53
|
+
* @throws 409 `DyFM-OPG-CNF` on mismatch (and 428 when a required `ifMatch` is missing)
|
|
54
|
+
*/
|
|
55
|
+
static assertIfMatch(operation, ctx, currentEtag) {
|
|
56
|
+
const mode = operation?.guardrails?.ifMatch ?? operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type.none;
|
|
57
|
+
if (mode === operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type.none) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// repeated here, so the check is complete even when run is called outside execute
|
|
61
|
+
if (!ctx?.ifMatch) {
|
|
62
|
+
if (mode === operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type.required) {
|
|
63
|
+
throw DyFM_OperationGuardrails_Util.error({
|
|
64
|
+
errorCode: 'DyFM-OPG-IFM', status: 428, operation: operation, ctx: ctx,
|
|
65
|
+
message: `operation "${operation?.name}" requires ifMatch (the etag of the entity)`,
|
|
66
|
+
details: { suggestion: 'Fetch the entity and send its current etag as ifMatch.' },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (ctx.ifMatch !== currentEtag) {
|
|
72
|
+
throw DyFM_OperationGuardrails_Util.error({
|
|
73
|
+
errorCode: 'DyFM-OPG-CNF', status: 409, operation: operation, ctx: ctx,
|
|
74
|
+
message: `operation "${operation?.name}": etag mismatch (expected ${currentEtag}, got ${ctx.ifMatch})`,
|
|
75
|
+
details: {
|
|
76
|
+
expected: currentEtag,
|
|
77
|
+
received: ctx.ifMatch,
|
|
78
|
+
suggestion: 'Fetch the entity again and retry with its fresh etag.',
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Applies the patch whitelist of the operation.
|
|
85
|
+
* @param patch - the caller-provided patch object
|
|
86
|
+
* @returns the whitelisted patch and the dropped field names (unchanged patch without a whitelist)
|
|
87
|
+
* @throws 400 `DyFM-OPG-PTY` (not an object) · `DyFM-OPG-PFD` (rejected fields) · `DyFM-OPG-PEM` (nothing left)
|
|
88
|
+
*/
|
|
89
|
+
static filterPatch(operation, patch, ctx) {
|
|
90
|
+
if (!patch || typeof patch !== 'object' || Array.isArray(patch)) {
|
|
91
|
+
throw DyFM_OperationGuardrails_Util.error({
|
|
92
|
+
errorCode: 'DyFM-OPG-PTY', status: 400, operation: operation, ctx: ctx,
|
|
93
|
+
message: `operation "${operation?.name}": patch must be an object`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const whitelist = operation?.guardrails?.patchWhitelist;
|
|
97
|
+
// no whitelist declared: the guardrail is not active for this operation
|
|
98
|
+
if (!whitelist) {
|
|
99
|
+
return { patch: { ...patch }, droppedFields: [] };
|
|
100
|
+
}
|
|
101
|
+
const filtered = {};
|
|
102
|
+
const droppedFields = [];
|
|
103
|
+
Object.keys(patch).forEach((field) => {
|
|
104
|
+
if (whitelist.includes(field)) {
|
|
105
|
+
filtered[field] = patch[field];
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
droppedFields.push(field);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
if (droppedFields.length && operation.guardrails?.unknownPatchFields === 'reject') {
|
|
112
|
+
throw DyFM_OperationGuardrails_Util.error({
|
|
113
|
+
errorCode: 'DyFM-OPG-PFD', status: 400, operation: operation, ctx: ctx,
|
|
114
|
+
message: `operation "${operation?.name}": patch fields not allowed: ${droppedFields.join(', ')}`,
|
|
115
|
+
details: { droppedFields: droppedFields, allowedFields: whitelist },
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (!Object.keys(filtered).length) {
|
|
119
|
+
throw DyFM_OperationGuardrails_Util.error({
|
|
120
|
+
errorCode: 'DyFM-OPG-PEM', status: 400, operation: operation, ctx: ctx,
|
|
121
|
+
message: `operation "${operation?.name}": the patch has no allowed field`,
|
|
122
|
+
details: { droppedFields: droppedFields, allowedFields: whitelist },
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return { patch: filtered, droppedFields: droppedFields };
|
|
126
|
+
}
|
|
127
|
+
/** Builds a coded guardrail error carrying the operation, the requestId and the details. */
|
|
128
|
+
static error(set) {
|
|
129
|
+
return new error_control_model_1.DyFM_Error({
|
|
130
|
+
errorCode: set.errorCode,
|
|
131
|
+
status: set.status,
|
|
132
|
+
message: set.message,
|
|
133
|
+
additionalContent: { operation: set.operation?.name, requestId: set.ctx?.requestId, ...set.details },
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.DyFM_OperationGuardrails_Util = DyFM_OperationGuardrails_Util;
|
|
138
|
+
//# sourceMappingURL=operation-guardrails.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-guardrails.util.js","sourceRoot":"","sources":["../../../src/_collections/utils/operation-guardrails.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,12 @@ export declare class DyFM_OperationRun_Util {
|
|
|
19
19
|
* @returns the result and the non-fatal warnings; throws a coded `DyFM_Error` on any failure
|
|
20
20
|
*/
|
|
21
21
|
static execute<T_Result, T_Inputs extends unknown[], T_Body>(operation: DyFM_OperationSettings_ControlModel<T_Result, T_Inputs, T_Body>, ctx: DyFM_OperationContext_ControlModel, inputs: T_Inputs): Promise<DyFM_OperationRun_Result<T_Result>>;
|
|
22
|
+
/**
|
|
23
|
+
* Collects the non-fatal warnings of a successful call.
|
|
24
|
+
* `if-match-ignored`: the caller sent `ifMatch`, but the operation does not check it — the caller must not
|
|
25
|
+
* believe the write was protected against concurrent changes.
|
|
26
|
+
*/
|
|
27
|
+
private static warningsOf;
|
|
22
28
|
/**
|
|
23
29
|
* Transitional bridge (D-2): wraps an existing route `simpleTask` as a `run` implementation.
|
|
24
30
|
* The context is ignored, because a `simpleTask` never received one; the wrapped operation still
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-run.util.d.ts","sourceRoot":"","sources":["../../../src/_collections/utils/operation-run.util.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kCAAkC,EACnC,MAAM,8DAA8D,CAAC;AACtE,OAAO,EACL,mCAAmC,EACpC,MAAM,+DAA+D,CAAC;AAEvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yDAAyD,CAAC;
|
|
1
|
+
{"version":3,"file":"operation-run.util.d.ts","sourceRoot":"","sources":["../../../src/_collections/utils/operation-run.util.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kCAAkC,EACnC,MAAM,8DAA8D,CAAC;AACtE,OAAO,EACL,mCAAmC,EACpC,MAAM,+DAA+D,CAAC;AAEvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yDAAyD,CAAC;AAQnG;;;;;;;;GAQG;AACH,qBAAa,sBAAsB;IACjC;;;;;;OAMG;WACU,OAAO,CAAC,QAAQ,EAAE,QAAQ,SAAS,OAAO,EAAE,EAAE,MAAM,EAC/D,SAAS,EAAE,mCAAmC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAC1E,GAAG,EAAE,kCAAkC,EACvC,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAoC9C;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAgBzB;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,SAAS,OAAO,EAAE,EACxD,UAAU,EAAE,CAAC,GAAG,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,GACrD,CAAC,GAAG,EAAE,kCAAkC,EAAE,GAAG,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;CAUvF"}
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DyFM_OperationRun_Util = void 0;
|
|
4
4
|
const error_control_model_1 = require("../../_models/control-models/error.control-model");
|
|
5
|
+
const operation_if_match_type_enum_1 = require("../../_enums/operation-if-match.type-enum");
|
|
5
6
|
const operation_authz_util_1 = require("./operation-authz.util");
|
|
7
|
+
const operation_guardrails_util_1 = require("./operation-guardrails.util");
|
|
6
8
|
/**
|
|
7
9
|
* The single execution path of an operation (HP-DOPL MP-1.2, decision D-2): every transport adapter
|
|
8
10
|
* calls `execute`, so authorization and error shaping can not diverge between REST, MCP and CLI.
|
|
@@ -32,9 +34,11 @@ class DyFM_OperationRun_Util {
|
|
|
32
34
|
}
|
|
33
35
|
// authorization happens before any work, on every transport alike
|
|
34
36
|
const authz = operation_authz_util_1.DyFM_OperationAuthz_Util.assert(operation, ctx);
|
|
37
|
+
// guardrail preconditions after authorization, so an unauthorized caller learns nothing about them
|
|
38
|
+
operation_guardrails_util_1.DyFM_OperationGuardrails_Util.assertPreconditions(operation, ctx);
|
|
35
39
|
try {
|
|
36
40
|
const result = await operation.run(ctx, ...(inputs ?? []));
|
|
37
|
-
return { result: result, warnings:
|
|
41
|
+
return { result: result, warnings: DyFM_OperationRun_Util.warningsOf(operation, ctx, authz) };
|
|
38
42
|
}
|
|
39
43
|
catch (error) {
|
|
40
44
|
// a coded DyFM_Error is kept as-is, anything else is wrapped with the operation context
|
|
@@ -49,6 +53,19 @@ class DyFM_OperationRun_Util {
|
|
|
49
53
|
});
|
|
50
54
|
}
|
|
51
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Collects the non-fatal warnings of a successful call.
|
|
58
|
+
* `if-match-ignored`: the caller sent `ifMatch`, but the operation does not check it — the caller must not
|
|
59
|
+
* believe the write was protected against concurrent changes.
|
|
60
|
+
*/
|
|
61
|
+
static warningsOf(operation, ctx, authz) {
|
|
62
|
+
const warnings = authz.warning ? [authz.warning] : [];
|
|
63
|
+
const ifMatchMode = operation.guardrails?.ifMatch ?? operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type.none;
|
|
64
|
+
if (ctx?.ifMatch && ifMatchMode === operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type.none) {
|
|
65
|
+
warnings.push('if-match-ignored');
|
|
66
|
+
}
|
|
67
|
+
return warnings;
|
|
68
|
+
}
|
|
52
69
|
/**
|
|
53
70
|
* Transitional bridge (D-2): wraps an existing route `simpleTask` as a `run` implementation.
|
|
54
71
|
* The context is ignored, because a `simpleTask` never received one; the wrapped operation still
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-run.util.js","sourceRoot":"","sources":["../../../src/_collections/utils/operation-run.util.ts"],"names":[],"mappings":";;;AAAA,0FAA8E;AAU9E,iEAAkE;
|
|
1
|
+
{"version":3,"file":"operation-run.util.js","sourceRoot":"","sources":["../../../src/_collections/utils/operation-run.util.ts"],"names":[],"mappings":";;;AAAA,0FAA8E;AAU9E,4FAAuF;AAEvF,iEAAkE;AAClE,2EAA4E;AAG5E;;;;;;;;GAQG;AACH,MAAa,sBAAsB;IACjC;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAClB,SAA0E,EAC1E,GAAuC,EACvC,MAAgB;QAEhB,oFAAoF;QACpF,IAAI,OAAO,SAAS,EAAE,GAAG,KAAK,UAAU,EAAE,CAAC;YACzC,MAAM,IAAI,gCAAU,CAAC;gBACnB,SAAS,EAAE,cAAc;gBACzB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,cAAc,SAAS,EAAE,IAAI,6BAA6B;gBACnE,iBAAiB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;QAED,kEAAkE;QAClE,MAAM,KAAK,GAA+B,+CAAwB,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAE1F,mGAAmG;QACnG,yDAA6B,CAAC,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,MAAM,GAAa,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,IAAK,EAA4B,CAAC,CAAC,CAAC;YAEhG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QAChG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wFAAwF;YACxF,IAAI,KAAK,YAAY,gCAAU,EAAE,CAAC;gBAChC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,IAAI,gCAAU,CAAC;gBACnB,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,cAAc,SAAS,CAAC,IAAI,UAAU;gBAC/C,KAAK,EAAE,KAAK;gBACZ,iBAAiB,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE;aAC5E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,UAAU,CACvB,SAA2E,EAC3E,GAAuC,EACvC,KAAiC;QAEjC,MAAM,QAAQ,GAAa,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,OAAO,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAElE,MAAM,WAAW,GAA+B,SAAS,CAAC,UAAU,EAAE,OAAO,IAAI,yDAA0B,CAAC,IAAI,CAAC;QAEjH,IAAI,GAAG,EAAE,OAAO,IAAI,WAAW,KAAK,yDAA0B,CAAC,IAAI,EAAE,CAAC;YACpE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CACnB,UAAsD;QAEtD,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,MAAM,IAAI,gCAAU,CAAC;gBACnB,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,+CAA+C;aACzD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAuC,EAAE,GAAG,MAAgB,EAAqB,EAAE,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,CAAC;IACpH,CAAC;CACF;AAvFD,wDAuFC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { DyFM_DataProperty_Params } from '../../_models/control-models/data-property-params.control-model';
|
|
2
|
+
import { DyFM_OperationSettings_ControlModel } from '../../_models/control-models/operation-settings.control-model';
|
|
3
|
+
import { DyFM_Operation_JsonSchema } from '../../_models/interfaces/operation-json-schema.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Generates the input JSON-schema of an operation (HP-DOPL MP-1.6, DMCP-005) from the runtime data model
|
|
6
|
+
* description (`bodyParams.properties`) — TypeScript generics do not exist at runtime, the properties do.
|
|
7
|
+
* Explicit `inputs` are added on top and override a body property of the same name.
|
|
8
|
+
*
|
|
9
|
+
* Left out on purpose:
|
|
10
|
+
* - server-managed metadata (every key starting with `_`, e.g. `_id`, `__v`, `__created`);
|
|
11
|
+
* - `forbidden`, `readonly` and function-typed properties;
|
|
12
|
+
* - the `authz.ownership` field — ownership is resolved server-side, never taken from caller input.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const schema: DyFM_Operation_JsonSchema = DyFM_OperationSchema_Util.inputSchema(createTask);
|
|
17
|
+
* // { type: 'object', properties: { title: { type: 'string' } }, required: [ 'title' ], additionalProperties: false }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare class DyFM_OperationSchema_Util {
|
|
21
|
+
/**
|
|
22
|
+
* Builds the object schema of all inputs of the operation.
|
|
23
|
+
* @param operation - the operation description
|
|
24
|
+
*/
|
|
25
|
+
static inputSchema(operation: DyFM_OperationSettings_ControlModel<unknown, unknown[], unknown>): DyFM_Operation_JsonSchema;
|
|
26
|
+
/**
|
|
27
|
+
* Maps one data property (recursively for objects) to a schema.
|
|
28
|
+
* @param property - the data property params
|
|
29
|
+
*/
|
|
30
|
+
static propertySchema(property: DyFM_DataProperty_Params<unknown, unknown>): DyFM_Operation_JsonSchema;
|
|
31
|
+
/**
|
|
32
|
+
* Builds an object schema from data properties, leaving out the fields a caller must not set.
|
|
33
|
+
* @param dataProperties - the data model properties
|
|
34
|
+
* @param excludedKey - an additional field to leave out (the ownership field)
|
|
35
|
+
*/
|
|
36
|
+
private static objectSchema;
|
|
37
|
+
/** Maps an explicit operation input to a schema. */
|
|
38
|
+
private static inputSettingsSchema;
|
|
39
|
+
/** Base schema of a basic type; dates travel as ISO strings. */
|
|
40
|
+
private static typeSchema;
|
|
41
|
+
/** A property is caller-settable unless it is metadata, forbidden, readonly or a function. */
|
|
42
|
+
private static isCallerSettable;
|
|
43
|
+
/** Normalizes a declared type text to a basic type; a missing type counts as `object`. */
|
|
44
|
+
private static basicTypeOf;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=operation-schema.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-schema.util.d.ts","sourceRoot":"","sources":["../../../src/_collections/utils/operation-schema.util.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACzB,MAAM,iEAAiE,CAAC;AACzE,OAAO,EACL,mCAAmC,EACpC,MAAM,+DAA+D,CAAC;AAEvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0DAA0D,CAAC;AAKrG;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,yBAAyB;IACpC;;;OAGG;IACH,MAAM,CAAC,WAAW,CAChB,SAAS,EAAE,mCAAmC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,GAC1E,yBAAyB;IAkC5B;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,yBAAyB;IAiCtG;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IA+B3B,oDAAoD;IACpD,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAkBlC,gEAAgE;IAChE,OAAO,CAAC,MAAM,CAAC,UAAU;IAQzB,8FAA8F;IAC9F,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAO/B,0FAA0F;IAC1F,OAAO,CAAC,MAAM,CAAC,WAAW;CAG3B"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyFM_OperationSchema_Util = void 0;
|
|
4
|
+
const basic_property_type_enum_1 = require("../../_enums/basic-property-type.enum");
|
|
5
|
+
const utilities_util_1 = require("./utilities.util");
|
|
6
|
+
/**
|
|
7
|
+
* Generates the input JSON-schema of an operation (HP-DOPL MP-1.6, DMCP-005) from the runtime data model
|
|
8
|
+
* description (`bodyParams.properties`) — TypeScript generics do not exist at runtime, the properties do.
|
|
9
|
+
* Explicit `inputs` are added on top and override a body property of the same name.
|
|
10
|
+
*
|
|
11
|
+
* Left out on purpose:
|
|
12
|
+
* - server-managed metadata (every key starting with `_`, e.g. `_id`, `__v`, `__created`);
|
|
13
|
+
* - `forbidden`, `readonly` and function-typed properties;
|
|
14
|
+
* - the `authz.ownership` field — ownership is resolved server-side, never taken from caller input.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const schema: DyFM_Operation_JsonSchema = DyFM_OperationSchema_Util.inputSchema(createTask);
|
|
19
|
+
* // { type: 'object', properties: { title: { type: 'string' } }, required: [ 'title' ], additionalProperties: false }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
class DyFM_OperationSchema_Util {
|
|
23
|
+
/**
|
|
24
|
+
* Builds the object schema of all inputs of the operation.
|
|
25
|
+
* @param operation - the operation description
|
|
26
|
+
*/
|
|
27
|
+
static inputSchema(operation) {
|
|
28
|
+
// body properties first, so explicit inputs can override them
|
|
29
|
+
const body = DyFM_OperationSchema_Util.objectSchema(operation?.bodyParams?.properties, operation?.authz?.ownership);
|
|
30
|
+
const properties = body.properties ?? {};
|
|
31
|
+
const required = new Set(body.required ?? []);
|
|
32
|
+
Object.entries(operation?.inputs ?? {}).forEach(([key, input]) => {
|
|
33
|
+
properties[key] = DyFM_OperationSchema_Util.inputSettingsSchema(input);
|
|
34
|
+
// the explicit input decides alone whether the name is required
|
|
35
|
+
if (input.required === true) {
|
|
36
|
+
required.add(key);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
required.delete(key);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
const schema = {
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: properties,
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
};
|
|
47
|
+
if (required.size) {
|
|
48
|
+
schema.required = [...required];
|
|
49
|
+
}
|
|
50
|
+
return schema;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Maps one data property (recursively for objects) to a schema.
|
|
54
|
+
* @param property - the data property params
|
|
55
|
+
*/
|
|
56
|
+
static propertySchema(property) {
|
|
57
|
+
const basicType = DyFM_OperationSchema_Util.basicTypeOf(property?.type);
|
|
58
|
+
const schema = DyFM_OperationSchema_Util.typeSchema(basicType);
|
|
59
|
+
// the declared type text (e.g. `string[]`) is kept in nonBasicType once the params are constructed
|
|
60
|
+
const declaredType = String(property?.nonBasicType ?? property?.type ?? '');
|
|
61
|
+
// array element type
|
|
62
|
+
if (basicType === basic_property_type_enum_1.DyFM_BasicProperty_Type.array && declaredType.endsWith('[]')) {
|
|
63
|
+
schema.items = DyFM_OperationSchema_Util.typeSchema(DyFM_OperationSchema_Util.basicTypeOf(declaredType.slice(0, -2)));
|
|
64
|
+
}
|
|
65
|
+
// nested object properties
|
|
66
|
+
if (basicType === basic_property_type_enum_1.DyFM_BasicProperty_Type.object && property.subObjectParams) {
|
|
67
|
+
Object.assign(schema, DyFM_OperationSchema_Util.objectSchema(property.subObjectParams));
|
|
68
|
+
}
|
|
69
|
+
if (property?.default !== undefined) {
|
|
70
|
+
schema.default = property.default;
|
|
71
|
+
}
|
|
72
|
+
if (typeof property?.minlength === 'number') {
|
|
73
|
+
schema.minLength = property.minlength;
|
|
74
|
+
}
|
|
75
|
+
if (typeof property?.maxlength === 'number') {
|
|
76
|
+
schema.maxLength = property.maxlength;
|
|
77
|
+
}
|
|
78
|
+
return schema;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Builds an object schema from data properties, leaving out the fields a caller must not set.
|
|
82
|
+
* @param dataProperties - the data model properties
|
|
83
|
+
* @param excludedKey - an additional field to leave out (the ownership field)
|
|
84
|
+
*/
|
|
85
|
+
static objectSchema(dataProperties, excludedKey) {
|
|
86
|
+
const properties = {};
|
|
87
|
+
const required = [];
|
|
88
|
+
Object.entries(dataProperties ?? {}).forEach(([key, property]) => {
|
|
89
|
+
if (key === excludedKey || !DyFM_OperationSchema_Util.isCallerSettable(key, property)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
properties[key] = DyFM_OperationSchema_Util.propertySchema(property);
|
|
93
|
+
// a default makes the field optional for the caller
|
|
94
|
+
if (property.required === true && property.default === undefined) {
|
|
95
|
+
required.push(key);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
const schema = { type: 'object', properties: properties, additionalProperties: false };
|
|
99
|
+
if (required.length) {
|
|
100
|
+
schema.required = required;
|
|
101
|
+
}
|
|
102
|
+
return schema;
|
|
103
|
+
}
|
|
104
|
+
/** Maps an explicit operation input to a schema. */
|
|
105
|
+
static inputSettingsSchema(input) {
|
|
106
|
+
const schema = DyFM_OperationSchema_Util.typeSchema(input.type);
|
|
107
|
+
if (input.description) {
|
|
108
|
+
schema.description = input.description;
|
|
109
|
+
}
|
|
110
|
+
if (input.enum) {
|
|
111
|
+
schema.enum = [...input.enum];
|
|
112
|
+
}
|
|
113
|
+
if (input.default !== undefined) {
|
|
114
|
+
schema.default = input.default;
|
|
115
|
+
}
|
|
116
|
+
return schema;
|
|
117
|
+
}
|
|
118
|
+
/** Base schema of a basic type; dates travel as ISO strings. */
|
|
119
|
+
static typeSchema(type) {
|
|
120
|
+
if (type === basic_property_type_enum_1.DyFM_BasicProperty_Type.date) {
|
|
121
|
+
return { type: 'string', format: 'date-time' };
|
|
122
|
+
}
|
|
123
|
+
return { type: type };
|
|
124
|
+
}
|
|
125
|
+
/** A property is caller-settable unless it is metadata, forbidden, readonly or a function. */
|
|
126
|
+
static isCallerSettable(key, property) {
|
|
127
|
+
return !key.startsWith('_') &&
|
|
128
|
+
property?.forbidden !== true &&
|
|
129
|
+
property?.readonly !== true &&
|
|
130
|
+
DyFM_OperationSchema_Util.basicTypeOf(property?.type) !== basic_property_type_enum_1.DyFM_BasicProperty_Type.function;
|
|
131
|
+
}
|
|
132
|
+
/** Normalizes a declared type text to a basic type; a missing type counts as `object`. */
|
|
133
|
+
static basicTypeOf(type) {
|
|
134
|
+
return type ? (0, utilities_util_1.DyFM_getBasicPropertyType)(type) : basic_property_type_enum_1.DyFM_BasicProperty_Type.object;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.DyFM_OperationSchema_Util = DyFM_OperationSchema_Util;
|
|
138
|
+
//# sourceMappingURL=operation-schema.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-schema.util.js","sourceRoot":"","sources":["../../../src/_collections/utils/operation-schema.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimistic-concurrency mode of an operation (`guardrails.ifMatch`).
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* const guardrails: DyFM_Operation_Guardrails = { ifMatch: DyFM_OperationIfMatch_Type.required };
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
export declare enum DyFM_OperationIfMatch_Type {
|
|
10
|
+
/** A call without `ifMatch` is rejected with 428 before running. */
|
|
11
|
+
required = "required",
|
|
12
|
+
/** Checked only when the caller sends `ifMatch`. */
|
|
13
|
+
optional = "optional",
|
|
14
|
+
/** Never checked. */
|
|
15
|
+
none = "none"
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=operation-if-match.type-enum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-if-match.type-enum.d.ts","sourceRoot":"","sources":["../../src/_enums/operation-if-match.type-enum.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,oBAAY,0BAA0B;IACpC,oEAAoE;IACpE,QAAQ,aAAa;IACrB,oDAAoD;IACpD,QAAQ,aAAa;IACrB,qBAAqB;IACrB,IAAI,SAAS;CACd"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyFM_OperationIfMatch_Type = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Optimistic-concurrency mode of an operation (`guardrails.ifMatch`).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const guardrails: DyFM_Operation_Guardrails = { ifMatch: DyFM_OperationIfMatch_Type.required };
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
var DyFM_OperationIfMatch_Type;
|
|
13
|
+
(function (DyFM_OperationIfMatch_Type) {
|
|
14
|
+
/** A call without `ifMatch` is rejected with 428 before running. */
|
|
15
|
+
DyFM_OperationIfMatch_Type["required"] = "required";
|
|
16
|
+
/** Checked only when the caller sends `ifMatch`. */
|
|
17
|
+
DyFM_OperationIfMatch_Type["optional"] = "optional";
|
|
18
|
+
/** Never checked. */
|
|
19
|
+
DyFM_OperationIfMatch_Type["none"] = "none";
|
|
20
|
+
})(DyFM_OperationIfMatch_Type || (exports.DyFM_OperationIfMatch_Type = DyFM_OperationIfMatch_Type = {}));
|
|
21
|
+
//# sourceMappingURL=operation-if-match.type-enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-if-match.type-enum.js","sourceRoot":"","sources":["../../src/_enums/operation-if-match.type-enum.ts"],"names":[],"mappings":";;;AAEA;;;;;;;GAOG;AACH,IAAY,0BAOX;AAPD,WAAY,0BAA0B;IACpC,oEAAoE;IACpE,mDAAqB,CAAA;IACrB,oDAAoD;IACpD,mDAAqB,CAAA;IACrB,qBAAqB;IACrB,2CAAa,CAAA;AACf,CAAC,EAPW,0BAA0B,0CAA1B,0BAA0B,QAOrC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DyFM_Operation_Authz } from '../interfaces/operation-authz.interface';
|
|
2
2
|
import { DyFM_Operation_Exposure } from '../interfaces/operation-exposure.interface';
|
|
3
|
+
import { DyFM_Operation_Guardrails } from '../interfaces/operation-guardrails.interface';
|
|
3
4
|
import { DyFM_OperationInput_Settings } from '../interfaces/operation-input-settings.interface';
|
|
4
5
|
import { DyFM_DataModel_Params } from './data-model-params.control-model';
|
|
5
6
|
import { DyFM_OperationContext_ControlModel } from './operation-context.control-model';
|
|
@@ -43,6 +44,8 @@ export declare class DyFM_OperationSettings_ControlModel<T_Result = unknown, T_I
|
|
|
43
44
|
expose?: DyFM_Operation_Exposure;
|
|
44
45
|
/** Declarative authorization; `issuerRequired` defaults to `true`. */
|
|
45
46
|
authz?: DyFM_Operation_Authz;
|
|
47
|
+
/** Write-safety guardrails; defaults: `ifMatch: none`, `dryRun: false`, `unknownPatchFields: drop`. */
|
|
48
|
+
guardrails?: DyFM_Operation_Guardrails;
|
|
46
49
|
/**
|
|
47
50
|
* The implementation — the single execution source of the operation (D-2). Optional, because a
|
|
48
51
|
* definition-only copy (e.g. for CLI generation) has none; run it through `DyFM_OperationRun_Util.execute`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-settings.control-model.d.ts","sourceRoot":"","sources":["../../../src/_models/control-models/operation-settings.control-model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"operation-settings.control-model.d.ts","sourceRoot":"","sources":["../../../src/_models/control-models/operation-settings.control-model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,4BAA4B,EAAE,MAAM,kDAAkD,CAAC;AAEhG,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AASvF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mCAAmC,CAC9C,QAAQ,GAAG,OAAO,EAClB,QAAQ,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,EACtC,MAAM,GAAG,SAAS;IAMlB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAM;IAC3D,oEAAoE;IACpE,UAAU,CAAC,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACxC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,sEAAsE;IACtE,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,uGAAuG;IACvG,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC;;;;OAIG;IACH,GAAG,CAAC,CAAC,GAAG,EAAE,kCAAkC,EAAE,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACrF,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;gBAED,GAAG,EAAE,mCAAmC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;IAuItE,mEAAmE;IACnE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKzC,4FAA4F;IAC5F,OAAO,CAAC,MAAM,CAAC,OAAO;CAOvB;AAED,OAAO,EACL,mCAAmC,IAAI,uBAAuB,EAC/D,CAAC"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DyFM_Operation_Settings = exports.DyFM_OperationSettings_ControlModel = void 0;
|
|
4
4
|
const stack_util_1 = require("../../_collections/utils/stack.util");
|
|
5
5
|
const basic_property_type_enum_1 = require("../../_enums/basic-property-type.enum");
|
|
6
|
+
const operation_if_match_type_enum_1 = require("../../_enums/operation-if-match.type-enum");
|
|
6
7
|
const error_control_model_1 = require("./error.control-model");
|
|
7
8
|
/** Kebab-case segment: lowercase letters/digits, separated by single dashes. */
|
|
8
9
|
const DyFM_operationKebabSegment = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
|
|
@@ -51,6 +52,8 @@ class DyFM_OperationSettings_ControlModel {
|
|
|
51
52
|
expose;
|
|
52
53
|
/** Declarative authorization; `issuerRequired` defaults to `true`. */
|
|
53
54
|
authz;
|
|
55
|
+
/** Write-safety guardrails; defaults: `ifMatch: none`, `dryRun: false`, `unknownPatchFields: drop`. */
|
|
56
|
+
guardrails;
|
|
54
57
|
/** Source location of the construction, for debugging duplicated or misconfigured operations. */
|
|
55
58
|
stackLocation;
|
|
56
59
|
/**
|
|
@@ -102,6 +105,18 @@ class DyFM_OperationSettings_ControlModel {
|
|
|
102
105
|
if (authz.ownership !== undefined && authz.issuerRequired === false) {
|
|
103
106
|
throw DyFM_OperationSettings_ControlModel.invalid('DyFM-OPS-AZO', `authz.ownership can not be combined with issuerRequired: false (${label})`, stackLocation);
|
|
104
107
|
}
|
|
108
|
+
// guardrails: known modes, and a whitelist of usable field names
|
|
109
|
+
const guardrails = {
|
|
110
|
+
ifMatch: operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type.none, dryRun: false, unknownPatchFields: 'drop', ...set.guardrails,
|
|
111
|
+
};
|
|
112
|
+
if (!Object.values(operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type).includes(guardrails.ifMatch ?? operation_if_match_type_enum_1.DyFM_OperationIfMatch_Type.none) ||
|
|
113
|
+
!['drop', 'reject'].includes(guardrails.unknownPatchFields ?? 'drop') ||
|
|
114
|
+
typeof guardrails.dryRun !== 'boolean' ||
|
|
115
|
+
(guardrails.patchWhitelist !== undefined && (!Array.isArray(guardrails.patchWhitelist) ||
|
|
116
|
+
!guardrails.patchWhitelist.length ||
|
|
117
|
+
!guardrails.patchWhitelist.every((field) => DyFM_operationInputName.test(field))))) {
|
|
118
|
+
throw DyFM_OperationSettings_ControlModel.invalid('DyFM-OPS-GRD', `guardrails has an unknown mode or an invalid patchWhitelist (${label})`, stackLocation);
|
|
119
|
+
}
|
|
105
120
|
// run: when given, it must be callable
|
|
106
121
|
if (set.run !== undefined && typeof set.run !== 'function') {
|
|
107
122
|
throw DyFM_OperationSettings_ControlModel.invalid('DyFM-OPS-RUN', `run must be a function (${label})`, stackLocation);
|
|
@@ -115,6 +130,7 @@ class DyFM_OperationSettings_ControlModel {
|
|
|
115
130
|
// a missing expose flag means: exposed on that transport
|
|
116
131
|
this.expose = { rest: true, mcp: true, cli: true, ...set.expose };
|
|
117
132
|
this.authz = authz;
|
|
133
|
+
this.guardrails = guardrails;
|
|
118
134
|
this.stackLocation = stackLocation;
|
|
119
135
|
}
|
|
120
136
|
/** Checks the `name` format: dot-separated kebab-case segments. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-settings.control-model.js","sourceRoot":"","sources":["../../../src/_models/control-models/operation-settings.control-model.ts"],"names":[],"mappings":";;;AAAA,oEAAwF;AACxF,oFAAgF;
|
|
1
|
+
{"version":3,"file":"operation-settings.control-model.js","sourceRoot":"","sources":["../../../src/_models/control-models/operation-settings.control-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DyFM_OperationIfMatch_Type } from '../../_enums/operation-if-match.type-enum';
|
|
2
|
+
/**
|
|
3
|
+
* Write-safety guardrails of an operation (HP-DOPL MP-1.5, DMCP-009), lifted from the organizer MCP
|
|
4
|
+
* "safe write" pattern: optimistic concurrency, dry run, patch whitelist.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const guardrails: DyFM_Operation_Guardrails = {
|
|
9
|
+
* ifMatch: DyFM_OperationIfMatch_Type.required,
|
|
10
|
+
* dryRun: true,
|
|
11
|
+
* patchWhitelist: [ 'title', 'dueDate' ],
|
|
12
|
+
* };
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export interface DyFM_Operation_Guardrails {
|
|
16
|
+
/** Optimistic concurrency via `ctx.ifMatch` (default: `none`). */
|
|
17
|
+
ifMatch?: DyFM_OperationIfMatch_Type;
|
|
18
|
+
/**
|
|
19
|
+
* The operation honours `ctx.dryRun` (default: `false`). A dry-run call to an operation that does not
|
|
20
|
+
* support it is rejected, so a caller asking for a dry run can never cause a real write.
|
|
21
|
+
*/
|
|
22
|
+
dryRun?: boolean;
|
|
23
|
+
/** Fields a patch may change; when set, `DyFM_OperationGuardrails_Util.filterPatch` enforces it. */
|
|
24
|
+
patchWhitelist?: string[];
|
|
25
|
+
/** What happens with non-whitelisted patch fields (default: `drop`, reported back as dropped). */
|
|
26
|
+
unknownPatchFields?: 'drop' | 'reject';
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=operation-guardrails.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-guardrails.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/operation-guardrails.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAGvF;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,yBAAyB;IACxC,kEAAkE;IAClE,OAAO,CAAC,EAAE,0BAA0B,CAAC;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oGAAoG;IACpG,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kGAAkG;IAClG,kBAAkB,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-guardrails.interface.js","sourceRoot":"","sources":["../../../src/_models/interfaces/operation-guardrails.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-schema subset generated for an operation (HP-DOPL MP-1.6). Structurally compatible with the
|
|
3
|
+
* `nts-dynamo` MCP `DyNTS_Mcp_JsonSchema`, so it can be advertised as an MCP tool `inputSchema` as-is,
|
|
4
|
+
* and the CLI generator can derive its options from the same object.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const schema: DyFM_Operation_JsonSchema = DyFM_OperationSchema_Util.inputSchema(operation);
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export interface DyFM_Operation_JsonSchema {
|
|
12
|
+
type: string;
|
|
13
|
+
properties?: {
|
|
14
|
+
[key: string]: DyFM_Operation_JsonSchema;
|
|
15
|
+
};
|
|
16
|
+
required?: string[];
|
|
17
|
+
items?: DyFM_Operation_JsonSchema;
|
|
18
|
+
enum?: (string | number | boolean)[];
|
|
19
|
+
description?: string;
|
|
20
|
+
default?: unknown;
|
|
21
|
+
/** String format hint (e.g. `date-time`). */
|
|
22
|
+
format?: string;
|
|
23
|
+
minLength?: number;
|
|
24
|
+
maxLength?: number;
|
|
25
|
+
additionalProperties?: boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=operation-json-schema.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-json-schema.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/operation-json-schema.interface.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB,CAAA;KAAE,CAAC;IAC1D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,yBAAyB,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-json-schema.interface.js","sourceRoot":"","sources":["../../../src/_models/interfaces/operation-json-schema.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of `DyFM_OperationGuardrails_Util.filterPatch`: the whitelisted patch and the fields that were
|
|
3
|
+
* dropped, so the adapter can tell the caller instead of ignoring them silently.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* const { patch, droppedFields }: DyFM_OperationPatch_Result = DyFM_OperationGuardrails_Util.filterPatch(op, input);
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export interface DyFM_OperationPatch_Result {
|
|
11
|
+
patch: Record<string, unknown>;
|
|
12
|
+
droppedFields: string[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=operation-patch-result.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-patch-result.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/operation-patch-result.interface.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-patch-result.interface.js","sourceRoot":"","sources":["../../../src/_models/interfaces/operation-patch-result.interface.ts"],"names":[],"mappings":""}
|
package/build/index.d.ts
CHANGED
|
@@ -20,7 +20,9 @@ export * from './_collections/utils/time.util';
|
|
|
20
20
|
export * from './_collections/utils/type-cloning-facility.util';
|
|
21
21
|
export * from './_collections/utils/utilities.util';
|
|
22
22
|
export * from './_collections/utils/operation-authz.util';
|
|
23
|
+
export * from './_collections/utils/operation-guardrails.util';
|
|
23
24
|
export * from './_collections/utils/operation-run.util';
|
|
25
|
+
export * from './_collections/utils/operation-schema.util';
|
|
24
26
|
export * from './_collections/utils/uuid.util';
|
|
25
27
|
export * from './_collections/utils/math/box-bounds.util';
|
|
26
28
|
export * from './_collections/utils/math/math.util';
|
|
@@ -37,6 +39,7 @@ export * from './_enums/error-level.enum';
|
|
|
37
39
|
export * from './_enums/error-status.enum';
|
|
38
40
|
export * from './_enums/log-style.enum';
|
|
39
41
|
export * from './_enums/operation-auth.type-enum';
|
|
42
|
+
export * from './_enums/operation-if-match.type-enum';
|
|
40
43
|
export * from './_enums/server-connection-status.enum';
|
|
41
44
|
export * from './_enums/http/http-call-type.enum';
|
|
42
45
|
export * from './_enums/http/http-event-type.enum';
|
|
@@ -64,7 +67,10 @@ export * from './_models/interfaces/operation-authz-result.interface';
|
|
|
64
67
|
export * from './_models/interfaces/operation-authz.interface';
|
|
65
68
|
export * from './_models/interfaces/operation-run-result.interface';
|
|
66
69
|
export * from './_models/interfaces/operation-exposure.interface';
|
|
70
|
+
export * from './_models/interfaces/operation-guardrails.interface';
|
|
67
71
|
export * from './_models/interfaces/operation-input-settings.interface';
|
|
72
|
+
export * from './_models/interfaces/operation-json-schema.interface';
|
|
73
|
+
export * from './_models/interfaces/operation-patch-result.interface';
|
|
68
74
|
export * from './_models/interfaces/paged.interface';
|
|
69
75
|
export * from './_models/interfaces/random-weight.interface';
|
|
70
76
|
export * from './_models/interfaces/route-settings.interface';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qCAAqC,CAAC;AACpD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC;AAI/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,wCAAwC,CAAC;AAGvD,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AAKjD,cAAc,0DAA0D,CAAC;AACzE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0DAA0D,CAAC;AACzE,cAAc,2DAA2D,CAAC;AAC1E,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,sDAAsD,CAAC;AACrE,cAAc,uEAAuE,CAAC;AAGtF,cAAc,iEAAiE,CAAC;AAChF,cAAc,0DAA0D,CAAC;AACzE,cAAc,wDAAwD,CAAC;AAGvE,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAG1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,uDAAuD,CAAC;AACtE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAClE,cAAc,yDAAyD,CAAC;AACxE,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wDAAwD,CAAC;AACvE,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gEAAgE,CAAC;AAC/E,cAAc,4DAA4D,CAAC;AAG3E,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qCAAqC,CAAC;AACpD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gCAAgC,CAAC;AAG/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC;AAI/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AAGvD,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AAKjD,cAAc,0DAA0D,CAAC;AACzE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0DAA0D,CAAC;AACzE,cAAc,2DAA2D,CAAC;AAC1E,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,sDAAsD,CAAC;AACrE,cAAc,uEAAuE,CAAC;AAGtF,cAAc,iEAAiE,CAAC;AAChF,cAAc,0DAA0D,CAAC;AACzE,cAAc,wDAAwD,CAAC;AAGvE,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAG1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,uDAAuD,CAAC;AACtE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAClE,cAAc,qDAAqD,CAAC;AACpE,cAAc,yDAAyD,CAAC;AACxE,cAAc,sDAAsD,CAAC;AACrE,cAAc,uDAAuD,CAAC;AACtE,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wDAAwD,CAAC;AACvE,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gEAAgE,CAAC;AAC/E,cAAc,4DAA4D,CAAC;AAG3E,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -26,7 +26,9 @@ tslib_1.__exportStar(require("./_collections/utils/time.util"), exports);
|
|
|
26
26
|
tslib_1.__exportStar(require("./_collections/utils/type-cloning-facility.util"), exports);
|
|
27
27
|
tslib_1.__exportStar(require("./_collections/utils/utilities.util"), exports);
|
|
28
28
|
tslib_1.__exportStar(require("./_collections/utils/operation-authz.util"), exports);
|
|
29
|
+
tslib_1.__exportStar(require("./_collections/utils/operation-guardrails.util"), exports);
|
|
29
30
|
tslib_1.__exportStar(require("./_collections/utils/operation-run.util"), exports);
|
|
31
|
+
tslib_1.__exportStar(require("./_collections/utils/operation-schema.util"), exports);
|
|
30
32
|
tslib_1.__exportStar(require("./_collections/utils/uuid.util"), exports);
|
|
31
33
|
// collections/utils/MATH
|
|
32
34
|
tslib_1.__exportStar(require("./_collections/utils/math/box-bounds.util"), exports);
|
|
@@ -46,6 +48,7 @@ tslib_1.__exportStar(require("./_enums/error-level.enum"), exports);
|
|
|
46
48
|
tslib_1.__exportStar(require("./_enums/error-status.enum"), exports);
|
|
47
49
|
tslib_1.__exportStar(require("./_enums/log-style.enum"), exports);
|
|
48
50
|
tslib_1.__exportStar(require("./_enums/operation-auth.type-enum"), exports);
|
|
51
|
+
tslib_1.__exportStar(require("./_enums/operation-if-match.type-enum"), exports);
|
|
49
52
|
tslib_1.__exportStar(require("./_enums/server-connection-status.enum"), exports);
|
|
50
53
|
// enums/HTTP
|
|
51
54
|
tslib_1.__exportStar(require("./_enums/http/http-call-type.enum"), exports);
|
|
@@ -80,7 +83,10 @@ tslib_1.__exportStar(require("./_models/interfaces/operation-authz-result.interf
|
|
|
80
83
|
tslib_1.__exportStar(require("./_models/interfaces/operation-authz.interface"), exports);
|
|
81
84
|
tslib_1.__exportStar(require("./_models/interfaces/operation-run-result.interface"), exports);
|
|
82
85
|
tslib_1.__exportStar(require("./_models/interfaces/operation-exposure.interface"), exports);
|
|
86
|
+
tslib_1.__exportStar(require("./_models/interfaces/operation-guardrails.interface"), exports);
|
|
83
87
|
tslib_1.__exportStar(require("./_models/interfaces/operation-input-settings.interface"), exports);
|
|
88
|
+
tslib_1.__exportStar(require("./_models/interfaces/operation-json-schema.interface"), exports);
|
|
89
|
+
tslib_1.__exportStar(require("./_models/interfaces/operation-patch-result.interface"), exports);
|
|
84
90
|
tslib_1.__exportStar(require("./_models/interfaces/paged.interface"), exports);
|
|
85
91
|
tslib_1.__exportStar(require("./_models/interfaces/random-weight.interface"), exports);
|
|
86
92
|
tslib_1.__exportStar(require("./_models/interfaces/route-settings.interface"), exports);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd,wBAAwB;AACxB,oFAA0D;AAC1D,wFAA8D;AAC9D,yFAA+D;AAC/D,iFAAuD;AACvD,+EAAqD;AAErD,oBAAoB;AACpB,0EAAgD;AAChD,0EAAgD;AAChD,yEAA+C;AAC/C,0FAAgE;AAChE,sFAA4D;AAC5D,wEAA8C;AAC9C,+EAAqD;AACrD,gFAAsD;AACtD,2EAAiD;AACjD,gFAAsD;AACtD,0EAAgD;AAChD,2EAAiD;AACjD,gFAAsD;AACtD,yEAA+C;AAC/C,0FAAgE;AAChE,8EAAoD;AACpD,oFAA0D;AAC1D,kFAAwD;AACxD,yEAA+C;AAE/C,yBAAyB;AACzB,oFAA0D;AAC1D,8EAAoD;AACpD,gFAAsD;AACtD,sFAA4D;AAC5D,iFAAuD;AAEvD,2BAA2B;AAC3B,yFAA+D;AAC/D,gFAAsD;AACtD,yFAA+D;AAG/D,QAAQ;AACR,4EAAkD;AAClD,wEAA8C;AAC9C,yEAA+C;AAC/C,oEAA0C;AAC1C,qEAA2C;AAC3C,kEAAwC;AACxC,4EAAkD;AAClD,iFAAuD;AAEvD,aAAa;AACb,4EAAkD;AAClD,6EAAmD;AACnD,gFAAsD;AAEtD,aAAa;AACb,yEAA+C;AAC/C,mEAAyC;AACzC,2EAAiD;AAGjD,SAAS;AACT,wBAAwB;AACxB,mGAAyE;AACzE,sGAA4E;AAC5E,uFAA6D;AAC7D,mGAAyE;AACzE,oGAA0E;AAC1E,sFAA4D;AAC5D,6FAAmE;AACnE,+FAAqE;AACrE,gHAAsF;AAEtF,6BAA6B;AAC7B,0GAAgF;AAChF,mGAAyE;AACzE,iGAAuE;AAEvE,qBAAqB;AACrB,kFAAwD;AACxD,oFAA0D;AAE1D,oBAAoB;AACpB,oFAA0D;AAC1D,wFAA8D;AAC9D,gGAAsE;AACtE,yFAA+D;AAC/D,8FAAoE;AACpE,4FAAkE;AAClE,kGAAwE;AACxE,+EAAqD;AACrD,uFAA6D;AAC7D,wFAA8D;AAC9D,sFAA4D;AAC5D,uFAA6D;AAC7D,iGAAuE;AACvE,iFAAuD;AAEvD,gCAAgC;AAChC,yGAA+E;AAC/E,qGAA2E;AAE3E,eAAe;AACf,yEAA+C;AAC/C,uEAA6C;AAC7C,yEAA+C;AAC/C,uEAA6C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd,wBAAwB;AACxB,oFAA0D;AAC1D,wFAA8D;AAC9D,yFAA+D;AAC/D,iFAAuD;AACvD,+EAAqD;AAErD,oBAAoB;AACpB,0EAAgD;AAChD,0EAAgD;AAChD,yEAA+C;AAC/C,0FAAgE;AAChE,sFAA4D;AAC5D,wEAA8C;AAC9C,+EAAqD;AACrD,gFAAsD;AACtD,2EAAiD;AACjD,gFAAsD;AACtD,0EAAgD;AAChD,2EAAiD;AACjD,gFAAsD;AACtD,yEAA+C;AAC/C,0FAAgE;AAChE,8EAAoD;AACpD,oFAA0D;AAC1D,yFAA+D;AAC/D,kFAAwD;AACxD,qFAA2D;AAC3D,yEAA+C;AAE/C,yBAAyB;AACzB,oFAA0D;AAC1D,8EAAoD;AACpD,gFAAsD;AACtD,sFAA4D;AAC5D,iFAAuD;AAEvD,2BAA2B;AAC3B,yFAA+D;AAC/D,gFAAsD;AACtD,yFAA+D;AAG/D,QAAQ;AACR,4EAAkD;AAClD,wEAA8C;AAC9C,yEAA+C;AAC/C,oEAA0C;AAC1C,qEAA2C;AAC3C,kEAAwC;AACxC,4EAAkD;AAClD,gFAAsD;AACtD,iFAAuD;AAEvD,aAAa;AACb,4EAAkD;AAClD,6EAAmD;AACnD,gFAAsD;AAEtD,aAAa;AACb,yEAA+C;AAC/C,mEAAyC;AACzC,2EAAiD;AAGjD,SAAS;AACT,wBAAwB;AACxB,mGAAyE;AACzE,sGAA4E;AAC5E,uFAA6D;AAC7D,mGAAyE;AACzE,oGAA0E;AAC1E,sFAA4D;AAC5D,6FAAmE;AACnE,+FAAqE;AACrE,gHAAsF;AAEtF,6BAA6B;AAC7B,0GAAgF;AAChF,mGAAyE;AACzE,iGAAuE;AAEvE,qBAAqB;AACrB,kFAAwD;AACxD,oFAA0D;AAE1D,oBAAoB;AACpB,oFAA0D;AAC1D,wFAA8D;AAC9D,gGAAsE;AACtE,yFAA+D;AAC/D,8FAAoE;AACpE,4FAAkE;AAClE,8FAAoE;AACpE,kGAAwE;AACxE,+FAAqE;AACrE,gGAAsE;AACtE,+EAAqD;AACrD,uFAA6D;AAC7D,wFAA8D;AAC9D,sFAA4D;AAC5D,uFAA6D;AAC7D,iGAAuE;AACvE,iFAAuD;AAEvD,gCAAgC;AAChC,yGAA+E;AAC/E,qGAA2E;AAE3E,eAAe;AACf,yEAA+C;AAC/C,uEAA6C;AAC7C,yEAA+C;AAC/C,uEAA6C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/fsm-dynamo",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.64",
|
|
4
4
|
"description": "Full Stack Model Collection for Dynamic (NodeJS-Typescript) Framework called Dynamo, by Future Development Ltd.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "full-stack-package",
|