mysqlsyncr 1.0.15 → 1.0.16
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/package.json +5 -1
- package/src/apply.js +35 -8
- package/src/socketServer.js +50 -0
- package/ui/dist/spa/assets/{MainLayout-BrvvhLBC.js → MainLayout-CGvO4rsY.js} +1 -1
- package/ui/dist/spa/assets/{axios-CbBgW735.js → axios-CrRsmKCW.js} +1 -1
- package/ui/dist/spa/assets/{index-DbZFTc3Z.css → index-767_aev0.css} +1 -1
- package/ui/dist/spa/assets/index-8ohClfZU.js +30 -0
- package/ui/dist/spa/index.html +2 -2
- package/ui/src/components/FolderBrowser.vue +194 -0
- package/ui/src/pages/MainComponent.vue +35 -1
- package/ui/dist/spa/assets/index-Bgaq8Ay7.js +0 -30
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mysqlsyncr",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
},
|
|
15
15
|
"author": "",
|
|
16
16
|
"license": "ISC",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/Craigzyc/mysqlsyncr"
|
|
20
|
+
},
|
|
17
21
|
"dependencies": {
|
|
18
22
|
"cors": "^2.8.5",
|
|
19
23
|
"express": "^4.21.2",
|
package/src/apply.js
CHANGED
|
@@ -1,18 +1,45 @@
|
|
|
1
1
|
import { logger } from './loggers.js';
|
|
2
2
|
|
|
3
3
|
export const applyDifferences = async (connection, database, differences) => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
|
|
5
|
+
differences.sort((a, b) => {
|
|
6
|
+
//Sort to make sure we apply the differences in a logical order.
|
|
7
|
+
const typePriority = {
|
|
8
|
+
'missing_database': 1,
|
|
9
|
+
'missing_table': 2,
|
|
10
|
+
'extra_table': 2,
|
|
11
|
+
'missing_field': 3,
|
|
12
|
+
'extra_field': 3,
|
|
13
|
+
'mismatched_field': 3,
|
|
14
|
+
'missing_index': 4,
|
|
15
|
+
'extra_index': 4,
|
|
16
|
+
'mismatched_index': 4,
|
|
17
|
+
'missing_procedure': 5,
|
|
18
|
+
'mismatched_procedure': 5,
|
|
19
|
+
'missing_view': 6,
|
|
20
|
+
'mismatched_view': 6,
|
|
21
|
+
'extra_view': 6,
|
|
22
|
+
'missing_trigger': 7,
|
|
23
|
+
'mismatched_trigger': 7,
|
|
24
|
+
'extra_trigger': 7
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
return (typePriority[a.type] || 999) - (typePriority[b.type] || 999);
|
|
28
|
+
})
|
|
29
|
+
|
|
12
30
|
|
|
13
31
|
for (const diff of differences) {
|
|
14
32
|
try {
|
|
15
33
|
|
|
34
|
+
if(diff.type == 'missing_database'){
|
|
35
|
+
const createDatabaseSQL = `CREATE DATABASE \`${differences[0].database}\`;`;
|
|
36
|
+
logger(`Executing: ${createDatabaseSQL}`);
|
|
37
|
+
await connection.query(createDatabaseSQL);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
await connection.query(`USE \`${database}\``);
|
|
16
43
|
if (diff.type === 'missing_table') {
|
|
17
44
|
const { tableName, createSQL } = diff;
|
|
18
45
|
logger(`Creating missing table ${tableName}`);
|
package/src/socketServer.js
CHANGED
|
@@ -7,6 +7,8 @@ import { applyDifferences } from './apply.js';
|
|
|
7
7
|
import cors from 'cors';
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
9
|
import { dirname, join } from 'path';
|
|
10
|
+
import { readdir } from 'fs/promises';
|
|
11
|
+
import { resolve } from 'path';
|
|
10
12
|
|
|
11
13
|
export const startApiServer = (port) => {
|
|
12
14
|
const app = express();
|
|
@@ -92,6 +94,54 @@ export const startApiServer = (port) => {
|
|
|
92
94
|
}
|
|
93
95
|
});
|
|
94
96
|
});
|
|
97
|
+
|
|
98
|
+
app.post('/api/browse-folders', async (req, res) => {
|
|
99
|
+
try {
|
|
100
|
+
const { currentPath = process.cwd() } = req.body;
|
|
101
|
+
console.log('Browsing folder:', currentPath);
|
|
102
|
+
|
|
103
|
+
const resolvedPath = currentPath.startsWith('/') || currentPath.match(/^[A-Z]:\\/)
|
|
104
|
+
? resolve(currentPath)
|
|
105
|
+
: resolve(process.cwd(), currentPath);
|
|
106
|
+
|
|
107
|
+
console.log('Resolved path:', resolvedPath);
|
|
108
|
+
|
|
109
|
+
const contents = await readdir(resolvedPath, { withFileTypes: true });
|
|
110
|
+
|
|
111
|
+
// Separate directories and files
|
|
112
|
+
const items = contents.map(dirent => ({
|
|
113
|
+
name: dirent.name,
|
|
114
|
+
path: join(resolvedPath, dirent.name),
|
|
115
|
+
isDirectory: dirent.isDirectory(),
|
|
116
|
+
isParent: false
|
|
117
|
+
}));
|
|
118
|
+
|
|
119
|
+
// Sort items: directories first, then files, both alphabetically
|
|
120
|
+
const sortedItems = items.sort((a, b) => {
|
|
121
|
+
if (a.isDirectory === b.isDirectory) {
|
|
122
|
+
return a.name.localeCompare(b.name);
|
|
123
|
+
}
|
|
124
|
+
return a.isDirectory ? -1 : 1;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// Add parent directory option if not at root
|
|
128
|
+
if (resolvedPath !== resolve(resolvedPath, '..')) {
|
|
129
|
+
sortedItems.unshift({
|
|
130
|
+
name: '..',
|
|
131
|
+
path: resolve(resolvedPath, '..'),
|
|
132
|
+
isDirectory: true,
|
|
133
|
+
isParent: true
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
res.json({
|
|
138
|
+
currentPath: resolvedPath,
|
|
139
|
+
items: sortedItems
|
|
140
|
+
});
|
|
141
|
+
} catch (error) {
|
|
142
|
+
res.status(500).json({ error: error.message });
|
|
143
|
+
}
|
|
144
|
+
});
|
|
95
145
|
|
|
96
146
|
// Start the server
|
|
97
147
|
server.listen(port, () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as L,i as I,e as P,l as D,p as N,b as g,h as m,f as J,g as C,j as X,s as Y,w as _,k as Z,o as T,m as H,n as V,q,r as ee,t as te,u as y,v as A,x as F,y as R,z as x,A as ne,B as oe,_ as ie,C as le,D as re,E as ae,F as k,G as B}from"./index-
|
|
1
|
+
import{c as L,i as I,e as P,l as D,p as N,b as g,h as m,f as J,g as C,j as X,s as Y,w as _,k as Z,o as T,m as H,n as V,q,r as ee,t as te,u as y,v as A,x as F,y as R,z as x,A as ne,B as oe,_ as ie,C as le,D as re,E as ae,F as k,G as B}from"./index-8ohClfZU.js";const se=L({name:"QPageContainer",setup(e,{slots:p}){const{proxy:{$q:n}}=C(),t=I(D,P);if(t===P)return console.error("QPageContainer needs to be child of QLayout"),P;N(X,!0);const r=g(()=>{const a={};return t.header.space===!0&&(a.paddingTop=`${t.header.size}px`),t.right.space===!0&&(a[`padding${n.lang.rtl===!0?"Left":"Right"}`]=`${t.right.size}px`),t.footer.space===!0&&(a.paddingBottom=`${t.footer.size}px`),t.left.space===!0&&(a[`padding${n.lang.rtl===!0?"Right":"Left"}`]=`${t.left.size}px`),a});return()=>m("div",{class:"q-page-container",style:r.value},J(p.default))}}),{passive:M}=q,ce=["both","horizontal","vertical"],ue=L({name:"QScrollObserver",props:{axis:{type:String,validator:e=>ce.includes(e),default:"vertical"},debounce:[String,Number],scrollTarget:Y},emits:["scroll"],setup(e,{emit:p}){const n={position:{top:0,left:0},direction:"down",directionChanged:!1,delta:{top:0,left:0},inflectionPoint:{top:0,left:0}};let t=null,r,a;_(()=>e.scrollTarget,()=>{l(),v()});function s(){t!==null&&t();const c=Math.max(0,ee(r)),w=te(r),d={top:c-n.position.top,left:w-n.position.left};if(e.axis==="vertical"&&d.top===0||e.axis==="horizontal"&&d.left===0)return;const z=Math.abs(d.top)>=Math.abs(d.left)?d.top<0?"up":"down":d.left<0?"left":"right";n.position={top:c,left:w},n.directionChanged=n.direction!==z,n.delta=d,n.directionChanged===!0&&(n.direction=z,n.inflectionPoint=n.position),p("scroll",{...n})}function v(){r=Z(a,e.scrollTarget),r.addEventListener("scroll",i,M),i(!0)}function l(){r!==void 0&&(r.removeEventListener("scroll",i,M),r=void 0)}function i(c){if(c===!0||e.debounce===0||e.debounce==="0")s();else if(t===null){const[w,d]=e.debounce?[setTimeout(s,e.debounce),clearTimeout]:[requestAnimationFrame(s),cancelAnimationFrame];t=()=>{d(w),t=null}}}const{proxy:h}=C();return _(()=>h.$q.lang.rtl,s),T(()=>{a=h.$el.parentNode,v()}),H(()=>{t!==null&&t(),l()}),Object.assign(h,{trigger:i,getPosition:()=>n}),V}});function de(){const e=y(!A.value);return e.value===!1&&T(()=>{e.value=!0}),{isHydrated:e}}const K=typeof ResizeObserver<"u",W=K===!0?{}:{style:"display:block;position:absolute;top:0;left:0;right:0;bottom:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1;",url:"about:blank"},j=L({name:"QResizeObserver",props:{debounce:{type:[String,Number],default:100}},emits:["resize"],setup(e,{emit:p}){let n=null,t,r={width:-1,height:-1};function a(l){l===!0||e.debounce===0||e.debounce==="0"?s():n===null&&(n=setTimeout(s,e.debounce))}function s(){if(n!==null&&(clearTimeout(n),n=null),t){const{offsetWidth:l,offsetHeight:i}=t;(l!==r.width||i!==r.height)&&(r={width:l,height:i},p("resize",r))}}const{proxy:v}=C();if(v.trigger=a,K===!0){let l;const i=h=>{t=v.$el.parentNode,t?(l=new ResizeObserver(a),l.observe(t),s()):h!==!0&&F(()=>{i(!0)})};return T(()=>{i()}),H(()=>{n!==null&&clearTimeout(n),l!==void 0&&(l.disconnect!==void 0?l.disconnect():t&&l.unobserve(t))}),V}else{let l=function(){n!==null&&(clearTimeout(n),n=null),c!==void 0&&(c.removeEventListener!==void 0&&c.removeEventListener("resize",a,q.passive),c=void 0)},i=function(){l(),t&&t.contentDocument&&(c=t.contentDocument.defaultView,c.addEventListener("resize",a,q.passive),s())};const{isHydrated:h}=de();let c;return T(()=>{F(()=>{t=v.$el,t&&i()})}),H(l),()=>{if(h.value===!0)return m("object",{class:"q--avoid-card-border",style:W.style,tabindex:-1,type:"text/html",data:W.url,"aria-hidden":"true",onLoad:i})}}}}),fe=L({name:"QLayout",props:{container:Boolean,view:{type:String,default:"hhh lpr fff",validator:e=>/^(h|l)h(h|r) lpr (f|l)f(f|r)$/.test(e.toLowerCase())},onScroll:Function,onScrollHeight:Function,onResize:Function},setup(e,{slots:p,emit:n}){const{proxy:{$q:t}}=C(),r=y(null),a=y(t.screen.height),s=y(e.container===!0?0:t.screen.width),v=y({position:0,direction:"down",inflectionPoint:0}),l=y(0),i=y(A.value===!0?0:R()),h=g(()=>"q-layout q-layout--"+(e.container===!0?"containerized":"standard")),c=g(()=>e.container===!1?{minHeight:t.screen.height+"px"}:null),w=g(()=>i.value!==0?{[t.lang.rtl===!0?"left":"right"]:`${i.value}px`}:null),d=g(()=>i.value!==0?{[t.lang.rtl===!0?"right":"left"]:0,[t.lang.rtl===!0?"left":"right"]:`-${i.value}px`,width:`calc(100% + ${i.value}px)`}:null);function z(o){if(e.container===!0||document.qScrollPrevented!==!0){const u={position:o.position.top,direction:o.direction,directionChanged:o.directionChanged,inflectionPoint:o.inflectionPoint.top,delta:o.delta.top};v.value=u,e.onScroll!==void 0&&n("scroll",u)}}function U(o){const{height:u,width:b}=o;let f=!1;a.value!==u&&(f=!0,a.value=u,e.onScrollHeight!==void 0&&n("scrollHeight",u),E()),s.value!==b&&(f=!0,s.value=b),f===!0&&e.onResize!==void 0&&n("resize",o)}function G({height:o}){l.value!==o&&(l.value=o,E())}function E(){if(e.container===!0){const o=a.value>l.value?R():0;i.value!==o&&(i.value=o)}}let S=null;const O={instances:{},view:g(()=>e.view),isContainer:g(()=>e.container),rootRef:r,height:a,containerHeight:l,scrollbarWidth:i,totalWidth:g(()=>s.value+i.value),rows:g(()=>{const o=e.view.toLowerCase().split(" ");return{top:o[0].split(""),middle:o[1].split(""),bottom:o[2].split("")}}),header:x({size:0,offset:0,space:!1}),right:x({size:300,offset:0,space:!1}),footer:x({size:0,offset:0,space:!1}),left:x({size:300,offset:0,space:!1}),scroll:v,animate(){S!==null?clearTimeout(S):document.body.classList.add("q-body--layout-animate"),S=setTimeout(()=>{S=null,document.body.classList.remove("q-body--layout-animate")},155)},update(o,u,b){O[o][u]=b}};if(N(D,O),R()>0){let o=function(){f=null,$.classList.remove("hide-scrollbar")},u=function(){if(f===null){if($.scrollHeight>t.screen.height)return;$.classList.add("hide-scrollbar")}else clearTimeout(f);f=setTimeout(o,300)},b=function(Q){f!==null&&Q==="remove"&&(clearTimeout(f),o()),window[`${Q}EventListener`]("resize",u)},f=null;const $=document.body;_(()=>e.container!==!0?"add":"remove",b),e.container!==!0&&b("add"),ne(()=>{b("remove")})}return()=>{const o=oe(p.default,[m(ue,{onScroll:z}),m(j,{onResize:U})]),u=m("div",{class:h.value,style:c.value,ref:e.container===!0?void 0:r,tabindex:-1},o);return e.container===!0?m("div",{class:"q-layout-container overflow-hidden",ref:r},[m(j,{onResize:G}),m("div",{class:"absolute-full",style:w.value},[m("div",{class:"scroll",style:d.value},[u])])]):u}}}),ve={};function he(e,p){const n=le("router-view");return re(),ae(fe,{view:"lHh Lpr lFf"},{default:k(()=>[B(se,null,{default:k(()=>[B(n)]),_:1})]),_:1})}const me=ie(ve,[["render",he]]);export{me as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as e,a}from"./index-
|
|
1
|
+
import{d as e,a}from"./index-8ohClfZU.js";const i=a.create({baseURL:"https://api.example.com"}),t=e(({app:o})=>{o.config.globalProperties.$axios=a,o.config.globalProperties.$api=i});export{i as api,t as default};
|