admindb 1.2.1 → 2.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 (208) hide show
  1. package/README.md +262 -329
  2. package/dist/app.d.ts +25 -4
  3. package/dist/app.js +79 -15
  4. package/dist/app.js.map +1 -1
  5. package/dist/auth/config.d.ts +19 -0
  6. package/dist/auth/config.js +147 -0
  7. package/dist/auth/config.js.map +1 -0
  8. package/dist/auth/crypto.d.ts +27 -0
  9. package/dist/auth/crypto.js +133 -0
  10. package/dist/auth/crypto.js.map +1 -0
  11. package/dist/auth/index.d.ts +5 -0
  12. package/dist/auth/index.js +22 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/middleware.d.ts +14 -0
  15. package/dist/auth/middleware.js +100 -0
  16. package/dist/auth/middleware.js.map +1 -0
  17. package/dist/auth/routes.d.ts +7 -0
  18. package/dist/auth/routes.js +78 -0
  19. package/dist/auth/routes.js.map +1 -0
  20. package/dist/auth/types.d.ts +35 -0
  21. package/dist/auth/types.js +11 -0
  22. package/dist/auth/types.js.map +1 -0
  23. package/dist/cli/args.d.ts +45 -0
  24. package/dist/cli/args.js +328 -0
  25. package/dist/cli/args.js.map +1 -0
  26. package/dist/cli/config.d.ts +56 -0
  27. package/dist/cli/config.js +133 -0
  28. package/dist/cli/config.js.map +1 -0
  29. package/dist/cli/index.d.ts +4 -0
  30. package/dist/cli/index.js +21 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/cli/runner.d.ts +1 -0
  33. package/dist/cli/runner.js +222 -0
  34. package/dist/cli/runner.js.map +1 -0
  35. package/dist/cli.js +2 -127
  36. package/dist/cli.js.map +1 -1
  37. package/dist/data/datasets.d.ts +17 -0
  38. package/dist/data/datasets.js +133 -0
  39. package/dist/data/datasets.js.map +1 -0
  40. package/dist/data/detector.d.ts +30 -0
  41. package/dist/data/detector.js +472 -0
  42. package/dist/data/detector.js.map +1 -0
  43. package/dist/data/engine.d.ts +10 -0
  44. package/dist/data/engine.js +211 -0
  45. package/dist/data/engine.js.map +1 -0
  46. package/dist/data/index.d.ts +5 -0
  47. package/dist/data/index.js +22 -0
  48. package/dist/data/index.js.map +1 -0
  49. package/dist/data/strategies.d.ts +30 -0
  50. package/dist/data/strategies.js +343 -0
  51. package/dist/data/strategies.js.map +1 -0
  52. package/dist/data/types.d.ts +73 -0
  53. package/dist/data/types.js +8 -0
  54. package/dist/data/types.js.map +1 -0
  55. package/dist/db/database.d.ts +14 -146
  56. package/dist/db/database.js +208 -461
  57. package/dist/db/database.js.map +1 -1
  58. package/dist/db/export.d.ts +2 -2
  59. package/dist/db/export.js +7 -2
  60. package/dist/db/export.js.map +1 -1
  61. package/dist/db/filters.d.ts +22 -0
  62. package/dist/db/filters.js +158 -0
  63. package/dist/db/filters.js.map +1 -0
  64. package/dist/db/index.d.ts +8 -0
  65. package/dist/db/index.js +25 -0
  66. package/dist/db/index.js.map +1 -0
  67. package/dist/db/introspection.d.ts +6 -0
  68. package/dist/db/introspection.js +172 -0
  69. package/dist/db/introspection.js.map +1 -0
  70. package/dist/db/manager.d.ts +32 -19
  71. package/dist/db/manager.js +203 -44
  72. package/dist/db/manager.js.map +1 -1
  73. package/dist/db/migrations.d.ts +5 -0
  74. package/dist/db/migrations.js +110 -0
  75. package/dist/db/migrations.js.map +1 -0
  76. package/dist/db/postgres.d.ts +85 -0
  77. package/dist/db/postgres.js +745 -0
  78. package/dist/db/postgres.js.map +1 -0
  79. package/dist/db/types.d.ts +206 -0
  80. package/dist/db/types.js +7 -0
  81. package/dist/db/types.js.map +1 -0
  82. package/dist/index.d.ts +9 -2
  83. package/dist/index.js +46 -4
  84. package/dist/index.js.map +1 -1
  85. package/dist/public/css/app.css +1 -1
  86. package/dist/public/css/input.css +74 -11
  87. package/dist/public/js/app.js +142 -0
  88. package/dist/public/js/browse.js +591 -104
  89. package/dist/public/js/databases.js +105 -13
  90. package/dist/public/js/designer.js +55 -2
  91. package/dist/public/js/forms.js +610 -28
  92. package/dist/public/js/icons.js +51 -0
  93. package/dist/public/js/inspector.js +638 -0
  94. package/dist/public/js/query.js +93 -3
  95. package/dist/public/js/schema.js +185 -52
  96. package/dist/public/js/seed.js +865 -152
  97. package/dist/routes/api/helpers.d.ts +42 -0
  98. package/dist/routes/api/helpers.js +133 -0
  99. package/dist/routes/api/helpers.js.map +1 -0
  100. package/dist/routes/api/import-export.d.ts +3 -0
  101. package/dist/routes/api/import-export.js +85 -0
  102. package/dist/routes/api/import-export.js.map +1 -0
  103. package/dist/routes/api/index.d.ts +4 -0
  104. package/dist/routes/api/index.js +37 -0
  105. package/dist/routes/api/index.js.map +1 -0
  106. package/dist/routes/api/query.d.ts +3 -0
  107. package/dist/routes/api/query.js +76 -0
  108. package/dist/routes/api/query.js.map +1 -0
  109. package/dist/routes/api/rows.d.ts +3 -0
  110. package/dist/routes/api/rows.js +373 -0
  111. package/dist/routes/api/rows.js.map +1 -0
  112. package/dist/routes/api/seed.d.ts +3 -0
  113. package/dist/routes/api/seed.js +82 -0
  114. package/dist/routes/api/seed.js.map +1 -0
  115. package/dist/routes/api/tables.d.ts +3 -0
  116. package/dist/routes/api/tables.js +160 -0
  117. package/dist/routes/api/tables.js.map +1 -0
  118. package/dist/routes/databases.d.ts +8 -11
  119. package/dist/routes/databases.js +100 -66
  120. package/dist/routes/databases.js.map +1 -1
  121. package/dist/routes/index.d.ts +3 -0
  122. package/dist/routes/index.js +20 -0
  123. package/dist/routes/index.js.map +1 -0
  124. package/dist/routes/pages.d.ts +3 -3
  125. package/dist/routes/pages.js +157 -64
  126. package/dist/routes/pages.js.map +1 -1
  127. package/dist/serverless.d.ts +40 -0
  128. package/dist/serverless.js +210 -0
  129. package/dist/serverless.js.map +1 -0
  130. package/dist/sql/generator.d.ts +7 -3
  131. package/dist/sql/generator.js +144 -7
  132. package/dist/sql/generator.js.map +1 -1
  133. package/dist/sql/index.d.ts +2 -0
  134. package/dist/sql/index.js +19 -0
  135. package/dist/sql/index.js.map +1 -0
  136. package/dist/types/api.d.ts +412 -0
  137. package/dist/types/api.js +9 -0
  138. package/dist/types/api.js.map +1 -0
  139. package/dist/utils/colors.d.ts +40 -0
  140. package/dist/utils/colors.js +64 -0
  141. package/dist/utils/colors.js.map +1 -0
  142. package/dist/{util.d.ts → utils/common.d.ts} +10 -6
  143. package/dist/{util.js → utils/common.js} +80 -13
  144. package/dist/utils/common.js.map +1 -0
  145. package/dist/utils/csv.js.map +1 -0
  146. package/dist/utils/datatype.d.ts +49 -0
  147. package/dist/utils/datatype.js +222 -0
  148. package/dist/utils/datatype.js.map +1 -0
  149. package/dist/utils/icons.d.ts +11 -0
  150. package/dist/utils/icons.js +72 -0
  151. package/dist/utils/icons.js.map +1 -0
  152. package/dist/utils/index.d.ts +4 -0
  153. package/dist/utils/index.js +21 -0
  154. package/dist/utils/index.js.map +1 -0
  155. package/dist/{logger.d.ts → utils/logger.d.ts} +1 -1
  156. package/dist/utils/logger.js +40 -0
  157. package/dist/utils/logger.js.map +1 -0
  158. package/dist/views/layouts/main.hbs +40 -11
  159. package/dist/views/pages/databases.hbs +182 -74
  160. package/dist/views/pages/designer.hbs +29 -11
  161. package/dist/views/pages/error.hbs +3 -3
  162. package/dist/views/pages/form.hbs +5 -3
  163. package/dist/views/pages/home.hbs +22 -13
  164. package/dist/views/pages/login.hbs +111 -0
  165. package/dist/views/pages/query.hbs +8 -6
  166. package/dist/views/pages/schema.hbs +41 -13
  167. package/dist/views/pages/seed.hbs +200 -54
  168. package/dist/views/pages/table.hbs +152 -72
  169. package/dist/views/partials/icon.hbs +2 -0
  170. package/dist/views/partials/navbar.hbs +69 -25
  171. package/dist/views/partials/sidebar.hbs +108 -94
  172. package/docs/API.md +144 -0
  173. package/docs/EXAMPLES.md +576 -0
  174. package/docs/SECURITY.md +265 -0
  175. package/package.json +15 -4
  176. package/dist/args.d.ts +0 -28
  177. package/dist/args.js +0 -187
  178. package/dist/args.js.map +0 -1
  179. package/dist/config.d.ts +0 -17
  180. package/dist/config.js +0 -23
  181. package/dist/config.js.map +0 -1
  182. package/dist/csv.js.map +0 -1
  183. package/dist/data/generator.d.ts +0 -86
  184. package/dist/data/generator.js +0 -1031
  185. package/dist/data/generator.js.map +0 -1
  186. package/dist/logger.js +0 -25
  187. package/dist/logger.js.map +0 -1
  188. package/dist/routes/api.d.ts +0 -9
  189. package/dist/routes/api.js +0 -848
  190. package/dist/routes/api.js.map +0 -1
  191. package/dist/test/classifier.test.d.ts +0 -1
  192. package/dist/test/classifier.test.js +0 -44
  193. package/dist/test/classifier.test.js.map +0 -1
  194. package/dist/test/csv.test.d.ts +0 -1
  195. package/dist/test/csv.test.js +0 -64
  196. package/dist/test/csv.test.js.map +0 -1
  197. package/dist/test/database.test.d.ts +0 -1
  198. package/dist/test/database.test.js +0 -402
  199. package/dist/test/database.test.js.map +0 -1
  200. package/dist/test/generator.test.d.ts +0 -1
  201. package/dist/test/generator.test.js +0 -132
  202. package/dist/test/generator.test.js.map +0 -1
  203. package/dist/test/manager.test.d.ts +0 -1
  204. package/dist/test/manager.test.js +0 -146
  205. package/dist/test/manager.test.js.map +0 -1
  206. package/dist/util.js.map +0 -1
  207. /package/dist/{csv.d.ts → utils/csv.d.ts} +0 -0
  208. /package/dist/{csv.js → utils/csv.js} +0 -0
@@ -1,19 +1,21 @@
1
+ {{!-- Page: Database Overview Dashboard · URL: / (or /{basePath}/) --}}
1
2
  <div class="space-y-8">
3
+
2
4
  <!-- Header -->
3
5
  <div class="flex flex-wrap items-end justify-between gap-4">
4
6
  <div>
5
7
  <p class="text-sm font-semibold uppercase tracking-wider text-primary">Overview</p>
6
8
  <h1 class="mt-1 text-3xl font-extrabold tracking-tight">Database</h1>
7
- <p class="mt-1.5 text-sm text-base-content/55">Browse, edit, and query the connected SQLite database from your browser.</p>
9
+ <p class="mt-1.5 text-sm text-base-content/55">Browse, edit, and query the connected database from your browser.</p>
8
10
  </div>
9
11
  <div class="flex gap-2">
10
12
  <a href="{{basePath}}/query" class="btn btn-ghost btn-sm gap-1.5">
11
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z" /></svg>
13
+ {{{icon "query" class="h-4 w-4"}}}
12
14
  Query
13
15
  </a>
14
16
  {{#unless readonly}}
15
17
  <a href="{{basePath}}/designer" class="btn btn-primary btn-sm gap-1.5">
16
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4" /></svg>
18
+ {{{icon "plus" class="h-4 w-4"}}}
17
19
  New table
18
20
  </a>
19
21
  {{/unless}}
@@ -24,7 +26,7 @@
24
26
  <div class="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
25
27
  <div class="stat-card">
26
28
  <span class="stat-icon bg-primary/10 text-primary">
27
- <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" /></svg>
29
+ {{{icon "table" class="h-6 w-6"}}}
28
30
  </span>
29
31
  <div>
30
32
  <div class="text-2xl font-extrabold tabular-nums">{{tables.length}}</div>
@@ -33,7 +35,7 @@
33
35
  </div>
34
36
  <div class="stat-card">
35
37
  <span class="stat-icon bg-secondary/10 text-secondary">
36
- <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" /></svg>
38
+ {{{icon "stats" class="h-6 w-6"}}}
37
39
  </span>
38
40
  <div>
39
41
  <div class="text-2xl font-extrabold tabular-nums">{{totalRows}}</div>
@@ -42,7 +44,7 @@
42
44
  </div>
43
45
  <div class="stat-card">
44
46
  <span class="stat-icon bg-accent/10 text-accent">
45
- <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z" /></svg>
47
+ {{{icon "seed" class="h-6 w-6"}}}
46
48
  </span>
47
49
  <div>
48
50
  <div class="text-2xl font-extrabold tabular-nums">{{savedQueries}}</div>
@@ -50,12 +52,19 @@
50
52
  </div>
51
53
  </div>
52
54
  <div class="stat-card">
53
- <span class="stat-icon bg-warning/10 text-warning">
54
- <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4 7v10c0 1.1.9 2 2 2h12a2 2 0 002-2V7M4 7c0-1.1.9-2 2-2h12a2 2 0 012 2M4 7c0 1.1.9 2 2 2h12a2 2 0 002-2" /></svg>
55
+ <span class="stat-icon {{#if isPostgres}}bg-info/10 text-info{{else}}bg-emerald-500/10 text-emerald-500{{/if}}">
56
+ {{{icon "database" class="h-6 w-6"}}}
55
57
  </span>
56
58
  <div>
57
- <div class="truncate font-mono text-lg font-bold" title="{{dbPath}}">{{dbPath}}</div>
58
- <div class="text-[13px] text-base-content/50">Database file</div>
59
+ <div class="flex items-center gap-1.5">
60
+ <span class="text-xl font-extrabold">{{dialectName}}</span>
61
+ {{#if readonly}}
62
+ <span class="rounded bg-warning/20 px-1.5 py-0.5 text-[10px] font-bold uppercase text-warning">Read-only</span>
63
+ {{else}}
64
+ <span class="rounded bg-success/20 px-1.5 py-0.5 text-[10px] font-bold uppercase text-success">Writable</span>
65
+ {{/if}}
66
+ </div>
67
+ <div class="truncate font-mono text-xs text-base-content/50" title="{{dbPath}}">{{dbPath}}</div>
59
68
  </div>
60
69
  </div>
61
70
  </div>
@@ -85,7 +94,7 @@
85
94
  <td>
86
95
  <a href="{{../basePath}}/tables/{{this}}" class="inline-flex items-center gap-2.5 font-medium">
87
96
  <span class="grid h-8 w-8 place-items-center rounded-lg bg-primary/10 text-primary transition-colors group-hover:bg-primary/20">
88
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" /></svg>
97
+ {{{icon "table" class="h-4 w-4"}}}
89
98
  </span>
90
99
  <span class="font-mono text-[13.5px]">{{this}}</span>
91
100
  </a>
@@ -95,7 +104,7 @@
95
104
  <td class="text-right">
96
105
  <a href="{{../basePath}}/tables/{{this}}" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary">
97
106
  Browse
98
- <svg xmlns="http://www.w3.org/2000/svg" class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 7l5 5m0 0l-5 5m5-5H6" /></svg>
107
+ {{{icon "arrowRight" class="h-3.5 w-3.5"}}}
99
108
  </a>
100
109
  </td>
101
110
  </tr>
@@ -107,7 +116,7 @@
107
116
  {{else}}
108
117
  <div class="empty-state">
109
118
  <span class="empty-icon">
110
- <svg xmlns="http://www.w3.org/2000/svg" class="h-7 w-7" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" /></svg>
119
+ {{{icon "table" class="h-7 w-7"}}}
111
120
  </span>
112
121
  <p class="text-sm font-medium text-base-content/70">No tables yet</p>
113
122
  <p class="max-w-sm text-sm text-base-content/45">Create one with the table designer, or run a SQL statement in the query editor to get started.</p>
@@ -0,0 +1,111 @@
1
+ {{!-- Page: Authentication & Login · URL: /login --}}
2
+ <div class="flex min-h-[75vh] items-center justify-center py-6 px-4">
3
+
4
+ <div class="w-full max-w-md">
5
+ <!-- Brand Header -->
6
+ <div class="mb-8 text-center">
7
+ <div class="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10 text-primary shadow-soft">
8
+ {{{icon "database" class="h-8 w-8"}}}
9
+ </div>
10
+ <h1 class="text-2xl font-extrabold tracking-tight text-base-content sm:text-3xl">
11
+ Admin<span class="text-primary">DB</span>
12
+ </h1>
13
+ <p class="mt-1 text-sm text-base-content/60">
14
+ Sign in to access your database administration console
15
+ </p>
16
+ </div>
17
+
18
+ <!-- Login Card -->
19
+ <div class="app-card border border-base-300/80 bg-base-100 p-6 sm:p-8 shadow-soft">
20
+ {{#if error}}
21
+ <div class="mb-6 flex items-start gap-3 rounded-xl bg-error/10 p-4 text-sm text-error border border-error/20" role="alert">
22
+ <span class="shrink-0 mt-0.5">
23
+ {{{icon "warning" class="h-5 w-5"}}}
24
+ </span>
25
+ <div class="font-medium">{{error}}</div>
26
+ </div>
27
+ {{/if}}
28
+
29
+ {{#if isDefaultPassword}}
30
+ <div class="mb-6 rounded-xl bg-info/10 p-3.5 text-xs text-info border border-info/20">
31
+ <div class="font-semibold flex items-center gap-1.5 mb-1">
32
+ {{{icon "warning" class="h-4 w-4 shrink-0"}}}
33
+ Default Credentials Active
34
+ </div>
35
+ <p class="text-base-content/70">
36
+ Username: <code class="font-mono font-semibold text-primary">admin</code> · Password: <code class="font-mono font-semibold text-primary">admin</code>
37
+ </p>
38
+ <p class="mt-1 text-[11px] text-base-content/50">
39
+ Set <code class="font-mono">ADMINDB_PASSWORD</code> in production to secure your console.
40
+ </p>
41
+ </div>
42
+ {{/if}}
43
+
44
+ <form method="POST" action="{{basePath}}/login" class="space-y-4">
45
+ {{#if next}}
46
+ <input type="hidden" name="next" value="{{next}}" />
47
+ {{/if}}
48
+
49
+ <div>
50
+ <label class="field-label" for="login-username">
51
+ <span>Username</span>
52
+ </label>
53
+ <div class="relative">
54
+ <input
55
+ id="login-username"
56
+ type="text"
57
+ name="username"
58
+ value="{{#if username}}{{username}}{{else}}admin{{/if}}"
59
+ required
60
+ autofocus
61
+ placeholder="Username"
62
+ class="field-input pl-10"
63
+ autocomplete="username"
64
+ />
65
+ <div class="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-base-content/40">
66
+ {{{icon "user" class="h-5 w-5"}}}
67
+ </div>
68
+ </div>
69
+ </div>
70
+
71
+ <div>
72
+ <label class="field-label" for="login-password">
73
+ <span>Password</span>
74
+ </label>
75
+ <div class="relative">
76
+ <input
77
+ id="login-password"
78
+ type="password"
79
+ name="password"
80
+ required
81
+ placeholder="••••••••"
82
+ class="field-input pl-10"
83
+ autocomplete="current-password"
84
+ />
85
+ <div class="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-base-content/40">
86
+ {{{icon "lock" class="h-5 w-5"}}}
87
+ </div>
88
+ </div>
89
+ </div>
90
+
91
+ <div class="pt-2">
92
+ <button type="submit" class="btn btn-primary w-full gap-2 font-semibold shadow-soft">
93
+ {{{icon "logout" class="h-4 w-4 rotate-180"}}}
94
+ Sign In
95
+ </button>
96
+ </div>
97
+ </form>
98
+ </div>
99
+
100
+ <!-- Security & Auth Control Note -->
101
+ <div class="mt-6 space-y-2 text-center text-xs text-base-content/55">
102
+ <p class="leading-relaxed">
103
+ <span class="font-semibold text-base-content/80">Security Notice:</span> Built-in auth provides basic access control. For production, protect your admin routes using your own application authentication, VPN, or reverse proxy.
104
+ </p>
105
+ <p class="text-base-content/40">
106
+ Native authentication can be disabled via <code class="font-mono">--no-auth</code> or <code class="font-mono">auth: false</code>.
107
+ </p>
108
+ </div>
109
+ </div>
110
+ </div>
111
+
@@ -1,4 +1,6 @@
1
+ {{!-- Page: SQL Query Console & Workbench · URL: /query --}}
1
2
  <div class="space-y-6">
3
+
2
4
  <!-- Header -->
3
5
  <div class="flex flex-wrap items-center justify-between gap-3">
4
6
  <div>
@@ -9,12 +11,12 @@
9
11
  <div class="flex flex-wrap gap-2">
10
12
  {{#unless readonly}}
11
13
  <button id="save-query" type="button" class="btn btn-outline btn-sm gap-1.5">
12
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4" /></svg>
14
+ {{{icon "save" class="h-4 w-4"}}}
13
15
  Save query
14
16
  </button>
15
17
  {{/unless}}
16
18
  <button id="run-query" type="button" class="btn btn-primary btn-sm gap-1.5">
17
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z" /><path stroke-linecap="round" stroke-linejoin="round" d="M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></svg>
19
+ {{{icon "run" class="h-4 w-4"}}}
18
20
  Run
19
21
  </button>
20
22
  </div>
@@ -48,7 +50,7 @@
48
50
  <div class="flex items-center justify-between border-b border-base-200 bg-base-200/40 px-4 py-2.5">
49
51
  <span class="flex items-center gap-2 text-sm font-semibold text-base-content/60">
50
52
  <span class="grid h-5 w-5 place-items-center rounded-md bg-primary/10 text-primary">
51
- <svg xmlns="http://www.w3.org/2000/svg" class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z" /></svg>
53
+ {{{icon "query" class="h-3.5 w-3.5"}}}
52
54
  </span>
53
55
  query.sql
54
56
  </span>
@@ -68,16 +70,16 @@
68
70
  <div class="app-card overflow-hidden">
69
71
  <div class="flex items-center gap-2 border-b border-base-200 px-4 py-3">
70
72
  <span id="result-kind" class="grid h-6 w-6 place-items-center rounded-md bg-success/10 text-success">
71
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" 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>
73
+ {{{icon "check" class="h-4 w-4"}}}
72
74
  </span>
73
75
  <span id="result-summary" class="text-sm font-medium text-base-content/60"></span>
74
76
  <div class="ml-auto flex items-center gap-1.5">
75
77
  <button id="export-csv" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" disabled>
76
- <svg xmlns="http://www.w3.org/2000/svg" class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" /></svg>
78
+ {{{icon "export" class="h-3.5 w-3.5"}}}
77
79
  CSV
78
80
  </button>
79
81
  <button id="export-json" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" disabled>
80
- <svg xmlns="http://www.w3.org/2000/svg" class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" /></svg>
82
+ {{{icon "export" class="h-3.5 w-3.5"}}}
81
83
  JSON
82
84
  </button>
83
85
  </div>
@@ -1,9 +1,11 @@
1
+ {{!-- Page: Table Schema & Structure Inspector · URL: /tables/:table/schema --}}
1
2
  <div class="space-y-6">
3
+
2
4
  <!-- Header -->
3
5
  <div class="flex flex-wrap items-center justify-between gap-3">
4
6
  <div class="flex items-center gap-3.5">
5
7
  <a href="{{basePath}}/tables/{{table}}" class="btn btn-circle btn-ghost btn-sm" aria-label="Back to table">
6
- <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="M10 19l-7-7m0 0l7-7m-7 7h18" /></svg>
8
+ {{{icon "arrowLeft" class="h-5 w-5"}}}
7
9
  </a>
8
10
  <div>
9
11
  <p class="text-sm font-semibold uppercase tracking-wider text-primary">Schema editor</p>
@@ -12,11 +14,11 @@
12
14
  </div>
13
15
  <div class="flex flex-wrap gap-2">
14
16
  <a href="{{basePath}}/tables/{{table}}" class="btn btn-ghost btn-sm gap-1.5">
15
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M3 10h18M3 14h18m-9-4v8m-7 0h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z" /></svg>
17
+ {{{icon "table" class="h-4 w-4"}}}
16
18
  View data
17
19
  </a>
18
20
  <a href="{{basePath}}/query" class="btn btn-outline btn-sm gap-1.5">
19
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z" /></svg>
21
+ {{{icon "query" class="h-4 w-4"}}}
20
22
  Query
21
23
  </a>
22
24
  </div>
@@ -30,7 +32,7 @@
30
32
  <input id="table-rename-input" class="field-input font-mono" value="{{table}}" spellcheck="false" autocomplete="off" {{#if isInternal}}disabled{{/if}} {{#if readonly}}disabled{{/if}} />
31
33
  </div>
32
34
  <button id="rename-table" type="button" class="btn btn-primary btn-sm mb-0.5" {{#if isInternal}}disabled{{/if}} {{#if readonly}}disabled{{/if}}>
33
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" /></svg>
35
+ {{{icon "edit" class="h-4 w-4"}}}
34
36
  Rename table
35
37
  </button>
36
38
  {{#if isInternal}}<span class="mb-1 text-xs text-base-content/45">Internal tables cannot be renamed.</span>{{/if}}
@@ -45,20 +47,37 @@
45
47
  <span class="ml-1 rounded-md bg-base-200 px-1.5 py-0.5 text-[10px] text-base-content/50">{{schema.columns.length}}</span>
46
48
  </h2>
47
49
  <button id="add-column" type="button" class="btn btn-outline btn-sm gap-1.5" {{#if readonly}}disabled{{/if}}>
48
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4" /></svg>
50
+ {{{icon "plus" class="h-4 w-4"}}}
49
51
  Add column
50
52
  </button>
51
53
  </div>
52
54
 
53
55
  <div id="add-column-panel" class="hidden border-b border-base-200 p-4">
56
+ <div class="mb-2 text-xs font-bold uppercase tracking-wider text-primary">Add New Column</div>
54
57
  <div id="add-column-form" class="grid grid-cols-2 items-end gap-2.5 sm:grid-cols-12"></div>
55
58
  <div id="add-column-error" class="hidden mt-3"></div>
56
- <div class="mt-3 flex gap-2">
59
+ <div class="mt-3.5 flex gap-2">
57
60
  <button id="add-column-submit" type="button" class="btn btn-primary btn-sm">Add column</button>
58
61
  <button id="add-column-cancel" type="button" class="btn btn-ghost btn-sm">Cancel</button>
59
62
  </div>
60
63
  </div>
61
64
 
65
+ <div id="edit-column-panel" class="hidden border-b border-base-200 bg-base-200/30 p-4">
66
+ <div class="mb-2.5 flex items-center justify-between">
67
+ <div class="flex items-center gap-2">
68
+ <span class="text-xs font-bold uppercase tracking-wider text-primary">Edit Column:</span>
69
+ <span id="edit-column-target" class="font-mono text-sm font-bold text-base-content"></span>
70
+ </div>
71
+ <span class="text-[11px] text-base-content/45">Change data type, default value, primary key, nullability, uniqueness, or foreign key.</span>
72
+ </div>
73
+ <div id="edit-column-form" class="grid grid-cols-2 items-end gap-2.5 sm:grid-cols-12"></div>
74
+ <div id="edit-column-error" class="hidden mt-3"></div>
75
+ <div class="mt-3.5 flex gap-2">
76
+ <button id="edit-column-submit" type="button" class="btn btn-primary btn-sm">Save Changes</button>
77
+ <button id="edit-column-cancel" type="button" class="btn btn-ghost btn-sm">Cancel</button>
78
+ </div>
79
+ </div>
80
+
62
81
  <div class="overflow-x-auto">
63
82
  <table class="table table-sm">
64
83
  <thead>
@@ -92,12 +111,21 @@
92
111
  </td>
93
112
  <td class="whitespace-nowrap text-right align-middle">
94
113
  <div class="flex items-center justify-end gap-1">
95
- <button type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary col-rename" {{#if ../readonly}}disabled{{/if}}>
96
- <svg xmlns="http://www.w3.org/2000/svg" class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" /></svg>
97
- Rename
114
+ <button type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary col-edit"
115
+ data-column="{{this.name}}"
116
+ data-type="{{this.type}}"
117
+ data-pk="{{#if (gt this.pk 0)}}true{{else}}false{{/if}}"
118
+ data-notnull="{{#if this.notnull}}true{{else}}false{{/if}}"
119
+ data-unique="{{#if this.unique}}true{{else}}false{{/if}}"
120
+ data-default="{{this.dflt_value}}"
121
+ data-fk-table="{{this.fk.table}}"
122
+ data-fk-to="{{this.fk.to}}"
123
+ {{#if ../readonly}}disabled{{/if}}>
124
+ {{{icon "edit" class="h-3.5 w-3.5"}}}
125
+ Edit
98
126
  </button>
99
127
  <button type="button" class="btn btn-ghost btn-xs gap-1 text-error col-drop" {{#if ../readonly}}disabled{{/if}} {{#unless this.canDrop}}disabled title="{{join this.dropBlockers "; "}}"{{/unless}}>
100
- <svg xmlns="http://www.w3.org/2000/svg" class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" /></svg>
128
+ {{{icon "trash" class="h-3.5 w-3.5"}}}
101
129
  Delete
102
130
  </button>
103
131
  </div>
@@ -148,7 +176,7 @@
148
176
  <span class="ml-1 rounded-md bg-base-200 px-1.5 py-0.5 text-[10px] text-base-content/50">{{schema.indexes.length}}</span>
149
177
  </h2>
150
178
  <button id="add-index" type="button" class="btn btn-outline btn-sm gap-1.5" {{#if readonly}}disabled{{/if}}>
151
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4" /></svg>
179
+ {{{icon "plus" class="h-4 w-4"}}}
152
180
  Add index
153
181
  </button>
154
182
  </div>
@@ -225,7 +253,7 @@
225
253
  <td class="whitespace-nowrap text-right align-middle">
226
254
  <button type="button" class="btn btn-ghost btn-xs gap-1 text-error index-drop"
227
255
  data-index="{{this.name}}" {{#if ../readonly}}disabled{{/if}} {{#unless (eq this.origin 'c')}}disabled title="Automatic index — cannot be dropped"{{/unless}}>
228
- <svg xmlns="http://www.w3.org/2000/svg" class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" /></svg>
256
+ {{{icon "trash" class="h-3.5 w-3.5"}}}
229
257
  Drop
230
258
  </button>
231
259
  </td>
@@ -270,7 +298,7 @@
270
298
  {{#unless isInternal}}
271
299
  <div class="rounded-2xl border border-error/25 bg-error/[0.03] p-5">
272
300
  <h2 class="flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-error">
273
- <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" 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>
301
+ {{{icon "warning" class="h-4 w-4"}}}
274
302
  Danger zone
275
303
  </h2>
276
304
  <p class="mt-1 text-sm text-base-content/55">Dropping this table permanently removes its schema and all of its data.</p>