sveltekit-admin 0.2.1 → 0.5.3

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 (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -2
  3. package/dist/index.d.ts +2 -7
  4. package/dist/index.js +2 -13
  5. package/dist/server/auth.d.ts +7 -0
  6. package/dist/server/auth.js +19 -0
  7. package/dist/server/data.d.ts +38 -0
  8. package/dist/server/data.js +116 -0
  9. package/dist/server/handler.d.ts +123 -4
  10. package/dist/server/handler.js +600 -819
  11. package/dist/server/introspection/parser.d.ts +19 -12
  12. package/dist/server/introspection/parser.js +71 -61
  13. package/dist/server/introspection/relations.d.ts +49 -0
  14. package/dist/server/introspection/relations.js +128 -0
  15. package/dist/server/query/filterDetection.d.ts +71 -0
  16. package/dist/server/query/filterDetection.js +153 -0
  17. package/dist/server/query/listQuery.d.ts +92 -0
  18. package/dist/server/query/listQuery.js +442 -0
  19. package/dist/server/query/urls.d.ts +33 -0
  20. package/dist/server/query/urls.js +58 -0
  21. package/dist/server/router.d.ts +6 -0
  22. package/dist/server/router.js +27 -0
  23. package/dist/server/views/Dashboard.svelte +29 -0
  24. package/dist/server/views/Dashboard.svelte.d.ts +15 -0
  25. package/dist/server/views/FieldInput.svelte +63 -0
  26. package/dist/server/views/FieldInput.svelte.d.ts +9 -0
  27. package/dist/server/views/Form.svelte +127 -0
  28. package/dist/server/views/Form.svelte.d.ts +12 -0
  29. package/dist/server/views/Layout.svelte +78 -0
  30. package/dist/server/views/Layout.svelte.d.ts +13 -0
  31. package/dist/server/views/List.svelte +240 -0
  32. package/dist/server/views/List.svelte.d.ts +27 -0
  33. package/dist/server/views/ListFilters.svelte +257 -0
  34. package/dist/server/views/ListFilters.svelte.d.ts +18 -0
  35. package/dist/server/views/ModelCard.svelte +11 -0
  36. package/dist/server/views/ModelCard.svelte.d.ts +8 -0
  37. package/dist/server/views/NotFound.svelte +7 -0
  38. package/dist/server/views/NotFound.svelte.d.ts +7 -0
  39. package/dist/server/views/RelatedBlock.svelte +74 -0
  40. package/dist/server/views/RelatedBlock.svelte.d.ts +11 -0
  41. package/dist/server/views/RelationCheckboxes.svelte +53 -0
  42. package/dist/server/views/RelationCheckboxes.svelte.d.ts +9 -0
  43. package/dist/server/views/RelationSelect.svelte +53 -0
  44. package/dist/server/views/RelationSelect.svelte.d.ts +12 -0
  45. package/dist/server/views/StatCard.svelte +18 -0
  46. package/dist/server/views/StatCard.svelte.d.ts +8 -0
  47. package/dist/server/views/html.d.ts +5 -0
  48. package/dist/server/views/html.js +41 -0
  49. package/dist/server/views/theme.d.ts +1 -0
  50. package/dist/server/views/theme.js +537 -0
  51. package/dist/server/views/types.d.ts +57 -0
  52. package/dist/server/views/types.js +1 -0
  53. package/package.json +24 -26
  54. package/dist/admin.d.ts +0 -227
  55. package/dist/admin.js +0 -369
  56. package/dist/components/AdminForm.svelte +0 -423
  57. package/dist/components/AdminForm.svelte.d.ts +0 -30
  58. package/dist/components/AdminLayout.svelte +0 -328
  59. package/dist/components/AdminLayout.svelte.d.ts +0 -20
  60. package/dist/components/DataTable.svelte +0 -573
  61. package/dist/components/DataTable.svelte.d.ts +0 -25
  62. package/dist/components/index.d.ts +0 -3
  63. package/dist/components/index.js +0 -3
  64. package/dist/server/auth/guard.d.ts +0 -36
  65. package/dist/server/auth/guard.js +0 -38
  66. package/dist/server/auth/index.d.ts +0 -1
  67. package/dist/server/auth/index.js +0 -1
  68. package/dist/server/crud/index.d.ts +0 -1
  69. package/dist/server/crud/index.js +0 -1
  70. package/dist/server/crud/operations.d.ts +0 -87
  71. package/dist/server/crud/operations.js +0 -276
  72. package/dist/server/introspection/index.d.ts +0 -1
  73. package/dist/server/introspection/index.js +0 -1
@@ -0,0 +1,537 @@
1
+ import { adjustColor } from './html.js';
2
+ export function styles(primaryColor) {
3
+ return `
4
+ :root {
5
+ --ska-primary: ${primaryColor};
6
+ --ska-primary-hover: ${adjustColor(primaryColor, -15)};
7
+ }
8
+
9
+ * { box-sizing: border-box; margin: 0; padding: 0; }
10
+
11
+ body {
12
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
13
+ background: #f8fafc;
14
+ color: #1e293b;
15
+ line-height: 1.5;
16
+ }
17
+
18
+ .ska-layout {
19
+ display: flex;
20
+ min-height: 100vh;
21
+ }
22
+
23
+ .ska-sidebar {
24
+ width: 260px;
25
+ background: white;
26
+ border-right: 1px solid #e2e8f0;
27
+ padding: 1.5rem;
28
+ position: fixed;
29
+ height: 100vh;
30
+ overflow-y: auto;
31
+ display: flex;
32
+ flex-direction: column;
33
+ }
34
+
35
+ .ska-logo {
36
+ font-size: 1.25rem;
37
+ font-weight: 700;
38
+ color: var(--ska-primary);
39
+ text-decoration: none;
40
+ display: block;
41
+ margin-bottom: 2rem;
42
+ }
43
+
44
+ .ska-nav { list-style: none; }
45
+
46
+ .ska-nav__item {
47
+ margin-bottom: 0.25rem;
48
+ }
49
+
50
+ .ska-nav__link {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 0.75rem;
54
+ padding: 0.625rem 0.875rem;
55
+ color: #64748b;
56
+ text-decoration: none;
57
+ border-radius: 0.375rem;
58
+ font-size: 0.875rem;
59
+ transition: all 0.15s;
60
+ }
61
+
62
+ .ska-nav__link:hover {
63
+ background: #f1f5f9;
64
+ color: #1e293b;
65
+ }
66
+
67
+ .ska-nav__link--active {
68
+ background: #eef2ff;
69
+ color: var(--ska-primary);
70
+ font-weight: 500;
71
+ }
72
+
73
+ .ska-logout {
74
+ margin-top: auto;
75
+ padding-top: 1rem;
76
+ }
77
+
78
+ .ska-logout__btn {
79
+ display: flex;
80
+ align-items: center;
81
+ gap: 0.75rem;
82
+ width: 100%;
83
+ padding: 0.625rem 0.875rem;
84
+ background: none;
85
+ border: none;
86
+ color: #64748b;
87
+ font-size: 0.875rem;
88
+ font-family: inherit;
89
+ border-radius: 0.375rem;
90
+ cursor: pointer;
91
+ transition: all 0.15s;
92
+ text-align: left;
93
+ }
94
+
95
+ .ska-logout__btn:hover {
96
+ background: #fef2f2;
97
+ color: #dc2626;
98
+ }
99
+
100
+ .ska-main {
101
+ flex: 1;
102
+ margin-left: 260px;
103
+ padding: 2rem;
104
+ }
105
+
106
+ .ska-card {
107
+ background: white;
108
+ border: 1px solid #e2e8f0;
109
+ border-radius: 0.5rem;
110
+ padding: 1.5rem;
111
+ }
112
+
113
+ .ska-btn {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ gap: 0.5rem;
117
+ padding: 0.5rem 1rem;
118
+ font-size: 0.875rem;
119
+ font-weight: 500;
120
+ border-radius: 0.375rem;
121
+ border: none;
122
+ cursor: pointer;
123
+ text-decoration: none;
124
+ transition: all 0.15s;
125
+ }
126
+
127
+ .ska-btn--primary {
128
+ background: var(--ska-primary);
129
+ color: white;
130
+ }
131
+
132
+ .ska-btn--primary:hover {
133
+ background: var(--ska-primary-hover);
134
+ }
135
+
136
+ .ska-btn--secondary {
137
+ background: #f1f5f9;
138
+ color: #475569;
139
+ }
140
+
141
+ .ska-btn--secondary:hover {
142
+ background: #e2e8f0;
143
+ }
144
+
145
+ .ska-btn--danger {
146
+ background: #fef2f2;
147
+ color: #dc2626;
148
+ }
149
+
150
+ .ska-btn--danger:hover {
151
+ background: #fee2e2;
152
+ }
153
+
154
+ .ska-btn--sm {
155
+ padding: 0.375rem 0.75rem;
156
+ font-size: 0.75rem;
157
+ }
158
+
159
+ h1 { font-size: 1.5rem; font-weight: 700; margin-bottom: 0.5rem; }
160
+ h2 { font-size: 1.25rem; font-weight: 600; margin-bottom: 1rem; }
161
+
162
+ .ska-subtitle { color: #64748b; font-size: 0.875rem; margin-bottom: 1.5rem; }
163
+
164
+ /* Table styles */
165
+ .ska-table-wrap { overflow-x: auto; }
166
+
167
+ .ska-table {
168
+ width: 100%;
169
+ border-collapse: collapse;
170
+ font-size: 0.875rem;
171
+ }
172
+
173
+ .ska-table th {
174
+ text-align: left;
175
+ padding: 0.75rem 1rem;
176
+ background: #f8fafc;
177
+ border-bottom: 1px solid #e2e8f0;
178
+ font-weight: 600;
179
+ color: #64748b;
180
+ font-size: 0.75rem;
181
+ text-transform: uppercase;
182
+ letter-spacing: 0.05em;
183
+ }
184
+
185
+ .ska-table td {
186
+ padding: 0.75rem 1rem;
187
+ border-bottom: 1px solid #e2e8f0;
188
+ }
189
+
190
+ .ska-table tr:hover {
191
+ background: #f8fafc;
192
+ }
193
+
194
+ .ska-table__actions {
195
+ display: flex;
196
+ gap: 0.5rem;
197
+ }
198
+
199
+ /* Form styles */
200
+ .ska-form { max-width: 600px; }
201
+
202
+ .ska-field {
203
+ margin-bottom: 1.25rem;
204
+ }
205
+
206
+ .ska-label {
207
+ display: block;
208
+ font-size: 0.875rem;
209
+ font-weight: 500;
210
+ color: #374151;
211
+ margin-bottom: 0.375rem;
212
+ }
213
+
214
+ .ska-input {
215
+ width: 100%;
216
+ padding: 0.625rem 0.875rem;
217
+ font-size: 0.875rem;
218
+ border: 1px solid #d1d5db;
219
+ border-radius: 0.375rem;
220
+ transition: all 0.15s;
221
+ }
222
+
223
+ .ska-input:focus {
224
+ outline: none;
225
+ border-color: var(--ska-primary);
226
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
227
+ }
228
+
229
+ .ska-input[readonly] {
230
+ background: #f9fafb;
231
+ color: #6b7280;
232
+ }
233
+
234
+ .ska-checkbox-wrap {
235
+ display: flex;
236
+ align-items: center;
237
+ gap: 0.5rem;
238
+ }
239
+
240
+ .ska-checkbox {
241
+ width: 1rem;
242
+ height: 1rem;
243
+ }
244
+
245
+ .ska-checkbox-group {
246
+ border: 1px solid #e2e8f0;
247
+ border-radius: 0.5rem;
248
+ padding: 0.75rem;
249
+ max-height: 220px;
250
+ overflow-y: auto;
251
+ display: flex;
252
+ flex-direction: column;
253
+ gap: 0.375rem;
254
+ }
255
+
256
+ .ska-related-row {
257
+ display: flex;
258
+ align-items: center;
259
+ gap: 0.75rem;
260
+ padding: 0.625rem 0;
261
+ border-bottom: 1px solid #f1f5f9;
262
+ }
263
+ .ska-related-row:last-child { border-bottom: none; }
264
+
265
+ .ska-form__actions {
266
+ display: flex;
267
+ gap: 0.75rem;
268
+ margin-top: 1.5rem;
269
+ padding-top: 1.5rem;
270
+ border-top: 1px solid #e2e8f0;
271
+ }
272
+
273
+ /* Stats grid */
274
+ .ska-stats {
275
+ display: grid;
276
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
277
+ gap: 1rem;
278
+ margin-bottom: 2rem;
279
+ }
280
+
281
+ .ska-stat {
282
+ background: white;
283
+ border: 1px solid #e2e8f0;
284
+ border-radius: 0.5rem;
285
+ padding: 1.25rem;
286
+ display: flex;
287
+ align-items: center;
288
+ gap: 1rem;
289
+ }
290
+
291
+ .ska-stat__icon {
292
+ width: 3rem;
293
+ height: 3rem;
294
+ background: #eef2ff;
295
+ border-radius: 0.5rem;
296
+ display: flex;
297
+ align-items: center;
298
+ justify-content: center;
299
+ color: var(--ska-primary);
300
+ }
301
+
302
+ .ska-stat__value {
303
+ font-size: 1.5rem;
304
+ font-weight: 700;
305
+ }
306
+
307
+ .ska-stat__label {
308
+ font-size: 0.875rem;
309
+ color: #64748b;
310
+ }
311
+
312
+ /* Models grid */
313
+ .ska-models {
314
+ display: grid;
315
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
316
+ gap: 1rem;
317
+ }
318
+
319
+ .ska-model-card {
320
+ background: white;
321
+ border: 1px solid #e2e8f0;
322
+ border-radius: 0.5rem;
323
+ padding: 1.25rem;
324
+ text-decoration: none;
325
+ transition: all 0.15s;
326
+ display: flex;
327
+ flex-direction: column;
328
+ justify-content: space-between;
329
+ min-height: 100px;
330
+ }
331
+
332
+ .ska-model-card:hover {
333
+ border-color: var(--ska-primary);
334
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
335
+ }
336
+
337
+ .ska-model-card__name {
338
+ font-weight: 600;
339
+ color: #1e293b;
340
+ margin-bottom: 0.25rem;
341
+ }
342
+
343
+ .ska-model-card__count {
344
+ font-size: 0.75rem;
345
+ color: #64748b;
346
+ }
347
+
348
+ .ska-model-card__footer {
349
+ color: var(--ska-primary);
350
+ font-size: 0.875rem;
351
+ font-weight: 500;
352
+ }
353
+
354
+ /* Header with actions */
355
+ .ska-header {
356
+ display: flex;
357
+ justify-content: space-between;
358
+ align-items: flex-start;
359
+ margin-bottom: 1.5rem;
360
+ }
361
+
362
+ /* Pagination */
363
+ .ska-pagination {
364
+ display: flex;
365
+ align-items: center;
366
+ gap: 0.5rem;
367
+ margin-top: 1rem;
368
+ padding-top: 1rem;
369
+ border-top: 1px solid #e2e8f0;
370
+ }
371
+
372
+ .ska-pagination__info {
373
+ font-size: 0.875rem;
374
+ color: #64748b;
375
+ margin-right: auto;
376
+ }
377
+
378
+ /* Search */
379
+ .ska-search {
380
+ margin-bottom: 1rem;
381
+ }
382
+
383
+ .ska-search__input {
384
+ padding: 0.5rem 1rem;
385
+ border: 1px solid #e2e8f0;
386
+ border-radius: 0.375rem;
387
+ font-size: 0.875rem;
388
+ width: 300px;
389
+ }
390
+
391
+ /* Filter sidebar */
392
+ .ska-filters {
393
+ margin-bottom: 1.5rem;
394
+ display: flex;
395
+ flex-direction: column;
396
+ gap: 0.75rem;
397
+ }
398
+
399
+ .ska-filters__group {
400
+ display: flex;
401
+ align-items: center;
402
+ flex-wrap: wrap;
403
+ gap: 0.625rem;
404
+ }
405
+
406
+ .ska-filters__group + .ska-filters__group {
407
+ padding-top: 0.75rem;
408
+ border-top: 1px solid #f1f5f9;
409
+ }
410
+
411
+ .ska-filters__title {
412
+ font-size: 0.6875rem;
413
+ font-weight: 600;
414
+ text-transform: uppercase;
415
+ letter-spacing: 0.05em;
416
+ color: #94a3b8;
417
+ min-width: 88px;
418
+ flex-shrink: 0;
419
+ }
420
+
421
+ .ska-filters__list {
422
+ list-style: none;
423
+ display: flex;
424
+ flex-wrap: wrap;
425
+ gap: 0.375rem;
426
+ }
427
+
428
+ .ska-filters__link {
429
+ display: inline-flex;
430
+ align-items: center;
431
+ padding: 0.25rem 0.625rem;
432
+ border-radius: 999px;
433
+ border: 1px solid #e2e8f0;
434
+ color: #475569;
435
+ text-decoration: none;
436
+ font-size: 0.8125rem;
437
+ line-height: 1.25rem;
438
+ white-space: nowrap;
439
+ transition: all 0.15s;
440
+ }
441
+
442
+ .ska-filters__link:hover {
443
+ background: #f1f5f9;
444
+ border-color: #cbd5e1;
445
+ }
446
+
447
+ .ska-filters__link--active {
448
+ background: var(--ska-primary);
449
+ border-color: var(--ska-primary);
450
+ color: white;
451
+ font-weight: 500;
452
+ }
453
+
454
+ .ska-filters__range,
455
+ .ska-filters__select {
456
+ display: flex;
457
+ align-items: center;
458
+ gap: 0.5rem;
459
+ }
460
+
461
+ .ska-filters__range-input {
462
+ padding: 0.25rem 0.5rem;
463
+ border: 1px solid #e2e8f0;
464
+ border-radius: 0.25rem;
465
+ font-size: 0.8125rem;
466
+ width: 6.5rem;
467
+ }
468
+
469
+ .ska-filters__select-input {
470
+ padding: 0.25rem 0.625rem;
471
+ border: 1px solid #e2e8f0;
472
+ border-radius: 0.25rem;
473
+ font-size: 0.8125rem;
474
+ color: #475569;
475
+ background: white;
476
+ max-width: 220px;
477
+ }
478
+
479
+ .ska-filters__chip {
480
+ display: inline-flex;
481
+ align-items: center;
482
+ gap: 0.375rem;
483
+ padding: 0.25rem 0.5rem 0.25rem 0.625rem;
484
+ border-radius: 999px;
485
+ background: #eef2ff;
486
+ color: var(--ska-primary);
487
+ font-size: 0.8125rem;
488
+ }
489
+
490
+ .ska-filters__chip a {
491
+ color: inherit;
492
+ text-decoration: none;
493
+ }
494
+
495
+ .ska-filters__chip-clear {
496
+ color: #64748b;
497
+ text-decoration: none;
498
+ line-height: 1;
499
+ }
500
+
501
+ .ska-filters__chip-clear:hover {
502
+ color: #dc2626;
503
+ }
504
+
505
+ /* Back link */
506
+ .ska-back {
507
+ display: inline-flex;
508
+ align-items: center;
509
+ gap: 0.25rem;
510
+ color: #64748b;
511
+ text-decoration: none;
512
+ font-size: 0.875rem;
513
+ margin-bottom: 0.5rem;
514
+ }
515
+
516
+ .ska-back:hover { color: #475569; }
517
+
518
+ /* Alert */
519
+ .ska-alert {
520
+ padding: 1rem;
521
+ border-radius: 0.375rem;
522
+ margin-bottom: 1rem;
523
+ }
524
+
525
+ .ska-alert--error {
526
+ background: #fef2f2;
527
+ color: #dc2626;
528
+ border: 1px solid #fecaca;
529
+ }
530
+
531
+ .ska-alert--success {
532
+ background: #f0fdf4;
533
+ color: #16a34a;
534
+ border: 1px solid #bbf7d0;
535
+ }
536
+ `;
537
+ }
@@ -0,0 +1,57 @@
1
+ import type { PrismaField } from '../introspection/parser.js';
2
+ import type { RelationGraph } from '../introspection/relations.js';
3
+ export interface RelationOption {
4
+ id: string | number;
5
+ label: string;
6
+ }
7
+ export interface RelationMeta {
8
+ /** true si la cible dépasse le seuil dur — rendre un raw-id, pas un select */
9
+ tooMany: boolean;
10
+ options: RelationOption[];
11
+ /** N-N uniquement : IDs actuellement liés (absent en création) */
12
+ selectedIds?: (string | number)[];
13
+ }
14
+ export interface ViewModel {
15
+ name: string;
16
+ label: string;
17
+ fields: PrismaField[];
18
+ primaryKey: string;
19
+ relationGraph?: RelationGraph;
20
+ /** Options résolues pour chaque arête to-one-owning, indexées par "Model.field" */
21
+ relationOptions?: Map<string, RelationMeta>;
22
+ /** Compteurs des relations inverses (1-N, 1-1), indexés par "Model.field" */
23
+ relatedCounts?: Map<string, number>;
24
+ }
25
+ /**
26
+ * Résolution async d'un filtre FK (kind 'fk' dans ResolvedFilterField) :
27
+ * options scopées pour la sidebar + label du chip actif scopé lui aussi
28
+ * (docs/design/list-search-filters.md §6.3). Chargé par requête, jamais
29
+ * auto-détecté (contrairement à Boolean/enum dont le domaine est statique).
30
+ */
31
+ export interface FkFilterMeta {
32
+ /** Nom du scalaire FK, ex: `authorId`. */
33
+ field: string;
34
+ label: string;
35
+ /** Nom du champ relation owning, ex: `author`. */
36
+ relationField: string;
37
+ /** Nom du modèle cible, ex: `User`. */
38
+ targetModel: string;
39
+ /** Options résolues et scopées (vide si tooMany). */
40
+ options: RelationOption[];
41
+ /** Décision de rendu par cardinalité : liens ≤ 20, select ≤ 200, raw-id au-delà. */
42
+ mode: 'links' | 'select' | 'raw-id';
43
+ /** true si la cible dépasse selectThreshold : rendre un raw-id, pas une liste. */
44
+ tooMany: boolean;
45
+ /**
46
+ * Label du chip actif, résolu via findFirst SCOPÉ (§6.3.b) — undefined
47
+ * si l'ID actif est hors scope (le composant affiche alors l'ID brut,
48
+ * jamais le label, sinon c'est un oracle inter-tenants).
49
+ */
50
+ activeLabel?: string;
51
+ /**
52
+ * Lien vers la fiche de la cible pour le chip actif, seulement si le modèle
53
+ * cible est visible dans l'admin. Absent pour une cible exclue/masquée :
54
+ * aucun lien mort vers une page inaccessible (§6.4).
55
+ */
56
+ activeHref?: string;
57
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sveltekit-admin",
3
- "version": "0.2.1",
4
- "description": "Django-like admin panel for SvelteKit + Prisma + better-auth",
3
+ "version": "0.5.3",
4
+ "description": "Django-like admin panel for SvelteKit + Prisma",
5
5
  "type": "module",
6
6
  "svelte": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -10,15 +10,6 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "svelte": "./dist/index.js",
12
12
  "default": "./dist/index.js"
13
- },
14
- "./components": {
15
- "types": "./dist/components/index.d.ts",
16
- "svelte": "./dist/components/index.js",
17
- "default": "./dist/components/index.js"
18
- },
19
- "./admin": {
20
- "types": "./dist/admin.d.ts",
21
- "default": "./dist/admin.js"
22
13
  }
23
14
  },
24
15
  "files": [
@@ -29,34 +20,42 @@
29
20
  "scripts": {
30
21
  "dev": "vite dev",
31
22
  "build": "npm run package",
32
- "package": "svelte-kit sync && svelte-package -o dist",
23
+ "package": "svelte-kit sync && svelte-package -o dist && echo 'Package size:' && bun pm pack --dry-run 2>&1 | grep -E 'Total files|Unpacked size'",
33
24
  "prepublishOnly": "npm run package",
25
+ "size": "bun run package && node scripts/package-size.mjs",
34
26
  "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
35
27
  "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
36
- "test": "vitest",
37
- "lint": "eslint .",
28
+ "test:gen": "prisma generate --schema tests/fixtures/prisma/schema.prisma",
29
+ "test": "svelte-kit sync && npm run test:gen && vitest run",
30
+ "test:watch": "svelte-kit sync && npm run test:gen && vitest",
31
+ "test:coverage": "svelte-kit sync && npm run test:gen && vitest run --coverage",
32
+ "lint": "svelte-kit sync && eslint .",
38
33
  "format": "prettier --write ."
39
34
  },
40
35
  "peerDependencies": {
41
36
  "@prisma/client": ">=5.0.0",
42
- "svelte": ">=5.0.0",
43
- "@sveltejs/kit": ">=2.0.0"
44
- },
45
- "peerDependenciesMeta": {
46
- "better-auth": {
47
- "optional": true
48
- }
37
+ "@sveltejs/kit": ">=2.0.0",
38
+ "svelte": ">=5.0.0"
49
39
  },
50
40
  "devDependencies": {
41
+ "@eslint/js": "9",
42
+ "@prisma/client": "^6.19.3",
51
43
  "@sveltejs/adapter-auto": "^7.0.1",
52
44
  "@sveltejs/kit": "^2.0.0",
53
45
  "@sveltejs/package": "^2.5.8",
54
46
  "@sveltejs/vite-plugin-svelte": "^4.0.0",
55
47
  "@types/node": "^22.0.0",
48
+ "@vitest/coverage-v8": "^3.2.7",
49
+ "eslint": "9",
50
+ "eslint-config-prettier": "^10.1.8",
51
+ "eslint-plugin-svelte": "^3.22.0",
52
+ "globals": "^17.9.0",
56
53
  "prettier": "^3.0.0",
54
+ "prisma": "^6.19.3",
57
55
  "svelte": "^5.0.0",
58
56
  "svelte-check": "^4.0.0",
59
57
  "typescript": "^5.0.0",
58
+ "typescript-eslint": "8",
60
59
  "vite": "^6.0.0",
61
60
  "vitest": "^3.0.0"
62
61
  },
@@ -65,7 +64,6 @@
65
64
  "sveltekit",
66
65
  "admin",
67
66
  "prisma",
68
- "better-auth",
69
67
  "crud",
70
68
  "dashboard",
71
69
  "admin-panel"
@@ -73,11 +71,11 @@
73
71
  "license": "MIT",
74
72
  "repository": {
75
73
  "type": "git",
76
- "url": "https://github.com/pmusic-music/sveltekit-admin.git"
74
+ "url": "git+https://github.com/dotNacer/sveltekit-admin.git"
77
75
  },
78
- "homepage": "https://github.com/pmusic-music/sveltekit-admin#readme",
76
+ "homepage": "https://github.com/dotNacer/sveltekit-admin#readme",
79
77
  "bugs": {
80
- "url": "https://github.com/pmusic-music/sveltekit-admin/issues"
78
+ "url": "https://github.com/dotNacer/sveltekit-admin/issues"
81
79
  },
82
- "author": "pMusic"
80
+ "author": "dotNacer"
83
81
  }