vome-core 0.0.49 → 0.0.52

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.
Files changed (40) hide show
  1. package/dist/admin/config/plugin-dev.js +1 -54
  2. package/dist/admin/crud/components/vm-richtext.vue +115 -2
  3. package/dist/admin/crud/components/vm-upload.vue +1 -1
  4. package/dist/admin/crud/config.js +1 -33
  5. package/dist/admin/crud/confirm.js +1 -97
  6. package/dist/admin/crud/dict.js +1 -48
  7. package/dist/admin/crud/index.js +1 -74
  8. package/dist/admin/crud/key.js +1 -20
  9. package/dist/admin/crud/mitt.js +1 -21
  10. package/dist/admin/crud/plugins.js +1 -216
  11. package/dist/admin/crud/span.js +1 -35
  12. package/dist/admin/crud/style.js +1 -74
  13. package/dist/admin/crud/validate.js +1 -92
  14. package/dist/admin/crud/vm-search.vue +12 -4
  15. package/dist/admin/crud/vm-tabs.vue +94 -0
  16. package/dist/admin/crud/vm-toolbar.vue +16 -57
  17. package/dist/admin/directives/perm.js +1 -14
  18. package/dist/admin/hooks/useUpload.js +1 -63
  19. package/dist/admin/lib/browser.js +1 -24
  20. package/dist/admin/lib/cn.js +1 -5
  21. package/dist/admin/lib/dialog-float.js +1 -13
  22. package/dist/admin/lib/export-excel.js +1 -64
  23. package/dist/admin/lib/file-preview.js +1 -74
  24. package/dist/admin/lib/import-excel.js +1 -61
  25. package/dist/admin/lib/json.js +1 -42
  26. package/dist/admin/lib/menu.js +1 -11
  27. package/dist/admin/lib/tree.js +1 -1
  28. package/dist/admin/lib/upload.js +1 -88
  29. package/dist/admin/lib/video-frame.js +1 -80
  30. package/dist/index.js +1 -28021
  31. package/dist/server/index.js +1 -31407
  32. package/dist/shared/excel.js +1 -93
  33. package/dist/shared/index.js +1 -14
  34. package/dist/shared/tree.js +1 -39
  35. package/dist/src/orm/join-tables.d.ts +12 -0
  36. package/dist/src/orm/query-op.d.ts +10 -1
  37. package/dist/typings/routing/crud.d.ts +18 -4
  38. package/package.json +1 -1
  39. package/typings/admin/comm/crud.d.ts +2 -2
  40. package/typings/admin/comm/crud.ts +1 -1
@@ -1,93 +1 @@
1
- import * as XLSX from "xlsx";
2
- export const IMPORT_SKIP_FIELDS = [
3
- "id",
4
- "createTime",
5
- "updateTime",
6
- "deletedAt",
7
- "tenantId"
8
- ];
9
- export function isImportSkipField(name) {
10
- return IMPORT_SKIP_FIELDS.includes(name);
11
- }
12
- export function buildExcelBuffer(columns, rows, formatCell) {
13
- const headers = columns.map((c) => c.label || c.prop);
14
- const body = rows.map((row) => columns.map((col) => {
15
- if (formatCell)
16
- return formatCell(col.prop, row);
17
- const val = row[col.prop];
18
- if (val == null)
19
- return "";
20
- return String(val);
21
- }));
22
- const sheet = XLSX.utils.aoa_to_sheet([headers, ...body]);
23
- const book = XLSX.utils.book_new();
24
- XLSX.utils.book_append_sheet(book, sheet, "Sheet1");
25
- return XLSX.write(book, { bookType: "xlsx", type: "array" });
26
- }
27
- export function buildImportTemplateBuffer(columns) {
28
- return buildExcelBuffer(columns, []);
29
- }
30
- export function parseExcelBuffer(data, columns) {
31
- const book = XLSX.read(data, { type: "array", cellDates: true });
32
- const name = book.SheetNames[0];
33
- if (!name)
34
- return [];
35
- const sheet = book.Sheets[name];
36
- if (!sheet)
37
- return [];
38
- const aoa = XLSX.utils.sheet_to_json(sheet, {
39
- header: 1,
40
- defval: "",
41
- raw: false
42
- });
43
- if (!aoa.length)
44
- return [];
45
- const headerRow = (aoa[0] || []).map((h) => String(h ?? "").trim());
46
- const labelToProp = new Map;
47
- if (columns?.length) {
48
- for (const c of columns) {
49
- labelToProp.set(c.label.trim(), c.prop);
50
- labelToProp.set(c.prop, c.prop);
51
- }
52
- }
53
- const props = headerRow.map((h) => {
54
- if (!h)
55
- return "";
56
- return labelToProp.get(h) || h;
57
- });
58
- const rows = [];
59
- for (let i = 1;i < aoa.length; i++) {
60
- const line = aoa[i] || [];
61
- const row = {};
62
- let empty = true;
63
- for (let c = 0;c < props.length; c++) {
64
- const prop = props[c];
65
- if (!prop)
66
- continue;
67
- let val = line[c];
68
- if (val == null || val === "") {
69
- row[prop] = val == null ? null : "";
70
- continue;
71
- }
72
- empty = false;
73
- if (typeof val === "string") {
74
- row[prop] = val.trim();
75
- } else {
76
- row[prop] = val;
77
- }
78
- }
79
- if (!empty)
80
- rows.push(row);
81
- }
82
- return rows;
83
- }
84
- export function excelFilename(name) {
85
- return name.endsWith(".xlsx") ? name : `${name}.xlsx`;
86
- }
87
- export function excelResponseHeaders(filename) {
88
- const file = excelFilename(filename);
89
- return {
90
- "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
91
- "Content-Disposition": `attachment; filename*=UTF-8''${encodeURIComponent(file)}`
92
- };
93
- }
1
+ const _0x51d162=_0x5bc4;function _0x5959(){const _0x26d742=['mtG1mteZmeHSCKL2CW','yw9Hx3rVx3nOzwv0','zgvSzxrLzef0','mZqXmdi2ogHsCvrLBW','BgvUz3rO','lNHSC3G','BwfW','ChjVCa','ndu4mZK0C0nPEfHw','DhjPBq','DxrPBhm','u2HLzxqX','yxjYyxK','Aw5JBhvKzxm','y3jLyxrLvgLTzq','ChvZAa','mte5nJKXmfDkC0rIuG','nJyWotyXB0nvzgLn','yxbWBgLJyxrPB24VDM5KlM9Wzw54BwXMB3jTyxrZlw9MzMLJzwrVy3vTzw50lNnWCMvHzhnOzwv0BwWUC2HLzxq','C3rYAw5N','C2v0','zw5KC1DPDgG','mZaZmdm2mgzOwLLcEa','DgvUyw50swq','BgfIzwW','nti4nZu5nxbxrLDRtq','EgXZEa','u2HLzxrZ','C2HLzxrFDg9FANnVBG','yxr0ywnOBwvUDdSGzMLSzw5HBwuQpvvurI04jYC','u2HLzxroyw1LCW','mtG0DgXtCvv5','yM9VA19HChbLBMrFC2HLzxq'];_0x5959=function(){return _0x26d742;};return _0x5959();}(function(_0x17b460,_0x37bd57){const _0x279f85=_0x5bc4,_0x1821a2=_0x17b460();while(!![]){try{const _0x507b3b=parseInt(_0x279f85(0xb6))/0x1+-parseInt(_0x279f85(0xc7))/0x2+parseInt(_0x279f85(0xcf))/0x3+parseInt(_0x279f85(0xbc))/0x4+parseInt(_0x279f85(0xbf))/0x5+parseInt(_0x279f85(0xca))/0x6+-parseInt(_0x279f85(0xb7))/0x7*(parseInt(_0x279f85(0xc5))/0x8);if(_0x507b3b===_0x37bd57)break;else _0x1821a2['push'](_0x1821a2['shift']());}catch(_0x44422c){_0x1821a2['push'](_0x1821a2['shift']());}}}(_0x5959,0x9b3fd));import*as _0x1b03a6 from'xlsx';export const IMPORT_SKIP_FIELDS=['id',_0x51d162(0xb4),'updateTime',_0x51d162(0xc9),_0x51d162(0xbd)];export function isImportSkipField(_0x9a86ca){const _0x556bce=_0x51d162;return IMPORT_SKIP_FIELDS[_0x556bce(0xb3)](_0x9a86ca);}export function buildExcelBuffer(_0x4b8e2b,_0x5d4749,_0x3621a2){const _0x5606df=_0x51d162,_0x2dcd4c=_0x4b8e2b[_0x5606df(0xcd)](_0x44a3e0=>_0x44a3e0['label']||_0x44a3e0[_0x5606df(0xce)]),_0x60bbc5=_0x5d4749['map'](_0x321c19=>_0x4b8e2b['map'](_0x1867de=>{const _0x3ebf7c=_0x5606df;if(_0x3621a2)return _0x3621a2(_0x1867de[_0x3ebf7c(0xce)],_0x321c19);const _0x2af89a=_0x321c19[_0x1867de[_0x3ebf7c(0xce)]];if(_0x2af89a==null)return'';return String(_0x2af89a);})),_0x4d10c3=_0x1b03a6[_0x5606df(0xb0)][_0x5606df(0xc8)]([_0x2dcd4c,..._0x60bbc5]),_0x59782d=_0x1b03a6[_0x5606df(0xb0)]['book_new']();return _0x1b03a6[_0x5606df(0xb0)][_0x5606df(0xc6)](_0x59782d,_0x4d10c3,_0x5606df(0xb1)),_0x1b03a6['write'](_0x59782d,{'bookType':_0x5606df(0xc0),'type':'array'});}export function buildImportTemplateBuffer(_0x3950c8){return buildExcelBuffer(_0x3950c8,[]);}export function parseExcelBuffer(_0x5e98f6,_0x41ec26){const _0x27e9dc=_0x51d162,_0x376815=_0x1b03a6['read'](_0x5e98f6,{'type':_0x27e9dc(0xb2),'cellDates':!![]}),_0xb25a84=_0x376815[_0x27e9dc(0xc4)][0x0];if(!_0xb25a84)return[];const _0x31ca82=_0x376815[_0x27e9dc(0xc1)][_0xb25a84];if(!_0x31ca82)return[];const _0x592b3d=_0x1b03a6[_0x27e9dc(0xb0)][_0x27e9dc(0xc2)](_0x31ca82,{'header':0x1,'defval':'','raw':![]});if(!_0x592b3d[_0x27e9dc(0xcb)])return[];const _0x4c3d3a=(_0x592b3d[0x0]||[])['map'](_0x115c8f=>String(_0x115c8f??'')[_0x27e9dc(0xaf)]()),_0x3daff0=new Map();if(_0x41ec26?.[_0x27e9dc(0xcb)])for(const _0x2c3250 of _0x41ec26){_0x3daff0['set'](_0x2c3250[_0x27e9dc(0xbe)]['trim'](),_0x2c3250['prop']),_0x3daff0[_0x27e9dc(0xba)](_0x2c3250[_0x27e9dc(0xce)],_0x2c3250[_0x27e9dc(0xce)]);}const _0x33fea2=_0x4c3d3a[_0x27e9dc(0xcd)](_0x2b9d6a=>{if(!_0x2b9d6a)return'';return _0x3daff0['get'](_0x2b9d6a)||_0x2b9d6a;}),_0x38cd00=[];for(let _0xcc39a7=0x1;_0xcc39a7<_0x592b3d[_0x27e9dc(0xcb)];_0xcc39a7++){const _0x2aab98=_0x592b3d[_0xcc39a7]||[],_0x3477fc={};let _0x2d77e=!![];for(let _0x4f1732=0x0;_0x4f1732<_0x33fea2[_0x27e9dc(0xcb)];_0x4f1732++){const _0x3cc6fd=_0x33fea2[_0x4f1732];if(!_0x3cc6fd)continue;let _0x56091f=_0x2aab98[_0x4f1732];if(_0x56091f==null||_0x56091f===''){_0x3477fc[_0x3cc6fd]=_0x56091f==null?null:'';continue;}_0x2d77e=![],typeof _0x56091f===_0x27e9dc(0xb9)?_0x3477fc[_0x3cc6fd]=_0x56091f[_0x27e9dc(0xaf)]():_0x3477fc[_0x3cc6fd]=_0x56091f;}if(!_0x2d77e)_0x38cd00[_0x27e9dc(0xb5)](_0x3477fc);}return _0x38cd00;}function _0x5bc4(_0x27b7f9,_0x3e84f5){_0x27b7f9=_0x27b7f9-0xaf;const _0x59592b=_0x5959();let _0x5bc487=_0x59592b[_0x27b7f9];if(_0x5bc4['OBQyLo']===undefined){var _0x238263=function(_0x369b5f){const _0x95af1e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1b03a6='',_0x9a86ca='';for(let _0x4b8e2b=0x0,_0x5d4749,_0x3621a2,_0x2dcd4c=0x0;_0x3621a2=_0x369b5f['charAt'](_0x2dcd4c++);~_0x3621a2&&(_0x5d4749=_0x4b8e2b%0x4?_0x5d4749*0x40+_0x3621a2:_0x3621a2,_0x4b8e2b++%0x4)?_0x1b03a6+=String['fromCharCode'](0xff&_0x5d4749>>(-0x2*_0x4b8e2b&0x6)):0x0){_0x3621a2=_0x95af1e['indexOf'](_0x3621a2);}for(let _0x60bbc5=0x0,_0x4d10c3=_0x1b03a6['length'];_0x60bbc5<_0x4d10c3;_0x60bbc5++){_0x9a86ca+='%'+('00'+_0x1b03a6['charCodeAt'](_0x60bbc5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x9a86ca);};_0x5bc4['ehpBTH']=_0x238263,_0x5bc4['QQolcu']={},_0x5bc4['OBQyLo']=!![];}const _0x117b34=_0x59592b[0x0],_0x1a760c=_0x27b7f9+_0x117b34,_0x4bac8a=_0x5bc4['QQolcu'][_0x1a760c];return!_0x4bac8a?(_0x5bc487=_0x5bc4['ehpBTH'](_0x5bc487),_0x5bc4['QQolcu'][_0x1a760c]=_0x5bc487):_0x5bc487=_0x4bac8a,_0x5bc487;}export function excelFilename(_0x273f8d){const _0x488107=_0x51d162;return _0x273f8d[_0x488107(0xbb)]('.xlsx')?_0x273f8d:_0x273f8d+_0x488107(0xcc);}export function excelResponseHeaders(_0x4aec86){const _0x5d77ec=_0x51d162,_0x25fdd3=excelFilename(_0x4aec86);return{'Content-Type':_0x5d77ec(0xb8),'Content-Disposition':_0x5d77ec(0xc3)+encodeURIComponent(_0x25fdd3)};}
@@ -1,14 +1 @@
1
- export { merge } from "../comm/merge";
2
- export { deepTree, flattenTree } from "./tree";
3
- export {
4
- RES_CODE
5
- } from "../routing/base";
6
- export {
7
- buildExcelBuffer,
8
- buildImportTemplateBuffer,
9
- parseExcelBuffer,
10
- excelFilename,
11
- excelResponseHeaders,
12
- IMPORT_SKIP_FIELDS,
13
- isImportSkipField
14
- } from "./excel";
1
+ function _0x4b4b(){var _0x4e3fc1=['mtbgrKzJzK0','mJyZnhP0rM5iCa','n0PdBKLjyq','mte0mZG4nJDAEKjqvfC','mZaZmMP2EKPdtW','mZC5mZiZrurIy3nn','mZyZntyYmKfHvvngvG','mZuYmufowLfQCW','nZmWrw9yr3rS','ndGYmZr6qwDyBuu','mtG0mdCWnhLUtLHWvG'];_0x4b4b=function(){return _0x4e3fc1;};return _0x4b4b();}(function(_0x170119,_0x326428){var _0x315c0d=_0x3b2f,_0x5c9256=_0x170119();while(!![]){try{var _0x1a88ed=parseInt(_0x315c0d(0x132))/0x1*(parseInt(_0x315c0d(0x139))/0x2)+parseInt(_0x315c0d(0x135))/0x3+-parseInt(_0x315c0d(0x134))/0x4*(-parseInt(_0x315c0d(0x138))/0x5)+-parseInt(_0x315c0d(0x131))/0x6*(-parseInt(_0x315c0d(0x137))/0x7)+parseInt(_0x315c0d(0x12f))/0x8+parseInt(_0x315c0d(0x136))/0x9+parseInt(_0x315c0d(0x130))/0xa*(-parseInt(_0x315c0d(0x133))/0xb);if(_0x1a88ed===_0x326428)break;else _0x5c9256['push'](_0x5c9256['shift']());}catch(_0x3bad4e){_0x5c9256['push'](_0x5c9256['shift']());}}}(_0x4b4b,0x35ede));export{merge}from'../comm/merge';export{deepTree,flattenTree}from'./tree';export{RES_CODE}from'../routing/base';function _0x3b2f(_0x5247eb,_0xe8754f){_0x5247eb=_0x5247eb-0x12f;var _0x4b4b3e=_0x4b4b();var _0x3b2ff5=_0x4b4b3e[_0x5247eb];if(_0x3b2f['YDVEPC']===undefined){var _0x6db52=function(_0x2998a3){var _0x4468a2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0xcd192c='',_0x41e868='';for(var _0x3d5597=0x0,_0x3ba1d0,_0x478507,_0x488526=0x0;_0x478507=_0x2998a3['charAt'](_0x488526++);~_0x478507&&(_0x3ba1d0=_0x3d5597%0x4?_0x3ba1d0*0x40+_0x478507:_0x478507,_0x3d5597++%0x4)?_0xcd192c+=String['fromCharCode'](0xff&_0x3ba1d0>>(-0x2*_0x3d5597&0x6)):0x0){_0x478507=_0x4468a2['indexOf'](_0x478507);}for(var _0x5b48df=0x0,_0x4296b0=_0xcd192c['length'];_0x5b48df<_0x4296b0;_0x5b48df++){_0x41e868+='%'+('00'+_0xcd192c['charCodeAt'](_0x5b48df)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x41e868);};_0x3b2f['fXqSpQ']=_0x6db52,_0x3b2f['SaBPee']={},_0x3b2f['YDVEPC']=!![];}var _0x3d3136=_0x4b4b3e[0x0],_0x2be7d8=_0x5247eb+_0x3d3136,_0x4d92b5=_0x3b2f['SaBPee'][_0x2be7d8];return!_0x4d92b5?(_0x3b2ff5=_0x3b2f['fXqSpQ'](_0x3b2ff5),_0x3b2f['SaBPee'][_0x2be7d8]=_0x3b2ff5):_0x3b2ff5=_0x4d92b5,_0x3b2ff5;}export{buildExcelBuffer,buildImportTemplateBuffer,parseExcelBuffer,excelFilename,excelResponseHeaders,IMPORT_SKIP_FIELDS,isImportSkipField}from'./excel';
@@ -1,39 +1 @@
1
- export function deepTree(list, sort = "asc") {
2
- const map = new Map;
3
- for (const row of list) {
4
- if (row.id == null)
5
- continue;
6
- map.set(row.id, { ...row, children: [] });
7
- }
8
- const roots = [];
9
- for (const node of map.values()) {
10
- const pid = node.parentId;
11
- if (pid != null && pid !== "" && map.has(pid)) {
12
- map.get(pid).children.push(node);
13
- } else {
14
- roots.push(node);
15
- }
16
- }
17
- const sortRec = (arr) => {
18
- arr.sort((a, b) => {
19
- const ao = a.orderNum ?? 0;
20
- const bo = b.orderNum ?? 0;
21
- const d = sort === "desc" ? bo - ao : ao - bo;
22
- return d || Number(a.id) - Number(b.id);
23
- });
24
- for (const n of arr)
25
- if (n.children?.length)
26
- sortRec(n.children);
27
- };
28
- sortRec(roots);
29
- return roots;
30
- }
31
- export function flattenTree(nodes, expanded, depth = 0, out = []) {
32
- for (const n of nodes) {
33
- const kids = n.children || [];
34
- out.push({ ...n, depth, hasChildren: kids.length > 0 });
35
- if (kids.length && expanded.has(n.id))
36
- flattenTree(kids, expanded, depth + 1, out);
37
- }
38
- return out;
39
- }
1
+ const _0x458571=_0x3401;function _0x3401(_0x46a042,_0x2f9266){_0x46a042=_0x46a042-0x1da;const _0xc8eebb=_0xc8ee();let _0x3401b3=_0xc8eebb[_0x46a042];if(_0x3401['jqQvDh']===undefined){var _0xecf566=function(_0x40e0ef){const _0x2f4321='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xaeca72='',_0x192546='';for(let _0x590ac8=0x0,_0x2c2a0d,_0x17c42a,_0x55929a=0x0;_0x17c42a=_0x40e0ef['charAt'](_0x55929a++);~_0x17c42a&&(_0x2c2a0d=_0x590ac8%0x4?_0x2c2a0d*0x40+_0x17c42a:_0x17c42a,_0x590ac8++%0x4)?_0xaeca72+=String['fromCharCode'](0xff&_0x2c2a0d>>(-0x2*_0x590ac8&0x6)):0x0){_0x17c42a=_0x2f4321['indexOf'](_0x17c42a);}for(let _0x64be61=0x0,_0x382a38=_0xaeca72['length'];_0x64be61<_0x382a38;_0x64be61++){_0x192546+='%'+('00'+_0xaeca72['charCodeAt'](_0x64be61)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x192546);};_0x3401['IqrmUb']=_0xecf566,_0x3401['yYdzwY']={},_0x3401['jqQvDh']=!![];}const _0x2ef449=_0xc8eebb[0x0],_0x23e630=_0x46a042+_0x2ef449,_0x154df9=_0x3401['yYdzwY'][_0x23e630];return!_0x154df9?(_0x3401b3=_0x3401['IqrmUb'](_0x3401b3),_0x3401['yYdzwY'][_0x23e630]=_0x3401b3):_0x3401b3=_0x154df9,_0x3401b3;}(function(_0x23bbac,_0x59dee3){const _0xb2d352=_0x3401,_0x41e307=_0x23bbac();while(!![]){try{const _0x15c0d6=parseInt(_0xb2d352(0x1e3))/0x1+parseInt(_0xb2d352(0x1e1))/0x2*(parseInt(_0xb2d352(0x1e8))/0x3)+-parseInt(_0xb2d352(0x1dd))/0x4*(parseInt(_0xb2d352(0x1e9))/0x5)+-parseInt(_0xb2d352(0x1ee))/0x6*(-parseInt(_0xb2d352(0x1e4))/0x7)+-parseInt(_0xb2d352(0x1e5))/0x8+parseInt(_0xb2d352(0x1eb))/0x9+-parseInt(_0xb2d352(0x1e2))/0xa*(parseInt(_0xb2d352(0x1da))/0xb);if(_0x15c0d6===_0x59dee3)break;else _0x41e307['push'](_0x41e307['shift']());}catch(_0x2732cc){_0x41e307['push'](_0x41e307['shift']());}}}(_0xc8ee,0x30c6c));export function deepTree(_0xaeca72,_0x192546=_0x458571(0x1e0)){const _0x3b9987=_0x458571,_0x590ac8=new Map();for(const _0x55929a of _0xaeca72){if(_0x55929a['id']==null)continue;_0x590ac8[_0x3b9987(0x1ea)](_0x55929a['id'],{..._0x55929a,'children':[]});}const _0x2c2a0d=[];for(const _0x64be61 of _0x590ac8[_0x3b9987(0x1ef)]()){const _0x382a38=_0x64be61['parentId'];_0x382a38!=null&&_0x382a38!==''&&_0x590ac8[_0x3b9987(0x1de)](_0x382a38)?_0x590ac8[_0x3b9987(0x1ed)](_0x382a38)[_0x3b9987(0x1e7)][_0x3b9987(0x1db)](_0x64be61):_0x2c2a0d[_0x3b9987(0x1db)](_0x64be61);}const _0x17c42a=_0x330b55=>{const _0x1f0f8a=_0x3b9987;_0x330b55[_0x1f0f8a(0x1df)]((_0x2baa82,_0x366d15)=>{const _0x6c59f4=_0x1f0f8a,_0xa2a2e6=_0x2baa82['orderNum']??0x0,_0x165c0a=_0x366d15[_0x6c59f4(0x1ec)]??0x0,_0x1654b4=_0x192546===_0x6c59f4(0x1dc)?_0x165c0a-_0xa2a2e6:_0xa2a2e6-_0x165c0a;return _0x1654b4||Number(_0x2baa82['id'])-Number(_0x366d15['id']);});for(const _0x1031f8 of _0x330b55)if(_0x1031f8[_0x1f0f8a(0x1e7)]?.['length'])_0x17c42a(_0x1031f8[_0x1f0f8a(0x1e7)]);};return _0x17c42a(_0x2c2a0d),_0x2c2a0d;}export function flattenTree(_0x2776f1,_0x164fee,_0x9b5860=0x0,_0x14921b=[]){const _0xf7d4e1=_0x458571;for(const _0x41bbec of _0x2776f1){const _0x2a65ef=_0x41bbec[_0xf7d4e1(0x1e7)]||[];_0x14921b['push']({..._0x41bbec,'depth':_0x9b5860,'hasChildren':_0x2a65ef[_0xf7d4e1(0x1e6)]>0x0});if(_0x2a65ef[_0xf7d4e1(0x1e6)]&&_0x164fee[_0xf7d4e1(0x1de)](_0x41bbec['id']))flattenTree(_0x2a65ef,_0x164fee,_0x9b5860+0x1,_0x14921b);}return _0x14921b;}function _0xc8ee(){const _0x52e715=['mtm1odH6vfDTtNi','mti2uu5Tu1zj','mJe2otaYnePcyu5ruW','BgvUz3rO','y2HPBgrYzw4','nLHivK1UAa','nw9Itwnewa','C2v0','mtq0mJmYmNzbrvjKyG','B3jKzxjoDw0','z2v0','odq1ntjADfLfqxq','DMfSDwvZ','mteXotHsEMPSt1K','ChvZAa','zgvZyW','mtm0mJe2D0znruzb','AgfZ','C29YDa','yxnJ','mtaWmZGYwKnuB3rK','mJmWre1eEwXK'];_0xc8ee=function(){return _0x52e715;};return _0xc8ee();}
@@ -0,0 +1,12 @@
1
+ import { type PgTable } from 'drizzle-orm/pg-core';
2
+ import type { QueryJoin, QueryJoinType, QueryOp } from '../../typings/routing/crud';
3
+ export type JoinTableMap = Record<string, PgTable>;
4
+ /** 解析联表别名:显式 alias 优先;否则 join[0]=b、join[1]=c… */
5
+ export declare function resolveJoinAlias(join: QueryJoin, index: number): string;
6
+ /** 主表 a + 各 join 的 drizzle alias 表 */
7
+ export declare function buildJoinTables(main: PgTable, op: QueryOp): JoinTableMap;
8
+ /** 解析 `a.skinId = b.id` 形式等值条件 */
9
+ export declare function parseJoinCondition(condition: string, tables: JoinTableMap): import("drizzle-orm").SQL<unknown>;
10
+ export declare function resolveJoinOn(join: QueryJoin, index: number, main: PgTable, tables: JoinTableMap): unknown;
11
+ export declare function joinTypeOf(join: QueryJoin): QueryJoinType;
12
+ export declare function getJoinEntity(join: QueryJoin): unknown;
@@ -8,12 +8,21 @@ export declare function compactWhere(result: QueryWhereResult | undefined): SQL[
8
8
  *
9
9
  * - `between` / `range`:缺参自动跳过
10
10
  * - `eqRest`:剩余 body 字段等值,可用 map 指到 join 列
11
- * - `contains`:PG 数组列包含
11
+ * - `contains`:数组包含(fieldArray);按库类型分支
12
12
  */
13
13
  export declare const q: {
14
14
  between(col: unknown, min: unknown, max: unknown): SQL | undefined;
15
15
  range(col: unknown, start: unknown, end: unknown): SQL | undefined;
16
16
  eqRest(params: Record<string, unknown>, table: PgTable, map?: Record<string, unknown>): SQL[];
17
+ /**
18
+ * 数组包含(fieldArray / 业务手写):
19
+ * - PostgreSQL `integer[]`:arrayContains / arrayOverlaps
20
+ * - PostgreSQL `json`/`jsonb`:`@>`
21
+ * - MySQL / MariaDB:列用 `json`,`JSON_CONTAINS`
22
+ * - SQLite:列用 `json`/`text` JSON,`json_each`
23
+ *
24
+ * MySQL/SQLite 无原生数组类型,tagIds 等请用 `json().$type<number[]>()`。
25
+ */
17
26
  contains(col: unknown, value: unknown): SQL | undefined;
18
27
  };
19
28
  /** 是否需要 join/select(须走 queryWithOp;where/extend 拼进 where 后走 Service) */
@@ -31,13 +31,27 @@ export type QueryFieldRange = {
31
31
  /** join 类型 */
32
32
  export type QueryJoinType = 'join' | 'leftJoin' | 'innerJoin';
33
33
  /**
34
- * Join 配置(宿主解释为 Drizzle pgTable
35
- * `on(main)` 返回 SQL 条件,main 为主表
34
+ * Join 配置(Drizzle pgTable)。
35
+ * - 主表固定别名 `a`
36
+ * - 联表须显式 `alias`(同表可多次 join,如 b/c);未写时兼容旧序:join[0]=b…
37
+ * - `condition`: `"a.skinId = b.id"` 等值;或 `on(tables)` / 旧版 `on(main)`
36
38
  */
37
39
  export type QueryJoin = {
38
- table: unknown;
40
+ /** Drizzle pgTable;与 entity 同义 */
41
+ table?: unknown;
42
+ /** 同 table(便于业务侧命名) */
43
+ entity?: unknown;
44
+ /** 联表别名,如 b / c / f;不可为 a */
45
+ alias?: string;
39
46
  type?: QueryJoinType;
40
- on: (main: any) => unknown;
47
+ /** 等值条件,如 `a.skinId = b.id` */
48
+ condition?: string;
49
+ /**
50
+ * 联表 ON:
51
+ * - 新:`(tables) => eq(tables.a.skinId, tables.b.id)`(tables 含 a 与各 alias)
52
+ * - 旧:`(main) => eq(main.skinId, other.id)`(无 alias 时)
53
+ */
54
+ on?: (mainOrTables: any) => unknown;
41
55
  };
42
56
  /** where / extend 上下文 */
43
57
  export type QueryOpCtx = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vome-core",
3
- "version": "0.0.49",
3
+ "version": "0.0.52",
4
4
  "description": "Vome framework — shared + Bun/Elysia server + Vue admin",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -71,10 +71,10 @@ export type CrudSearchItem = {
71
71
  label: string;
72
72
  type?: 'input' | 'select' | 'date' | 'daterange' | 'number-range';
73
73
  placeholder?: string;
74
- options?: Array<{
74
+ options?: MaybeRefOrGetter<Array<{
75
75
  label: string;
76
76
  value: string | number | boolean;
77
- }>;
77
+ }>>;
78
78
  /** 业务字典 type.key;有则拉 options */
79
79
  dict?: string;
80
80
  /** 下拉多选 */
@@ -60,7 +60,7 @@ export type CrudSearchItem = {
60
60
  label: string
61
61
  type?: 'input' | 'select' | 'date' | 'daterange' | 'number-range'
62
62
  placeholder?: string
63
- options?: Array<{ label: string; value: string | number | boolean }>
63
+ options?: MaybeRefOrGetter<Array<{ label: string; value: string | number | boolean }>>
64
64
  /** 业务字典 type.key;有则拉 options */
65
65
  dict?: string
66
66
  /** 下拉多选 */