admindb 2.2.1 → 2.3.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 (87) hide show
  1. package/README.md +368 -364
  2. package/dist/app.js +6 -9
  3. package/dist/auth/config.d.ts +1 -1
  4. package/dist/auth/config.js +18 -30
  5. package/dist/auth/crypto.js +11 -21
  6. package/dist/auth/middleware.js +9 -16
  7. package/dist/auth/routes.js +9 -15
  8. package/dist/cli/args.d.ts +1 -1
  9. package/dist/cli/args.js +15 -26
  10. package/dist/cli/config.js +6 -16
  11. package/dist/cli/runner.js +4 -7
  12. package/dist/data/chain.d.ts +1 -1
  13. package/dist/data/chain.js +40 -617
  14. package/dist/data/datasets.d.ts +1 -1
  15. package/dist/data/datasets.js +43 -1
  16. package/dist/data/detector.js +45 -21
  17. package/dist/data/engine.d.ts +1 -1
  18. package/dist/data/engine.js +483 -142
  19. package/dist/data/index.d.ts +1 -1
  20. package/dist/data/index.js +8 -0
  21. package/dist/data/prng.d.ts +1 -0
  22. package/dist/data/prng.js +73 -0
  23. package/dist/data/registry.d.ts +1 -0
  24. package/dist/data/registry.js +805 -0
  25. package/dist/data/schema-graph.d.ts +1 -0
  26. package/dist/data/schema-graph.js +210 -0
  27. package/dist/data/strategies.d.ts +1 -1
  28. package/dist/data/strategies.js +44 -283
  29. package/dist/data/templates.d.ts +1 -0
  30. package/dist/data/templates.js +134 -0
  31. package/dist/data/types.d.ts +1 -1
  32. package/dist/data/validator.d.ts +1 -0
  33. package/dist/data/validator.js +160 -0
  34. package/dist/db/database.js +9 -14
  35. package/dist/db/export.js +32 -55
  36. package/dist/db/filters.d.ts +1 -1
  37. package/dist/db/filters.js +15 -38
  38. package/dist/db/introspection.js +4 -7
  39. package/dist/db/manager.js +27 -51
  40. package/dist/db/migrations.js +7 -14
  41. package/dist/db/postgres.js +30 -78
  42. package/dist/index.d.ts +1 -1
  43. package/dist/public/css/app.css +1 -1
  44. package/dist/public/js/browse.js +1 -1
  45. package/dist/public/js/inspector.js +1 -1
  46. package/dist/public/js/query.js +1 -1
  47. package/dist/public/js/seed.js +1 -1
  48. package/dist/routes/api/erd.js +3 -8
  49. package/dist/routes/api/helpers.d.ts +1 -1
  50. package/dist/routes/api/helpers.js +75 -25
  51. package/dist/routes/api/import-export.js +1 -2
  52. package/dist/routes/api/query.js +2 -6
  53. package/dist/routes/api/rows.js +4 -8
  54. package/dist/routes/api/seed.js +35 -21
  55. package/dist/routes/api/tables.js +15 -30
  56. package/dist/routes/databases.js +8 -26
  57. package/dist/routes/pages.js +67 -18
  58. package/dist/serverless.js +15 -40
  59. package/dist/sql/generator.d.ts +1 -1
  60. package/dist/sql/generator.js +35 -109
  61. package/dist/types/api.d.ts +1 -1
  62. package/dist/utils/common.d.ts +1 -1
  63. package/dist/utils/common.js +45 -85
  64. package/dist/utils/csv.d.ts +1 -1
  65. package/dist/utils/csv.js +11 -17
  66. package/dist/utils/datatype.js +46 -60
  67. package/dist/utils/icons.js +8 -8
  68. package/dist/views/layouts/main.hbs +1 -87
  69. package/dist/views/pages/databases.hbs +1 -233
  70. package/dist/views/pages/designer.hbs +1 -89
  71. package/dist/views/pages/erd.hbs +1 -1241
  72. package/dist/views/pages/error.hbs +1 -10
  73. package/dist/views/pages/form.hbs +1 -59
  74. package/dist/views/pages/home.hbs +1 -220
  75. package/dist/views/pages/info.hbs +1 -107
  76. package/dist/views/pages/login.hbs +1 -98
  77. package/dist/views/pages/query.hbs +1 -129
  78. package/dist/views/pages/schema.hbs +1 -298
  79. package/dist/views/pages/seed-select.hbs +251 -0
  80. package/dist/views/pages/seed.hbs +256 -414
  81. package/dist/views/pages/table.hbs +1 -327
  82. package/dist/views/partials/navbar.hbs +1 -83
  83. package/dist/views/partials/sidebar.hbs +1 -129
  84. package/docs/API.md +149 -149
  85. package/docs/EXAMPLES.md +579 -579
  86. package/docs/SECURITY.md +265 -265
  87. package/package.json +79 -79
@@ -1,129 +1 @@
1
- <div class="space-y-6">
2
- <div class="flex flex-wrap items-center justify-between gap-3">
3
- <div>
4
- <p class="text-sm font-semibold uppercase tracking-wider text-primary">Workspace</p>
5
- <h1 class="mt-1 text-3xl font-extrabold tracking-tight">Query editor</h1>
6
- <p class="mt-1.5 text-sm text-base-content/55">Run arbitrary SQL — SELECT results render as a table, COUNT gives a summary, and write statements execute.</p>
7
- </div>
8
- <div class="flex flex-wrap gap-2">
9
- {{#unless readonly}}
10
- <button id="save-query" type="button" class="btn btn-outline btn-sm gap-1.5">
11
- {{{icon "save" class="h-4 w-4"}}}
12
- Save query
13
- </button>
14
- {{/unless}}
15
- <button id="run-query" type="button" class="btn btn-primary btn-sm gap-1.5">
16
- {{{icon "run" class="h-4 w-4"}}}
17
- Run
18
- </button>
19
- </div>
20
- </div>
21
- <div class="flex flex-wrap items-end gap-3">
22
- <div class="form-control w-full max-w-xs">
23
- <label class="field-label" for="saved-query-select">Saved queries</label>
24
- <select id="saved-query-select" class="field-select">
25
- <option value="">— select a saved query —</option>
26
- {{#each savedQueries}}
27
- <option value="{{this.id}}">{{this.name}}</option>
28
- {{/each}}
29
- </select>
30
- </div>
31
- {{#unless readonly}}
32
- <button id="delete-query" type="button" class="btn btn-ghost btn-sm mb-0.5 text-error" disabled>Delete saved</button>
33
- <div class="form-control w-full max-w-xs">
34
- <label class="field-label" for="save-query-name">Save current SQL as</label>
35
- <div class="join w-full">
36
- <input id="save-query-name" type="text" class="field-input join-item !rounded-r-none" placeholder="query name" autocomplete="off" />
37
- <button id="save-query-inline" type="button" class="btn btn-outline join-item">Save</button>
38
- </div>
39
- </div>
40
- {{/unless}}
41
- </div>
42
- <div class="app-card overflow-hidden">
43
- <div class="flex flex-wrap items-center justify-between gap-2 border-b border-base-200 bg-base-200/40 px-4 py-2">
44
- <div class="flex items-center gap-2">
45
- <span class="flex items-center gap-1.5 text-xs font-semibold text-base-content/70">
46
- <span class="grid h-5 w-5 place-items-center rounded bg-primary/10 text-primary">
47
- {{{icon "query" class="h-3.5 w-3.5"}}}
48
- </span>
49
- query.sql
50
- </span>
51
- <span class="badge badge-sm badge-ghost font-mono text-[10px] uppercase font-bold">{{#if isPostgres}}Postgres{{else}}SQLite{{/if}}</span>
52
- </div>
53
- <div class="flex flex-wrap items-center gap-1.5">
54
- <div class="dropdown dropdown-end">
55
- <label tabindex="0" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary">
56
- {{{icon "terminal" class="h-3.5 w-3.5"}}}
57
- Snippets
58
- </label>
59
- <ul tabindex="0" class="dropdown-content z-30 menu p-1.5 shadow-2xl bg-base-100 rounded-xl w-56 border border-base-300 text-xs">
60
- <li class="menu-title text-[10px] uppercase tracking-wider text-base-content/40">Query Templates</li>
61
- <li><a class="js-snippet" data-snippet="SELECT * FROM table_name\nWHERE condition\nORDER BY id DESC\nLIMIT 50;">SELECT rows</a></li>
62
- <li><a class="js-snippet" data-snippet="SELECT COUNT(*) AS total\nFROM table_name;">COUNT summary</a></li>
63
- <li><a class="js-snippet" data-snippet="SELECT a.*, b.*\nFROM table_a a\nJOIN table_b b ON b.a_id = a.id\nLIMIT 50;">JOIN tables</a></li>
64
- <li><a class="js-snippet" data-snippet="INSERT INTO table_name (col1, col2)\nVALUES ('value1', 'value2');">INSERT row</a></li>
65
- <li><a class="js-snippet" data-snippet="UPDATE table_name\nSET col1 = 'value1'\nWHERE id = 1;">UPDATE row</a></li>
66
- <li><a class="js-snippet" data-snippet="DELETE FROM table_name\nWHERE id = 1;">DELETE row</a></li>
67
- <li><a class="js-snippet" data-snippet="CREATE TABLE new_table (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n);">CREATE TABLE</a></li>
68
- </ul>
69
- </div>
70
- <button id="format-query" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" title="Format SQL (Beautify)">
71
- {{{icon "format" class="h-3.5 w-3.5"}}}
72
- Format
73
- </button>
74
- <button id="copy-query" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" title="Copy SQL to clipboard">
75
- {{{icon "copy" class="h-3.5 w-3.5"}}}
76
- Copy
77
- </button>
78
- <button id="clear-query" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-error" title="Clear editor">
79
- {{{icon "trash" class="h-3.5 w-3.5"}}}
80
- Clear
81
- </button>
82
- <span class="hidden sm:inline-block text-[11px] text-base-content/35 border-l border-base-300 pl-2">Ctrl/⌘ + Enter to run</span>
83
- </div>
84
- </div>
85
- <div class="sql-editor-wrap">
86
- <div id="query-gutter" class="sql-gutter" aria-hidden="true">
87
- <div class="sql-gutter-line">1</div>
88
- </div>
89
- <div id="query-sql" class="sql-code-editor" contenteditable="plaintext-only" spellcheck="false" data-placeholder="-- Write SQL here or choose a snippet/saved query&#10;SELECT * FROM table_name WHERE …"></div>
90
- </div>
91
- <div class="flex items-center justify-between border-t border-base-200 bg-base-200/30 px-3.5 py-1.5 text-[11px] font-mono text-base-content/50">
92
- <div class="flex items-center gap-3">
93
- <span id="editor-cursor-pos">Ln 1, Col 1</span>
94
- <span id="editor-stats">0 chars</span>
95
- </div>
96
- <div class="flex items-center gap-2">
97
- <span class="text-[10px] text-base-content/40">Tab to indent · Ctrl+Z / Ctrl+Y to undo/redo · Ctrl+/ to comment</span>
98
- </div>
99
- </div>
100
- <div id="query-message" class="p-3"></div>
101
- </div>
102
- <div id="query-result" class="hidden">
103
- <div class="app-card overflow-hidden">
104
- <div class="flex items-center gap-2 border-b border-base-200 px-4 py-3">
105
- <span id="result-kind" class="grid h-6 w-6 place-items-center rounded-md bg-success/10 text-success">
106
- {{{icon "check" class="h-4 w-4"}}}
107
- </span>
108
- <span id="result-summary" class="text-sm font-medium text-base-content/60"></span>
109
- <div class="ml-auto flex items-center gap-1.5">
110
- <button id="export-csv" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" disabled>
111
- {{{icon "export" class="h-3.5 w-3.5"}}}
112
- CSV
113
- </button>
114
- <button id="export-json" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" disabled>
115
- {{{icon "export" class="h-3.5 w-3.5"}}}
116
- JSON
117
- </button>
118
- </div>
119
- </div>
120
- <div class="overflow-x-auto">
121
- <table class="table table-sm table-pin-rows">
122
- <thead id="query-result-head" class="bg-base-200/70 text-xs uppercase tracking-wide text-base-content/50"></thead>
123
- <tbody id="query-result-body"></tbody>
124
- </table>
125
- </div>
126
- </div>
127
- </div>
128
- </div>
129
- <script src="{{basePath}}/js/query.js" defer></script>
1
+ <div class="space-y-6">
130
2
  <div class="page-header">
131
3
  <div class="page-header-row">
132
4
  <div>
133
5
  <div class="page-pretitle">Workspace</div>
134
6
  <h1 class="page-title">Query editor</h1>
135
7
  <p class="mt-0.5 text-xs text-base-content/60">Run arbitrary SQL — SELECT results render as a table, COUNT gives a summary, and write statements execute.</p>
136
8
  </div>
137
9
  <div class="page-actions">
138
10
  {{#unless readonly}}
139
11
  <button id="save-query" type="button" class="btn btn-outline btn-sm gap-1.5">
140
12
  {{{icon "save" class="h-4 w-4"}}}
141
13
  Save query
142
14
  </button>
143
15
  {{/unless}}
144
16
  <button id="run-query" type="button" class="btn btn-primary btn-sm gap-1.5">
145
17
  {{{icon "run" class="h-4 w-4"}}}
146
18
  Run query
147
19
  </button>
148
20
  </div>
149
21
  </div>
150
22
  </div>
151
23
  <div class="flex flex-wrap items-end gap-3">
152
24
  <div class="form-control w-full max-w-xs">
153
25
  <label class="field-label" for="saved-query-select">Saved queries</label>
154
26
  <select id="saved-query-select" class="field-select">
155
27
  <option value="">— select a saved query —</option>
156
28
  {{#each savedQueries}}
157
29
  <option value="{{this.id}}">{{this.name}}</option>
158
30
  {{/each}}
159
31
  </select>
160
32
  </div>
161
33
  {{#unless readonly}}
162
34
  <button id="delete-query" type="button" class="btn btn-ghost btn-sm mb-0.5 text-error" disabled>Delete saved</button>
163
35
  <div class="form-control w-full max-w-xs">
164
36
  <label class="field-label" for="save-query-name">Save current SQL as</label>
165
37
  <div class="join w-full">
166
38
  <input id="save-query-name" type="text" class="field-input join-item !rounded-r-none" placeholder="query name" autocomplete="off" />
167
39
  <button id="save-query-inline" type="button" class="btn btn-outline join-item">Save</button>
168
40
  </div>
169
41
  </div>
170
42
  {{/unless}}
171
43
  </div>
172
44
  <div class="app-card overflow-hidden">
173
45
  <div class="flex flex-wrap items-center justify-between gap-2 border-b border-base-200 bg-base-200/40 px-4 py-2">
174
46
  <div class="flex items-center gap-2">
175
47
  <span class="flex items-center gap-1.5 text-xs font-semibold text-base-content/70">
176
48
  <span class="grid h-5 w-5 place-items-center rounded bg-primary/10 text-primary">
177
49
  {{{icon "query" class="h-3.5 w-3.5"}}}
178
50
  </span>
179
51
  query.sql
180
52
  </span>
181
53
  <span class="badge badge-sm badge-ghost font-mono text-[10px] uppercase font-bold">{{#if isPostgres}}Postgres{{else}}SQLite{{/if}}</span>
182
54
  </div>
183
55
  <div class="flex flex-wrap items-center gap-1.5">
184
56
  <div class="dropdown dropdown-end">
185
57
  <label tabindex="0" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary">
186
58
  {{{icon "terminal" class="h-3.5 w-3.5"}}}
187
59
  Snippets
188
60
  </label>
189
61
  <ul tabindex="0" class="dropdown-content z-30 menu p-1.5 shadow-2xl bg-base-100 rounded-xl w-56 border border-base-300 text-xs">
190
62
  <li class="menu-title text-[10px] uppercase tracking-wider text-base-content/40">Query Templates</li>
191
63
  <li><a class="js-snippet" data-snippet="SELECT * FROM table_name\nWHERE condition\nORDER BY id DESC\nLIMIT 50;">SELECT rows</a></li>
192
64
  <li><a class="js-snippet" data-snippet="SELECT COUNT(*) AS total\nFROM table_name;">COUNT summary</a></li>
193
65
  <li><a class="js-snippet" data-snippet="SELECT a.*, b.*\nFROM table_a a\nJOIN table_b b ON b.a_id = a.id\nLIMIT 50;">JOIN tables</a></li>
194
66
  <li><a class="js-snippet" data-snippet="INSERT INTO table_name (col1, col2)\nVALUES ('value1', 'value2');">INSERT row</a></li>
195
67
  <li><a class="js-snippet" data-snippet="UPDATE table_name\nSET col1 = 'value1'\nWHERE id = 1;">UPDATE row</a></li>
196
68
  <li><a class="js-snippet" data-snippet="DELETE FROM table_name\nWHERE id = 1;">DELETE row</a></li>
197
69
  <li><a class="js-snippet" data-snippet="CREATE TABLE new_table (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n);">CREATE TABLE</a></li>
198
70
  </ul>
199
71
  </div>
200
72
  <button id="format-query" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" title="Format SQL (Beautify)">
201
73
  {{{icon "format" class="h-3.5 w-3.5"}}}
202
74
  Format
203
75
  </button>
204
76
  <button id="copy-query" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" title="Copy SQL to clipboard">
205
77
  {{{icon "copy" class="h-3.5 w-3.5"}}}
206
78
  Copy
207
79
  </button>
208
80
  <button id="clear-query" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-error" title="Clear editor">
209
81
  {{{icon "trash" class="h-3.5 w-3.5"}}}
210
82
  Clear
211
83
  </button>
212
84
  <span class="hidden sm:inline-block text-[11px] text-base-content/35 border-l border-base-300 pl-2">Ctrl/⌘ + Enter to run</span>
213
85
  </div>
214
86
  </div>
215
87
  <div class="sql-editor-wrap">
216
88
  <div id="query-gutter" class="sql-gutter" aria-hidden="true">
217
89
  <div class="sql-gutter-line">1</div>
218
90
  </div>
219
91
  <div class="sql-editor-stage">
220
92
  <pre id="query-highlight" class="sql-code-highlight" aria-hidden="true"><code id="query-code"></code></pre>
221
93
  <textarea id="query-sql" class="sql-code-input" spellcheck="false" autocomplete="off" autocorrect="off" autocapitalize="off" placeholder="-- Write SQL here or choose a snippet/saved query&#10;SELECT * FROM table_name WHERE …"></textarea>
222
94
  </div>
223
95
  </div>
224
96
  <div class="flex items-center justify-between border-t border-base-200 bg-base-200/30 px-3.5 py-1.5 text-[11px] font-mono text-base-content/50">
225
97
  <div class="flex items-center gap-3">
226
98
  <span id="editor-cursor-pos">Ln 1, Col 1</span>
227
99
  <span id="editor-stats">0 chars</span>
228
100
  </div>
229
101
  <div class="flex items-center gap-2">
230
102
  <span class="text-[10px] text-base-content/40">Tab to indent · Ctrl+Z / Ctrl+Y to undo/redo · Ctrl+/ to comment</span>
231
103
  </div>
232
104
  </div>
233
105
  <div id="query-message" class="p-3"></div>
234
106
  </div>
235
107
  <div id="query-result" class="hidden">
236
108
  <div class="app-card overflow-hidden">
237
109
  <div class="flex items-center gap-2 border-b border-base-200 px-4 py-3">
238
110
  <span id="result-kind" class="grid h-6 w-6 place-items-center rounded-md bg-success/10 text-success">
239
111
  {{{icon "check" class="h-4 w-4"}}}
240
112
  </span>
241
113
  <span id="result-summary" class="text-sm font-medium text-base-content/60"></span>
242
114
  <div class="ml-auto flex items-center gap-1.5">
243
115
  <button id="export-csv" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" disabled>
244
116
  {{{icon "export" class="h-3.5 w-3.5"}}}
245
117
  CSV
246
118
  </button>
247
119
  <button id="export-json" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" disabled>
248
120
  {{{icon "export" class="h-3.5 w-3.5"}}}
249
121
  JSON
250
122
  </button>
251
123
  </div>
252
124
  </div>
253
125
  <div class="overflow-x-auto">
254
126
  <table class="table table-sm table-pin-rows">
255
127
  <thead id="query-result-head" class="bg-base-200/70 text-xs uppercase tracking-wide text-base-content/50"></thead>
256
128
  <tbody id="query-result-body"></tbody>
257
129
  </table>
258
130
  </div>
259
131
  </div>
260
132
  </div>