mysqlsyncr 1.0.4 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/package.json +7 -2
  2. package/src/apply.js +21 -15
  3. package/src/cli.js +3 -2
  4. package/src/differences.js +45 -22
  5. package/src/dump.js +37 -1
  6. package/src/index.js +58 -40
  7. package/src/parsers.js +2 -1
  8. package/src/socketServer.js +96 -0
  9. package/ui/.editorconfig +7 -0
  10. package/ui/.prettierrc.json +6 -0
  11. package/ui/README.md +40 -0
  12. package/ui/dist/spa/assets/KFOkCnqEu92Fr1MmgVxIIzQ-Y2mpUUkw.woff +0 -0
  13. package/ui/dist/spa/assets/KFOlCnqEu92Fr1MmEU9fBBc--ViM7Ag4Q.woff +0 -0
  14. package/ui/dist/spa/assets/KFOlCnqEu92Fr1MmSU5fBBc--CrFzpgl6.woff +0 -0
  15. package/ui/dist/spa/assets/KFOlCnqEu92Fr1MmWUlfBBc--CW3_XjG_.woff +0 -0
  16. package/ui/dist/spa/assets/KFOlCnqEu92Fr1MmYUtfBBc--Dr8fnyGc.woff +0 -0
  17. package/ui/dist/spa/assets/KFOmCnqEu92Fr1Mu4mxM-DAYh6T4l.woff +0 -0
  18. package/ui/dist/spa/assets/MainLayout-C27l9N4F.js +1 -0
  19. package/ui/dist/spa/assets/axios-Y2H2Igoj.js +1 -0
  20. package/ui/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNa-Dr0goTwe.woff +0 -0
  21. package/ui/dist/spa/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ-D-x-0Q06.woff2 +0 -0
  22. package/ui/dist/spa/assets/index-DKK0oGss.js +30 -0
  23. package/ui/dist/spa/assets/index-DME6fUxJ.css +5 -0
  24. package/ui/dist/spa/favicon.ico +0 -0
  25. package/ui/dist/spa/icons/favicon-128x128.png +0 -0
  26. package/ui/dist/spa/icons/favicon-16x16.png +0 -0
  27. package/ui/dist/spa/icons/favicon-32x32.png +0 -0
  28. package/ui/dist/spa/icons/favicon-96x96.png +0 -0
  29. package/ui/dist/spa/index.html +3 -0
  30. package/ui/eslint.config.js +73 -0
  31. package/ui/index.html +21 -0
  32. package/ui/jsconfig.json +3 -0
  33. package/ui/package.json +42 -0
  34. package/ui/postcss.config.js +29 -0
  35. package/ui/public/favicon.ico +0 -0
  36. package/ui/public/icons/favicon-128x128.png +0 -0
  37. package/ui/public/icons/favicon-16x16.png +0 -0
  38. package/ui/public/icons/favicon-32x32.png +0 -0
  39. package/ui/public/icons/favicon-96x96.png +0 -0
  40. package/ui/quasar.config.js +215 -0
  41. package/ui/src/App.vue +7 -0
  42. package/ui/src/assets/quasar-logo-vertical.svg +15 -0
  43. package/ui/src/boot/.gitkeep +0 -0
  44. package/ui/src/boot/axios.js +24 -0
  45. package/ui/src/components/EssentialLink.vue +44 -0
  46. package/ui/src/css/app.scss +1 -0
  47. package/ui/src/css/quasar.variables.scss +25 -0
  48. package/ui/src/layouts/MainLayout.vue +13 -0
  49. package/ui/src/pages/ApplyChanges.vue +46 -0
  50. package/ui/src/pages/CompareDatabase.vue +57 -0
  51. package/ui/src/pages/DatabaseManager.vue +42 -0
  52. package/ui/src/pages/DumpDatabase.vue +41 -0
  53. package/ui/src/pages/ErrorNotFound.vue +27 -0
  54. package/ui/src/pages/MainComponent copy.vue +322 -0
  55. package/ui/src/pages/MainComponent.vue +894 -0
  56. package/ui/src/router/index.js +30 -0
  57. package/ui/src/router/routes.js +20 -0
  58. package/ui/src/stores/example-store.js +21 -0
  59. package/ui/src/stores/index.js +20 -0
@@ -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
@@ -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,7 @@
1
+ <template>
2
+ <router-view />
3
+ </template>
4
+
5
+ <script setup>
6
+ //
7
+ </script>
@@ -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,13 @@
1
+ <template>
2
+ <q-layout view="lHh Lpr lFf">
3
+
4
+
5
+ <q-page-container>
6
+ <router-view />
7
+ </q-page-container>
8
+ </q-layout>
9
+ </template>
10
+
11
+ <script setup>
12
+
13
+ </script>
@@ -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>