sveltekit-admin 0.5.3 → 0.8.1

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 (71) hide show
  1. package/README.md +89 -1
  2. package/dist/index.d.ts +6 -1
  3. package/dist/index.js +2 -1
  4. package/dist/server/adapters/drizzle/dataAdapter.d.ts +11 -0
  5. package/dist/server/adapters/drizzle/dataAdapter.js +328 -0
  6. package/dist/server/adapters/drizzle/filterCompiler.d.ts +8 -0
  7. package/dist/server/adapters/drizzle/filterCompiler.js +61 -0
  8. package/dist/server/adapters/drizzle/index.d.ts +22 -0
  9. package/dist/server/adapters/drizzle/index.js +27 -0
  10. package/dist/server/adapters/drizzle/inspect.d.ts +23 -0
  11. package/dist/server/adapters/drizzle/inspect.js +220 -0
  12. package/dist/server/adapters/drizzle/introspector.d.ts +3 -0
  13. package/dist/server/adapters/drizzle/introspector.js +3 -0
  14. package/dist/server/adapters/filter.d.ts +12 -0
  15. package/dist/server/adapters/filter.js +72 -0
  16. package/dist/server/adapters/prisma/dataAdapter.d.ts +13 -0
  17. package/dist/server/adapters/prisma/dataAdapter.js +138 -0
  18. package/dist/server/adapters/prisma/filterCompiler.d.ts +9 -0
  19. package/dist/server/adapters/prisma/filterCompiler.js +42 -0
  20. package/dist/server/adapters/prisma/handler.d.ts +14 -0
  21. package/dist/server/adapters/prisma/handler.js +37 -0
  22. package/dist/server/adapters/prisma/index.d.ts +28 -0
  23. package/dist/server/adapters/prisma/index.js +32 -0
  24. package/dist/server/adapters/prisma/introspector.d.ts +4 -0
  25. package/dist/server/adapters/prisma/introspector.js +9 -0
  26. package/dist/server/adapters/retry.d.ts +27 -0
  27. package/dist/server/adapters/retry.js +53 -0
  28. package/dist/server/adapters/types.d.ts +86 -0
  29. package/dist/server/adapters/types.js +1 -0
  30. package/dist/server/audit.d.ts +65 -0
  31. package/dist/server/audit.js +106 -0
  32. package/dist/server/csrf.d.ts +33 -0
  33. package/dist/server/csrf.js +55 -0
  34. package/dist/server/data.d.ts +0 -8
  35. package/dist/server/data.js +0 -41
  36. package/dist/server/errors.d.ts +47 -0
  37. package/dist/server/errors.js +90 -0
  38. package/dist/server/handler.d.ts +63 -16
  39. package/dist/server/handler.js +212 -535
  40. package/dist/server/introspection/parser.d.ts +4 -40
  41. package/dist/server/introspection/relations.d.ts +1 -1
  42. package/dist/server/introspection/relations.js +1 -1
  43. package/dist/server/mutations.d.ts +9 -0
  44. package/dist/server/mutations.js +295 -0
  45. package/dist/server/plugin.d.ts +47 -0
  46. package/dist/server/plugin.js +1 -0
  47. package/dist/server/pluginAccess.d.ts +7 -0
  48. package/dist/server/pluginAccess.js +79 -0
  49. package/dist/server/pluginRegistry.d.ts +12 -0
  50. package/dist/server/pluginRegistry.js +72 -0
  51. package/dist/server/query/listQuery.d.ts +6 -12
  52. package/dist/server/query/listQuery.js +31 -53
  53. package/dist/server/relationLoaders.d.ts +42 -0
  54. package/dist/server/relationLoaders.js +188 -0
  55. package/dist/server/router.d.ts +10 -0
  56. package/dist/server/router.js +42 -19
  57. package/dist/server/runtime.d.ts +46 -0
  58. package/dist/server/runtime.js +210 -0
  59. package/dist/server/search.d.ts +14 -0
  60. package/dist/server/search.js +78 -0
  61. package/dist/server/types/schema.d.ts +40 -0
  62. package/dist/server/types/schema.js +8 -0
  63. package/dist/server/views/Form.svelte +27 -3
  64. package/dist/server/views/Form.svelte.d.ts +2 -1
  65. package/dist/server/views/Layout.svelte +27 -2
  66. package/dist/server/views/Layout.svelte.d.ts +2 -0
  67. package/dist/server/views/List.svelte +28 -3
  68. package/dist/server/views/List.svelte.d.ts +2 -2
  69. package/dist/server/views/RelationCheckboxes.svelte +1 -1
  70. package/dist/server/views/types.d.ts +8 -0
  71. package/package.json +40 -17
@@ -2,11 +2,21 @@
2
2
  * SvelteKit Admin - Standalone Handler
3
3
  * Zero files needed in routes - everything handled via hook
4
4
  */
5
+ import type { DataAdapter, SchemaIntrospector } from './adapters/types.js';
6
+ import type { AuditEvent } from './audit.js';
7
+ import { type CsrfConfig } from './csrf.js';
8
+ import type { AdminPlugin } from './plugin.js';
5
9
  export interface AdminHandlerConfig {
6
- /** Prisma client instance */
7
- prisma: any;
8
- /** Path to Prisma schema file */
9
- prismaSchemaPath?: string;
10
+ /**
11
+ * Explicit `{ introspector, data }` pair, from `createPrismaAdapter`,
12
+ * `createDrizzleAdapter`, or a custom implementation. The `{ prisma,
13
+ * prismaSchemaPath }` shortcut lives on the Prisma wrapper exported by
14
+ * the package root, not here.
15
+ */
16
+ adapter: {
17
+ introspector: SchemaIntrospector;
18
+ data: DataAdapter;
19
+ };
10
20
  /** Base path for admin routes (default: /admin) */
11
21
  basePath?: string;
12
22
  /** Authentication check - return true if user can access admin */
@@ -32,12 +42,50 @@ export interface AdminHandlerConfig {
32
42
  logout?: (event: any) => void | Promise<void>;
33
43
  /** Where to redirect after logout (default: '/') */
34
44
  logoutRedirectTo?: string;
45
+ /**
46
+ * Cross-site protection for every state-changing admin request (create /
47
+ * update / delete, `_logout`, `_search`). On by default; a missing `Origin`
48
+ * is rejected, as SvelteKit does. `trustedOrigins` allows a second
49
+ * legitimate origin, `csrf: false` opts out entirely.
50
+ *
51
+ * Why this isn't left to `kit.csrf.checkOrigin`, and the same-origin threat
52
+ * it does not cover: see `csrf.ts` and /docs/csrf.
53
+ */
54
+ csrf?: CsrfConfig;
55
+ /**
56
+ * Audit sink — same "bring your own" philosophy as `authCheck` / `logout`.
57
+ * The library has no log table and no session of its own, so it cannot
58
+ * know where to persist "admin X changed row Y" (your `AuditLog` model,
59
+ * a logger, an HTTP sink…). You provide the side effect; the handler
60
+ * calls it **after a successful create / update / delete** with a
61
+ * redacted `AuditEvent`. No callback means no behaviour change: no
62
+ * extra reads, no calls.
63
+ *
64
+ * The actor is whatever you already put on `event.locals` (the same
65
+ * object `authCheck` sees). Sensitive field names (`password` / `hash` /
66
+ * `secret` / `token`) and per-model `hidden` fields are stripped from
67
+ * `values` / `before` / `after` / `changes` so the sink cannot become a
68
+ * second oracle for secrets. Reads (GET), logout, and `_search` are
69
+ * not audited.
70
+ *
71
+ * Awaited before the 303 so a `prisma.auditLog.create(...)` inside the
72
+ * callback commits before the redirect. If the callback throws, the
73
+ * mutation still redirects — the write is the source of truth, the log
74
+ * is a sidecar (`console.error` with prefix
75
+ * `[sveltekit-admin] audit callback failed:`). There is no way to wrap
76
+ * the adapter write and your sink in one transaction without owning
77
+ * both stores.
78
+ */
79
+ audit?: (entry: AuditEvent) => void | Promise<void>;
35
80
  /** Per-model configuration */
36
81
  models?: Record<string, {
37
82
  hidden?: string[];
38
83
  readonly?: string[];
39
84
  listFields?: string[];
40
85
  label?: string;
86
+ scope?: (ctx: {
87
+ locals?: any;
88
+ }) => Record<string, unknown> | import('./adapters/types.js').Filter;
41
89
  /**
42
90
  * Scoping `where` applied to the LIST VIEW ONLY of this model
43
91
  * (search, sidebar filters, FK filter, pagination count) — composed
@@ -129,23 +177,22 @@ export interface AdminHandlerConfig {
129
177
  linkThreshold?: number;
130
178
  autoDetect?: boolean;
131
179
  };
132
- /**
133
- * Recherche texte libre : configuration globale.
134
- * `mode`: 'auto' détecte le provider du schéma et n'émet `mode: 'insensitive'`
135
- * que sur postgresql/cockroachdb/mongodb (les seuls où Prisma le supporte —
136
- * l'émettre sur sqlite/mysql/sqlserver lève une erreur Prisma). 'insensitive'
137
- * et 'default' forcent le comportement, pour un provider non détectable
138
- * (`provider = env(...)`) ou un besoin spécifique (index `citext`, etc.).
139
- * Voir docs/design/list-search-filters.md §2.5.
140
- */
141
- search?: {
142
- mode?: 'auto' | 'insensitive' | 'default';
143
- };
144
180
  /** Custom branding */
145
181
  branding?: {
146
182
  title?: string;
147
183
  primaryColor?: string;
148
184
  };
185
+ /**
186
+ * Optional admin plugins (new pages + record actions). Omitted or `[]`
187
+ * keeps every builtin view byte-identical to a build without plugins.
188
+ * Plugin routes are matched before builtins, so a registered pattern
189
+ * with a literal token in a `:model`/`:id` position can take over a
190
+ * builtin path when it matches first (e.g. `['user']` shadows the User
191
+ * list); only an identical, token-for-token overlay throws at boot.
192
+ * See `AdminPlugin`. Options like graph `depth` belong on the author's
193
+ * factory, not here.
194
+ */
195
+ plugins?: AdminPlugin[];
149
196
  }
150
197
  export declare function createAdminHandler(config: AdminHandlerConfig): ({ event, resolve }: {
151
198
  event: any;