openxiangda-nest 2.9.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -18,6 +18,7 @@ export * from './notification.js';
18
18
  export * from './platform-client.js';
19
19
  export * from './runtime.js';
20
20
  export * from './standard-operations.js';
21
+ export * from './transaction-builder.js';
21
22
  export * from './snapshot-values.js';
22
23
  export * from './tokens.js';
23
24
  export * from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ export * from './notification.js';
18
18
  export * from './platform-client.js';
19
19
  export * from './runtime.js';
20
20
  export * from './standard-operations.js';
21
+ export * from './transaction-builder.js';
21
22
  export * from './snapshot-values.js';
22
23
  export * from './tokens.js';
23
24
  export * from './types.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { SCHEMA_VERSIONS, type DataTransactionGuard, type DataTransactionOperation, type DataTransactionOperationReference, type DataTransactionRequest } from 'openxiangda-contracts';
2
+ /** Uses the platform's public validator; never includes record values in diagnostics. */
3
+ export declare function diagnoseDataTransaction(value: unknown): {
4
+ remediation?: string;
5
+ guardIndex?: number;
6
+ operationIndex?: number;
7
+ schemaVersion: typeof SCHEMA_VERSIONS.diagnostic;
8
+ code: string;
9
+ severity: import("openxiangda-contracts").DiagnosticSeverity;
10
+ message: string;
11
+ path?: string;
12
+ source?: string;
13
+ retryable: boolean;
14
+ details?: Record<string, unknown>;
15
+ }[];
16
+ export declare class DataTransactionBuildError extends Error {
17
+ readonly diagnostics: ReturnType<typeof diagnoseDataTransaction>;
18
+ readonly code = "OPENXIANGDA_TRANSACTION_BUILD_INVALID";
19
+ constructor(diagnostics: ReturnType<typeof diagnoseDataTransaction>);
20
+ }
21
+ /** Builds a detached request. No merging, retries, network access or state writes. */
22
+ export declare function createDataTransaction(idempotencyKey: string): {
23
+ operation(operation: DataTransactionOperation): number;
24
+ guard(guard: DataTransactionGuard): /*elided*/ any;
25
+ reference(operationIndex: number): DataTransactionOperationReference;
26
+ decimalReservation(value: NonNullable<DataTransactionRequest["decimalReservation"]>): /*elided*/ any;
27
+ diagnose(): {
28
+ remediation?: string;
29
+ guardIndex?: number;
30
+ operationIndex?: number;
31
+ schemaVersion: typeof SCHEMA_VERSIONS.diagnostic;
32
+ code: string;
33
+ severity: import("openxiangda-contracts").DiagnosticSeverity;
34
+ message: string;
35
+ path?: string;
36
+ source?: string;
37
+ retryable: boolean;
38
+ details?: Record<string, unknown>;
39
+ }[];
40
+ build(): DataTransactionRequest;
41
+ };
42
+ //# sourceMappingURL=transaction-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-builder.d.ts","sourceRoot":"","sources":["../src/transaction-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEf,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,iCAAiC,EACtC,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAC;AAE/B,yFAAyF;AACzF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO;;;;;;;;;;;;IAarD;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAEtC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC;IAD5E,QAAQ,CAAC,IAAI,2CAA2C;gBACnC,WAAW,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC;CAI7E;AAED,sFAAsF;AACtF,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM;yBAMnC,wBAAwB,GAAG,MAAM;iBAKzC,oBAAoB;8BAKP,MAAM,GAAG,iCAAiC;8BAK1C,WAAW,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;;;;;;;;;;;;;;aAK1E,sBAAsB;EAOlC"}
@@ -0,0 +1,64 @@
1
+ import { SCHEMA_VERSIONS, validateDataTransactionRequest, } from 'openxiangda-contracts';
2
+ /** Uses the platform's public validator; never includes record values in diagnostics. */
3
+ export function diagnoseDataTransaction(value) {
4
+ return validateDataTransactionRequest(value).map(item => {
5
+ const path = item.path || '';
6
+ const operation = /^operations\[(\d+)\]/.exec(path);
7
+ const guard = /^guards\[(\d+)\]/.exec(path);
8
+ return { ...item,
9
+ ...(operation ? { operationIndex: Number(operation[1]) } : {}),
10
+ ...(guard ? { guardIndex: Number(guard[1]) } : {}),
11
+ ...(item.code === 'DATA_TRANSACTION_RECORD_ASSERT_MUTATION_REQUIRED' ? {
12
+ remediation: '只读条件使用 record-match;同一记录的字段变更合成一次带 expectedRevision 的 update。',
13
+ } : {}),
14
+ };
15
+ });
16
+ }
17
+ export class DataTransactionBuildError extends Error {
18
+ diagnostics;
19
+ code = 'OPENXIANGDA_TRANSACTION_BUILD_INVALID';
20
+ constructor(diagnostics) {
21
+ super(diagnostics.map(item => `${item.path}: ${item.message}`).join('; '));
22
+ this.diagnostics = diagnostics;
23
+ this.name = 'DataTransactionBuildError';
24
+ }
25
+ }
26
+ /** Builds a detached request. No merging, retries, network access or state writes. */
27
+ export function createDataTransaction(idempotencyKey) {
28
+ const request = {
29
+ schemaVersion: SCHEMA_VERSIONS.dataTransactionRequest,
30
+ idempotencyKey, operations: [], guards: [],
31
+ };
32
+ const builder = {
33
+ operation(operation) {
34
+ if (request.operations.length >= 100)
35
+ throw new RangeError('事务最多包含 100 个操作');
36
+ request.operations.push(structuredClone(operation));
37
+ return request.operations.length - 1;
38
+ },
39
+ guard(guard) {
40
+ if (request.guards.length >= 20)
41
+ throw new RangeError('事务最多包含 20 个约束');
42
+ request.guards.push(structuredClone(guard));
43
+ return builder;
44
+ },
45
+ reference(operationIndex) {
46
+ if (!Number.isSafeInteger(operationIndex) || request.operations[operationIndex]?.operation !== 'create')
47
+ throw new RangeError('只能引用当前事务已添加的 create 操作');
48
+ return { operationIndex, field: 'id' };
49
+ },
50
+ decimalReservation(value) {
51
+ request.decimalReservation = structuredClone(value);
52
+ return builder;
53
+ },
54
+ diagnose() { return diagnoseDataTransaction(request); },
55
+ build() {
56
+ const diagnostics = diagnoseDataTransaction(request);
57
+ if (diagnostics.length)
58
+ throw new DataTransactionBuildError(diagnostics);
59
+ return structuredClone(request);
60
+ },
61
+ };
62
+ return builder;
63
+ }
64
+ //# sourceMappingURL=transaction-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction-builder.js","sourceRoot":"","sources":["../src/transaction-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openxiangda-nest",
3
- "version": "2.9.0",
3
+ "version": "2.10.0",
4
4
  "description": "OpenXiangda 2.0 的受信 NestJS 业务后端集成。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",