covara 0.7.1 → 0.8.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 (204) hide show
  1. package/README.md +64 -16
  2. package/dist/cli/args.d.ts +14 -0
  3. package/dist/cli/args.d.ts.map +1 -0
  4. package/dist/cli/args.js +78 -0
  5. package/dist/cli/args.js.map +1 -0
  6. package/dist/cli/commands/data.d.ts +2 -0
  7. package/dist/cli/commands/data.d.ts.map +1 -0
  8. package/dist/cli/commands/data.js +31 -0
  9. package/dist/cli/commands/data.js.map +1 -0
  10. package/dist/cli/commands/db.d.ts +2 -0
  11. package/dist/cli/commands/db.d.ts.map +1 -0
  12. package/dist/cli/commands/db.js +100 -0
  13. package/dist/cli/commands/db.js.map +1 -0
  14. package/dist/cli/commands/dev.d.ts +2 -0
  15. package/dist/cli/commands/dev.d.ts.map +1 -0
  16. package/dist/cli/commands/dev.js +125 -0
  17. package/dist/cli/commands/dev.js.map +1 -0
  18. package/dist/cli/commands/env.d.ts +2 -0
  19. package/dist/cli/commands/env.d.ts.map +1 -0
  20. package/dist/cli/commands/env.js +94 -0
  21. package/dist/cli/commands/env.js.map +1 -0
  22. package/dist/cli/commands/import-export.d.ts +3 -0
  23. package/dist/cli/commands/import-export.d.ts.map +1 -0
  24. package/dist/cli/commands/import-export.js +156 -0
  25. package/dist/cli/commands/import-export.js.map +1 -0
  26. package/dist/cli/commands/migrate.d.ts +2 -0
  27. package/dist/cli/commands/migrate.d.ts.map +1 -0
  28. package/dist/cli/commands/migrate.js +12 -0
  29. package/dist/cli/commands/migrate.js.map +1 -0
  30. package/dist/cli/commands/push.d.ts +2 -0
  31. package/dist/cli/commands/push.d.ts.map +1 -0
  32. package/dist/cli/commands/push.js +45 -0
  33. package/dist/cli/commands/push.js.map +1 -0
  34. package/dist/cli/commands/run.d.ts +2 -0
  35. package/dist/cli/commands/run.d.ts.map +1 -0
  36. package/dist/cli/commands/run.js +54 -0
  37. package/dist/cli/commands/run.js.map +1 -0
  38. package/dist/cli/commands/seed.d.ts +2 -0
  39. package/dist/cli/commands/seed.d.ts.map +1 -0
  40. package/dist/cli/commands/seed.js +32 -0
  41. package/dist/cli/commands/seed.js.map +1 -0
  42. package/dist/cli/commands/studio.d.ts +2 -0
  43. package/dist/cli/commands/studio.d.ts.map +1 -0
  44. package/dist/cli/commands/studio.js +22 -0
  45. package/dist/cli/commands/studio.js.map +1 -0
  46. package/dist/cli/commands/types.d.ts +2 -0
  47. package/dist/cli/commands/types.d.ts.map +1 -0
  48. package/dist/cli/commands/types.js +28 -0
  49. package/dist/cli/commands/types.js.map +1 -0
  50. package/dist/cli/config.d.ts +28 -0
  51. package/dist/cli/config.d.ts.map +1 -0
  52. package/dist/cli/config.js +81 -0
  53. package/dist/cli/config.js.map +1 -0
  54. package/dist/cli/drizzle-bridge.d.ts +29 -0
  55. package/dist/cli/drizzle-bridge.d.ts.map +1 -0
  56. package/dist/cli/drizzle-bridge.js +85 -0
  57. package/dist/cli/drizzle-bridge.js.map +1 -0
  58. package/dist/cli/index.d.ts +2 -1
  59. package/dist/cli/index.d.ts.map +1 -1
  60. package/dist/cli/index.js +74 -20
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/prompt.d.ts +2 -0
  63. package/dist/cli/prompt.d.ts.map +1 -0
  64. package/dist/cli/prompt.js +16 -0
  65. package/dist/cli/prompt.js.map +1 -0
  66. package/dist/cli/templates/package-json.js +1 -1
  67. package/dist/cli/worker.d.ts +2 -0
  68. package/dist/cli/worker.d.ts.map +1 -0
  69. package/dist/cli/worker.js +120 -0
  70. package/dist/cli/worker.js.map +1 -0
  71. package/dist/client/file-upload.d.ts +2 -1
  72. package/dist/client/file-upload.d.ts.map +1 -1
  73. package/dist/client/file-upload.js +5 -5
  74. package/dist/client/file-upload.js.map +1 -1
  75. package/dist/client/live-store.d.ts.map +1 -1
  76. package/dist/client/live-store.js +12 -6
  77. package/dist/client/live-store.js.map +1 -1
  78. package/dist/client/react-files.js +1 -1
  79. package/dist/client/react-files.js.map +1 -1
  80. package/dist/client/subscription-manager.d.ts.map +1 -1
  81. package/dist/client/subscription-manager.js +7 -0
  82. package/dist/client/subscription-manager.js.map +1 -1
  83. package/dist/htmx/client/runtime.d.ts +2 -0
  84. package/dist/htmx/client/runtime.d.ts.map +1 -0
  85. package/dist/htmx/client/runtime.js +195 -0
  86. package/dist/htmx/client/runtime.js.map +1 -0
  87. package/dist/htmx/context.d.ts +16 -0
  88. package/dist/htmx/context.d.ts.map +1 -0
  89. package/dist/htmx/context.js +52 -0
  90. package/dist/htmx/context.js.map +1 -0
  91. package/dist/htmx/forms.d.ts +3 -0
  92. package/dist/htmx/forms.d.ts.map +1 -0
  93. package/dist/htmx/forms.js +32 -0
  94. package/dist/htmx/forms.js.map +1 -0
  95. package/dist/htmx/ids.d.ts +11 -0
  96. package/dist/htmx/ids.d.ts.map +1 -0
  97. package/dist/htmx/ids.js +27 -0
  98. package/dist/htmx/ids.js.map +1 -0
  99. package/dist/htmx/index.d.ts +11 -0
  100. package/dist/htmx/index.d.ts.map +1 -0
  101. package/dist/htmx/index.js +15 -0
  102. package/dist/htmx/index.js.map +1 -0
  103. package/dist/htmx/live.d.ts +39 -0
  104. package/dist/htmx/live.d.ts.map +1 -0
  105. package/dist/htmx/live.js +37 -0
  106. package/dist/htmx/live.js.map +1 -0
  107. package/dist/htmx/page.d.ts +14 -0
  108. package/dist/htmx/page.d.ts.map +1 -0
  109. package/dist/htmx/page.js +59 -0
  110. package/dist/htmx/page.js.map +1 -0
  111. package/dist/htmx/render-util.d.ts +2 -0
  112. package/dist/htmx/render-util.d.ts.map +1 -0
  113. package/dist/htmx/render-util.js +15 -0
  114. package/dist/htmx/render-util.js.map +1 -0
  115. package/dist/htmx/server.d.ts +21 -0
  116. package/dist/htmx/server.d.ts.map +1 -0
  117. package/dist/htmx/server.js +286 -0
  118. package/dist/htmx/server.js.map +1 -0
  119. package/dist/htmx/sse-render.d.ts +10 -0
  120. package/dist/htmx/sse-render.d.ts.map +1 -0
  121. package/dist/htmx/sse-render.js +40 -0
  122. package/dist/htmx/sse-render.js.map +1 -0
  123. package/dist/htmx/template-gen.d.ts +7 -0
  124. package/dist/htmx/template-gen.d.ts.map +1 -0
  125. package/dist/htmx/template-gen.js +38 -0
  126. package/dist/htmx/template-gen.js.map +1 -0
  127. package/dist/resource/hook.d.ts.map +1 -1
  128. package/dist/resource/hook.js +101 -24
  129. package/dist/resource/hook.js.map +1 -1
  130. package/dist/resource/relations.d.ts +15 -4
  131. package/dist/resource/relations.d.ts.map +1 -1
  132. package/dist/resource/relations.js +146 -26
  133. package/dist/resource/relations.js.map +1 -1
  134. package/dist/resource/subscription.d.ts +15 -2
  135. package/dist/resource/subscription.d.ts.map +1 -1
  136. package/dist/resource/subscription.js +184 -3
  137. package/dist/resource/subscription.js.map +1 -1
  138. package/dist/resource/track-mutations.d.ts.map +1 -1
  139. package/dist/resource/track-mutations.js +11 -1
  140. package/dist/resource/track-mutations.js.map +1 -1
  141. package/dist/resource/types.d.ts +8 -0
  142. package/dist/resource/types.d.ts.map +1 -1
  143. package/dist/server/admin-bypass.d.ts +7 -0
  144. package/dist/server/admin-bypass.d.ts.map +1 -0
  145. package/dist/server/admin-bypass.js +22 -0
  146. package/dist/server/admin-bypass.js.map +1 -0
  147. package/dist/server/app.d.ts +9 -0
  148. package/dist/server/app.d.ts.map +1 -1
  149. package/dist/server/app.js +101 -1
  150. package/dist/server/app.js.map +1 -1
  151. package/dist/server/impersonation.d.ts +18 -0
  152. package/dist/server/impersonation.d.ts.map +1 -0
  153. package/dist/server/impersonation.js +53 -0
  154. package/dist/server/impersonation.js.map +1 -0
  155. package/dist/shared/escape.d.ts +3 -0
  156. package/dist/shared/escape.d.ts.map +1 -0
  157. package/dist/shared/escape.js +12 -0
  158. package/dist/shared/escape.js.map +1 -0
  159. package/dist/storage/local.d.ts +4 -0
  160. package/dist/storage/local.d.ts.map +1 -1
  161. package/dist/storage/local.js +5 -0
  162. package/dist/storage/local.js.map +1 -1
  163. package/dist/storage/resource.d.ts +5 -11
  164. package/dist/storage/resource.d.ts.map +1 -1
  165. package/dist/storage/resource.js +156 -194
  166. package/dist/storage/resource.js.map +1 -1
  167. package/dist/ui/admin-auth.d.ts +6 -0
  168. package/dist/ui/admin-auth.d.ts.map +1 -1
  169. package/dist/ui/admin-auth.js +59 -1
  170. package/dist/ui/admin-auth.js.map +1 -1
  171. package/dist/ui/data-explorer.d.ts.map +1 -1
  172. package/dist/ui/data-explorer.js +91 -4
  173. package/dist/ui/data-explorer.js.map +1 -1
  174. package/dist/ui/html/client/data-explorer-app.d.ts.map +1 -1
  175. package/dist/ui/html/client/data-explorer-app.js +20 -7
  176. package/dist/ui/html/client/data-explorer-app.js.map +1 -1
  177. package/dist/ui/html/client/runtime.d.ts.map +1 -1
  178. package/dist/ui/html/client/runtime.js +70 -2
  179. package/dist/ui/html/client/runtime.js.map +1 -1
  180. package/dist/ui/html/icons.d.ts.map +1 -1
  181. package/dist/ui/html/icons.js +2 -0
  182. package/dist/ui/html/icons.js.map +1 -1
  183. package/dist/ui/html/layout.d.ts +1 -0
  184. package/dist/ui/html/layout.d.ts.map +1 -1
  185. package/dist/ui/html/layout.js +274 -146
  186. package/dist/ui/html/layout.js.map +1 -1
  187. package/dist/ui/html/pages/filter-tester.d.ts.map +1 -1
  188. package/dist/ui/html/pages/filter-tester.js +15 -0
  189. package/dist/ui/html/pages/filter-tester.js.map +1 -1
  190. package/dist/ui/html/pages/users.d.ts.map +1 -1
  191. package/dist/ui/html/pages/users.js +8 -1
  192. package/dist/ui/html/pages/users.js.map +1 -1
  193. package/dist/ui/index.d.ts +1 -1
  194. package/dist/ui/index.d.ts.map +1 -1
  195. package/dist/ui/index.js +1 -1
  196. package/dist/ui/index.js.map +1 -1
  197. package/dist/ui/middleware.d.ts.map +1 -1
  198. package/dist/ui/middleware.js +121 -5
  199. package/dist/ui/middleware.js.map +1 -1
  200. package/dist/ui/schema-registry.d.ts +5 -0
  201. package/dist/ui/schema-registry.d.ts.map +1 -1
  202. package/dist/ui/schema-registry.js +14 -0
  203. package/dist/ui/schema-registry.js.map +1 -1
  204. package/package.json +5 -1
@@ -1,14 +1,20 @@
1
1
  import { Hono } from "hono";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { Readable } from "node:stream";
4
- import { eq, inArray, getTableName } from "drizzle-orm";
4
+ import { eq, inArray, getTableName, getTableColumns } from "drizzle-orm";
5
5
  import { getGlobalStorage, hasGlobalStorage, } from "./types.js";
6
- import { NotFoundError, ValidationError, UnauthorizedError, ForbiddenError, } from "../resource/error.js";
6
+ import { NotFoundError, ValidationError, ForbiddenError, } from "../resource/error.js";
7
7
  import { createResourceFilter } from "../resource/filter.js";
8
8
  import { validateUpload } from "./validation.js";
9
+ import { useResource } from "../resource/hook.js";
10
+ import { createScopeResolver } from "../auth/scope.js";
11
+ import { executeBeforeCreate, executeAfterCreate } from "../resource/procedures.js";
12
+ import { recordCreate } from "../resource/changelog.js";
13
+ import { pushInsertsToSubscriptions } from "../resource/subscription.js";
14
+ import { isAdminBypassRequest } from "../server/admin-bypass.js";
9
15
  import { getUser } from "../server/context.js";
10
16
  import { readJsonBody } from "../server/request.js";
11
- import { registerResourceSchema } from "../ui/index.js";
17
+ import { setResourceFileFlag } from "../ui/schema-registry.js";
12
18
  const defaultGenerateKey = (filename, userId) => {
13
19
  const timestamp = Date.now();
14
20
  const uuid = randomUUID().slice(0, 8);
@@ -20,9 +26,8 @@ const defaultGenerateKey = (filename, userId) => {
20
26
  };
21
27
  const parseMultipartFormData = async (c) => {
22
28
  const contentType = c.req.header("content-type") || "";
23
- if (!contentType.includes("multipart/form-data")) {
29
+ if (!contentType.includes("multipart/form-data"))
24
30
  return null;
25
- }
26
31
  let body;
27
32
  try {
28
33
  body = await c.req.parseBody({ all: true });
@@ -42,45 +47,83 @@ const parseMultipartFormData = async (c) => {
42
47
  }
43
48
  return null;
44
49
  };
45
- const checkScopeAccess = async (scopeFn, user, record, filterExecute) => {
46
- if (!scopeFn)
47
- return true;
48
- if (!user)
49
- return false;
50
- const scope = await scopeFn(user);
51
- const scopeStr = scope.toString();
52
- if (scopeStr === "*")
53
- return true;
54
- if (scope.isEmpty())
55
- return false;
56
- if (record && filterExecute) {
57
- return filterExecute(scopeStr, record);
58
- }
59
- return true;
60
- };
61
50
  export const useFileResource = (table, config) => {
62
- const router = new Hono();
63
51
  const storage = config.storage ?? (hasGlobalStorage() ? getGlobalStorage() : null);
64
52
  if (!storage) {
65
53
  throw new Error("Storage not configured. Either pass storage in config or call initializeStorage() first.");
66
54
  }
67
- const { db, id: idColumn, allowedMimeTypes, maxFileSize, validation, generateKey = defaultGenerateKey, auth, usePresignedUrls = false, presignedUrlExpiry = 3600, } = config;
68
- const resourceFilter = createResourceFilter(table);
69
- const getUserId = (user) => {
70
- return user?.id;
71
- };
72
- const dbQuery = db;
55
+ const { db, id: idColumn, allowedMimeTypes, maxFileSize, validation, generateKey = defaultGenerateKey, usePresignedUrls = false, presignedUrlExpiry = 3600, } = config;
73
56
  const resourceName = getTableName(table);
74
- registerResourceSchema(resourceName, table, db, idColumn, { generatedFields: ["id", "storagePath", "status", "createdAt"] });
75
- const executeFilter = (expr, obj) => {
76
- return resourceFilter.execute(expr, obj);
57
+ const idColumnName = idColumn.name;
58
+ const hasUserId = "userId" in getTableColumns(table);
59
+ const filterer = createResourceFilter(table, config.customOperators ?? {});
60
+ const scopeResolver = createScopeResolver(config.auth, resourceName);
61
+ // Storage-managed columns are server-generated; the client never writes them.
62
+ const generatedFields = Array.from(new Set([
63
+ "id",
64
+ "storagePath",
65
+ "status",
66
+ "url",
67
+ "size",
68
+ "mimeType",
69
+ "createdAt",
70
+ ...(config.generatedFields ?? []),
71
+ ]));
72
+ // Compose storage cleanup into onAfterDelete so deleting a record (via the
73
+ // generic resource DELETE) also removes the stored object.
74
+ const userHooks = config.hooks ?? {};
75
+ const hooks = {
76
+ ...userHooks,
77
+ onAfterDelete: async (ctx, deleted) => {
78
+ const storagePath = deleted.storagePath;
79
+ if (storagePath) {
80
+ try {
81
+ await storage.delete(storagePath);
82
+ }
83
+ catch {
84
+ // Best-effort: the row is already gone; don't fail the request.
85
+ }
86
+ }
87
+ if (userHooks.onAfterDelete)
88
+ await userHooks.onAfterDelete(ctx, deleted);
89
+ },
77
90
  };
78
- router.post("/", async (c) => {
79
- const user = getUser(c);
80
- const canCreate = await checkScopeAccess(auth?.create, user);
81
- if (!canCreate) {
82
- throw new UnauthorizedError("Not authorized to upload files");
91
+ const dbAny = db;
92
+ const readable = config.fields?.readable;
93
+ const mask = (record) => {
94
+ if (!readable)
95
+ return record;
96
+ const out = {};
97
+ for (const key of readable)
98
+ if (key in record)
99
+ out[key] = record[key];
100
+ return out;
101
+ };
102
+ // Mirrors the resource hook's scope gate: impersonation/bypass aware.
103
+ const requireCreate = async (c) => {
104
+ if (c.get("impersonatedId")) {
105
+ await scopeResolver.requirePermission("create", getUser(c));
106
+ return;
107
+ }
108
+ if (await isAdminBypassRequest(c))
109
+ return;
110
+ await scopeResolver.requirePermission("create", getUser(c));
111
+ };
112
+ const requireReadAccess = async (c, record) => {
113
+ if (!c.get("impersonatedId") && (await isAdminBypassRequest(c)))
114
+ return;
115
+ const scope = await scopeResolver.resolve("read", getUser(c));
116
+ const expr = scope.toString();
117
+ if (expr === "*")
118
+ return;
119
+ if (scope.isEmpty() || !filterer.execute(expr, record)) {
120
+ throw new ForbiddenError("Not authorized to access this file");
83
121
  }
122
+ };
123
+ const router = new Hono();
124
+ // --- Upload (custom create): multipart -> storage -> tracked create ---
125
+ router.post("/", async (c) => {
126
+ await requireCreate(c);
84
127
  const parsed = await parseMultipartFormData(c);
85
128
  if (!parsed) {
86
129
  throw new ValidationError("No file provided or invalid multipart form data");
@@ -95,17 +138,13 @@ export const useFileResource = (table, config) => {
95
138
  if (validation) {
96
139
  validateUpload({ contentType: mimeType, size: file.length }, validation);
97
140
  }
98
- const userId = getUserId(user);
141
+ const user = getUser(c);
142
+ const userId = user?.id;
99
143
  const key = generateKey(filename, userId);
100
- const result = await storage.upload(key, file, {
101
- filename,
102
- mimeType,
103
- });
144
+ const result = await storage.upload(key, file, { filename, mimeType });
104
145
  const url = storage.getUrl(key);
105
- const id = randomUUID();
106
- const fileRecord = {
107
- id,
108
- userId: userId ?? null,
146
+ let record = {
147
+ id: randomUUID(),
109
148
  filename,
110
149
  mimeType,
111
150
  size: result.size,
@@ -114,18 +153,26 @@ export const useFileResource = (table, config) => {
114
153
  status: "completed",
115
154
  createdAt: new Date(),
116
155
  };
117
- const [created] = await dbQuery
118
- .insert(table)
119
- .values(fileRecord)
120
- .returning();
121
- return c.json({ data: created }, 201);
156
+ if (hasUserId)
157
+ record.userId = userId ?? null;
158
+ const ctx = {
159
+ db,
160
+ schema: table,
161
+ user,
162
+ req: c.req.raw,
163
+ context: c,
164
+ };
165
+ record =
166
+ (await executeBeforeCreate(hooks, ctx, record)) ?? record;
167
+ const [created] = (await dbAny.insert(table).values(record).returning());
168
+ await executeAfterCreate(hooks, ctx, created);
169
+ recordCreate(resourceName, String(created[idColumnName]), created, userId);
170
+ await pushInsertsToSubscriptions(resourceName, filterer, [created], idColumnName, undefined, undefined);
171
+ return c.json(mask(created), 201);
122
172
  });
173
+ // --- Presigned upload URL ---
123
174
  router.get("/upload-url", async (c) => {
124
- const user = getUser(c);
125
- const canCreate = await checkScopeAccess(auth?.create, user);
126
- if (!canCreate) {
127
- throw new UnauthorizedError("Not authorized to upload files");
128
- }
175
+ await requireCreate(c);
129
176
  if (!storage.supportsPresignedUrls()) {
130
177
  throw new ValidationError("This storage adapter does not support presigned URLs");
131
178
  }
@@ -137,26 +184,20 @@ export const useFileResource = (table, config) => {
137
184
  if (allowedMimeTypes && contentType && !allowedMimeTypes.includes(contentType)) {
138
185
  throw new ValidationError(`File type not allowed. Allowed types: ${allowedMimeTypes.join(", ")}`);
139
186
  }
140
- if (validation) {
187
+ if (validation)
141
188
  validateUpload({ contentType }, validation);
142
- }
143
- const userId = getUserId(user);
189
+ const user = getUser(c);
190
+ const userId = user?.id;
144
191
  const key = generateKey(filename, userId);
145
- const presignedOptions = {
146
- expiresIn: presignedUrlExpiry,
147
- contentType,
148
- };
149
- if (maxFileSize) {
192
+ const presignedOptions = { expiresIn: presignedUrlExpiry, contentType };
193
+ if (maxFileSize)
150
194
  presignedOptions.contentLength = maxFileSize;
151
- }
152
195
  const uploadUrl = await storage.getUploadUrl(key, presignedOptions);
153
- if (!uploadUrl) {
196
+ if (!uploadUrl)
154
197
  throw new ValidationError("Failed to generate upload URL");
155
- }
156
198
  const id = randomUUID();
157
- const fileRecord = {
199
+ const record = {
158
200
  id,
159
- userId: userId ?? null,
160
201
  filename,
161
202
  mimeType: contentType || "application/octet-stream",
162
203
  size: 0,
@@ -165,124 +206,52 @@ export const useFileResource = (table, config) => {
165
206
  status: "pending",
166
207
  createdAt: new Date(),
167
208
  };
168
- await dbQuery.insert(table).values(fileRecord).returning();
209
+ if (hasUserId)
210
+ record.userId = userId ?? null;
211
+ await dbAny.insert(table).values(record).returning();
169
212
  return c.json({
170
- data: {
171
- fileId: id,
172
- uploadUrl: uploadUrl.url,
173
- fields: uploadUrl.fields,
174
- key,
175
- expiresAt: uploadUrl.expiresAt,
176
- },
213
+ fileId: id,
214
+ uploadUrl: uploadUrl.url,
215
+ fields: uploadUrl.fields,
216
+ key,
217
+ expiresAt: uploadUrl.expiresAt,
177
218
  });
178
219
  });
220
+ // --- Confirm a presigned upload ---
179
221
  router.post("/:id/confirm", async (c) => {
180
- const user = getUser(c);
181
222
  const fileId = c.req.param("id");
182
- const [file] = await dbQuery
223
+ const [file] = (await dbAny
183
224
  .select()
184
225
  .from(table)
185
226
  .where(eq(idColumn, fileId))
186
- .limit(1);
187
- if (!file) {
227
+ .limit(1));
228
+ if (!file)
188
229
  throw new NotFoundError("File", fileId);
189
- }
190
- const canRead = await checkScopeAccess(auth?.read, user, file, executeFilter);
191
- if (!canRead) {
192
- throw new ForbiddenError("Not authorized to access this file");
193
- }
194
- if (file.status === "completed") {
195
- return c.json({ data: file });
196
- }
230
+ await requireReadAccess(c, file);
231
+ if (file.status === "completed")
232
+ return c.json(file);
197
233
  const metadata = await storage.getMetadata(file.storagePath);
198
- if (!metadata) {
234
+ if (!metadata)
199
235
  throw new NotFoundError("File", file.storagePath);
200
- }
201
236
  const url = storage.getUrl(file.storagePath);
202
- const [updated] = await dbQuery
237
+ const [updated] = (await dbAny
203
238
  .update(table)
204
- .set({
205
- size: metadata.size,
206
- mimeType: metadata.mimeType,
207
- url,
208
- status: "completed",
209
- })
239
+ .set({ size: metadata.size, mimeType: metadata.mimeType, url, status: "completed" })
210
240
  .where(eq(idColumn, fileId))
211
- .returning();
212
- return c.json({ data: updated });
213
- });
214
- router.get("/:id", async (c) => {
215
- const user = getUser(c);
216
- const fileId = c.req.param("id");
217
- const [file] = await dbQuery
218
- .select()
219
- .from(table)
220
- .where(eq(idColumn, fileId))
221
- .limit(1);
222
- if (!file) {
223
- throw new NotFoundError("File", fileId);
224
- }
225
- const canRead = await checkScopeAccess(auth?.read, user, file, executeFilter);
226
- if (!canRead) {
227
- throw new ForbiddenError("Not authorized to access this file");
228
- }
229
- return c.json({ data: file });
230
- });
231
- router.get("/", async (c) => {
232
- const user = getUser(c);
233
- const limit = Math.min(parseInt(c.req.query("limit") ?? "") || 50, 100);
234
- const offset = parseInt(c.req.query("offset") ?? "") || 0;
235
- const filter = c.req.query("filter");
236
- const canRead = await checkScopeAccess(auth?.read, user);
237
- if (!canRead) {
238
- throw new ForbiddenError("Not authorized to list files");
239
- }
240
- let scopeFilter = "";
241
- if (auth?.read && user) {
242
- const scope = await auth.read(user);
243
- const scopeStr = scope.toString();
244
- if (scopeStr !== "*" && !scope.isEmpty()) {
245
- scopeFilter = scopeStr;
246
- }
247
- }
248
- let combinedFilter = filter || "";
249
- if (scopeFilter && combinedFilter) {
250
- combinedFilter = `(${scopeFilter});(${combinedFilter})`;
251
- }
252
- else if (scopeFilter) {
253
- combinedFilter = scopeFilter;
254
- }
255
- if (combinedFilter) {
256
- const whereCondition = resourceFilter.convert(combinedFilter);
257
- const files = await dbQuery
258
- .select()
259
- .from(table)
260
- .where(whereCondition)
261
- .limit(limit);
262
- return c.json({ data: files });
263
- }
264
- const files = await dbQuery
265
- .select()
266
- .from(table)
267
- .limit(limit)
268
- .offset(offset);
269
- return c.json({ data: files });
241
+ .returning());
242
+ return c.json(updated);
270
243
  });
244
+ // --- Download (stream or presigned redirect) ---
271
245
  router.get("/:id/download", async (c) => {
272
- const user = getUser(c);
273
246
  const fileId = c.req.param("id");
274
- const [file] = await dbQuery
247
+ const [file] = (await dbAny
275
248
  .select()
276
249
  .from(table)
277
250
  .where(eq(idColumn, fileId))
278
- .limit(1);
279
- if (!file) {
251
+ .limit(1));
252
+ if (!file)
280
253
  throw new NotFoundError("File", fileId);
281
- }
282
- const canRead = await checkScopeAccess(auth?.read, user, file, executeFilter);
283
- if (!canRead) {
284
- throw new ForbiddenError("Not authorized to access this file");
285
- }
254
+ await requireReadAccess(c, file);
286
255
  if (file.status !== "completed") {
287
256
  throw new ValidationError("File upload not completed");
288
257
  }
@@ -290,57 +259,50 @@ export const useFileResource = (table, config) => {
290
259
  const downloadUrl = await storage.getDownloadUrl(file.storagePath, {
291
260
  expiresIn: presignedUrlExpiry,
292
261
  });
293
- if (downloadUrl) {
262
+ if (downloadUrl)
294
263
  return c.redirect(downloadUrl, 302);
295
- }
296
264
  }
297
265
  const stream = await storage.downloadStream(file.storagePath);
298
266
  c.header("Content-Type", file.mimeType);
299
267
  c.header("Content-Disposition", `attachment; filename="${file.filename}"`);
300
- c.header("Content-Length", file.size.toString());
268
+ c.header("Content-Length", String(file.size));
301
269
  return c.body(Readable.toWeb(stream));
302
270
  });
271
+ // --- Batch delete by ids (preserves the {ids} contract) ---
303
272
  router.delete("/batch", async (c) => {
304
- const user = getUser(c);
305
273
  const { ids } = (await readJsonBody(c));
306
274
  if (!ids || !Array.isArray(ids) || ids.length === 0) {
307
275
  throw new ValidationError("ids array is required");
308
276
  }
309
- const files = await dbQuery
277
+ const files = (await dbAny
310
278
  .select()
311
279
  .from(table)
312
280
  .where(inArray(idColumn, ids))
313
- .limit(ids.length);
281
+ .limit(ids.length));
314
282
  for (const file of files) {
315
- const canDelete = await checkScopeAccess(auth?.delete, user, file, executeFilter);
316
- if (!canDelete) {
317
- throw new ForbiddenError(`Not authorized to delete file ${file.id}`);
283
+ if (!c.get("impersonatedId") && (await isAdminBypassRequest(c)))
284
+ break;
285
+ const scope = await scopeResolver.resolve("delete", getUser(c));
286
+ const expr = scope.toString();
287
+ if (expr === "*")
288
+ continue;
289
+ if (scope.isEmpty() || !filterer.execute(expr, file)) {
290
+ throw new ForbiddenError(`Not authorized to delete file ${String(file.id)}`);
318
291
  }
319
292
  }
320
293
  const storagePaths = files.map((f) => f.storagePath);
321
294
  await storage.deleteMany(storagePaths);
322
- await dbQuery.delete(table).where(inArray(idColumn, ids));
323
- return c.json({ data: { deleted: files.length } });
324
- });
325
- router.delete("/:id", async (c) => {
326
- const user = getUser(c);
327
- const fileId = c.req.param("id");
328
- const [file] = await dbQuery
329
- .select()
330
- .from(table)
331
- .where(eq(idColumn, fileId))
332
- .limit(1);
333
- if (!file) {
334
- throw new NotFoundError("File", fileId);
335
- }
336
- const canDelete = await checkScopeAccess(auth?.delete, user, file, executeFilter);
337
- if (!canDelete) {
338
- throw new ForbiddenError("Not authorized to delete this file");
295
+ for (const file of files) {
296
+ await dbAny.delete(table).where(eq(idColumn, file.id));
339
297
  }
340
- await storage.delete(file.storagePath);
341
- await dbQuery.delete(table).where(eq(idColumn, fileId));
342
- return c.body(null, 204);
298
+ return c.json({ deleted: files.length });
343
299
  });
300
+ // --- Everything else (list, get, patch, delete, subscribe, count,
301
+ // aggregate, rpc, relations, hooks, field policies, full auth scopes) is a
302
+ // regular resource. ---
303
+ router.route("/", useResource(table, { ...config, hooks, generatedFields }));
304
+ // Mark for the admin data explorer (download action).
305
+ setResourceFileFlag(resourceName, true);
344
306
  return router;
345
307
  };
346
308
  //# sourceMappingURL=resource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/storage/resource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/storage/resource.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { Context, MiddlewareHandler } from "hono";
2
+ import type { UserContext } from "../resource/types.js";
2
3
  export interface AdminUser {
3
4
  id: string;
4
5
  email: string;
@@ -42,6 +43,10 @@ export declare const extractUserRoles: (user: {
42
43
  role?: unknown;
43
44
  metadata?: Record<string, unknown> | null;
44
45
  } | null | undefined) => string[];
46
+ export declare const extractUserPermissions: (user: {
47
+ permissions?: unknown;
48
+ metadata?: Record<string, unknown> | null;
49
+ } | null | undefined) => string[];
45
50
  export interface AdminAuditEntry {
46
51
  timestamp: number;
47
52
  userId: string;
@@ -60,6 +65,7 @@ export declare const getAdminAuditLog: (limit?: number, offset?: number) => Admi
60
65
  export declare const clearAdminAuditLog: () => void;
61
66
  export declare const detectEnvironment: () => EnvironmentMode;
62
67
  export declare const createAdminAuthMiddleware: (config?: AdminSecurityConfig) => MiddlewareHandler;
68
+ export declare const createAdminBypassPredicate: (config?: AdminSecurityConfig) => ((user: UserContext | null, c: Context) => Promise<boolean>);
63
69
  export declare const getAdminUser: (c: Context) => AdminUser | null;
64
70
  export declare const requireAdminUser: (c: Context) => AdminUser;
65
71
  //# sourceMappingURL=admin-auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin-auth.d.ts","sourceRoot":"","sources":["../../src/ui/admin-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-auth.d.ts","sourceRoot":"","sources":["../../src/ui/admin-auth.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ export const extractUserRoles = (user) => {
27
27
  }
28
28
  return [...roles];
29
29
  };
30
- const extractUserPermissions = (user) => {
30
+ export const extractUserPermissions = (user) => {
31
31
  if (!user)
32
32
  return [];
33
33
  const perms = new Set();
@@ -235,6 +235,64 @@ export const createAdminAuthMiddleware = (config = {}) => {
235
235
  return next();
236
236
  };
237
237
  };
238
+ export const createAdminBypassPredicate = (config = {}) => {
239
+ const mode = config.mode ?? detectEnvironment();
240
+ const requiredRole = config.requireRole ?? config.authorization?.requiredRole;
241
+ const anyAuthConfigured = config.auth?.apiKey !== undefined ||
242
+ config.auth?.authenticate !== undefined ||
243
+ config.auth?.useSessionAuth === true ||
244
+ config.requireRole !== undefined ||
245
+ config.authorize !== undefined ||
246
+ config.can !== undefined ||
247
+ config.authorization !== undefined;
248
+ const hasIdentityRule = requiredRole !== undefined ||
249
+ config.authorization?.requiredPermission !== undefined ||
250
+ config.authorization?.authorize !== undefined ||
251
+ config.authorize !== undefined;
252
+ return async (user, c) => {
253
+ if (config.auth?.disabled) {
254
+ return mode === "development";
255
+ }
256
+ if (config.auth?.apiKey) {
257
+ const authHeader = c.req.header("authorization");
258
+ const bearer = authHeader?.startsWith("Bearer ")
259
+ ? authHeader.slice(7)
260
+ : null;
261
+ if (bearer === config.auth.apiKey)
262
+ return true;
263
+ if (c.req.header("x-admin-api-key") === config.auth.apiKey)
264
+ return true;
265
+ }
266
+ if (mode === "development" && !anyAuthConfigured) {
267
+ return true;
268
+ }
269
+ if (!user)
270
+ return false;
271
+ const adminUser = {
272
+ id: user.id,
273
+ email: user.email ?? "unknown",
274
+ name: user.name ?? undefined,
275
+ roles: extractUserRoles(user),
276
+ permissions: extractUserPermissions(user),
277
+ };
278
+ if (requiredRole !== undefined &&
279
+ !hasRequiredRole(adminUser.roles ?? [], requiredRole)) {
280
+ return false;
281
+ }
282
+ if (config.authorization?.requiredPermission &&
283
+ !(adminUser.permissions ?? []).includes(config.authorization.requiredPermission)) {
284
+ return false;
285
+ }
286
+ if (config.authorization?.authorize &&
287
+ !(await config.authorization.authorize(adminUser))) {
288
+ return false;
289
+ }
290
+ if (config.authorize && !(await config.authorize(adminUser, c))) {
291
+ return false;
292
+ }
293
+ return hasIdentityRule;
294
+ };
295
+ };
238
296
  export const getAdminUser = (c) => {
239
297
  return c.get("adminUser") ?? null;
240
298
  };