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