mysqlsyncr 1.0.3 → 1.0.7
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 +7 -2
- package/src/apply.js +16 -11
- package/src/cli.js +3 -2
- package/src/compare.js +8 -1
- package/src/differences.js +45 -22
- package/src/dump.js +37 -1
- package/src/index.js +59 -41
- package/src/parsers.js +2 -1
- package/src/socketServer.js +96 -0
- package/ui/.editorconfig +7 -0
- package/ui/.prettierrc.json +6 -0
- package/ui/README.md +40 -0
- package/ui/dist/spa/assets/KFOkCnqEu92Fr1MmgVxIIzQ-Y2mpUUkw.woff +0 -0
- package/ui/dist/spa/assets/KFOlCnqEu92Fr1MmEU9fBBc--ViM7Ag4Q.woff +0 -0
- package/ui/dist/spa/assets/KFOlCnqEu92Fr1MmSU5fBBc--CrFzpgl6.woff +0 -0
- package/ui/dist/spa/assets/KFOlCnqEu92Fr1MmWUlfBBc--CW3_XjG_.woff +0 -0
- package/ui/dist/spa/assets/KFOlCnqEu92Fr1MmYUtfBBc--Dr8fnyGc.woff +0 -0
- package/ui/dist/spa/assets/KFOmCnqEu92Fr1Mu4mxM-DAYh6T4l.woff +0 -0
- package/ui/dist/spa/assets/MainLayout-C27l9N4F.js +1 -0
- package/ui/dist/spa/assets/axios-Y2H2Igoj.js +1 -0
- package/ui/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff +0 -0
- package/ui/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2 +0 -0
- package/ui/dist/spa/assets/index-DKK0oGss.js +30 -0
- package/ui/dist/spa/assets/index-DME6fUxJ.css +5 -0
- package/ui/dist/spa/favicon.ico +0 -0
- package/ui/dist/spa/icons/favicon-128x128.png +0 -0
- package/ui/dist/spa/icons/favicon-16x16.png +0 -0
- package/ui/dist/spa/icons/favicon-32x32.png +0 -0
- package/ui/dist/spa/icons/favicon-96x96.png +0 -0
- package/ui/dist/spa/index.html +3 -0
- package/ui/eslint.config.js +73 -0
- package/ui/index.html +21 -0
- package/ui/jsconfig.json +3 -0
- package/ui/package.json +42 -0
- package/ui/postcss.config.js +29 -0
- package/ui/public/favicon.ico +0 -0
- package/ui/public/icons/favicon-128x128.png +0 -0
- package/ui/public/icons/favicon-16x16.png +0 -0
- package/ui/public/icons/favicon-32x32.png +0 -0
- package/ui/public/icons/favicon-96x96.png +0 -0
- package/ui/quasar.config.js +215 -0
- package/ui/src/App.vue +7 -0
- package/ui/src/assets/quasar-logo-vertical.svg +15 -0
- package/ui/src/boot/.gitkeep +0 -0
- package/ui/src/boot/axios.js +24 -0
- package/ui/src/components/EssentialLink.vue +44 -0
- package/ui/src/css/app.scss +1 -0
- package/ui/src/css/quasar.variables.scss +25 -0
- package/ui/src/layouts/MainLayout.vue +13 -0
- package/ui/src/pages/ApplyChanges.vue +46 -0
- package/ui/src/pages/CompareDatabase.vue +57 -0
- package/ui/src/pages/DatabaseManager.vue +42 -0
- package/ui/src/pages/DumpDatabase.vue +41 -0
- package/ui/src/pages/ErrorNotFound.vue +27 -0
- package/ui/src/pages/MainComponent copy.vue +322 -0
- package/ui/src/pages/MainComponent.vue +894 -0
- package/ui/src/router/index.js +30 -0
- package/ui/src/router/routes.js +20 -0
- package/ui/src/stores/example-store.js +21 -0
- package/ui/src/stores/index.js +20 -0
package/ui/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mysqlsyncr",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A simple ui for the sync features in mysqlsyncr",
|
|
5
|
+
"productName": "MySQLsyncr",
|
|
6
|
+
"author": "Craigzyc <craig.zych@neelands.com>",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"private": true,
|
|
9
|
+
"scripts": {
|
|
10
|
+
"lint": "eslint -c ./eslint.config.js \"./src*/**/*.{js,cjs,mjs,vue}\"",
|
|
11
|
+
"format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore",
|
|
12
|
+
"test": "echo \"No test specified\" && exit 0",
|
|
13
|
+
"dev": "quasar dev",
|
|
14
|
+
"build": "quasar build",
|
|
15
|
+
"postinstall": "quasar prepare"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"axios": "^1.2.1",
|
|
19
|
+
"pinia": "^2.0.11",
|
|
20
|
+
"@quasar/extras": "^1.16.4",
|
|
21
|
+
"quasar": "^2.16.0",
|
|
22
|
+
"vue": "^3.4.18",
|
|
23
|
+
"vue-router": "^4.0.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@eslint/js": "^9.14.0",
|
|
27
|
+
"eslint": "^9.14.0",
|
|
28
|
+
"eslint-plugin-vue": "^9.30.0",
|
|
29
|
+
"globals": "^15.12.0",
|
|
30
|
+
"vite-plugin-checker": "^0.8.0",
|
|
31
|
+
"@vue/eslint-config-prettier": "^10.1.0",
|
|
32
|
+
"prettier": "^3.3.3",
|
|
33
|
+
"@quasar/app-vite": "^2.0.0",
|
|
34
|
+
"autoprefixer": "^10.4.2",
|
|
35
|
+
"postcss": "^8.4.14"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18",
|
|
39
|
+
"npm": ">= 6.13.4",
|
|
40
|
+
"yarn": ">= 1.21.1"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// https://github.com/michael-ciniawsky/postcss-load-config
|
|
2
|
+
|
|
3
|
+
import autoprefixer from 'autoprefixer'
|
|
4
|
+
// import rtlcss from 'postcss-rtlcss'
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
plugins: [
|
|
8
|
+
// https://github.com/postcss/autoprefixer
|
|
9
|
+
autoprefixer({
|
|
10
|
+
overrideBrowserslist: [
|
|
11
|
+
'last 4 Chrome versions',
|
|
12
|
+
'last 4 Firefox versions',
|
|
13
|
+
'last 4 Edge versions',
|
|
14
|
+
'last 4 Safari versions',
|
|
15
|
+
'last 4 Android versions',
|
|
16
|
+
'last 4 ChromeAndroid versions',
|
|
17
|
+
'last 4 FirefoxAndroid versions',
|
|
18
|
+
'last 4 iOS versions'
|
|
19
|
+
]
|
|
20
|
+
}),
|
|
21
|
+
|
|
22
|
+
// https://github.com/elchininet/postcss-rtlcss
|
|
23
|
+
// If you want to support RTL css, then
|
|
24
|
+
// 1. yarn/pnpm/bun/npm install postcss-rtlcss
|
|
25
|
+
// 2. optionally set quasar.config.js > framework > lang to an RTL language
|
|
26
|
+
// 3. uncomment the following line (and its import statement above):
|
|
27
|
+
// rtlcss()
|
|
28
|
+
]
|
|
29
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// Configuration for your app
|
|
2
|
+
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-file
|
|
3
|
+
|
|
4
|
+
import { defineConfig } from '#q-app/wrappers'
|
|
5
|
+
|
|
6
|
+
export default defineConfig((/* ctx */) => {
|
|
7
|
+
return {
|
|
8
|
+
// https://v2.quasar.dev/quasar-cli-vite/prefetch-feature
|
|
9
|
+
// preFetch: true,
|
|
10
|
+
|
|
11
|
+
// app boot file (/src/boot)
|
|
12
|
+
// --> boot files are part of "main.js"
|
|
13
|
+
// https://v2.quasar.dev/quasar-cli-vite/boot-files
|
|
14
|
+
boot: [
|
|
15
|
+
'axios'
|
|
16
|
+
],
|
|
17
|
+
|
|
18
|
+
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#css
|
|
19
|
+
css: [
|
|
20
|
+
'app.scss'
|
|
21
|
+
],
|
|
22
|
+
|
|
23
|
+
// https://github.com/quasarframework/quasar/tree/dev/extras
|
|
24
|
+
extras: [
|
|
25
|
+
// 'ionicons-v4',
|
|
26
|
+
// 'mdi-v7',
|
|
27
|
+
// 'fontawesome-v6',
|
|
28
|
+
// 'eva-icons',
|
|
29
|
+
// 'themify',
|
|
30
|
+
// 'line-awesome',
|
|
31
|
+
// 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both!
|
|
32
|
+
|
|
33
|
+
'roboto-font', // optional, you are not bound to it
|
|
34
|
+
'material-icons', // optional, you are not bound to it
|
|
35
|
+
],
|
|
36
|
+
|
|
37
|
+
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#build
|
|
38
|
+
build: {
|
|
39
|
+
target: {
|
|
40
|
+
browser: [ 'es2022', 'firefox115', 'chrome115', 'safari14' ],
|
|
41
|
+
node: 'node20'
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
vueRouterMode: 'hash', // available values: 'hash', 'history'
|
|
45
|
+
// vueRouterBase,
|
|
46
|
+
// vueDevtools,
|
|
47
|
+
// vueOptionsAPI: false,
|
|
48
|
+
|
|
49
|
+
// rebuildCache: true, // rebuilds Vite/linter/etc cache on startup
|
|
50
|
+
|
|
51
|
+
// publicPath: '/',
|
|
52
|
+
// analyze: true,
|
|
53
|
+
// env: {},
|
|
54
|
+
// rawDefine: {}
|
|
55
|
+
// ignorePublicFolder: true,
|
|
56
|
+
// minify: false,
|
|
57
|
+
// polyfillModulePreload: true,
|
|
58
|
+
// distDir
|
|
59
|
+
|
|
60
|
+
// extendViteConf (viteConf) {},
|
|
61
|
+
// viteVuePluginOptions: {},
|
|
62
|
+
|
|
63
|
+
vitePlugins: [
|
|
64
|
+
['vite-plugin-checker', {
|
|
65
|
+
eslint: {
|
|
66
|
+
lintCommand: 'eslint -c ./eslint.config.js "./src*/**/*.{js,mjs,cjs,vue}"',
|
|
67
|
+
useFlatConfig: true
|
|
68
|
+
}
|
|
69
|
+
}, { server: false }]
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#devserver
|
|
74
|
+
devServer: {
|
|
75
|
+
// https: true,
|
|
76
|
+
open: true // opens browser window automatically
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#framework
|
|
80
|
+
framework: {
|
|
81
|
+
config: {},
|
|
82
|
+
|
|
83
|
+
// iconSet: 'material-icons', // Quasar icon set
|
|
84
|
+
// lang: 'en-US', // Quasar language pack
|
|
85
|
+
|
|
86
|
+
// For special cases outside of where the auto-import strategy can have an impact
|
|
87
|
+
// (like functional components as one of the examples),
|
|
88
|
+
// you can manually specify Quasar components/directives to be available everywhere:
|
|
89
|
+
//
|
|
90
|
+
// components: [],
|
|
91
|
+
// directives: [],
|
|
92
|
+
|
|
93
|
+
// Quasar plugins
|
|
94
|
+
plugins: [
|
|
95
|
+
'Notify',
|
|
96
|
+
'Dialog'
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
// animations: 'all', // --- includes all animations
|
|
101
|
+
// https://v2.quasar.dev/options/animations
|
|
102
|
+
animations: [],
|
|
103
|
+
|
|
104
|
+
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#sourcefiles
|
|
105
|
+
// sourceFiles: {
|
|
106
|
+
// rootComponent: 'src/App.vue',
|
|
107
|
+
// router: 'src/router/index',
|
|
108
|
+
// store: 'src/store/index',
|
|
109
|
+
// pwaRegisterServiceWorker: 'src-pwa/register-service-worker',
|
|
110
|
+
// pwaServiceWorker: 'src-pwa/custom-service-worker',
|
|
111
|
+
// pwaManifestFile: 'src-pwa/manifest.json',
|
|
112
|
+
// electronMain: 'src-electron/electron-main',
|
|
113
|
+
// electronPreload: 'src-electron/electron-preload'
|
|
114
|
+
// bexManifestFile: 'src-bex/manifest.json
|
|
115
|
+
// },
|
|
116
|
+
|
|
117
|
+
// https://v2.quasar.dev/quasar-cli-vite/developing-ssr/configuring-ssr
|
|
118
|
+
ssr: {
|
|
119
|
+
prodPort: 3000, // The default port that the production server should use
|
|
120
|
+
// (gets superseded if process.env.PORT is specified at runtime)
|
|
121
|
+
|
|
122
|
+
middlewares: [
|
|
123
|
+
'render' // keep this as last one
|
|
124
|
+
],
|
|
125
|
+
|
|
126
|
+
// extendPackageJson (json) {},
|
|
127
|
+
// extendSSRWebserverConf (esbuildConf) {},
|
|
128
|
+
|
|
129
|
+
// manualStoreSerialization: true,
|
|
130
|
+
// manualStoreSsrContextInjection: true,
|
|
131
|
+
// manualStoreHydration: true,
|
|
132
|
+
// manualPostHydrationTrigger: true,
|
|
133
|
+
|
|
134
|
+
pwa: false
|
|
135
|
+
// pwaOfflineHtmlFilename: 'offline.html', // do NOT use index.html as name!
|
|
136
|
+
|
|
137
|
+
// pwaExtendGenerateSWOptions (cfg) {},
|
|
138
|
+
// pwaExtendInjectManifestOptions (cfg) {}
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
// https://v2.quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa
|
|
142
|
+
pwa: {
|
|
143
|
+
workboxMode: 'GenerateSW' // 'GenerateSW' or 'InjectManifest'
|
|
144
|
+
// swFilename: 'sw.js',
|
|
145
|
+
// manifestFilename: 'manifest.json',
|
|
146
|
+
// extendManifestJson (json) {},
|
|
147
|
+
// useCredentialsForManifestTag: true,
|
|
148
|
+
// injectPwaMetaTags: false,
|
|
149
|
+
// extendPWACustomSWConf (esbuildConf) {},
|
|
150
|
+
// extendGenerateSWOptions (cfg) {},
|
|
151
|
+
// extendInjectManifestOptions (cfg) {}
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-cordova-apps/configuring-cordova
|
|
155
|
+
cordova: {
|
|
156
|
+
// noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-capacitor-apps/configuring-capacitor
|
|
160
|
+
capacitor: {
|
|
161
|
+
hideSplashscreen: true
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/configuring-electron
|
|
165
|
+
electron: {
|
|
166
|
+
// extendElectronMainConf (esbuildConf) {},
|
|
167
|
+
// extendElectronPreloadConf (esbuildConf) {},
|
|
168
|
+
|
|
169
|
+
// extendPackageJson (json) {},
|
|
170
|
+
|
|
171
|
+
// Electron preload scripts (if any) from /src-electron, WITHOUT file extension
|
|
172
|
+
preloadScripts: [ 'electron-preload' ],
|
|
173
|
+
|
|
174
|
+
// specify the debugging port to use for the Electron app when running in development mode
|
|
175
|
+
inspectPort: 5858,
|
|
176
|
+
|
|
177
|
+
bundler: 'packager', // 'packager' or 'builder'
|
|
178
|
+
|
|
179
|
+
packager: {
|
|
180
|
+
// https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options
|
|
181
|
+
|
|
182
|
+
// OS X / Mac App Store
|
|
183
|
+
// appBundleId: '',
|
|
184
|
+
// appCategoryType: '',
|
|
185
|
+
// osxSign: '',
|
|
186
|
+
// protocol: 'myapp://path',
|
|
187
|
+
|
|
188
|
+
// Windows only
|
|
189
|
+
// win32metadata: { ... }
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
builder: {
|
|
193
|
+
// https://www.electron.build/configuration/configuration
|
|
194
|
+
|
|
195
|
+
appId: 'mysqlsyncr'
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
// Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex
|
|
200
|
+
bex: {
|
|
201
|
+
// extendBexScriptsConf (esbuildConf) {},
|
|
202
|
+
// extendBexManifestJson (json) {},
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* The list of extra scripts (js/ts) not in your bex manifest that you want to
|
|
206
|
+
* compile and use in your browser extension. Maybe dynamic use them?
|
|
207
|
+
*
|
|
208
|
+
* Each entry in the list should be a relative filename to /src-bex/
|
|
209
|
+
*
|
|
210
|
+
* @example [ 'my-script.ts', 'sub-folder/my-other-script.js' ]
|
|
211
|
+
*/
|
|
212
|
+
extraScripts: []
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
})
|
package/ui/src/App.vue
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 356 360">
|
|
2
|
+
<path
|
|
3
|
+
d="M43.4 303.4c0 3.8-2.3 6.3-7.1 6.3h-15v-22h14.4c4.3 0 6.2 2.2 6.2 5.2 0 2.6-1.5 4.4-3.4 5 2.8.4 4.9 2.5 4.9 5.5zm-8-13H24.1v6.9H35c2.1 0 4-1.3 4-3.8 0-2.2-1.3-3.1-3.7-3.1zm5.1 12.6c0-2.3-1.8-3.7-4-3.7H24.2v7.7h11.7c3.4 0 4.6-1.8 4.6-4zm36.3 4v2.7H56v-22h20.6v2.7H58.9v6.8h14.6v2.3H58.9v7.5h17.9zm23-5.8v8.5H97v-8.5l-11-13.4h3.4l8.9 11 8.8-11h3.4l-10.8 13.4zm19.1-1.8V298c0-7.9 5.2-10.7 12.7-10.7 7.5 0 13 2.8 13 10.7v1.4c0 7.9-5.5 10.8-13 10.8s-12.7-3-12.7-10.8zm22.7 0V298c0-5.7-3.9-8-10-8-6 0-9.8 2.3-9.8 8v1.4c0 5.8 3.8 8.1 9.8 8.1 6 0 10-2.3 10-8.1zm37.2-11.6v21.9h-2.9l-15.8-17.9v17.9h-2.8v-22h3l15.6 18v-18h2.9zm37.9 10.2v1.3c0 7.8-5.2 10.4-12.4 10.4H193v-22h11.2c7.2 0 12.4 2.8 12.4 10.3zm-3 0c0-5.3-3.3-7.6-9.4-7.6h-8.4V307h8.4c6 0 9.5-2 9.5-7.7V298zm50.8-7.6h-9.7v19.3h-3v-19.3h-9.7v-2.6h22.4v2.6zm34.4-2.6v21.9h-3v-10.1h-16.8v10h-2.8v-21.8h2.8v9.2H296v-9.2h2.9zm34.9 19.2v2.7h-20.7v-22h20.6v2.7H316v6.8h14.5v2.3H316v7.5h17.8zM24 340.2v7.3h13.9v2.4h-14v9.6H21v-22h20v2.7H24zm41.5 11.4h-9.8v7.9H53v-22h13.3c5.1 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6H66c3.1 0 5.3-1.5 5.3-4.7 0-3.3-2.2-4.1-5.3-4.1H55.7v8.8zm47.9 6.2H89l-2 4.3h-3.2l10.7-22.2H98l10.7 22.2h-3.2l-2-4.3zm-1-2.3l-6.3-13-6 13h12.2zm46.3-15.3v21.9H146v-17.2L135.7 358h-2.1l-10.2-15.6v17h-2.8v-21.8h3l11 16.9 11.3-17h3zm35 19.3v2.6h-20.7v-22h20.6v2.7H166v6.8h14.5v2.3H166v7.6h17.8zm47-19.3l-8.3 22h-3l-7.1-18.6-7 18.6h-3l-8.2-22h3.3L204 356l6.8-18.5h3.4L221 356l6.6-18.5h3.3zm10 11.6v-1.4c0-7.8 5.2-10.7 12.7-10.7 7.6 0 13 2.9 13 10.7v1.4c0 7.9-5.4 10.8-13 10.8-7.5 0-12.7-3-12.7-10.8zm22.8 0v-1.4c0-5.7-4-8-10-8s-9.9 2.3-9.9 8v1.4c0 5.8 3.8 8.2 9.8 8.2 6.1 0 10-2.4 10-8.2zm28.3 2.4h-9.8v7.9h-2.8v-22h13.2c5.2 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6h10.2c3 0 5.2-1.5 5.2-4.7 0-3.3-2.1-4.1-5.2-4.1h-10.2v8.8zm40.3-1.5l-6.8 5.6v6.4h-2.9v-22h2.9v12.3l15.2-12.2h3.7l-9.9 8.1 10.3 13.8h-3.6l-8.9-12z" />
|
|
4
|
+
<path fill="#050A14"
|
|
5
|
+
d="M188.4 71.7a10.4 10.4 0 01-20.8 0 10.4 10.4 0 1120.8 0zM224.2 45c-2.2-3.9-5-7.5-8.2-10.7l-12 7c-3.7-3.2-8-5.7-12.6-7.3a49.4 49.4 0 00-9.7 13.9 59 59 0 0140.1 14l7.6-4.4a57 57 0 00-5.2-12.5zM178 125.1c4.5 0 9-.6 13.4-1.7v-14a40 40 0 0012.5-7.2 47.7 47.7 0 00-7.1-15.3 59 59 0 01-32.2 27.7v8.7c4.4 1.2 8.9 1.8 13.4 1.8zM131.8 45c-2.3 4-4 8.1-5.2 12.5l12 7a40 40 0 000 14.4c5.7 1.5 11.3 2 16.9 1.5a59 59 0 01-8-41.7l-7.5-4.3c-3.2 3.2-6 6.7-8.2 10.6z" />
|
|
6
|
+
<path fill="#00B4FF"
|
|
7
|
+
d="M224.2 98.4c2.3-3.9 4-8 5.2-12.4l-12-7a40 40 0 000-14.5c-5.7-1.5-11.3-2-16.9-1.5a59 59 0 018 41.7l7.5 4.4c3.2-3.2 6-6.8 8.2-10.7zm-92.4 0c2.2 4 5 7.5 8.2 10.7l12-7a40 40 0 0012.6 7.3c4-4.1 7.3-8.8 9.7-13.8a59 59 0 01-40-14l-7.7 4.4c1.2 4.3 3 8.5 5.2 12.4zm46.2-80c-4.5 0-9 .5-13.4 1.7V34a40 40 0 00-12.5 7.2c1.5 5.7 4 10.8 7.1 15.4a59 59 0 0132.2-27.7V20a53.3 53.3 0 00-13.4-1.8z" />
|
|
8
|
+
<path fill="#00B4FF"
|
|
9
|
+
d="M178 9.2a62.6 62.6 0 11-.1 125.2A62.6 62.6 0 01178 9.2m0-9.2a71.7 71.7 0 100 143.5A71.7 71.7 0 00178 0z" />
|
|
10
|
+
<path fill="#050A14"
|
|
11
|
+
d="M96.6 212v4.3c-9.2-.8-15.4-5.8-15.4-17.8V180h4.6v18.4c0 8.6 4 12.6 10.8 13.5zm16-31.9v18.4c0 8.9-4.3 12.8-10.9 13.5v4.4c9.2-.7 15.5-5.6 15.5-18v-18.3h-4.7zM62.2 199v-2.2c0-12.7-8.8-17.4-21-17.4-12.1 0-20.7 4.7-20.7 17.4v2.2c0 12.8 8.6 17.6 20.7 17.6 1.5 0 3-.1 4.4-.3l11.8 6.2 2-3.3-8.2-4-6.4-3.1a32 32 0 01-3.6.2c-9.8 0-16-3.9-16-13.3v-2.2c0-9.3 6.2-13.1 16-13.1 9.9 0 16.3 3.8 16.3 13.1v2.2c0 5.3-2.1 8.7-5.6 10.8l4.8 2.4c3.4-2.8 5.5-7 5.5-13.2zM168 215.6h5.1L156 179.7h-4.8l17 36zM143 205l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.8-3.7H143zm133.7 10.7h5.2l-17.3-35.9h-4.8l17 36zm-25-10.7l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.7-3.7h-14.8zm73.8-2.5c6-1.2 9-5.4 9-11.4 0-8-4.5-10.9-12.9-10.9h-21.4v35.5h4.6v-31.3h16.5c5 0 8.5 1.4 8.5 6.7 0 5.2-3.5 7.7-8.5 7.7h-11.4v4.1h10.7l9.3 12.8h5.5l-9.9-13.2zm-117.4 9.9c-9.7 0-14.7-2.5-18.6-6.3l-2.2 3.8c5.1 5 11 6.7 21 6.7 1.6 0 3.1-.1 4.6-.3l-1.9-4h-3zm18.4-7c0-6.4-4.7-8.6-13.8-9.4l-10.1-1c-6.7-.7-9.3-2.2-9.3-5.6 0-2.5 1.4-4 4.6-5l-1.8-3.8c-4.7 1.4-7.5 4.2-7.5 8.9 0 5.2 3.4 8.7 13 9.6l11.3 1.2c6.4.6 8.9 2 8.9 5.4 0 2.7-2.1 4.7-6 5.8l1.8 3.9c5.3-1.6 8.9-4.7 8.9-10zm-20.3-21.9c7.9 0 13.3 1.8 18.1 5.7l1.8-3.9a30 30 0 00-19.6-5.9c-2 0-4 .1-5.7.3l1.9 4 3.5-.2z" />
|
|
12
|
+
<path fill="#00B4FF"
|
|
13
|
+
d="M.5 251.9c29.6-.5 59.2-.8 88.8-1l88.7-.3 88.7.3 44.4.4 44.4.6-44.4.6-44.4.4-88.7.3-88.7-.3a7981 7981 0 01-88.8-1z" />
|
|
14
|
+
<path fill="none" d="M-565.2 324H-252v15.8h-313.2z" />
|
|
15
|
+
</svg>
|
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defineBoot } from '#q-app/wrappers'
|
|
2
|
+
import axios from 'axios'
|
|
3
|
+
|
|
4
|
+
// Be careful when using SSR for cross-request state pollution
|
|
5
|
+
// due to creating a Singleton instance here;
|
|
6
|
+
// If any client changes this (global) instance, it might be a
|
|
7
|
+
// good idea to move this instance creation inside of the
|
|
8
|
+
// "export default () => {}" function below (which runs individually
|
|
9
|
+
// for each client)
|
|
10
|
+
const api = axios.create({ baseURL: 'https://api.example.com' })
|
|
11
|
+
|
|
12
|
+
export default defineBoot(({ app }) => {
|
|
13
|
+
// for use inside Vue files (Options API) through this.$axios and this.$api
|
|
14
|
+
|
|
15
|
+
app.config.globalProperties.$axios = axios
|
|
16
|
+
// ^ ^ ^ this will allow you to use this.$axios (for Vue Options API form)
|
|
17
|
+
// so you won't necessarily have to import axios in each vue file
|
|
18
|
+
|
|
19
|
+
app.config.globalProperties.$api = api
|
|
20
|
+
// ^ ^ ^ this will allow you to use this.$api (for Vue Options API form)
|
|
21
|
+
// so you can easily perform requests against your app's API
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
export { api }
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<q-item
|
|
3
|
+
clickable
|
|
4
|
+
tag="a"
|
|
5
|
+
target="_blank"
|
|
6
|
+
:href="props.link"
|
|
7
|
+
>
|
|
8
|
+
<q-item-section
|
|
9
|
+
v-if="props.icon"
|
|
10
|
+
avatar
|
|
11
|
+
>
|
|
12
|
+
<q-icon :name="props.icon" />
|
|
13
|
+
</q-item-section>
|
|
14
|
+
|
|
15
|
+
<q-item-section>
|
|
16
|
+
<q-item-label>{{ props.title }}</q-item-label>
|
|
17
|
+
<q-item-label caption>{{ props.caption }}</q-item-label>
|
|
18
|
+
</q-item-section>
|
|
19
|
+
</q-item>
|
|
20
|
+
</template>
|
|
21
|
+
|
|
22
|
+
<script setup>
|
|
23
|
+
const props = defineProps({
|
|
24
|
+
title: {
|
|
25
|
+
type: String,
|
|
26
|
+
required: true
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
caption: {
|
|
30
|
+
type: String,
|
|
31
|
+
default: ''
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
link: {
|
|
35
|
+
type: String,
|
|
36
|
+
default: '#'
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
icon: {
|
|
40
|
+
type: String,
|
|
41
|
+
default: ''
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
</script>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// app global css in SCSS form
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Quasar SCSS (& Sass) Variables
|
|
2
|
+
// --------------------------------------------------
|
|
3
|
+
// To customize the look and feel of this app, you can override
|
|
4
|
+
// the Sass/SCSS variables found in Quasar's source Sass/SCSS files.
|
|
5
|
+
|
|
6
|
+
// Check documentation for full list of Quasar variables
|
|
7
|
+
|
|
8
|
+
// Your own variables (that are declared here) and Quasar's own
|
|
9
|
+
// ones will be available out of the box in your .vue/.scss/.sass files
|
|
10
|
+
|
|
11
|
+
// It's highly recommended to change the default colors
|
|
12
|
+
// to match your app's branding.
|
|
13
|
+
// Tip: Use the "Theme Builder" on Quasar's documentation website.
|
|
14
|
+
|
|
15
|
+
$primary : #1976D2;
|
|
16
|
+
$secondary : #26A69A;
|
|
17
|
+
$accent : #9C27B0;
|
|
18
|
+
|
|
19
|
+
$dark : #1D1D1D;
|
|
20
|
+
$dark-page : #121212;
|
|
21
|
+
|
|
22
|
+
$positive : #21BA45;
|
|
23
|
+
$negative : #C10015;
|
|
24
|
+
$info : #31CCEC;
|
|
25
|
+
$warning : #F2C037;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<q-page>
|
|
3
|
+
<q-btn @click="applyChanges" label="Apply Changes" color="primary" />
|
|
4
|
+
<q-spinner v-if="loading" />
|
|
5
|
+
<div v-if="message">{{ message }}</div>
|
|
6
|
+
</q-page>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<script>
|
|
10
|
+
import axios from 'axios';
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
data() {
|
|
14
|
+
return {
|
|
15
|
+
loading: false,
|
|
16
|
+
message: '',
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
methods: {
|
|
20
|
+
async applyChanges() {
|
|
21
|
+
this.loading = true;
|
|
22
|
+
try {
|
|
23
|
+
const response = await axios.post('http://localhost:3000/api/apply', {
|
|
24
|
+
config: {
|
|
25
|
+
host: this.$store.state.db.host,
|
|
26
|
+
port: this.$store.state.db.port,
|
|
27
|
+
user: this.$store.state.db.user,
|
|
28
|
+
password: this.$store.state.db.password,
|
|
29
|
+
},
|
|
30
|
+
database: this.$store.state.db.database,
|
|
31
|
+
diffs: this.getSelectedDiffs(), // Get selected differences to apply
|
|
32
|
+
});
|
|
33
|
+
this.message = response.data.message;
|
|
34
|
+
} catch (error) {
|
|
35
|
+
this.message = error.response.data.message;
|
|
36
|
+
} finally {
|
|
37
|
+
this.loading = false;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
getSelectedDiffs() {
|
|
41
|
+
// Logic to get selected differences from the comparison view
|
|
42
|
+
return []; // Placeholder
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
</script>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<q-page>
|
|
3
|
+
<q-btn @click="compareDatabases" label="Compare Databases" color="primary" />
|
|
4
|
+
<q-table v-if="differences.length" :rows="differences" :columns="columns" />
|
|
5
|
+
<q-spinner v-if="loading" />
|
|
6
|
+
<div v-if="message">{{ message }}</div>
|
|
7
|
+
</q-page>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script>
|
|
11
|
+
import axios from 'axios';
|
|
12
|
+
|
|
13
|
+
export default {
|
|
14
|
+
data() {
|
|
15
|
+
return {
|
|
16
|
+
loading: false,
|
|
17
|
+
message: '',
|
|
18
|
+
differences: [],
|
|
19
|
+
columns: [
|
|
20
|
+
{ name: 'table', label: 'Table', align: 'left', field: 'table' },
|
|
21
|
+
{ name: 'difference', label: 'Difference', align: 'left', field: 'difference' },
|
|
22
|
+
{ name: 'action', label: 'Action', align: 'center', field: 'action', sortable: false },
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
methods: {
|
|
27
|
+
async compareDatabases() {
|
|
28
|
+
this.loading = true;
|
|
29
|
+
try {
|
|
30
|
+
const response = await axios.post('http://localhost:3000/api/compare', {
|
|
31
|
+
config: {
|
|
32
|
+
host: this.$store.state.db.host,
|
|
33
|
+
port: this.$store.state.db.port,
|
|
34
|
+
user: this.$store.state.db.user,
|
|
35
|
+
password: this.$store.state.db.password,
|
|
36
|
+
},
|
|
37
|
+
database: this.$store.state.db.database,
|
|
38
|
+
output: 'outputDir', // Specify output directory
|
|
39
|
+
});
|
|
40
|
+
this.differences = response.data.map(diff => ({
|
|
41
|
+
table: diff.table,
|
|
42
|
+
difference: diff.difference,
|
|
43
|
+
action: 'Apply', // Placeholder for action
|
|
44
|
+
}));
|
|
45
|
+
} catch (error) {
|
|
46
|
+
this.message = error.response.data.message;
|
|
47
|
+
} finally {
|
|
48
|
+
this.loading = false;
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
applyDifference(difference) {
|
|
52
|
+
// Logic to apply the individual difference
|
|
53
|
+
console.log('Applying difference:', difference);
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
</script>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<q-page>
|
|
3
|
+
<q-form @submit.prevent="connectToDatabase">
|
|
4
|
+
<q-input v-model="host" label="Database Host" required />
|
|
5
|
+
<q-input v-model="port" label="Database Port" type="number" required />
|
|
6
|
+
<q-input v-model="user" label="Database User" required />
|
|
7
|
+
<q-input v-model="password" label="Database Password" type="password" required />
|
|
8
|
+
<q-input v-model="database" label="Database Name" required />
|
|
9
|
+
<q-btn type="submit" label="Connect" color="primary" />
|
|
10
|
+
</q-form>
|
|
11
|
+
|
|
12
|
+
<q-btn @click="goToDump" label="Dump Database" color="secondary" />
|
|
13
|
+
<q-btn @click="goToCompare" label="Compare Database" color="secondary" />
|
|
14
|
+
</q-page>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script>
|
|
18
|
+
export default {
|
|
19
|
+
data() {
|
|
20
|
+
return {
|
|
21
|
+
host: '',
|
|
22
|
+
port: 3306,
|
|
23
|
+
user: '',
|
|
24
|
+
password: '',
|
|
25
|
+
database: '',
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
methods: {
|
|
29
|
+
connectToDatabase() {
|
|
30
|
+
// Logic to connect to the database using the provided credentials
|
|
31
|
+
console.log('Connecting to database:', this.host, this.port, this.user, this.password, this.database);
|
|
32
|
+
// Emit connection details to the socket server if needed
|
|
33
|
+
},
|
|
34
|
+
goToDump() {
|
|
35
|
+
this.$router.push('/dump');
|
|
36
|
+
},
|
|
37
|
+
goToCompare() {
|
|
38
|
+
this.$router.push('/compare');
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
</script>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<q-page>
|
|
3
|
+
<q-btn @click="dumpDatabase" label="Dump Database" color="primary" />
|
|
4
|
+
<q-spinner v-if="loading" />
|
|
5
|
+
<div v-if="message">{{ message }}</div>
|
|
6
|
+
</q-page>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<script>
|
|
10
|
+
import axios from 'axios';
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
data() {
|
|
14
|
+
return {
|
|
15
|
+
loading: false,
|
|
16
|
+
message: '',
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
methods: {
|
|
20
|
+
async dumpDatabase() {
|
|
21
|
+
this.loading = true;
|
|
22
|
+
try {
|
|
23
|
+
const response = await axios.post('http://localhost:3000/api/dump', {
|
|
24
|
+
config: {
|
|
25
|
+
host: this.$store.state.db.host,
|
|
26
|
+
port: this.$store.state.db.port,
|
|
27
|
+
user: this.$store.state.db.user,
|
|
28
|
+
password: this.$store.state.db.password,
|
|
29
|
+
},
|
|
30
|
+
database: this.$store.state.db.database,
|
|
31
|
+
});
|
|
32
|
+
this.message = response.data.message;
|
|
33
|
+
} catch (error) {
|
|
34
|
+
this.message = error.response.data.message;
|
|
35
|
+
} finally {
|
|
36
|
+
this.loading = false;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
</script>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="fullscreen bg-blue text-white text-center q-pa-md flex flex-center">
|
|
3
|
+
<div>
|
|
4
|
+
<div style="font-size: 30vh">
|
|
5
|
+
404
|
|
6
|
+
</div>
|
|
7
|
+
|
|
8
|
+
<div class="text-h2" style="opacity:.4">
|
|
9
|
+
Oops. Nothing here...
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<q-btn
|
|
13
|
+
class="q-mt-xl"
|
|
14
|
+
color="white"
|
|
15
|
+
text-color="blue"
|
|
16
|
+
unelevated
|
|
17
|
+
to="/"
|
|
18
|
+
label="Go Home"
|
|
19
|
+
no-caps
|
|
20
|
+
/>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</template>
|
|
24
|
+
|
|
25
|
+
<script setup>
|
|
26
|
+
//
|
|
27
|
+
</script>
|