@rytass/bpm-core-shared 0.19.0 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/package.json +1 -1
- package/src/index.d.ts +2 -0
- package/src/index.js +2 -0
- package/src/index.js.map +1 -1
- package/src/lib/expression-function.d.ts +33 -0
- package/src/lib/expression-function.js +18 -0
- package/src/lib/expression-function.js.map +1 -0
- package/src/lib/expression-usage-point.d.ts +72 -0
- package/src/lib/expression-usage-point.js +130 -0
- package/src/lib/expression-usage-point.js.map +1 -0
- package/src/lib/form.d.ts +17 -0
- package/src/lib/form.js +16 -1
- package/src/lib/form.js.map +1 -1
- package/src/lib/workflow-graph.d.ts +33 -1
- package/src/lib/workflow-graph.js +160 -29
- package/src/lib/workflow-graph.js.map +1 -1
- package/src/lib/workflow-toolset.d.ts +38 -1
- package/src/lib/workflow-toolset.js +208 -1
- package/src/lib/workflow-toolset.js.map +1 -1
- package/src/lib/workflow.d.ts +26 -1
- package/src/lib/workflow.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,46 @@
|
|
|
1
|
+
## 0.20.1 (2026-11-10)
|
|
2
|
+
|
|
3
|
+
### 🩹 Fixes
|
|
4
|
+
|
|
5
|
+
- **workflow-graph:** read a multiple-selection "" as unfilled ([298753a](https://github.com/Rytass/BPMCore/commit/298753a))
|
|
6
|
+
- **workflow-graph:** guard designer conditions against absent form keys ([a3d2cb6](https://github.com/Rytass/BPMCore/commit/a3d2cb6))
|
|
7
|
+
|
|
8
|
+
### ❤️ Thank You
|
|
9
|
+
|
|
10
|
+
- Chia Yu Pai @fantasywind
|
|
11
|
+
- Kai-Chieh Yang
|
|
12
|
+
|
|
13
|
+
## 0.20.0 (2026-11-08)
|
|
14
|
+
|
|
15
|
+
### 🚀 Features
|
|
16
|
+
|
|
17
|
+
- **workflow-chat:** require a BPM API session for /api/chat ([9906851](https://github.com/Rytass/BPMCore/commit/9906851))
|
|
18
|
+
- ⚠️ **form-data-source:** pass a binding's position explicitly and lint NOTIFY expressions ([9987b12](https://github.com/Rytass/BPMCore/commit/9987b12))
|
|
19
|
+
- **form-data-source:** bind DataSource and webhook parameters to expressions ([c2b18d3](https://github.com/Rytass/BPMCore/commit/c2b18d3))
|
|
20
|
+
- **designer:** write, preview and upgrade expressions in the designer ([ec36bb7](https://github.com/Rytass/BPMCore/commit/ec36bb7))
|
|
21
|
+
- **template:** lint expressions against their AST at publish ([61d07f5](https://github.com/Rytass/BPMCore/commit/61d07f5))
|
|
22
|
+
- **expression-function:** register host and built-in functions ([f8763b4](https://github.com/Rytass/BPMCore/commit/f8763b4))
|
|
23
|
+
- **expression-function:** define the function registry contract ([31e7e16](https://github.com/Rytass/BPMCore/commit/31e7e16))
|
|
24
|
+
- **condition:** evaluate expressions under a budget with sanitized errors ([38ef1f8](https://github.com/Rytass/BPMCore/commit/38ef1f8))
|
|
25
|
+
|
|
26
|
+
### 🩹 Fixes
|
|
27
|
+
|
|
28
|
+
- **form-data-source:** take a new pick over an expired EXPRESSION value ([3499115](https://github.com/Rytass/BPMCore/commit/3499115))
|
|
29
|
+
- **condition:** check cel-v2 function argument types and log engine warm-up ([0834758](https://github.com/Rytass/BPMCore/commit/0834758))
|
|
30
|
+
- **workflow-engine:** send webhooks after the transaction commits ([d74aba6](https://github.com/Rytass/BPMCore/commit/d74aba6))
|
|
31
|
+
|
|
32
|
+
### ⚠️ Breaking Changes
|
|
33
|
+
|
|
34
|
+
- **form-data-source:** pass a binding's position explicitly and lint NOTIFY expressions ([9987b12](https://github.com/Rytass/BPMCore/commit/9987b12))
|
|
35
|
+
FormDataSourceService.searchFormFieldOptions takes a
|
|
36
|
+
required position instead of optional rowValues, and the
|
|
37
|
+
NotifyWebhookBindingSource union gains an EXPRESSION member, so an
|
|
38
|
+
exhaustive switch over from.kind needs a new case.
|
|
39
|
+
|
|
40
|
+
### ❤️ Thank You
|
|
41
|
+
|
|
42
|
+
- Chia Yu Pai @fantasywind
|
|
43
|
+
|
|
1
44
|
## 0.19.0 (2026-11-04)
|
|
2
45
|
|
|
3
46
|
### 🩹 Fixes
|
package/package.json
CHANGED
package/src/index.d.ts
CHANGED
package/src/index.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./lib/condition"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./lib/expression-function"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./lib/expression-usage-point"), exports);
|
|
5
7
|
tslib_1.__exportStar(require("./lib/field-access"), exports);
|
|
6
8
|
tslib_1.__exportStar(require("./lib/field-access-lint"), exports);
|
|
7
9
|
tslib_1.__exportStar(require("./lib/field-access-matrix"), exports);
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/shared/src/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC;AAChC,6DAAmC;AACnC,kEAAwC;AACxC,oEAA0C;AAC1C,qDAA2B;AAC3B,yDAA+B;AAC/B,6DAAmC;AACnC,uDAA6B;AAC7B,yDAA+B;AAC/B,+DAAqC;AACrC,iEAAuC;AACvC,iEAAuC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/shared/src/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC;AAChC,oEAA0C;AAC1C,uEAA6C;AAC7C,6DAAmC;AACnC,kEAAwC;AACxC,oEAA0C;AAC1C,qDAA2B;AAC3B,yDAA+B;AAC/B,6DAAmC;AACnC,uDAA6B;AAC7B,yDAA+B;AAC/B,+DAAqC;AACrC,iEAAuC;AACvC,iEAAuC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The value types an expression function declares for its parameters and its
|
|
3
|
+
* result (ADR 22 §3.5). They name CEL types; `dyn` accepts any JSON value.
|
|
4
|
+
*/
|
|
5
|
+
export type BPMExpressionValueType = 'bool' | 'double' | 'dyn' | 'int' | 'list' | 'map' | 'null' | 'string';
|
|
6
|
+
/** A JSON value as an expression function receives and returns it. */
|
|
7
|
+
export type BPMExpressionValue = boolean | number | string | null | readonly BPMExpressionValue[] | {
|
|
8
|
+
readonly [key: string]: BPMExpressionValue;
|
|
9
|
+
};
|
|
10
|
+
export interface BPMExpressionFunctionParameter {
|
|
11
|
+
readonly description?: string;
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly type: BPMExpressionValueType;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* What the designer, the catalog and the publish lint may know about a
|
|
17
|
+
* function: everything except its handler. The browser only ever sees this.
|
|
18
|
+
*/
|
|
19
|
+
export interface BPMExpressionFunctionDescriptor {
|
|
20
|
+
/** `true` for the nine core functions (`round` … `upper`). */
|
|
21
|
+
readonly builtIn: boolean;
|
|
22
|
+
readonly description: string;
|
|
23
|
+
readonly label: string;
|
|
24
|
+
/** Host functions carry their version: `erp_costBand_v1`. Built-ins do not. */
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly parameters: readonly BPMExpressionFunctionParameter[];
|
|
27
|
+
readonly returnType: BPMExpressionValueType;
|
|
28
|
+
}
|
|
29
|
+
/** The names the core reserves for its built-in functions (ADR 22 §3.5). */
|
|
30
|
+
export declare const BPM_BUILT_IN_EXPRESSION_FUNCTION_NAMES: readonly ["abs", "ceil", "floor", "lower", "max", "min", "round", "trim", "upper"];
|
|
31
|
+
export type BPMBuiltInExpressionFunctionName = (typeof BPM_BUILT_IN_EXPRESSION_FUNCTION_NAMES)[number];
|
|
32
|
+
/** Host function names: lower camel segments joined by `_`, ending in `_vN`. */
|
|
33
|
+
export declare const BPM_EXPRESSION_FUNCTION_NAME_PATTERN: RegExp;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BPM_EXPRESSION_FUNCTION_NAME_PATTERN = exports.BPM_BUILT_IN_EXPRESSION_FUNCTION_NAMES = void 0;
|
|
4
|
+
/** The names the core reserves for its built-in functions (ADR 22 §3.5). */
|
|
5
|
+
exports.BPM_BUILT_IN_EXPRESSION_FUNCTION_NAMES = [
|
|
6
|
+
'abs',
|
|
7
|
+
'ceil',
|
|
8
|
+
'floor',
|
|
9
|
+
'lower',
|
|
10
|
+
'max',
|
|
11
|
+
'min',
|
|
12
|
+
'round',
|
|
13
|
+
'trim',
|
|
14
|
+
'upper',
|
|
15
|
+
];
|
|
16
|
+
/** Host function names: lower camel segments joined by `_`, ending in `_vN`. */
|
|
17
|
+
exports.BPM_EXPRESSION_FUNCTION_NAME_PATTERN = /^[a-z][A-Za-z0-9]*(_[A-Za-z0-9]+)*_v[0-9]+$/u;
|
|
18
|
+
//# sourceMappingURL=expression-function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-function.js","sourceRoot":"","sources":["../../../../../libs/shared/src/lib/expression-function.ts"],"names":[],"mappings":";;;AAqCA,4EAA4E;AAC/D,QAAA,sCAAsC,GAAG;IACpD,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;CACC,CAAC;AAKX,gFAAgF;AACnE,QAAA,oCAAoC,GAC/C,8CAA8C,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where an expression is evaluated, and so what it may read (docs/24 §2.3).
|
|
3
|
+
* Each use point has its own root list; they are deliberately not merged.
|
|
4
|
+
*/
|
|
5
|
+
export declare const EXPRESSION_USAGE_POINTS: readonly ["INITIATOR_POLICY", "ENTRY_CONDITION", "FLOW_CONDITION", "APPROVER_RESOLVER", "SERVICE_FORM_FIELD_VALUE", "WEBHOOK_PAYLOAD", "DELEGATION_CONDITION", "DATA_SOURCE_BINDING", "NOTIFY_WEBHOOK_BINDING"];
|
|
6
|
+
export type ExpressionUsagePoint = (typeof EXPRESSION_USAGE_POINTS)[number];
|
|
7
|
+
/**
|
|
8
|
+
* The root identifiers each use point evaluates with. Mirrors what the engine
|
|
9
|
+
* hands over at each point (workflow-engine `buildInitiatorPolicyContext`,
|
|
10
|
+
* `buildWorkflowExpressionContext`, the edge `lastDecision`, the delegation
|
|
11
|
+
* `principal`), so the lint refuses exactly what could only fail at run time.
|
|
12
|
+
*/
|
|
13
|
+
export declare const EXPRESSION_ROOT_IDENTIFIERS_BY_USAGE_POINT: Readonly<Record<ExpressionUsagePoint, readonly string[]>>;
|
|
14
|
+
/**
|
|
15
|
+
* Use points that may only call the built-in functions (docs/24 §1: bindings
|
|
16
|
+
* get host functions later, if ever; widening is additive, narrowing is not).
|
|
17
|
+
*/
|
|
18
|
+
export declare const EXPRESSION_USAGE_POINTS_WITHOUT_HOST_FUNCTIONS: readonly ExpressionUsagePoint[];
|
|
19
|
+
export declare const isExpressionUsagePoint: (value: unknown) => value is ExpressionUsagePoint;
|
|
20
|
+
export declare const allowsHostExpressionFunctions: (usagePoint: ExpressionUsagePoint) => boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Lint findings that refuse a publish (docs/24 §2.2). Publish, the preview's
|
|
23
|
+
* LINT mode and the NOTIFY catalog share this one list.
|
|
24
|
+
*/
|
|
25
|
+
export declare const EXPRESSION_LINT_ERROR_CODES: readonly ["EXPR_PARSE_FAILED", "EXPR_ROOT_NOT_ALLOWED", "EXPR_WHOLE_FORM_REFERENCE", "EXPR_COMPUTED_KEY", "EXPR_RESERVED_PATH_SEGMENT", "EXPR_COMPLEXITY_EXCEEDED", "EXPR_COMPREHENSION_NESTING", "EXPR_FIELD_UNKNOWN", "EXPR_FIELD_TYPE_MISMATCH", "EXPR_RESULT_TYPE_MISMATCH", "EXPR_FUNCTION_NOT_REGISTERED", "EXPR_FUNCTION_NOT_ALLOWED"];
|
|
26
|
+
/**
|
|
27
|
+
* Lint findings that only warn. `EXPR_DIVISOR_IS_FIELD` is the warning
|
|
28
|
+
* docs/24 §2.1 asks for (a `double` divided by a zero field is `Infinity` in
|
|
29
|
+
* cel-v2, which a comparison quietly turns into a routing decision; P1 P35).
|
|
30
|
+
* `EXPR_LAST_DECISION_UNAVAILABLE` is an edge condition that reads
|
|
31
|
+
* `lastDecision` on an edge leaving a node without tasks (a gateway, a
|
|
32
|
+
* service task, the start): no decision is made there, so it is always
|
|
33
|
+
* `null` at run time (Phase 23 P2 live finding, P4).
|
|
34
|
+
*/
|
|
35
|
+
export declare const EXPRESSION_LINT_WARNING_CODES: readonly ["EXPR_OPTIONAL_FIELD_WITHOUT_HAS", "EXPR_OR_ABSORBS_ERROR", "EXPR_HAS_NESTED_PARENT", "EXPR_APPROVER_READS_FORM", "EXPR_HIDDEN_FIELD_COPIED", "EXPR_DIVISOR_IS_FIELD", "EXPR_LAST_DECISION_UNAVAILABLE"];
|
|
36
|
+
export type ExpressionLintErrorCode = (typeof EXPRESSION_LINT_ERROR_CODES)[number];
|
|
37
|
+
export type ExpressionLintWarningCode = (typeof EXPRESSION_LINT_WARNING_CODES)[number];
|
|
38
|
+
export type ExpressionLintCode = ExpressionLintErrorCode | ExpressionLintWarningCode;
|
|
39
|
+
export type ExpressionLintSeverity = 'ERROR' | 'WARNING';
|
|
40
|
+
/**
|
|
41
|
+
* One finding. `subject` names what the finding is about (a field key, a
|
|
42
|
+
* root, a function) and is only ever an identifier: anything else is dropped
|
|
43
|
+
* when the line is written, so a user-chosen key can never carry the `'; '`
|
|
44
|
+
* the publish lint joins lines with.
|
|
45
|
+
*/
|
|
46
|
+
export interface ExpressionLintIssue {
|
|
47
|
+
readonly code: ExpressionLintCode;
|
|
48
|
+
readonly label: string;
|
|
49
|
+
readonly severity: ExpressionLintSeverity;
|
|
50
|
+
readonly subject?: string;
|
|
51
|
+
}
|
|
52
|
+
export declare const EXPRESSION_LINT_SUBJECT_PATTERN: RegExp;
|
|
53
|
+
export declare const isExpressionLintCode: (value: unknown) => value is ExpressionLintCode;
|
|
54
|
+
export declare const readExpressionLintSeverity: (code: ExpressionLintCode) => ExpressionLintSeverity;
|
|
55
|
+
/**
|
|
56
|
+
* The publish-lint line for a finding: `<label>: <code>` or
|
|
57
|
+
* `<label>: <code> <subject>`. The designer parses it back with
|
|
58
|
+
* {@link parseExpressionLintLine} to show its own copy.
|
|
59
|
+
*/
|
|
60
|
+
export declare const formatExpressionLintIssue: (issue: ExpressionLintIssue) => string;
|
|
61
|
+
export interface ParsedExpressionLintLine {
|
|
62
|
+
readonly code: ExpressionLintCode;
|
|
63
|
+
readonly label: string;
|
|
64
|
+
readonly subject: string | null;
|
|
65
|
+
}
|
|
66
|
+
/** The parts of a line {@link formatExpressionLintIssue} wrote, or `null`. */
|
|
67
|
+
export declare const parseExpressionLintLine: (line: string) => ParsedExpressionLintLine | null;
|
|
68
|
+
/**
|
|
69
|
+
* The publish-lint line for a definition whose `expressionDialect` this
|
|
70
|
+
* version does not know (Phase 23 P2). Shared so the designer can match it.
|
|
71
|
+
*/
|
|
72
|
+
export declare const UNKNOWN_EXPRESSION_DIALECT_LINT_MESSAGE = "workflow.expressionDialect must be cel-legacy or cel-v2";
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UNKNOWN_EXPRESSION_DIALECT_LINT_MESSAGE = exports.parseExpressionLintLine = exports.formatExpressionLintIssue = exports.readExpressionLintSeverity = exports.isExpressionLintCode = exports.EXPRESSION_LINT_SUBJECT_PATTERN = exports.EXPRESSION_LINT_WARNING_CODES = exports.EXPRESSION_LINT_ERROR_CODES = exports.allowsHostExpressionFunctions = exports.isExpressionUsagePoint = exports.EXPRESSION_USAGE_POINTS_WITHOUT_HOST_FUNCTIONS = exports.EXPRESSION_ROOT_IDENTIFIERS_BY_USAGE_POINT = exports.EXPRESSION_USAGE_POINTS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Where an expression is evaluated, and so what it may read (docs/24 §2.3).
|
|
6
|
+
* Each use point has its own root list; they are deliberately not merged.
|
|
7
|
+
*/
|
|
8
|
+
exports.EXPRESSION_USAGE_POINTS = [
|
|
9
|
+
'INITIATOR_POLICY',
|
|
10
|
+
'ENTRY_CONDITION',
|
|
11
|
+
'FLOW_CONDITION',
|
|
12
|
+
'APPROVER_RESOLVER',
|
|
13
|
+
'SERVICE_FORM_FIELD_VALUE',
|
|
14
|
+
'WEBHOOK_PAYLOAD',
|
|
15
|
+
'DELEGATION_CONDITION',
|
|
16
|
+
'DATA_SOURCE_BINDING',
|
|
17
|
+
'NOTIFY_WEBHOOK_BINDING',
|
|
18
|
+
];
|
|
19
|
+
const INSTANCE_ROOTS = [
|
|
20
|
+
'env',
|
|
21
|
+
'form',
|
|
22
|
+
'formData',
|
|
23
|
+
'initiator',
|
|
24
|
+
'instance',
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* The root identifiers each use point evaluates with. Mirrors what the engine
|
|
28
|
+
* hands over at each point (workflow-engine `buildInitiatorPolicyContext`,
|
|
29
|
+
* `buildWorkflowExpressionContext`, the edge `lastDecision`, the delegation
|
|
30
|
+
* `principal`), so the lint refuses exactly what could only fail at run time.
|
|
31
|
+
*/
|
|
32
|
+
exports.EXPRESSION_ROOT_IDENTIFIERS_BY_USAGE_POINT = {
|
|
33
|
+
APPROVER_RESOLVER: INSTANCE_ROOTS,
|
|
34
|
+
DATA_SOURCE_BINDING: ['form', 'row'],
|
|
35
|
+
DELEGATION_CONDITION: [...INSTANCE_ROOTS, 'principal'],
|
|
36
|
+
ENTRY_CONDITION: INSTANCE_ROOTS,
|
|
37
|
+
FLOW_CONDITION: [...INSTANCE_ROOTS, 'lastDecision'],
|
|
38
|
+
INITIATOR_POLICY: ['env', 'initiator', 'subject'],
|
|
39
|
+
NOTIFY_WEBHOOK_BINDING: ['form'],
|
|
40
|
+
SERVICE_FORM_FIELD_VALUE: INSTANCE_ROOTS,
|
|
41
|
+
WEBHOOK_PAYLOAD: INSTANCE_ROOTS,
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Use points that may only call the built-in functions (docs/24 §1: bindings
|
|
45
|
+
* get host functions later, if ever; widening is additive, narrowing is not).
|
|
46
|
+
*/
|
|
47
|
+
exports.EXPRESSION_USAGE_POINTS_WITHOUT_HOST_FUNCTIONS = ['DATA_SOURCE_BINDING', 'NOTIFY_WEBHOOK_BINDING'];
|
|
48
|
+
const isExpressionUsagePoint = (value) => typeof value === 'string' &&
|
|
49
|
+
exports.EXPRESSION_USAGE_POINTS.includes(value);
|
|
50
|
+
exports.isExpressionUsagePoint = isExpressionUsagePoint;
|
|
51
|
+
const allowsHostExpressionFunctions = (usagePoint) => !exports.EXPRESSION_USAGE_POINTS_WITHOUT_HOST_FUNCTIONS.includes(usagePoint);
|
|
52
|
+
exports.allowsHostExpressionFunctions = allowsHostExpressionFunctions;
|
|
53
|
+
/**
|
|
54
|
+
* Lint findings that refuse a publish (docs/24 §2.2). Publish, the preview's
|
|
55
|
+
* LINT mode and the NOTIFY catalog share this one list.
|
|
56
|
+
*/
|
|
57
|
+
exports.EXPRESSION_LINT_ERROR_CODES = [
|
|
58
|
+
'EXPR_PARSE_FAILED',
|
|
59
|
+
'EXPR_ROOT_NOT_ALLOWED',
|
|
60
|
+
'EXPR_WHOLE_FORM_REFERENCE',
|
|
61
|
+
'EXPR_COMPUTED_KEY',
|
|
62
|
+
'EXPR_RESERVED_PATH_SEGMENT',
|
|
63
|
+
'EXPR_COMPLEXITY_EXCEEDED',
|
|
64
|
+
'EXPR_COMPREHENSION_NESTING',
|
|
65
|
+
'EXPR_FIELD_UNKNOWN',
|
|
66
|
+
'EXPR_FIELD_TYPE_MISMATCH',
|
|
67
|
+
'EXPR_RESULT_TYPE_MISMATCH',
|
|
68
|
+
'EXPR_FUNCTION_NOT_REGISTERED',
|
|
69
|
+
'EXPR_FUNCTION_NOT_ALLOWED',
|
|
70
|
+
];
|
|
71
|
+
/**
|
|
72
|
+
* Lint findings that only warn. `EXPR_DIVISOR_IS_FIELD` is the warning
|
|
73
|
+
* docs/24 §2.1 asks for (a `double` divided by a zero field is `Infinity` in
|
|
74
|
+
* cel-v2, which a comparison quietly turns into a routing decision; P1 P35).
|
|
75
|
+
* `EXPR_LAST_DECISION_UNAVAILABLE` is an edge condition that reads
|
|
76
|
+
* `lastDecision` on an edge leaving a node without tasks (a gateway, a
|
|
77
|
+
* service task, the start): no decision is made there, so it is always
|
|
78
|
+
* `null` at run time (Phase 23 P2 live finding, P4).
|
|
79
|
+
*/
|
|
80
|
+
exports.EXPRESSION_LINT_WARNING_CODES = [
|
|
81
|
+
'EXPR_OPTIONAL_FIELD_WITHOUT_HAS',
|
|
82
|
+
'EXPR_OR_ABSORBS_ERROR',
|
|
83
|
+
'EXPR_HAS_NESTED_PARENT',
|
|
84
|
+
'EXPR_APPROVER_READS_FORM',
|
|
85
|
+
'EXPR_HIDDEN_FIELD_COPIED',
|
|
86
|
+
'EXPR_DIVISOR_IS_FIELD',
|
|
87
|
+
'EXPR_LAST_DECISION_UNAVAILABLE',
|
|
88
|
+
];
|
|
89
|
+
exports.EXPRESSION_LINT_SUBJECT_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/u;
|
|
90
|
+
const EXPRESSION_LINT_CODES = [
|
|
91
|
+
...exports.EXPRESSION_LINT_ERROR_CODES,
|
|
92
|
+
...exports.EXPRESSION_LINT_WARNING_CODES,
|
|
93
|
+
];
|
|
94
|
+
const isExpressionLintCode = (value) => typeof value === 'string' && EXPRESSION_LINT_CODES.includes(value);
|
|
95
|
+
exports.isExpressionLintCode = isExpressionLintCode;
|
|
96
|
+
const readExpressionLintSeverity = (code) => exports.EXPRESSION_LINT_WARNING_CODES.includes(code)
|
|
97
|
+
? 'WARNING'
|
|
98
|
+
: 'ERROR';
|
|
99
|
+
exports.readExpressionLintSeverity = readExpressionLintSeverity;
|
|
100
|
+
/**
|
|
101
|
+
* The publish-lint line for a finding: `<label>: <code>` or
|
|
102
|
+
* `<label>: <code> <subject>`. The designer parses it back with
|
|
103
|
+
* {@link parseExpressionLintLine} to show its own copy.
|
|
104
|
+
*/
|
|
105
|
+
const formatExpressionLintIssue = (issue) => issue.subject !== undefined &&
|
|
106
|
+
exports.EXPRESSION_LINT_SUBJECT_PATTERN.test(issue.subject)
|
|
107
|
+
? `${issue.label}: ${issue.code} ${issue.subject}`
|
|
108
|
+
: `${issue.label}: ${issue.code}`;
|
|
109
|
+
exports.formatExpressionLintIssue = formatExpressionLintIssue;
|
|
110
|
+
const EXPRESSION_LINT_LINE_PATTERN = /^(.+): (EXPR_[A-Z_]+)(?: ([A-Za-z_][A-Za-z0-9_]*))?$/u;
|
|
111
|
+
/** The parts of a line {@link formatExpressionLintIssue} wrote, or `null`. */
|
|
112
|
+
const parseExpressionLintLine = (line) => {
|
|
113
|
+
var _a;
|
|
114
|
+
const match = EXPRESSION_LINT_LINE_PATTERN.exec(line);
|
|
115
|
+
if (!match || !(0, exports.isExpressionLintCode)(match[2])) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
code: match[2],
|
|
120
|
+
label: match[1],
|
|
121
|
+
subject: (_a = match[3]) !== null && _a !== void 0 ? _a : null,
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
exports.parseExpressionLintLine = parseExpressionLintLine;
|
|
125
|
+
/**
|
|
126
|
+
* The publish-lint line for a definition whose `expressionDialect` this
|
|
127
|
+
* version does not know (Phase 23 P2). Shared so the designer can match it.
|
|
128
|
+
*/
|
|
129
|
+
exports.UNKNOWN_EXPRESSION_DIALECT_LINT_MESSAGE = 'workflow.expressionDialect must be cel-legacy or cel-v2';
|
|
130
|
+
//# sourceMappingURL=expression-usage-point.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-usage-point.js","sourceRoot":"","sources":["../../../../../libs/shared/src/lib/expression-usage-point.ts"],"names":[],"mappings":"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"}
|
package/src/lib/form.d.ts
CHANGED
|
@@ -72,7 +72,24 @@ export type FormDataSourceBindingSource = {
|
|
|
72
72
|
} | {
|
|
73
73
|
readonly columnKey: string;
|
|
74
74
|
readonly kind: 'ROW_FIELD';
|
|
75
|
+
} | {
|
|
76
|
+
/**
|
|
77
|
+
* A cel-v2 expression over `form` (and `row` inside a table column)
|
|
78
|
+
* whose result fills the parameter (ADR 22 §3.7). Always cel-v2, built-in
|
|
79
|
+
* functions only; evaluated only by the backend, from the stored schema.
|
|
80
|
+
*/
|
|
81
|
+
readonly expression: string;
|
|
82
|
+
readonly kind: 'EXPRESSION';
|
|
75
83
|
};
|
|
84
|
+
/** Every `FormDataSourceBindingSource` kind this version understands. */
|
|
85
|
+
export declare const FORM_DATA_SOURCE_BINDING_KINDS: readonly ["CONSTANT", "EXPRESSION", "FIELD", "ROW_FIELD"];
|
|
86
|
+
export type FormDataSourceBindingKind = (typeof FORM_DATA_SOURCE_BINDING_KINDS)[number];
|
|
87
|
+
/**
|
|
88
|
+
* Whether `kind` is a binding source this version understands. A schema
|
|
89
|
+
* written by a newer version may carry one it does not; readers must treat
|
|
90
|
+
* that binding as unusable instead of guessing (docs/24 §2.8).
|
|
91
|
+
*/
|
|
92
|
+
export declare const isFormDataSourceBindingKind: (kind: unknown) => kind is FormDataSourceBindingKind;
|
|
76
93
|
export interface FormDataSourceBinding {
|
|
77
94
|
readonly from: FormDataSourceBindingSource;
|
|
78
95
|
readonly parameter: string;
|
package/src/lib/form.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TEXT_FIELD_PATTERN_ERROR_MESSAGE_MAX_LENGTH = exports.TEXT_FIELD_PATTERN_MAX_LENGTH = exports.TEXT_FIELD_PATTERN_TIME_BUDGET_MS = exports.FORM_TABLE_MAX_ROWS = exports.TABLE_COLUMN_FIELD_TYPES = exports.ATTACHMENT_NOT_BINDABLE_ERROR_CODE = void 0;
|
|
3
|
+
exports.TEXT_FIELD_PATTERN_ERROR_MESSAGE_MAX_LENGTH = exports.TEXT_FIELD_PATTERN_MAX_LENGTH = exports.TEXT_FIELD_PATTERN_TIME_BUDGET_MS = exports.FORM_TABLE_MAX_ROWS = exports.TABLE_COLUMN_FIELD_TYPES = exports.ATTACHMENT_NOT_BINDABLE_ERROR_CODE = exports.isFormDataSourceBindingKind = exports.FORM_DATA_SOURCE_BINDING_KINDS = void 0;
|
|
4
4
|
exports.isFormOptionFieldDefinition = isFormOptionFieldDefinition;
|
|
5
5
|
exports.isMemberFieldDefinition = isMemberFieldDefinition;
|
|
6
6
|
exports.isOrgUnitFieldDefinition = isOrgUnitFieldDefinition;
|
|
@@ -21,6 +21,21 @@ exports.isFormDataSourceFieldDefinition = isFormDataSourceFieldDefinition;
|
|
|
21
21
|
exports.isFormStaticOptionFieldDefinition = isFormStaticOptionFieldDefinition;
|
|
22
22
|
exports.readFormFieldSelectionMode = readFormFieldSelectionMode;
|
|
23
23
|
exports.normalizeFormDefinitionSchema = normalizeFormDefinitionSchema;
|
|
24
|
+
/** Every `FormDataSourceBindingSource` kind this version understands. */
|
|
25
|
+
exports.FORM_DATA_SOURCE_BINDING_KINDS = [
|
|
26
|
+
'CONSTANT',
|
|
27
|
+
'EXPRESSION',
|
|
28
|
+
'FIELD',
|
|
29
|
+
'ROW_FIELD',
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Whether `kind` is a binding source this version understands. A schema
|
|
33
|
+
* written by a newer version may carry one it does not; readers must treat
|
|
34
|
+
* that binding as unusable instead of guessing (docs/24 §2.8).
|
|
35
|
+
*/
|
|
36
|
+
const isFormDataSourceBindingKind = (kind) => typeof kind === 'string' &&
|
|
37
|
+
exports.FORM_DATA_SOURCE_BINDING_KINDS.includes(kind);
|
|
38
|
+
exports.isFormDataSourceBindingKind = isFormDataSourceBindingKind;
|
|
24
39
|
/**
|
|
25
40
|
* Leads the message of a submission the server refuses because a
|
|
26
41
|
* `file_upload` value names an attachment the case may not take: one uploaded
|
package/src/lib/form.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../../../../libs/shared/src/lib/form.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../../../../libs/shared/src/lib/form.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,16 @@ export declare const WORKFLOW_EXPRESSION_LABELS: Readonly<{
|
|
|
49
49
|
nodeApproverResolverExpression: (nodeId: string) => string;
|
|
50
50
|
nodeEntryCondition: (nodeId: string) => string;
|
|
51
51
|
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Node types whose completion records a decision, which is what `lastDecision`
|
|
54
|
+
* reads on the edges leaving them. Every other node (a gateway, a service
|
|
55
|
+
* task, the start) has no task, so on its outgoing edges `lastDecision` is
|
|
56
|
+
* always `null` at run time; the expression lint warns about reading it there
|
|
57
|
+
* (`EXPR_LAST_DECISION_UNAVAILABLE`).
|
|
58
|
+
*/
|
|
59
|
+
export declare const WORKFLOW_DECISION_NODE_TYPES: readonly WorkflowNode['type'][];
|
|
60
|
+
/** Whether an edge leaving a node of this type has a `lastDecision` to read. */
|
|
61
|
+
export declare function hasWorkflowLastDecision(nodeType: string): boolean;
|
|
52
62
|
/**
|
|
53
63
|
* The structural lines of the backend publish lint (`lintWorkflowDefinition`
|
|
54
64
|
* in `@rytass/bpm-core-nestjs-module`). The backend writes them from here and
|
|
@@ -311,7 +321,7 @@ export declare const NOTIFY_WEBHOOK_TARGET_LIMIT = 10;
|
|
|
311
321
|
export declare const NOTIFY_WEBHOOK_ENDPOINT_VERSION_MAX = 2147483647;
|
|
312
322
|
export declare const NOTIFY_WEBHOOK_CONTEXT_PATHS: readonly NotifyWebhookContextPath[];
|
|
313
323
|
export type NotifyWebhookTargetIdFactory = () => string;
|
|
314
|
-
export type NotifyWebhookStructureIssueCode = 'BINDING_CONSTANT_INVALID' | 'BINDING_CONTEXT_PATH_INVALID' | 'BINDING_FIELD_KEY_REQUIRED' | 'BINDING_INVALID' | 'BINDING_PARAMETER_DUPLICATE' | 'BINDING_PARAMETER_REQUIRED' | 'BINDING_SOURCE_INVALID' | 'BINDINGS_NOT_ARRAY' | 'ENDPOINT_KEY_REQUIRED' | 'ENDPOINT_VERSION_INVALID' | 'TARGET_ID_DUPLICATE' | 'TARGET_ID_REQUIRED' | 'TARGET_INVALID' | 'TARGET_LIMIT_EXCEEDED' | 'UNKNOWN_PROPERTY' | 'WEBHOOKS_NOT_ARRAY';
|
|
324
|
+
export type NotifyWebhookStructureIssueCode = 'BINDING_CONSTANT_INVALID' | 'BINDING_CONTEXT_PATH_INVALID' | 'BINDING_EXPRESSION_REQUIRED' | 'BINDING_FIELD_KEY_REQUIRED' | 'BINDING_INVALID' | 'BINDING_PARAMETER_DUPLICATE' | 'BINDING_PARAMETER_REQUIRED' | 'BINDING_SOURCE_INVALID' | 'BINDINGS_NOT_ARRAY' | 'ENDPOINT_KEY_REQUIRED' | 'ENDPOINT_VERSION_INVALID' | 'TARGET_ID_DUPLICATE' | 'TARGET_ID_REQUIRED' | 'TARGET_INVALID' | 'TARGET_LIMIT_EXCEEDED' | 'UNKNOWN_PROPERTY' | 'WEBHOOKS_NOT_ARRAY';
|
|
315
325
|
/**
|
|
316
326
|
* A registry-independent shape problem in a NOTIFY node's `webhooks`.
|
|
317
327
|
*
|
|
@@ -436,6 +446,28 @@ export declare function readConditionOperatorOptionsForField(field: FormFieldDef
|
|
|
436
446
|
export declare function isMultipleSelectionConditionField(field: FormFieldDefinition): boolean;
|
|
437
447
|
export declare function readConditionValueLabel(field: FormFieldDefinition, value: string): string;
|
|
438
448
|
export declare function readFormFieldOption(options: readonly FormFieldOption[], value: string): FormFieldOption | null;
|
|
449
|
+
/**
|
|
450
|
+
* Compiles one designer condition to CEL.
|
|
451
|
+
*
|
|
452
|
+
* The runtime `form` is the submitted form data as-is, and a client submits it
|
|
453
|
+
* with `JSON.stringify`, so a field the user never touched has no key at all.
|
|
454
|
+
* cel-js throws `Identifier "x" not found in context` when it reads an absent
|
|
455
|
+
* key — `!= null` only guards a `null` value, not a missing key — and that
|
|
456
|
+
* would fail the whole submission. So for a plain-identifier key (`form.x`)
|
|
457
|
+
* every expression is gated on `has(form.x) && form.x != null` before the
|
|
458
|
+
* field is read, and "unfilled" (absent or `null`) gives the operator's empty
|
|
459
|
+
* answer: IS_FILLED / EQUALS / ordering are false, IS_EMPTY / NOT_EQUALS true.
|
|
460
|
+
*
|
|
461
|
+
* Two cel-js facts shape the strings (probed against cel-js 0.8.2):
|
|
462
|
+
* - `||` does not short-circuit, so `!has(form.x) || form.x == ""` still
|
|
463
|
+
* throws on `{}`. A "no" answer is therefore the negation of a guarded `&&`.
|
|
464
|
+
* - Only the first operand of a flat `a && b && c` chain short-circuits
|
|
465
|
+
* (`true && false && <throws>` throws), so the guards are right-nested:
|
|
466
|
+
* `a && (b && c)`.
|
|
467
|
+
*
|
|
468
|
+
* `has()` accepts only a field selection, so a non-identifier key
|
|
469
|
+
* (`form["a-b"]`) cannot be gated and keeps its original, unguarded output.
|
|
470
|
+
*/
|
|
439
471
|
export declare function readConditionExpression(field: FormFieldDefinition | null, operator: WorkflowEdgeConditionOperator | undefined, value: string | undefined): string | undefined;
|
|
440
472
|
export declare function readFormFieldReference(fieldKey: string): string;
|
|
441
473
|
export declare function readConditionExpressionOperator(operator: WorkflowEdgeConditionOperator): string;
|