admindb 2.4.0 → 2.5.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 (135) hide show
  1. package/LICENSE +20 -20
  2. package/dist/app.js +36 -25
  3. package/dist/core/context.d.ts +1 -0
  4. package/dist/core/context.js +2 -0
  5. package/dist/core/errors.d.ts +1 -0
  6. package/dist/core/errors.js +39 -0
  7. package/dist/core/index.d.ts +1 -0
  8. package/dist/core/index.js +20 -0
  9. package/dist/core/result.d.ts +1 -0
  10. package/dist/core/result.js +10 -0
  11. package/dist/core/router.d.ts +1 -0
  12. package/dist/core/router.js +37 -0
  13. package/dist/data/chain.js +1 -1
  14. package/dist/data/engine.js +1 -1
  15. package/dist/db/database.d.ts +1 -1
  16. package/dist/db/database.js +9 -31
  17. package/dist/db/dialects/index.d.ts +1 -0
  18. package/dist/db/dialects/index.js +58 -0
  19. package/dist/db/dialects/postgres/ddl.d.ts +1 -0
  20. package/dist/db/dialects/postgres/ddl.js +107 -0
  21. package/dist/db/dialects/postgres/dialect.d.ts +1 -0
  22. package/dist/db/dialects/postgres/dialect.js +28 -0
  23. package/dist/db/dialects/postgres/introspector.d.ts +1 -0
  24. package/dist/db/dialects/postgres/introspector.js +265 -0
  25. package/dist/db/dialects/postgres/types.d.ts +1 -0
  26. package/dist/db/dialects/postgres/types.js +83 -0
  27. package/dist/db/dialects/sqlite/ddl.d.ts +1 -0
  28. package/dist/db/dialects/sqlite/ddl.js +244 -0
  29. package/dist/db/dialects/sqlite/dialect.d.ts +1 -0
  30. package/dist/db/dialects/sqlite/dialect.js +25 -0
  31. package/dist/db/dialects/sqlite/introspector.d.ts +1 -0
  32. package/dist/db/dialects/sqlite/introspector.js +214 -0
  33. package/dist/db/dialects/sqlite/types.d.ts +1 -0
  34. package/dist/db/dialects/sqlite/types.js +69 -0
  35. package/dist/db/dialects/types.d.ts +1 -0
  36. package/dist/db/dialects/types.js +15 -0
  37. package/dist/db/export.js +1 -1
  38. package/dist/db/index.d.ts +1 -1
  39. package/dist/db/index.js +1 -1
  40. package/dist/db/manager.d.ts +1 -1
  41. package/dist/db/manager.js +101 -21
  42. package/dist/db/postgres.d.ts +1 -1
  43. package/dist/db/postgres.js +20 -284
  44. package/dist/db/types.d.ts +1 -1
  45. package/dist/db/types.js +0 -4
  46. package/dist/index.d.ts +1 -1
  47. package/dist/index.js +4 -1
  48. package/dist/modules/databases/databases.routes.d.ts +1 -0
  49. package/dist/modules/databases/databases.routes.js +150 -0
  50. package/dist/modules/databases/databases.service.d.ts +1 -0
  51. package/dist/modules/databases/databases.service.js +134 -0
  52. package/dist/modules/databases/index.d.ts +1 -0
  53. package/dist/{routes → modules/databases}/index.js +2 -3
  54. package/dist/modules/erd/erd.routes.d.ts +1 -0
  55. package/dist/modules/erd/erd.routes.js +32 -0
  56. package/dist/modules/erd/erd.service.d.ts +1 -0
  57. package/dist/modules/erd/erd.service.js +39 -0
  58. package/dist/modules/erd/index.d.ts +1 -0
  59. package/dist/modules/erd/index.js +18 -0
  60. package/dist/modules/index.d.ts +1 -0
  61. package/dist/modules/index.js +62 -0
  62. package/dist/modules/query/index.d.ts +1 -0
  63. package/dist/modules/query/index.js +18 -0
  64. package/dist/modules/query/query.routes.d.ts +1 -0
  65. package/dist/modules/query/query.routes.js +54 -0
  66. package/dist/modules/query/query.service.d.ts +1 -0
  67. package/dist/modules/query/query.service.js +95 -0
  68. package/dist/modules/rows/blob.helper.d.ts +1 -0
  69. package/dist/modules/rows/blob.helper.js +40 -0
  70. package/dist/modules/rows/display.helper.d.ts +1 -0
  71. package/dist/modules/rows/display.helper.js +73 -0
  72. package/dist/modules/rows/index.d.ts +1 -0
  73. package/dist/modules/rows/index.js +20 -0
  74. package/dist/modules/rows/rows.routes.d.ts +1 -0
  75. package/dist/modules/rows/rows.routes.js +555 -0
  76. package/dist/modules/rows/rows.service.d.ts +1 -0
  77. package/dist/modules/rows/rows.service.js +433 -0
  78. package/dist/modules/schema/index.d.ts +1 -0
  79. package/dist/modules/schema/index.js +18 -0
  80. package/dist/modules/schema/schema.routes.d.ts +1 -0
  81. package/dist/modules/schema/schema.routes.js +171 -0
  82. package/dist/modules/schema/schema.service.d.ts +1 -0
  83. package/dist/modules/schema/schema.service.js +58 -0
  84. package/dist/modules/seed/index.d.ts +1 -0
  85. package/dist/modules/seed/index.js +18 -0
  86. package/dist/modules/seed/seed.routes.d.ts +1 -0
  87. package/dist/modules/seed/seed.routes.js +212 -0
  88. package/dist/modules/seed/seed.service.d.ts +1 -0
  89. package/dist/{routes/api/helpers.js → modules/seed/seed.service.js} +86 -109
  90. package/dist/modules/tables/index.d.ts +1 -0
  91. package/dist/modules/tables/index.js +18 -0
  92. package/dist/modules/tables/tables.routes.d.ts +1 -0
  93. package/dist/modules/tables/tables.routes.js +194 -0
  94. package/dist/modules/tables/tables.service.d.ts +1 -0
  95. package/dist/modules/tables/tables.service.js +218 -0
  96. package/dist/public/js/browse.js +1 -1
  97. package/dist/public/js/query.js +1 -1
  98. package/dist/types/api.d.ts +1 -1
  99. package/dist/utils/common.d.ts +1 -1
  100. package/dist/utils/common.js +1 -3
  101. package/dist/utils/stream.d.ts +1 -0
  102. package/dist/utils/stream.js +131 -0
  103. package/dist/views/pages/error.hbs +10 -1
  104. package/dist/views/pages/home.hbs +1 -1
  105. package/dist/views/pages/query.hbs +1 -1
  106. package/dist/views/pages/seed-select.hbs +1 -252
  107. package/dist/views/pages/seed.hbs +1 -307
  108. package/dist/views/pages/table.hbs +1 -1
  109. package/dist/views/partials/sidebar.hbs +1 -1
  110. package/docs/API.md +4 -17
  111. package/docs/EXAMPLES.md +579 -579
  112. package/docs/SECURITY.md +265 -265
  113. package/package.json +4 -2
  114. package/dist/db/introspection.d.ts +0 -1
  115. package/dist/db/introspection.js +0 -164
  116. package/dist/routes/api/erd.d.ts +0 -1
  117. package/dist/routes/api/erd.js +0 -45
  118. package/dist/routes/api/helpers.d.ts +0 -1
  119. package/dist/routes/api/import-export.d.ts +0 -1
  120. package/dist/routes/api/import-export.js +0 -84
  121. package/dist/routes/api/index.d.ts +0 -1
  122. package/dist/routes/api/index.js +0 -55
  123. package/dist/routes/api/query.d.ts +0 -1
  124. package/dist/routes/api/query.js +0 -77
  125. package/dist/routes/api/rows.d.ts +0 -1
  126. package/dist/routes/api/rows.js +0 -373
  127. package/dist/routes/api/seed.d.ts +0 -1
  128. package/dist/routes/api/seed.js +0 -180
  129. package/dist/routes/api/tables.d.ts +0 -1
  130. package/dist/routes/api/tables.js +0 -230
  131. package/dist/routes/databases.d.ts +0 -1
  132. package/dist/routes/databases.js +0 -212
  133. package/dist/routes/index.d.ts +0 -1
  134. package/dist/routes/pages.d.ts +0 -1
  135. package/dist/routes/pages.js +0 -540
@@ -1 +1 @@
1
- <aside class="flex h-full min-h-full w-72 flex-col bg-neutral text-neutral-content">
2
1
  <div class="flex items-center gap-2.5 px-5 pb-4 pt-5">
3
2
  <div class="w-full">
4
3
  <div class="flex items-center justify-between">
5
4
  <div class="font-headings text-base font-bold leading-tight">AdminDB <span style="font-size: x-small" class="font-sans font-normal opacity-70">{{#if version}}v{{version}}{{/if}}</span></div>
6
5
  {{#unless databasesMode}}
7
6
  {{#if isPostgres}}
8
7
  <span class="rounded bg-info/20 px-1.5 py-0.5 text-[10px] font-bold text-info">PostgreSQL</span>
9
8
  {{else}}
10
9
  <span class="rounded bg-emerald-500/20 px-1.5 py-0.5 text-[10px] font-bold text-emerald-400">SQLite</span>
11
10
  {{/if}}
12
11
  {{/unless}}
13
12
  </div>
14
13
  <div class="mt-0.5 text-[11px] text-neutral-content/50 truncate">{{#if databasesMode}}Database manager{{else}}{{dbId}}{{/if}}</div>
15
14
  </div>
16
15
  </div>
17
16
  {{#if databasesMode}}
18
17
  <nav class="flex-1 overflow-y-auto px-3 py-2">
19
18
  <ul class="space-y-0.5">
20
19
  <li>
21
20
  <a href="{{basePath}}/" class="side-link active">
22
21
  {{{icon "database" class="h-4 w-4"}}}
23
22
  Databases
24
23
  </a>
25
24
  </li>
26
25
  </ul>
27
26
  </nav>
28
27
  {{else}}
29
28
  <div class="px-4 pb-2">
30
29
  <label class="relative block">
31
30
  <span class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-neutral-content/40">
32
31
  {{{icon "search" class="h-4 w-4"}}}
33
32
  </span>
34
33
  <input id="table-search" type="search" placeholder="Filter tables…" autocomplete="off"
35
34
  class="w-full rounded-lg border border-white/10 bg-white/[0.06] py-2 pl-9 pr-3 text-sm text-neutral-content outline-none transition placeholder:text-neutral-content/40 focus:border-primary/70 focus:ring-4 focus:ring-primary/20" />
36
35
  </label>
37
36
  </div>
38
37
  <nav class="flex-1 overflow-y-auto px-3 py-2">
39
38
  <ul class="space-y-0.5">
40
39
  {{#if databasesUrl}}
41
40
  <li>
42
41
  <a href="{{databasesUrl}}" class="side-link">
43
42
  {{{icon "database" class="h-4 w-4"}}}
44
43
  Databases
45
44
  </a>
46
45
  </li>
47
46
  {{/if}}
48
47
  <li>
49
48
  <a href="{{basePath}}/home/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/home')}}active{{/if}}">
50
49
  {{{icon "home" class="h-4 w-4"}}}
51
50
  Home
52
51
  </a>
53
52
  </li>
54
53
  <li>
55
54
  <a href="{{basePath}}/query/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/query')}}active{{/if}}">
56
55
  {{{icon "query" class="h-4 w-4"}}}
57
56
  Query editor
58
57
  </a>
59
58
  </li>
60
59
  <li>
61
60
  <a href="{{basePath}}/erd/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/erd')}}active{{/if}}">
62
61
  {{{icon "diagram" class="h-4 w-4"}}}
63
62
  ER Diagram
64
63
  </a>
65
64
  </li>
66
65
  <li>
67
66
  <a href="{{basePath}}/seed/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/seed')}}active{{/if}}">
68
67
  {{{icon "seed" class="h-4 w-4"}}}
69
68
  Seed generator
70
69
  </a>
71
70
  </li>
72
71
  <li>
73
72
  <a href="{{basePath}}/info/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/info')}}active{{/if}}">
74
73
  {{{icon "settings" class="h-4 w-4"}}}
75
74
  Info & Settings
76
75
  </a>
77
76
  </li>
78
77
  {{#unless readonly}}
79
78
  <li>
80
79
  <a href="{{basePath}}/designer/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/designer')}}active{{/if}}">
81
80
  {{{icon "plus" class="h-4 w-4"}}}
82
81
  New table
83
82
  </a>
84
83
  </li>
85
84
  {{/unless}}
86
85
  </ul>
87
86
  <div class="mb-2 mt-6 flex items-center justify-between px-3">
88
87
  <span class="text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Tables</span>
89
88
  <span id="table-count" class="rounded-md bg-white/[0.06] px-1.5 py-0.5 text-[10px] font-semibold text-neutral-content/50">{{tables.length}}</span>
90
89
  </div>
91
90
  <ul id="table-list" class="space-y-0.5">
92
91
  {{#each tables}}
93
92
  <li class="table-item" data-name="{{tableName this}}">
94
93
  <a href="{{../basePath}}/tables/{{encodeUri ../dbId}}/{{encodeUri (tableName this)}}" class="side-link {{#if (eq ../currentTable (tableName this))}}active{{/if}}">
95
94
  <span class="table-icon">
96
95
  {{{icon "table" class="h-4 w-4"}}}
97
96
  </span>
98
97
  <span class="truncate">{{tableName this}}</span>
99
98
  </a>
100
99
  </li>
101
100
  {{else}}
102
101
  <li class="px-3 py-2 text-xs text-neutral-content/40">No tables yet</li>
103
102
  {{/each}}
104
103
  </ul>
105
104
  {{#if internalTables.length}}
106
105
  <div class="mb-2 mt-6 px-3 text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Internal</div>
107
106
  <ul class="space-y-0.5">
108
107
  {{#each internalTables}}
109
108
  <li>
110
109
  <a href="{{../basePath}}/tables/{{encodeUri ../dbId}}/{{encodeUri this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
111
110
  <span class="table-icon">
112
111
  {{{icon "book" class="h-4 w-4"}}}
113
112
  </span>
114
113
  <span class="truncate">{{this}}</span>
115
114
  </a>
116
115
  </li>
117
116
  {{/each}}
118
117
  </ul>
119
118
  {{/if}}
120
119
  </nav>
121
120
  {{/if}}
122
121
  {{#if isDefaultPassword}}
123
122
  <div class="border-t border-white/10 px-4 py-2 bg-warning/10">
124
123
  <div class="flex items-center justify-between text-warning text-xs font-semibold">
125
124
  <span class="flex items-center gap-1.5 font-mono text-[11px]">
126
125
  {{{icon "warning" class="h-3.5 w-3.5 shrink-0"}}}
127
126
  default pass active
128
127
  </span>
129
128
  <span class="badge badge-warning badge-xs font-mono font-bold">admin</span>
130
129
  </div>
131
130
  </div>
132
131
  {{/if}}
133
132
  <div class="border-t border-white/10 px-5 py-3">
134
133
  <div class="flex items-center justify-between">
135
134
  <div class="text-[11px] font-medium uppercase tracking-wider text-neutral-content/40">{{#if databasesMode}}Directory{{else}}Engine: {{dialectName}}{{/if}}</div>
136
135
  {{#unless databasesMode}}
137
136
  {{#if readonly}}
138
137
  <span class="rounded bg-warning/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-warning">Read-only</span>
139
138
  {{else}}
140
139
  <span class="rounded bg-success/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-success">Writable</span>
141
140
  {{/if}}
142
141
  {{/unless}}
143
142
  </div>
144
143
  <div class="mt-0.5 truncate font-mono text-[11px] text-neutral-content/60" title="{{dbPath}}">{{dbPath}}</div>
145
144
  </div>
145
+ <aside class="flex h-full min-h-full w-72 flex-col bg-neutral text-neutral-content">
146
146
  <div class="flex items-center gap-2.5 px-5 pb-4 pt-5">
147
147
  <div class="w-full">
148
148
  <div class="flex items-center justify-between">
149
149
  <div class="font-headings text-base font-bold leading-tight">AdminDB <span style="font-size: x-small" class="font-sans font-normal opacity-70">{{#if version}}v{{version}}{{/if}}</span></div>
150
150
  {{#unless databasesMode}}
151
151
  {{#if isPostgres}}
152
152
  <span class="rounded bg-info/20 px-1.5 py-0.5 text-[10px] font-bold text-info">PostgreSQL</span>
153
153
  {{else}}
154
154
  <span class="rounded bg-emerald-500/20 px-1.5 py-0.5 text-[10px] font-bold text-emerald-400">SQLite</span>
155
155
  {{/if}}
156
156
  {{/unless}}
157
157
  </div>
158
158
  <div class="mt-0.5 text-[11px] text-neutral-content/50 truncate">{{#if databasesMode}}Database manager{{else}}{{dbId}}{{/if}}</div>
159
159
  </div>
160
160
  </div>
161
161
  {{#if databasesMode}}
162
162
  <nav class="flex-1 overflow-y-auto px-3 py-2">
163
163
  <ul class="space-y-0.5">
164
164
  <li>
165
165
  <a href="{{basePath}}/" class="side-link active">
166
166
  {{{icon "database" class="h-4 w-4"}}}
167
167
  Databases
168
168
  </a>
169
169
  </li>
170
170
  </ul>
171
171
  </nav>
172
172
  {{else}}
173
173
  <div class="px-4 pb-2">
174
174
  <label class="relative block">
175
175
  <span class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-neutral-content/40">
176
176
  {{{icon "search" class="h-4 w-4"}}}
177
177
  </span>
178
178
  <input id="table-search" type="search" placeholder="Filter tables…" autocomplete="off"
179
179
  class="w-full rounded-lg border border-white/10 bg-white/[0.06] py-2 pl-9 pr-3 text-sm text-neutral-content outline-none transition placeholder:text-neutral-content/40 focus:border-primary/70 focus:ring-4 focus:ring-primary/20" />
180
180
  </label>
181
181
  </div>
182
182
  <nav class="flex-1 overflow-y-auto px-3 py-2">
183
183
  <ul class="space-y-0.5">
184
184
  {{#if databasesUrl}}
185
185
  <li>
186
186
  <a href="{{databasesUrl}}" class="side-link">
187
187
  {{{icon "database" class="h-4 w-4"}}}
188
188
  Databases
189
189
  </a>
190
190
  </li>
191
191
  {{/if}}
192
192
  <li>
193
193
  <a href="{{basePath}}/home/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/home')}}active{{/if}}">
194
194
  {{{icon "home" class="h-4 w-4"}}}
195
195
  Home
196
196
  </a>
197
197
  </li>
198
198
  <li>
199
199
  <a href="{{basePath}}/query/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/query')}}active{{/if}}">
200
200
  {{{icon "query" class="h-4 w-4"}}}
201
201
  Query editor
202
202
  </a>
203
203
  </li>
204
204
  <li>
205
205
  <a href="{{basePath}}/erd/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/erd')}}active{{/if}}">
206
206
  {{{icon "diagram" class="h-4 w-4"}}}
207
207
  ER Diagram
208
208
  </a>
209
209
  </li>
210
210
  <li>
211
211
  <a href="{{basePath}}/seed/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/seed')}}active{{/if}}">
212
212
  {{{icon "seed" class="h-4 w-4"}}}
213
213
  Seed generator
214
214
  </a>
215
215
  </li>
216
216
  <li>
217
217
  <a href="{{basePath}}/info/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/info')}}active{{/if}}">
218
218
  {{{icon "settings" class="h-4 w-4"}}}
219
219
  Info & Settings
220
220
  </a>
221
221
  </li>
222
222
  {{#unless readonly}}
223
223
  <li>
224
224
  <a href="{{basePath}}/designer/{{encodeUri dbId}}" class="side-link {{#if (startsWith currentPath '/designer')}}active{{/if}}">
225
225
  {{{icon "plus" class="h-4 w-4"}}}
226
226
  New table
227
227
  </a>
228
228
  </li>
229
229
  {{/unless}}
230
230
  </ul>
231
231
  <div class="mb-2 mt-6 flex items-center justify-between px-3">
232
232
  <span class="text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Tables</span>
233
233
  <span id="table-count" class="rounded-md bg-white/[0.06] px-1.5 py-0.5 text-[10px] font-semibold text-neutral-content/50">{{tables.length}}</span>
234
234
  </div>
235
235
  <ul id="table-list" class="space-y-0.5">
236
236
  {{#each tables}}
237
237
  <li class="table-item" data-name="{{tableName this}}">
238
238
  <a href="{{../basePath}}/tables/{{encodeUri ../dbId}}/{{encodeUri (tableName this)}}" class="side-link {{#if (eq ../currentTable (tableName this))}}active{{/if}}">
239
239
  <span class="table-icon">
240
240
  {{{icon "table" class="h-4 w-4"}}}
241
241
  </span>
242
242
  <span class="truncate">{{tableName this}}</span>
243
243
  </a>
244
244
  </li>
245
245
  {{else}}
246
246
  <li class="px-3 py-2 text-xs text-neutral-content/40">No tables yet</li>
247
247
  {{/each}}
248
248
  </ul>
249
249
  </nav>
250
250
  {{/if}}
251
251
  {{#if isDefaultPassword}}
252
252
  <div class="border-t border-white/10 px-4 py-2 bg-warning/10">
253
253
  <div class="flex items-center justify-between text-warning text-xs font-semibold">
254
254
  <span class="flex items-center gap-1.5 font-mono text-[11px]">
255
255
  {{{icon "warning" class="h-3.5 w-3.5 shrink-0"}}}
256
256
  default pass active
257
257
  </span>
258
258
  <span class="badge badge-warning badge-xs font-mono font-bold">admin</span>
259
259
  </div>
260
260
  </div>
261
261
  {{/if}}
262
262
  <div class="border-t border-white/10 px-5 py-3">
263
263
  <div class="flex items-center justify-between">
264
264
  <div class="text-[11px] font-medium uppercase tracking-wider text-neutral-content/40">{{#if databasesMode}}Directory{{else}}Engine: {{dialectName}}{{/if}}</div>
265
265
  {{#unless databasesMode}}
266
266
  {{#if readonly}}
267
267
  <span class="rounded bg-warning/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-warning">Read-only</span>
268
268
  {{else}}
269
269
  <span class="rounded bg-success/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-success">Writable</span>
270
270
  {{/if}}
271
271
  {{/unless}}
272
272
  </div>
273
273
  <div class="mt-0.5 truncate font-mono text-[11px] text-neutral-content/60" title="{{dbPath}}">{{dbPath}}</div>
274
274
  </div>
package/docs/API.md CHANGED
@@ -69,9 +69,9 @@ AdminDB supports both **SQLite** and **PostgreSQL** database backends seamlessly
69
69
  | ------ | -------------------- | -------------------------- |
70
70
  | POST | `/api/query/:db` | Run arbitrary SQL |
71
71
  | POST | `/api/query/:db/export` | Run a SELECT and download as `csv`/`json` |
72
- | GET | `/api/queries/:db` | List saved queries |
73
- | POST | `/api/queries/:db` | Save a named query |
74
- | DELETE | `/api/queries/:db/:id` | Delete a saved query |
72
+
73
+ > [!NOTE]
74
+ > Saved queries are stored client-side in browser `localStorage` under scoped keys (`admindb_saved_queries_{dbId}`), avoiding any internal state tables in user databases.
75
75
 
76
76
  ## Manager mode (databases landing page)
77
77
 
@@ -123,20 +123,7 @@ Pass `auth: false`, CLI `--no-auth`, or `ADMINDB_AUTH=false` to turn off built-i
123
123
  All request and response types, data inspection helpers, and serverless handlers are exported by the package entry point:
124
124
 
125
125
  ```ts
126
- import {
127
- createRouter,
128
- createServerlessHandler,
129
- createLambdaHandler,
130
- sniffMimeType,
131
- generateHexDump,
132
- analyzeBlob,
133
- isJsonString,
134
- formatJsonSafely,
135
- type ApiResponse,
136
- type GetRowsResponseData,
137
- type BlobMetaResponseData,
138
- type TableDdlResponseData,
139
- } from 'admindb';
126
+ import { createRouter, createServerlessHandler, createLambdaHandler, sniffMimeType, generateHexDump, analyzeBlob, isJsonString, formatJsonSafely, type ApiResponse, type GetRowsResponseData, type BlobMetaResponseData, type TableDdlResponseData } from 'admindb';
140
127
  import { analyzeSqlError } from 'admindb/dist/sql/error-analyzer.js';
141
128
 
142
129
  // 1. Sniff MIME type from binary magic bytes