@djvlc/contracts-types 1.0.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 ADDED
@@ -0,0 +1,643 @@
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
21
+ 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";
76
+ return ErrorCode2;
77
+ })(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"
151
+ };
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
+
188
+ // src/page/index.ts
189
+ var PublishStatus = /* @__PURE__ */ ((PublishStatus2) => {
190
+ PublishStatus2["PENDING"] = "pending";
191
+ PublishStatus2["PUBLISHING"] = "publishing";
192
+ PublishStatus2["SUCCESS"] = "success";
193
+ PublishStatus2["FAILED"] = "failed";
194
+ PublishStatus2["ROLLBACK"] = "rollback";
195
+ return PublishStatus2;
196
+ })(PublishStatus || {});
197
+
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
+ ];
211
+
212
+ // src/expression/index.ts
213
+ var BUILTIN_FUNCTIONS = [
214
+ // 字符串函数
215
+ {
216
+ name: "len",
217
+ description: "\u83B7\u53D6\u5B57\u7B26\u4E32\u6216\u6570\u7EC4\u957F\u5EA6",
218
+ params: [{ name: "value", type: "any", required: true }],
219
+ returnType: "number",
220
+ examples: ['len("hello")', "len([1,2,3])"]
221
+ },
222
+ {
223
+ name: "trim",
224
+ description: "\u53BB\u9664\u5B57\u7B26\u4E32\u9996\u5C3E\u7A7A\u683C",
225
+ params: [{ name: "str", type: "string", required: true }],
226
+ returnType: "string",
227
+ examples: ['trim(" hello ")']
228
+ },
229
+ {
230
+ name: "upper",
231
+ description: "\u8F6C\u4E3A\u5927\u5199",
232
+ params: [{ name: "str", type: "string", required: true }],
233
+ returnType: "string",
234
+ examples: ['upper("hello")']
235
+ },
236
+ {
237
+ name: "lower",
238
+ description: "\u8F6C\u4E3A\u5C0F\u5199",
239
+ params: [{ name: "str", type: "string", required: true }],
240
+ returnType: "string",
241
+ examples: ['lower("HELLO")']
242
+ },
243
+ {
244
+ name: "substr",
245
+ description: "\u622A\u53D6\u5B50\u5B57\u7B26\u4E32",
246
+ 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" }
259
+ ],
260
+ returnType: "string",
261
+ examples: ['concat("a", "b", "c")']
262
+ },
263
+ {
264
+ name: "replace",
265
+ description: "\u66FF\u6362\u5B57\u7B26\u4E32",
266
+ params: [
267
+ { name: "str", type: "string", required: true },
268
+ { name: "search", type: "string", required: true },
269
+ { name: "replacement", type: "string", required: true }
270
+ ],
271
+ returnType: "string",
272
+ examples: ['replace("hello", "l", "x")']
273
+ },
274
+ {
275
+ name: "split",
276
+ description: "\u5206\u5272\u5B57\u7B26\u4E32",
277
+ params: [
278
+ { name: "str", type: "string", required: true },
279
+ { name: "separator", type: "string", required: true }
280
+ ],
281
+ returnType: "array",
282
+ examples: ['split("a,b,c", ",")']
283
+ },
284
+ {
285
+ name: "join",
286
+ description: "\u8FDE\u63A5\u6570\u7EC4\u4E3A\u5B57\u7B26\u4E32",
287
+ params: [
288
+ { name: "arr", type: "array", required: true },
289
+ { name: "separator", type: "string", required: false, defaultValue: "," }
290
+ ],
291
+ returnType: "string",
292
+ examples: ['join(["a","b","c"], "-")']
293
+ },
294
+ // 数字函数
295
+ {
296
+ name: "toNumber",
297
+ description: "\u8F6C\u4E3A\u6570\u5B57",
298
+ params: [{ name: "value", type: "any", required: true }],
299
+ returnType: "number",
300
+ examples: ['toNumber("123")']
301
+ },
302
+ {
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)"]
308
+ },
309
+ {
310
+ name: "round",
311
+ description: "\u56DB\u820D\u4E94\u5165",
312
+ params: [
313
+ { name: "value", type: "number", required: true },
314
+ { name: "decimals", type: "number", required: false, defaultValue: 0 }
315
+ ],
316
+ returnType: "number",
317
+ examples: ["round(3.14159, 2)"]
318
+ },
319
+ {
320
+ name: "floor",
321
+ description: "\u5411\u4E0B\u53D6\u6574",
322
+ params: [{ name: "value", type: "number", required: true }],
323
+ returnType: "number",
324
+ examples: ["floor(3.7)"]
325
+ },
326
+ {
327
+ name: "ceil",
328
+ description: "\u5411\u4E0A\u53D6\u6574",
329
+ params: [{ name: "value", type: "number", required: true }],
330
+ returnType: "number",
331
+ examples: ["ceil(3.2)"]
332
+ },
333
+ {
334
+ name: "abs",
335
+ description: "\u7EDD\u5BF9\u503C",
336
+ params: [{ name: "value", type: "number", required: true }],
337
+ returnType: "number",
338
+ examples: ["abs(-5)"]
339
+ },
340
+ {
341
+ name: "min",
342
+ description: "\u6700\u5C0F\u503C",
343
+ params: [
344
+ { name: "values", type: "number", required: true, description: "\u53EF\u53D8\u53C2\u6570" }
345
+ ],
346
+ returnType: "number",
347
+ examples: ["min(1, 2, 3)"]
348
+ },
349
+ {
350
+ name: "max",
351
+ description: "\u6700\u5927\u503C",
352
+ params: [
353
+ { name: "values", type: "number", required: true, description: "\u53EF\u53D8\u53C2\u6570" }
354
+ ],
355
+ returnType: "number",
356
+ examples: ["max(1, 2, 3)"]
357
+ },
358
+ // 日期函数
359
+ {
360
+ name: "now",
361
+ description: "\u5F53\u524D\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09",
362
+ params: [],
363
+ returnType: "number",
364
+ examples: ["now()"]
365
+ },
366
+ {
367
+ name: "dateFormat",
368
+ description: "\u683C\u5F0F\u5316\u65E5\u671F",
369
+ params: [
370
+ { name: "timestamp", type: "number", required: true },
371
+ { name: "format", type: "string", required: false, defaultValue: "YYYY-MM-DD" }
372
+ ],
373
+ returnType: "string",
374
+ examples: ['dateFormat(now(), "YYYY-MM-DD HH:mm:ss")']
375
+ },
376
+ {
377
+ name: "dateParse",
378
+ description: "\u89E3\u6790\u65E5\u671F\u5B57\u7B26\u4E32",
379
+ params: [
380
+ { name: "dateStr", type: "string", required: true },
381
+ { name: "format", type: "string", required: false }
382
+ ],
383
+ returnType: "number",
384
+ examples: ['dateParse("2024-01-01")']
385
+ },
386
+ // 数组函数
387
+ {
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])"]
393
+ },
394
+ {
395
+ name: "last",
396
+ description: "\u83B7\u53D6\u6570\u7EC4\u6700\u540E\u4E00\u4E2A\u5143\u7D20",
397
+ params: [{ name: "arr", type: "array", required: true }],
398
+ returnType: "any",
399
+ examples: ["last([1,2,3])"]
400
+ },
401
+ {
402
+ name: "includes",
403
+ description: "\u68C0\u67E5\u6570\u7EC4\u662F\u5426\u5305\u542B\u5143\u7D20",
404
+ params: [
405
+ { name: "arr", type: "array", required: true },
406
+ { name: "value", type: "any", required: true }
407
+ ],
408
+ returnType: "boolean",
409
+ examples: ["includes([1,2,3], 2)"]
410
+ },
411
+ {
412
+ name: "slice",
413
+ description: "\u622A\u53D6\u6570\u7EC4",
414
+ params: [
415
+ { name: "arr", type: "array", required: true },
416
+ { name: "start", type: "number", required: true },
417
+ { name: "end", type: "number", required: false }
418
+ ],
419
+ returnType: "array",
420
+ examples: ["slice([1,2,3,4], 1, 3)"]
421
+ },
422
+ // 条件函数
423
+ {
424
+ name: "default",
425
+ description: "\u63D0\u4F9B\u9ED8\u8BA4\u503C",
426
+ params: [
427
+ { name: "value", type: "any", required: true },
428
+ { name: "defaultValue", type: "any", required: true }
429
+ ],
430
+ returnType: "any",
431
+ examples: ['default(null, "fallback")']
432
+ },
433
+ {
434
+ name: "ifElse",
435
+ description: "\u6761\u4EF6\u5224\u65AD",
436
+ params: [
437
+ { name: "condition", type: "boolean", required: true },
438
+ { name: "trueValue", type: "any", required: true },
439
+ { name: "falseValue", type: "any", required: true }
440
+ ],
441
+ returnType: "any",
442
+ examples: ['ifElse(age > 18, "\u6210\u5E74", "\u672A\u6210\u5E74")']
443
+ },
444
+ {
445
+ name: "isEmpty",
446
+ description: "\u68C0\u67E5\u662F\u5426\u4E3A\u7A7A",
447
+ params: [{ name: "value", type: "any", required: true }],
448
+ returnType: "boolean",
449
+ examples: ['isEmpty("")', "isEmpty([])"]
450
+ },
451
+ {
452
+ name: "isNull",
453
+ description: "\u68C0\u67E5\u662F\u5426\u4E3A null \u6216 undefined",
454
+ params: [{ name: "value", type: "any", required: true }],
455
+ returnType: "boolean",
456
+ examples: ["isNull(null)"]
457
+ },
458
+ // JSON 函数
459
+ {
460
+ name: "jsonParse",
461
+ description: "\u89E3\u6790 JSON \u5B57\u7B26\u4E32",
462
+ params: [{ name: "str", type: "string", required: true }],
463
+ returnType: "any",
464
+ examples: [`jsonParse('{"a":1}')`]
465
+ },
466
+ {
467
+ name: "jsonStringify",
468
+ description: "\u5E8F\u5217\u5316\u4E3A JSON",
469
+ params: [{ name: "value", type: "any", required: true }],
470
+ returnType: "string",
471
+ examples: ["jsonStringify({a:1})"]
472
+ }
473
+ ];
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"
482
+ ];
483
+ function isExpressionBinding(value) {
484
+ return value !== null && typeof value === "object" && value.__isExpression === true && typeof value.expression === "string";
485
+ }
486
+ function createExpressionBinding(expression, fallback) {
487
+ return {
488
+ __isExpression: true,
489
+ expression,
490
+ fallback
491
+ };
492
+ }
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;
525
+ }
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}`);
546
+ }
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
+ }
563
+ }
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;
580
+ }
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