@tachybase/module-backup 1.3.21 → 1.3.23
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/client/collections/autoBackup.d.ts +1 -1
- package/dist/client/index.js +1 -1
- package/dist/externalVersion.js +6 -9
- package/dist/node_modules/@hapi/topo/package.json +1 -1
- package/dist/node_modules/archiver/package.json +1 -1
- package/dist/node_modules/cron-parser/package.json +1 -1
- package/dist/node_modules/mkdirp/package.json +1 -1
- package/dist/node_modules/semver/package.json +1 -1
- package/dist/node_modules/yauzl/package.json +1 -1
- package/dist/server/app-migrator.d.ts +2 -2
- package/dist/server/app-migrator.js +9 -9
- package/dist/server/collection-group-manager.d.ts +1 -1
- package/dist/server/collections/autoBackup.d.ts +1 -1
- package/dist/server/commands/backup-command.d.ts +1 -1
- package/dist/server/commands/backup-command.js +2 -2
- package/dist/server/commands/restore-command.d.ts +1 -1
- package/dist/server/commands/restore-command.js +1 -1
- package/dist/server/dumper.d.ts +1 -1
- package/dist/server/dumper.js +29 -29
- package/dist/server/field-value-writer.d.ts +1 -1
- package/dist/server/field-value-writer.js +5 -5
- package/dist/server/model/AutoBackupModel.d.ts +1 -1
- package/dist/server/model/AutoBackupModel.js +2 -2
- package/dist/server/resourcers/backup-files.js +4 -5
- package/dist/server/restorer.d.ts +1 -2
- package/dist/server/restorer.js +20 -20
- package/dist/server/server.d.ts +1 -1
- package/dist/server/server.js +1 -1
- package/dist/server/utils.d.ts +1 -1
- package/dist/server/utils.js +6 -6
- package/package.json +12 -19
package/dist/client/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(A,g){typeof exports=="object"&&typeof module!="undefined"?g(exports,require("@tachybase/client"),require("react/jsx-runtime"),require("react"),require("@tachybase/components"),require("@ant-design/icons"),require("antd"),require("react-i18next")):typeof define=="function"&&define.amd?define(["exports","@tachybase/client","react/jsx-runtime","react","@tachybase/components","@ant-design/icons","antd","react-i18next"],g):(A=typeof globalThis!="undefined"?globalThis:A||self,g(A["@tachybase/module-backup"]={},A["@tachybase/client"],A.jsxRuntime,A.react,A["@tachybase/components"],A["@ant-design/icons"],A.antd,A["react-i18next"]))})(this,function(A,g,n,y,me,X,k,ie){"use strict";var Zo=Object.defineProperty,_o=Object.defineProperties;var Go=Object.getOwnPropertyDescriptors;var po=Object.getOwnPropertySymbols;var $o=Object.prototype.hasOwnProperty,Yo=Object.prototype.propertyIsEnumerable;var mo=(A,g,n)=>g in A?Zo(A,g,{enumerable:!0,configurable:!0,writable:!0,value:n}):A[g]=n,ae=(A,g)=>{for(var n in g||(g={}))$o.call(g,n)&&mo(A,n,g[n]);if(po)for(var n of po(g))Yo.call(g,n)&&mo(A,n,g[n]);return A},De=(A,g)=>_o(A,Go(g));var $=(A,g,n)=>new Promise((y,me)=>{var X=z=>{try{ie(n.next(z))}catch(Q){me(Q)}},k=z=>{try{ie(n.throw(z))}catch(Q){me(Q)}},ie=z=>z.done?y(z.value):Promise.resolve(z.value).then(X,k);ie((n=n.apply(A,g)).next())});var z=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},Q={exports:{}},fo=Q.exports,Fe;function yo(){return Fe||(Fe=1,function(e,t){(function(a,o){o()})(fo,function(){function a(i,s){return typeof s=="undefined"?s={autoBom:!1}:typeof s!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),s={autoBom:!s}),s.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(i.type)?new Blob(["\uFEFF",i],{type:i.type}):i}function o(i,s,v){var u=new XMLHttpRequest;u.open("GET",i),u.responseType="blob",u.onload=function(){p(u.response,s,v)},u.onerror=function(){console.error("could not download file")},u.send()}function r(i){var s=new XMLHttpRequest;s.open("HEAD",i,!1);try{s.send()}catch(v){}return 200<=s.status&&299>=s.status}function c(i){try{i.dispatchEvent(new MouseEvent("click"))}catch(v){var s=document.createEvent("MouseEvents");s.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),i.dispatchEvent(s)}}var l=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof z=="object"&&z.global===z?z:void 0,m=l.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),p=l.saveAs||(typeof window!="object"||window!==l?function(){}:"download"in HTMLAnchorElement.prototype&&!m?function(i,s,v){var u=l.URL||l.webkitURL,f=document.createElement("a");s=s||i.name||"download",f.download=s,f.rel="noopener",typeof i=="string"?(f.href=i,f.origin===location.origin?c(f):r(f.href)?o(i,s,v):c(f,f.target="_blank")):(f.href=u.createObjectURL(i),setTimeout(function(){u.revokeObjectURL(f.href)},4e4),setTimeout(function(){c(f)},0))}:"msSaveOrOpenBlob"in navigator?function(i,s,v){if(s=s||i.name||"download",typeof i!="string")navigator.msSaveOrOpenBlob(a(i,v),s);else if(r(i))o(i,s,v);else{var u=document.createElement("a");u.href=i,u.target="_blank",setTimeout(function(){c(u)})}}:function(i,s,v,u){if(u=u||open("","_blank"),u&&(u.document.title=u.document.body.innerText="downloading..."),typeof i=="string")return o(i,s,v);var f=i.type==="application/octet-stream",h=/constructor/i.test(l.HTMLElement)||l.safari,d=/CriOS\/[\d]+/.test(navigator.userAgent);if((d||f&&h||m)&&typeof FileReader!="undefined"){var b=new FileReader;b.onloadend=function(){var B=b.result;B=d?B:B.replace(/^data:[^;]*;/,"data:attachment/file;"),u?u.location.href=B:location=B,u=null},b.readAsDataURL(i)}else{var S=l.URL||l.webkitURL,w=S.createObjectURL(i);u?u.location=w:location.href=w,u=null,setTimeout(function(){S.revokeObjectURL(w)},4e4)}});l.saveAs=p.saveAs=p,e.exports=p})}(Q)),Q.exports}var ho=yo();const le="backup";function R(){return ie.useTranslation([le,"core"],{nsMode:"fallback"})}const vo=e=>g.tval(e,{ns:le}),{Dragger:bo}=k.Upload;function xo(e){const t=o=>{var r;(r=e.onChange)==null||r.call(e,o)},a=g.useAPIClient();return De(ae({},e),{customRequest({action:o,data:r,file:c,filename:l,headers:m,onError:p,onProgress:i,onSuccess:s,withCredentials:v}){const u=new FormData;return r&&Object.keys(r).forEach(f=>{u.append(f,r[f])}),u.append(l,c),a.axios.post(o,u,{withCredentials:v,headers:m,onUploadProgress:({total:f,loaded:h})=>{i({percent:Math.round(h/f*100).toFixed(2)},c)}}).then(({data:f})=>{s(f,c)}).catch(p).finally(()=>{}),{abort(){console.log("upload progress is aborted.")}}},onChange:t})}const Pe=e=>{const{collectionsData:t}=e,{t:a}=R(),[o,r]=y.useState(!1),[c,l]=y.useState(t);y.useEffect(()=>{l(t)},[t]);const m=g.useAPIClient(),p=g.useCompile(),i=y.useMemo(()=>m.resource("backupFiles"),[m]),s=()=>$(null,null,function*(){if(e.isBackup){const d=yield i.dumpableCollections();l(d==null?void 0:d.data),r(!0)}r(!0)}),v=()=>{r(!1)},u=()=>{r(!1)},f=[{title:a("Collection"),dataIndex:"collection",key:"collection",render:(d,b)=>{const S=p(b.title);return b.name===S?S:n.jsxs("div",{children:[b.name," ",n.jsxs("span",{style:{color:"rgba(0, 0, 0, 0.3)",fontSize:"0.9em"},children:["(",p(b.title),")"]})]})}},{title:a("Origin"),dataIndex:"origin",key:"origin",width:"50%"}],h=Object.keys(c||{}).map(d=>({key:d,label:a(`${d}.title`),children:n.jsxs(n.Fragment,{children:[n.jsx(k.Alert,{style:{marginBottom:16},message:a(`${d}.description`)}),n.jsx(k.Table,{pagination:{pageSize:100},bordered:!0,size:"small",dataSource:c[d],columns:f,scroll:{y:400}})]})}));return n.jsxs(n.Fragment,{children:[n.jsx("a",{onClick:s,children:a("Learn more")}),n.jsx(k.Modal,{title:a("Backup instructions"),width:"80vw",open:o,footer:null,onOk:v,onCancel:u,children:n.jsx(k.Tabs,{defaultActiveKey:"required",items:h})})]})},Te=({ButtonComponent:e=k.Button,title:t,upload:a=!1,fileData:o})=>{const{t:r}=R(),[c,l]=y.useState(["required"]),[m,p]=y.useState(!1),[i,s]=y.useState(null),[v,u]=y.useState(!1),f=g.useAPIClient(),h=y.useMemo(()=>f.resource("backupFiles"),[f]),[d,b]=y.useState([]),S=c.length>0&&c.length<d.length,w=d.length===c.length;y.useEffect(()=>{b(Object.keys((i==null?void 0:i.dumpableCollectionsGroupByGroup)||[]).map(M=>({value:M,label:r(`${M}.title`),disabled:["required","skipped"].includes(M)})))},[i]);const B=()=>$(null,null,function*(){var M,H,P;if(p(!0),!a){u(!0);const{data:E}=yield h.get({filterByTk:o.name});b(Object.keys(((H=(M=E==null?void 0:E.data)==null?void 0:M.meta)==null?void 0:H.dumpableCollectionsGroupByGroup)||[]).map(N=>({value:N,label:r(`${N}.title`),disabled:["required","skipped"].includes(N)}))),s((P=E==null?void 0:E.data)==null?void 0:P.meta),u(!1)}}),Y=()=>{h.restore({values:{dataTypes:c,filterByTk:o==null?void 0:o.name,key:i==null?void 0:i.key}}),p(!1)},ee=()=>{p(!1),s(null),l(["required"])},U=M=>{l(M.target.checked?d.map(H=>H.value):["required"])};return n.jsxs(n.Fragment,{children:[n.jsx(e,{onClick:B,children:t}),n.jsx(k.Modal,{title:r("Restore"),width:800,footer:a&&!i?null:void 0,open:m,onOk:Y,onCancel:ee,children:n.jsxs(k.Spin,{spinning:v,children:[a&&!i&&n.jsx(ko,{setRestoreData:s}),(!a||i)&&[n.jsxs("strong",{style:{fontWeight:600,display:"block",margin:"16px 0 8px"},children:[r("Select the data to be restored")," (",n.jsx(Pe,{collectionsData:i==null?void 0:i.dumpableCollectionsGroupByGroup}),"):"]},"info"),n.jsx("div",{style:{lineHeight:2,marginBottom:8},children:n.jsxs(me.FormItem,{children:[n.jsx(g.Checkbox.Group,{options:d,style:{flexDirection:"column"},value:c,onChange:M=>l(M)}),n.jsx(k.Divider,{}),n.jsx(g.Checkbox,{indeterminate:S,onChange:U,checked:w,children:r("Check all")})]})},"dataType")]]})})]})},go=({ButtonComponent:e=k.Button,refresh:t})=>{const{t:a}=R(),[o,r]=y.useState(!1),[c,l]=y.useState(["required"]),m=g.useAPIClient(),{notification:p}=k.App.useApp(),[i,s]=y.useState([]),v=c.length>0&&c.length<i.filter(S=>S.value!=="skipped").length,u=i.filter(S=>S.value!=="skipped").length===c.length,f=S=>{l(S.target.checked?i.filter(w=>w.value!=="skipped").map(w=>w.value):["required"])},h=()=>$(null,null,function*(){const{data:S}=yield m.resource("backupFiles").dumpableCollections();s(Object.keys(S||[]).map(w=>({value:w,label:a(`${w}.title`),disabled:["required","skipped"].includes(w)}))),r(!0)}),d=S=>{m.request({url:"backupFiles:create",method:"post",data:{dataTypes:c,method:S}}),p.info({key:"backup",message:n.jsxs("span",{children:[a("Processing...")," ",n.jsx(k.Spin,{indicator:n.jsx(X.LoadingOutlined,{style:{fontSize:24},spin:!0})})]}),duration:0}),r(!1),l(["required"]),setTimeout(()=>{t()},500)},b=()=>{r(!1),l(["required"])};return n.jsxs(n.Fragment,{children:[n.jsx(e,{icon:n.jsx(X.PlusOutlined,{}),type:"primary",onClick:h,children:a("New backup")}),n.jsxs(k.Modal,{title:a("New backup"),width:800,open:o,onCancel:b,footer:[n.jsxs(k.Row,{gutter:16,justify:"end",align:"middle",children:[n.jsx(k.Col,{children:n.jsx(k.Button,{onClick:b,children:a("Cancel")},"cancel")}),n.jsx(k.Col,{children:n.jsx(k.Dropdown.Button,{type:"primary",onClick:()=>d("priority"),overlay:n.jsxs(k.Menu,{children:[n.jsx(k.Menu.Item,{onClick:()=>d("main"),children:a("Self backup")},"main"),n.jsx(k.Menu.Item,{onClick:()=>d("worker"),children:a("Worker backup")},"worker")]}),children:a("Backup")},"submit")})]})],children:[n.jsxs("strong",{style:{fontWeight:600,display:"block",margin:"16px 0 8px"},children:[a("Select the data to be backed up")," (",n.jsx(Pe,{isBackup:!0}),"):"]}),n.jsxs("div",{style:{lineHeight:2,marginBottom:8},children:[n.jsx(g.Checkbox.Group,{options:i,style:{flexDirection:"column"},onChange:S=>l(S),value:c}),n.jsx(k.Divider,{}),n.jsx(g.Checkbox,{indeterminate:v,onChange:f,checked:u,children:a("Check all")})]})]})]})},ko=e=>{const{t}=R(),a={multiple:!1,action:"/backupFiles:upload",onChange(o){var c,l,m;o.fileList.length>1&&o.fileList.splice(0,o.fileList.length-1);const{status:r}=o.file;r==="done"?(k.message.success(`${o.file.name} `+t("file uploaded successfully")),e.setRestoreData(De(ae({},(l=(c=o.file.response)==null?void 0:c.data)==null?void 0:l.meta),{key:(m=o.file.response)==null?void 0:m.data.key}))):r==="error"&&k.message.error(`${o.file.name} `+t("file upload failed"))},onDrop(o){console.log("Dropped files",o.dataTransfer.files)}};return n.jsxs(bo,De(ae({},xo(a)),{children:[n.jsx("p",{className:"ant-upload-drag-icon",children:n.jsx(X.InboxOutlined,{})}),n.jsxs("p",{className:"ant-upload-text",children:[" ",t("Click or drag file to this area to upload")]})]}))},wo=()=>{const{t:e}=R(),t=g.useAPIClient(),[a,o]=y.useState([]),[r,c]=y.useState(!1),[l,m]=y.useState(!1),{modal:p,notification:i}=k.App.useApp(),s=y.useMemo(()=>t.resource("backupFiles"),[t]),v=y.useCallback(()=>$(null,null,function*(){yield u()}),[]);g.useNoticeSub("backup",d=>{(i[d.level]||i.info)({key:"backup",message:d.msg}),v()}),y.useEffect(()=>{u()},[]);const u=()=>$(null,null,function*(){c(!0);const{data:d}=yield s.list();o(d.data),c(!1)}),f=d=>$(null,null,function*(){m(d.name);const b=yield t.request({url:"backupFiles:download",method:"get",params:{filterByTk:d.name},responseType:"blob",onDownloadProgress:w=>{const B=Math.round(w.loaded*100/w.total);B>=100?i.success({key:"downloadBackup",message:n.jsx("span",{children:e("Downloaded success!")}),duration:1}):i.info({key:"downloadBackup",message:n.jsxs("span",{children:[e("Downloading ")+B+"%"," ",n.jsx(k.Spin,{indicator:n.jsx(X.LoadingOutlined,{style:{fontSize:24},spin:!0})})]}),duration:0})}});m(!1);const S=new Blob([b.data]);ho.saveAs(S,d.name)}),h=d=>{p.confirm({title:e("Delete record",{ns:"core"}),content:e("Are you sure you want to delete it?",{ns:"core"}),onOk:()=>$(null,null,function*(){yield s.destroy({filterByTk:d.name}),yield u(),k.message.success(e("Deleted successfully"))})})};return n.jsx("div",{children:n.jsxs(k.Card,{bordered:!1,children:[n.jsxs(k.Space,{style:{float:"right",marginBottom:16},children:[n.jsx(k.Button,{onClick:v,icon:n.jsx(X.ReloadOutlined,{}),children:e("Refresh")}),n.jsx(Te,{upload:!0,title:n.jsxs(n.Fragment,{children:[n.jsx(X.UploadOutlined,{})," ",e("Restore backup from local")]})}),n.jsx(go,{refresh:v})]}),n.jsx(k.Table,{dataSource:a,loading:r,columns:[{title:e("Backup file"),dataIndex:"name",width:400,onCell:d=>d.inProgress?{colSpan:4}:{},render:(d,b)=>b.inProgress?n.jsxs("div",{style:{color:"rgba(0, 0, 0, 0.88)"},children:[d,"(",e("Backing up"),"...)"]}):b.status==="error"?n.jsxs("div",{style:{color:"red"},children:[d,"(",e("Error"),")"]}):n.jsx("div",{children:d})},{title:e("File size"),dataIndex:"fileSize",onCell:d=>d.inProgress?{colSpan:0}:{}},{title:e("Created at",{ns:"core"}),dataIndex:"createdAt",onCell:d=>d.inProgress?{colSpan:0}:{},render:d=>n.jsx(g.DatePicker.ReadPretty,{value:d,showTime:!0})},{title:e("Actions",{ns:"core"}),dataIndex:"actions",onCell:d=>d.inProgress?{colSpan:0}:{},render:(d,b)=>n.jsxs(k.Space,{split:n.jsx(k.Divider,{type:"vertical"}),children:[b.status!=="error"&&n.jsx(Te,{ButtonComponent:"a",title:e("Restore"),fileData:b}),b.status!=="error"&&n.jsx("a",{type:"link",onClick:()=>f(b),children:e("Download")}),n.jsx("a",{onClick:()=>h(b),children:e("Delete")})]})}]})]})})},Co={dumpRules:"required",name:"autoBackup",shared:!0,createdAt:!0,updatedAt:!0,createdBy:!0,updatedBy:!0,fields:[{type:"string",name:"title",required:!0,uiSchema:{title:'{{ t("Title") }}',type:"string","x-component":"Input",required:!0}},{type:"boolean",name:"enabled",defaultValue:!1,uiSchema:{title:'{{ t("Enabled") }}',type:"boolean","x-component":"Checkbox",required:!0}},{type:"array",name:"dumpRules",uiSchema:{title:'{{ t("Dump rules") }}',type:"string","x-component":"Input",required:!0}},{type:"string",name:"repeat",required:!0,uiSchema:{title:'{{t("Repeat mode")}}',type:"string","x-component":"RepeatField"}},{type:"integer",name:"maxNumber",uiSchema:{title:'{{ t("Max number") }}',type:"integer","x-component":"Input",required:!0}}]};var q=function(){return q=Object.assign||function(e){for(var t,a=1,o=arguments.length;a<o;a++)for(var r in t=arguments[a])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e},q.apply(this,arguments)};function je(e,t){var a={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(a[o]=e[o]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function"){var r=0;for(o=Object.getOwnPropertySymbols(e);r<o.length;r++)t.indexOf(o[r])<0&&Object.prototype.propertyIsEnumerable.call(e,o[r])&&(a[o[r]]=e[o[r]])}return a}function fe(e,t,a){if(a||arguments.length===2)for(var o,r=0,c=t.length;r<c;r++)!o&&r in t||(o||(o=Array.prototype.slice.call(t,0,r)),o[r]=t[r]);return e.concat(o||Array.prototype.slice.call(t))}var Oo=[{name:"@yearly",value:"0 0 1 1 *"},{name:"@annually",value:"0 0 1 1 *"},{name:"@monthly",value:"0 0 1 * *"},{name:"@weekly",value:"0 0 * * 0"},{name:"@daily",value:"0 0 * * *"},{name:"@midnight",value:"0 0 * * *"},{name:"@hourly",value:"0 * * * *"}],oe=[{type:"minutes",min:0,max:59,total:60},{type:"hours",min:0,max:23,total:24},{type:"month-days",min:1,max:31,total:31},{type:"months",min:1,max:12,total:12,alt:["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]},{type:"week-days",min:0,max:6,total:7,alt:["SUN","MON","TUE","WED","THU","FRI","SAT"]}],C={everyText:"every",emptyMonths:"every month",emptyMonthDays:"every day of the month",emptyMonthDaysShort:"day of the month",emptyWeekDays:"every day of the week",emptyWeekDaysShort:"day of the week",emptyHours:"every hour",emptyMinutes:"every minute",emptyMinutesForHourPeriod:"every",yearOption:"year",monthOption:"month",weekOption:"week",dayOption:"day",hourOption:"hour",minuteOption:"minute",rebootOption:"reboot",prefixPeriod:"Every",prefixMonths:"in",prefixMonthDays:"on",prefixWeekDays:"on",prefixWeekDaysForMonthAndYearPeriod:"and",prefixHours:"at",prefixMinutes:":",prefixMinutesForHourPeriod:"at",suffixMinutesForHourPeriod:"minute(s)",errorInvalidCron:"Invalid cron expression",clearButtonText:"Clear",weekDays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],altWeekDays:["SUN","MON","TUE","WED","THU","FRI","SAT"],altMonths:["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]};function Ee(e,t){for(var a=[],o=e;o<=t;o++)a.push(o);return a}function ye(e){return e.sort(function(t,a){return t-a}),e}function Le(e){var t=[];return e.forEach(function(a){t.indexOf(a)<0&&t.push(a)}),t}function J(e){return Object.entries(e).filter(function(t){var a=t[0],o=t[1];return a&&o}).map(function(t){return t[0]}).join(" ")}function Ie(e,t){e&&e({type:"invalid_cron",description:t.errorInvalidCron||C.errorInvalidCron})}function he(e){var t=parseInt(e,10),a=Number(e);return t===a?a:NaN}function Ve(e,t,a,o,r,c,l,m,p,i,s,v,u,f){a&&a(void 0),t(!1);var h=!1;if(!e){if(o==="always"||c&&o==="for-default-value")return;h=!0}if(!h){if(m&&(m===!0||m.includes(e))){if(e==="@reboot")return void f("reboot");var d=Oo.find(function(w){return w.name===e});d&&(e=d.value)}try{var b=function(w){if(typeof w!="string")throw new Error("Invalid cron string");var B=w.replace(/\s+/g," ").trim().split(" ");if(B.length===5)return B.map(function(Y,ee){return function(U,M){if(U==="*"||U==="*/1")return[];var H=ye(Le(We(function(E,N,Z){if(Z){E=E.toUpperCase();for(var x=0;x<Z.length;x++)E=E.replace(Z[x],"".concat(x+N))}return E}(U,M.min,M.alt).split(",").map(function(E){var N,Z=E.split("/");if(Z.length>2)throw new Error('Invalid value "'.concat(U,' for "').concat(M.type,'"'));var x=Z[0],O=Z[1];N=x==="*"?Ee(M.min,M.max):function(F,T,L){var I=F.split("-");if(I.length===1){var ce=he(I[0]);if(isNaN(ce))throw new Error('Invalid value "'.concat(T,'" for ').concat(L.type));return[ce]}if(I.length===2){var _=he(I[0]),ne=he(I[1]);if(isNaN(_)||isNaN(ne))throw new Error('Invalid value "'.concat(T,'" for ').concat(L.type));if(ne<_)throw new Error('Max range is less than min range in "'.concat(F,'" for ').concat(L.type));return Ee(_,ne)}throw new Error('Invalid value "'.concat(F,'" for ').concat(L.type))}(x,U,M);var D=function(F,T){if(F!==void 0){var L=he(F);if(isNaN(L)||L<1)throw new Error('Invalid interval step value "'.concat(F,'" for ').concat(T.type));return L}}(O,M),W=function(F,T){if(T){var L=F[0];F=F.filter(function(I){return I%T==L%T||I===L})}return F}(N,D);return W}).flat(),M))),P=ze(H,M);if(P!==void 0)throw new Error('Value "'.concat(P,'" out of range for ').concat(M.type));return H.length===M.total?[]:H}(Y,oe[ee])});throw new Error("Invalid cron string format")}(e),S=function(w){return w[3].length>0?"year":w[2].length>0?"month":w[4].length>0?"week":w[1].length>0?"day":w[0].length>0?"hour":"minute"}(b);f(S),p(b[0]),i(b[1]),s(b[2]),v(b[3]),u(b[4])}catch(w){h=!0}}h&&(r.current=e,t(!0),Ie(a,l))}function qe(e,t,a,o,r,c,l){if(e==="reboot")return"@reboot";var m=function(p,i){return p.map(function(s,v){var u=oe[v];return He(Ue(s,u),u,i)})}([e!=="minute"&&c?c:[],e!=="minute"&&e!=="hour"&&r?r:[],e!=="year"&&e!=="month"||!a?[]:a,e==="year"&&t?t:[],e!=="year"&&e!=="month"&&e!=="week"||!o?[]:o],l);return m.join(" ")}function He(e,t,a,o,r){var c="";if(function(m,p){return m.length===p.max-p.min+1}(e,t)||e.length===0)c="*";else{var l=function(m){if(m.length>2){var p=m[1]-m[0];if(p>1)return p}}(e);c=l&&function(m,p){for(var i=1;i<m.length;i++){var s=m[i-1];if(m[i]-s!==p)return!1}return!0}(e,l)?function(m,p,i){var s=Je(m),v=Ze(m),u=m.length===(v-s)/i+1;return!!(s===p.min&&v+i>p.max&&u)}(e,t,l)?"*/".concat(l):"".concat(te(Je(e),t,a,o,r),"-").concat(te(Ze(e),t,a,o,r),"/").concat(l):function(m){var p=[],i=null;return m.forEach(function(s,v,u){s!==u[v+1]-1?i!==null?(p.push([i,s]),i=null):p.push(s):i===null&&(i=s)}),p}(e).map(function(m){return Array.isArray(m)?"".concat(te(m[0],t,a,o,r),"-").concat(te(m[1],t,a,o,r)):te(m,t,a,o,r)}).join(",")}return c}function te(e,t,a,o,r){var c=e.toString(),l=t.type,m=t.alt,p=t.min,i=o&&(o===!0||o.includes(l)),s=r==="24-hour-clock"&&(l==="hours"||l==="minutes");if(a&&l==="week-days"||a&&l==="months"?c=m[e-p]:e<10&&(i||s)&&(c=c.padStart(2,"0")),l==="hours"&&r==="12-hour-clock"){var v=e>=12?"PM":"AM",u=e%12||12;u<10&&i&&(u=u.toString().padStart(2,"0")),c="".concat(u).concat(v)}return c}function Ue(e,t){var a=ye(Le(We(e,t)));if(a.length===0)return a;var o=ze(a,t);if(o!==void 0)throw new Error('Value "'.concat(o,'" out of range for ').concat(t.type));return a}function We(e,t){return t.type==="week-days"&&(e=e.map(function(a){return a===7?0:a})),e}function ze(e,t){var a=e[0],o=e[e.length-1];return a<t.min?a:o>t.max?o:void 0}function Je(e){return e[0]}function Ze(e){return e[e.length-1]}function se(e){var t=e.value,a=e.grid,o=a===void 0||a,r=e.optionsList,c=e.setValue,l=e.locale,m=e.className,p=e.humanizeLabels,i=e.disabled,s=e.readOnly,v=e.leadingZero,u=e.clockFormat,f=e.period,h=e.unit,d=e.periodicityOnDoubleClick,b=e.mode,S=je(e,["value","grid","optionsList","setValue","locale","className","humanizeLabels","disabled","readOnly","leadingZero","clockFormat","period","unit","periodicityOnDoubleClick","mode"]),w=y.useMemo(function(){if(t&&Array.isArray(t))return t.map(function(x){return x.toString()})},[t]),B=y.useMemo(function(){return r?r.map(function(x,O){return{value:(h.min===0?O:O+1).toString(),label:x}}):fe([],Array(h.total),!0).map(function(x,O){var D=h.min===0?O:O+1;return{value:D.toString(),label:te(D,h,p,v,u)}})},[r,v,p,u]),Y=JSON.stringify(l),ee=y.useCallback(function(x){var O=x.value;if(!t||t[0]!==Number(O))return n.jsx(n.Fragment,{});var D=He(Ue(t,h),h,p,v,u),W=D.match(/^\*\/([0-9]+),?/)||[];return n.jsx("div",{children:W[1]?"".concat(l.everyText||C.everyText," ").concat(W[1]):D})},[t,Y,p,v,u]),U=y.useCallback(function(x){var O=Array.isArray(x)?ye(x):[x],D=O;t&&(D=b==="single"?[]:fe([],t,!0),O.forEach(function(W){var F=Number(W);D=t.some(function(T){return T===F})?D.filter(function(T){return T!==F}):ye(fe(fe([],D,!0),[F],!1))})),D.length===h.total?c([]):c(D)},[c,t]),M=y.useCallback(function(x){if(x!==0&&x!==1){for(var O=h.total+h.min,D=[],W=h.min;W<O;W++)W%x==0&&D.push(W);var F=t&&D&&t.length===D.length&&t.every(function(L,I){return L===D[I]}),T=D.length===B.length;c(T||F?[]:D)}else c([])},[t,B,c]),H=y.useRef([]),P=y.useCallback(function(x){if(!s){var O=H.current;O.push({time:new Date().getTime(),value:Number(x)});var D=window.setTimeout(function(){d&&O.length>1&&O[O.length-1].time-O[O.length-2].time<300?O[O.length-1].value===O[O.length-2].value?M(Number(x)):U([O[O.length-2].value,O[O.length-1].value]):U(Number(x)),H.current=[]},300);return function(){window.clearTimeout(D)}}},[H,U,M,s,d]),E=y.useCallback(function(){s||c([])},[c,s]),N=y.useMemo(function(){var x;return J(((x={"react-js-cron-select":!0,"react-js-cron-custom-select":!0})["".concat(m,"-select")]=!!m,x))},[m]),Z=y.useMemo(function(){var x;return J(((x={"react-js-cron-select-dropdown":!0})["react-js-cron-select-dropdown-".concat(h.type)]=!0,x["react-js-cron-custom-select-dropdown"]=!0,x["react-js-cron-custom-select-dropdown-".concat(h.type)]=!0,x["react-js-cron-custom-select-dropdown-minutes-large"]=h.type==="minutes"&&f!=="hour"&&f!=="day",x["react-js-cron-custom-select-dropdown-minutes-medium"]=h.type==="minutes"&&(f==="day"||f==="hour"),x["react-js-cron-custom-select-dropdown-hours-twelve-hour-clock"]=h.type==="hours"&&u==="12-hour-clock",x["react-js-cron-custom-select-dropdown-grid"]=!!o,x["".concat(m,"-select-dropdown")]=!!m,x["".concat(m,"-select-dropdown-").concat(h.type)]=!!m,x))},[m,o,u,f]);return n.jsx(k.Select,q({mode:b!=="single"||d?"multiple":void 0,allowClear:!s,virtual:!1,open:!s&&void 0,value:w,onClear:E,tagRender:ee,className:N,popupClassName:Z,options:B,showSearch:!1,showArrow:!s,menuItemSelectedIcon:null,dropdownMatchSelectWidth:!1,onSelect:P,onDeselect:P,disabled:i,dropdownAlign:h.type!=="minutes"&&h.type!=="hours"||f==="day"||f==="hour"?void 0:{points:["tr","br"]},"data-testid":"custom-select-".concat(h.type)},S))}function So(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.disabled,l=e.readOnly,m=e.leadingZero,p=e.clockFormat,i=e.period,s=e.periodicityOnDoubleClick,v=e.mode,u=y.useMemo(function(){var f;return J(((f={"react-js-cron-field":!0,"react-js-cron-hours":!0})["".concat(r,"-field")]=!!r,f["".concat(r,"-hours")]=!!r,f))},[r]);return n.jsxs("div",q({className:u},{children:[o.prefixHours!==""&&n.jsx("span",{children:o.prefixHours||C.prefixHours}),n.jsx(se,{placeholder:o.emptyHours||C.emptyHours,value:t,unit:oe[1],setValue:a,locale:o,className:r,disabled:c,readOnly:l,leadingZero:m,clockFormat:p,period:i,periodicityOnDoubleClick:s,mode:v})]}))}function Mo(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.disabled,l=e.readOnly,m=e.leadingZero,p=e.clockFormat,i=e.period,s=e.periodicityOnDoubleClick,v=e.mode,u=y.useMemo(function(){var f;return J(((f={"react-js-cron-field":!0,"react-js-cron-minutes":!0})["".concat(r,"-field")]=!!r,f["".concat(r,"-minutes")]=!!r,f))},[r]);return n.jsxs("div",q({className:u},{children:[i==="hour"?o.prefixMinutesForHourPeriod!==""&&n.jsx("span",{children:o.prefixMinutesForHourPeriod||C.prefixMinutesForHourPeriod}):o.prefixMinutes!==""&&n.jsx("span",{children:o.prefixMinutes||C.prefixMinutes}),n.jsx(se,{placeholder:i==="hour"?o.emptyMinutesForHourPeriod||C.emptyMinutesForHourPeriod:o.emptyMinutes||C.emptyMinutes,value:t,unit:oe[0],setValue:a,locale:o,className:r,disabled:c,readOnly:l,leadingZero:m,clockFormat:p,period:i,periodicityOnDoubleClick:s,mode:v}),i==="hour"&&o.suffixMinutesForHourPeriod!==""&&n.jsx("span",{children:o.suffixMinutesForHourPeriod||C.suffixMinutesForHourPeriod})]}))}function Do(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.weekDays,l=e.disabled,m=e.readOnly,p=e.leadingZero,i=e.period,s=e.periodicityOnDoubleClick,v=e.mode,u=!c||c.length===0,f=y.useMemo(function(){var b;return J(((b={"react-js-cron-field":!0,"react-js-cron-month-days":!0,"react-js-cron-month-days-placeholder":!u})["".concat(r,"-field")]=!!r,b["".concat(r,"-month-days")]=!!r,b))},[r,u]),h=JSON.stringify(o),d=y.useMemo(function(){return u?o.emptyMonthDays||C.emptyMonthDays:o.emptyMonthDaysShort||C.emptyMonthDaysShort},[u,h]);return!m||t&&t.length>0||(!t||t.length===0)&&(!c||c.length===0)?n.jsxs("div",q({className:f},{children:[o.prefixMonthDays!==""&&n.jsx("span",{children:o.prefixMonthDays||C.prefixMonthDays}),n.jsx(se,{placeholder:d,value:t,setValue:a,unit:oe[2],locale:o,className:r,disabled:l,readOnly:m,leadingZero:p,period:i,periodicityOnDoubleClick:s,mode:v})]})):null}function Ao(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.humanizeLabels,l=e.disabled,m=e.readOnly,p=e.period,i=e.periodicityOnDoubleClick,s=e.mode,v=o.months||C.months,u=y.useMemo(function(){var f;return J(((f={"react-js-cron-field":!0,"react-js-cron-months":!0})["".concat(r,"-field")]=!!r,f["".concat(r,"-months")]=!!r,f))},[r]);return n.jsxs("div",q({className:u},{children:[o.prefixMonths!==""&&n.jsx("span",{children:o.prefixMonths||C.prefixMonths}),n.jsx(se,{placeholder:o.emptyMonths||C.emptyMonths,optionsList:v,grid:!1,value:t,unit:q(q({},oe[3]),{alt:o.altMonths||C.altMonths}),setValue:a,locale:o,className:r,humanizeLabels:c,disabled:l,readOnly:m,period:p,periodicityOnDoubleClick:i,mode:s})]}))}function Bo(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.disabled,l=e.readOnly,m=e.shortcuts,p=e.allowedPeriods,i=[];p.includes("year")&&i.push({value:"year",label:o.yearOption||C.yearOption}),p.includes("month")&&i.push({value:"month",label:o.monthOption||C.monthOption}),p.includes("week")&&i.push({value:"week",label:o.weekOption||C.weekOption}),p.includes("day")&&i.push({value:"day",label:o.dayOption||C.dayOption}),p.includes("hour")&&i.push({value:"hour",label:o.hourOption||C.hourOption}),p.includes("minute")&&i.push({value:"minute",label:o.minuteOption||C.minuteOption}),p.includes("reboot")&&m&&(m===!0||m.includes("@reboot"))&&i.push({value:"reboot",label:o.rebootOption||C.rebootOption});var s=y.useCallback(function(h){l||a(h)},[a,l]),v=y.useMemo(function(){var h;return J(((h={"react-js-cron-field":!0,"react-js-cron-period":!0})["".concat(r,"-field")]=!!r,h["".concat(r,"-period")]=!!r,h))},[r]),u=y.useMemo(function(){var h;return J(((h={"react-js-cron-select":!0,"react-js-cron-select-no-prefix":o.prefixPeriod===""})["".concat(r,"-select")]=!!r,h))},[r,o.prefixPeriod]),f=y.useMemo(function(){var h;return J(((h={"react-js-cron-select-dropdown":!0,"react-js-cron-select-dropdown-period":!0})["".concat(r,"-select-dropdown")]=!!r,h["".concat(r,"-select-dropdown-period")]=!!r,h))},[r]);return n.jsxs("div",q({className:v},{children:[o.prefixPeriod!==""&&n.jsx("span",{children:o.prefixPeriod||C.prefixPeriod}),n.jsx(k.Select,{defaultValue:t,value:t,onChange:s,options:i,className:u,popupClassName:f,disabled:c,showArrow:!l,open:!l&&void 0,"data-testid":"select-period"},JSON.stringify(o))]}))}function No(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.humanizeLabels,l=e.monthDays,m=e.disabled,p=e.readOnly,i=e.period,s=e.periodicityOnDoubleClick,v=e.mode,u=o.weekDays||C.weekDays,f=i==="week"||!l||l.length===0,h=y.useMemo(function(){var B;return J(((B={"react-js-cron-field":!0,"react-js-cron-week-days":!0,"react-js-cron-week-days-placeholder":!f})["".concat(r,"-field")]=!!r,B["".concat(r,"-week-days")]=!!r,B))},[r,f]),d=JSON.stringify(o),b=y.useMemo(function(){return f?o.emptyWeekDays||C.emptyWeekDays:o.emptyWeekDaysShort||C.emptyWeekDaysShort},[f,d]),S=i==="week"||!p||t&&t.length>0||(!t||t.length===0)&&(!l||l.length===0),w=!p||l&&l.length>0||(!l||l.length===0)&&(!t||t.length===0);return S?n.jsxs("div",q({className:h},{children:[o.prefixWeekDays!==""&&(i==="week"||!w)&&n.jsx("span",{children:o.prefixWeekDays||C.prefixWeekDays}),o.prefixWeekDaysForMonthAndYearPeriod!==""&&i!=="week"&&w&&n.jsx("span",{children:o.prefixWeekDaysForMonthAndYearPeriod||C.prefixWeekDaysForMonthAndYearPeriod}),n.jsx(se,{placeholder:b,optionsList:u,grid:!1,value:t,unit:q(q({},oe[4]),{alt:o.altWeekDays||C.altWeekDays}),setValue:a,locale:o,className:r,humanizeLabels:c,disabled:m,readOnly:p,period:i,periodicityOnDoubleClick:s,mode:v})]})):null}function Fo(e){var t=e.clearButton,a=t===void 0||t,o=e.clearButtonProps,r=o===void 0?{}:o,c=e.clearButtonAction,l=c===void 0?"fill-with-every":c,m=e.locale,p=m===void 0?C:m,i=e.value,s=i===void 0?"":i,v=e.setValue,u=e.displayError,f=u===void 0||u,h=e.onError,d=e.className,b=e.defaultPeriod,S=b===void 0?"day":b,w=e.allowEmpty,B=w===void 0?"for-default-value":w,Y=e.humanizeLabels,ee=Y===void 0||Y,U=e.humanizeValue,M=U!==void 0&&U,H=e.disabled,P=H!==void 0&&H,E=e.readOnly,N=E!==void 0&&E,Z=e.leadingZero,x=Z!==void 0&&Z,O=e.shortcuts,D=O===void 0?["@yearly","@annually","@monthly","@weekly","@daily","@midnight","@hourly"]:O,W=e.clockFormat,F=e.periodicityOnDoubleClick,T=F===void 0||F,L=e.mode,I=L===void 0?"multiple":L,ce=e.allowedDropdowns,_=ce===void 0?["period","months","month-days","week-days","hours","minutes"]:ce,ne=e.allowedPeriods,Uo=ne===void 0?["year","month","week","day","hour","minute","reboot"]:ne,re=y.useRef(s),Ae=y.useRef(S),Xe=y.useState(),K=Xe[0],ve=Xe[1],Qe=y.useState(),ue=Qe[0],be=Qe[1],Re=y.useState(),xe=Re[0],ge=Re[1],eo=y.useState(),de=eo[0],ke=eo[1],oo=y.useState(),we=oo[0],Ce=oo[1],to=y.useState(),Oe=to[0],Se=to[1],no=y.useState(!1),Be=no[0],pe=no[1],ro=y.useState(!1),Me=ro[0],ao=ro[1],Wo=function(j){var G=y.useRef(j);return y.useEffect(function(){G.current=j},[j]),G.current}(Me),io=JSON.stringify(p);y.useEffect(function(){Ve(s,pe,h,B,re,!0,p,D,Se,Ce,be,ge,ke,ve)},[]),y.useEffect(function(){s!==re.current&&Ve(s,pe,h,B,re,!1,p,D,Se,Ce,be,ge,ke,ve)},[s,re,io,B,D]),y.useEffect(function(){if(!(K||Oe||xe||ue||de||we)||Me||Wo)Me&&ao(!1);else{var j=K||Ae.current,G=qe(j,xe,ue,de,we,Oe,M);v(G,{selectedPeriod:j}),re.current=G,h&&h(void 0),pe(!1)}},[K,ue,xe,de,we,Oe,M,Me]);var lo=y.useCallback(function(){be(void 0),ge(void 0),ke(void 0),Ce(void 0),Se(void 0);var j="",G=K!=="reboot"&&K?K:Ae.current;G!==K&&ve(G),l==="fill-with-every"&&(j=qe(G,void 0,void 0,void 0,void 0,void 0)),v(j,{selectedPeriod:G}),re.current=j,ao(!0),B==="never"&&l==="empty"?(pe(!0),Ie(h,p)):(h&&h(void 0),pe(!1))},[K,v,h,l]),zo=y.useMemo(function(){var j;return J(((j={"react-js-cron":!0,"react-js-cron-error":Be&&f,"react-js-cron-disabled":P,"react-js-cron-read-only":N})["".concat(d)]=!!d,j["".concat(d,"-error")]=Be&&f&&!!d,j["".concat(d,"-disabled")]=P&&!!d,j["".concat(d,"-read-only")]=N&&!!d,j))},[d,Be,f,P,N]),Ne=r.className,so=je(r,["className"]),co=y.useMemo(function(){var j;return J(((j={"react-js-cron-clear-button":!0})["".concat(d,"-clear-button")]=!!d,j["".concat(Ne)]=!!Ne,j))},[d,Ne]),Jo=JSON.stringify(so),uo=y.useMemo(function(){return a&&!N?n.jsx(k.Button,q({className:co,danger:!0,type:"primary",disabled:P},so,{onClick:lo},{children:p.clearButtonText||C.clearButtonText})):null},[a,N,io,co,P,Jo,lo]),V=K||Ae.current;return n.jsxs("div",q({className:zo},{children:[_.includes("period")&&n.jsx(Bo,{value:V,setValue:ve,locale:p,className:d,disabled:P,readOnly:N,shortcuts:D,allowedPeriods:Uo}),V==="reboot"?uo:n.jsxs(n.Fragment,{children:[V==="year"&&_.includes("months")&&n.jsx(Ao,{value:xe,setValue:ge,locale:p,className:d,humanizeLabels:ee,disabled:P,readOnly:N,period:V,periodicityOnDoubleClick:T,mode:I}),(V==="year"||V==="month")&&_.includes("month-days")&&n.jsx(Do,{value:ue,setValue:be,locale:p,className:d,weekDays:de,disabled:P,readOnly:N,leadingZero:x,period:V,periodicityOnDoubleClick:T,mode:I}),(V==="year"||V==="month"||V==="week")&&_.includes("week-days")&&n.jsx(No,{value:de,setValue:ke,locale:p,className:d,humanizeLabels:ee,monthDays:ue,disabled:P,readOnly:N,period:V,periodicityOnDoubleClick:T,mode:I}),n.jsxs("div",{children:[V!=="minute"&&V!=="hour"&&_.includes("hours")&&n.jsx(So,{value:we,setValue:Ce,locale:p,className:d,disabled:P,readOnly:N,leadingZero:x,clockFormat:W,period:V,periodicityOnDoubleClick:T,mode:I}),V!=="minute"&&_.includes("minutes")&&n.jsx(Mo,{value:Oe,setValue:Se,locale:p,period:V,className:d,disabled:P,readOnly:N,leadingZero:x,clockFormat:W,periodicityOnDoubleClick:T,mode:I}),uo]})]})]}))}const Po={"zh-CN":{everyText:"每",emptyMonths:"每月",emptyMonthDays:"每日(月)",emptyMonthDaysShort:"每日",emptyWeekDays:"每天(周)",emptyWeekDaysShort:"每天(周)",emptyHours:"每小时",emptyMinutes:"每分钟",emptyMinutesForHourPeriod:"每",yearOption:"年",monthOption:"月",weekOption:"周",dayOption:"天",hourOption:"小时",minuteOption:"分钟",rebootOption:"重启",prefixPeriod:"每",prefixMonths:"的",prefixMonthDays:"的",prefixWeekDays:"的",prefixWeekDaysForMonthAndYearPeriod:"或者",prefixHours:"的",prefixMinutes:":",prefixMinutesForHourPeriod:"的",suffixMinutesForHourPeriod:"分钟",errorInvalidCron:"不符合 cron 规则的表达式",clearButtonText:"清空",weekDays:["周日","周一","周二","周三","周四","周五","周六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],altWeekDays:["周日","周一","周二","周三","周四","周五","周六"],altMonths:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]}},_e=[{value:"none",text:"No repeat"},{value:6e4,text:"By minute",unitText:"Minutes"},{value:36e5,text:"By hour",unitText:"Hours"},{value:864e5,text:"By day",unitText:"Days"},{value:6048e5,text:"By week",unitText:"Weeks"},{value:"cron",text:"Advanced"}];function Ge(e){return _e.filter(a=>!isNaN(+a.value)).reverse().find(a=>!(e%a.value))}function To(e){if(!e)return"none";if(e&&!isNaN(+e)){const t=Ge(e);return t?t.value:"none"}if(typeof e=="string")return"cron"}function jo({value:e,onChange:t}){const{t:a}=R(),o=Ge(e);return n.jsx(k.InputNumber,{value:e/o.value,onChange:r=>t(r*o.value),min:1,addonBefore:a("Every"),addonAfter:a(o.unitText),className:"auto-width"})}function Eo({value:e=null,onChange:t}){const{t:a}=R(),o=To(e),r=y.useCallback(l=>{if(l==="none"){t(null);return}if(l==="cron"){t("0 * * * * *");return}t(l)},[t]),c=Po[localStorage.getItem("TACHYBASE_LOCALE")||"en-US"];return n.jsxs("fieldset",{className:g.css`
|
|
1
|
+
(function(A,g){typeof exports=="object"&&typeof module!="undefined"?g(exports,require("@tachybase/client"),require("react/jsx-runtime"),require("react"),require("@ant-design/icons"),require("@tego/client"),require("antd"),require("react-i18next")):typeof define=="function"&&define.amd?define(["exports","@tachybase/client","react/jsx-runtime","react","@ant-design/icons","@tego/client","antd","react-i18next"],g):(A=typeof globalThis!="undefined"?globalThis:A||self,g(A["@tachybase/module-backup"]={},A["@tachybase/client"],A.jsxRuntime,A.react,A["@ant-design/icons"],A["@tego/client"],A.antd,A["react-i18next"]))})(this,function(A,g,n,y,Y,De,k,ie){"use strict";var Zo=Object.defineProperty,_o=Object.defineProperties;var Go=Object.getOwnPropertyDescriptors;var po=Object.getOwnPropertySymbols;var $o=Object.prototype.hasOwnProperty,Yo=Object.prototype.propertyIsEnumerable;var mo=(A,g,n)=>g in A?Zo(A,g,{enumerable:!0,configurable:!0,writable:!0,value:n}):A[g]=n,ae=(A,g)=>{for(var n in g||(g={}))$o.call(g,n)&&mo(A,n,g[n]);if(po)for(var n of po(g))Yo.call(g,n)&&mo(A,n,g[n]);return A},Me=(A,g)=>_o(A,Go(g));var $=(A,g,n)=>new Promise((y,Y)=>{var De=z=>{try{ie(n.next(z))}catch(Q){Y(Q)}},k=z=>{try{ie(n.throw(z))}catch(Q){Y(Q)}},ie=z=>z.done?y(z.value):Promise.resolve(z.value).then(De,k);ie((n=n.apply(A,g)).next())});var z=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},Q={exports:{}},fo=Q.exports,Fe;function yo(){return Fe||(Fe=1,function(e,t){(function(a,o){o()})(fo,function(){function a(i,s){return typeof s=="undefined"?s={autoBom:!1}:typeof s!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),s={autoBom:!s}),s.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(i.type)?new Blob(["\uFEFF",i],{type:i.type}):i}function o(i,s,v){var u=new XMLHttpRequest;u.open("GET",i),u.responseType="blob",u.onload=function(){p(u.response,s,v)},u.onerror=function(){console.error("could not download file")},u.send()}function r(i){var s=new XMLHttpRequest;s.open("HEAD",i,!1);try{s.send()}catch(v){}return 200<=s.status&&299>=s.status}function c(i){try{i.dispatchEvent(new MouseEvent("click"))}catch(v){var s=document.createEvent("MouseEvents");s.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),i.dispatchEvent(s)}}var l=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof z=="object"&&z.global===z?z:void 0,m=l.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),p=l.saveAs||(typeof window!="object"||window!==l?function(){}:"download"in HTMLAnchorElement.prototype&&!m?function(i,s,v){var u=l.URL||l.webkitURL,f=document.createElement("a");s=s||i.name||"download",f.download=s,f.rel="noopener",typeof i=="string"?(f.href=i,f.origin===location.origin?c(f):r(f.href)?o(i,s,v):c(f,f.target="_blank")):(f.href=u.createObjectURL(i),setTimeout(function(){u.revokeObjectURL(f.href)},4e4),setTimeout(function(){c(f)},0))}:"msSaveOrOpenBlob"in navigator?function(i,s,v){if(s=s||i.name||"download",typeof i!="string")navigator.msSaveOrOpenBlob(a(i,v),s);else if(r(i))o(i,s,v);else{var u=document.createElement("a");u.href=i,u.target="_blank",setTimeout(function(){c(u)})}}:function(i,s,v,u){if(u=u||open("","_blank"),u&&(u.document.title=u.document.body.innerText="downloading..."),typeof i=="string")return o(i,s,v);var f=i.type==="application/octet-stream",h=/constructor/i.test(l.HTMLElement)||l.safari,d=/CriOS\/[\d]+/.test(navigator.userAgent);if((d||f&&h||m)&&typeof FileReader!="undefined"){var x=new FileReader;x.onloadend=function(){var B=x.result;B=d?B:B.replace(/^data:[^;]*;/,"data:attachment/file;"),u?u.location.href=B:location=B,u=null},x.readAsDataURL(i)}else{var S=l.URL||l.webkitURL,w=S.createObjectURL(i);u?u.location=w:location.href=w,u=null,setTimeout(function(){S.revokeObjectURL(w)},4e4)}});l.saveAs=p.saveAs=p,e.exports=p})}(Q)),Q.exports}var ho=yo();const le="backup";function R(){return ie.useTranslation([le,"core"],{nsMode:"fallback"})}const vo=e=>g.tval(e,{ns:le}),{Dragger:xo}=k.Upload;function bo(e){const t=o=>{var r;(r=e.onChange)==null||r.call(e,o)},a=g.useAPIClient();return Me(ae({},e),{customRequest({action:o,data:r,file:c,filename:l,headers:m,onError:p,onProgress:i,onSuccess:s,withCredentials:v}){const u=new FormData;return r&&Object.keys(r).forEach(f=>{u.append(f,r[f])}),u.append(l,c),a.axios.post(o,u,{withCredentials:v,headers:m,onUploadProgress:({total:f,loaded:h})=>{i({percent:Math.round(h/f*100).toFixed(2)},c)}}).then(({data:f})=>{s(f,c)}).catch(p).finally(()=>{}),{abort(){console.log("upload progress is aborted.")}}},onChange:t})}const Pe=e=>{const{collectionsData:t}=e,{t:a}=R(),[o,r]=y.useState(!1),[c,l]=y.useState(t);y.useEffect(()=>{l(t)},[t]);const m=g.useAPIClient(),p=g.useCompile(),i=y.useMemo(()=>m.resource("backupFiles"),[m]),s=()=>$(null,null,function*(){if(e.isBackup){const d=yield i.dumpableCollections();l(d==null?void 0:d.data),r(!0)}r(!0)}),v=()=>{r(!1)},u=()=>{r(!1)},f=[{title:a("Collection"),dataIndex:"collection",key:"collection",render:(d,x)=>{const S=p(x.title);return x.name===S?S:n.jsxs("div",{children:[x.name," ",n.jsxs("span",{style:{color:"rgba(0, 0, 0, 0.3)",fontSize:"0.9em"},children:["(",p(x.title),")"]})]})}},{title:a("Origin"),dataIndex:"origin",key:"origin",width:"50%"}],h=Object.keys(c||{}).map(d=>({key:d,label:a(`${d}.title`),children:n.jsxs(n.Fragment,{children:[n.jsx(k.Alert,{style:{marginBottom:16},message:a(`${d}.description`)}),n.jsx(k.Table,{pagination:{pageSize:100},bordered:!0,size:"small",dataSource:c[d],columns:f,scroll:{y:400}})]})}));return n.jsxs(n.Fragment,{children:[n.jsx("a",{onClick:s,children:a("Learn more")}),n.jsx(k.Modal,{title:a("Backup instructions"),width:"80vw",open:o,footer:null,onOk:v,onCancel:u,children:n.jsx(k.Tabs,{defaultActiveKey:"required",items:h})})]})},Te=({ButtonComponent:e=k.Button,title:t,upload:a=!1,fileData:o})=>{const{t:r}=R(),[c,l]=y.useState(["required"]),[m,p]=y.useState(!1),[i,s]=y.useState(null),[v,u]=y.useState(!1),f=g.useAPIClient(),h=y.useMemo(()=>f.resource("backupFiles"),[f]),[d,x]=y.useState([]),S=c.length>0&&c.length<d.length,w=d.length===c.length;y.useEffect(()=>{x(Object.keys((i==null?void 0:i.dumpableCollectionsGroupByGroup)||[]).map(M=>({value:M,label:r(`${M}.title`),disabled:["required","skipped"].includes(M)})))},[i]);const B=()=>$(null,null,function*(){var M,H,P;if(p(!0),!a){u(!0);const{data:E}=yield h.get({filterByTk:o.name});x(Object.keys(((H=(M=E==null?void 0:E.data)==null?void 0:M.meta)==null?void 0:H.dumpableCollectionsGroupByGroup)||[]).map(N=>({value:N,label:r(`${N}.title`),disabled:["required","skipped"].includes(N)}))),s((P=E==null?void 0:E.data)==null?void 0:P.meta),u(!1)}}),K=()=>{h.restore({values:{dataTypes:c,filterByTk:o==null?void 0:o.name,key:i==null?void 0:i.key}}),p(!1)},ee=()=>{p(!1),s(null),l(["required"])},U=M=>{l(M.target.checked?d.map(H=>H.value):["required"])};return n.jsxs(n.Fragment,{children:[n.jsx(e,{onClick:B,children:t}),n.jsx(k.Modal,{title:r("Restore"),width:800,footer:a&&!i?null:void 0,open:m,onOk:K,onCancel:ee,children:n.jsxs(k.Spin,{spinning:v,children:[a&&!i&&n.jsx(ko,{setRestoreData:s}),(!a||i)&&[n.jsxs("strong",{style:{fontWeight:600,display:"block",margin:"16px 0 8px"},children:[r("Select the data to be restored")," (",n.jsx(Pe,{collectionsData:i==null?void 0:i.dumpableCollectionsGroupByGroup}),"):"]},"info"),n.jsx("div",{style:{lineHeight:2,marginBottom:8},children:n.jsxs(De.FormItem,{children:[n.jsx(g.Checkbox.Group,{options:d,style:{flexDirection:"column"},value:c,onChange:M=>l(M)}),n.jsx(k.Divider,{}),n.jsx(g.Checkbox,{indeterminate:S,onChange:U,checked:w,children:r("Check all")})]})},"dataType")]]})})]})},go=({ButtonComponent:e=k.Button,refresh:t})=>{const{t:a}=R(),[o,r]=y.useState(!1),[c,l]=y.useState(["required"]),m=g.useAPIClient(),{notification:p}=k.App.useApp(),[i,s]=y.useState([]),v=c.length>0&&c.length<i.filter(S=>S.value!=="skipped").length,u=i.filter(S=>S.value!=="skipped").length===c.length,f=S=>{l(S.target.checked?i.filter(w=>w.value!=="skipped").map(w=>w.value):["required"])},h=()=>$(null,null,function*(){const{data:S}=yield m.resource("backupFiles").dumpableCollections();s(Object.keys(S||[]).map(w=>({value:w,label:a(`${w}.title`),disabled:["required","skipped"].includes(w)}))),r(!0)}),d=S=>{m.request({url:"backupFiles:create",method:"post",data:{dataTypes:c,method:S}}),p.info({key:"backup",message:n.jsxs("span",{children:[a("Processing...")," ",n.jsx(k.Spin,{indicator:n.jsx(Y.LoadingOutlined,{style:{fontSize:24},spin:!0})})]}),duration:0}),r(!1),l(["required"]),setTimeout(()=>{t()},500)},x=()=>{r(!1),l(["required"])};return n.jsxs(n.Fragment,{children:[n.jsx(e,{icon:n.jsx(Y.PlusOutlined,{}),type:"primary",onClick:h,children:a("New backup")}),n.jsxs(k.Modal,{title:a("New backup"),width:800,open:o,onCancel:x,footer:[n.jsxs(k.Row,{gutter:16,justify:"end",align:"middle",children:[n.jsx(k.Col,{children:n.jsx(k.Button,{onClick:x,children:a("Cancel")},"cancel")}),n.jsx(k.Col,{children:n.jsx(k.Dropdown.Button,{type:"primary",onClick:()=>d("priority"),overlay:n.jsxs(k.Menu,{children:[n.jsx(k.Menu.Item,{onClick:()=>d("main"),children:a("Self backup")},"main"),n.jsx(k.Menu.Item,{onClick:()=>d("worker"),children:a("Worker backup")},"worker")]}),children:a("Backup")},"submit")})]})],children:[n.jsxs("strong",{style:{fontWeight:600,display:"block",margin:"16px 0 8px"},children:[a("Select the data to be backed up")," (",n.jsx(Pe,{isBackup:!0}),"):"]}),n.jsxs("div",{style:{lineHeight:2,marginBottom:8},children:[n.jsx(g.Checkbox.Group,{options:i,style:{flexDirection:"column"},onChange:S=>l(S),value:c}),n.jsx(k.Divider,{}),n.jsx(g.Checkbox,{indeterminate:v,onChange:f,checked:u,children:a("Check all")})]})]})]})},ko=e=>{const{t}=R(),a={multiple:!1,action:"/backupFiles:upload",onChange(o){var c,l,m;o.fileList.length>1&&o.fileList.splice(0,o.fileList.length-1);const{status:r}=o.file;r==="done"?(k.message.success(`${o.file.name} `+t("file uploaded successfully")),e.setRestoreData(Me(ae({},(l=(c=o.file.response)==null?void 0:c.data)==null?void 0:l.meta),{key:(m=o.file.response)==null?void 0:m.data.key}))):r==="error"&&k.message.error(`${o.file.name} `+t("file upload failed"))},onDrop(o){console.log("Dropped files",o.dataTransfer.files)}};return n.jsxs(xo,Me(ae({},bo(a)),{children:[n.jsx("p",{className:"ant-upload-drag-icon",children:n.jsx(Y.InboxOutlined,{})}),n.jsxs("p",{className:"ant-upload-text",children:[" ",t("Click or drag file to this area to upload")]})]}))},wo=()=>{const{t:e}=R(),t=g.useAPIClient(),[a,o]=y.useState([]),[r,c]=y.useState(!1),[l,m]=y.useState(!1),{modal:p,notification:i}=k.App.useApp(),s=y.useMemo(()=>t.resource("backupFiles"),[t]),v=y.useCallback(()=>$(null,null,function*(){yield u()}),[]);g.useNoticeSub("backup",d=>{(i[d.level]||i.info)({key:"backup",message:d.msg}),v()}),y.useEffect(()=>{u()},[]);const u=()=>$(null,null,function*(){c(!0);const{data:d}=yield s.list();o(d.data),c(!1)}),f=d=>$(null,null,function*(){m(d.name);const x=yield t.request({url:"backupFiles:download",method:"get",params:{filterByTk:d.name},responseType:"blob",onDownloadProgress:w=>{const B=Math.round(w.loaded*100/w.total);B>=100?i.success({key:"downloadBackup",message:n.jsx("span",{children:e("Downloaded success!")}),duration:1}):i.info({key:"downloadBackup",message:n.jsxs("span",{children:[e("Downloading ")+B+"%"," ",n.jsx(k.Spin,{indicator:n.jsx(Y.LoadingOutlined,{style:{fontSize:24},spin:!0})})]}),duration:0})}});m(!1);const S=new Blob([x.data]);ho.saveAs(S,d.name)}),h=d=>{p.confirm({title:e("Delete record",{ns:"core"}),content:e("Are you sure you want to delete it?",{ns:"core"}),onOk:()=>$(null,null,function*(){yield s.destroy({filterByTk:d.name}),yield u(),k.message.success(e("Deleted successfully"))})})};return n.jsx("div",{children:n.jsxs(k.Card,{bordered:!1,children:[n.jsxs(k.Space,{style:{float:"right",marginBottom:16},children:[n.jsx(k.Button,{onClick:v,icon:n.jsx(Y.ReloadOutlined,{}),children:e("Refresh")}),n.jsx(Te,{upload:!0,title:n.jsxs(n.Fragment,{children:[n.jsx(Y.UploadOutlined,{})," ",e("Restore backup from local")]})}),n.jsx(go,{refresh:v})]}),n.jsx(k.Table,{dataSource:a,loading:r,columns:[{title:e("Backup file"),dataIndex:"name",width:400,onCell:d=>d.inProgress?{colSpan:4}:{},render:(d,x)=>x.inProgress?n.jsxs("div",{style:{color:"rgba(0, 0, 0, 0.88)"},children:[d,"(",e("Backing up"),"...)"]}):x.status==="error"?n.jsxs("div",{style:{color:"red"},children:[d,"(",e("Error"),")"]}):n.jsx("div",{children:d})},{title:e("File size"),dataIndex:"fileSize",onCell:d=>d.inProgress?{colSpan:0}:{}},{title:e("Created at",{ns:"core"}),dataIndex:"createdAt",onCell:d=>d.inProgress?{colSpan:0}:{},render:d=>n.jsx(g.DatePicker.ReadPretty,{value:d,showTime:!0})},{title:e("Actions",{ns:"core"}),dataIndex:"actions",onCell:d=>d.inProgress?{colSpan:0}:{},render:(d,x)=>n.jsxs(k.Space,{split:n.jsx(k.Divider,{type:"vertical"}),children:[x.status!=="error"&&n.jsx(Te,{ButtonComponent:"a",title:e("Restore"),fileData:x}),x.status!=="error"&&n.jsx("a",{type:"link",onClick:()=>f(x),children:e("Download")}),n.jsx("a",{onClick:()=>h(x),children:e("Delete")})]})}]})]})})},Co={dumpRules:"required",name:"autoBackup",shared:!0,createdAt:!0,updatedAt:!0,createdBy:!0,updatedBy:!0,fields:[{type:"string",name:"title",required:!0,uiSchema:{title:'{{ t("Title") }}',type:"string","x-component":"Input",required:!0}},{type:"boolean",name:"enabled",defaultValue:!1,uiSchema:{title:'{{ t("Enabled") }}',type:"boolean","x-component":"Checkbox",required:!0}},{type:"array",name:"dumpRules",uiSchema:{title:'{{ t("Dump rules") }}',type:"string","x-component":"Input",required:!0}},{type:"string",name:"repeat",required:!0,uiSchema:{title:'{{t("Repeat mode")}}',type:"string","x-component":"RepeatField"}},{type:"integer",name:"maxNumber",uiSchema:{title:'{{ t("Max number") }}',type:"integer","x-component":"Input",required:!0}}]};var q=function(){return q=Object.assign||function(e){for(var t,a=1,o=arguments.length;a<o;a++)for(var r in t=arguments[a])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e},q.apply(this,arguments)};function je(e,t){var a={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(a[o]=e[o]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function"){var r=0;for(o=Object.getOwnPropertySymbols(e);r<o.length;r++)t.indexOf(o[r])<0&&Object.prototype.propertyIsEnumerable.call(e,o[r])&&(a[o[r]]=e[o[r]])}return a}function me(e,t,a){if(a||arguments.length===2)for(var o,r=0,c=t.length;r<c;r++)!o&&r in t||(o||(o=Array.prototype.slice.call(t,0,r)),o[r]=t[r]);return e.concat(o||Array.prototype.slice.call(t))}var Oo=[{name:"@yearly",value:"0 0 1 1 *"},{name:"@annually",value:"0 0 1 1 *"},{name:"@monthly",value:"0 0 1 * *"},{name:"@weekly",value:"0 0 * * 0"},{name:"@daily",value:"0 0 * * *"},{name:"@midnight",value:"0 0 * * *"},{name:"@hourly",value:"0 * * * *"}],oe=[{type:"minutes",min:0,max:59,total:60},{type:"hours",min:0,max:23,total:24},{type:"month-days",min:1,max:31,total:31},{type:"months",min:1,max:12,total:12,alt:["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]},{type:"week-days",min:0,max:6,total:7,alt:["SUN","MON","TUE","WED","THU","FRI","SAT"]}],C={everyText:"every",emptyMonths:"every month",emptyMonthDays:"every day of the month",emptyMonthDaysShort:"day of the month",emptyWeekDays:"every day of the week",emptyWeekDaysShort:"day of the week",emptyHours:"every hour",emptyMinutes:"every minute",emptyMinutesForHourPeriod:"every",yearOption:"year",monthOption:"month",weekOption:"week",dayOption:"day",hourOption:"hour",minuteOption:"minute",rebootOption:"reboot",prefixPeriod:"Every",prefixMonths:"in",prefixMonthDays:"on",prefixWeekDays:"on",prefixWeekDaysForMonthAndYearPeriod:"and",prefixHours:"at",prefixMinutes:":",prefixMinutesForHourPeriod:"at",suffixMinutesForHourPeriod:"minute(s)",errorInvalidCron:"Invalid cron expression",clearButtonText:"Clear",weekDays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],altWeekDays:["SUN","MON","TUE","WED","THU","FRI","SAT"],altMonths:["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]};function Ee(e,t){for(var a=[],o=e;o<=t;o++)a.push(o);return a}function fe(e){return e.sort(function(t,a){return t-a}),e}function Le(e){var t=[];return e.forEach(function(a){t.indexOf(a)<0&&t.push(a)}),t}function J(e){return Object.entries(e).filter(function(t){var a=t[0],o=t[1];return a&&o}).map(function(t){return t[0]}).join(" ")}function Ie(e,t){e&&e({type:"invalid_cron",description:t.errorInvalidCron||C.errorInvalidCron})}function ye(e){var t=parseInt(e,10),a=Number(e);return t===a?a:NaN}function Ve(e,t,a,o,r,c,l,m,p,i,s,v,u,f){a&&a(void 0),t(!1);var h=!1;if(!e){if(o==="always"||c&&o==="for-default-value")return;h=!0}if(!h){if(m&&(m===!0||m.includes(e))){if(e==="@reboot")return void f("reboot");var d=Oo.find(function(w){return w.name===e});d&&(e=d.value)}try{var x=function(w){if(typeof w!="string")throw new Error("Invalid cron string");var B=w.replace(/\s+/g," ").trim().split(" ");if(B.length===5)return B.map(function(K,ee){return function(U,M){if(U==="*"||U==="*/1")return[];var H=fe(Le(We(function(E,N,Z){if(Z){E=E.toUpperCase();for(var b=0;b<Z.length;b++)E=E.replace(Z[b],"".concat(b+N))}return E}(U,M.min,M.alt).split(",").map(function(E){var N,Z=E.split("/");if(Z.length>2)throw new Error('Invalid value "'.concat(U,' for "').concat(M.type,'"'));var b=Z[0],O=Z[1];N=b==="*"?Ee(M.min,M.max):function(F,T,L){var I=F.split("-");if(I.length===1){var ce=ye(I[0]);if(isNaN(ce))throw new Error('Invalid value "'.concat(T,'" for ').concat(L.type));return[ce]}if(I.length===2){var _=ye(I[0]),ne=ye(I[1]);if(isNaN(_)||isNaN(ne))throw new Error('Invalid value "'.concat(T,'" for ').concat(L.type));if(ne<_)throw new Error('Max range is less than min range in "'.concat(F,'" for ').concat(L.type));return Ee(_,ne)}throw new Error('Invalid value "'.concat(F,'" for ').concat(L.type))}(b,U,M);var D=function(F,T){if(F!==void 0){var L=ye(F);if(isNaN(L)||L<1)throw new Error('Invalid interval step value "'.concat(F,'" for ').concat(T.type));return L}}(O,M),W=function(F,T){if(T){var L=F[0];F=F.filter(function(I){return I%T==L%T||I===L})}return F}(N,D);return W}).flat(),M))),P=ze(H,M);if(P!==void 0)throw new Error('Value "'.concat(P,'" out of range for ').concat(M.type));return H.length===M.total?[]:H}(K,oe[ee])});throw new Error("Invalid cron string format")}(e),S=function(w){return w[3].length>0?"year":w[2].length>0?"month":w[4].length>0?"week":w[1].length>0?"day":w[0].length>0?"hour":"minute"}(x);f(S),p(x[0]),i(x[1]),s(x[2]),v(x[3]),u(x[4])}catch(w){h=!0}}h&&(r.current=e,t(!0),Ie(a,l))}function qe(e,t,a,o,r,c,l){if(e==="reboot")return"@reboot";var m=function(p,i){return p.map(function(s,v){var u=oe[v];return He(Ue(s,u),u,i)})}([e!=="minute"&&c?c:[],e!=="minute"&&e!=="hour"&&r?r:[],e!=="year"&&e!=="month"||!a?[]:a,e==="year"&&t?t:[],e!=="year"&&e!=="month"&&e!=="week"||!o?[]:o],l);return m.join(" ")}function He(e,t,a,o,r){var c="";if(function(m,p){return m.length===p.max-p.min+1}(e,t)||e.length===0)c="*";else{var l=function(m){if(m.length>2){var p=m[1]-m[0];if(p>1)return p}}(e);c=l&&function(m,p){for(var i=1;i<m.length;i++){var s=m[i-1];if(m[i]-s!==p)return!1}return!0}(e,l)?function(m,p,i){var s=Je(m),v=Ze(m),u=m.length===(v-s)/i+1;return!!(s===p.min&&v+i>p.max&&u)}(e,t,l)?"*/".concat(l):"".concat(te(Je(e),t,a,o,r),"-").concat(te(Ze(e),t,a,o,r),"/").concat(l):function(m){var p=[],i=null;return m.forEach(function(s,v,u){s!==u[v+1]-1?i!==null?(p.push([i,s]),i=null):p.push(s):i===null&&(i=s)}),p}(e).map(function(m){return Array.isArray(m)?"".concat(te(m[0],t,a,o,r),"-").concat(te(m[1],t,a,o,r)):te(m,t,a,o,r)}).join(",")}return c}function te(e,t,a,o,r){var c=e.toString(),l=t.type,m=t.alt,p=t.min,i=o&&(o===!0||o.includes(l)),s=r==="24-hour-clock"&&(l==="hours"||l==="minutes");if(a&&l==="week-days"||a&&l==="months"?c=m[e-p]:e<10&&(i||s)&&(c=c.padStart(2,"0")),l==="hours"&&r==="12-hour-clock"){var v=e>=12?"PM":"AM",u=e%12||12;u<10&&i&&(u=u.toString().padStart(2,"0")),c="".concat(u).concat(v)}return c}function Ue(e,t){var a=fe(Le(We(e,t)));if(a.length===0)return a;var o=ze(a,t);if(o!==void 0)throw new Error('Value "'.concat(o,'" out of range for ').concat(t.type));return a}function We(e,t){return t.type==="week-days"&&(e=e.map(function(a){return a===7?0:a})),e}function ze(e,t){var a=e[0],o=e[e.length-1];return a<t.min?a:o>t.max?o:void 0}function Je(e){return e[0]}function Ze(e){return e[e.length-1]}function se(e){var t=e.value,a=e.grid,o=a===void 0||a,r=e.optionsList,c=e.setValue,l=e.locale,m=e.className,p=e.humanizeLabels,i=e.disabled,s=e.readOnly,v=e.leadingZero,u=e.clockFormat,f=e.period,h=e.unit,d=e.periodicityOnDoubleClick,x=e.mode,S=je(e,["value","grid","optionsList","setValue","locale","className","humanizeLabels","disabled","readOnly","leadingZero","clockFormat","period","unit","periodicityOnDoubleClick","mode"]),w=y.useMemo(function(){if(t&&Array.isArray(t))return t.map(function(b){return b.toString()})},[t]),B=y.useMemo(function(){return r?r.map(function(b,O){return{value:(h.min===0?O:O+1).toString(),label:b}}):me([],Array(h.total),!0).map(function(b,O){var D=h.min===0?O:O+1;return{value:D.toString(),label:te(D,h,p,v,u)}})},[r,v,p,u]),K=JSON.stringify(l),ee=y.useCallback(function(b){var O=b.value;if(!t||t[0]!==Number(O))return n.jsx(n.Fragment,{});var D=He(Ue(t,h),h,p,v,u),W=D.match(/^\*\/([0-9]+),?/)||[];return n.jsx("div",{children:W[1]?"".concat(l.everyText||C.everyText," ").concat(W[1]):D})},[t,K,p,v,u]),U=y.useCallback(function(b){var O=Array.isArray(b)?fe(b):[b],D=O;t&&(D=x==="single"?[]:me([],t,!0),O.forEach(function(W){var F=Number(W);D=t.some(function(T){return T===F})?D.filter(function(T){return T!==F}):fe(me(me([],D,!0),[F],!1))})),D.length===h.total?c([]):c(D)},[c,t]),M=y.useCallback(function(b){if(b!==0&&b!==1){for(var O=h.total+h.min,D=[],W=h.min;W<O;W++)W%b==0&&D.push(W);var F=t&&D&&t.length===D.length&&t.every(function(L,I){return L===D[I]}),T=D.length===B.length;c(T||F?[]:D)}else c([])},[t,B,c]),H=y.useRef([]),P=y.useCallback(function(b){if(!s){var O=H.current;O.push({time:new Date().getTime(),value:Number(b)});var D=window.setTimeout(function(){d&&O.length>1&&O[O.length-1].time-O[O.length-2].time<300?O[O.length-1].value===O[O.length-2].value?M(Number(b)):U([O[O.length-2].value,O[O.length-1].value]):U(Number(b)),H.current=[]},300);return function(){window.clearTimeout(D)}}},[H,U,M,s,d]),E=y.useCallback(function(){s||c([])},[c,s]),N=y.useMemo(function(){var b;return J(((b={"react-js-cron-select":!0,"react-js-cron-custom-select":!0})["".concat(m,"-select")]=!!m,b))},[m]),Z=y.useMemo(function(){var b;return J(((b={"react-js-cron-select-dropdown":!0})["react-js-cron-select-dropdown-".concat(h.type)]=!0,b["react-js-cron-custom-select-dropdown"]=!0,b["react-js-cron-custom-select-dropdown-".concat(h.type)]=!0,b["react-js-cron-custom-select-dropdown-minutes-large"]=h.type==="minutes"&&f!=="hour"&&f!=="day",b["react-js-cron-custom-select-dropdown-minutes-medium"]=h.type==="minutes"&&(f==="day"||f==="hour"),b["react-js-cron-custom-select-dropdown-hours-twelve-hour-clock"]=h.type==="hours"&&u==="12-hour-clock",b["react-js-cron-custom-select-dropdown-grid"]=!!o,b["".concat(m,"-select-dropdown")]=!!m,b["".concat(m,"-select-dropdown-").concat(h.type)]=!!m,b))},[m,o,u,f]);return n.jsx(k.Select,q({mode:x!=="single"||d?"multiple":void 0,allowClear:!s,virtual:!1,open:!s&&void 0,value:w,onClear:E,tagRender:ee,className:N,popupClassName:Z,options:B,showSearch:!1,showArrow:!s,menuItemSelectedIcon:null,dropdownMatchSelectWidth:!1,onSelect:P,onDeselect:P,disabled:i,dropdownAlign:h.type!=="minutes"&&h.type!=="hours"||f==="day"||f==="hour"?void 0:{points:["tr","br"]},"data-testid":"custom-select-".concat(h.type)},S))}function So(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.disabled,l=e.readOnly,m=e.leadingZero,p=e.clockFormat,i=e.period,s=e.periodicityOnDoubleClick,v=e.mode,u=y.useMemo(function(){var f;return J(((f={"react-js-cron-field":!0,"react-js-cron-hours":!0})["".concat(r,"-field")]=!!r,f["".concat(r,"-hours")]=!!r,f))},[r]);return n.jsxs("div",q({className:u},{children:[o.prefixHours!==""&&n.jsx("span",{children:o.prefixHours||C.prefixHours}),n.jsx(se,{placeholder:o.emptyHours||C.emptyHours,value:t,unit:oe[1],setValue:a,locale:o,className:r,disabled:c,readOnly:l,leadingZero:m,clockFormat:p,period:i,periodicityOnDoubleClick:s,mode:v})]}))}function Mo(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.disabled,l=e.readOnly,m=e.leadingZero,p=e.clockFormat,i=e.period,s=e.periodicityOnDoubleClick,v=e.mode,u=y.useMemo(function(){var f;return J(((f={"react-js-cron-field":!0,"react-js-cron-minutes":!0})["".concat(r,"-field")]=!!r,f["".concat(r,"-minutes")]=!!r,f))},[r]);return n.jsxs("div",q({className:u},{children:[i==="hour"?o.prefixMinutesForHourPeriod!==""&&n.jsx("span",{children:o.prefixMinutesForHourPeriod||C.prefixMinutesForHourPeriod}):o.prefixMinutes!==""&&n.jsx("span",{children:o.prefixMinutes||C.prefixMinutes}),n.jsx(se,{placeholder:i==="hour"?o.emptyMinutesForHourPeriod||C.emptyMinutesForHourPeriod:o.emptyMinutes||C.emptyMinutes,value:t,unit:oe[0],setValue:a,locale:o,className:r,disabled:c,readOnly:l,leadingZero:m,clockFormat:p,period:i,periodicityOnDoubleClick:s,mode:v}),i==="hour"&&o.suffixMinutesForHourPeriod!==""&&n.jsx("span",{children:o.suffixMinutesForHourPeriod||C.suffixMinutesForHourPeriod})]}))}function Do(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.weekDays,l=e.disabled,m=e.readOnly,p=e.leadingZero,i=e.period,s=e.periodicityOnDoubleClick,v=e.mode,u=!c||c.length===0,f=y.useMemo(function(){var x;return J(((x={"react-js-cron-field":!0,"react-js-cron-month-days":!0,"react-js-cron-month-days-placeholder":!u})["".concat(r,"-field")]=!!r,x["".concat(r,"-month-days")]=!!r,x))},[r,u]),h=JSON.stringify(o),d=y.useMemo(function(){return u?o.emptyMonthDays||C.emptyMonthDays:o.emptyMonthDaysShort||C.emptyMonthDaysShort},[u,h]);return!m||t&&t.length>0||(!t||t.length===0)&&(!c||c.length===0)?n.jsxs("div",q({className:f},{children:[o.prefixMonthDays!==""&&n.jsx("span",{children:o.prefixMonthDays||C.prefixMonthDays}),n.jsx(se,{placeholder:d,value:t,setValue:a,unit:oe[2],locale:o,className:r,disabled:l,readOnly:m,leadingZero:p,period:i,periodicityOnDoubleClick:s,mode:v})]})):null}function Ao(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.humanizeLabels,l=e.disabled,m=e.readOnly,p=e.period,i=e.periodicityOnDoubleClick,s=e.mode,v=o.months||C.months,u=y.useMemo(function(){var f;return J(((f={"react-js-cron-field":!0,"react-js-cron-months":!0})["".concat(r,"-field")]=!!r,f["".concat(r,"-months")]=!!r,f))},[r]);return n.jsxs("div",q({className:u},{children:[o.prefixMonths!==""&&n.jsx("span",{children:o.prefixMonths||C.prefixMonths}),n.jsx(se,{placeholder:o.emptyMonths||C.emptyMonths,optionsList:v,grid:!1,value:t,unit:q(q({},oe[3]),{alt:o.altMonths||C.altMonths}),setValue:a,locale:o,className:r,humanizeLabels:c,disabled:l,readOnly:m,period:p,periodicityOnDoubleClick:i,mode:s})]}))}function Bo(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.disabled,l=e.readOnly,m=e.shortcuts,p=e.allowedPeriods,i=[];p.includes("year")&&i.push({value:"year",label:o.yearOption||C.yearOption}),p.includes("month")&&i.push({value:"month",label:o.monthOption||C.monthOption}),p.includes("week")&&i.push({value:"week",label:o.weekOption||C.weekOption}),p.includes("day")&&i.push({value:"day",label:o.dayOption||C.dayOption}),p.includes("hour")&&i.push({value:"hour",label:o.hourOption||C.hourOption}),p.includes("minute")&&i.push({value:"minute",label:o.minuteOption||C.minuteOption}),p.includes("reboot")&&m&&(m===!0||m.includes("@reboot"))&&i.push({value:"reboot",label:o.rebootOption||C.rebootOption});var s=y.useCallback(function(h){l||a(h)},[a,l]),v=y.useMemo(function(){var h;return J(((h={"react-js-cron-field":!0,"react-js-cron-period":!0})["".concat(r,"-field")]=!!r,h["".concat(r,"-period")]=!!r,h))},[r]),u=y.useMemo(function(){var h;return J(((h={"react-js-cron-select":!0,"react-js-cron-select-no-prefix":o.prefixPeriod===""})["".concat(r,"-select")]=!!r,h))},[r,o.prefixPeriod]),f=y.useMemo(function(){var h;return J(((h={"react-js-cron-select-dropdown":!0,"react-js-cron-select-dropdown-period":!0})["".concat(r,"-select-dropdown")]=!!r,h["".concat(r,"-select-dropdown-period")]=!!r,h))},[r]);return n.jsxs("div",q({className:v},{children:[o.prefixPeriod!==""&&n.jsx("span",{children:o.prefixPeriod||C.prefixPeriod}),n.jsx(k.Select,{defaultValue:t,value:t,onChange:s,options:i,className:u,popupClassName:f,disabled:c,showArrow:!l,open:!l&&void 0,"data-testid":"select-period"},JSON.stringify(o))]}))}function No(e){var t=e.value,a=e.setValue,o=e.locale,r=e.className,c=e.humanizeLabels,l=e.monthDays,m=e.disabled,p=e.readOnly,i=e.period,s=e.periodicityOnDoubleClick,v=e.mode,u=o.weekDays||C.weekDays,f=i==="week"||!l||l.length===0,h=y.useMemo(function(){var B;return J(((B={"react-js-cron-field":!0,"react-js-cron-week-days":!0,"react-js-cron-week-days-placeholder":!f})["".concat(r,"-field")]=!!r,B["".concat(r,"-week-days")]=!!r,B))},[r,f]),d=JSON.stringify(o),x=y.useMemo(function(){return f?o.emptyWeekDays||C.emptyWeekDays:o.emptyWeekDaysShort||C.emptyWeekDaysShort},[f,d]),S=i==="week"||!p||t&&t.length>0||(!t||t.length===0)&&(!l||l.length===0),w=!p||l&&l.length>0||(!l||l.length===0)&&(!t||t.length===0);return S?n.jsxs("div",q({className:h},{children:[o.prefixWeekDays!==""&&(i==="week"||!w)&&n.jsx("span",{children:o.prefixWeekDays||C.prefixWeekDays}),o.prefixWeekDaysForMonthAndYearPeriod!==""&&i!=="week"&&w&&n.jsx("span",{children:o.prefixWeekDaysForMonthAndYearPeriod||C.prefixWeekDaysForMonthAndYearPeriod}),n.jsx(se,{placeholder:x,optionsList:u,grid:!1,value:t,unit:q(q({},oe[4]),{alt:o.altWeekDays||C.altWeekDays}),setValue:a,locale:o,className:r,humanizeLabels:c,disabled:m,readOnly:p,period:i,periodicityOnDoubleClick:s,mode:v})]})):null}function Fo(e){var t=e.clearButton,a=t===void 0||t,o=e.clearButtonProps,r=o===void 0?{}:o,c=e.clearButtonAction,l=c===void 0?"fill-with-every":c,m=e.locale,p=m===void 0?C:m,i=e.value,s=i===void 0?"":i,v=e.setValue,u=e.displayError,f=u===void 0||u,h=e.onError,d=e.className,x=e.defaultPeriod,S=x===void 0?"day":x,w=e.allowEmpty,B=w===void 0?"for-default-value":w,K=e.humanizeLabels,ee=K===void 0||K,U=e.humanizeValue,M=U!==void 0&&U,H=e.disabled,P=H!==void 0&&H,E=e.readOnly,N=E!==void 0&&E,Z=e.leadingZero,b=Z!==void 0&&Z,O=e.shortcuts,D=O===void 0?["@yearly","@annually","@monthly","@weekly","@daily","@midnight","@hourly"]:O,W=e.clockFormat,F=e.periodicityOnDoubleClick,T=F===void 0||F,L=e.mode,I=L===void 0?"multiple":L,ce=e.allowedDropdowns,_=ce===void 0?["period","months","month-days","week-days","hours","minutes"]:ce,ne=e.allowedPeriods,Uo=ne===void 0?["year","month","week","day","hour","minute","reboot"]:ne,re=y.useRef(s),Ae=y.useRef(S),Xe=y.useState(),X=Xe[0],he=Xe[1],Qe=y.useState(),ue=Qe[0],ve=Qe[1],Re=y.useState(),xe=Re[0],be=Re[1],eo=y.useState(),de=eo[0],ge=eo[1],oo=y.useState(),ke=oo[0],we=oo[1],to=y.useState(),Ce=to[0],Oe=to[1],no=y.useState(!1),Be=no[0],pe=no[1],ro=y.useState(!1),Se=ro[0],ao=ro[1],Wo=function(j){var G=y.useRef(j);return y.useEffect(function(){G.current=j},[j]),G.current}(Se),io=JSON.stringify(p);y.useEffect(function(){Ve(s,pe,h,B,re,!0,p,D,Oe,we,ve,be,ge,he)},[]),y.useEffect(function(){s!==re.current&&Ve(s,pe,h,B,re,!1,p,D,Oe,we,ve,be,ge,he)},[s,re,io,B,D]),y.useEffect(function(){if(!(X||Ce||xe||ue||de||ke)||Se||Wo)Se&&ao(!1);else{var j=X||Ae.current,G=qe(j,xe,ue,de,ke,Ce,M);v(G,{selectedPeriod:j}),re.current=G,h&&h(void 0),pe(!1)}},[X,ue,xe,de,ke,Ce,M,Se]);var lo=y.useCallback(function(){ve(void 0),be(void 0),ge(void 0),we(void 0),Oe(void 0);var j="",G=X!=="reboot"&&X?X:Ae.current;G!==X&&he(G),l==="fill-with-every"&&(j=qe(G,void 0,void 0,void 0,void 0,void 0)),v(j,{selectedPeriod:G}),re.current=j,ao(!0),B==="never"&&l==="empty"?(pe(!0),Ie(h,p)):(h&&h(void 0),pe(!1))},[X,v,h,l]),zo=y.useMemo(function(){var j;return J(((j={"react-js-cron":!0,"react-js-cron-error":Be&&f,"react-js-cron-disabled":P,"react-js-cron-read-only":N})["".concat(d)]=!!d,j["".concat(d,"-error")]=Be&&f&&!!d,j["".concat(d,"-disabled")]=P&&!!d,j["".concat(d,"-read-only")]=N&&!!d,j))},[d,Be,f,P,N]),Ne=r.className,so=je(r,["className"]),co=y.useMemo(function(){var j;return J(((j={"react-js-cron-clear-button":!0})["".concat(d,"-clear-button")]=!!d,j["".concat(Ne)]=!!Ne,j))},[d,Ne]),Jo=JSON.stringify(so),uo=y.useMemo(function(){return a&&!N?n.jsx(k.Button,q({className:co,danger:!0,type:"primary",disabled:P},so,{onClick:lo},{children:p.clearButtonText||C.clearButtonText})):null},[a,N,io,co,P,Jo,lo]),V=X||Ae.current;return n.jsxs("div",q({className:zo},{children:[_.includes("period")&&n.jsx(Bo,{value:V,setValue:he,locale:p,className:d,disabled:P,readOnly:N,shortcuts:D,allowedPeriods:Uo}),V==="reboot"?uo:n.jsxs(n.Fragment,{children:[V==="year"&&_.includes("months")&&n.jsx(Ao,{value:xe,setValue:be,locale:p,className:d,humanizeLabels:ee,disabled:P,readOnly:N,period:V,periodicityOnDoubleClick:T,mode:I}),(V==="year"||V==="month")&&_.includes("month-days")&&n.jsx(Do,{value:ue,setValue:ve,locale:p,className:d,weekDays:de,disabled:P,readOnly:N,leadingZero:b,period:V,periodicityOnDoubleClick:T,mode:I}),(V==="year"||V==="month"||V==="week")&&_.includes("week-days")&&n.jsx(No,{value:de,setValue:ge,locale:p,className:d,humanizeLabels:ee,monthDays:ue,disabled:P,readOnly:N,period:V,periodicityOnDoubleClick:T,mode:I}),n.jsxs("div",{children:[V!=="minute"&&V!=="hour"&&_.includes("hours")&&n.jsx(So,{value:ke,setValue:we,locale:p,className:d,disabled:P,readOnly:N,leadingZero:b,clockFormat:W,period:V,periodicityOnDoubleClick:T,mode:I}),V!=="minute"&&_.includes("minutes")&&n.jsx(Mo,{value:Ce,setValue:Oe,locale:p,period:V,className:d,disabled:P,readOnly:N,leadingZero:b,clockFormat:W,periodicityOnDoubleClick:T,mode:I}),uo]})]})]}))}const Po={"zh-CN":{everyText:"每",emptyMonths:"每月",emptyMonthDays:"每日(月)",emptyMonthDaysShort:"每日",emptyWeekDays:"每天(周)",emptyWeekDaysShort:"每天(周)",emptyHours:"每小时",emptyMinutes:"每分钟",emptyMinutesForHourPeriod:"每",yearOption:"年",monthOption:"月",weekOption:"周",dayOption:"天",hourOption:"小时",minuteOption:"分钟",rebootOption:"重启",prefixPeriod:"每",prefixMonths:"的",prefixMonthDays:"的",prefixWeekDays:"的",prefixWeekDaysForMonthAndYearPeriod:"或者",prefixHours:"的",prefixMinutes:":",prefixMinutesForHourPeriod:"的",suffixMinutesForHourPeriod:"分钟",errorInvalidCron:"不符合 cron 规则的表达式",clearButtonText:"清空",weekDays:["周日","周一","周二","周三","周四","周五","周六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],altWeekDays:["周日","周一","周二","周三","周四","周五","周六"],altMonths:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]}},_e=[{value:"none",text:"No repeat"},{value:6e4,text:"By minute",unitText:"Minutes"},{value:36e5,text:"By hour",unitText:"Hours"},{value:864e5,text:"By day",unitText:"Days"},{value:6048e5,text:"By week",unitText:"Weeks"},{value:"cron",text:"Advanced"}];function Ge(e){return _e.filter(a=>!isNaN(+a.value)).reverse().find(a=>!(e%a.value))}function To(e){if(!e)return"none";if(e&&!isNaN(+e)){const t=Ge(e);return t?t.value:"none"}if(typeof e=="string")return"cron"}function jo({value:e,onChange:t}){const{t:a}=R(),o=Ge(e);return n.jsx(k.InputNumber,{value:e/o.value,onChange:r=>t(r*o.value),min:1,addonBefore:a("Every"),addonAfter:a(o.unitText),className:"auto-width"})}function Eo({value:e=null,onChange:t}){const{t:a}=R(),o=To(e),r=y.useCallback(l=>{if(l==="none"){t(null);return}if(l==="cron"){t("0 * * * * *");return}t(l)},[t]),c=Po[localStorage.getItem("TACHYBASE_LOCALE")||"en-US"];return n.jsxs("fieldset",{className:g.css`
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: ${o==="cron"?"column":"row"};
|
|
4
4
|
align-items: flex-start;
|
package/dist/externalVersion.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
module.exports = {
|
|
2
2
|
"react": "18.3.1",
|
|
3
|
-
"@tachybase/client": "1.3.
|
|
4
|
-
"@
|
|
5
|
-
"@
|
|
3
|
+
"@tachybase/client": "1.3.23",
|
|
4
|
+
"@ant-design/icons": "5.6.1",
|
|
5
|
+
"@tego/client": "1.3.43",
|
|
6
6
|
"antd": "5.22.5",
|
|
7
|
-
"@
|
|
8
|
-
"@tachybase/utils": "1.3.21",
|
|
9
|
-
"@tachybase/database": "1.3.21",
|
|
7
|
+
"@tego/server": "1.3.43",
|
|
10
8
|
"dayjs": "1.11.13",
|
|
11
9
|
"lodash": "4.17.21",
|
|
12
|
-
"@tachybase/schema": "1.3.
|
|
13
|
-
"react-i18next": "15.2.0"
|
|
14
|
-
"@tachybase/actions": "1.3.21"
|
|
10
|
+
"@tachybase/schema": "1.3.43",
|
|
11
|
+
"react-i18next": "15.2.0"
|
|
15
12
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@hapi/topo","description":"Topological sorting with grouping support","version":"6.0.2","repository":"git://github.com/hapijs/topo","main":"lib/index.js","types":"lib/index.d.ts","files":["lib"],"keywords":["topological","sort","toposort","topsort"],"eslintConfig":{"extends":["plugin:@hapi/module"]},"dependencies":{"@hapi/hoek":"^11.0.2"},"devDependencies":{"@hapi/code":"^9.0.3","@hapi/eslint-plugin":"*","@hapi/lab":"^25.1.2","@types/node":"^17.0.31","typescript":"~4.6.4"},"scripts":{"test":"lab -a @hapi/code -t 100 -L -Y","test-cov-html":"lab -a @hapi/code -t 100 -L -r html -o coverage.html"},"license":"BSD-3-Clause","_lastModified":"2025-
|
|
1
|
+
{"name":"@hapi/topo","description":"Topological sorting with grouping support","version":"6.0.2","repository":"git://github.com/hapijs/topo","main":"lib/index.js","types":"lib/index.d.ts","files":["lib"],"keywords":["topological","sort","toposort","topsort"],"eslintConfig":{"extends":["plugin:@hapi/module"]},"dependencies":{"@hapi/hoek":"^11.0.2"},"devDependencies":{"@hapi/code":"^9.0.3","@hapi/eslint-plugin":"*","@hapi/lab":"^25.1.2","@types/node":"^17.0.31","typescript":"~4.6.4"},"scripts":{"test":"lab -a @hapi/code -t 100 -L -Y","test-cov-html":"lab -a @hapi/code -t 100 -L -r html -o coverage.html"},"license":"BSD-3-Clause","_lastModified":"2025-08-02T21:25:14.906Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"archiver","version":"5.3.2","description":"a streaming interface for archive generation","homepage":"https://github.com/archiverjs/node-archiver","author":{"name":"Chris Talkington","url":"http://christalkington.com/"},"repository":{"type":"git","url":"https://github.com/archiverjs/node-archiver.git"},"bugs":{"url":"https://github.com/archiverjs/node-archiver/issues"},"license":"MIT","main":"index.js","files":["index.js","lib"],"engines":{"node":">= 10"},"scripts":{"test":"mocha --reporter dot","bench":"node benchmark/simple/pack-zip.js"},"dependencies":{"archiver-utils":"^2.1.0","async":"^3.2.4","buffer-crc32":"^0.2.1","readable-stream":"^3.6.0","readdir-glob":"^1.1.2","tar-stream":"^2.2.0","zip-stream":"^4.1.0"},"devDependencies":{"archiver-jsdoc-theme":"^1.1.3","chai":"^4.3.7","jsdoc":"^3.6.4","mkdirp":"^2.1.5","mocha":"^9.0.2","rimraf":"^4.3.1","stream-bench":"^0.1.2","tar":"^6.1.13","yauzl":"^2.9.0"},"keywords":["archive","archiver","stream","zip","tar"],"publishConfig":{"registry":"https://registry.npmjs.org/"},"_lastModified":"2025-
|
|
1
|
+
{"name":"archiver","version":"5.3.2","description":"a streaming interface for archive generation","homepage":"https://github.com/archiverjs/node-archiver","author":{"name":"Chris Talkington","url":"http://christalkington.com/"},"repository":{"type":"git","url":"https://github.com/archiverjs/node-archiver.git"},"bugs":{"url":"https://github.com/archiverjs/node-archiver/issues"},"license":"MIT","main":"index.js","files":["index.js","lib"],"engines":{"node":">= 10"},"scripts":{"test":"mocha --reporter dot","bench":"node benchmark/simple/pack-zip.js"},"dependencies":{"archiver-utils":"^2.1.0","async":"^3.2.4","buffer-crc32":"^0.2.1","readable-stream":"^3.6.0","readdir-glob":"^1.1.2","tar-stream":"^2.2.0","zip-stream":"^4.1.0"},"devDependencies":{"archiver-jsdoc-theme":"^1.1.3","chai":"^4.3.7","jsdoc":"^3.6.4","mkdirp":"^2.1.5","mocha":"^9.0.2","rimraf":"^4.3.1","stream-bench":"^0.1.2","tar":"^6.1.13","yauzl":"^2.9.0"},"keywords":["archive","archiver","stream","zip","tar"],"publishConfig":{"registry":"https://registry.npmjs.org/"},"_lastModified":"2025-08-02T21:25:14.740Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"cron-parser","version":"4.9.0","description":"Node.js library for parsing crontab instructions","main":"lib/parser.js","types":"types/index.d.ts","typesVersions":{"<4.1":{"*":["types/ts3/*"]}},"directories":{"test":"test"},"scripts":{"test:tsd":"tsd","test:unit":"TZ=UTC tap ./test/*.js","test:cover":"TZ=UTC tap --coverage-report=html ./test/*.js","lint":"eslint .","lint:fix":"eslint --fix .","test":"npm run lint && npm run test:unit && npm run test:tsd"},"repository":{"type":"git","url":"https://github.com/harrisiirak/cron-parser.git"},"keywords":["cron","crontab","parser"],"author":"Harri Siirak","contributors":["Nicholas Clawson","Daniel Prentis <daniel@salsitasoft.com>","Renault John Lecoultre","Richard Astbury <richard.astbury@gmail.com>","Meaglin Wasabi <Meaglin.wasabi@gmail.com>","Mike Kusold <hello@mikekusold.com>","Alex Kit <alex.kit@atmajs.com>","Santiago Gimeno <santiago.gimeno@gmail.com>","Daniel <darc.tec@gmail.com>","Christian Steininger <christian.steininger.cs@gmail.com>","Mykola Piskovyi <m.piskovyi@gmail.com>","Brian Vaughn <brian.david.vaughn@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Yasuhiroki <yasuhiroki.duck@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Brendan Warkentin <faazshift@gmail.com>","Charlie Fish <fishcharlie.code@gmail.com>","Ian Graves <ian+diskimage@iangrav.es>","Andy Thompson <me@andytson.com>","Regev Brody <regevbr@gmail.com>"],"license":"MIT","dependencies":{"luxon":"^3.2.1"},"devDependencies":{"eslint":"^8.27.0","sinon":"^15.0.1","tap":"^16.3.3","tsd":"^0.26.0"},"engines":{"node":">=12.0.0"},"browser":{"fs":false},"tap":{"check-coverage":false},"tsd":{"directory":"test","compilerOptions":{"lib":["es2017","dom"]}},"files":["lib","types","LICENSE","README.md"],"_lastModified":"2025-
|
|
1
|
+
{"name":"cron-parser","version":"4.9.0","description":"Node.js library for parsing crontab instructions","main":"lib/parser.js","types":"types/index.d.ts","typesVersions":{"<4.1":{"*":["types/ts3/*"]}},"directories":{"test":"test"},"scripts":{"test:tsd":"tsd","test:unit":"TZ=UTC tap ./test/*.js","test:cover":"TZ=UTC tap --coverage-report=html ./test/*.js","lint":"eslint .","lint:fix":"eslint --fix .","test":"npm run lint && npm run test:unit && npm run test:tsd"},"repository":{"type":"git","url":"https://github.com/harrisiirak/cron-parser.git"},"keywords":["cron","crontab","parser"],"author":"Harri Siirak","contributors":["Nicholas Clawson","Daniel Prentis <daniel@salsitasoft.com>","Renault John Lecoultre","Richard Astbury <richard.astbury@gmail.com>","Meaglin Wasabi <Meaglin.wasabi@gmail.com>","Mike Kusold <hello@mikekusold.com>","Alex Kit <alex.kit@atmajs.com>","Santiago Gimeno <santiago.gimeno@gmail.com>","Daniel <darc.tec@gmail.com>","Christian Steininger <christian.steininger.cs@gmail.com>","Mykola Piskovyi <m.piskovyi@gmail.com>","Brian Vaughn <brian.david.vaughn@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Yasuhiroki <yasuhiroki.duck@gmail.com>","Nicholas Clawson <nickclaw@gmail.com>","Brendan Warkentin <faazshift@gmail.com>","Charlie Fish <fishcharlie.code@gmail.com>","Ian Graves <ian+diskimage@iangrav.es>","Andy Thompson <me@andytson.com>","Regev Brody <regevbr@gmail.com>"],"license":"MIT","dependencies":{"luxon":"^3.2.1"},"devDependencies":{"eslint":"^8.27.0","sinon":"^15.0.1","tap":"^16.3.3","tsd":"^0.26.0"},"engines":{"node":">=12.0.0"},"browser":{"fs":false},"tap":{"check-coverage":false},"tsd":{"directory":"test","compilerOptions":{"lib":["es2017","dom"]}},"files":["lib","types","LICENSE","README.md"],"_lastModified":"2025-08-02T21:25:15.764Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"mkdirp","description":"Recursively mkdir, like `mkdir -p`","version":"1.0.4","main":"index.js","keywords":["mkdir","directory","make dir","make","dir","recursive","native"],"repository":{"type":"git","url":"https://github.com/isaacs/node-mkdirp.git"},"scripts":{"test":"tap","snap":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags"},"tap":{"check-coverage":true,"coverage-map":"map.js"},"devDependencies":{"require-inject":"^1.4.4","tap":"^14.10.7"},"bin":"bin/cmd.js","license":"MIT","engines":{"node":">=10"},"files":["bin","lib","index.js"],"_lastModified":"2025-
|
|
1
|
+
{"name":"mkdirp","description":"Recursively mkdir, like `mkdir -p`","version":"1.0.4","main":"index.js","keywords":["mkdir","directory","make dir","make","dir","recursive","native"],"repository":{"type":"git","url":"https://github.com/isaacs/node-mkdirp.git"},"scripts":{"test":"tap","snap":"tap","preversion":"npm test","postversion":"npm publish","postpublish":"git push origin --follow-tags"},"tap":{"check-coverage":true,"coverage-map":"map.js"},"devDependencies":{"require-inject":"^1.4.4","tap":"^14.10.7"},"bin":"bin/cmd.js","license":"MIT","engines":{"node":">=10"},"files":["bin","lib","index.js"],"_lastModified":"2025-08-02T21:25:14.794Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"semver","version":"7.7.2","description":"The semantic version parser used by npm.","main":"index.js","scripts":{"test":"tap","snap":"tap","lint":"npm run eslint","postlint":"template-oss-check","lintfix":"npm run eslint -- --fix","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force","eslint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""},"devDependencies":{"@npmcli/eslint-config":"^5.0.0","@npmcli/template-oss":"4.24.3","benchmark":"^2.1.4","tap":"^16.0.0"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/npm/node-semver.git"},"bin":{"semver":"bin/semver.js"},"files":["bin/","lib/","classes/","functions/","internal/","ranges/","index.js","preload.js","range.bnf"],"tap":{"timeout":30,"coverage-map":"map.js","nyc-arg":["--exclude","tap-snapshots/**"]},"engines":{"node":">=10"},"author":"GitHub Inc.","templateOSS":{"//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten.","version":"4.24.3","engines":">=10","distPaths":["classes/","functions/","internal/","ranges/","index.js","preload.js","range.bnf"],"allowPaths":["/classes/","/functions/","/internal/","/ranges/","/index.js","/preload.js","/range.bnf","/benchmarks"],"publish":"true"},"_lastModified":"2025-
|
|
1
|
+
{"name":"semver","version":"7.7.2","description":"The semantic version parser used by npm.","main":"index.js","scripts":{"test":"tap","snap":"tap","lint":"npm run eslint","postlint":"template-oss-check","lintfix":"npm run eslint -- --fix","posttest":"npm run lint","template-oss-apply":"template-oss-apply --force","eslint":"eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""},"devDependencies":{"@npmcli/eslint-config":"^5.0.0","@npmcli/template-oss":"4.24.3","benchmark":"^2.1.4","tap":"^16.0.0"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/npm/node-semver.git"},"bin":{"semver":"bin/semver.js"},"files":["bin/","lib/","classes/","functions/","internal/","ranges/","index.js","preload.js","range.bnf"],"tap":{"timeout":30,"coverage-map":"map.js","nyc-arg":["--exclude","tap-snapshots/**"]},"engines":{"node":">=10"},"author":"GitHub Inc.","templateOSS":{"//@npmcli/template-oss":"This file is partially managed by @npmcli/template-oss. Edits may be overwritten.","version":"4.24.3","engines":">=10","distPaths":["classes/","functions/","internal/","ranges/","index.js","preload.js","range.bnf"],"allowPaths":["/classes/","/functions/","/internal/","/ranges/","/index.js","/preload.js","/range.bnf","/benchmarks"],"publish":"true"},"_lastModified":"2025-08-02T21:25:15.160Z"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"yauzl","version":"3.2.0","description":"yet another unzip library for node","engines":{"node":">=12"},"main":"index.js","scripts":{"test":"node test/test.js"},"repository":{"type":"git","url":"git+https://github.com/thejoshwolfe/yauzl.git"},"keywords":["unzip","zip","stream","archive","file"],"author":"Josh Wolfe <thejoshwolfe@gmail.com>","license":"MIT","bugs":{"url":"https://github.com/thejoshwolfe/yauzl/issues"},"homepage":"https://github.com/thejoshwolfe/yauzl","dependencies":{"buffer-crc32":"~0.2.3","pend":"~1.2.0"},"devDependencies":{"bl":"^6.0.11"},"files":["fd-slicer.js","index.js"],"_lastModified":"2025-
|
|
1
|
+
{"name":"yauzl","version":"3.2.0","description":"yet another unzip library for node","engines":{"node":">=12"},"main":"index.js","scripts":{"test":"node test/test.js"},"repository":{"type":"git","url":"git+https://github.com/thejoshwolfe/yauzl.git"},"keywords":["unzip","zip","stream","archive","file"],"author":"Josh Wolfe <thejoshwolfe@gmail.com>","license":"MIT","bugs":{"url":"https://github.com/thejoshwolfe/yauzl/issues"},"homepage":"https://github.com/thejoshwolfe/yauzl","dependencies":{"buffer-crc32":"~0.2.3","pend":"~1.2.0"},"devDependencies":{"bl":"^6.0.11"},"files":["fd-slicer.js","index.js"],"_lastModified":"2025-08-02T21:25:15.332Z"}
|
|
@@ -30,20 +30,20 @@ __export(app_migrator_exports, {
|
|
|
30
30
|
AppMigrator: () => AppMigrator
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(app_migrator_exports);
|
|
33
|
-
var
|
|
34
|
-
var
|
|
35
|
-
var import_promises = __toESM(require("fs/promises"));
|
|
36
|
-
var os = __toESM(require("os"));
|
|
37
|
-
var
|
|
38
|
-
var
|
|
39
|
-
class AppMigrator extends
|
|
33
|
+
var import_node_crypto = __toESM(require("node:crypto"));
|
|
34
|
+
var import_node_events = __toESM(require("node:events"));
|
|
35
|
+
var import_promises = __toESM(require("node:fs/promises"));
|
|
36
|
+
var os = __toESM(require("node:os"));
|
|
37
|
+
var import_node_path = __toESM(require("node:path"));
|
|
38
|
+
var import_server = require("@tego/server");
|
|
39
|
+
class AppMigrator extends import_node_events.default {
|
|
40
40
|
constructor(app, options) {
|
|
41
41
|
super();
|
|
42
42
|
this.app = app;
|
|
43
43
|
this.workDir = (options == null ? void 0 : options.workDir) || this.tmpDir();
|
|
44
44
|
}
|
|
45
45
|
tmpDir() {
|
|
46
|
-
return
|
|
46
|
+
return import_node_path.default.resolve(os.tmpdir(), `tachybase-${import_node_crypto.default.randomUUID()}`);
|
|
47
47
|
}
|
|
48
48
|
async rmDir(dir) {
|
|
49
49
|
await import_promises.default.rm(dir, { recursive: true, force: true });
|
|
@@ -52,7 +52,7 @@ class AppMigrator extends import_events.default {
|
|
|
52
52
|
await this.rmDir(this.workDir);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
(0,
|
|
55
|
+
(0, import_server.applyMixins)(AppMigrator, [import_server.AsyncEmitter]);
|
|
56
56
|
// Annotate the CommonJS export names for ESM import in node:
|
|
57
57
|
0 && (module.exports = {
|
|
58
58
|
AppMigrator
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { CollectionOptions } from '@
|
|
1
|
+
import { CollectionOptions } from '@tego/server';
|
|
2
2
|
export default function (): CollectionOptions;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Application } from '@
|
|
1
|
+
import { Application } from '@tego/server';
|
|
2
2
|
export default function addBackupCommand(app: Application): void;
|
|
@@ -30,8 +30,8 @@ __export(backup_command_exports, {
|
|
|
30
30
|
default: () => addBackupCommand
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(backup_command_exports);
|
|
33
|
-
var import_promises = __toESM(require("fs/promises"));
|
|
34
|
-
var import_server = require("@
|
|
33
|
+
var import_promises = __toESM(require("node:fs/promises"));
|
|
34
|
+
var import_server = require("@tego/server");
|
|
35
35
|
var import_dumper = require("../dumper");
|
|
36
36
|
function addBackupCommand(app) {
|
|
37
37
|
app.command("backup").ipc().option("-a, --app <appName>", "sub app name if you want to backup").option(
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Application } from '@
|
|
1
|
+
import { Application } from '@tego/server';
|
|
2
2
|
export default function addRestoreCommand(app: Application): void;
|
|
@@ -20,7 +20,7 @@ __export(restore_command_exports, {
|
|
|
20
20
|
default: () => addRestoreCommand
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(restore_command_exports);
|
|
23
|
-
var import_server = require("@
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
24
|
var import_restorer = require("../restorer");
|
|
25
25
|
function addRestoreCommand(app) {
|
|
26
26
|
app.command("restore").ipc().argument("<string>", "restore file path").option("-a, --app <appName>", "sub app name if you want to restore into a sub app").option("-f, --force", "force restore").option(
|
package/dist/server/dumper.d.ts
CHANGED
package/dist/server/dumper.js
CHANGED
|
@@ -30,13 +30,13 @@ __export(dumper_exports, {
|
|
|
30
30
|
Dumper: () => Dumper
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(dumper_exports);
|
|
33
|
-
var
|
|
34
|
-
var import_promises = __toESM(require("fs/promises"));
|
|
35
|
-
var
|
|
36
|
-
var process = __toESM(require("process"));
|
|
37
|
-
var
|
|
38
|
-
var
|
|
39
|
-
var
|
|
33
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
34
|
+
var import_promises = __toESM(require("node:fs/promises"));
|
|
35
|
+
var import_node_path = __toESM(require("node:path"));
|
|
36
|
+
var process = __toESM(require("node:process"));
|
|
37
|
+
var import_node_stream = __toESM(require("node:stream"));
|
|
38
|
+
var import_node_util = __toESM(require("node:util"));
|
|
39
|
+
var import_server = require("@tego/server");
|
|
40
40
|
var import_archiver = __toESM(require("archiver"));
|
|
41
41
|
var import_dayjs = __toESM(require("dayjs"));
|
|
42
42
|
var import_lodash = __toESM(require("lodash"));
|
|
@@ -44,7 +44,7 @@ var import_mkdirp = __toESM(require("mkdirp"));
|
|
|
44
44
|
var import_app_migrator = require("./app-migrator");
|
|
45
45
|
var import_field_value_writer = require("./field-value-writer");
|
|
46
46
|
var import_utils = require("./utils");
|
|
47
|
-
const finished =
|
|
47
|
+
const finished = import_node_util.default.promisify(import_node_stream.default.finished);
|
|
48
48
|
const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
49
49
|
constructor() {
|
|
50
50
|
super(...arguments);
|
|
@@ -56,8 +56,8 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
56
56
|
}
|
|
57
57
|
static async getFileStatus(filePath) {
|
|
58
58
|
const lockFile = filePath + ".lock";
|
|
59
|
-
const fileName =
|
|
60
|
-
return
|
|
59
|
+
const fileName = import_node_path.default.basename(filePath);
|
|
60
|
+
return import_node_fs.default.promises.stat(lockFile).then((lockFileStat) => {
|
|
61
61
|
if (lockFileStat.isFile()) {
|
|
62
62
|
if (lockFileStat.ctime.getTime() < Date.now() - 2 * 60 * 60 * 1e3) {
|
|
63
63
|
return {
|
|
@@ -77,7 +77,7 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
77
77
|
}
|
|
78
78
|
}).catch((error) => {
|
|
79
79
|
if (error.code === "ENOENT") {
|
|
80
|
-
return
|
|
80
|
+
return import_node_fs.default.promises.stat(filePath).then((backupFileStat) => {
|
|
81
81
|
if (backupFileStat.isFile()) {
|
|
82
82
|
return {
|
|
83
83
|
name: fileName,
|
|
@@ -112,7 +112,7 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
112
112
|
return (await Promise.all(
|
|
113
113
|
[...this.app.db.collections.values()].map(async (c) => {
|
|
114
114
|
try {
|
|
115
|
-
const dumpRules =
|
|
115
|
+
const dumpRules = import_server.CollectionGroupManager.unifyDumpRules(c.options.dumpRules);
|
|
116
116
|
const options = {
|
|
117
117
|
name: c.name,
|
|
118
118
|
title: c.options.title || c.name,
|
|
@@ -143,9 +143,9 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
143
143
|
}
|
|
144
144
|
backUpStorageDir(appName) {
|
|
145
145
|
if (appName && appName !== "main") {
|
|
146
|
-
return
|
|
146
|
+
return import_node_path.default.resolve(process.cwd(), "storage", "backups", appName);
|
|
147
147
|
}
|
|
148
|
-
return
|
|
148
|
+
return import_node_path.default.resolve(process.cwd(), "storage", "backups");
|
|
149
149
|
}
|
|
150
150
|
async allBackUpFilePaths(options) {
|
|
151
151
|
const dirname = (options == null ? void 0 : options.dir) || this.backUpStorageDir(options == null ? void 0 : options.appName);
|
|
@@ -153,15 +153,15 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
153
153
|
try {
|
|
154
154
|
const files = await import_promises.default.readdir(dirname);
|
|
155
155
|
const lockFilesSet = new Set(
|
|
156
|
-
files.filter((file) =>
|
|
156
|
+
files.filter((file) => import_node_path.default.extname(file) === ".lock").map((file) => import_node_path.default.basename(file, ".lock"))
|
|
157
157
|
);
|
|
158
158
|
const filteredFiles = files.filter((file) => {
|
|
159
|
-
const baseName =
|
|
160
|
-
const isLockFile =
|
|
161
|
-
const isDumpFile =
|
|
159
|
+
const baseName = import_node_path.default.basename(file);
|
|
160
|
+
const isLockFile = import_node_path.default.extname(file) === ".lock";
|
|
161
|
+
const isDumpFile = import_node_path.default.extname(file) === `.${import_utils.DUMPED_EXTENSION}`;
|
|
162
162
|
return includeInProgress && isLockFile || isDumpFile && !lockFilesSet.has(baseName);
|
|
163
163
|
}).map(async (file) => {
|
|
164
|
-
const filePath =
|
|
164
|
+
const filePath = import_node_path.default.resolve(dirname, file);
|
|
165
165
|
const stats = await import_promises.default.stat(filePath);
|
|
166
166
|
return { filePath, birthtime: stats.birthtime.getTime() };
|
|
167
167
|
});
|
|
@@ -177,12 +177,12 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
177
177
|
}
|
|
178
178
|
backUpFilePath(fileName, appName) {
|
|
179
179
|
const dirname = this.backUpStorageDir(appName);
|
|
180
|
-
return
|
|
180
|
+
return import_node_path.default.resolve(dirname, fileName);
|
|
181
181
|
}
|
|
182
182
|
lockFilePath(fileName, appName) {
|
|
183
183
|
const lockFile = fileName + ".lock";
|
|
184
184
|
const dirname = this.backUpStorageDir(appName);
|
|
185
|
-
return
|
|
185
|
+
return import_node_path.default.resolve(dirname, lockFile);
|
|
186
186
|
}
|
|
187
187
|
async writeLockFile(fileName, appName) {
|
|
188
188
|
const dirname = this.backUpStorageDir(appName);
|
|
@@ -246,7 +246,7 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
248
|
if (this.hasSqlContent()) {
|
|
249
|
-
const dbDumpPath =
|
|
249
|
+
const dbDumpPath = import_node_path.default.resolve(this.workDir, "sql-content.json");
|
|
250
250
|
await import_promises.default.writeFile(
|
|
251
251
|
dbDumpPath,
|
|
252
252
|
JSON.stringify(
|
|
@@ -263,7 +263,7 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
263
263
|
return Object.keys(this.sqlContent).length > 0;
|
|
264
264
|
}
|
|
265
265
|
async dumpMeta(additionalMeta = {}) {
|
|
266
|
-
const metaPath =
|
|
266
|
+
const metaPath = import_node_path.default.resolve(this.workDir, "meta");
|
|
267
267
|
const metaObj = {
|
|
268
268
|
version: await this.app.version.get(),
|
|
269
269
|
dialect: this.app.db.sequelize.getDialect(),
|
|
@@ -302,11 +302,11 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
302
302
|
}
|
|
303
303
|
const attributes = collection.model.tableAttributes;
|
|
304
304
|
const columns = [...new Set(import_lodash.default.map(attributes, "field"))];
|
|
305
|
-
const collectionDataDir =
|
|
305
|
+
const collectionDataDir = import_node_path.default.resolve(dir, "collections", collectionName);
|
|
306
306
|
await import_promises.default.mkdir(collectionDataDir, { recursive: true });
|
|
307
307
|
let count = 0;
|
|
308
|
-
const dataFilePath =
|
|
309
|
-
const dataStream =
|
|
308
|
+
const dataFilePath = import_node_path.default.resolve(collectionDataDir, "data");
|
|
309
|
+
const dataStream = import_node_fs.default.createWriteStream(dataFilePath);
|
|
310
310
|
const rows = await app.db.sequelize.query(
|
|
311
311
|
(0, import_utils.sqlAdapter)(app.db, `SELECT * FROM ${collection.isParent() ? "ONLY" : ""} ${collection.quotedTableName()}`),
|
|
312
312
|
{ type: "SELECT" }
|
|
@@ -374,13 +374,13 @@ const _Dumper = class _Dumper extends import_app_migrator.AppMigrator {
|
|
|
374
374
|
fieldName: autoIncrAttr
|
|
375
375
|
};
|
|
376
376
|
}
|
|
377
|
-
await import_promises.default.writeFile(
|
|
377
|
+
await import_promises.default.writeFile(import_node_path.default.resolve(collectionDataDir, "meta"), JSON.stringify(meta), "utf8");
|
|
378
378
|
}
|
|
379
379
|
async packDumpedDir(fileName, appName) {
|
|
380
380
|
const dirname = this.backUpStorageDir(appName);
|
|
381
381
|
await (0, import_mkdirp.default)(dirname);
|
|
382
|
-
const filePath =
|
|
383
|
-
const output =
|
|
382
|
+
const filePath = import_node_path.default.resolve(dirname, fileName);
|
|
383
|
+
const output = import_node_fs.default.createWriteStream(filePath);
|
|
384
384
|
const archive = (0, import_archiver.default)("zip", {
|
|
385
385
|
zlib: { level: 9 }
|
|
386
386
|
});
|
|
@@ -30,7 +30,7 @@ __export(field_value_writer_exports, {
|
|
|
30
30
|
FieldValueWriter: () => FieldValueWriter
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(field_value_writer_exports);
|
|
33
|
-
var
|
|
33
|
+
var import_server = require("@tego/server");
|
|
34
34
|
var import_lodash = __toESM(require("lodash"));
|
|
35
35
|
const getMapFieldWriter = (field) => {
|
|
36
36
|
return (val) => {
|
|
@@ -46,7 +46,7 @@ const getMapFieldWriter = (field) => {
|
|
|
46
46
|
const _FieldValueWriter = class _FieldValueWriter {
|
|
47
47
|
static write(field, val) {
|
|
48
48
|
if (val === null) return val;
|
|
49
|
-
if (field.type
|
|
49
|
+
if (field.type === "point" || field.type === "lineString" || field.type === "circle" || field.type === "polygon") {
|
|
50
50
|
return getMapFieldWriter(field)(import_lodash.default.isString(val) ? JSON.parse(val) : val);
|
|
51
51
|
}
|
|
52
52
|
const fieldType = field.typeToString();
|
|
@@ -58,7 +58,7 @@ const _FieldValueWriter = class _FieldValueWriter {
|
|
|
58
58
|
}
|
|
59
59
|
static toDumpedValue(field, val) {
|
|
60
60
|
if (val === null) return val;
|
|
61
|
-
if (field.type
|
|
61
|
+
if (field.type === "point" || field.type === "lineString" || field.type === "circle" || field.type === "polygon") {
|
|
62
62
|
const mockObj = {
|
|
63
63
|
getDataValue: () => val
|
|
64
64
|
};
|
|
@@ -83,7 +83,7 @@ function isJSONObjectOrArrayString(str) {
|
|
|
83
83
|
return false;
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
FieldValueWriter.registerWriter([
|
|
86
|
+
FieldValueWriter.registerWriter([import_server.DataTypes.JSON.toString(), import_server.DataTypes.JSONB.toString()], (val) => {
|
|
87
87
|
try {
|
|
88
88
|
return isJSONObjectOrArrayString(val) ? JSON.parse(val) : val;
|
|
89
89
|
} catch (err) {
|
|
@@ -93,7 +93,7 @@ FieldValueWriter.registerWriter([import_database.DataTypes.JSON.toString(), impo
|
|
|
93
93
|
throw err;
|
|
94
94
|
}
|
|
95
95
|
});
|
|
96
|
-
FieldValueWriter.registerWriter(
|
|
96
|
+
FieldValueWriter.registerWriter(import_server.DataTypes.BOOLEAN.toString(), (val) => Boolean(val));
|
|
97
97
|
// Annotate the CommonJS export names for ESM import in node:
|
|
98
98
|
0 && (module.exports = {
|
|
99
99
|
FieldValueWriter
|
|
@@ -20,8 +20,8 @@ __export(AutoBackupModel_exports, {
|
|
|
20
20
|
AutoBackupModel: () => AutoBackupModel
|
|
21
21
|
});
|
|
22
22
|
module.exports = __toCommonJS(AutoBackupModel_exports);
|
|
23
|
-
var
|
|
24
|
-
class AutoBackupModel extends
|
|
23
|
+
var import_server = require("@tego/server");
|
|
24
|
+
class AutoBackupModel extends import_server.Model {
|
|
25
25
|
}
|
|
26
26
|
// Annotate the CommonJS export names for ESM import in node:
|
|
27
27
|
0 && (module.exports = {
|
|
@@ -34,8 +34,7 @@ var import_node_fs = __toESM(require("node:fs"));
|
|
|
34
34
|
var import_promises = __toESM(require("node:fs/promises"));
|
|
35
35
|
var import_node_os = __toESM(require("node:os"));
|
|
36
36
|
var import_node_path = __toESM(require("node:path"));
|
|
37
|
-
var
|
|
38
|
-
var import_utils = require("@tachybase/utils");
|
|
37
|
+
var import_server = require("@tego/server");
|
|
39
38
|
var import_dumper = require("../dumper");
|
|
40
39
|
var import_restorer = require("../restorer");
|
|
41
40
|
var import_server2 = __toESM(require("../server"));
|
|
@@ -45,19 +44,19 @@ var backup_files_default = {
|
|
|
45
44
|
if (ctx.action.actionName !== "upload") {
|
|
46
45
|
return next();
|
|
47
46
|
}
|
|
48
|
-
const storage =
|
|
47
|
+
const storage = import_server.koaMulter.diskStorage({
|
|
49
48
|
destination: import_node_os.default.tmpdir(),
|
|
50
49
|
filename: function(req, file, cb) {
|
|
51
50
|
const randomName = Date.now().toString() + Math.random().toString().slice(2);
|
|
52
51
|
cb(null, randomName);
|
|
53
52
|
}
|
|
54
53
|
});
|
|
55
|
-
const upload = (0,
|
|
54
|
+
const upload = (0, import_server.koaMulter)({ storage }).single("file");
|
|
56
55
|
return upload(ctx, next);
|
|
57
56
|
},
|
|
58
57
|
actions: {
|
|
59
58
|
async list(ctx, next) {
|
|
60
|
-
const { page =
|
|
59
|
+
const { page = import_server.DEFAULT_PAGE, pageSize = import_server.DEFAULT_PER_PAGE } = ctx.action.params;
|
|
61
60
|
const dumper = new import_dumper.Dumper(ctx.app);
|
|
62
61
|
const backupFiles = await dumper.allBackUpFilePaths({
|
|
63
62
|
includeInProgress: true,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { DumpRulesGroupType } from '@
|
|
2
|
-
import { Application } from '@tachybase/server';
|
|
1
|
+
import { Application, DumpRulesGroupType } from '@tego/server';
|
|
3
2
|
import { AppMigrator, AppMigratorOptions } from './app-migrator';
|
|
4
3
|
type RestoreOptions = {
|
|
5
4
|
groups: Set<DumpRulesGroupType>;
|
package/dist/server/restorer.js
CHANGED
|
@@ -30,11 +30,11 @@ __export(restorer_exports, {
|
|
|
30
30
|
Restorer: () => Restorer
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(restorer_exports);
|
|
33
|
-
var
|
|
34
|
-
var import_promises = __toESM(require("fs/promises"));
|
|
35
|
-
var
|
|
36
|
-
var import_database = require("@tachybase/database");
|
|
33
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
34
|
+
var import_promises = __toESM(require("node:fs/promises"));
|
|
35
|
+
var import_node_path = __toESM(require("node:path"));
|
|
37
36
|
var Topo = __toESM(require("@hapi/topo"));
|
|
37
|
+
var import_server = require("@tego/server");
|
|
38
38
|
var import_lodash = __toESM(require("lodash"));
|
|
39
39
|
var import_semver = __toESM(require("semver"));
|
|
40
40
|
var import_yauzl = __toESM(require("yauzl"));
|
|
@@ -68,13 +68,13 @@ class Restorer extends import_app_migrator.AppMigrator {
|
|
|
68
68
|
return sorter.sort();
|
|
69
69
|
}
|
|
70
70
|
setBackUpFilePath(backUpFilePath) {
|
|
71
|
-
if (
|
|
71
|
+
if (import_node_path.default.isAbsolute(backUpFilePath)) {
|
|
72
72
|
this.backUpFilePath = backUpFilePath;
|
|
73
|
-
} else if (
|
|
74
|
-
const dirname =
|
|
75
|
-
this.backUpFilePath =
|
|
73
|
+
} else if (import_node_path.default.basename(backUpFilePath) === backUpFilePath) {
|
|
74
|
+
const dirname = import_node_path.default.resolve(process.cwd(), "storage", "duplicator");
|
|
75
|
+
this.backUpFilePath = import_node_path.default.resolve(dirname, backUpFilePath);
|
|
76
76
|
} else {
|
|
77
|
-
this.backUpFilePath =
|
|
77
|
+
this.backUpFilePath = import_node_path.default.resolve(process.cwd(), backUpFilePath);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
async parseBackupFile() {
|
|
@@ -89,7 +89,7 @@ class Restorer extends import_app_migrator.AppMigrator {
|
|
|
89
89
|
await this.clearWorkDir();
|
|
90
90
|
}
|
|
91
91
|
async getImportMeta() {
|
|
92
|
-
const metaFile =
|
|
92
|
+
const metaFile = import_node_path.default.resolve(this.workDir, "meta");
|
|
93
93
|
return JSON.parse(await import_promises.default.readFile(metaFile, "utf8"));
|
|
94
94
|
}
|
|
95
95
|
async checkMeta() {
|
|
@@ -159,16 +159,16 @@ class Restorer extends import_app_migrator.AppMigrator {
|
|
|
159
159
|
if (err) return reject(err);
|
|
160
160
|
zipfile.readEntry();
|
|
161
161
|
zipfile.on("entry", (entry) => {
|
|
162
|
-
const filePath =
|
|
163
|
-
if (
|
|
164
|
-
|
|
162
|
+
const filePath = import_node_path.default.join(this.workDir, entry.fileName);
|
|
163
|
+
if (entry.fileName.endsWith("/")) {
|
|
164
|
+
import_node_fs.default.mkdir(filePath, { recursive: true }, (err2) => {
|
|
165
165
|
if (err2) return reject(err2);
|
|
166
166
|
zipfile.readEntry();
|
|
167
167
|
});
|
|
168
168
|
} else {
|
|
169
169
|
zipfile.openReadStream(entry, (err2, readStream) => {
|
|
170
170
|
if (err2) return reject(err2);
|
|
171
|
-
const writeStream =
|
|
171
|
+
const writeStream = import_node_fs.default.createWriteStream(filePath);
|
|
172
172
|
readStream.pipe(writeStream);
|
|
173
173
|
writeStream.on("close", () => {
|
|
174
174
|
zipfile.readEntry();
|
|
@@ -188,7 +188,7 @@ class Restorer extends import_app_migrator.AppMigrator {
|
|
|
188
188
|
}
|
|
189
189
|
async readCollectionMeta(collectionName) {
|
|
190
190
|
const dir = this.workDir;
|
|
191
|
-
const collectionMetaPath =
|
|
191
|
+
const collectionMetaPath = import_node_path.default.resolve(dir, "collections", collectionName, "meta");
|
|
192
192
|
const metaContent = await import_promises.default.readFile(collectionMetaPath, "utf8");
|
|
193
193
|
return JSON.parse(metaContent);
|
|
194
194
|
}
|
|
@@ -200,8 +200,8 @@ class Restorer extends import_app_migrator.AppMigrator {
|
|
|
200
200
|
throw new Error("collection name is required");
|
|
201
201
|
}
|
|
202
202
|
const dir = this.workDir;
|
|
203
|
-
const collectionDataPath =
|
|
204
|
-
const collectionMetaPath =
|
|
203
|
+
const collectionDataPath = import_node_path.default.resolve(dir, "collections", collectionName, "data");
|
|
204
|
+
const collectionMetaPath = import_node_path.default.resolve(dir, "collections", collectionName, "meta");
|
|
205
205
|
try {
|
|
206
206
|
await import_promises.default.stat(collectionMetaPath);
|
|
207
207
|
} catch (e) {
|
|
@@ -237,7 +237,7 @@ class Restorer extends import_app_migrator.AppMigrator {
|
|
|
237
237
|
field: attr.field
|
|
238
238
|
};
|
|
239
239
|
}
|
|
240
|
-
const DataTypeClass =
|
|
240
|
+
const DataTypeClass = import_server.DataTypes[db.options.dialect][attr.type] || import_server.DataTypes[attr.type];
|
|
241
241
|
const obj = {
|
|
242
242
|
...attr,
|
|
243
243
|
type: new DataTypeClass()
|
|
@@ -309,8 +309,8 @@ class Restorer extends import_app_migrator.AppMigrator {
|
|
|
309
309
|
this.importedCollections.push(collectionName);
|
|
310
310
|
}
|
|
311
311
|
async importDb(options) {
|
|
312
|
-
const sqlContentPath =
|
|
313
|
-
if (!
|
|
312
|
+
const sqlContentPath = import_node_path.default.resolve(this.workDir, "sql-content.json");
|
|
313
|
+
if (!import_node_fs.default.existsSync(sqlContentPath)) {
|
|
314
314
|
return;
|
|
315
315
|
}
|
|
316
316
|
const sqlData = JSON.parse(await import_promises.default.readFile(sqlContentPath, "utf8"));
|
package/dist/server/server.d.ts
CHANGED
package/dist/server/server.js
CHANGED
|
@@ -30,7 +30,7 @@ __export(server_exports, {
|
|
|
30
30
|
default: () => PluginBackupRestoreServer
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(server_exports);
|
|
33
|
-
var import_server = require("@
|
|
33
|
+
var import_server = require("@tego/server");
|
|
34
34
|
var import_cron_parser = __toESM(require("cron-parser"));
|
|
35
35
|
var import_constants = require("../constants");
|
|
36
36
|
var import_dumper = require("./dumper");
|
package/dist/server/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Database } from '@
|
|
1
|
+
import { Database } from '@tego/server';
|
|
2
2
|
export declare const DUMPED_EXTENSION = "tbdump";
|
|
3
3
|
export declare function sqlAdapter(database: Database, sql: string): string;
|
|
4
4
|
export declare function readLines(filePath: string): Promise<any[]>;
|
package/dist/server/utils.js
CHANGED
|
@@ -34,8 +34,8 @@ __export(utils_exports, {
|
|
|
34
34
|
sqlAdapter: () => sqlAdapter
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(utils_exports);
|
|
37
|
-
var
|
|
38
|
-
var
|
|
37
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
38
|
+
var import_node_readline = __toESM(require("node:readline"));
|
|
39
39
|
var import_lodash = __toESM(require("lodash"));
|
|
40
40
|
const DUMPED_EXTENSION = "tbdump";
|
|
41
41
|
function sqlAdapter(database, sql) {
|
|
@@ -46,8 +46,8 @@ function sqlAdapter(database, sql) {
|
|
|
46
46
|
}
|
|
47
47
|
async function readLines(filePath) {
|
|
48
48
|
const results = [];
|
|
49
|
-
const fileStream =
|
|
50
|
-
const rl =
|
|
49
|
+
const fileStream = import_node_fs.default.createReadStream(filePath);
|
|
50
|
+
const rl = import_node_readline.default.createInterface({
|
|
51
51
|
input: fileStream,
|
|
52
52
|
crlfDelay: Infinity
|
|
53
53
|
});
|
|
@@ -57,8 +57,8 @@ async function readLines(filePath) {
|
|
|
57
57
|
return results;
|
|
58
58
|
}
|
|
59
59
|
async function readEveryLines(filePath, processLine) {
|
|
60
|
-
const fileStream =
|
|
61
|
-
const rl =
|
|
60
|
+
const fileStream = import_node_fs.default.createReadStream(filePath);
|
|
61
|
+
const rl = import_node_readline.default.createInterface({
|
|
62
62
|
input: fileStream,
|
|
63
63
|
crlfDelay: Infinity
|
|
64
64
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tachybase/module-backup",
|
|
3
3
|
"displayName": "App backup & restore",
|
|
4
|
-
"version": "1.3.
|
|
4
|
+
"version": "1.3.23",
|
|
5
5
|
"description": "Backup and restore applications for scenarios such as application replication, migration, and upgrades.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"System management"
|
|
@@ -9,11 +9,15 @@
|
|
|
9
9
|
"license": "Apache-2.0",
|
|
10
10
|
"main": "./dist/server/index.js",
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@ant-design/icons": "^5.
|
|
12
|
+
"@ant-design/icons": "^5.6.1",
|
|
13
13
|
"@hapi/topo": "^6.0.2",
|
|
14
|
+
"@tachybase/schema": "^1.3.43",
|
|
15
|
+
"@tachybase/test": "^1.3.43",
|
|
16
|
+
"@tego/client": "^1.3.43",
|
|
17
|
+
"@tego/server": "^1.3.43",
|
|
14
18
|
"@types/archiver": "^5.3.4",
|
|
15
19
|
"@types/file-saver": "^2.0.7",
|
|
16
|
-
"@types/lodash": "4.17.20",
|
|
20
|
+
"@types/lodash": "^4.17.20",
|
|
17
21
|
"antd": "5.22.5",
|
|
18
22
|
"archiver": "^5.3.2",
|
|
19
23
|
"content-disposition": "^0.5.4",
|
|
@@ -25,27 +29,16 @@
|
|
|
25
29
|
"lodash": "4.17.21",
|
|
26
30
|
"mkdirp": "^1.0.4",
|
|
27
31
|
"object-path": "^0.11.8",
|
|
28
|
-
"react": "
|
|
29
|
-
"react-i18next": "
|
|
32
|
+
"react": "18.3.1",
|
|
33
|
+
"react-i18next": "15.2.0",
|
|
30
34
|
"react-js-cron": "^3.2.0",
|
|
31
35
|
"semver": "7.7.2",
|
|
32
36
|
"tar": "^6.2.1",
|
|
33
37
|
"yauzl": "^3.2.0",
|
|
34
|
-
"@tachybase/
|
|
35
|
-
"@tachybase/module-worker-thread": "1.3.
|
|
36
|
-
},
|
|
37
|
-
"peerDependencies": {
|
|
38
|
-
"@tachybase/actions": "1.3.21",
|
|
39
|
-
"@tachybase/client": "1.3.21",
|
|
40
|
-
"@tachybase/database": "1.3.21",
|
|
41
|
-
"@tachybase/server": "1.3.21",
|
|
42
|
-
"@tachybase/utils": "1.3.21",
|
|
43
|
-
"@tachybase/test": "1.3.21",
|
|
44
|
-
"@tachybase/schema": "1.3.21"
|
|
38
|
+
"@tachybase/client": "1.3.23",
|
|
39
|
+
"@tachybase/module-worker-thread": "1.3.23"
|
|
45
40
|
},
|
|
46
41
|
"description.zh-CN": "备份和还原应用,可用于应用的复制、迁移、升级等场景。",
|
|
47
42
|
"displayName.zh-CN": "应用的备份与还原",
|
|
48
|
-
"scripts": {
|
|
49
|
-
"build": "tachybase-build --no-dts @tachybase/module-backup"
|
|
50
|
-
}
|
|
43
|
+
"scripts": {}
|
|
51
44
|
}
|