admindb 1.0.1 → 1.1.0

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 (48) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +354 -325
  3. package/dist/db/database.d.ts +61 -39
  4. package/dist/db/database.js +251 -51
  5. package/dist/db/database.js.map +1 -1
  6. package/dist/db/manager.d.ts +2 -2
  7. package/dist/db/manager.js +3 -2
  8. package/dist/db/manager.js.map +1 -1
  9. package/dist/public/css/app.css +1 -1
  10. package/dist/public/css/input.css +232 -179
  11. package/dist/public/js/api.js +47 -47
  12. package/dist/public/js/app.js +120 -120
  13. package/dist/public/js/browse.js +877 -123
  14. package/dist/public/js/databases.js +45 -45
  15. package/dist/public/js/designer.js +205 -205
  16. package/dist/public/js/forms.js +244 -244
  17. package/dist/public/js/query.js +232 -232
  18. package/dist/public/js/schema.js +314 -314
  19. package/dist/routes/api.js +261 -97
  20. package/dist/routes/api.js.map +1 -1
  21. package/dist/routes/pages.js +50 -30
  22. package/dist/routes/pages.js.map +1 -1
  23. package/dist/sql/generator.d.ts +0 -22
  24. package/dist/sql/generator.js +0 -48
  25. package/dist/sql/generator.js.map +1 -1
  26. package/dist/test/database.test.js +241 -63
  27. package/dist/test/database.test.js.map +1 -1
  28. package/dist/test/generator.test.js +0 -32
  29. package/dist/test/generator.test.js.map +1 -1
  30. package/dist/util.d.ts +13 -1
  31. package/dist/util.js +24 -2
  32. package/dist/util.js.map +1 -1
  33. package/dist/views/layouts/main.hbs +49 -49
  34. package/dist/views/pages/databases.hbs +102 -102
  35. package/dist/views/pages/designer.hbs +81 -81
  36. package/dist/views/pages/error.hbs +12 -12
  37. package/dist/views/pages/form.hbs +62 -62
  38. package/dist/views/pages/home.hbs +123 -123
  39. package/dist/views/pages/query.hbs +94 -94
  40. package/dist/views/pages/schema.hbs +290 -290
  41. package/dist/views/pages/table.hbs +256 -203
  42. package/dist/views/partials/navbar.hbs +50 -50
  43. package/dist/views/partials/sidebar.hbs +116 -128
  44. package/package.json +66 -62
  45. package/dist/public/js/triggers.js +0 -155
  46. package/dist/public/js/views.js +0 -176
  47. package/dist/views/pages/triggers.hbs +0 -162
  48. package/dist/views/pages/views.hbs +0 -134
@@ -1,120 +1,120 @@
1
- /* Shared UI helpers: HTML escaping, toasts, theme toggle, sidebar filtering. */
2
- (function () {
3
- 'use strict';
4
-
5
- function escapeHtml(s) {
6
- return String(s == null ? '' : s)
7
- .replace(/&/g, '&')
8
- .replace(/</g, '&lt;')
9
- .replace(/>/g, '&gt;')
10
- .replace(/"/g, '&quot;')
11
- .replace(/'/g, '&#39;');
12
- }
13
-
14
- var ICONS = {
15
- error:
16
- '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg>',
17
- success:
18
- '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" /></svg>',
19
- info:
20
- '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>',
21
- warning:
22
- '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>',
23
- sun:
24
- '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" /></svg>',
25
- moon:
26
- '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z" /></svg>',
27
- };
28
-
29
- var PALETTES = {
30
- error: 'border-error/40 bg-error/10 text-error',
31
- success: 'border-success/40 bg-success/10 text-success',
32
- info: 'border-info/40 bg-info/10 text-info',
33
- warning: 'border-warning/40 bg-warning/10 text-warning',
34
- };
35
-
36
- function showToast(message, type) {
37
- var container = document.getElementById('toast-container');
38
- if (!container) return;
39
- type = type || 'info';
40
- var el = document.createElement('div');
41
- el.className =
42
- 'toast-item pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-xl border bg-base-100 px-4 py-3 shadow-lift ' +
43
- (PALETTES[type] || PALETTES.info);
44
- el.innerHTML =
45
- '<span class="mt-0.5 shrink-0">' + (ICONS[type] || ICONS.info) + '</span>' +
46
- '<span class="flex-1 text-sm font-medium text-base-content">' + escapeHtml(message) + '</span>' +
47
- '<button type="button" class="toast-close mt-0.5 shrink-0 text-base-content/40 transition-colors hover:text-base-content" aria-label="Dismiss">&times;</button>';
48
- container.appendChild(el);
49
-
50
- var remove = function () {
51
- el.style.transition = 'opacity .18s ease, transform .18s ease';
52
- el.style.opacity = '0';
53
- el.style.transform = 'translateY(-6px) scale(0.98)';
54
- setTimeout(function () { el.remove(); }, 180);
55
- };
56
- el.querySelector('.toast-close').addEventListener('click', remove);
57
- setTimeout(remove, 4200);
58
- }
59
-
60
- // ---- Theme -------------------------------------------------------------
61
-
62
- function applyTheme(dark) {
63
- document.documentElement.setAttribute('data-theme', dark ? 'admindbDark' : 'admindb');
64
- try {
65
- localStorage.setItem('admindb-theme', dark ? 'dark' : 'light');
66
- } catch (e) { /* ignore */ }
67
- var btn = document.getElementById('theme-toggle');
68
- if (btn) btn.innerHTML = dark ? ICONS.sun : ICONS.moon;
69
- }
70
-
71
- function initTheme() {
72
- var stored = null;
73
- try {
74
- stored = localStorage.getItem('admindb-theme');
75
- } catch (e) { /* ignore */ }
76
- var dark = stored === 'dark' ||
77
- (!stored && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches);
78
- applyTheme(dark);
79
- var btn = document.getElementById('theme-toggle');
80
- if (btn) {
81
- btn.addEventListener('click', function () {
82
- var current = document.documentElement.getAttribute('data-theme') === 'admindbDark';
83
- applyTheme(!current);
84
- });
85
- }
86
- }
87
-
88
- // ---- Sidebar table filter ----------------------------------------------
89
-
90
- function initTableFilter() {
91
- var input = document.getElementById('table-search');
92
- var list = document.getElementById('table-list');
93
- var countEl = document.getElementById('table-count');
94
- if (!input || !list) return;
95
- var items = Array.prototype.slice.call(list.querySelectorAll('.table-item'));
96
- input.addEventListener('input', function () {
97
- var q = input.value.trim().toLowerCase();
98
- var shown = 0;
99
- items.forEach(function (item) {
100
- var name = (item.getAttribute('data-name') || '').toLowerCase();
101
- var show = !q || name.indexOf(q) !== -1;
102
- item.style.display = show ? '' : 'none';
103
- if (show) shown += 1;
104
- });
105
- if (countEl) countEl.textContent = String(shown);
106
- });
107
- }
108
-
109
- document.addEventListener('DOMContentLoaded', function () {
110
- initTheme();
111
- initTableFilter();
112
- });
113
-
114
- window.UI = {
115
- escapeHtml: escapeHtml,
116
- showToast: showToast,
117
- showError: function (message) { showToast(message, 'error'); },
118
- applyTheme: applyTheme,
119
- };
120
- })();
1
+ /* Shared UI helpers: HTML escaping, toasts, theme toggle, sidebar filtering. */
2
+ (function () {
3
+ 'use strict';
4
+
5
+ function escapeHtml(s) {
6
+ return String(s == null ? '' : s)
7
+ .replace(/&/g, '&amp;')
8
+ .replace(/</g, '&lt;')
9
+ .replace(/>/g, '&gt;')
10
+ .replace(/"/g, '&quot;')
11
+ .replace(/'/g, '&#39;');
12
+ }
13
+
14
+ var ICONS = {
15
+ error:
16
+ '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg>',
17
+ success:
18
+ '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" /></svg>',
19
+ info:
20
+ '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>',
21
+ warning:
22
+ '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>',
23
+ sun:
24
+ '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z" /></svg>',
25
+ moon:
26
+ '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z" /></svg>',
27
+ };
28
+
29
+ var PALETTES = {
30
+ error: 'border-error/40 bg-error/10 text-error',
31
+ success: 'border-success/40 bg-success/10 text-success',
32
+ info: 'border-info/40 bg-info/10 text-info',
33
+ warning: 'border-warning/40 bg-warning/10 text-warning',
34
+ };
35
+
36
+ function showToast(message, type) {
37
+ var container = document.getElementById('toast-container');
38
+ if (!container) return;
39
+ type = type || 'info';
40
+ var el = document.createElement('div');
41
+ el.className =
42
+ 'toast-item pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-xl border bg-base-100 px-4 py-3 shadow-lift ' +
43
+ (PALETTES[type] || PALETTES.info);
44
+ el.innerHTML =
45
+ '<span class="mt-0.5 shrink-0">' + (ICONS[type] || ICONS.info) + '</span>' +
46
+ '<span class="flex-1 text-sm font-medium text-base-content">' + escapeHtml(message) + '</span>' +
47
+ '<button type="button" class="toast-close mt-0.5 shrink-0 text-base-content/40 transition-colors hover:text-base-content" aria-label="Dismiss">&times;</button>';
48
+ container.appendChild(el);
49
+
50
+ var remove = function () {
51
+ el.style.transition = 'opacity .18s ease, transform .18s ease';
52
+ el.style.opacity = '0';
53
+ el.style.transform = 'translateY(-6px) scale(0.98)';
54
+ setTimeout(function () { el.remove(); }, 180);
55
+ };
56
+ el.querySelector('.toast-close').addEventListener('click', remove);
57
+ setTimeout(remove, 4200);
58
+ }
59
+
60
+ // ---- Theme -------------------------------------------------------------
61
+
62
+ function applyTheme(dark) {
63
+ document.documentElement.setAttribute('data-theme', dark ? 'admindbDark' : 'admindb');
64
+ try {
65
+ localStorage.setItem('admindb-theme', dark ? 'dark' : 'light');
66
+ } catch (e) { /* ignore */ }
67
+ var btn = document.getElementById('theme-toggle');
68
+ if (btn) btn.innerHTML = dark ? ICONS.sun : ICONS.moon;
69
+ }
70
+
71
+ function initTheme() {
72
+ var stored = null;
73
+ try {
74
+ stored = localStorage.getItem('admindb-theme');
75
+ } catch (e) { /* ignore */ }
76
+ var dark = stored === 'dark' ||
77
+ (!stored && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches);
78
+ applyTheme(dark);
79
+ var btn = document.getElementById('theme-toggle');
80
+ if (btn) {
81
+ btn.addEventListener('click', function () {
82
+ var current = document.documentElement.getAttribute('data-theme') === 'admindbDark';
83
+ applyTheme(!current);
84
+ });
85
+ }
86
+ }
87
+
88
+ // ---- Sidebar table filter ----------------------------------------------
89
+
90
+ function initTableFilter() {
91
+ var input = document.getElementById('table-search');
92
+ var list = document.getElementById('table-list');
93
+ var countEl = document.getElementById('table-count');
94
+ if (!input || !list) return;
95
+ var items = Array.prototype.slice.call(list.querySelectorAll('.table-item'));
96
+ input.addEventListener('input', function () {
97
+ var q = input.value.trim().toLowerCase();
98
+ var shown = 0;
99
+ items.forEach(function (item) {
100
+ var name = (item.getAttribute('data-name') || '').toLowerCase();
101
+ var show = !q || name.indexOf(q) !== -1;
102
+ item.style.display = show ? '' : 'none';
103
+ if (show) shown += 1;
104
+ });
105
+ if (countEl) countEl.textContent = String(shown);
106
+ });
107
+ }
108
+
109
+ document.addEventListener('DOMContentLoaded', function () {
110
+ initTheme();
111
+ initTableFilter();
112
+ });
113
+
114
+ window.UI = {
115
+ escapeHtml: escapeHtml,
116
+ showToast: showToast,
117
+ showError: function (message) { showToast(message, 'error'); },
118
+ applyTheme: applyTheme,
119
+ };
120
+ })();