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.
@@ -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 = e instanceof Error ? e.message : String(e)
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((a, b) => {
36
- if (a.action === 'ok' && b.action !== 'ok') return 1
37
- if (a.action !== 'ok' && b.action === 'ok') return -1
38
- return a.table.localeCompare(b.table)
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 = e instanceof Error ? e.message : String(e)
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((a, b) => {
68
- if (a.action === 'ok' && b.action !== 'ok') return 1
69
- if (a.action !== 'ok' && b.action === 'ok') return -1
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 = e instanceof Error ? e.message : String(e)
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 = e instanceof Error ? e.message : String(e)
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 = e instanceof Error ? e.message : String(e)
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 !== 'ok'}
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 === 'create' ? 'create' : `covered · ${p.coveredBy}`}
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 = err instanceof Error ? err.message : String(err)
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 = err instanceof Error ? err.message : String(err)
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 = err instanceof Error ? err.message : String(err)
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 = err instanceof Error ? err.message : String(err)
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.4",
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": "8.0.5",
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",