@djvlc/contracts-types 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,697 +1,1027 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- ACTION_SPEC_VERSION: () => ACTION_SPEC_VERSION,
24
- ALLOWED_ROOT_VARIABLES: () => ALLOWED_ROOT_VARIABLES,
25
- BUILTIN_FUNCTIONS: () => BUILTIN_FUNCTIONS,
26
- BUILTIN_FUNCTION_NAMES: () => BUILTIN_FUNCTION_NAMES,
27
- COMPONENT_CATEGORIES: () => COMPONENT_CATEGORIES,
28
- COMPONENT_META_SCHEMA_VERSION: () => COMPONENT_META_SCHEMA_VERSION,
29
- CURRENT_SCHEMA_VERSION: () => CURRENT_SCHEMA_VERSION,
30
- DATA_QUERY_SPEC_VERSION: () => DATA_QUERY_SPEC_VERSION,
31
- ErrorCode: () => ErrorCode,
32
- ErrorCodeCategory: () => ErrorCodeCategory,
33
- ErrorMessages: () => ErrorMessages,
34
- PAGE_SCHEMA_VERSION: () => PAGE_SCHEMA_VERSION,
35
- PublishStatus: () => PublishStatus,
36
- SCHEMA_VERSIONS: () => SCHEMA_VERSIONS,
37
- compareVersions: () => compareVersions,
38
- createDjvlcError: () => createDjvlcError,
39
- createExpressionBinding: () => createExpressionBinding,
40
- findMigrationPath: () => findMigrationPath,
41
- getAllMigrations: () => getAllMigrations,
42
- getContractsVersion: () => getContractsVersion,
43
- getHttpStatusFromErrorCode: () => getHttpStatusFromErrorCode,
44
- getVersionInfo: () => getVersionInfo,
45
- isExpressionBinding: () => isExpressionBinding,
46
- isRetryableError: () => isRetryableError,
47
- isVersionCompatible: () => isVersionCompatible,
48
- migratePageSchema: () => migratePageSchema,
49
- needsMigration: () => needsMigration,
50
- registerMigration: () => registerMigration
51
- });
52
- module.exports = __toCommonJS(index_exports);
1
+ 'use strict';
53
2
 
54
- // src/version.ts
55
- var PAGE_SCHEMA_VERSION = "1.0.0";
56
- var COMPONENT_META_SCHEMA_VERSION = "1.0.0";
57
- var ACTION_SPEC_VERSION = "1.0.0";
58
- var DATA_QUERY_SPEC_VERSION = "1.0.0";
59
- function getContractsVersion() {
60
- return {
61
- pageSchema: PAGE_SCHEMA_VERSION,
62
- componentMeta: COMPONENT_META_SCHEMA_VERSION,
63
- actionSpec: ACTION_SPEC_VERSION,
64
- dataQuerySpec: DATA_QUERY_SPEC_VERSION
65
- };
66
- }
67
- function isVersionCompatible(required, current) {
68
- const [reqMajor, reqMinor] = required.split(".").map(Number);
69
- const [curMajor, curMinor] = current.split(".").map(Number);
70
- return curMajor === reqMajor && curMinor >= reqMinor;
71
- }
72
-
73
- // src/errors/index.ts
3
+ // src/common/errors.ts
4
+ var ErrorCategory = /* @__PURE__ */ ((ErrorCategory2) => {
5
+ ErrorCategory2["SYSTEM"] = "SYSTEM";
6
+ ErrorCategory2["AUTH"] = "AUTH";
7
+ ErrorCategory2["PERMISSION"] = "PERMISSION";
8
+ ErrorCategory2["RESOURCE"] = "RESOURCE";
9
+ ErrorCategory2["VALIDATION"] = "VALIDATION";
10
+ ErrorCategory2["BUSINESS"] = "BUSINESS";
11
+ ErrorCategory2["RISK"] = "RISK";
12
+ return ErrorCategory2;
13
+ })(ErrorCategory || {});
74
14
  var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
75
- ErrorCode2[ErrorCode2["UNKNOWN"] = 1e3] = "UNKNOWN";
76
- ErrorCode2[ErrorCode2["INVALID_REQUEST"] = 1001] = "INVALID_REQUEST";
77
- ErrorCode2[ErrorCode2["UNAUTHORIZED"] = 1002] = "UNAUTHORIZED";
78
- ErrorCode2[ErrorCode2["FORBIDDEN"] = 1003] = "FORBIDDEN";
79
- ErrorCode2[ErrorCode2["NOT_FOUND"] = 1004] = "NOT_FOUND";
80
- ErrorCode2[ErrorCode2["RATE_LIMITED"] = 1005] = "RATE_LIMITED";
81
- ErrorCode2[ErrorCode2["VALIDATION_ERROR"] = 1006] = "VALIDATION_ERROR";
82
- ErrorCode2[ErrorCode2["INTERNAL_ERROR"] = 1007] = "INTERNAL_ERROR";
83
- ErrorCode2[ErrorCode2["SERVICE_UNAVAILABLE"] = 1008] = "SERVICE_UNAVAILABLE";
84
- ErrorCode2[ErrorCode2["TIMEOUT"] = 1009] = "TIMEOUT";
85
- ErrorCode2[ErrorCode2["ACTION_NOT_FOUND"] = 2001] = "ACTION_NOT_FOUND";
86
- ErrorCode2[ErrorCode2["ACTION_INVALID_PARAMS"] = 2002] = "ACTION_INVALID_PARAMS";
87
- ErrorCode2[ErrorCode2["ACTION_EXECUTION_FAILED"] = 2003] = "ACTION_EXECUTION_FAILED";
88
- ErrorCode2[ErrorCode2["ACTION_IDEMPOTENCY_CONFLICT"] = 2004] = "ACTION_IDEMPOTENCY_CONFLICT";
89
- ErrorCode2[ErrorCode2["ACTION_BLOCKED"] = 2005] = "ACTION_BLOCKED";
90
- ErrorCode2[ErrorCode2["ACTION_RISK_REJECTED"] = 2006] = "ACTION_RISK_REJECTED";
91
- ErrorCode2[ErrorCode2["ACTION_EXPIRED"] = 2007] = "ACTION_EXPIRED";
92
- ErrorCode2[ErrorCode2["ACTION_QUOTA_EXCEEDED"] = 2008] = "ACTION_QUOTA_EXCEEDED";
93
- ErrorCode2[ErrorCode2["QUERY_NOT_FOUND"] = 3001] = "QUERY_NOT_FOUND";
94
- ErrorCode2[ErrorCode2["QUERY_INVALID_PARAMS"] = 3002] = "QUERY_INVALID_PARAMS";
95
- ErrorCode2[ErrorCode2["QUERY_EXECUTION_FAILED"] = 3003] = "QUERY_EXECUTION_FAILED";
96
- ErrorCode2[ErrorCode2["QUERY_FIELD_NOT_ALLOWED"] = 3004] = "QUERY_FIELD_NOT_ALLOWED";
97
- ErrorCode2[ErrorCode2["QUERY_TIMEOUT"] = 3005] = "QUERY_TIMEOUT";
98
- ErrorCode2[ErrorCode2["QUERY_DISABLED"] = 3006] = "QUERY_DISABLED";
99
- ErrorCode2[ErrorCode2["COMPONENT_NOT_FOUND"] = 4001] = "COMPONENT_NOT_FOUND";
100
- ErrorCode2[ErrorCode2["COMPONENT_VERSION_NOT_FOUND"] = 4002] = "COMPONENT_VERSION_NOT_FOUND";
101
- ErrorCode2[ErrorCode2["COMPONENT_BLOCKED"] = 4003] = "COMPONENT_BLOCKED";
102
- ErrorCode2[ErrorCode2["COMPONENT_INTEGRITY_MISMATCH"] = 4004] = "COMPONENT_INTEGRITY_MISMATCH";
103
- ErrorCode2[ErrorCode2["COMPONENT_INCOMPATIBLE"] = 4005] = "COMPONENT_INCOMPATIBLE";
104
- ErrorCode2[ErrorCode2["COMPONENT_LOAD_FAILED"] = 4006] = "COMPONENT_LOAD_FAILED";
105
- ErrorCode2[ErrorCode2["COMPONENT_RENDER_ERROR"] = 4007] = "COMPONENT_RENDER_ERROR";
106
- ErrorCode2[ErrorCode2["PAGE_NOT_FOUND"] = 5001] = "PAGE_NOT_FOUND";
107
- ErrorCode2[ErrorCode2["PAGE_VERSION_NOT_FOUND"] = 5002] = "PAGE_VERSION_NOT_FOUND";
108
- ErrorCode2[ErrorCode2["PAGE_SCHEMA_INVALID"] = 5003] = "PAGE_SCHEMA_INVALID";
109
- ErrorCode2[ErrorCode2["PAGE_MANIFEST_INVALID"] = 5004] = "PAGE_MANIFEST_INVALID";
110
- ErrorCode2[ErrorCode2["PAGE_PUBLISH_FAILED"] = 5005] = "PAGE_PUBLISH_FAILED";
111
- ErrorCode2[ErrorCode2["PAGE_ROLLBACK_FAILED"] = 5006] = "PAGE_ROLLBACK_FAILED";
112
- ErrorCode2[ErrorCode2["ACTIVITY_NOT_FOUND"] = 6001] = "ACTIVITY_NOT_FOUND";
113
- ErrorCode2[ErrorCode2["ACTIVITY_NOT_STARTED"] = 6002] = "ACTIVITY_NOT_STARTED";
114
- ErrorCode2[ErrorCode2["ACTIVITY_ENDED"] = 6003] = "ACTIVITY_ENDED";
115
- ErrorCode2[ErrorCode2["ACTIVITY_ALREADY_CLAIMED"] = 6004] = "ACTIVITY_ALREADY_CLAIMED";
116
- ErrorCode2[ErrorCode2["ACTIVITY_ALREADY_SIGNED"] = 6005] = "ACTIVITY_ALREADY_SIGNED";
117
- ErrorCode2[ErrorCode2["ACTIVITY_LIMIT_EXCEEDED"] = 6006] = "ACTIVITY_LIMIT_EXCEEDED";
118
- ErrorCode2[ErrorCode2["ACTIVITY_DISABLED"] = 6007] = "ACTIVITY_DISABLED";
119
- ErrorCode2[ErrorCode2["EXPRESSION_SYNTAX_ERROR"] = 7001] = "EXPRESSION_SYNTAX_ERROR";
120
- ErrorCode2[ErrorCode2["EXPRESSION_UNKNOWN_FUNCTION"] = 7002] = "EXPRESSION_UNKNOWN_FUNCTION";
121
- ErrorCode2[ErrorCode2["EXPRESSION_INVALID_ARGUMENT"] = 7003] = "EXPRESSION_INVALID_ARGUMENT";
122
- ErrorCode2[ErrorCode2["EXPRESSION_UNKNOWN_VARIABLE"] = 7004] = "EXPRESSION_UNKNOWN_VARIABLE";
123
- ErrorCode2[ErrorCode2["EXPRESSION_TYPE_MISMATCH"] = 7005] = "EXPRESSION_TYPE_MISMATCH";
124
- ErrorCode2[ErrorCode2["EXPRESSION_ACCESS_DENIED"] = 7006] = "EXPRESSION_ACCESS_DENIED";
125
- ErrorCode2[ErrorCode2["SCHEMA_VERSION_MISMATCH"] = 8001] = "SCHEMA_VERSION_MISMATCH";
126
- ErrorCode2[ErrorCode2["MIGRATION_FAILED"] = 8002] = "MIGRATION_FAILED";
127
- ErrorCode2[ErrorCode2["MIGRATION_NOT_FOUND"] = 8003] = "MIGRATION_NOT_FOUND";
128
- ErrorCode2[ErrorCode2["VERSION_INCOMPATIBLE"] = 8004] = "VERSION_INCOMPATIBLE";
15
+ ErrorCode2["SYSTEM_INTERNAL_ERROR"] = "SYSTEM_INTERNAL_ERROR";
16
+ ErrorCode2["SYSTEM_SERVICE_UNAVAILABLE"] = "SYSTEM_SERVICE_UNAVAILABLE";
17
+ ErrorCode2["SYSTEM_TIMEOUT"] = "SYSTEM_TIMEOUT";
18
+ ErrorCode2["SYSTEM_DATABASE_ERROR"] = "SYSTEM_DATABASE_ERROR";
19
+ ErrorCode2["SYSTEM_REDIS_ERROR"] = "SYSTEM_REDIS_ERROR";
20
+ ErrorCode2["AUTH_TOKEN_MISSING"] = "AUTH_TOKEN_MISSING";
21
+ ErrorCode2["AUTH_TOKEN_INVALID"] = "AUTH_TOKEN_INVALID";
22
+ ErrorCode2["AUTH_TOKEN_EXPIRED"] = "AUTH_TOKEN_EXPIRED";
23
+ ErrorCode2["AUTH_SIGNATURE_INVALID"] = "AUTH_SIGNATURE_INVALID";
24
+ ErrorCode2["AUTH_SESSION_EXPIRED"] = "AUTH_SESSION_EXPIRED";
25
+ ErrorCode2["PERMISSION_DENIED"] = "PERMISSION_DENIED";
26
+ ErrorCode2["PERMISSION_RESOURCE_FORBIDDEN"] = "PERMISSION_RESOURCE_FORBIDDEN";
27
+ ErrorCode2["PERMISSION_ACTION_FORBIDDEN"] = "PERMISSION_ACTION_FORBIDDEN";
28
+ ErrorCode2["RESOURCE_NOT_FOUND"] = "RESOURCE_NOT_FOUND";
29
+ ErrorCode2["RESOURCE_PAGE_NOT_FOUND"] = "RESOURCE_PAGE_NOT_FOUND";
30
+ ErrorCode2["RESOURCE_COMPONENT_NOT_FOUND"] = "RESOURCE_COMPONENT_NOT_FOUND";
31
+ ErrorCode2["RESOURCE_ACTION_NOT_FOUND"] = "RESOURCE_ACTION_NOT_FOUND";
32
+ ErrorCode2["RESOURCE_VERSION_NOT_FOUND"] = "RESOURCE_VERSION_NOT_FOUND";
33
+ ErrorCode2["VALIDATION_INVALID_PARAMS"] = "VALIDATION_INVALID_PARAMS";
34
+ ErrorCode2["VALIDATION_SCHEMA_MISMATCH"] = "VALIDATION_SCHEMA_MISMATCH";
35
+ ErrorCode2["VALIDATION_EXPRESSION_ERROR"] = "VALIDATION_EXPRESSION_ERROR";
36
+ ErrorCode2["VALIDATION_FIELD_REQUIRED"] = "VALIDATION_FIELD_REQUIRED";
37
+ ErrorCode2["VALIDATION_FIELD_TYPE_ERROR"] = "VALIDATION_FIELD_TYPE_ERROR";
38
+ ErrorCode2["BUSINESS_ACTIVITY_NOT_STARTED"] = "BUSINESS_ACTIVITY_NOT_STARTED";
39
+ ErrorCode2["BUSINESS_ACTIVITY_ENDED"] = "BUSINESS_ACTIVITY_ENDED";
40
+ ErrorCode2["BUSINESS_ALREADY_CLAIMED"] = "BUSINESS_ALREADY_CLAIMED";
41
+ ErrorCode2["BUSINESS_ALREADY_SIGNED"] = "BUSINESS_ALREADY_SIGNED";
42
+ ErrorCode2["BUSINESS_STOCK_EXHAUSTED"] = "BUSINESS_STOCK_EXHAUSTED";
43
+ ErrorCode2["BUSINESS_QUOTA_EXCEEDED"] = "BUSINESS_QUOTA_EXCEEDED";
44
+ ErrorCode2["BUSINESS_PREREQUISITE_NOT_MET"] = "BUSINESS_PREREQUISITE_NOT_MET";
45
+ ErrorCode2["RISK_RATE_LIMITED"] = "RISK_RATE_LIMITED";
46
+ ErrorCode2["RISK_BLOCKED"] = "RISK_BLOCKED";
47
+ ErrorCode2["RISK_CAPTCHA_REQUIRED"] = "RISK_CAPTCHA_REQUIRED";
48
+ ErrorCode2["RISK_DEVICE_ABNORMAL"] = "RISK_DEVICE_ABNORMAL";
49
+ ErrorCode2["RISK_IDEMPOTENCY_CONFLICT"] = "RISK_IDEMPOTENCY_CONFLICT";
50
+ ErrorCode2["COMPONENT_LOAD_FAILED"] = "COMPONENT_LOAD_FAILED";
51
+ ErrorCode2["COMPONENT_INTEGRITY_MISMATCH"] = "COMPONENT_INTEGRITY_MISMATCH";
52
+ ErrorCode2["COMPONENT_BLOCKED"] = "COMPONENT_BLOCKED";
53
+ ErrorCode2["COMPONENT_DEPRECATED"] = "COMPONENT_DEPRECATED";
54
+ ErrorCode2["COMPONENT_INCOMPATIBLE"] = "COMPONENT_INCOMPATIBLE";
55
+ ErrorCode2["PUBLISH_VERSION_CONFLICT"] = "PUBLISH_VERSION_CONFLICT";
56
+ ErrorCode2["PUBLISH_VALIDATION_FAILED"] = "PUBLISH_VALIDATION_FAILED";
57
+ ErrorCode2["PUBLISH_ROLLBACK_FAILED"] = "PUBLISH_ROLLBACK_FAILED";
129
58
  return ErrorCode2;
130
59
  })(ErrorCode || {});
131
- var ErrorCodeCategory = {
132
- GENERAL: [1e3, 1999],
133
- ACTION: [2e3, 2999],
134
- QUERY: [3e3, 3999],
135
- COMPONENT: [4e3, 4999],
136
- PAGE: [5e3, 5999],
137
- ACTIVITY: [6e3, 6999],
138
- EXPRESSION: [7e3, 7999],
139
- VERSION: [8e3, 8999]
60
+ var ErrorCodeToHttpStatus = {
61
+ // 系统错误 -> 500
62
+ ["SYSTEM_INTERNAL_ERROR" /* SYSTEM_INTERNAL_ERROR */]: 500,
63
+ ["SYSTEM_SERVICE_UNAVAILABLE" /* SYSTEM_SERVICE_UNAVAILABLE */]: 503,
64
+ ["SYSTEM_TIMEOUT" /* SYSTEM_TIMEOUT */]: 504,
65
+ ["SYSTEM_DATABASE_ERROR" /* SYSTEM_DATABASE_ERROR */]: 500,
66
+ ["SYSTEM_REDIS_ERROR" /* SYSTEM_REDIS_ERROR */]: 500,
67
+ // 认证错误 -> 401
68
+ ["AUTH_TOKEN_MISSING" /* AUTH_TOKEN_MISSING */]: 401,
69
+ ["AUTH_TOKEN_INVALID" /* AUTH_TOKEN_INVALID */]: 401,
70
+ ["AUTH_TOKEN_EXPIRED" /* AUTH_TOKEN_EXPIRED */]: 401,
71
+ ["AUTH_SIGNATURE_INVALID" /* AUTH_SIGNATURE_INVALID */]: 401,
72
+ ["AUTH_SESSION_EXPIRED" /* AUTH_SESSION_EXPIRED */]: 401,
73
+ // 权限错误 -> 403
74
+ ["PERMISSION_DENIED" /* PERMISSION_DENIED */]: 403,
75
+ ["PERMISSION_RESOURCE_FORBIDDEN" /* PERMISSION_RESOURCE_FORBIDDEN */]: 403,
76
+ ["PERMISSION_ACTION_FORBIDDEN" /* PERMISSION_ACTION_FORBIDDEN */]: 403,
77
+ // 资源错误 -> 404
78
+ ["RESOURCE_NOT_FOUND" /* RESOURCE_NOT_FOUND */]: 404,
79
+ ["RESOURCE_PAGE_NOT_FOUND" /* RESOURCE_PAGE_NOT_FOUND */]: 404,
80
+ ["RESOURCE_COMPONENT_NOT_FOUND" /* RESOURCE_COMPONENT_NOT_FOUND */]: 404,
81
+ ["RESOURCE_ACTION_NOT_FOUND" /* RESOURCE_ACTION_NOT_FOUND */]: 404,
82
+ ["RESOURCE_VERSION_NOT_FOUND" /* RESOURCE_VERSION_NOT_FOUND */]: 404,
83
+ // 参数错误 -> 400
84
+ ["VALIDATION_INVALID_PARAMS" /* VALIDATION_INVALID_PARAMS */]: 400,
85
+ ["VALIDATION_SCHEMA_MISMATCH" /* VALIDATION_SCHEMA_MISMATCH */]: 400,
86
+ ["VALIDATION_EXPRESSION_ERROR" /* VALIDATION_EXPRESSION_ERROR */]: 400,
87
+ ["VALIDATION_FIELD_REQUIRED" /* VALIDATION_FIELD_REQUIRED */]: 400,
88
+ ["VALIDATION_FIELD_TYPE_ERROR" /* VALIDATION_FIELD_TYPE_ERROR */]: 400,
89
+ // 业务错误 -> 422
90
+ ["BUSINESS_ACTIVITY_NOT_STARTED" /* BUSINESS_ACTIVITY_NOT_STARTED */]: 422,
91
+ ["BUSINESS_ACTIVITY_ENDED" /* BUSINESS_ACTIVITY_ENDED */]: 422,
92
+ ["BUSINESS_ALREADY_CLAIMED" /* BUSINESS_ALREADY_CLAIMED */]: 422,
93
+ ["BUSINESS_ALREADY_SIGNED" /* BUSINESS_ALREADY_SIGNED */]: 422,
94
+ ["BUSINESS_STOCK_EXHAUSTED" /* BUSINESS_STOCK_EXHAUSTED */]: 422,
95
+ ["BUSINESS_QUOTA_EXCEEDED" /* BUSINESS_QUOTA_EXCEEDED */]: 422,
96
+ ["BUSINESS_PREREQUISITE_NOT_MET" /* BUSINESS_PREREQUISITE_NOT_MET */]: 422,
97
+ // 风控错误 -> 429
98
+ ["RISK_RATE_LIMITED" /* RISK_RATE_LIMITED */]: 429,
99
+ ["RISK_BLOCKED" /* RISK_BLOCKED */]: 403,
100
+ ["RISK_CAPTCHA_REQUIRED" /* RISK_CAPTCHA_REQUIRED */]: 428,
101
+ ["RISK_DEVICE_ABNORMAL" /* RISK_DEVICE_ABNORMAL */]: 403,
102
+ ["RISK_IDEMPOTENCY_CONFLICT" /* RISK_IDEMPOTENCY_CONFLICT */]: 409,
103
+ // 组件错误 -> 500/503
104
+ ["COMPONENT_LOAD_FAILED" /* COMPONENT_LOAD_FAILED */]: 500,
105
+ ["COMPONENT_INTEGRITY_MISMATCH" /* COMPONENT_INTEGRITY_MISMATCH */]: 500,
106
+ ["COMPONENT_BLOCKED" /* COMPONENT_BLOCKED */]: 503,
107
+ ["COMPONENT_DEPRECATED" /* COMPONENT_DEPRECATED */]: 410,
108
+ ["COMPONENT_INCOMPATIBLE" /* COMPONENT_INCOMPATIBLE */]: 500,
109
+ // 发布错误 -> 409/400
110
+ ["PUBLISH_VERSION_CONFLICT" /* PUBLISH_VERSION_CONFLICT */]: 409,
111
+ ["PUBLISH_VALIDATION_FAILED" /* PUBLISH_VALIDATION_FAILED */]: 400,
112
+ ["PUBLISH_ROLLBACK_FAILED" /* PUBLISH_ROLLBACK_FAILED */]: 500
140
113
  };
141
- var ErrorMessages = {
142
- // 通用错误
143
- [1e3 /* UNKNOWN */]: "\u672A\u77E5\u9519\u8BEF",
144
- [1001 /* INVALID_REQUEST */]: "\u8BF7\u6C42\u53C2\u6570\u65E0\u6548",
145
- [1002 /* UNAUTHORIZED */]: "\u672A\u6388\u6743\u8BBF\u95EE",
146
- [1003 /* FORBIDDEN */]: "\u7981\u6B62\u8BBF\u95EE",
147
- [1004 /* NOT_FOUND */]: "\u8D44\u6E90\u4E0D\u5B58\u5728",
148
- [1005 /* RATE_LIMITED */]: "\u8BF7\u6C42\u9891\u7387\u8D85\u9650",
149
- [1006 /* VALIDATION_ERROR */]: "\u6570\u636E\u6821\u9A8C\u5931\u8D25",
150
- [1007 /* INTERNAL_ERROR */]: "\u670D\u52A1\u5185\u90E8\u9519\u8BEF",
151
- [1008 /* SERVICE_UNAVAILABLE */]: "\u670D\u52A1\u6682\u4E0D\u53EF\u7528",
152
- [1009 /* TIMEOUT */]: "\u8BF7\u6C42\u8D85\u65F6",
153
- // Action 错误
154
- [2001 /* ACTION_NOT_FOUND */]: "\u52A8\u4F5C\u4E0D\u5B58\u5728",
155
- [2002 /* ACTION_INVALID_PARAMS */]: "\u52A8\u4F5C\u53C2\u6570\u65E0\u6548",
156
- [2003 /* ACTION_EXECUTION_FAILED */]: "\u52A8\u4F5C\u6267\u884C\u5931\u8D25",
157
- [2004 /* ACTION_IDEMPOTENCY_CONFLICT */]: "\u91CD\u590D\u8BF7\u6C42",
158
- [2005 /* ACTION_BLOCKED */]: "\u52A8\u4F5C\u5DF2\u88AB\u7981\u7528",
159
- [2006 /* ACTION_RISK_REJECTED */]: "\u98CE\u63A7\u62D2\u7EDD",
160
- [2007 /* ACTION_EXPIRED */]: "\u52A8\u4F5C\u5DF2\u8FC7\u671F",
161
- [2008 /* ACTION_QUOTA_EXCEEDED */]: "\u914D\u989D\u5DF2\u7528\u5C3D",
162
- // Data Query 错误
163
- [3001 /* QUERY_NOT_FOUND */]: "\u67E5\u8BE2\u4E0D\u5B58\u5728",
164
- [3002 /* QUERY_INVALID_PARAMS */]: "\u67E5\u8BE2\u53C2\u6570\u65E0\u6548",
165
- [3003 /* QUERY_EXECUTION_FAILED */]: "\u67E5\u8BE2\u6267\u884C\u5931\u8D25",
166
- [3004 /* QUERY_FIELD_NOT_ALLOWED */]: "\u5B57\u6BB5\u8BBF\u95EE\u88AB\u62D2\u7EDD",
167
- [3005 /* QUERY_TIMEOUT */]: "\u67E5\u8BE2\u8D85\u65F6",
168
- [3006 /* QUERY_DISABLED */]: "\u67E5\u8BE2\u5DF2\u7981\u7528",
169
- // 组件错误
170
- [4001 /* COMPONENT_NOT_FOUND */]: "\u7EC4\u4EF6\u4E0D\u5B58\u5728",
171
- [4002 /* COMPONENT_VERSION_NOT_FOUND */]: "\u7EC4\u4EF6\u7248\u672C\u4E0D\u5B58\u5728",
172
- [4003 /* COMPONENT_BLOCKED */]: "\u7EC4\u4EF6\u5DF2\u88AB\u7981\u7528",
173
- [4004 /* COMPONENT_INTEGRITY_MISMATCH */]: "\u7EC4\u4EF6\u5B8C\u6574\u6027\u6821\u9A8C\u5931\u8D25",
174
- [4005 /* COMPONENT_INCOMPATIBLE */]: "\u7EC4\u4EF6\u7248\u672C\u4E0D\u517C\u5BB9",
175
- [4006 /* COMPONENT_LOAD_FAILED */]: "\u7EC4\u4EF6\u52A0\u8F7D\u5931\u8D25",
176
- [4007 /* COMPONENT_RENDER_ERROR */]: "\u7EC4\u4EF6\u6E32\u67D3\u9519\u8BEF",
177
- // 页面错误
178
- [5001 /* PAGE_NOT_FOUND */]: "\u9875\u9762\u4E0D\u5B58\u5728",
179
- [5002 /* PAGE_VERSION_NOT_FOUND */]: "\u9875\u9762\u7248\u672C\u4E0D\u5B58\u5728",
180
- [5003 /* PAGE_SCHEMA_INVALID */]: "\u9875\u9762 Schema \u65E0\u6548",
181
- [5004 /* PAGE_MANIFEST_INVALID */]: "\u9875\u9762 Manifest \u65E0\u6548",
182
- [5005 /* PAGE_PUBLISH_FAILED */]: "\u9875\u9762\u53D1\u5E03\u5931\u8D25",
183
- [5006 /* PAGE_ROLLBACK_FAILED */]: "\u9875\u9762\u56DE\u6EDA\u5931\u8D25",
184
- // 活动错误
185
- [6001 /* ACTIVITY_NOT_FOUND */]: "\u6D3B\u52A8\u4E0D\u5B58\u5728",
186
- [6002 /* ACTIVITY_NOT_STARTED */]: "\u6D3B\u52A8\u672A\u5F00\u59CB",
187
- [6003 /* ACTIVITY_ENDED */]: "\u6D3B\u52A8\u5DF2\u7ED3\u675F",
188
- [6004 /* ACTIVITY_ALREADY_CLAIMED */]: "\u5DF2\u9886\u53D6\u8FC7",
189
- [6005 /* ACTIVITY_ALREADY_SIGNED */]: "\u4ECA\u65E5\u5DF2\u7B7E\u5230",
190
- [6006 /* ACTIVITY_LIMIT_EXCEEDED */]: "\u8D85\u51FA\u9886\u53D6\u9650\u5236",
191
- [6007 /* ACTIVITY_DISABLED */]: "\u6D3B\u52A8\u5DF2\u7981\u7528",
192
- // 表达式错误
193
- [7001 /* EXPRESSION_SYNTAX_ERROR */]: "\u8868\u8FBE\u5F0F\u8BED\u6CD5\u9519\u8BEF",
194
- [7002 /* EXPRESSION_UNKNOWN_FUNCTION */]: "\u672A\u77E5\u51FD\u6570",
195
- [7003 /* EXPRESSION_INVALID_ARGUMENT */]: "\u65E0\u6548\u53C2\u6570",
196
- [7004 /* EXPRESSION_UNKNOWN_VARIABLE */]: "\u672A\u77E5\u53D8\u91CF",
197
- [7005 /* EXPRESSION_TYPE_MISMATCH */]: "\u7C7B\u578B\u4E0D\u5339\u914D",
198
- [7006 /* EXPRESSION_ACCESS_DENIED */]: "\u8BBF\u95EE\u88AB\u62D2\u7EDD",
199
- // 版本/迁移错误
200
- [8001 /* SCHEMA_VERSION_MISMATCH */]: "Schema \u7248\u672C\u4E0D\u5339\u914D",
201
- [8002 /* MIGRATION_FAILED */]: "\u8FC1\u79FB\u5931\u8D25",
202
- [8003 /* MIGRATION_NOT_FOUND */]: "\u8FC1\u79FB\u811A\u672C\u4E0D\u5B58\u5728",
203
- [8004 /* VERSION_INCOMPATIBLE */]: "\u7248\u672C\u4E0D\u517C\u5BB9"
204
- };
205
- function createDjvlcError(code, details, traceId) {
206
- return {
207
- code,
208
- message: ErrorMessages[code] || "\u672A\u77E5\u9519\u8BEF",
209
- details,
210
- traceId,
211
- timestamp: Date.now()
212
- };
213
- }
214
- function getHttpStatusFromErrorCode(code) {
215
- if (code === 1002 /* UNAUTHORIZED */) return 401;
216
- if (code === 1003 /* FORBIDDEN */) return 403;
217
- if (code === 1004 /* NOT_FOUND */) return 404;
218
- if (code === 1005 /* RATE_LIMITED */) return 429;
219
- if (code === 1009 /* TIMEOUT */) return 408;
220
- if (code === 1008 /* SERVICE_UNAVAILABLE */) return 503;
221
- const numericCode = Number(code);
222
- if (numericCode >= 1e3 && numericCode < 2e3) return 400;
223
- if (numericCode >= 2e3 && numericCode < 3e3) return 400;
224
- if (numericCode >= 3e3 && numericCode < 4e3) return 400;
225
- if (numericCode >= 4e3 && numericCode < 5e3) return 404;
226
- if (numericCode >= 5e3 && numericCode < 6e3) return 404;
227
- if (numericCode >= 6e3 && numericCode < 7e3) return 400;
228
- if (numericCode >= 7e3 && numericCode < 8e3) return 400;
229
- if (numericCode >= 8e3 && numericCode < 9e3) return 400;
230
- return 500;
231
- }
232
- function isRetryableError(code) {
233
- return [
234
- 1009 /* TIMEOUT */,
235
- 1008 /* SERVICE_UNAVAILABLE */,
236
- 3005 /* QUERY_TIMEOUT */,
237
- 4006 /* COMPONENT_LOAD_FAILED */
238
- ].includes(code);
239
- }
240
114
 
241
- // src/page/index.ts
115
+ // src/common/status.ts
116
+ var VersionStatus = /* @__PURE__ */ ((VersionStatus2) => {
117
+ VersionStatus2["DRAFT"] = "draft";
118
+ VersionStatus2["STABLE"] = "stable";
119
+ VersionStatus2["DEPRECATED"] = "deprecated";
120
+ VersionStatus2["BLOCKED"] = "blocked";
121
+ return VersionStatus2;
122
+ })(VersionStatus || {});
123
+ var PublishChannel = /* @__PURE__ */ ((PublishChannel2) => {
124
+ PublishChannel2["PREVIEW"] = "preview";
125
+ PublishChannel2["GRAY"] = "gray";
126
+ PublishChannel2["PROD"] = "prod";
127
+ return PublishChannel2;
128
+ })(PublishChannel || {});
242
129
  var PublishStatus = /* @__PURE__ */ ((PublishStatus2) => {
243
130
  PublishStatus2["PENDING"] = "pending";
244
- PublishStatus2["PUBLISHING"] = "publishing";
131
+ PublishStatus2["PROCESSING"] = "processing";
245
132
  PublishStatus2["SUCCESS"] = "success";
246
133
  PublishStatus2["FAILED"] = "failed";
247
134
  PublishStatus2["ROLLBACK"] = "rollback";
248
135
  return PublishStatus2;
249
136
  })(PublishStatus || {});
250
137
 
251
- // src/component/index.ts
252
- var COMPONENT_CATEGORIES = [
253
- "basic",
254
- "form",
255
- "layout",
256
- "navigation",
257
- "feedback",
258
- "display",
259
- "data",
260
- "business",
261
- "chart",
262
- "other"
263
- ];
138
+ // src/common/audit.ts
139
+ var AuditAction = /* @__PURE__ */ ((AuditAction2) => {
140
+ AuditAction2["PAGE_CREATE"] = "page.create";
141
+ AuditAction2["PAGE_UPDATE"] = "page.update";
142
+ AuditAction2["PAGE_DELETE"] = "page.delete";
143
+ AuditAction2["PAGE_PUBLISH"] = "page.publish";
144
+ AuditAction2["PAGE_ROLLBACK"] = "page.rollback";
145
+ AuditAction2["COMPONENT_PUBLISH"] = "component.publish";
146
+ AuditAction2["COMPONENT_BLOCK"] = "component.block";
147
+ AuditAction2["COMPONENT_UNBLOCK"] = "component.unblock";
148
+ AuditAction2["ACTION_EXECUTE"] = "action.execute";
149
+ AuditAction2["DEFINITION_CREATE"] = "definition.create";
150
+ AuditAction2["DEFINITION_UPDATE"] = "definition.update";
151
+ AuditAction2["DEFINITION_PUBLISH"] = "definition.publish";
152
+ AuditAction2["SYSTEM_KILL_SWITCH"] = "system.kill_switch";
153
+ return AuditAction2;
154
+ })(AuditAction || {});
264
155
 
265
- // src/expression/index.ts
266
- var BUILTIN_FUNCTIONS = [
267
- // 字符串函数
156
+ // src/page/schema.ts
157
+ var CURRENT_SCHEMA_VERSION = "2.0.0";
158
+
159
+ // src/expression/functions.ts
160
+ var STRING_FUNCTIONS = [
268
161
  {
269
162
  name: "len",
270
- description: "\u83B7\u53D6\u5B57\u7B26\u4E32\u6216\u6570\u7EC4\u957F\u5EA6",
271
- params: [{ name: "value", type: "any", required: true }],
163
+ category: "string",
164
+ description: "\u83B7\u53D6\u5B57\u7B26\u4E32\u957F\u5EA6",
165
+ params: [{ name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" }],
272
166
  returnType: "number",
273
- examples: ['len("hello")', "len([1,2,3])"]
167
+ pure: true,
168
+ examples: ['len("hello") // 5', "len(state.name) // \u52A8\u6001\u83B7\u53D6"]
274
169
  },
275
170
  {
276
171
  name: "trim",
277
- description: "\u53BB\u9664\u5B57\u7B26\u4E32\u9996\u5C3E\u7A7A\u683C",
278
- params: [{ name: "str", type: "string", required: true }],
172
+ category: "string",
173
+ description: "\u53BB\u9664\u9996\u5C3E\u7A7A\u767D",
174
+ params: [{ name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" }],
279
175
  returnType: "string",
280
- examples: ['trim(" hello ")']
176
+ pure: true,
177
+ examples: ['trim(" hello ") // "hello"']
281
178
  },
282
179
  {
283
180
  name: "upper",
284
- description: "\u8F6C\u4E3A\u5927\u5199",
285
- params: [{ name: "str", type: "string", required: true }],
181
+ category: "string",
182
+ description: "\u8F6C\u6362\u4E3A\u5927\u5199",
183
+ params: [{ name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" }],
286
184
  returnType: "string",
287
- examples: ['upper("hello")']
185
+ pure: true,
186
+ examples: ['upper("hello") // "HELLO"']
288
187
  },
289
188
  {
290
189
  name: "lower",
291
- description: "\u8F6C\u4E3A\u5C0F\u5199",
292
- params: [{ name: "str", type: "string", required: true }],
190
+ category: "string",
191
+ description: "\u8F6C\u6362\u4E3A\u5C0F\u5199",
192
+ params: [{ name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" }],
293
193
  returnType: "string",
294
- examples: ['lower("HELLO")']
194
+ pure: true,
195
+ examples: ['lower("HELLO") // "hello"']
295
196
  },
296
197
  {
297
- name: "substr",
198
+ name: "substring",
199
+ category: "string",
298
200
  description: "\u622A\u53D6\u5B50\u5B57\u7B26\u4E32",
299
201
  params: [
300
- { name: "str", type: "string", required: true },
301
- { name: "start", type: "number", required: true },
302
- { name: "length", type: "number", required: false }
303
- ],
304
- returnType: "string",
305
- examples: ['substr("hello", 0, 2)']
306
- },
307
- {
308
- name: "concat",
309
- description: "\u8FDE\u63A5\u5B57\u7B26\u4E32",
310
- params: [
311
- { name: "values", type: "any", required: true, description: "\u53EF\u53D8\u53C2\u6570" }
202
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
203
+ { name: "start", type: "number", required: true, description: "\u8D77\u59CB\u4F4D\u7F6E" },
204
+ { name: "end", type: "number", required: false, description: "\u7ED3\u675F\u4F4D\u7F6E" }
312
205
  ],
313
206
  returnType: "string",
314
- examples: ['concat("a", "b", "c")']
207
+ pure: true,
208
+ examples: ['substring("hello", 0, 2) // "he"']
315
209
  },
316
210
  {
317
211
  name: "replace",
212
+ category: "string",
318
213
  description: "\u66FF\u6362\u5B57\u7B26\u4E32",
319
214
  params: [
320
- { name: "str", type: "string", required: true },
321
- { name: "search", type: "string", required: true },
322
- { name: "replacement", type: "string", required: true }
215
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
216
+ { name: "search", type: "string", required: true, description: "\u641C\u7D22\u5185\u5BB9" },
217
+ { name: "replacement", type: "string", required: true, description: "\u66FF\u6362\u5185\u5BB9" }
323
218
  ],
324
219
  returnType: "string",
325
- examples: ['replace("hello", "l", "x")']
220
+ pure: true,
221
+ examples: ['replace("hello", "l", "x") // "hexxo"']
326
222
  },
327
223
  {
328
224
  name: "split",
329
- description: "\u5206\u5272\u5B57\u7B26\u4E32",
225
+ category: "string",
226
+ description: "\u5206\u5272\u5B57\u7B26\u4E32\u4E3A\u6570\u7EC4",
330
227
  params: [
331
- { name: "str", type: "string", required: true },
332
- { name: "separator", type: "string", required: true }
228
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
229
+ { name: "separator", type: "string", required: true, description: "\u5206\u9694\u7B26" }
333
230
  ],
334
231
  returnType: "array",
335
- examples: ['split("a,b,c", ",")']
232
+ pure: true,
233
+ examples: ['split("a,b,c", ",") // ["a", "b", "c"]']
336
234
  },
337
235
  {
338
236
  name: "join",
339
- description: "\u8FDE\u63A5\u6570\u7EC4\u4E3A\u5B57\u7B26\u4E32",
237
+ category: "string",
238
+ description: "\u5408\u5E76\u6570\u7EC4\u4E3A\u5B57\u7B26\u4E32",
340
239
  params: [
341
- { name: "arr", type: "array", required: true },
342
- { name: "separator", type: "string", required: false, defaultValue: "," }
240
+ { name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" },
241
+ {
242
+ name: "separator",
243
+ type: "string",
244
+ required: false,
245
+ defaultValue: ",",
246
+ description: "\u5206\u9694\u7B26"
247
+ }
343
248
  ],
344
249
  returnType: "string",
345
- examples: ['join(["a","b","c"], "-")']
250
+ pure: true,
251
+ examples: ['join(["a", "b", "c"], "-") // "a-b-c"']
346
252
  },
347
- // 数字函数
348
253
  {
349
- name: "toNumber",
350
- description: "\u8F6C\u4E3A\u6570\u5B57",
351
- params: [{ name: "value", type: "any", required: true }],
352
- returnType: "number",
353
- examples: ['toNumber("123")']
254
+ name: "contains",
255
+ category: "string",
256
+ description: "\u68C0\u67E5\u662F\u5426\u5305\u542B\u5B50\u5B57\u7B26\u4E32",
257
+ params: [
258
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
259
+ { name: "search", type: "string", required: true, description: "\u641C\u7D22\u5185\u5BB9" }
260
+ ],
261
+ returnType: "boolean",
262
+ pure: true,
263
+ examples: ['contains("hello", "ell") // true']
354
264
  },
355
265
  {
356
- name: "toString",
357
- description: "\u8F6C\u4E3A\u5B57\u7B26\u4E32",
358
- params: [{ name: "value", type: "any", required: true }],
359
- returnType: "string",
360
- examples: ["toString(123)"]
266
+ name: "startsWith",
267
+ category: "string",
268
+ description: "\u68C0\u67E5\u662F\u5426\u4EE5\u6307\u5B9A\u524D\u7F00\u5F00\u59CB",
269
+ params: [
270
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
271
+ { name: "prefix", type: "string", required: true, description: "\u524D\u7F00" }
272
+ ],
273
+ returnType: "boolean",
274
+ pure: true,
275
+ examples: ['startsWith("hello", "he") // true']
276
+ },
277
+ {
278
+ name: "endsWith",
279
+ category: "string",
280
+ description: "\u68C0\u67E5\u662F\u5426\u4EE5\u6307\u5B9A\u540E\u7F00\u7ED3\u675F",
281
+ params: [
282
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
283
+ { name: "suffix", type: "string", required: true, description: "\u540E\u7F00" }
284
+ ],
285
+ returnType: "boolean",
286
+ pure: true,
287
+ examples: ['endsWith("hello", "lo") // true']
288
+ }
289
+ ];
290
+ var NUMBER_FUNCTIONS = [
291
+ {
292
+ name: "toNumber",
293
+ category: "number",
294
+ description: "\u8F6C\u6362\u4E3A\u6570\u5B57",
295
+ params: [
296
+ { name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" },
297
+ {
298
+ name: "defaultValue",
299
+ type: "number",
300
+ required: false,
301
+ defaultValue: 0,
302
+ description: "\u9ED8\u8BA4\u503C"
303
+ }
304
+ ],
305
+ returnType: "number",
306
+ pure: true,
307
+ examples: ['toNumber("123") // 123', 'toNumber("abc", 0) // 0']
361
308
  },
362
309
  {
363
310
  name: "round",
311
+ category: "number",
364
312
  description: "\u56DB\u820D\u4E94\u5165",
365
313
  params: [
366
- { name: "value", type: "number", required: true },
367
- { name: "decimals", type: "number", required: false, defaultValue: 0 }
314
+ { name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" },
315
+ {
316
+ name: "decimals",
317
+ type: "number",
318
+ required: false,
319
+ defaultValue: 0,
320
+ description: "\u5C0F\u6570\u4F4D\u6570"
321
+ }
368
322
  ],
369
323
  returnType: "number",
370
- examples: ["round(3.14159, 2)"]
324
+ pure: true,
325
+ examples: ["round(3.14159, 2) // 3.14"]
371
326
  },
372
327
  {
373
328
  name: "floor",
329
+ category: "number",
374
330
  description: "\u5411\u4E0B\u53D6\u6574",
375
- params: [{ name: "value", type: "number", required: true }],
331
+ params: [{ name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" }],
376
332
  returnType: "number",
377
- examples: ["floor(3.7)"]
333
+ pure: true,
334
+ examples: ["floor(3.7) // 3"]
378
335
  },
379
336
  {
380
337
  name: "ceil",
338
+ category: "number",
381
339
  description: "\u5411\u4E0A\u53D6\u6574",
382
- params: [{ name: "value", type: "number", required: true }],
340
+ params: [{ name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" }],
383
341
  returnType: "number",
384
- examples: ["ceil(3.2)"]
342
+ pure: true,
343
+ examples: ["ceil(3.2) // 4"]
385
344
  },
386
345
  {
387
346
  name: "abs",
347
+ category: "number",
388
348
  description: "\u7EDD\u5BF9\u503C",
389
- params: [{ name: "value", type: "number", required: true }],
349
+ params: [{ name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" }],
390
350
  returnType: "number",
391
- examples: ["abs(-5)"]
351
+ pure: true,
352
+ examples: ["abs(-5) // 5"]
392
353
  },
393
354
  {
394
355
  name: "min",
356
+ category: "number",
395
357
  description: "\u6700\u5C0F\u503C",
396
358
  params: [
397
- { name: "values", type: "number", required: true, description: "\u53EF\u53D8\u53C2\u6570" }
359
+ { name: "values", type: "number", required: true, variadic: true, description: "\u6570\u5B57\u5217\u8868" }
398
360
  ],
399
361
  returnType: "number",
400
- examples: ["min(1, 2, 3)"]
362
+ pure: true,
363
+ examples: ["min(1, 2, 3) // 1"]
401
364
  },
402
365
  {
403
366
  name: "max",
367
+ category: "number",
404
368
  description: "\u6700\u5927\u503C",
405
369
  params: [
406
- { name: "values", type: "number", required: true, description: "\u53EF\u53D8\u53C2\u6570" }
370
+ { name: "values", type: "number", required: true, variadic: true, description: "\u6570\u5B57\u5217\u8868" }
371
+ ],
372
+ returnType: "number",
373
+ pure: true,
374
+ examples: ["max(1, 2, 3) // 3"]
375
+ },
376
+ {
377
+ name: "clamp",
378
+ category: "number",
379
+ description: "\u9650\u5236\u8303\u56F4",
380
+ params: [
381
+ { name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" },
382
+ { name: "min", type: "number", required: true, description: "\u6700\u5C0F\u503C" },
383
+ { name: "max", type: "number", required: true, description: "\u6700\u5927\u503C" }
407
384
  ],
408
385
  returnType: "number",
409
- examples: ["max(1, 2, 3)"]
386
+ pure: true,
387
+ examples: ["clamp(5, 0, 3) // 3"]
388
+ }
389
+ ];
390
+ var ARRAY_FUNCTIONS = [
391
+ {
392
+ name: "length",
393
+ category: "array",
394
+ description: "\u83B7\u53D6\u6570\u7EC4\u957F\u5EA6",
395
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
396
+ returnType: "number",
397
+ pure: true,
398
+ examples: ["length([1, 2, 3]) // 3"]
410
399
  },
411
- // 日期函数
400
+ {
401
+ name: "first",
402
+ category: "array",
403
+ description: "\u83B7\u53D6\u7B2C\u4E00\u4E2A\u5143\u7D20",
404
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
405
+ returnType: "any",
406
+ pure: true,
407
+ examples: ["first([1, 2, 3]) // 1"]
408
+ },
409
+ {
410
+ name: "last",
411
+ category: "array",
412
+ description: "\u83B7\u53D6\u6700\u540E\u4E00\u4E2A\u5143\u7D20",
413
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
414
+ returnType: "any",
415
+ pure: true,
416
+ examples: ["last([1, 2, 3]) // 3"]
417
+ },
418
+ {
419
+ name: "at",
420
+ category: "array",
421
+ description: "\u83B7\u53D6\u6307\u5B9A\u7D22\u5F15\u7684\u5143\u7D20",
422
+ params: [
423
+ { name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" },
424
+ { name: "index", type: "number", required: true, description: "\u7D22\u5F15" }
425
+ ],
426
+ returnType: "any",
427
+ pure: true,
428
+ examples: ["at([1, 2, 3], 1) // 2"]
429
+ },
430
+ {
431
+ name: "includes",
432
+ category: "array",
433
+ description: "\u68C0\u67E5\u662F\u5426\u5305\u542B\u5143\u7D20",
434
+ params: [
435
+ { name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" },
436
+ { name: "value", type: "any", required: true, description: "\u641C\u7D22\u503C" }
437
+ ],
438
+ returnType: "boolean",
439
+ pure: true,
440
+ examples: ["includes([1, 2, 3], 2) // true"]
441
+ },
442
+ {
443
+ name: "slice",
444
+ category: "array",
445
+ description: "\u622A\u53D6\u6570\u7EC4",
446
+ params: [
447
+ { name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" },
448
+ { name: "start", type: "number", required: true, description: "\u8D77\u59CB\u4F4D\u7F6E" },
449
+ { name: "end", type: "number", required: false, description: "\u7ED3\u675F\u4F4D\u7F6E" }
450
+ ],
451
+ returnType: "array",
452
+ pure: true,
453
+ examples: ["slice([1, 2, 3, 4], 1, 3) // [2, 3]"]
454
+ },
455
+ {
456
+ name: "concat",
457
+ category: "array",
458
+ description: "\u5408\u5E76\u6570\u7EC4",
459
+ params: [
460
+ { name: "arrays", type: "array", required: true, variadic: true, description: "\u6570\u7EC4\u5217\u8868" }
461
+ ],
462
+ returnType: "array",
463
+ pure: true,
464
+ examples: ["concat([1, 2], [3, 4]) // [1, 2, 3, 4]"]
465
+ },
466
+ {
467
+ name: "unique",
468
+ category: "array",
469
+ description: "\u53BB\u91CD",
470
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
471
+ returnType: "array",
472
+ pure: true,
473
+ examples: ["unique([1, 2, 2, 3]) // [1, 2, 3]"]
474
+ },
475
+ {
476
+ name: "reverse",
477
+ category: "array",
478
+ description: "\u53CD\u8F6C\u6570\u7EC4",
479
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
480
+ returnType: "array",
481
+ pure: true,
482
+ examples: ["reverse([1, 2, 3]) // [3, 2, 1]"]
483
+ },
484
+ {
485
+ name: "sum",
486
+ category: "array",
487
+ description: "\u6C42\u548C",
488
+ params: [{ name: "arr", type: "array", required: true, description: "\u6570\u5B57\u6570\u7EC4" }],
489
+ returnType: "number",
490
+ pure: true,
491
+ examples: ["sum([1, 2, 3]) // 6"]
492
+ },
493
+ {
494
+ name: "average",
495
+ category: "array",
496
+ description: "\u5E73\u5747\u503C",
497
+ params: [{ name: "arr", type: "array", required: true, description: "\u6570\u5B57\u6570\u7EC4" }],
498
+ returnType: "number",
499
+ pure: true,
500
+ examples: ["average([1, 2, 3]) // 2"]
501
+ }
502
+ ];
503
+ var DATE_FUNCTIONS = [
412
504
  {
413
505
  name: "now",
414
- description: "\u5F53\u524D\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09",
506
+ category: "date",
507
+ description: "\u5F53\u524D\u65F6\u95F4\u6233",
415
508
  params: [],
416
509
  returnType: "number",
417
- examples: ["now()"]
510
+ pure: false,
511
+ examples: ["now() // 1704067200000"]
512
+ },
513
+ {
514
+ name: "today",
515
+ category: "date",
516
+ description: "\u4ECA\u5929\u65E5\u671F\uFF08YYYY-MM-DD\uFF09",
517
+ params: [],
518
+ returnType: "string",
519
+ pure: false,
520
+ examples: ['today() // "2024-01-01"']
418
521
  },
419
522
  {
420
523
  name: "dateFormat",
524
+ category: "date",
421
525
  description: "\u683C\u5F0F\u5316\u65E5\u671F",
422
526
  params: [
423
- { name: "timestamp", type: "number", required: true },
424
- { name: "format", type: "string", required: false, defaultValue: "YYYY-MM-DD" }
527
+ { name: "date", type: "any", required: true, description: "\u65E5\u671F\uFF08\u65F6\u95F4\u6233\u6216\u5B57\u7B26\u4E32\uFF09" },
528
+ { name: "format", type: "string", required: true, description: "\u683C\u5F0F\u6A21\u677F" }
425
529
  ],
426
530
  returnType: "string",
427
- examples: ['dateFormat(now(), "YYYY-MM-DD HH:mm:ss")']
531
+ pure: true,
532
+ examples: ['dateFormat(now(), "YYYY-MM-DD") // "2024-01-01"']
428
533
  },
429
534
  {
430
535
  name: "dateParse",
536
+ category: "date",
431
537
  description: "\u89E3\u6790\u65E5\u671F\u5B57\u7B26\u4E32",
432
538
  params: [
433
- { name: "dateStr", type: "string", required: true },
434
- { name: "format", type: "string", required: false }
539
+ { name: "str", type: "string", required: true, description: "\u65E5\u671F\u5B57\u7B26\u4E32" },
540
+ { name: "format", type: "string", required: false, description: "\u683C\u5F0F\u6A21\u677F" }
435
541
  ],
436
542
  returnType: "number",
437
- examples: ['dateParse("2024-01-01")']
543
+ pure: true,
544
+ examples: ['dateParse("2024-01-01") // 1704067200000']
438
545
  },
439
- // 数组函数
440
546
  {
441
- name: "first",
442
- description: "\u83B7\u53D6\u6570\u7EC4\u7B2C\u4E00\u4E2A\u5143\u7D20",
443
- params: [{ name: "arr", type: "array", required: true }],
444
- returnType: "any",
445
- examples: ["first([1,2,3])"]
547
+ name: "dateAdd",
548
+ category: "date",
549
+ description: "\u65E5\u671F\u52A0\u51CF",
550
+ params: [
551
+ { name: "date", type: "any", required: true, description: "\u65E5\u671F" },
552
+ { name: "amount", type: "number", required: true, description: "\u6570\u91CF" },
553
+ { name: "unit", type: "string", required: true, description: "\u5355\u4F4D\uFF08day/week/month/year\uFF09" }
554
+ ],
555
+ returnType: "number",
556
+ pure: true,
557
+ examples: ['dateAdd(now(), 7, "day") // \u4E00\u5468\u540E']
446
558
  },
447
559
  {
448
- name: "last",
449
- description: "\u83B7\u53D6\u6570\u7EC4\u6700\u540E\u4E00\u4E2A\u5143\u7D20",
450
- params: [{ name: "arr", type: "array", required: true }],
560
+ name: "dateDiff",
561
+ category: "date",
562
+ description: "\u65E5\u671F\u5DEE",
563
+ params: [
564
+ { name: "date1", type: "any", required: true, description: "\u65E5\u671F1" },
565
+ { name: "date2", type: "any", required: true, description: "\u65E5\u671F2" },
566
+ { name: "unit", type: "string", required: false, defaultValue: "day", description: "\u5355\u4F4D" }
567
+ ],
568
+ returnType: "number",
569
+ pure: true,
570
+ examples: ['dateDiff("2024-01-10", "2024-01-01", "day") // 9']
571
+ }
572
+ ];
573
+ var LOGIC_FUNCTIONS = [
574
+ {
575
+ name: "if",
576
+ category: "logic",
577
+ description: "\u6761\u4EF6\u5224\u65AD",
578
+ params: [
579
+ { name: "condition", type: "boolean", required: true, description: "\u6761\u4EF6" },
580
+ { name: "trueValue", type: "any", required: true, description: "\u6761\u4EF6\u4E3A\u771F\u65F6\u7684\u503C" },
581
+ { name: "falseValue", type: "any", required: true, description: "\u6761\u4EF6\u4E3A\u5047\u65F6\u7684\u503C" }
582
+ ],
451
583
  returnType: "any",
452
- examples: ["last([1,2,3])"]
584
+ pure: true,
585
+ examples: ['if(state.count > 0, "\u6709", "\u65E0")']
453
586
  },
454
587
  {
455
- name: "includes",
456
- description: "\u68C0\u67E5\u6570\u7EC4\u662F\u5426\u5305\u542B\u5143\u7D20",
588
+ name: "and",
589
+ category: "logic",
590
+ description: "\u903B\u8F91\u4E0E",
457
591
  params: [
458
- { name: "arr", type: "array", required: true },
459
- { name: "value", type: "any", required: true }
592
+ {
593
+ name: "values",
594
+ type: "boolean",
595
+ required: true,
596
+ variadic: true,
597
+ description: "\u5E03\u5C14\u503C\u5217\u8868"
598
+ }
460
599
  ],
461
600
  returnType: "boolean",
462
- examples: ["includes([1,2,3], 2)"]
601
+ pure: true,
602
+ examples: ["and(true, true, false) // false"]
463
603
  },
464
604
  {
465
- name: "slice",
466
- description: "\u622A\u53D6\u6570\u7EC4",
605
+ name: "or",
606
+ category: "logic",
607
+ description: "\u903B\u8F91\u6216",
467
608
  params: [
468
- { name: "arr", type: "array", required: true },
469
- { name: "start", type: "number", required: true },
470
- { name: "end", type: "number", required: false }
609
+ {
610
+ name: "values",
611
+ type: "boolean",
612
+ required: true,
613
+ variadic: true,
614
+ description: "\u5E03\u5C14\u503C\u5217\u8868"
615
+ }
471
616
  ],
472
- returnType: "array",
473
- examples: ["slice([1,2,3,4], 1, 3)"]
617
+ returnType: "boolean",
618
+ pure: true,
619
+ examples: ["or(true, false) // true"]
620
+ },
621
+ {
622
+ name: "not",
623
+ category: "logic",
624
+ description: "\u903B\u8F91\u975E",
625
+ params: [{ name: "value", type: "boolean", required: true, description: "\u5E03\u5C14\u503C" }],
626
+ returnType: "boolean",
627
+ pure: true,
628
+ examples: ["not(true) // false"]
629
+ },
630
+ {
631
+ name: "eq",
632
+ category: "logic",
633
+ description: "\u76F8\u7B49\u5224\u65AD",
634
+ params: [
635
+ { name: "a", type: "any", required: true, description: "\u503C1" },
636
+ { name: "b", type: "any", required: true, description: "\u503C2" }
637
+ ],
638
+ returnType: "boolean",
639
+ pure: true,
640
+ examples: ["eq(1, 1) // true"]
641
+ },
642
+ {
643
+ name: "ne",
644
+ category: "logic",
645
+ description: "\u4E0D\u76F8\u7B49\u5224\u65AD",
646
+ params: [
647
+ { name: "a", type: "any", required: true, description: "\u503C1" },
648
+ { name: "b", type: "any", required: true, description: "\u503C2" }
649
+ ],
650
+ returnType: "boolean",
651
+ pure: true,
652
+ examples: ["ne(1, 2) // true"]
653
+ },
654
+ {
655
+ name: "gt",
656
+ category: "logic",
657
+ description: "\u5927\u4E8E",
658
+ params: [
659
+ { name: "a", type: "number", required: true, description: "\u503C1" },
660
+ { name: "b", type: "number", required: true, description: "\u503C2" }
661
+ ],
662
+ returnType: "boolean",
663
+ pure: true,
664
+ examples: ["gt(2, 1) // true"]
665
+ },
666
+ {
667
+ name: "gte",
668
+ category: "logic",
669
+ description: "\u5927\u4E8E\u7B49\u4E8E",
670
+ params: [
671
+ { name: "a", type: "number", required: true, description: "\u503C1" },
672
+ { name: "b", type: "number", required: true, description: "\u503C2" }
673
+ ],
674
+ returnType: "boolean",
675
+ pure: true,
676
+ examples: ["gte(2, 2) // true"]
677
+ },
678
+ {
679
+ name: "lt",
680
+ category: "logic",
681
+ description: "\u5C0F\u4E8E",
682
+ params: [
683
+ { name: "a", type: "number", required: true, description: "\u503C1" },
684
+ { name: "b", type: "number", required: true, description: "\u503C2" }
685
+ ],
686
+ returnType: "boolean",
687
+ pure: true,
688
+ examples: ["lt(1, 2) // true"]
474
689
  },
475
- // 条件函数
690
+ {
691
+ name: "lte",
692
+ category: "logic",
693
+ description: "\u5C0F\u4E8E\u7B49\u4E8E",
694
+ params: [
695
+ { name: "a", type: "number", required: true, description: "\u503C1" },
696
+ { name: "b", type: "number", required: true, description: "\u503C2" }
697
+ ],
698
+ returnType: "boolean",
699
+ pure: true,
700
+ examples: ["lte(2, 2) // true"]
701
+ }
702
+ ];
703
+ var UTILITY_FUNCTIONS = [
476
704
  {
477
705
  name: "default",
478
- description: "\u63D0\u4F9B\u9ED8\u8BA4\u503C",
706
+ category: "utility",
707
+ description: "\u9ED8\u8BA4\u503C",
479
708
  params: [
480
- { name: "value", type: "any", required: true },
481
- { name: "defaultValue", type: "any", required: true }
709
+ { name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" },
710
+ { name: "defaultValue", type: "any", required: true, description: "\u9ED8\u8BA4\u503C" }
482
711
  ],
483
712
  returnType: "any",
484
- examples: ['default(null, "fallback")']
713
+ pure: true,
714
+ examples: ['default(state.name, "\u672A\u77E5")']
485
715
  },
486
716
  {
487
- name: "ifElse",
488
- description: "\u6761\u4EF6\u5224\u65AD",
717
+ name: "coalesce",
718
+ category: "utility",
719
+ description: "\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u975E\u7A7A\u503C",
489
720
  params: [
490
- { name: "condition", type: "boolean", required: true },
491
- { name: "trueValue", type: "any", required: true },
492
- { name: "falseValue", type: "any", required: true }
721
+ { name: "values", type: "any", required: true, variadic: true, description: "\u503C\u5217\u8868" }
493
722
  ],
494
723
  returnType: "any",
495
- examples: ['ifElse(age > 18, "\u6210\u5E74", "\u672A\u6210\u5E74")']
724
+ pure: true,
725
+ examples: ['coalesce(null, undefined, "value") // "value"']
496
726
  },
497
727
  {
498
728
  name: "isEmpty",
729
+ category: "utility",
499
730
  description: "\u68C0\u67E5\u662F\u5426\u4E3A\u7A7A",
500
- params: [{ name: "value", type: "any", required: true }],
731
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
501
732
  returnType: "boolean",
502
- examples: ['isEmpty("")', "isEmpty([])"]
733
+ pure: true,
734
+ examples: ['isEmpty("") // true', "isEmpty([]) // true"]
503
735
  },
504
736
  {
505
737
  name: "isNull",
506
- description: "\u68C0\u67E5\u662F\u5426\u4E3A null \u6216 undefined",
507
- params: [{ name: "value", type: "any", required: true }],
738
+ category: "utility",
739
+ description: "\u68C0\u67E5\u662F\u5426\u4E3A null/undefined",
740
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
741
+ returnType: "boolean",
742
+ pure: true,
743
+ examples: ["isNull(null) // true"]
744
+ },
745
+ {
746
+ name: "type",
747
+ category: "utility",
748
+ description: "\u83B7\u53D6\u503C\u7C7B\u578B",
749
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
750
+ returnType: "string",
751
+ pure: true,
752
+ examples: ['type([]) // "array"', 'type({}) // "object"']
753
+ },
754
+ {
755
+ name: "toString",
756
+ category: "type",
757
+ description: "\u8F6C\u6362\u4E3A\u5B57\u7B26\u4E32",
758
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
759
+ returnType: "string",
760
+ pure: true,
761
+ examples: ['toString(123) // "123"']
762
+ },
763
+ {
764
+ name: "toBoolean",
765
+ category: "type",
766
+ description: "\u8F6C\u6362\u4E3A\u5E03\u5C14\u503C",
767
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
508
768
  returnType: "boolean",
509
- examples: ["isNull(null)"]
769
+ pure: true,
770
+ examples: ['toBoolean("true") // true', "toBoolean(1) // true"]
510
771
  },
511
- // JSON 函数
512
772
  {
513
- name: "jsonParse",
773
+ name: "toJSON",
774
+ category: "utility",
775
+ description: "\u8F6C\u6362\u4E3A JSON \u5B57\u7B26\u4E32",
776
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
777
+ returnType: "string",
778
+ pure: true,
779
+ examples: ['toJSON({a: 1}) // "{\\"a\\":1}"']
780
+ },
781
+ {
782
+ name: "fromJSON",
783
+ category: "utility",
514
784
  description: "\u89E3\u6790 JSON \u5B57\u7B26\u4E32",
515
- params: [{ name: "str", type: "string", required: true }],
785
+ params: [{ name: "str", type: "string", required: true, description: "JSON \u5B57\u7B26\u4E32" }],
786
+ returnType: "any",
787
+ pure: true,
788
+ examples: ['fromJSON("{\\"a\\":1}") // {a: 1}']
789
+ },
790
+ {
791
+ name: "get",
792
+ category: "object",
793
+ description: "\u83B7\u53D6\u5D4C\u5957\u5C5E\u6027",
794
+ params: [
795
+ { name: "obj", type: "object", required: true, description: "\u8F93\u5165\u5BF9\u8C61" },
796
+ { name: "path", type: "string", required: true, description: "\u5C5E\u6027\u8DEF\u5F84\uFF08\u70B9\u5206\u9694\uFF09" },
797
+ { name: "defaultValue", type: "any", required: false, description: "\u9ED8\u8BA4\u503C" }
798
+ ],
516
799
  returnType: "any",
517
- examples: [`jsonParse('{"a":1}')`]
800
+ pure: true,
801
+ examples: ['get(state, "user.name", "\u672A\u77E5")']
802
+ }
803
+ ];
804
+ var FORMAT_FUNCTIONS = [
805
+ {
806
+ name: "currency",
807
+ category: "format",
808
+ description: "\u683C\u5F0F\u5316\u8D27\u5E01",
809
+ params: [
810
+ { name: "value", type: "number", required: true, description: "\u91D1\u989D" },
811
+ {
812
+ name: "symbol",
813
+ type: "string",
814
+ required: false,
815
+ defaultValue: "\xA5",
816
+ description: "\u8D27\u5E01\u7B26\u53F7"
817
+ },
818
+ {
819
+ name: "decimals",
820
+ type: "number",
821
+ required: false,
822
+ defaultValue: 2,
823
+ description: "\u5C0F\u6570\u4F4D\u6570"
824
+ }
825
+ ],
826
+ returnType: "string",
827
+ pure: true,
828
+ examples: ['currency(1234.5) // "\xA51,234.50"']
829
+ },
830
+ {
831
+ name: "percent",
832
+ category: "format",
833
+ description: "\u683C\u5F0F\u5316\u767E\u5206\u6BD4",
834
+ params: [
835
+ { name: "value", type: "number", required: true, description: "\u6570\u503C\uFF080-1\uFF09" },
836
+ {
837
+ name: "decimals",
838
+ type: "number",
839
+ required: false,
840
+ defaultValue: 0,
841
+ description: "\u5C0F\u6570\u4F4D\u6570"
842
+ }
843
+ ],
844
+ returnType: "string",
845
+ pure: true,
846
+ examples: ['percent(0.1234) // "12%"']
847
+ },
848
+ {
849
+ name: "number",
850
+ category: "format",
851
+ description: "\u683C\u5F0F\u5316\u6570\u5B57\uFF08\u5343\u5206\u4F4D\uFF09",
852
+ params: [
853
+ { name: "value", type: "number", required: true, description: "\u6570\u503C" },
854
+ {
855
+ name: "decimals",
856
+ type: "number",
857
+ required: false,
858
+ defaultValue: 0,
859
+ description: "\u5C0F\u6570\u4F4D\u6570"
860
+ }
861
+ ],
862
+ returnType: "string",
863
+ pure: true,
864
+ examples: ['number(1234567) // "1,234,567"']
865
+ },
866
+ {
867
+ name: "pluralize",
868
+ category: "format",
869
+ description: "\u590D\u6570\u5F62\u5F0F",
870
+ params: [
871
+ { name: "count", type: "number", required: true, description: "\u6570\u91CF" },
872
+ { name: "singular", type: "string", required: true, description: "\u5355\u6570\u5F62\u5F0F" },
873
+ { name: "plural", type: "string", required: true, description: "\u590D\u6570\u5F62\u5F0F" }
874
+ ],
875
+ returnType: "string",
876
+ pure: true,
877
+ examples: ['pluralize(1, "item", "items") // "1 item"']
518
878
  },
519
879
  {
520
- name: "jsonStringify",
521
- description: "\u5E8F\u5217\u5316\u4E3A JSON",
522
- params: [{ name: "value", type: "any", required: true }],
880
+ name: "mask",
881
+ category: "format",
882
+ description: "\u63A9\u7801\u5904\u7406",
883
+ params: [
884
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
885
+ {
886
+ name: "keepPrefix",
887
+ type: "number",
888
+ required: false,
889
+ defaultValue: 3,
890
+ description: "\u4FDD\u7559\u524D\u7F00"
891
+ },
892
+ {
893
+ name: "keepSuffix",
894
+ type: "number",
895
+ required: false,
896
+ defaultValue: 4,
897
+ description: "\u4FDD\u7559\u540E\u7F00"
898
+ },
899
+ {
900
+ name: "maskChar",
901
+ type: "string",
902
+ required: false,
903
+ defaultValue: "*",
904
+ description: "\u63A9\u7801\u5B57\u7B26"
905
+ }
906
+ ],
523
907
  returnType: "string",
524
- examples: ["jsonStringify({a:1})"]
908
+ pure: true,
909
+ examples: ['mask("13812345678", 3, 4) // "138****5678"']
525
910
  }
526
911
  ];
527
- var BUILTIN_FUNCTION_NAMES = new Set(BUILTIN_FUNCTIONS.map((f) => f.name));
528
- var ALLOWED_ROOT_VARIABLES = [
529
- "state",
530
- "query",
531
- "context",
532
- "event",
533
- "item",
534
- "index"
912
+ var ALL_BUILTIN_FUNCTIONS = [
913
+ ...STRING_FUNCTIONS,
914
+ ...NUMBER_FUNCTIONS,
915
+ ...ARRAY_FUNCTIONS,
916
+ ...DATE_FUNCTIONS,
917
+ ...LOGIC_FUNCTIONS,
918
+ ...UTILITY_FUNCTIONS,
919
+ ...FORMAT_FUNCTIONS
535
920
  ];
536
- function isExpressionBinding(value) {
537
- return value !== null && typeof value === "object" && value.__isExpression === true && typeof value.expression === "string";
921
+ var ALLOWED_FUNCTION_NAMES = ALL_BUILTIN_FUNCTIONS.map((f) => f.name);
922
+ var DEFAULT_EXPRESSION_VALIDATION_CONFIG = {
923
+ allowedContextPaths: ["state", "binding", "context", "props", "event"],
924
+ allowedFunctions: ALLOWED_FUNCTION_NAMES,
925
+ maxDepth: 10,
926
+ maxLength: 1e3,
927
+ allowTemplate: true,
928
+ allowChaining: true
929
+ };
930
+
931
+ // src/page/expression.ts
932
+ function literal(value) {
933
+ return value;
538
934
  }
539
- function createExpressionBinding(expression, fallback) {
935
+ function stateRef(path, fallback) {
540
936
  return {
541
- __isExpression: true,
542
- expression,
543
- fallback
937
+ type: "state",
938
+ value: path,
939
+ fallback,
940
+ meta: { dependencies: [`state.${path}`] }
544
941
  };
545
942
  }
546
-
547
- // src/migrations/index.ts
548
- var SCHEMA_VERSIONS = ["1.0.0", "1.1.0", "2.0.0"];
549
- var CURRENT_SCHEMA_VERSION = "1.0.0";
550
- var migrations = [];
551
- function registerMigration(migration) {
552
- const exists = migrations.some(
553
- (m) => m.from === migration.from && m.to === migration.to
554
- );
555
- if (exists) {
556
- throw new Error(`Migration from ${migration.from} to ${migration.to} already exists`);
557
- }
558
- migrations.push(migration);
559
- }
560
- function getAllMigrations() {
561
- return [...migrations];
562
- }
563
- function findMigrationPath(from, to) {
564
- const path = [];
565
- let current = from;
566
- while (current !== to) {
567
- const nextMigration = migrations.find((m) => m.from === current);
568
- if (!nextMigration) {
569
- throw new Error(`No migration path from ${current} to ${to}`);
570
- }
571
- path.push(nextMigration);
572
- current = nextMigration.to;
573
- if (path.length > 100) {
574
- throw new Error("Migration path too long, possible circular dependency");
575
- }
576
- }
577
- return path;
943
+ function bindingRef(bindingId, path, fallback) {
944
+ return {
945
+ type: "binding",
946
+ value: `${bindingId}.${path}`,
947
+ fallback,
948
+ meta: { dependencies: [`binding.${bindingId}.${path}`] }
949
+ };
578
950
  }
579
- function migratePageSchema(data, targetVersion) {
580
- const fromVersion = data.schemaVersion || "1.0.0";
581
- const toVersion = targetVersion || CURRENT_SCHEMA_VERSION;
582
- if (fromVersion === toVersion) {
583
- return {
584
- success: true,
585
- data,
586
- fromVersion,
587
- toVersion,
588
- appliedMigrations: []
589
- };
590
- }
591
- try {
592
- const path = findMigrationPath(fromVersion, toVersion);
593
- let result = { ...data };
594
- const appliedMigrations = [];
595
- for (const migration of path) {
596
- result = migration.migrate(result);
597
- result.schemaVersion = migration.to;
598
- appliedMigrations.push(`${migration.from} -> ${migration.to}`);
951
+ function template(templateString, fallback) {
952
+ const dependencies = [];
953
+ const pattern = /\$\{([^}]+)\}/g;
954
+ let match;
955
+ while ((match = pattern.exec(templateString)) !== null) {
956
+ if (match[1]) {
957
+ dependencies.push(match[1]);
599
958
  }
600
- return {
601
- success: true,
602
- data: result,
603
- fromVersion,
604
- toVersion,
605
- appliedMigrations
606
- };
607
- } catch (error) {
608
- return {
609
- success: false,
610
- fromVersion,
611
- toVersion,
612
- appliedMigrations: [],
613
- error: error instanceof Error ? error.message : "Unknown error"
614
- };
615
959
  }
960
+ return {
961
+ type: "template",
962
+ value: templateString,
963
+ fallback,
964
+ meta: { dependencies }
965
+ };
616
966
  }
617
- function needsMigration(data, targetVersion) {
618
- const currentVersion = data.schemaVersion || "1.0.0";
619
- const target = targetVersion || CURRENT_SCHEMA_VERSION;
620
- return currentVersion !== target;
621
- }
622
- function getVersionInfo(version) {
623
- const [major, minor, patch] = version.split(".").map(Number);
624
- return { major, minor, patch };
625
- }
626
- function compareVersions(a, b) {
627
- const va = getVersionInfo(a);
628
- const vb = getVersionInfo(b);
629
- if (va.major !== vb.major) return va.major < vb.major ? -1 : 1;
630
- if (va.minor !== vb.minor) return va.minor < vb.minor ? -1 : 1;
631
- if (va.patch !== vb.patch) return va.patch < vb.patch ? -1 : 1;
632
- return 0;
967
+ function queryRef(queryId, path, fallback) {
968
+ return bindingRef(queryId, path, fallback);
633
969
  }
634
- registerMigration({
635
- from: "1.0.0",
636
- to: "1.1.0",
637
- description: "\u6DFB\u52A0 Definition \u7248\u672C\u7ED1\u5B9A\u5B57\u6BB5",
638
- migrate: (data) => {
639
- return {
640
- ...data,
641
- actionDefVersionIds: data.actionDefVersionIds || [],
642
- dataQueryVersionIds: data.dataQueryVersionIds || []
643
- };
644
- }
645
- });
646
- registerMigration({
647
- from: "1.1.0",
648
- to: "2.0.0",
649
- description: "\u91CD\u6784\u7EC4\u4EF6\u4E8B\u4EF6\u7ED3\u6784",
650
- breaking: true,
651
- migrate: (data) => {
652
- return {
653
- ...data,
654
- components: data.components.map((component) => ({
655
- ...component,
656
- // 示例:将 events 数组中的 actions 结构标准化
657
- events: component.events?.map((event) => ({
658
- ...event,
659
- // 确保 enabled 字段存在
660
- enabled: event.enabled ?? true
661
- }))
662
- }))
663
- };
664
- }
665
- });
666
- // Annotate the CommonJS export names for ESM import in node:
667
- 0 && (module.exports = {
668
- ACTION_SPEC_VERSION,
669
- ALLOWED_ROOT_VARIABLES,
670
- BUILTIN_FUNCTIONS,
671
- BUILTIN_FUNCTION_NAMES,
672
- COMPONENT_CATEGORIES,
673
- COMPONENT_META_SCHEMA_VERSION,
674
- CURRENT_SCHEMA_VERSION,
675
- DATA_QUERY_SPEC_VERSION,
676
- ErrorCode,
677
- ErrorCodeCategory,
678
- ErrorMessages,
679
- PAGE_SCHEMA_VERSION,
680
- PublishStatus,
681
- SCHEMA_VERSIONS,
682
- compareVersions,
683
- createDjvlcError,
684
- createExpressionBinding,
685
- findMigrationPath,
686
- getAllMigrations,
687
- getContractsVersion,
688
- getHttpStatusFromErrorCode,
689
- getVersionInfo,
690
- isExpressionBinding,
691
- isRetryableError,
692
- isVersionCompatible,
693
- migratePageSchema,
694
- needsMigration,
695
- registerMigration
696
- });
697
- //# sourceMappingURL=index.js.map
970
+
971
+ // src/component/meta.ts
972
+ var CURRENT_COMPONENT_META_VERSION = "2.0.0";
973
+
974
+ // src/action/types.ts
975
+ var ActionType = /* @__PURE__ */ ((ActionType2) => {
976
+ ActionType2["CLAIM"] = "claim";
977
+ ActionType2["SIGNIN"] = "signin";
978
+ ActionType2["LOTTERY"] = "lottery";
979
+ ActionType2["RESERVE"] = "reserve";
980
+ ActionType2["BIND"] = "bind";
981
+ ActionType2["TASK_COMPLETE"] = "task_complete";
982
+ ActionType2["VOTE"] = "vote";
983
+ ActionType2["SHARE"] = "share";
984
+ ActionType2["FORM_SUBMIT"] = "form_submit";
985
+ ActionType2["CUSTOM"] = "custom";
986
+ return ActionType2;
987
+ })(ActionType || {});
988
+
989
+ // src/action/spec.ts
990
+ var CURRENT_ACTION_SPEC_VERSION = "2.0.0";
991
+
992
+ // src/data-query/spec.ts
993
+ var CURRENT_DATA_QUERY_SPEC_VERSION = "2.0.0";
994
+
995
+ // src/index.ts
996
+ var VERSION = "2.0.0";
997
+ var PROTOCOL_VERSION = "2.0.0";
998
+
999
+ exports.ALLOWED_FUNCTION_NAMES = ALLOWED_FUNCTION_NAMES;
1000
+ exports.ALL_BUILTIN_FUNCTIONS = ALL_BUILTIN_FUNCTIONS;
1001
+ exports.ARRAY_FUNCTIONS = ARRAY_FUNCTIONS;
1002
+ exports.ActionType = ActionType;
1003
+ exports.AuditAction = AuditAction;
1004
+ exports.CURRENT_ACTION_SPEC_VERSION = CURRENT_ACTION_SPEC_VERSION;
1005
+ exports.CURRENT_COMPONENT_META_VERSION = CURRENT_COMPONENT_META_VERSION;
1006
+ exports.CURRENT_DATA_QUERY_SPEC_VERSION = CURRENT_DATA_QUERY_SPEC_VERSION;
1007
+ exports.CURRENT_SCHEMA_VERSION = CURRENT_SCHEMA_VERSION;
1008
+ exports.DATE_FUNCTIONS = DATE_FUNCTIONS;
1009
+ exports.DEFAULT_EXPRESSION_VALIDATION_CONFIG = DEFAULT_EXPRESSION_VALIDATION_CONFIG;
1010
+ exports.ErrorCategory = ErrorCategory;
1011
+ exports.ErrorCode = ErrorCode;
1012
+ exports.ErrorCodeToHttpStatus = ErrorCodeToHttpStatus;
1013
+ exports.FORMAT_FUNCTIONS = FORMAT_FUNCTIONS;
1014
+ exports.LOGIC_FUNCTIONS = LOGIC_FUNCTIONS;
1015
+ exports.NUMBER_FUNCTIONS = NUMBER_FUNCTIONS;
1016
+ exports.PROTOCOL_VERSION = PROTOCOL_VERSION;
1017
+ exports.PublishChannel = PublishChannel;
1018
+ exports.PublishStatus = PublishStatus;
1019
+ exports.STRING_FUNCTIONS = STRING_FUNCTIONS;
1020
+ exports.UTILITY_FUNCTIONS = UTILITY_FUNCTIONS;
1021
+ exports.VERSION = VERSION;
1022
+ exports.VersionStatus = VersionStatus;
1023
+ exports.bindingRef = bindingRef;
1024
+ exports.literal = literal;
1025
+ exports.queryRef = queryRef;
1026
+ exports.stateRef = stateRef;
1027
+ exports.template = template;