firstly 0.10.4 → 0.10.6
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.
- package/CHANGELOG.md +16 -0
- package/esm/carbone/CarboneController.js +117 -103
- package/esm/feedback/FeedbackController.js +310 -289
- package/esm/mail/ui/LastMails.svelte +2 -1
- package/esm/sqlAdmin/SqlAdminController.d.ts +1 -0
- package/esm/sqlAdmin/SqlAdminController.js +33 -25
- package/esm/sqlAdmin/SqlDriftController.js +25 -13
- package/esm/sqlAdmin/server/drift/catalog.d.ts +4 -0
- package/esm/sqlAdmin/server/drift/catalog.js +25 -0
- package/esm/sqlAdmin/server/drift/createIndex.d.ts +2 -0
- package/esm/sqlAdmin/server/drift/createIndex.js +2 -1
- package/esm/sqlAdmin/server/drift/ident.d.ts +16 -0
- package/esm/sqlAdmin/server/drift/ident.js +22 -0
- package/esm/sqlAdmin/server/drift/nullable.js +11 -12
- package/esm/sqlAdmin/server/drift/orphanColumns.js +9 -8
- package/esm/sqlAdmin/server/drift/planPkSync.d.ts +4 -3
- package/esm/sqlAdmin/server/drift/planPkSync.js +8 -12
- package/esm/sqlAdmin/server/drift/primaryKeys.js +13 -10
- package/esm/sqlAdmin/server/drift/relationIndexes.d.ts +3 -3
- package/esm/sqlAdmin/server/drift/relationIndexes.js +23 -12
- package/esm/sqlAdmin/ui/SqlDrift.svelte +25 -19
- package/esm/sqlAdmin/ui/SqlTokens.svelte +5 -4
- package/package.json +2 -2
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { onMount } from 'svelte'
|
|
9
9
|
import { SvelteSet } from 'svelte/reactivity'
|
|
10
10
|
|
|
11
|
+
import { errorMessage } from '../../core/helper.js'
|
|
11
12
|
import { SqlDriftController, type SqlDriftFlag } from '../SqlDriftController'
|
|
12
13
|
|
|
13
14
|
// Inferred from the BackendMethods, so this never imports from `server/`.
|
|
@@ -22,7 +23,7 @@
|
|
|
22
23
|
try {
|
|
23
24
|
flags = await SqlDriftController.driftFlags()
|
|
24
25
|
} catch (e) {
|
|
25
|
-
flagsError =
|
|
26
|
+
flagsError = errorMessage(e)
|
|
26
27
|
}
|
|
27
28
|
})
|
|
28
29
|
|
|
@@ -31,14 +32,15 @@
|
|
|
31
32
|
let pkError = $state('')
|
|
32
33
|
let pkResult = $state<PkResult | null>(null)
|
|
33
34
|
|
|
35
|
+
const PK_ORDER = { migrate: 0, create: 0, missing: 1, ok: 2 } as const
|
|
34
36
|
const pkPlans = $derived(
|
|
35
|
-
(pkResult?.plans ?? []).toSorted(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
(pkResult?.plans ?? []).toSorted(
|
|
38
|
+
(a, b) => PK_ORDER[a.action] - PK_ORDER[b.action] || a.table.localeCompare(b.table),
|
|
39
|
+
),
|
|
40
|
+
)
|
|
41
|
+
const pkDrift = $derived(
|
|
42
|
+
pkPlans.filter((p) => p.action === 'migrate' || p.action === 'create').length,
|
|
40
43
|
)
|
|
41
|
-
const pkDrift = $derived(pkPlans.filter((p) => p.action !== 'ok').length)
|
|
42
44
|
|
|
43
45
|
async function runPk(apply: boolean) {
|
|
44
46
|
if (
|
|
@@ -52,7 +54,7 @@
|
|
|
52
54
|
pkResult = await SqlDriftController.primaryKeys({ apply })
|
|
53
55
|
console.info('for AI:', JSON.stringify(pkResult))
|
|
54
56
|
} catch (e) {
|
|
55
|
-
pkError =
|
|
57
|
+
pkError = errorMessage(e)
|
|
56
58
|
} finally {
|
|
57
59
|
pkLoading = false
|
|
58
60
|
}
|
|
@@ -63,12 +65,11 @@
|
|
|
63
65
|
let relError = $state('')
|
|
64
66
|
let relResult = $state<RelResult | null>(null)
|
|
65
67
|
|
|
68
|
+
const REL_ORDER = { create: 0, missing: 1, ok: 2 } as const
|
|
66
69
|
const relPlans = $derived(
|
|
67
|
-
(relResult?.plans ?? []).toSorted(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return a.name.localeCompare(b.name)
|
|
71
|
-
}),
|
|
70
|
+
(relResult?.plans ?? []).toSorted(
|
|
71
|
+
(a, b) => REL_ORDER[a.action] - REL_ORDER[b.action] || a.name.localeCompare(b.name),
|
|
72
|
+
),
|
|
72
73
|
)
|
|
73
74
|
const relMissing = $derived(relPlans.filter((p) => p.action === 'create').length)
|
|
74
75
|
|
|
@@ -80,7 +81,7 @@
|
|
|
80
81
|
relResult = await SqlDriftController.relationIndexes({ apply })
|
|
81
82
|
console.info('for AI:', JSON.stringify(relResult))
|
|
82
83
|
} catch (e) {
|
|
83
|
-
relError =
|
|
84
|
+
relError = errorMessage(e)
|
|
84
85
|
} finally {
|
|
85
86
|
relLoading = false
|
|
86
87
|
}
|
|
@@ -127,7 +128,7 @@
|
|
|
127
128
|
selected.clear()
|
|
128
129
|
console.info('for AI:', JSON.stringify(dropResult))
|
|
129
130
|
} catch (e) {
|
|
130
|
-
dropError =
|
|
131
|
+
dropError = errorMessage(e)
|
|
131
132
|
} finally {
|
|
132
133
|
dropLoading = false
|
|
133
134
|
}
|
|
@@ -175,7 +176,7 @@
|
|
|
175
176
|
nullSelected.clear()
|
|
176
177
|
console.info('for AI:', JSON.stringify(nullResult))
|
|
177
178
|
} catch (e) {
|
|
178
|
-
nullError =
|
|
179
|
+
nullError = errorMessage(e)
|
|
179
180
|
} finally {
|
|
180
181
|
nullLoading = false
|
|
181
182
|
}
|
|
@@ -282,9 +283,10 @@
|
|
|
282
283
|
</td>
|
|
283
284
|
<td
|
|
284
285
|
class="border-border border-b px-3 py-2 font-mono"
|
|
285
|
-
class:text-primary={p.action
|
|
286
|
+
class:text-primary={p.action === 'migrate' || p.action === 'create'}
|
|
287
|
+
class:text-muted-foreground={p.action === 'missing'}
|
|
286
288
|
>
|
|
287
|
-
{p.action}
|
|
289
|
+
{p.action === 'missing' ? 'table missing · run migrations first' : p.action}
|
|
288
290
|
</td>
|
|
289
291
|
</tr>
|
|
290
292
|
{/each}
|
|
@@ -339,7 +341,11 @@
|
|
|
339
341
|
class="border-border border-b px-3 py-2 font-mono"
|
|
340
342
|
class:text-primary={p.action === 'create'}
|
|
341
343
|
>
|
|
342
|
-
{p.action === '
|
|
344
|
+
{p.action === 'ok'
|
|
345
|
+
? `covered · ${p.coveredBy}`
|
|
346
|
+
: p.action === 'missing'
|
|
347
|
+
? 'table missing · run migrations first'
|
|
348
|
+
: 'create'}
|
|
343
349
|
</td>
|
|
344
350
|
</tr>
|
|
345
351
|
{/each}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { repo } from 'remult'
|
|
8
8
|
|
|
9
|
+
import { errorMessage } from '../../core/helper.js'
|
|
9
10
|
import { log } from '../index'
|
|
10
11
|
import { SqlAdminController } from '../SqlAdminController'
|
|
11
12
|
import {
|
|
@@ -73,7 +74,7 @@
|
|
|
73
74
|
name = ''
|
|
74
75
|
await refresh()
|
|
75
76
|
} catch (err) {
|
|
76
|
-
error =
|
|
77
|
+
error = errorMessage(err)
|
|
77
78
|
} finally {
|
|
78
79
|
busy = false
|
|
79
80
|
}
|
|
@@ -86,7 +87,7 @@
|
|
|
86
87
|
await repo(SqlToken).update(t.id, { revokedAt: new Date() })
|
|
87
88
|
await refresh()
|
|
88
89
|
} catch (err) {
|
|
89
|
-
error =
|
|
90
|
+
error = errorMessage(err)
|
|
90
91
|
} finally {
|
|
91
92
|
busy = false
|
|
92
93
|
}
|
|
@@ -100,7 +101,7 @@
|
|
|
100
101
|
await repo(SqlToken).delete(t)
|
|
101
102
|
await refresh()
|
|
102
103
|
} catch (err) {
|
|
103
|
-
error =
|
|
104
|
+
error = errorMessage(err)
|
|
104
105
|
} finally {
|
|
105
106
|
busy = false
|
|
106
107
|
}
|
|
@@ -114,7 +115,7 @@
|
|
|
114
115
|
await SqlAdminController.purgeTokens()
|
|
115
116
|
await refresh()
|
|
116
117
|
} catch (err) {
|
|
117
|
-
error =
|
|
118
|
+
error = errorMessage(err)
|
|
118
119
|
} finally {
|
|
119
120
|
busy = false
|
|
120
121
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "firstly",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Firstly, an opinionated Remult setup!",
|
|
6
6
|
"bin": {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"clsx": "2.1.1",
|
|
42
42
|
"cron": "4.4.0",
|
|
43
43
|
"esm-env": "1.2.2",
|
|
44
|
-
"nodemailer": "
|
|
44
|
+
"nodemailer": "10.0.10",
|
|
45
45
|
"svelte-sonner": "1.2.1",
|
|
46
46
|
"tailwind-merge": "3.7.0",
|
|
47
47
|
"tailwindcss": "4.3.0",
|