admindb 2.1.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 (119) hide show
  1. package/README.md +368 -335
  2. package/dist/app.js +227 -1
  3. package/dist/auth/config.d.ts +1 -1
  4. package/dist/auth/config.js +109 -1
  5. package/dist/auth/crypto.js +98 -1
  6. package/dist/auth/index.js +21 -1
  7. package/dist/auth/middleware.js +78 -1
  8. package/dist/auth/routes.js +64 -1
  9. package/dist/auth/types.js +7 -1
  10. package/dist/cli/args.d.ts +1 -1
  11. package/dist/cli/args.js +309 -1
  12. package/dist/cli/config.js +118 -1
  13. package/dist/cli/index.js +20 -1
  14. package/dist/cli/runner.js +208 -1
  15. package/dist/cli.js +4 -1
  16. package/dist/data/chain.d.ts +1 -0
  17. package/dist/data/chain.js +130 -0
  18. package/dist/data/datasets.d.ts +1 -1
  19. package/dist/data/datasets.js +171 -1
  20. package/dist/data/detector.d.ts +1 -1
  21. package/dist/data/detector.js +535 -1
  22. package/dist/data/engine.d.ts +1 -1
  23. package/dist/data/engine.js +586 -1
  24. package/dist/data/index.d.ts +1 -1
  25. package/dist/data/index.js +30 -1
  26. package/dist/data/prng.d.ts +1 -0
  27. package/dist/data/prng.js +73 -0
  28. package/dist/data/registry.d.ts +1 -0
  29. package/dist/data/registry.js +805 -0
  30. package/dist/data/schema-graph.d.ts +1 -0
  31. package/dist/data/schema-graph.js +210 -0
  32. package/dist/data/strategies.d.ts +1 -1
  33. package/dist/data/strategies.js +100 -1
  34. package/dist/data/templates.d.ts +1 -0
  35. package/dist/data/templates.js +134 -0
  36. package/dist/data/types.d.ts +1 -1
  37. package/dist/data/types.js +5 -1
  38. package/dist/data/validator.d.ts +1 -0
  39. package/dist/data/validator.js +160 -0
  40. package/dist/db/database.d.ts +1 -1
  41. package/dist/db/database.js +472 -1
  42. package/dist/db/export.d.ts +1 -1
  43. package/dist/db/export.js +67 -1
  44. package/dist/db/filters.d.ts +1 -1
  45. package/dist/db/filters.js +119 -1
  46. package/dist/db/index.js +24 -1
  47. package/dist/db/introspection.js +164 -1
  48. package/dist/db/manager.js +327 -1
  49. package/dist/db/migrations.js +100 -1
  50. package/dist/db/postgres.d.ts +1 -1
  51. package/dist/db/postgres.js +687 -1
  52. package/dist/db/types.d.ts +1 -1
  53. package/dist/db/types.js +6 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.js +52 -1
  56. package/dist/public/css/app.css +1 -1
  57. package/dist/public/js/api.js +1 -1
  58. package/dist/public/js/browse.js +1 -1
  59. package/dist/public/js/common.js +1 -0
  60. package/dist/public/js/databases.js +1 -1
  61. package/dist/public/js/designer.js +1 -1
  62. package/dist/public/js/forms.js +1 -1
  63. package/dist/public/js/home.js +1 -0
  64. package/dist/public/js/inspector.js +1 -1
  65. package/dist/public/js/query.js +1 -1
  66. package/dist/public/js/schema.js +1 -1
  67. package/dist/public/js/seed.js +1 -1
  68. package/dist/routes/api/erd.d.ts +1 -0
  69. package/dist/routes/api/erd.js +45 -0
  70. package/dist/routes/api/helpers.d.ts +1 -1
  71. package/dist/routes/api/helpers.js +213 -1
  72. package/dist/routes/api/import-export.js +82 -1
  73. package/dist/routes/api/index.js +48 -1
  74. package/dist/routes/api/query.js +74 -1
  75. package/dist/routes/api/rows.js +358 -1
  76. package/dist/routes/api/seed.js +167 -1
  77. package/dist/routes/api/tables.js +216 -1
  78. package/dist/routes/databases.js +210 -1
  79. package/dist/routes/index.js +19 -1
  80. package/dist/routes/pages.js +446 -1
  81. package/dist/serverless.js +149 -1
  82. package/dist/sql/classifier.js +24 -1
  83. package/dist/sql/error-analyzer.d.ts +1 -0
  84. package/dist/sql/error-analyzer.js +550 -0
  85. package/dist/sql/generator.d.ts +1 -1
  86. package/dist/sql/generator.js +245 -1
  87. package/dist/sql/index.js +18 -1
  88. package/dist/types/api.d.ts +1 -1
  89. package/dist/types/api.js +2 -1
  90. package/dist/utils/colors.js +54 -1
  91. package/dist/utils/common.d.ts +1 -1
  92. package/dist/utils/common.js +185 -1
  93. package/dist/utils/csv.d.ts +1 -1
  94. package/dist/utils/csv.js +61 -1
  95. package/dist/utils/datatype.js +167 -1
  96. package/dist/utils/icons.js +81 -1
  97. package/dist/utils/index.js +20 -1
  98. package/dist/utils/logger.js +36 -1
  99. package/dist/views/layouts/main.hbs +1 -74
  100. package/dist/views/pages/databases.hbs +1 -233
  101. package/dist/views/pages/designer.hbs +1 -89
  102. package/dist/views/pages/erd.hbs +1 -0
  103. package/dist/views/pages/error.hbs +1 -10
  104. package/dist/views/pages/form.hbs +1 -59
  105. package/dist/views/pages/home.hbs +1 -124
  106. package/dist/views/pages/info.hbs +1 -0
  107. package/dist/views/pages/login.hbs +1 -98
  108. package/dist/views/pages/query.hbs +1 -87
  109. package/dist/views/pages/schema.hbs +1 -298
  110. package/dist/views/pages/seed-select.hbs +251 -0
  111. package/dist/views/pages/seed.hbs +273 -167
  112. package/dist/views/pages/table.hbs +1 -327
  113. package/dist/views/partials/navbar.hbs +1 -83
  114. package/dist/views/partials/sidebar.hbs +1 -117
  115. package/docs/API.md +149 -144
  116. package/docs/EXAMPLES.md +579 -576
  117. package/docs/SECURITY.md +265 -265
  118. package/package.json +79 -78
  119. package/dist/public/js/icons.js +0 -1
@@ -1,83 +1 @@
1
- <div class="sticky top-0 z-30 border-b border-base-300/80 bg-base-100/85 backdrop-blur-md">
2
- <div class="navbar mx-auto w-full max-w-[1500px] px-4 sm:px-6 lg:px-8">
3
- <div class="flex-none lg:hidden">
4
- <label for="sidebar-toggle" class="btn btn-square btn-ghost" aria-label="open sidebar">
5
- {{{icon "menu" class="h-5 w-5"}}}
6
- </label>
7
- </div>
8
- <div class="flex flex-1 items-center gap-3">
9
- <a href="{{basePath}}/" class="flex items-center gap-2.5">
10
- <span class="text-lg font-bold tracking-tight">Admin<span class="text-primary">DB</span></span>
11
- </a>
12
- {{#unless databasesMode}}
13
- {{#if isPostgres}}
14
- <span class="inline-flex items-center gap-1.5 rounded-lg border border-info/40 bg-info/10 px-2.5 py-0.5 text-xs font-semibold text-info" title="Engine: PostgreSQL ({{dbPath}})">
15
- <span class="h-2 w-2 rounded-full bg-info animate-pulse"></span>
16
- PostgreSQL
17
- </span>
18
- {{else}}
19
- <span class="inline-flex items-center gap-1.5 rounded-lg border border-emerald-500/40 bg-emerald-500/10 px-2.5 py-0.5 text-xs font-semibold text-emerald-600 dark:text-emerald-400" title="Engine: SQLite ({{dbPath}})">
20
- <span class="h-2 w-2 rounded-full bg-emerald-500 animate-pulse"></span>
21
- SQLite
22
- </span>
23
- {{/if}}
24
- {{/unless}}
25
- </div>
26
- <div class="flex items-center gap-1.5">
27
- {{#unless noSidebar}}
28
- {{#unless databasesMode}}
29
- {{#if databasesUrl}}
30
- <a href="{{databasesUrl}}" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
31
- {{{icon "database" class="h-4 w-4"}}}
32
- Databases
33
- </a>
34
- {{/if}}
35
- <a href="{{basePath}}/query" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
36
- {{{icon "query" class="h-4 w-4"}}}
37
- Query
38
- </a>
39
- {{#unless readonly}}
40
- <a href="{{basePath}}/designer" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
41
- {{{icon "plus" class="h-4 w-4"}}}
42
- New table
43
- </a>
44
- {{/unless}}
45
- <a href="{{basePath}}/export" class="btn btn-ghost btn-sm hidden gap-1.5 md:inline-flex">
46
- {{{icon "export" class="h-4 w-4"}}}
47
- Export
48
- </a>
49
- {{/unless}}
50
- {{/unless}}
51
- {{#if authEnabled}}
52
- {{#if authUser}}
53
- {{#if isDefaultPassword}}
54
- <span class="badge badge-warning badge-sm gap-1 hidden sm:inline-flex font-mono text-[11px]" title="Using default password (admin). Set ADMINDB_PASSWORD in production.">
55
- {{{icon "warning" class="h-3.5 w-3.5"}}}
56
- default pass
57
- </span>
58
- {{/if}}
59
- <div class="dropdown dropdown-end">
60
- <label tabindex="0" class="btn btn-ghost btn-sm gap-1.5 normal-case font-medium">
61
- {{{icon "user" class="h-4 w-4 text-base-content/70"}}}
62
- <span class="max-w-[120px] truncate text-xs">{{authUser}}</span>
63
- </label>
64
- <ul tabindex="0" class="dropdown-content menu p-2 shadow-soft bg-base-100 rounded-xl w-48 border border-base-300 z-50 mt-1 text-sm">
65
- <li class="menu-title px-2 py-1 text-xs text-base-content/50">Signed in as <strong class="text-base-content">{{authUser}}</strong></li>
66
- <li>
67
- <form method="POST" action="{{basePath}}/logout" class="p-0">
68
- <button type="submit" class="w-full text-left flex items-center gap-2 px-3 py-2 text-error hover:bg-error/10 rounded-lg">
69
- {{{icon "logout" class="h-4 w-4"}}}
70
- Sign out
71
- </button>
72
- </form>
73
- </li>
74
- </ul>
75
- </div>
76
- {{/if}}
77
- {{/if}}
78
- <button id="theme-toggle" type="button" class="btn btn-square btn-ghost btn-sm" aria-label="Toggle dark mode" title="Toggle dark mode">
79
- {{{icon "moon" class="h-5 w-5"}}}
80
- </button>
81
- </div>
82
- </div>
83
- </div>
1
+ <div class="sticky top-0 z-30 border-b border-base-300/80 bg-base-100/85 backdrop-blur-md">
84
2
  <div class="navbar mx-auto w-full max-w-[1500px] px-4 sm:px-6 lg:px-8">
85
3
  <div class="flex-none lg:hidden">
86
4
  <label for="sidebar-toggle" class="btn btn-square btn-ghost" aria-label="open sidebar">
87
5
  {{{icon "menu" class="h-5 w-5"}}}
88
6
  </label>
89
7
  </div>
90
8
  <div class="flex flex-1 items-center gap-3">
91
9
  <a href="{{basePath}}/" class="flex items-center gap-2.5">
92
10
  <span class="font-headings text-lg font-bold tracking-tight text-base-content">Admin<span class="text-primary">DB</span></span>
93
11
  </a>
94
12
  {{#unless databasesMode}}
95
13
  {{#if isPostgres}}
96
14
  <span class="inline-flex items-center gap-1.5 rounded-lg border border-info/40 bg-info/10 px-2.5 py-0.5 text-xs font-semibold text-info" title="Engine: PostgreSQL ({{dbPath}})">
97
15
  <span class="h-2 w-2 rounded-full bg-info animate-pulse"></span>
98
16
  PostgreSQL
99
17
  </span>
100
18
  {{else}}
101
19
  <span class="inline-flex items-center gap-1.5 rounded-lg border border-emerald-500/40 bg-emerald-500/10 px-2.5 py-0.5 text-xs font-semibold text-emerald-600 dark:text-emerald-400" title="Engine: SQLite ({{dbPath}})">
102
20
  <span class="h-2 w-2 rounded-full bg-emerald-500 animate-pulse"></span>
103
21
  SQLite
104
22
  </span>
105
23
  {{/if}}
106
24
  {{/unless}}
107
25
  </div>
108
26
  <div class="flex items-center gap-1.5">
109
27
  {{#unless noSidebar}}
110
28
  {{#unless databasesMode}}
111
29
  {{#if databasesUrl}}
112
30
  <a href="{{databasesUrl}}" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
113
31
  {{{icon "database" class="h-4 w-4"}}}
114
32
  Databases
115
33
  </a>
116
34
  {{/if}}
117
35
  <a href="{{basePath}}/query" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
118
36
  {{{icon "query" class="h-4 w-4"}}}
119
37
  Query
120
38
  </a>
121
39
  {{#unless readonly}}
122
40
  <a href="{{basePath}}/designer" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
123
41
  {{{icon "plus" class="h-4 w-4"}}}
124
42
  New table
125
43
  </a>
126
44
  {{/unless}}
127
45
  <a href="{{basePath}}/export" class="btn btn-ghost btn-sm hidden gap-1.5 md:inline-flex">
128
46
  {{{icon "export" class="h-4 w-4"}}}
129
47
  Export
130
48
  </a>
131
49
  {{/unless}}
132
50
  {{/unless}}
133
51
  {{#if authEnabled}}
134
52
  {{#if authUser}}
135
53
  <div class="dropdown dropdown-end">
136
54
  <label tabindex="0" class="btn btn-ghost btn-sm gap-1.5 normal-case font-medium">
137
55
  {{{icon "user" class="h-4 w-4 text-base-content/70"}}}
138
56
  <span class="max-w-[120px] truncate text-xs">{{authUser}}</span>
139
57
  </label>
140
58
  <ul tabindex="0" class="dropdown-content menu p-2 shadow-soft bg-base-100 rounded-xl w-56 border border-base-300 z-50 mt-1 text-sm space-y-1">
141
59
  <li class="menu-title px-2 py-1 text-xs text-base-content/50">Signed in as <strong class="text-base-content">{{authUser}}</strong></li>
142
60
  {{#if isDefaultPassword}}
143
61
  <li class="rounded-lg bg-warning/10 p-2 text-[11px] text-warning border border-warning/20">
144
62
  <div class="flex items-center gap-1.5 font-semibold p-0">
145
63
  {{{icon "warning" class="h-3.5 w-3.5 shrink-0"}}}
146
64
  <span>Default pass active (admin)</span>
147
65
  </div>
148
66
  </li>
149
67
  {{/if}}
150
68
  <li>
151
69
  <form method="POST" action="{{basePath}}/logout" class="p-0">
152
70
  <button type="submit" class="w-full text-left flex items-center gap-2 px-3 py-2 text-error hover:bg-error/10 rounded-lg">
153
71
  {{{icon "logout" class="h-4 w-4"}}}
154
72
  Sign out
155
73
  </button>
156
74
  </form>
157
75
  </li>
158
76
  </ul>
159
77
  </div>
160
78
  {{/if}}
161
79
  {{/if}}
162
80
  <button id="theme-toggle" type="button" class="btn btn-square btn-ghost btn-sm" aria-label="Toggle dark mode" title="Toggle dark mode">
163
81
  {{{icon "moon" class="h-5 w-5"}}}
164
82
  </button>
165
83
  </div>
166
84
  </div>
@@ -1,117 +1 @@
1
- <aside class="flex h-full min-h-full w-72 flex-col bg-neutral text-neutral-content">
2
- <div class="flex items-center gap-2.5 px-5 pb-4 pt-5">
3
- <div class="w-full">
4
- <div class="flex items-center justify-between">
5
- <div class="text-base font-bold leading-tight">AdminDB <span style="font-size: x-small">{{#if version}}v{{version}}{{/if}}</span></div>
6
- {{#unless databasesMode}}
7
- {{#if isPostgres}}
8
- <span class="rounded bg-info/20 px-1.5 py-0.5 text-[10px] font-bold text-info">PostgreSQL</span>
9
- {{else}}
10
- <span class="rounded bg-emerald-500/20 px-1.5 py-0.5 text-[10px] font-bold text-emerald-400">SQLite</span>
11
- {{/if}}
12
- {{/unless}}
13
- </div>
14
- <div class="mt-0.5 text-[11px] text-neutral-content/50 truncate">{{#if databasesMode}}Database manager{{else}}{{dbId}}{{/if}}</div>
15
- </div>
16
- </div>
17
- {{#if databasesMode}}
18
- <nav class="flex-1 overflow-y-auto px-3 py-2">
19
- <ul class="space-y-0.5">
20
- <li>
21
- <a href="{{basePath}}/" class="side-link active">
22
- {{{icon "database" class="h-4 w-4"}}}
23
- Databases
24
- </a>
25
- </li>
26
- </ul>
27
- </nav>
28
- {{else}}
29
- <div class="px-4 pb-2">
30
- <label class="relative block">
31
- <span class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-neutral-content/40">
32
- {{{icon "search" class="h-4 w-4"}}}
33
- </span>
34
- <input id="table-search" type="search" placeholder="Filter tables…" autocomplete="off"
35
- 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
- </label>
37
- </div>
38
- <nav class="flex-1 overflow-y-auto px-3 py-2">
39
- <ul class="space-y-0.5">
40
- {{#if databasesUrl}}
41
- <li>
42
- <a href="{{databasesUrl}}" class="side-link">
43
- {{{icon "database" class="h-4 w-4"}}}
44
- Databases
45
- </a>
46
- </li>
47
- {{/if}}
48
- <li>
49
- <a href="{{basePath}}/" class="side-link {{#if (eq currentPath '/')}}active{{/if}}">
50
- {{{icon "home" class="h-4 w-4"}}}
51
- Home
52
- </a>
53
- </li>
54
- <li>
55
- <a href="{{basePath}}/query" class="side-link {{#if (startsWith currentPath '/query')}}active{{/if}}">
56
- {{{icon "query" class="h-4 w-4"}}}
57
- Query editor
58
- </a>
59
- </li>
60
- {{#unless readonly}}
61
- <li>
62
- <a href="{{basePath}}/designer" class="side-link {{#if (startsWith currentPath '/designer')}}active{{/if}}">
63
- {{{icon "plus" class="h-4 w-4"}}}
64
- New table
65
- </a>
66
- </li>
67
- {{/unless}}
68
- </ul>
69
- <div class="mb-2 mt-6 flex items-center justify-between px-3">
70
- <span class="text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Tables</span>
71
- <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>
72
- </div>
73
- <ul id="table-list" class="space-y-0.5">
74
- {{#each tables}}
75
- <li class="table-item" data-name="{{this}}">
76
- <a href="{{../basePath}}/tables/{{this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
77
- <span class="table-icon">
78
- {{{icon "table" class="h-4 w-4"}}}
79
- </span>
80
- <span class="truncate">{{this}}</span>
81
- </a>
82
- </li>
83
- {{else}}
84
- <li class="px-3 py-2 text-xs text-neutral-content/40">No tables yet</li>
85
- {{/each}}
86
- </ul>
87
- {{#if internalTables.length}}
88
- <div class="mb-2 mt-6 px-3 text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Internal</div>
89
- <ul class="space-y-0.5">
90
- {{#each internalTables}}
91
- <li>
92
- <a href="{{../basePath}}/tables/{{this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
93
- <span class="table-icon">
94
- {{{icon "book" class="h-4 w-4"}}}
95
- </span>
96
- <span class="truncate">{{this}}</span>
97
- </a>
98
- </li>
99
- {{/each}}
100
- </ul>
101
- {{/if}}
102
- </nav>
103
- {{/if}}
104
- <div class="border-t border-white/10 px-5 py-3">
105
- <div class="flex items-center justify-between">
106
- <div class="text-[11px] font-medium uppercase tracking-wider text-neutral-content/40">{{#if databasesMode}}Directory{{else}}Engine: {{dialectName}}{{/if}}</div>
107
- {{#unless databasesMode}}
108
- {{#if readonly}}
109
- <span class="rounded bg-warning/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-warning">Read-only</span>
110
- {{else}}
111
- <span class="rounded bg-success/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-success">Writable</span>
112
- {{/if}}
113
- {{/unless}}
114
- </div>
115
- <div class="mt-0.5 truncate font-mono text-[11px] text-neutral-content/60" title="{{dbPath}}">{{dbPath}}</div>
116
- </div>
117
- </aside>
1
+ <aside class="flex h-full min-h-full w-72 flex-col bg-neutral text-neutral-content">
118
2
  <div class="flex items-center gap-2.5 px-5 pb-4 pt-5">
119
3
  <div class="w-full">
120
4
  <div class="flex items-center justify-between">
121
5
  <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>
122
6
  {{#unless databasesMode}}
123
7
  {{#if isPostgres}}
124
8
  <span class="rounded bg-info/20 px-1.5 py-0.5 text-[10px] font-bold text-info">PostgreSQL</span>
125
9
  {{else}}
126
10
  <span class="rounded bg-emerald-500/20 px-1.5 py-0.5 text-[10px] font-bold text-emerald-400">SQLite</span>
127
11
  {{/if}}
128
12
  {{/unless}}
129
13
  </div>
130
14
  <div class="mt-0.5 text-[11px] text-neutral-content/50 truncate">{{#if databasesMode}}Database manager{{else}}{{dbId}}{{/if}}</div>
131
15
  </div>
132
16
  </div>
133
17
  {{#if databasesMode}}
134
18
  <nav class="flex-1 overflow-y-auto px-3 py-2">
135
19
  <ul class="space-y-0.5">
136
20
  <li>
137
21
  <a href="{{basePath}}/" class="side-link active">
138
22
  {{{icon "database" class="h-4 w-4"}}}
139
23
  Databases
140
24
  </a>
141
25
  </li>
142
26
  </ul>
143
27
  </nav>
144
28
  {{else}}
145
29
  <div class="px-4 pb-2">
146
30
  <label class="relative block">
147
31
  <span class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-neutral-content/40">
148
32
  {{{icon "search" class="h-4 w-4"}}}
149
33
  </span>
150
34
  <input id="table-search" type="search" placeholder="Filter tables…" autocomplete="off"
151
35
  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" />
152
36
  </label>
153
37
  </div>
154
38
  <nav class="flex-1 overflow-y-auto px-3 py-2">
155
39
  <ul class="space-y-0.5">
156
40
  {{#if databasesUrl}}
157
41
  <li>
158
42
  <a href="{{databasesUrl}}" class="side-link">
159
43
  {{{icon "database" class="h-4 w-4"}}}
160
44
  Databases
161
45
  </a>
162
46
  </li>
163
47
  {{/if}}
164
48
  <li>
165
49
  <a href="{{basePath}}/" class="side-link {{#if (eq currentPath '/')}}active{{/if}}">
166
50
  {{{icon "home" class="h-4 w-4"}}}
167
51
  Home
168
52
  </a>
169
53
  </li>
170
54
  <li>
171
55
  <a href="{{basePath}}/query" class="side-link {{#if (startsWith currentPath '/query')}}active{{/if}}">
172
56
  {{{icon "query" class="h-4 w-4"}}}
173
57
  Query editor
174
58
  </a>
175
59
  </li>
176
60
  <li>
177
61
  <a href="{{basePath}}/erd" class="side-link {{#if (startsWith currentPath '/erd')}}active{{/if}}">
178
62
  {{{icon "diagram" class="h-4 w-4"}}}
179
63
  ER Diagram
180
64
  </a>
181
65
  </li>
182
66
  <li>
183
67
  <a href="{{basePath}}/seed" class="side-link {{#if (startsWith currentPath '/seed')}}active{{/if}}">
184
68
  {{{icon "seed" class="h-4 w-4"}}}
185
69
  Seed generator
186
70
  </a>
187
71
  </li>
188
72
  <li>
189
73
  <a href="{{basePath}}/info" class="side-link {{#if (startsWith currentPath '/info')}}active{{/if}}">
190
74
  {{{icon "settings" class="h-4 w-4"}}}
191
75
  Info & Settings
192
76
  </a>
193
77
  </li>
194
78
  {{#unless readonly}}
195
79
  <li>
196
80
  <a href="{{basePath}}/designer" class="side-link {{#if (startsWith currentPath '/designer')}}active{{/if}}">
197
81
  {{{icon "plus" class="h-4 w-4"}}}
198
82
  New table
199
83
  </a>
200
84
  </li>
201
85
  {{/unless}}
202
86
  </ul>
203
87
  <div class="mb-2 mt-6 flex items-center justify-between px-3">
204
88
  <span class="text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Tables</span>
205
89
  <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>
206
90
  </div>
207
91
  <ul id="table-list" class="space-y-0.5">
208
92
  {{#each tables}}
209
93
  <li class="table-item" data-name="{{this}}">
210
94
  <a href="{{../basePath}}/tables/{{this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
211
95
  <span class="table-icon">
212
96
  {{{icon "table" class="h-4 w-4"}}}
213
97
  </span>
214
98
  <span class="truncate">{{this}}</span>
215
99
  </a>
216
100
  </li>
217
101
  {{else}}
218
102
  <li class="px-3 py-2 text-xs text-neutral-content/40">No tables yet</li>
219
103
  {{/each}}
220
104
  </ul>
221
105
  {{#if internalTables.length}}
222
106
  <div class="mb-2 mt-6 px-3 text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Internal</div>
223
107
  <ul class="space-y-0.5">
224
108
  {{#each internalTables}}
225
109
  <li>
226
110
  <a href="{{../basePath}}/tables/{{this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
227
111
  <span class="table-icon">
228
112
  {{{icon "book" class="h-4 w-4"}}}
229
113
  </span>
230
114
  <span class="truncate">{{this}}</span>
231
115
  </a>
232
116
  </li>
233
117
  {{/each}}
234
118
  </ul>
235
119
  {{/if}}
236
120
  </nav>
237
121
  {{/if}}
238
122
  {{#if isDefaultPassword}}
239
123
  <div class="border-t border-white/10 px-4 py-2 bg-warning/10">
240
124
  <div class="flex items-center justify-between text-warning text-xs font-semibold">
241
125
  <span class="flex items-center gap-1.5 font-mono text-[11px]">
242
126
  {{{icon "warning" class="h-3.5 w-3.5 shrink-0"}}}
243
127
  default pass active
244
128
  </span>
245
129
  <span class="badge badge-warning badge-xs font-mono font-bold">admin</span>
246
130
  </div>
247
131
  </div>
248
132
  {{/if}}
249
133
  <div class="border-t border-white/10 px-5 py-3">
250
134
  <div class="flex items-center justify-between">
251
135
  <div class="text-[11px] font-medium uppercase tracking-wider text-neutral-content/40">{{#if databasesMode}}Directory{{else}}Engine: {{dialectName}}{{/if}}</div>
252
136
  {{#unless databasesMode}}
253
137
  {{#if readonly}}
254
138
  <span class="rounded bg-warning/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-warning">Read-only</span>
255
139
  {{else}}
256
140
  <span class="rounded bg-success/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-success">Writable</span>
257
141
  {{/if}}
258
142
  {{/unless}}
259
143
  </div>
260
144
  <div class="mt-0.5 truncate font-mono text-[11px] text-neutral-content/60" title="{{dbPath}}">{{dbPath}}</div>
261
145
  </div>