@djvlc/contracts-types 1.5.0 → 1.7.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,698 +1,1074 @@
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]
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
87
111
  };
88
112
  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",
113
+ // 系统错误
114
+ ["SYSTEM_INTERNAL_ERROR" /* SYSTEM_INTERNAL_ERROR */]: "\u7CFB\u7EDF\u5185\u90E8\u9519\u8BEF",
115
+ ["SYSTEM_SERVICE_UNAVAILABLE" /* SYSTEM_SERVICE_UNAVAILABLE */]: "\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528",
116
+ ["SYSTEM_TIMEOUT" /* SYSTEM_TIMEOUT */]: "\u8BF7\u6C42\u8D85\u65F6",
117
+ ["SYSTEM_DATABASE_ERROR" /* SYSTEM_DATABASE_ERROR */]: "\u6570\u636E\u5E93\u9519\u8BEF",
118
+ ["SYSTEM_REDIS_ERROR" /* SYSTEM_REDIS_ERROR */]: "\u7F13\u5B58\u670D\u52A1\u9519\u8BEF",
119
+ // 认证错误
120
+ ["AUTH_TOKEN_MISSING" /* AUTH_TOKEN_MISSING */]: "\u7F3A\u5C11\u8BA4\u8BC1\u4EE4\u724C",
121
+ ["AUTH_TOKEN_INVALID" /* AUTH_TOKEN_INVALID */]: "\u8BA4\u8BC1\u4EE4\u724C\u65E0\u6548",
122
+ ["AUTH_TOKEN_EXPIRED" /* AUTH_TOKEN_EXPIRED */]: "\u8BA4\u8BC1\u4EE4\u724C\u5DF2\u8FC7\u671F",
123
+ ["AUTH_SIGNATURE_INVALID" /* AUTH_SIGNATURE_INVALID */]: "\u7B7E\u540D\u65E0\u6548",
124
+ ["AUTH_SESSION_EXPIRED" /* AUTH_SESSION_EXPIRED */]: "\u4F1A\u8BDD\u5DF2\u8FC7\u671F",
125
+ // 权限错误
126
+ ["PERMISSION_DENIED" /* PERMISSION_DENIED */]: "\u6743\u9650\u4E0D\u8DB3",
127
+ ["PERMISSION_RESOURCE_FORBIDDEN" /* PERMISSION_RESOURCE_FORBIDDEN */]: "\u65E0\u6743\u8BBF\u95EE\u8BE5\u8D44\u6E90",
128
+ ["PERMISSION_ACTION_FORBIDDEN" /* PERMISSION_ACTION_FORBIDDEN */]: "\u65E0\u6743\u6267\u884C\u8BE5\u64CD\u4F5C",
129
+ // 资源错误
130
+ ["RESOURCE_NOT_FOUND" /* RESOURCE_NOT_FOUND */]: "\u8D44\u6E90\u4E0D\u5B58\u5728",
131
+ ["RESOURCE_PAGE_NOT_FOUND" /* RESOURCE_PAGE_NOT_FOUND */]: "\u9875\u9762\u4E0D\u5B58\u5728",
132
+ ["RESOURCE_COMPONENT_NOT_FOUND" /* RESOURCE_COMPONENT_NOT_FOUND */]: "\u7EC4\u4EF6\u4E0D\u5B58\u5728",
133
+ ["RESOURCE_ACTION_NOT_FOUND" /* RESOURCE_ACTION_NOT_FOUND */]: "\u52A8\u4F5C\u4E0D\u5B58\u5728",
134
+ ["RESOURCE_VERSION_NOT_FOUND" /* RESOURCE_VERSION_NOT_FOUND */]: "\u7248\u672C\u4E0D\u5B58\u5728",
135
+ // 参数错误
136
+ ["VALIDATION_INVALID_PARAMS" /* VALIDATION_INVALID_PARAMS */]: "\u53C2\u6570\u65E0\u6548",
137
+ ["VALIDATION_SCHEMA_MISMATCH" /* VALIDATION_SCHEMA_MISMATCH */]: "Schema \u4E0D\u5339\u914D",
138
+ ["VALIDATION_EXPRESSION_ERROR" /* VALIDATION_EXPRESSION_ERROR */]: "\u8868\u8FBE\u5F0F\u9519\u8BEF",
139
+ ["VALIDATION_FIELD_REQUIRED" /* VALIDATION_FIELD_REQUIRED */]: "\u5FC5\u586B\u5B57\u6BB5\u7F3A\u5931",
140
+ ["VALIDATION_FIELD_TYPE_ERROR" /* VALIDATION_FIELD_TYPE_ERROR */]: "\u5B57\u6BB5\u7C7B\u578B\u9519\u8BEF",
141
+ // 业务错误
142
+ ["BUSINESS_ACTIVITY_NOT_STARTED" /* BUSINESS_ACTIVITY_NOT_STARTED */]: "\u6D3B\u52A8\u672A\u5F00\u59CB",
143
+ ["BUSINESS_ACTIVITY_ENDED" /* BUSINESS_ACTIVITY_ENDED */]: "\u6D3B\u52A8\u5DF2\u7ED3\u675F",
144
+ ["BUSINESS_ALREADY_CLAIMED" /* BUSINESS_ALREADY_CLAIMED */]: "\u5DF2\u7ECF\u9886\u53D6\u8FC7",
145
+ ["BUSINESS_ALREADY_SIGNED" /* BUSINESS_ALREADY_SIGNED */]: "\u4ECA\u65E5\u5DF2\u7B7E\u5230",
146
+ ["BUSINESS_STOCK_EXHAUSTED" /* BUSINESS_STOCK_EXHAUSTED */]: "\u5E93\u5B58\u4E0D\u8DB3",
147
+ ["BUSINESS_QUOTA_EXCEEDED" /* BUSINESS_QUOTA_EXCEEDED */]: "\u8D85\u51FA\u914D\u989D\u9650\u5236",
148
+ ["BUSINESS_PREREQUISITE_NOT_MET" /* BUSINESS_PREREQUISITE_NOT_MET */]: "\u524D\u7F6E\u6761\u4EF6\u672A\u6EE1\u8DB3",
149
+ // 风控错误
150
+ ["RISK_RATE_LIMITED" /* RISK_RATE_LIMITED */]: "\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41",
151
+ ["RISK_BLOCKED" /* RISK_BLOCKED */]: "\u8BF7\u6C42\u88AB\u963B\u65AD",
152
+ ["RISK_CAPTCHA_REQUIRED" /* RISK_CAPTCHA_REQUIRED */]: "\u9700\u8981\u9A8C\u8BC1\u7801\u9A8C\u8BC1",
153
+ ["RISK_DEVICE_ABNORMAL" /* RISK_DEVICE_ABNORMAL */]: "\u8BBE\u5907\u5F02\u5E38",
154
+ ["RISK_IDEMPOTENCY_CONFLICT" /* RISK_IDEMPOTENCY_CONFLICT */]: "\u91CD\u590D\u8BF7\u6C42",
116
155
  // 组件错误
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"
156
+ ["COMPONENT_LOAD_FAILED" /* COMPONENT_LOAD_FAILED */]: "\u7EC4\u4EF6\u52A0\u8F7D\u5931\u8D25",
157
+ ["COMPONENT_INTEGRITY_MISMATCH" /* COMPONENT_INTEGRITY_MISMATCH */]: "\u7EC4\u4EF6\u5B8C\u6574\u6027\u6821\u9A8C\u5931\u8D25",
158
+ ["COMPONENT_BLOCKED" /* COMPONENT_BLOCKED */]: "\u7EC4\u4EF6\u5DF2\u88AB\u963B\u65AD",
159
+ ["COMPONENT_DEPRECATED" /* COMPONENT_DEPRECATED */]: "\u7EC4\u4EF6\u5DF2\u5E9F\u5F03",
160
+ ["COMPONENT_INCOMPATIBLE" /* COMPONENT_INCOMPATIBLE */]: "\u7EC4\u4EF6\u7248\u672C\u4E0D\u517C\u5BB9",
161
+ // 发布错误
162
+ ["PUBLISH_VERSION_CONFLICT" /* PUBLISH_VERSION_CONFLICT */]: "\u7248\u672C\u51B2\u7A81",
163
+ ["PUBLISH_VALIDATION_FAILED" /* PUBLISH_VALIDATION_FAILED */]: "\u53D1\u5E03\u6821\u9A8C\u5931\u8D25",
164
+ ["PUBLISH_ROLLBACK_FAILED" /* PUBLISH_ROLLBACK_FAILED */]: "\u56DE\u6EDA\u5931\u8D25"
151
165
  };
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
- };
166
+ function createDjvlcError(code, message, details) {
167
+ const errorMessage = message || ErrorMessages[code] || "\u672A\u77E5\u9519\u8BEF";
168
+ const httpStatus = ErrorCodeToHttpStatus[code] || 500;
169
+ const error = new Error(errorMessage);
170
+ error.name = "DjvlcError";
171
+ error.code = code;
172
+ error.httpStatus = httpStatus;
173
+ error.details = details;
174
+ return error;
160
175
  }
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);
176
+ function isDjvlcError(error) {
177
+ return error instanceof Error && "code" in error && "httpStatus" in error && error.name === "DjvlcError";
186
178
  }
187
179
 
188
- // src/page/index.ts
180
+ // src/common/status.ts
181
+ var VersionStatus = /* @__PURE__ */ ((VersionStatus2) => {
182
+ VersionStatus2["DRAFT"] = "draft";
183
+ VersionStatus2["STABLE"] = "stable";
184
+ VersionStatus2["DEPRECATED"] = "deprecated";
185
+ VersionStatus2["BLOCKED"] = "blocked";
186
+ return VersionStatus2;
187
+ })(VersionStatus || {});
188
+ var PageStatus = /* @__PURE__ */ ((PageStatus2) => {
189
+ PageStatus2["DRAFT"] = "draft";
190
+ PageStatus2["PUBLISHED"] = "published";
191
+ PageStatus2["ARCHIVED"] = "archived";
192
+ return PageStatus2;
193
+ })(PageStatus || {});
194
+ var PublishChannel = /* @__PURE__ */ ((PublishChannel2) => {
195
+ PublishChannel2["PREVIEW"] = "preview";
196
+ PublishChannel2["GRAY"] = "gray";
197
+ PublishChannel2["PROD"] = "prod";
198
+ return PublishChannel2;
199
+ })(PublishChannel || {});
189
200
  var PublishStatus = /* @__PURE__ */ ((PublishStatus2) => {
190
201
  PublishStatus2["PENDING"] = "pending";
191
- PublishStatus2["PUBLISHING"] = "publishing";
202
+ PublishStatus2["PROCESSING"] = "processing";
192
203
  PublishStatus2["SUCCESS"] = "success";
193
204
  PublishStatus2["FAILED"] = "failed";
194
205
  PublishStatus2["ROLLBACK"] = "rollback";
195
206
  return PublishStatus2;
196
207
  })(PublishStatus || {});
197
208
 
198
- // src/component/editor-widget.ts
199
- var BUILTIN_PROPERTY_GROUPS = [
200
- { id: "basic", label: "\u57FA\u7840", order: 1, defaultExpanded: true },
201
- { id: "style", label: "\u6837\u5F0F", order: 2, defaultExpanded: true },
202
- { id: "layout", label: "\u5E03\u5C40", order: 3, defaultExpanded: false },
203
- { id: "interaction", label: "\u4EA4\u4E92", order: 4, defaultExpanded: false },
204
- { id: "data", label: "\u6570\u636E", order: 5, defaultExpanded: false },
205
- { id: "advanced", label: "\u9AD8\u7EA7", order: 99, defaultExpanded: false }
206
- ];
209
+ // src/common/audit.ts
210
+ var AuditAction = /* @__PURE__ */ ((AuditAction2) => {
211
+ AuditAction2["PAGE_CREATE"] = "page.create";
212
+ AuditAction2["PAGE_UPDATE"] = "page.update";
213
+ AuditAction2["PAGE_DELETE"] = "page.delete";
214
+ AuditAction2["PAGE_PUBLISH"] = "page.publish";
215
+ AuditAction2["PAGE_ROLLBACK"] = "page.rollback";
216
+ AuditAction2["COMPONENT_PUBLISH"] = "component.publish";
217
+ AuditAction2["COMPONENT_BLOCK"] = "component.block";
218
+ AuditAction2["COMPONENT_UNBLOCK"] = "component.unblock";
219
+ AuditAction2["ACTION_EXECUTE"] = "action.execute";
220
+ AuditAction2["DEFINITION_CREATE"] = "definition.create";
221
+ AuditAction2["DEFINITION_UPDATE"] = "definition.update";
222
+ AuditAction2["DEFINITION_PUBLISH"] = "definition.publish";
223
+ AuditAction2["SYSTEM_KILL_SWITCH"] = "system.kill_switch";
224
+ return AuditAction2;
225
+ })(AuditAction || {});
207
226
 
208
- // src/component/index.ts
209
- var COMPONENT_CATEGORIES = [
210
- "basic",
211
- "form",
212
- "layout",
213
- "navigation",
214
- "feedback",
215
- "display",
216
- "data",
217
- "business",
218
- "chart",
219
- "other"
220
- ];
227
+ // src/page/schema.ts
228
+ var CURRENT_SCHEMA_VERSION = "2.0.0";
221
229
 
222
- // src/expression/index.ts
223
- var BUILTIN_FUNCTIONS = [
224
- // 字符串函数
230
+ // src/expression/functions.ts
231
+ var STRING_FUNCTIONS = [
225
232
  {
226
233
  name: "len",
227
- description: "\u83B7\u53D6\u5B57\u7B26\u4E32\u6216\u6570\u7EC4\u957F\u5EA6",
228
- params: [{ name: "value", type: "any", required: true }],
234
+ category: "string",
235
+ description: "\u83B7\u53D6\u5B57\u7B26\u4E32\u957F\u5EA6",
236
+ params: [{ name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" }],
229
237
  returnType: "number",
230
- examples: ['len("hello")', "len([1,2,3])"]
238
+ pure: true,
239
+ examples: ['len("hello") // 5', "len(state.name) // \u52A8\u6001\u83B7\u53D6"]
231
240
  },
232
241
  {
233
242
  name: "trim",
234
- description: "\u53BB\u9664\u5B57\u7B26\u4E32\u9996\u5C3E\u7A7A\u683C",
235
- params: [{ name: "str", type: "string", required: true }],
243
+ category: "string",
244
+ description: "\u53BB\u9664\u9996\u5C3E\u7A7A\u767D",
245
+ params: [{ name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" }],
236
246
  returnType: "string",
237
- examples: ['trim(" hello ")']
247
+ pure: true,
248
+ examples: ['trim(" hello ") // "hello"']
238
249
  },
239
250
  {
240
251
  name: "upper",
241
- description: "\u8F6C\u4E3A\u5927\u5199",
242
- params: [{ name: "str", type: "string", required: true }],
252
+ category: "string",
253
+ description: "\u8F6C\u6362\u4E3A\u5927\u5199",
254
+ params: [{ name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" }],
243
255
  returnType: "string",
244
- examples: ['upper("hello")']
256
+ pure: true,
257
+ examples: ['upper("hello") // "HELLO"']
245
258
  },
246
259
  {
247
260
  name: "lower",
248
- description: "\u8F6C\u4E3A\u5C0F\u5199",
249
- params: [{ name: "str", type: "string", required: true }],
261
+ category: "string",
262
+ description: "\u8F6C\u6362\u4E3A\u5C0F\u5199",
263
+ params: [{ name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" }],
250
264
  returnType: "string",
251
- examples: ['lower("HELLO")']
265
+ pure: true,
266
+ examples: ['lower("HELLO") // "hello"']
252
267
  },
253
268
  {
254
- name: "substr",
269
+ name: "substring",
270
+ category: "string",
255
271
  description: "\u622A\u53D6\u5B50\u5B57\u7B26\u4E32",
256
272
  params: [
257
- { name: "str", type: "string", required: true },
258
- { name: "start", type: "number", required: true },
259
- { name: "length", type: "number", required: false }
260
- ],
261
- returnType: "string",
262
- examples: ['substr("hello", 0, 2)']
263
- },
264
- {
265
- name: "concat",
266
- description: "\u8FDE\u63A5\u5B57\u7B26\u4E32",
267
- params: [
268
- { name: "values", type: "any", required: true, description: "\u53EF\u53D8\u53C2\u6570" }
273
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
274
+ { name: "start", type: "number", required: true, description: "\u8D77\u59CB\u4F4D\u7F6E" },
275
+ { name: "end", type: "number", required: false, description: "\u7ED3\u675F\u4F4D\u7F6E" }
269
276
  ],
270
277
  returnType: "string",
271
- examples: ['concat("a", "b", "c")']
278
+ pure: true,
279
+ examples: ['substring("hello", 0, 2) // "he"']
272
280
  },
273
281
  {
274
282
  name: "replace",
283
+ category: "string",
275
284
  description: "\u66FF\u6362\u5B57\u7B26\u4E32",
276
285
  params: [
277
- { name: "str", type: "string", required: true },
278
- { name: "search", type: "string", required: true },
279
- { name: "replacement", type: "string", required: true }
286
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
287
+ { name: "search", type: "string", required: true, description: "\u641C\u7D22\u5185\u5BB9" },
288
+ { name: "replacement", type: "string", required: true, description: "\u66FF\u6362\u5185\u5BB9" }
280
289
  ],
281
290
  returnType: "string",
282
- examples: ['replace("hello", "l", "x")']
291
+ pure: true,
292
+ examples: ['replace("hello", "l", "x") // "hexxo"']
283
293
  },
284
294
  {
285
295
  name: "split",
286
- description: "\u5206\u5272\u5B57\u7B26\u4E32",
296
+ category: "string",
297
+ description: "\u5206\u5272\u5B57\u7B26\u4E32\u4E3A\u6570\u7EC4",
287
298
  params: [
288
- { name: "str", type: "string", required: true },
289
- { name: "separator", type: "string", required: true }
299
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
300
+ { name: "separator", type: "string", required: true, description: "\u5206\u9694\u7B26" }
290
301
  ],
291
302
  returnType: "array",
292
- examples: ['split("a,b,c", ",")']
303
+ pure: true,
304
+ examples: ['split("a,b,c", ",") // ["a", "b", "c"]']
293
305
  },
294
306
  {
295
307
  name: "join",
296
- description: "\u8FDE\u63A5\u6570\u7EC4\u4E3A\u5B57\u7B26\u4E32",
308
+ category: "string",
309
+ description: "\u5408\u5E76\u6570\u7EC4\u4E3A\u5B57\u7B26\u4E32",
297
310
  params: [
298
- { name: "arr", type: "array", required: true },
299
- { name: "separator", type: "string", required: false, defaultValue: "," }
311
+ { name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" },
312
+ {
313
+ name: "separator",
314
+ type: "string",
315
+ required: false,
316
+ defaultValue: ",",
317
+ description: "\u5206\u9694\u7B26"
318
+ }
300
319
  ],
301
320
  returnType: "string",
302
- examples: ['join(["a","b","c"], "-")']
321
+ pure: true,
322
+ examples: ['join(["a", "b", "c"], "-") // "a-b-c"']
303
323
  },
304
- // 数字函数
305
324
  {
306
- name: "toNumber",
307
- description: "\u8F6C\u4E3A\u6570\u5B57",
308
- params: [{ name: "value", type: "any", required: true }],
309
- returnType: "number",
310
- examples: ['toNumber("123")']
325
+ name: "contains",
326
+ category: "string",
327
+ description: "\u68C0\u67E5\u662F\u5426\u5305\u542B\u5B50\u5B57\u7B26\u4E32",
328
+ params: [
329
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
330
+ { name: "search", type: "string", required: true, description: "\u641C\u7D22\u5185\u5BB9" }
331
+ ],
332
+ returnType: "boolean",
333
+ pure: true,
334
+ examples: ['contains("hello", "ell") // true']
311
335
  },
312
336
  {
313
- name: "toString",
314
- description: "\u8F6C\u4E3A\u5B57\u7B26\u4E32",
315
- params: [{ name: "value", type: "any", required: true }],
316
- returnType: "string",
317
- examples: ["toString(123)"]
337
+ name: "startsWith",
338
+ category: "string",
339
+ description: "\u68C0\u67E5\u662F\u5426\u4EE5\u6307\u5B9A\u524D\u7F00\u5F00\u59CB",
340
+ params: [
341
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
342
+ { name: "prefix", type: "string", required: true, description: "\u524D\u7F00" }
343
+ ],
344
+ returnType: "boolean",
345
+ pure: true,
346
+ examples: ['startsWith("hello", "he") // true']
347
+ },
348
+ {
349
+ name: "endsWith",
350
+ category: "string",
351
+ description: "\u68C0\u67E5\u662F\u5426\u4EE5\u6307\u5B9A\u540E\u7F00\u7ED3\u675F",
352
+ params: [
353
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
354
+ { name: "suffix", type: "string", required: true, description: "\u540E\u7F00" }
355
+ ],
356
+ returnType: "boolean",
357
+ pure: true,
358
+ examples: ['endsWith("hello", "lo") // true']
359
+ }
360
+ ];
361
+ var NUMBER_FUNCTIONS = [
362
+ {
363
+ name: "toNumber",
364
+ category: "number",
365
+ description: "\u8F6C\u6362\u4E3A\u6570\u5B57",
366
+ params: [
367
+ { name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" },
368
+ {
369
+ name: "defaultValue",
370
+ type: "number",
371
+ required: false,
372
+ defaultValue: 0,
373
+ description: "\u9ED8\u8BA4\u503C"
374
+ }
375
+ ],
376
+ returnType: "number",
377
+ pure: true,
378
+ examples: ['toNumber("123") // 123', 'toNumber("abc", 0) // 0']
318
379
  },
319
380
  {
320
381
  name: "round",
382
+ category: "number",
321
383
  description: "\u56DB\u820D\u4E94\u5165",
322
384
  params: [
323
- { name: "value", type: "number", required: true },
324
- { name: "decimals", type: "number", required: false, defaultValue: 0 }
385
+ { name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" },
386
+ {
387
+ name: "decimals",
388
+ type: "number",
389
+ required: false,
390
+ defaultValue: 0,
391
+ description: "\u5C0F\u6570\u4F4D\u6570"
392
+ }
325
393
  ],
326
394
  returnType: "number",
327
- examples: ["round(3.14159, 2)"]
395
+ pure: true,
396
+ examples: ["round(3.14159, 2) // 3.14"]
328
397
  },
329
398
  {
330
399
  name: "floor",
400
+ category: "number",
331
401
  description: "\u5411\u4E0B\u53D6\u6574",
332
- params: [{ name: "value", type: "number", required: true }],
402
+ params: [{ name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" }],
333
403
  returnType: "number",
334
- examples: ["floor(3.7)"]
404
+ pure: true,
405
+ examples: ["floor(3.7) // 3"]
335
406
  },
336
407
  {
337
408
  name: "ceil",
409
+ category: "number",
338
410
  description: "\u5411\u4E0A\u53D6\u6574",
339
- params: [{ name: "value", type: "number", required: true }],
411
+ params: [{ name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" }],
340
412
  returnType: "number",
341
- examples: ["ceil(3.2)"]
413
+ pure: true,
414
+ examples: ["ceil(3.2) // 4"]
342
415
  },
343
416
  {
344
417
  name: "abs",
418
+ category: "number",
345
419
  description: "\u7EDD\u5BF9\u503C",
346
- params: [{ name: "value", type: "number", required: true }],
420
+ params: [{ name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" }],
347
421
  returnType: "number",
348
- examples: ["abs(-5)"]
422
+ pure: true,
423
+ examples: ["abs(-5) // 5"]
349
424
  },
350
425
  {
351
426
  name: "min",
427
+ category: "number",
352
428
  description: "\u6700\u5C0F\u503C",
353
429
  params: [
354
- { name: "values", type: "number", required: true, description: "\u53EF\u53D8\u53C2\u6570" }
430
+ { name: "values", type: "number", required: true, variadic: true, description: "\u6570\u5B57\u5217\u8868" }
355
431
  ],
356
432
  returnType: "number",
357
- examples: ["min(1, 2, 3)"]
433
+ pure: true,
434
+ examples: ["min(1, 2, 3) // 1"]
358
435
  },
359
436
  {
360
437
  name: "max",
438
+ category: "number",
361
439
  description: "\u6700\u5927\u503C",
362
440
  params: [
363
- { name: "values", type: "number", required: true, description: "\u53EF\u53D8\u53C2\u6570" }
441
+ { name: "values", type: "number", required: true, variadic: true, description: "\u6570\u5B57\u5217\u8868" }
442
+ ],
443
+ returnType: "number",
444
+ pure: true,
445
+ examples: ["max(1, 2, 3) // 3"]
446
+ },
447
+ {
448
+ name: "clamp",
449
+ category: "number",
450
+ description: "\u9650\u5236\u8303\u56F4",
451
+ params: [
452
+ { name: "value", type: "number", required: true, description: "\u8F93\u5165\u6570\u5B57" },
453
+ { name: "min", type: "number", required: true, description: "\u6700\u5C0F\u503C" },
454
+ { name: "max", type: "number", required: true, description: "\u6700\u5927\u503C" }
455
+ ],
456
+ returnType: "number",
457
+ pure: true,
458
+ examples: ["clamp(5, 0, 3) // 3"]
459
+ }
460
+ ];
461
+ var ARRAY_FUNCTIONS = [
462
+ {
463
+ name: "length",
464
+ category: "array",
465
+ description: "\u83B7\u53D6\u6570\u7EC4\u957F\u5EA6",
466
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
467
+ returnType: "number",
468
+ pure: true,
469
+ examples: ["length([1, 2, 3]) // 3"]
470
+ },
471
+ {
472
+ name: "first",
473
+ category: "array",
474
+ description: "\u83B7\u53D6\u7B2C\u4E00\u4E2A\u5143\u7D20",
475
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
476
+ returnType: "any",
477
+ pure: true,
478
+ examples: ["first([1, 2, 3]) // 1"]
479
+ },
480
+ {
481
+ name: "last",
482
+ category: "array",
483
+ description: "\u83B7\u53D6\u6700\u540E\u4E00\u4E2A\u5143\u7D20",
484
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
485
+ returnType: "any",
486
+ pure: true,
487
+ examples: ["last([1, 2, 3]) // 3"]
488
+ },
489
+ {
490
+ name: "at",
491
+ category: "array",
492
+ description: "\u83B7\u53D6\u6307\u5B9A\u7D22\u5F15\u7684\u5143\u7D20",
493
+ params: [
494
+ { name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" },
495
+ { name: "index", type: "number", required: true, description: "\u7D22\u5F15" }
496
+ ],
497
+ returnType: "any",
498
+ pure: true,
499
+ examples: ["at([1, 2, 3], 1) // 2"]
500
+ },
501
+ {
502
+ name: "includes",
503
+ category: "array",
504
+ description: "\u68C0\u67E5\u662F\u5426\u5305\u542B\u5143\u7D20",
505
+ params: [
506
+ { name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" },
507
+ { name: "value", type: "any", required: true, description: "\u641C\u7D22\u503C" }
508
+ ],
509
+ returnType: "boolean",
510
+ pure: true,
511
+ examples: ["includes([1, 2, 3], 2) // true"]
512
+ },
513
+ {
514
+ name: "slice",
515
+ category: "array",
516
+ description: "\u622A\u53D6\u6570\u7EC4",
517
+ params: [
518
+ { name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" },
519
+ { name: "start", type: "number", required: true, description: "\u8D77\u59CB\u4F4D\u7F6E" },
520
+ { name: "end", type: "number", required: false, description: "\u7ED3\u675F\u4F4D\u7F6E" }
521
+ ],
522
+ returnType: "array",
523
+ pure: true,
524
+ examples: ["slice([1, 2, 3, 4], 1, 3) // [2, 3]"]
525
+ },
526
+ {
527
+ name: "concat",
528
+ category: "array",
529
+ description: "\u5408\u5E76\u6570\u7EC4",
530
+ params: [
531
+ { name: "arrays", type: "array", required: true, variadic: true, description: "\u6570\u7EC4\u5217\u8868" }
364
532
  ],
533
+ returnType: "array",
534
+ pure: true,
535
+ examples: ["concat([1, 2], [3, 4]) // [1, 2, 3, 4]"]
536
+ },
537
+ {
538
+ name: "unique",
539
+ category: "array",
540
+ description: "\u53BB\u91CD",
541
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
542
+ returnType: "array",
543
+ pure: true,
544
+ examples: ["unique([1, 2, 2, 3]) // [1, 2, 3]"]
545
+ },
546
+ {
547
+ name: "reverse",
548
+ category: "array",
549
+ description: "\u53CD\u8F6C\u6570\u7EC4",
550
+ params: [{ name: "arr", type: "array", required: true, description: "\u8F93\u5165\u6570\u7EC4" }],
551
+ returnType: "array",
552
+ pure: true,
553
+ examples: ["reverse([1, 2, 3]) // [3, 2, 1]"]
554
+ },
555
+ {
556
+ name: "sum",
557
+ category: "array",
558
+ description: "\u6C42\u548C",
559
+ params: [{ name: "arr", type: "array", required: true, description: "\u6570\u5B57\u6570\u7EC4" }],
365
560
  returnType: "number",
366
- examples: ["max(1, 2, 3)"]
561
+ pure: true,
562
+ examples: ["sum([1, 2, 3]) // 6"]
367
563
  },
368
- // 日期函数
564
+ {
565
+ name: "average",
566
+ category: "array",
567
+ description: "\u5E73\u5747\u503C",
568
+ params: [{ name: "arr", type: "array", required: true, description: "\u6570\u5B57\u6570\u7EC4" }],
569
+ returnType: "number",
570
+ pure: true,
571
+ examples: ["average([1, 2, 3]) // 2"]
572
+ }
573
+ ];
574
+ var DATE_FUNCTIONS = [
369
575
  {
370
576
  name: "now",
371
- description: "\u5F53\u524D\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09",
577
+ category: "date",
578
+ description: "\u5F53\u524D\u65F6\u95F4\u6233",
372
579
  params: [],
373
580
  returnType: "number",
374
- examples: ["now()"]
581
+ pure: false,
582
+ examples: ["now() // 1704067200000"]
583
+ },
584
+ {
585
+ name: "today",
586
+ category: "date",
587
+ description: "\u4ECA\u5929\u65E5\u671F\uFF08YYYY-MM-DD\uFF09",
588
+ params: [],
589
+ returnType: "string",
590
+ pure: false,
591
+ examples: ['today() // "2024-01-01"']
375
592
  },
376
593
  {
377
594
  name: "dateFormat",
595
+ category: "date",
378
596
  description: "\u683C\u5F0F\u5316\u65E5\u671F",
379
597
  params: [
380
- { name: "timestamp", type: "number", required: true },
381
- { name: "format", type: "string", required: false, defaultValue: "YYYY-MM-DD" }
598
+ { name: "date", type: "any", required: true, description: "\u65E5\u671F\uFF08\u65F6\u95F4\u6233\u6216\u5B57\u7B26\u4E32\uFF09" },
599
+ { name: "format", type: "string", required: true, description: "\u683C\u5F0F\u6A21\u677F" }
382
600
  ],
383
601
  returnType: "string",
384
- examples: ['dateFormat(now(), "YYYY-MM-DD HH:mm:ss")']
602
+ pure: true,
603
+ examples: ['dateFormat(now(), "YYYY-MM-DD") // "2024-01-01"']
385
604
  },
386
605
  {
387
606
  name: "dateParse",
607
+ category: "date",
388
608
  description: "\u89E3\u6790\u65E5\u671F\u5B57\u7B26\u4E32",
389
609
  params: [
390
- { name: "dateStr", type: "string", required: true },
391
- { name: "format", type: "string", required: false }
610
+ { name: "str", type: "string", required: true, description: "\u65E5\u671F\u5B57\u7B26\u4E32" },
611
+ { name: "format", type: "string", required: false, description: "\u683C\u5F0F\u6A21\u677F" }
392
612
  ],
393
613
  returnType: "number",
394
- examples: ['dateParse("2024-01-01")']
614
+ pure: true,
615
+ examples: ['dateParse("2024-01-01") // 1704067200000']
395
616
  },
396
- // 数组函数
397
617
  {
398
- name: "first",
399
- description: "\u83B7\u53D6\u6570\u7EC4\u7B2C\u4E00\u4E2A\u5143\u7D20",
400
- params: [{ name: "arr", type: "array", required: true }],
401
- returnType: "any",
402
- examples: ["first([1,2,3])"]
618
+ name: "dateAdd",
619
+ category: "date",
620
+ description: "\u65E5\u671F\u52A0\u51CF",
621
+ params: [
622
+ { name: "date", type: "any", required: true, description: "\u65E5\u671F" },
623
+ { name: "amount", type: "number", required: true, description: "\u6570\u91CF" },
624
+ { name: "unit", type: "string", required: true, description: "\u5355\u4F4D\uFF08day/week/month/year\uFF09" }
625
+ ],
626
+ returnType: "number",
627
+ pure: true,
628
+ examples: ['dateAdd(now(), 7, "day") // \u4E00\u5468\u540E']
403
629
  },
404
630
  {
405
- name: "last",
406
- description: "\u83B7\u53D6\u6570\u7EC4\u6700\u540E\u4E00\u4E2A\u5143\u7D20",
407
- params: [{ name: "arr", type: "array", required: true }],
631
+ name: "dateDiff",
632
+ category: "date",
633
+ description: "\u65E5\u671F\u5DEE",
634
+ params: [
635
+ { name: "date1", type: "any", required: true, description: "\u65E5\u671F1" },
636
+ { name: "date2", type: "any", required: true, description: "\u65E5\u671F2" },
637
+ { name: "unit", type: "string", required: false, defaultValue: "day", description: "\u5355\u4F4D" }
638
+ ],
639
+ returnType: "number",
640
+ pure: true,
641
+ examples: ['dateDiff("2024-01-10", "2024-01-01", "day") // 9']
642
+ }
643
+ ];
644
+ var LOGIC_FUNCTIONS = [
645
+ {
646
+ name: "if",
647
+ category: "logic",
648
+ description: "\u6761\u4EF6\u5224\u65AD",
649
+ params: [
650
+ { name: "condition", type: "boolean", required: true, description: "\u6761\u4EF6" },
651
+ { name: "trueValue", type: "any", required: true, description: "\u6761\u4EF6\u4E3A\u771F\u65F6\u7684\u503C" },
652
+ { name: "falseValue", type: "any", required: true, description: "\u6761\u4EF6\u4E3A\u5047\u65F6\u7684\u503C" }
653
+ ],
408
654
  returnType: "any",
409
- examples: ["last([1,2,3])"]
655
+ pure: true,
656
+ examples: ['if(state.count > 0, "\u6709", "\u65E0")']
410
657
  },
411
658
  {
412
- name: "includes",
413
- description: "\u68C0\u67E5\u6570\u7EC4\u662F\u5426\u5305\u542B\u5143\u7D20",
659
+ name: "and",
660
+ category: "logic",
661
+ description: "\u903B\u8F91\u4E0E",
414
662
  params: [
415
- { name: "arr", type: "array", required: true },
416
- { name: "value", type: "any", required: true }
663
+ {
664
+ name: "values",
665
+ type: "boolean",
666
+ required: true,
667
+ variadic: true,
668
+ description: "\u5E03\u5C14\u503C\u5217\u8868"
669
+ }
417
670
  ],
418
671
  returnType: "boolean",
419
- examples: ["includes([1,2,3], 2)"]
672
+ pure: true,
673
+ examples: ["and(true, true, false) // false"]
420
674
  },
421
675
  {
422
- name: "slice",
423
- description: "\u622A\u53D6\u6570\u7EC4",
676
+ name: "or",
677
+ category: "logic",
678
+ description: "\u903B\u8F91\u6216",
424
679
  params: [
425
- { name: "arr", type: "array", required: true },
426
- { name: "start", type: "number", required: true },
427
- { name: "end", type: "number", required: false }
680
+ {
681
+ name: "values",
682
+ type: "boolean",
683
+ required: true,
684
+ variadic: true,
685
+ description: "\u5E03\u5C14\u503C\u5217\u8868"
686
+ }
428
687
  ],
429
- returnType: "array",
430
- examples: ["slice([1,2,3,4], 1, 3)"]
688
+ returnType: "boolean",
689
+ pure: true,
690
+ examples: ["or(true, false) // true"]
691
+ },
692
+ {
693
+ name: "not",
694
+ category: "logic",
695
+ description: "\u903B\u8F91\u975E",
696
+ params: [{ name: "value", type: "boolean", required: true, description: "\u5E03\u5C14\u503C" }],
697
+ returnType: "boolean",
698
+ pure: true,
699
+ examples: ["not(true) // false"]
700
+ },
701
+ {
702
+ name: "eq",
703
+ category: "logic",
704
+ description: "\u76F8\u7B49\u5224\u65AD",
705
+ params: [
706
+ { name: "a", type: "any", required: true, description: "\u503C1" },
707
+ { name: "b", type: "any", required: true, description: "\u503C2" }
708
+ ],
709
+ returnType: "boolean",
710
+ pure: true,
711
+ examples: ["eq(1, 1) // true"]
431
712
  },
432
- // 条件函数
713
+ {
714
+ name: "ne",
715
+ category: "logic",
716
+ description: "\u4E0D\u76F8\u7B49\u5224\u65AD",
717
+ params: [
718
+ { name: "a", type: "any", required: true, description: "\u503C1" },
719
+ { name: "b", type: "any", required: true, description: "\u503C2" }
720
+ ],
721
+ returnType: "boolean",
722
+ pure: true,
723
+ examples: ["ne(1, 2) // true"]
724
+ },
725
+ {
726
+ name: "gt",
727
+ category: "logic",
728
+ description: "\u5927\u4E8E",
729
+ params: [
730
+ { name: "a", type: "number", required: true, description: "\u503C1" },
731
+ { name: "b", type: "number", required: true, description: "\u503C2" }
732
+ ],
733
+ returnType: "boolean",
734
+ pure: true,
735
+ examples: ["gt(2, 1) // true"]
736
+ },
737
+ {
738
+ name: "gte",
739
+ category: "logic",
740
+ description: "\u5927\u4E8E\u7B49\u4E8E",
741
+ params: [
742
+ { name: "a", type: "number", required: true, description: "\u503C1" },
743
+ { name: "b", type: "number", required: true, description: "\u503C2" }
744
+ ],
745
+ returnType: "boolean",
746
+ pure: true,
747
+ examples: ["gte(2, 2) // true"]
748
+ },
749
+ {
750
+ name: "lt",
751
+ category: "logic",
752
+ description: "\u5C0F\u4E8E",
753
+ params: [
754
+ { name: "a", type: "number", required: true, description: "\u503C1" },
755
+ { name: "b", type: "number", required: true, description: "\u503C2" }
756
+ ],
757
+ returnType: "boolean",
758
+ pure: true,
759
+ examples: ["lt(1, 2) // true"]
760
+ },
761
+ {
762
+ name: "lte",
763
+ category: "logic",
764
+ description: "\u5C0F\u4E8E\u7B49\u4E8E",
765
+ params: [
766
+ { name: "a", type: "number", required: true, description: "\u503C1" },
767
+ { name: "b", type: "number", required: true, description: "\u503C2" }
768
+ ],
769
+ returnType: "boolean",
770
+ pure: true,
771
+ examples: ["lte(2, 2) // true"]
772
+ }
773
+ ];
774
+ var UTILITY_FUNCTIONS = [
433
775
  {
434
776
  name: "default",
435
- description: "\u63D0\u4F9B\u9ED8\u8BA4\u503C",
777
+ category: "utility",
778
+ description: "\u9ED8\u8BA4\u503C",
436
779
  params: [
437
- { name: "value", type: "any", required: true },
438
- { name: "defaultValue", type: "any", required: true }
780
+ { name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" },
781
+ { name: "defaultValue", type: "any", required: true, description: "\u9ED8\u8BA4\u503C" }
439
782
  ],
440
783
  returnType: "any",
441
- examples: ['default(null, "fallback")']
784
+ pure: true,
785
+ examples: ['default(state.name, "\u672A\u77E5")']
442
786
  },
443
787
  {
444
- name: "ifElse",
445
- description: "\u6761\u4EF6\u5224\u65AD",
788
+ name: "coalesce",
789
+ category: "utility",
790
+ description: "\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u975E\u7A7A\u503C",
446
791
  params: [
447
- { name: "condition", type: "boolean", required: true },
448
- { name: "trueValue", type: "any", required: true },
449
- { name: "falseValue", type: "any", required: true }
792
+ { name: "values", type: "any", required: true, variadic: true, description: "\u503C\u5217\u8868" }
450
793
  ],
451
794
  returnType: "any",
452
- examples: ['ifElse(age > 18, "\u6210\u5E74", "\u672A\u6210\u5E74")']
795
+ pure: true,
796
+ examples: ['coalesce(null, undefined, "value") // "value"']
453
797
  },
454
798
  {
455
799
  name: "isEmpty",
800
+ category: "utility",
456
801
  description: "\u68C0\u67E5\u662F\u5426\u4E3A\u7A7A",
457
- params: [{ name: "value", type: "any", required: true }],
802
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
458
803
  returnType: "boolean",
459
- examples: ['isEmpty("")', "isEmpty([])"]
804
+ pure: true,
805
+ examples: ['isEmpty("") // true', "isEmpty([]) // true"]
460
806
  },
461
807
  {
462
808
  name: "isNull",
463
- description: "\u68C0\u67E5\u662F\u5426\u4E3A null \u6216 undefined",
464
- params: [{ name: "value", type: "any", required: true }],
809
+ category: "utility",
810
+ description: "\u68C0\u67E5\u662F\u5426\u4E3A null/undefined",
811
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
465
812
  returnType: "boolean",
466
- examples: ["isNull(null)"]
813
+ pure: true,
814
+ examples: ["isNull(null) // true"]
467
815
  },
468
- // JSON 函数
469
816
  {
470
- name: "jsonParse",
817
+ name: "type",
818
+ category: "utility",
819
+ description: "\u83B7\u53D6\u503C\u7C7B\u578B",
820
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
821
+ returnType: "string",
822
+ pure: true,
823
+ examples: ['type([]) // "array"', 'type({}) // "object"']
824
+ },
825
+ {
826
+ name: "toString",
827
+ category: "type",
828
+ description: "\u8F6C\u6362\u4E3A\u5B57\u7B26\u4E32",
829
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
830
+ returnType: "string",
831
+ pure: true,
832
+ examples: ['toString(123) // "123"']
833
+ },
834
+ {
835
+ name: "toBoolean",
836
+ category: "type",
837
+ description: "\u8F6C\u6362\u4E3A\u5E03\u5C14\u503C",
838
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
839
+ returnType: "boolean",
840
+ pure: true,
841
+ examples: ['toBoolean("true") // true', "toBoolean(1) // true"]
842
+ },
843
+ {
844
+ name: "toJSON",
845
+ category: "utility",
846
+ description: "\u8F6C\u6362\u4E3A JSON \u5B57\u7B26\u4E32",
847
+ params: [{ name: "value", type: "any", required: true, description: "\u8F93\u5165\u503C" }],
848
+ returnType: "string",
849
+ pure: true,
850
+ examples: ['toJSON({a: 1}) // "{\\"a\\":1}"']
851
+ },
852
+ {
853
+ name: "fromJSON",
854
+ category: "utility",
471
855
  description: "\u89E3\u6790 JSON \u5B57\u7B26\u4E32",
472
- params: [{ name: "str", type: "string", required: true }],
856
+ params: [{ name: "str", type: "string", required: true, description: "JSON \u5B57\u7B26\u4E32" }],
857
+ returnType: "any",
858
+ pure: true,
859
+ examples: ['fromJSON("{\\"a\\":1}") // {a: 1}']
860
+ },
861
+ {
862
+ name: "get",
863
+ category: "object",
864
+ description: "\u83B7\u53D6\u5D4C\u5957\u5C5E\u6027",
865
+ params: [
866
+ { name: "obj", type: "object", required: true, description: "\u8F93\u5165\u5BF9\u8C61" },
867
+ { name: "path", type: "string", required: true, description: "\u5C5E\u6027\u8DEF\u5F84\uFF08\u70B9\u5206\u9694\uFF09" },
868
+ { name: "defaultValue", type: "any", required: false, description: "\u9ED8\u8BA4\u503C" }
869
+ ],
473
870
  returnType: "any",
474
- examples: [`jsonParse('{"a":1}')`]
871
+ pure: true,
872
+ examples: ['get(state, "user.name", "\u672A\u77E5")']
873
+ }
874
+ ];
875
+ var FORMAT_FUNCTIONS = [
876
+ {
877
+ name: "currency",
878
+ category: "format",
879
+ description: "\u683C\u5F0F\u5316\u8D27\u5E01",
880
+ params: [
881
+ { name: "value", type: "number", required: true, description: "\u91D1\u989D" },
882
+ {
883
+ name: "symbol",
884
+ type: "string",
885
+ required: false,
886
+ defaultValue: "\xA5",
887
+ description: "\u8D27\u5E01\u7B26\u53F7"
888
+ },
889
+ {
890
+ name: "decimals",
891
+ type: "number",
892
+ required: false,
893
+ defaultValue: 2,
894
+ description: "\u5C0F\u6570\u4F4D\u6570"
895
+ }
896
+ ],
897
+ returnType: "string",
898
+ pure: true,
899
+ examples: ['currency(1234.5) // "\xA51,234.50"']
900
+ },
901
+ {
902
+ name: "percent",
903
+ category: "format",
904
+ description: "\u683C\u5F0F\u5316\u767E\u5206\u6BD4",
905
+ params: [
906
+ { name: "value", type: "number", required: true, description: "\u6570\u503C\uFF080-1\uFF09" },
907
+ {
908
+ name: "decimals",
909
+ type: "number",
910
+ required: false,
911
+ defaultValue: 0,
912
+ description: "\u5C0F\u6570\u4F4D\u6570"
913
+ }
914
+ ],
915
+ returnType: "string",
916
+ pure: true,
917
+ examples: ['percent(0.1234) // "12%"']
918
+ },
919
+ {
920
+ name: "number",
921
+ category: "format",
922
+ description: "\u683C\u5F0F\u5316\u6570\u5B57\uFF08\u5343\u5206\u4F4D\uFF09",
923
+ params: [
924
+ { name: "value", type: "number", required: true, description: "\u6570\u503C" },
925
+ {
926
+ name: "decimals",
927
+ type: "number",
928
+ required: false,
929
+ defaultValue: 0,
930
+ description: "\u5C0F\u6570\u4F4D\u6570"
931
+ }
932
+ ],
933
+ returnType: "string",
934
+ pure: true,
935
+ examples: ['number(1234567) // "1,234,567"']
936
+ },
937
+ {
938
+ name: "pluralize",
939
+ category: "format",
940
+ description: "\u590D\u6570\u5F62\u5F0F",
941
+ params: [
942
+ { name: "count", type: "number", required: true, description: "\u6570\u91CF" },
943
+ { name: "singular", type: "string", required: true, description: "\u5355\u6570\u5F62\u5F0F" },
944
+ { name: "plural", type: "string", required: true, description: "\u590D\u6570\u5F62\u5F0F" }
945
+ ],
946
+ returnType: "string",
947
+ pure: true,
948
+ examples: ['pluralize(1, "item", "items") // "1 item"']
475
949
  },
476
950
  {
477
- name: "jsonStringify",
478
- description: "\u5E8F\u5217\u5316\u4E3A JSON",
479
- params: [{ name: "value", type: "any", required: true }],
951
+ name: "mask",
952
+ category: "format",
953
+ description: "\u63A9\u7801\u5904\u7406",
954
+ params: [
955
+ { name: "str", type: "string", required: true, description: "\u8F93\u5165\u5B57\u7B26\u4E32" },
956
+ {
957
+ name: "keepPrefix",
958
+ type: "number",
959
+ required: false,
960
+ defaultValue: 3,
961
+ description: "\u4FDD\u7559\u524D\u7F00"
962
+ },
963
+ {
964
+ name: "keepSuffix",
965
+ type: "number",
966
+ required: false,
967
+ defaultValue: 4,
968
+ description: "\u4FDD\u7559\u540E\u7F00"
969
+ },
970
+ {
971
+ name: "maskChar",
972
+ type: "string",
973
+ required: false,
974
+ defaultValue: "*",
975
+ description: "\u63A9\u7801\u5B57\u7B26"
976
+ }
977
+ ],
480
978
  returnType: "string",
481
- examples: ["jsonStringify({a:1})"]
979
+ pure: true,
980
+ examples: ['mask("13812345678", 3, 4) // "138****5678"']
482
981
  }
483
982
  ];
484
- var BUILTIN_FUNCTION_NAMES = new Set(BUILTIN_FUNCTIONS.map((f) => f.name));
485
- var ALLOWED_ROOT_VARIABLES = [
486
- "state",
487
- "query",
488
- "context",
489
- "event",
490
- "item",
491
- "index"
983
+ var ALL_BUILTIN_FUNCTIONS = [
984
+ ...STRING_FUNCTIONS,
985
+ ...NUMBER_FUNCTIONS,
986
+ ...ARRAY_FUNCTIONS,
987
+ ...DATE_FUNCTIONS,
988
+ ...LOGIC_FUNCTIONS,
989
+ ...UTILITY_FUNCTIONS,
990
+ ...FORMAT_FUNCTIONS
492
991
  ];
493
- function isExpressionBinding(value) {
494
- return value !== null && typeof value === "object" && value.__isExpression === true && typeof value.expression === "string";
495
- }
496
- function createExpressionBinding(expression, fallback) {
497
- return {
498
- __isExpression: true,
499
- expression,
500
- fallback
501
- };
502
- }
503
-
504
- // src/rbac/index.ts
505
- var BUILTIN_PERMISSIONS = {
506
- // 页面权限
507
- PAGE_READ: "page:read",
508
- PAGE_CREATE: "page:create",
509
- PAGE_UPDATE: "page:update",
510
- PAGE_DELETE: "page:delete",
511
- PAGE_PUBLISH: "page:publish",
512
- PAGE_ROLLBACK: "page:rollback",
513
- // 组件权限
514
- COMPONENT_READ: "component:read",
515
- COMPONENT_CREATE: "component:create",
516
- COMPONENT_BLOCK: "component:block",
517
- COMPONENT_UNBLOCK: "component:unblock",
518
- // 活动权限
519
- ACTIVITY_READ: "activity:read",
520
- ACTIVITY_CREATE: "activity:create",
521
- ACTIVITY_UPDATE: "activity:update",
522
- // 定义权限
523
- DEFINITION_READ: "definition:read",
524
- DEFINITION_CREATE: "definition:create",
525
- DEFINITION_UPDATE: "definition:update",
526
- // 管理员权限
527
- ADMIN_ALL: "*:*"
528
- };
529
- var BUILTIN_ROLES = {
530
- /** 超级管理员 */
531
- SUPER_ADMIN: "super_admin",
532
- /** 租户管理员 */
533
- TENANT_ADMIN: "tenant_admin",
534
- /** 应用管理员 */
535
- APP_ADMIN: "app_admin",
536
- /** 编辑者 */
537
- EDITOR: "editor",
538
- /** 发布者 */
539
- PUBLISHER: "publisher",
540
- /** 审核者 */
541
- REVIEWER: "reviewer",
542
- /** 查看者 */
543
- VIEWER: "viewer"
992
+ var ALLOWED_FUNCTION_NAMES = ALL_BUILTIN_FUNCTIONS.map((f) => f.name);
993
+ var DEFAULT_EXPRESSION_VALIDATION_CONFIG = {
994
+ allowedContextPaths: ["state", "binding", "context", "props", "event"],
995
+ allowedFunctions: ALLOWED_FUNCTION_NAMES,
996
+ maxDepth: 10,
997
+ maxLength: 1e3,
998
+ allowTemplate: true,
999
+ allowChaining: true
544
1000
  };
545
1001
 
546
- // src/migrations/index.ts
547
- var SCHEMA_VERSIONS = ["1.0.0", "1.1.0", "2.0.0"];
548
- var CURRENT_SCHEMA_VERSION = "1.0.0";
549
- var migrations = [];
550
- function registerMigration(migration) {
551
- const exists = migrations.some(
552
- (m) => m.from === migration.from && m.to === migration.to
553
- );
554
- if (exists) {
555
- throw new Error(`Migration from ${migration.from} to ${migration.to} already exists`);
556
- }
557
- migrations.push(migration);
1002
+ // src/page/expression.ts
1003
+ function literal(value) {
1004
+ return value;
558
1005
  }
559
- function getAllMigrations() {
560
- return [...migrations];
1006
+ function stateRef(path, fallback) {
1007
+ return {
1008
+ type: "state",
1009
+ value: path,
1010
+ fallback,
1011
+ meta: { dependencies: [`state.${path}`] }
1012
+ };
561
1013
  }
562
- function findMigrationPath(from, to) {
563
- const path = [];
564
- let current = from;
565
- while (current !== to) {
566
- const nextMigration = migrations.find((m) => m.from === current);
567
- if (!nextMigration) {
568
- throw new Error(`No migration path from ${current} to ${to}`);
569
- }
570
- path.push(nextMigration);
571
- current = nextMigration.to;
572
- if (path.length > 100) {
573
- throw new Error("Migration path too long, possible circular dependency");
574
- }
575
- }
576
- return path;
1014
+ function bindingRef(bindingId, path, fallback) {
1015
+ return {
1016
+ type: "binding",
1017
+ value: `${bindingId}.${path}`,
1018
+ fallback,
1019
+ meta: { dependencies: [`binding.${bindingId}.${path}`] }
1020
+ };
577
1021
  }
578
- function migratePageSchema(data, targetVersion) {
579
- const fromVersion = data.schemaVersion || "1.0.0";
580
- const toVersion = targetVersion || CURRENT_SCHEMA_VERSION;
581
- if (fromVersion === toVersion) {
582
- return {
583
- success: true,
584
- data,
585
- fromVersion,
586
- toVersion,
587
- appliedMigrations: []
588
- };
589
- }
590
- try {
591
- const path = findMigrationPath(fromVersion, toVersion);
592
- let result = { ...data };
593
- const appliedMigrations = [];
594
- for (const migration of path) {
595
- result = migration.migrate(result);
596
- result.schemaVersion = migration.to;
597
- appliedMigrations.push(`${migration.from} -> ${migration.to}`);
1022
+ function template(templateString, fallback) {
1023
+ const dependencies = [];
1024
+ const pattern = /\$\{([^}]+)\}/g;
1025
+ let match;
1026
+ while ((match = pattern.exec(templateString)) !== null) {
1027
+ if (match[1]) {
1028
+ dependencies.push(match[1]);
598
1029
  }
599
- return {
600
- success: true,
601
- data: result,
602
- fromVersion,
603
- toVersion,
604
- appliedMigrations
605
- };
606
- } catch (error) {
607
- return {
608
- success: false,
609
- fromVersion,
610
- toVersion,
611
- appliedMigrations: [],
612
- error: error instanceof Error ? error.message : "Unknown error"
613
- };
614
1030
  }
1031
+ return {
1032
+ type: "template",
1033
+ value: templateString,
1034
+ fallback,
1035
+ meta: { dependencies }
1036
+ };
615
1037
  }
616
- function needsMigration(data, targetVersion) {
617
- const currentVersion = data.schemaVersion || "1.0.0";
618
- const target = targetVersion || CURRENT_SCHEMA_VERSION;
619
- return currentVersion !== target;
620
- }
621
- function getVersionInfo(version) {
622
- const [major, minor, patch] = version.split(".").map(Number);
623
- return { major, minor, patch };
624
- }
625
- function compareVersions(a, b) {
626
- const va = getVersionInfo(a);
627
- const vb = getVersionInfo(b);
628
- if (va.major !== vb.major) return va.major < vb.major ? -1 : 1;
629
- if (va.minor !== vb.minor) return va.minor < vb.minor ? -1 : 1;
630
- if (va.patch !== vb.patch) return va.patch < vb.patch ? -1 : 1;
631
- return 0;
1038
+ function queryRef(queryId, path, fallback) {
1039
+ return bindingRef(queryId, path, fallback);
632
1040
  }
633
- registerMigration({
634
- from: "1.0.0",
635
- to: "1.1.0",
636
- description: "\u6DFB\u52A0 Definition \u7248\u672C\u7ED1\u5B9A\u5B57\u6BB5",
637
- migrate: (data) => {
638
- return {
639
- ...data,
640
- actionDefVersionIds: data.actionDefVersionIds || [],
641
- dataQueryVersionIds: data.dataQueryVersionIds || []
642
- };
643
- }
644
- });
645
- registerMigration({
646
- from: "1.1.0",
647
- to: "2.0.0",
648
- description: "\u91CD\u6784\u7EC4\u4EF6\u4E8B\u4EF6\u7ED3\u6784",
649
- breaking: true,
650
- migrate: (data) => {
651
- return {
652
- ...data,
653
- components: data.components.map((component) => ({
654
- ...component,
655
- // 示例:将 events 数组中的 actions 结构标准化
656
- events: component.events?.map((event) => ({
657
- ...event,
658
- // 确保 enabled 字段存在
659
- enabled: event.enabled ?? true
660
- }))
661
- }))
662
- };
663
- }
664
- });
665
- export {
666
- ACTION_SPEC_VERSION,
667
- ALLOWED_ROOT_VARIABLES,
668
- BUILTIN_FUNCTIONS,
669
- BUILTIN_FUNCTION_NAMES,
670
- BUILTIN_PERMISSIONS,
671
- BUILTIN_PROPERTY_GROUPS,
672
- BUILTIN_ROLES,
673
- COMPONENT_CATEGORIES,
674
- COMPONENT_META_SCHEMA_VERSION,
675
- CURRENT_SCHEMA_VERSION,
676
- DATA_QUERY_SPEC_VERSION,
677
- ErrorCode,
678
- ErrorCodeCategory,
679
- ErrorMessages,
680
- PAGE_SCHEMA_VERSION,
681
- PublishStatus,
682
- SCHEMA_VERSIONS,
683
- compareVersions,
684
- createDjvlcError,
685
- createExpressionBinding,
686
- findMigrationPath,
687
- getAllMigrations,
688
- getContractsVersion,
689
- getHttpStatusFromErrorCode,
690
- getVersionInfo,
691
- isExpressionBinding,
692
- isRetryableError,
693
- isVersionCompatible,
694
- migratePageSchema,
695
- needsMigration,
696
- registerMigration
697
- };
698
- //# sourceMappingURL=index.mjs.map
1041
+
1042
+ // src/component/meta.ts
1043
+ var CURRENT_COMPONENT_META_VERSION = "2.0.0";
1044
+
1045
+ // src/action/types.ts
1046
+ var ActionType = /* @__PURE__ */ ((ActionType2) => {
1047
+ ActionType2["CLAIM"] = "claim";
1048
+ ActionType2["SIGNIN"] = "signin";
1049
+ ActionType2["LOTTERY"] = "lottery";
1050
+ ActionType2["RESERVE"] = "reserve";
1051
+ ActionType2["BIND"] = "bind";
1052
+ ActionType2["TASK_COMPLETE"] = "task_complete";
1053
+ ActionType2["VOTE"] = "vote";
1054
+ ActionType2["SHARE"] = "share";
1055
+ ActionType2["FORM_SUBMIT"] = "form_submit";
1056
+ ActionType2["CUSTOM"] = "custom";
1057
+ return ActionType2;
1058
+ })(ActionType || {});
1059
+
1060
+ // src/action/spec.ts
1061
+ var CURRENT_ACTION_SPEC_VERSION = "2.0.0";
1062
+
1063
+ // src/data-query/spec.ts
1064
+ var CURRENT_DATA_QUERY_SPEC_VERSION = "2.0.0";
1065
+
1066
+ // src/index.ts
1067
+ var VERSION = "2.1.0";
1068
+ var PROTOCOL_VERSION = "2.0.0";
1069
+ var PAGE_SCHEMA_VERSION = "2.0.0";
1070
+ var COMPONENT_META_SCHEMA_VERSION = "2.0.0";
1071
+ var ACTION_SPEC_VERSION = "2.0.0";
1072
+ var DATA_QUERY_SPEC_VERSION = "2.0.0";
1073
+
1074
+ export { ACTION_SPEC_VERSION, ALLOWED_FUNCTION_NAMES, ALL_BUILTIN_FUNCTIONS, ARRAY_FUNCTIONS, ActionType, AuditAction, COMPONENT_META_SCHEMA_VERSION, CURRENT_ACTION_SPEC_VERSION, CURRENT_COMPONENT_META_VERSION, CURRENT_DATA_QUERY_SPEC_VERSION, CURRENT_SCHEMA_VERSION, DATA_QUERY_SPEC_VERSION, DATE_FUNCTIONS, DEFAULT_EXPRESSION_VALIDATION_CONFIG, ErrorCategory, ErrorCode, ErrorCodeToHttpStatus, ErrorMessages, FORMAT_FUNCTIONS, LOGIC_FUNCTIONS, NUMBER_FUNCTIONS, PAGE_SCHEMA_VERSION, PROTOCOL_VERSION, PageStatus, PublishChannel, PublishStatus, STRING_FUNCTIONS, UTILITY_FUNCTIONS, VERSION, VersionStatus, bindingRef, createDjvlcError, isDjvlcError, literal, queryRef, stateRef, template };