@beignet/core 0.0.1 → 0.0.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 (287) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +202 -8
  3. package/dist/application/index.d.ts +93 -9
  4. package/dist/application/index.d.ts.map +1 -1
  5. package/dist/application/index.js +11 -11
  6. package/dist/application/index.js.map +1 -1
  7. package/dist/client/client.d.ts +73 -12
  8. package/dist/client/client.d.ts.map +1 -1
  9. package/dist/client/client.js +37 -12
  10. package/dist/client/client.js.map +1 -1
  11. package/dist/client/index.d.ts +12 -0
  12. package/dist/client/index.d.ts.map +1 -1
  13. package/dist/client/index.js +6 -0
  14. package/dist/client/index.js.map +1 -1
  15. package/dist/client/types.d.ts +69 -8
  16. package/dist/client/types.d.ts.map +1 -1
  17. package/dist/config/index.d.ts +84 -0
  18. package/dist/config/index.d.ts.map +1 -1
  19. package/dist/config/index.js +36 -0
  20. package/dist/config/index.js.map +1 -1
  21. package/dist/contracts/contract-builder.d.ts +49 -22
  22. package/dist/contracts/contract-builder.d.ts.map +1 -1
  23. package/dist/contracts/contract-builder.js +48 -21
  24. package/dist/contracts/contract-builder.js.map +1 -1
  25. package/dist/contracts/contract-group.d.ts +35 -19
  26. package/dist/contracts/contract-group.d.ts.map +1 -1
  27. package/dist/contracts/contract-group.js +35 -19
  28. package/dist/contracts/contract-group.js.map +1 -1
  29. package/dist/contracts/contract-like.d.ts +4 -4
  30. package/dist/contracts/contract-like.d.ts.map +1 -1
  31. package/dist/contracts/contract-like.js +2 -1
  32. package/dist/contracts/contract-like.js.map +1 -1
  33. package/dist/contracts/index.d.ts +28 -0
  34. package/dist/contracts/index.d.ts.map +1 -1
  35. package/dist/contracts/index.js +12 -0
  36. package/dist/contracts/index.js.map +1 -1
  37. package/dist/contracts/openapi-meta.d.ts +8 -8
  38. package/dist/contracts/openapi-meta.d.ts.map +1 -1
  39. package/dist/contracts/path-template.d.ts +27 -0
  40. package/dist/contracts/path-template.d.ts.map +1 -1
  41. package/dist/contracts/path-template.js +6 -0
  42. package/dist/contracts/path-template.js.map +1 -1
  43. package/dist/contracts/types.d.ts +104 -10
  44. package/dist/contracts/types.d.ts.map +1 -1
  45. package/dist/contracts/types.js +15 -0
  46. package/dist/contracts/types.js.map +1 -1
  47. package/dist/contracts/utils.d.ts +6 -0
  48. package/dist/contracts/utils.d.ts.map +1 -1
  49. package/dist/contracts/utils.js +6 -0
  50. package/dist/contracts/utils.js.map +1 -1
  51. package/dist/domain/entity.d.ts +22 -11
  52. package/dist/domain/entity.d.ts.map +1 -1
  53. package/dist/domain/entity.js +5 -1
  54. package/dist/domain/entity.js.map +1 -1
  55. package/dist/domain/events.d.ts +5 -2
  56. package/dist/domain/events.d.ts.map +1 -1
  57. package/dist/domain/events.js +4 -1
  58. package/dist/domain/events.js.map +1 -1
  59. package/dist/domain/value-object.d.ts +19 -9
  60. package/dist/domain/value-object.d.ts.map +1 -1
  61. package/dist/domain/value-object.js +5 -1
  62. package/dist/domain/value-object.js.map +1 -1
  63. package/dist/errors/catalog.d.ts +40 -16
  64. package/dist/errors/catalog.d.ts.map +1 -1
  65. package/dist/errors/catalog.js +18 -7
  66. package/dist/errors/catalog.js.map +1 -1
  67. package/dist/errors/response.d.ts +16 -4
  68. package/dist/errors/response.d.ts.map +1 -1
  69. package/dist/errors/response.js +3 -3
  70. package/dist/errors/response.js.map +1 -1
  71. package/dist/errors/validation.d.ts +10 -1
  72. package/dist/errors/validation.d.ts.map +1 -1
  73. package/dist/errors/validation.js +3 -0
  74. package/dist/errors/validation.js.map +1 -1
  75. package/dist/events/index.d.ts +133 -0
  76. package/dist/events/index.d.ts.map +1 -1
  77. package/dist/events/index.js +30 -0
  78. package/dist/events/index.js.map +1 -1
  79. package/dist/idempotency/index.d.ts +355 -0
  80. package/dist/idempotency/index.d.ts.map +1 -0
  81. package/dist/idempotency/index.js +360 -0
  82. package/dist/idempotency/index.js.map +1 -0
  83. package/dist/jobs/index.d.ts +248 -4
  84. package/dist/jobs/index.d.ts.map +1 -1
  85. package/dist/jobs/index.js +183 -1
  86. package/dist/jobs/index.js.map +1 -1
  87. package/dist/mail/index.d.ts +149 -0
  88. package/dist/mail/index.d.ts.map +1 -1
  89. package/dist/mail/index.js +30 -0
  90. package/dist/mail/index.js.map +1 -1
  91. package/dist/notifications/index.d.ts +369 -0
  92. package/dist/notifications/index.d.ts.map +1 -0
  93. package/dist/notifications/index.js +310 -0
  94. package/dist/notifications/index.js.map +1 -0
  95. package/dist/openapi/index.d.ts +132 -16
  96. package/dist/openapi/index.d.ts.map +1 -1
  97. package/dist/openapi/index.js +1 -1
  98. package/dist/openapi/index.js.map +1 -1
  99. package/dist/outbox/index.d.ts +474 -0
  100. package/dist/outbox/index.d.ts.map +1 -0
  101. package/dist/outbox/index.js +538 -0
  102. package/dist/outbox/index.js.map +1 -0
  103. package/dist/pagination/index.d.ts +166 -0
  104. package/dist/pagination/index.d.ts.map +1 -0
  105. package/dist/pagination/index.js +96 -0
  106. package/dist/pagination/index.js.map +1 -0
  107. package/dist/ports/audit.d.ts +271 -0
  108. package/dist/ports/audit.d.ts.map +1 -1
  109. package/dist/ports/audit.js +128 -0
  110. package/dist/ports/audit.js.map +1 -1
  111. package/dist/ports/auth.d.ts +70 -0
  112. package/dist/ports/auth.d.ts.map +1 -1
  113. package/dist/ports/auth.js +30 -0
  114. package/dist/ports/auth.js.map +1 -1
  115. package/dist/ports/cache.d.ts +41 -0
  116. package/dist/ports/cache.d.ts.map +1 -1
  117. package/dist/ports/cache.js +10 -0
  118. package/dist/ports/cache.js.map +1 -1
  119. package/dist/ports/clock.d.ts +38 -0
  120. package/dist/ports/clock.d.ts.map +1 -1
  121. package/dist/ports/clock.js +20 -0
  122. package/dist/ports/clock.js.map +1 -1
  123. package/dist/ports/id-generator.d.ts +37 -0
  124. package/dist/ports/id-generator.d.ts.map +1 -1
  125. package/dist/ports/id-generator.js +22 -0
  126. package/dist/ports/id-generator.js.map +1 -1
  127. package/dist/ports/index.d.ts +83 -0
  128. package/dist/ports/index.d.ts.map +1 -1
  129. package/dist/ports/index.js +41 -5
  130. package/dist/ports/index.js.map +1 -1
  131. package/dist/ports/logger.d.ts +56 -0
  132. package/dist/ports/logger.d.ts.map +1 -1
  133. package/dist/ports/logger.js +17 -0
  134. package/dist/ports/logger.js.map +1 -1
  135. package/dist/ports/policy.d.ts +132 -0
  136. package/dist/ports/policy.d.ts.map +1 -1
  137. package/dist/ports/policy.js +45 -0
  138. package/dist/ports/policy.js.map +1 -1
  139. package/dist/ports/rate-limit.d.ts +25 -0
  140. package/dist/ports/rate-limit.d.ts.map +1 -1
  141. package/dist/ports/rate-limit.js +10 -0
  142. package/dist/ports/rate-limit.js.map +1 -1
  143. package/dist/ports/redaction.d.ts +101 -0
  144. package/dist/ports/redaction.d.ts.map +1 -1
  145. package/dist/ports/redaction.js +59 -0
  146. package/dist/ports/redaction.js.map +1 -1
  147. package/dist/ports/storage.d.ts +100 -0
  148. package/dist/ports/storage.d.ts.map +1 -1
  149. package/dist/ports/storage.js +10 -0
  150. package/dist/ports/storage.js.map +1 -1
  151. package/dist/ports/testing.d.ts +47 -0
  152. package/dist/ports/testing.d.ts.map +1 -1
  153. package/dist/ports/testing.js +23 -0
  154. package/dist/ports/testing.js.map +1 -1
  155. package/dist/ports/unit-of-work.d.ts +60 -3
  156. package/dist/ports/unit-of-work.d.ts.map +1 -1
  157. package/dist/ports/unit-of-work.js +11 -2
  158. package/dist/ports/unit-of-work.js.map +1 -1
  159. package/dist/providers/instrumentation.d.ts +205 -1
  160. package/dist/providers/instrumentation.d.ts.map +1 -1
  161. package/dist/providers/instrumentation.js +14 -0
  162. package/dist/providers/instrumentation.js.map +1 -1
  163. package/dist/providers/provider.d.ts +14 -1
  164. package/dist/providers/provider.d.ts.map +1 -1
  165. package/dist/providers/provider.js.map +1 -1
  166. package/dist/schedules/index.d.ts +246 -0
  167. package/dist/schedules/index.d.ts.map +1 -1
  168. package/dist/schedules/index.js +27 -0
  169. package/dist/schedules/index.js.map +1 -1
  170. package/dist/server/health.d.ts +14 -5
  171. package/dist/server/health.d.ts.map +1 -1
  172. package/dist/server/health.js +5 -2
  173. package/dist/server/health.js.map +1 -1
  174. package/dist/server/hooks/auth.d.ts +68 -26
  175. package/dist/server/hooks/auth.d.ts.map +1 -1
  176. package/dist/server/hooks/auth.js +44 -55
  177. package/dist/server/hooks/auth.js.map +1 -1
  178. package/dist/server/hooks/cors.d.ts +27 -0
  179. package/dist/server/hooks/cors.d.ts.map +1 -1
  180. package/dist/server/hooks/cors.js +12 -0
  181. package/dist/server/hooks/cors.js.map +1 -1
  182. package/dist/server/hooks/errors.d.ts +15 -6
  183. package/dist/server/hooks/errors.d.ts.map +1 -1
  184. package/dist/server/hooks/errors.js.map +1 -1
  185. package/dist/server/hooks/index.d.ts +4 -1
  186. package/dist/server/hooks/index.d.ts.map +1 -1
  187. package/dist/server/hooks/index.js +3 -0
  188. package/dist/server/hooks/index.js.map +1 -1
  189. package/dist/server/hooks/logging.d.ts +36 -0
  190. package/dist/server/hooks/logging.d.ts.map +1 -1
  191. package/dist/server/hooks/logging.js +6 -0
  192. package/dist/server/hooks/logging.js.map +1 -1
  193. package/dist/server/hooks/rate-limit.d.ts +33 -0
  194. package/dist/server/hooks/rate-limit.d.ts.map +1 -1
  195. package/dist/server/hooks/rate-limit.js +11 -0
  196. package/dist/server/hooks/rate-limit.js.map +1 -1
  197. package/dist/server/http.d.ts +222 -0
  198. package/dist/server/http.d.ts.map +1 -1
  199. package/dist/server/http.js +20 -1
  200. package/dist/server/http.js.map +1 -1
  201. package/dist/server/index.d.ts +19 -1
  202. package/dist/server/index.d.ts.map +1 -1
  203. package/dist/server/index.js +7 -1
  204. package/dist/server/index.js.map +1 -1
  205. package/dist/server/openapi.d.ts +5 -3
  206. package/dist/server/openapi.d.ts.map +1 -1
  207. package/dist/server/openapi.js +4 -2
  208. package/dist/server/openapi.js.map +1 -1
  209. package/dist/server/providers/loadProviderConfig.d.ts +9 -0
  210. package/dist/server/providers/loadProviderConfig.d.ts.map +1 -1
  211. package/dist/server/providers/loadProviderConfig.js +9 -0
  212. package/dist/server/providers/loadProviderConfig.js.map +1 -1
  213. package/dist/server/server.d.ts +159 -19
  214. package/dist/server/server.d.ts.map +1 -1
  215. package/dist/server/server.js +72 -31
  216. package/dist/server/server.js.map +1 -1
  217. package/dist/testing/index.d.ts +171 -0
  218. package/dist/testing/index.d.ts.map +1 -0
  219. package/dist/testing/index.js +127 -0
  220. package/dist/testing/index.js.map +1 -0
  221. package/dist/uploads/client.d.ts +278 -0
  222. package/dist/uploads/client.d.ts.map +1 -0
  223. package/dist/uploads/client.js +428 -0
  224. package/dist/uploads/client.js.map +1 -0
  225. package/dist/uploads/index.d.ts +361 -0
  226. package/dist/uploads/index.d.ts.map +1 -0
  227. package/dist/uploads/index.js +543 -0
  228. package/dist/uploads/index.js.map +1 -0
  229. package/package.json +31 -2
  230. package/src/application/index.ts +85 -22
  231. package/src/client/client.ts +73 -12
  232. package/src/client/index.ts +12 -0
  233. package/src/client/types.ts +70 -9
  234. package/src/config/index.ts +86 -0
  235. package/src/contracts/contract-builder.ts +49 -22
  236. package/src/contracts/contract-group.ts +35 -19
  237. package/src/contracts/contract-like.ts +4 -4
  238. package/src/contracts/index.ts +28 -1
  239. package/src/contracts/openapi-meta.ts +8 -8
  240. package/src/contracts/path-template.ts +27 -0
  241. package/src/contracts/types.ts +111 -10
  242. package/src/contracts/utils.ts +6 -0
  243. package/src/domain/entity.ts +22 -11
  244. package/src/domain/events.ts +5 -2
  245. package/src/domain/value-object.ts +19 -9
  246. package/src/errors/catalog.ts +40 -16
  247. package/src/errors/response.ts +16 -4
  248. package/src/errors/validation.ts +10 -1
  249. package/src/events/index.ts +134 -0
  250. package/src/idempotency/index.ts +767 -0
  251. package/src/jobs/index.ts +437 -5
  252. package/src/mail/index.ts +149 -0
  253. package/src/notifications/index.ts +771 -0
  254. package/src/openapi/index.ts +133 -16
  255. package/src/outbox/index.ts +1104 -0
  256. package/src/pagination/index.ts +278 -0
  257. package/src/ports/audit.ts +271 -0
  258. package/src/ports/auth.ts +70 -0
  259. package/src/ports/cache.ts +41 -0
  260. package/src/ports/clock.ts +38 -0
  261. package/src/ports/id-generator.ts +37 -0
  262. package/src/ports/index.ts +106 -11
  263. package/src/ports/logger.ts +56 -0
  264. package/src/ports/policy.ts +133 -0
  265. package/src/ports/rate-limit.ts +25 -0
  266. package/src/ports/redaction.ts +101 -0
  267. package/src/ports/storage.ts +100 -0
  268. package/src/ports/testing.ts +47 -0
  269. package/src/ports/unit-of-work.ts +60 -3
  270. package/src/providers/instrumentation.ts +211 -1
  271. package/src/providers/provider.ts +14 -1
  272. package/src/schedules/index.ts +247 -0
  273. package/src/server/health.ts +14 -5
  274. package/src/server/hooks/auth.ts +105 -120
  275. package/src/server/hooks/cors.ts +27 -0
  276. package/src/server/hooks/errors.ts +15 -6
  277. package/src/server/hooks/index.ts +4 -5
  278. package/src/server/hooks/logging.ts +36 -0
  279. package/src/server/hooks/rate-limit.ts +33 -0
  280. package/src/server/http.ts +249 -1
  281. package/src/server/index.ts +19 -1
  282. package/src/server/openapi.ts +5 -3
  283. package/src/server/providers/loadProviderConfig.ts +9 -0
  284. package/src/server/server.ts +296 -30
  285. package/src/testing/index.ts +348 -0
  286. package/src/uploads/client.ts +861 -0
  287. package/src/uploads/index.ts +1067 -0
@@ -0,0 +1,543 @@
1
+ import { createProviderInstrumentation } from "../providers";
2
+ /**
3
+ * Error thrown for expected upload failures.
4
+ */
5
+ export class UploadError extends Error {
6
+ code;
7
+ status;
8
+ details;
9
+ constructor(args) {
10
+ super(args.message);
11
+ this.name = "UploadError";
12
+ this.code = args.code;
13
+ this.status = args.status ?? 400;
14
+ this.details = args.details;
15
+ }
16
+ }
17
+ /**
18
+ * Define a typed upload workflow.
19
+ */
20
+ export function defineUpload(name, options) {
21
+ return {
22
+ kind: "upload",
23
+ name,
24
+ metadata: options.metadata,
25
+ file: {
26
+ ...options.file,
27
+ maxFiles: options.file.maxFiles ?? 1,
28
+ visibility: options.file.visibility ?? "private",
29
+ },
30
+ ...(options.description !== undefined
31
+ ? { description: options.description }
32
+ : {}),
33
+ ...(options.authorize ? { authorize: options.authorize } : {}),
34
+ key: options.key,
35
+ ...(options.storageMetadata
36
+ ? { storageMetadata: options.storageMetadata }
37
+ : {}),
38
+ ...(options.onComplete ? { onComplete: options.onComplete } : {}),
39
+ };
40
+ }
41
+ /**
42
+ * Define a nested upload registry while preserving upload names and metadata
43
+ * types for client code.
44
+ */
45
+ export function defineUploads(uploads) {
46
+ return uploads;
47
+ }
48
+ /**
49
+ * Flatten a nested upload registry into the list expected by
50
+ * `createUploadRouter(...)`.
51
+ */
52
+ export function uploadsFromRegistry(uploads) {
53
+ if (Array.isArray(uploads))
54
+ return [...uploads];
55
+ const result = [];
56
+ for (const value of Object.values(uploads)) {
57
+ if (isUploadDef(value)) {
58
+ result.push(value);
59
+ }
60
+ else {
61
+ result.push(...uploadsFromRegistry(value));
62
+ }
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Create client-safe upload metadata for browser helpers.
68
+ */
69
+ export function createUploadManifest(uploads) {
70
+ return uploadsFromRegistry(uploads).map((upload) => ({
71
+ name: upload.name,
72
+ ...(upload.description !== undefined
73
+ ? { description: upload.description }
74
+ : {}),
75
+ file: upload.file,
76
+ }));
77
+ }
78
+ /**
79
+ * Create deterministic direct upload instructions for tests.
80
+ */
81
+ export function createMemoryUploadSigner(options = {}) {
82
+ const baseUrl = options.baseUrl ?? "https://uploads.beignet.test";
83
+ const expiresAt = options.expiresAt ?? "2100-01-01T00:00:00.000Z";
84
+ return {
85
+ sign(args) {
86
+ return {
87
+ method: "PUT",
88
+ url: `${baseUrl}/${encodeURIComponent(args.key)}`,
89
+ headers: {
90
+ "content-type": args.file.contentType,
91
+ },
92
+ expiresAt,
93
+ };
94
+ },
95
+ };
96
+ }
97
+ /**
98
+ * Create a framework-neutral upload router.
99
+ */
100
+ export function createUploadRouter(options) {
101
+ const uploads = new Map(options.uploads.map((upload) => [upload.name, upload]));
102
+ const id = options.id ?? randomUploadId;
103
+ const instrumentation = createProviderInstrumentation(options.instrumentation, {
104
+ providerName: "uploads",
105
+ watcher: "uploads",
106
+ });
107
+ async function resolveCtx() {
108
+ return typeof options.ctx === "function"
109
+ ? options.ctx()
110
+ : options.ctx;
111
+ }
112
+ function findUpload(name) {
113
+ const upload = uploads.get(name);
114
+ if (!upload) {
115
+ throw new UploadError({
116
+ code: "UPLOAD_NOT_FOUND",
117
+ status: 404,
118
+ message: `Upload "${name}" is not registered.`,
119
+ });
120
+ }
121
+ return upload;
122
+ }
123
+ async function prepare(uploadName, input) {
124
+ const startedAt = Date.now();
125
+ instrumentation.custom({
126
+ name: "upload.prepare.started",
127
+ label: "Upload prepare started",
128
+ summary: uploadName,
129
+ });
130
+ try {
131
+ const upload = findUpload(uploadName);
132
+ const ctx = await resolveCtx();
133
+ const metadata = await parseMetadata(upload, input.metadata);
134
+ assertFiles(upload, input.files);
135
+ const files = [];
136
+ for (const file of input.files) {
137
+ const uploadId = id();
138
+ await assertAuthorized(upload, { ctx, metadata, file, uploadId });
139
+ const key = await upload.key({ ctx, metadata, file, uploadId });
140
+ const storageMetadata = (await upload.storageMetadata?.({ ctx, metadata, file, uploadId })) ??
141
+ {};
142
+ const prepared = {
143
+ ...file,
144
+ uploadId,
145
+ key,
146
+ };
147
+ if (options.signer) {
148
+ prepared.direct = await options.signer.sign({
149
+ uploadName,
150
+ uploadId,
151
+ key,
152
+ file,
153
+ metadata,
154
+ storage: {
155
+ visibility: upload.file.visibility ?? "private",
156
+ ...(upload.file.cacheControl !== undefined
157
+ ? { cacheControl: upload.file.cacheControl }
158
+ : {}),
159
+ metadata: storageMetadata,
160
+ },
161
+ });
162
+ }
163
+ files.push(prepared);
164
+ }
165
+ instrumentation.custom({
166
+ name: "upload.prepare.completed",
167
+ label: "Upload prepare completed",
168
+ summary: `${uploadName} (${files.length} file${files.length === 1 ? "" : "s"})`,
169
+ details: {
170
+ uploadName,
171
+ mode: options.signer ? "direct" : "server",
172
+ fileCount: files.length,
173
+ durationMs: Date.now() - startedAt,
174
+ },
175
+ });
176
+ return {
177
+ uploadName,
178
+ mode: options.signer ? "direct" : "server",
179
+ files,
180
+ };
181
+ }
182
+ catch (error) {
183
+ recordFailure("upload.prepare.failed", uploadName, startedAt, error);
184
+ throw error;
185
+ }
186
+ }
187
+ async function complete(uploadName, input) {
188
+ const startedAt = Date.now();
189
+ instrumentation.custom({
190
+ name: "upload.complete.started",
191
+ label: "Upload complete started",
192
+ summary: uploadName,
193
+ });
194
+ try {
195
+ const upload = findUpload(uploadName);
196
+ const ctx = await resolveCtx();
197
+ const metadata = await parseMetadata(upload, input.metadata);
198
+ assertFiles(upload, input.files);
199
+ const files = [];
200
+ for (const file of input.files) {
201
+ await assertAuthorized(upload, {
202
+ ctx,
203
+ metadata,
204
+ file,
205
+ uploadId: file.uploadId,
206
+ });
207
+ const expectedKey = await upload.key({
208
+ ctx,
209
+ metadata,
210
+ file,
211
+ uploadId: file.uploadId,
212
+ });
213
+ if (file.key !== expectedKey) {
214
+ throw new UploadError({
215
+ code: "INVALID_UPLOAD_FILE",
216
+ status: 422,
217
+ message: `Uploaded object key does not match upload "${upload.name}".`,
218
+ details: {
219
+ expectedKey,
220
+ actualKey: file.key,
221
+ },
222
+ });
223
+ }
224
+ const object = await options.storage.stat(file.key);
225
+ if (!object) {
226
+ throw new UploadError({
227
+ code: "UPLOAD_OBJECT_NOT_FOUND",
228
+ status: 404,
229
+ message: `Uploaded object "${file.key}" was not found.`,
230
+ });
231
+ }
232
+ assertStoredObject(upload, file, object);
233
+ files.push({ ...file, object });
234
+ }
235
+ const result = await upload.onComplete?.({ ctx, metadata, files });
236
+ instrumentation.custom({
237
+ name: "upload.complete.completed",
238
+ label: "Upload complete completed",
239
+ summary: `${uploadName} (${files.length} file${files.length === 1 ? "" : "s"})`,
240
+ details: {
241
+ uploadName,
242
+ fileCount: files.length,
243
+ durationMs: Date.now() - startedAt,
244
+ },
245
+ });
246
+ return {
247
+ uploadName,
248
+ files,
249
+ result,
250
+ };
251
+ }
252
+ catch (error) {
253
+ recordFailure("upload.complete.failed", uploadName, startedAt, error);
254
+ throw error;
255
+ }
256
+ }
257
+ async function upload(uploadName, input) {
258
+ const startedAt = Date.now();
259
+ instrumentation.custom({
260
+ name: "upload.server.started",
261
+ label: "Server upload started",
262
+ summary: uploadName,
263
+ });
264
+ try {
265
+ const definition = findUpload(uploadName);
266
+ const ctx = await resolveCtx();
267
+ const metadata = await parseMetadata(definition, metadataFromFormData(input.formData));
268
+ const webFiles = filesFromFormData(input.formData);
269
+ const intents = webFiles.map(fileIntentFromFile);
270
+ assertFiles(definition, intents);
271
+ const completed = [];
272
+ for (const [index, file] of webFiles.entries()) {
273
+ const intent = intents[index];
274
+ if (!intent)
275
+ continue;
276
+ const uploadId = id();
277
+ await assertAuthorized(definition, {
278
+ ctx,
279
+ metadata,
280
+ file: intent,
281
+ uploadId,
282
+ });
283
+ const key = await definition.key({
284
+ ctx,
285
+ metadata,
286
+ file: intent,
287
+ uploadId,
288
+ });
289
+ const storageMetadata = (await definition.storageMetadata?.({
290
+ ctx,
291
+ metadata,
292
+ file: intent,
293
+ uploadId,
294
+ })) ?? {};
295
+ const object = await options.storage.put(key, file, {
296
+ contentType: intent.contentType,
297
+ ...(definition.file.cacheControl !== undefined
298
+ ? { cacheControl: definition.file.cacheControl }
299
+ : {}),
300
+ metadata: storageMetadata,
301
+ visibility: definition.file.visibility ?? "private",
302
+ });
303
+ completed.push({
304
+ ...intent,
305
+ uploadId,
306
+ key,
307
+ object,
308
+ });
309
+ }
310
+ const result = await definition.onComplete?.({
311
+ ctx,
312
+ metadata,
313
+ files: completed,
314
+ });
315
+ instrumentation.custom({
316
+ name: "upload.server.completed",
317
+ label: "Server upload completed",
318
+ summary: `${uploadName} (${completed.length} file${completed.length === 1 ? "" : "s"})`,
319
+ details: {
320
+ uploadName,
321
+ fileCount: completed.length,
322
+ durationMs: Date.now() - startedAt,
323
+ },
324
+ });
325
+ return {
326
+ uploadName,
327
+ files: completed,
328
+ result,
329
+ };
330
+ }
331
+ catch (error) {
332
+ recordFailure("upload.server.failed", uploadName, startedAt, error);
333
+ throw error;
334
+ }
335
+ }
336
+ function recordFailure(name, uploadName, startedAt, error) {
337
+ instrumentation.custom({
338
+ name,
339
+ label: "Upload failed",
340
+ summary: uploadName,
341
+ details: {
342
+ uploadName,
343
+ durationMs: Date.now() - startedAt,
344
+ error: error instanceof Error ? error.message : String(error),
345
+ },
346
+ });
347
+ }
348
+ return {
349
+ prepare,
350
+ complete,
351
+ upload,
352
+ async handleRequest(request, requestOptions) {
353
+ try {
354
+ if (requestOptions.action === "prepare") {
355
+ const input = (await request.json());
356
+ return jsonResponse(await prepare(requestOptions.uploadName, input));
357
+ }
358
+ if (requestOptions.action === "complete") {
359
+ const input = (await request.json());
360
+ return jsonResponse(await complete(requestOptions.uploadName, input));
361
+ }
362
+ const formData = await request.formData();
363
+ return jsonResponse(await upload(requestOptions.uploadName, {
364
+ formData,
365
+ }));
366
+ }
367
+ catch (error) {
368
+ return uploadErrorResponse(error);
369
+ }
370
+ },
371
+ };
372
+ }
373
+ async function parseMetadata(upload, input) {
374
+ const result = await upload.metadata["~standard"].validate(input);
375
+ if (result.issues?.length) {
376
+ throw new UploadError({
377
+ code: "INVALID_UPLOAD_METADATA",
378
+ status: 422,
379
+ message: `Invalid metadata for upload "${upload.name}".`,
380
+ details: { issues: result.issues },
381
+ });
382
+ }
383
+ if ("value" in result) {
384
+ return result.value;
385
+ }
386
+ throw new Error("Invalid Standard Schema result: missing value");
387
+ }
388
+ function assertFiles(upload, files) {
389
+ const maxFiles = upload.file.maxFiles ?? 1;
390
+ if (files.length === 0 || files.length > maxFiles) {
391
+ throw new UploadError({
392
+ code: "INVALID_UPLOAD_FILE",
393
+ status: 422,
394
+ message: `Upload "${upload.name}" requires between 1 and ${maxFiles} file${maxFiles === 1 ? "" : "s"}.`,
395
+ details: { fileCount: files.length, maxFiles },
396
+ });
397
+ }
398
+ for (const file of files) {
399
+ if (!file.name || !file.contentType || !Number.isFinite(file.size)) {
400
+ throw new UploadError({
401
+ code: "INVALID_UPLOAD_FILE",
402
+ status: 422,
403
+ message: `Upload "${upload.name}" received invalid file metadata.`,
404
+ details: { file },
405
+ });
406
+ }
407
+ if (upload.file.contentTypes?.length &&
408
+ !upload.file.contentTypes.includes(file.contentType)) {
409
+ throw new UploadError({
410
+ code: "INVALID_UPLOAD_FILE",
411
+ status: 415,
412
+ message: `Upload "${upload.name}" does not accept "${file.contentType}".`,
413
+ details: {
414
+ contentType: file.contentType,
415
+ acceptedContentTypes: upload.file.contentTypes,
416
+ },
417
+ });
418
+ }
419
+ if (upload.file.maxSizeBytes !== undefined &&
420
+ file.size > upload.file.maxSizeBytes) {
421
+ throw new UploadError({
422
+ code: "INVALID_UPLOAD_FILE",
423
+ status: 413,
424
+ message: `Upload "${upload.name}" exceeds the maximum file size.`,
425
+ details: {
426
+ size: file.size,
427
+ maxSizeBytes: upload.file.maxSizeBytes,
428
+ },
429
+ });
430
+ }
431
+ }
432
+ }
433
+ async function assertAuthorized(upload, args) {
434
+ const result = await upload.authorize?.(args);
435
+ const denied = result === false ||
436
+ (typeof result === "object" &&
437
+ result !== null &&
438
+ "allowed" in result &&
439
+ result.allowed === false);
440
+ if (!denied)
441
+ return;
442
+ throw new UploadError({
443
+ code: "UNAUTHORIZED_UPLOAD",
444
+ status: 403,
445
+ message: typeof result === "object" && result?.reason
446
+ ? result.reason
447
+ : `Upload "${upload.name}" is not authorized.`,
448
+ });
449
+ }
450
+ function assertStoredObject(upload, file, object) {
451
+ assertFiles(upload, [file]);
452
+ if (object.contentType &&
453
+ file.contentType &&
454
+ object.contentType !== file.contentType) {
455
+ throw new UploadError({
456
+ code: "INVALID_UPLOAD_FILE",
457
+ status: 422,
458
+ message: `Uploaded object "${object.key}" content type does not match the prepared file.`,
459
+ details: {
460
+ expected: file.contentType,
461
+ actual: object.contentType,
462
+ },
463
+ });
464
+ }
465
+ }
466
+ function metadataFromFormData(formData) {
467
+ const metadata = formData.get("metadata");
468
+ if (typeof metadata !== "string")
469
+ return {};
470
+ try {
471
+ return JSON.parse(metadata);
472
+ }
473
+ catch {
474
+ throw new UploadError({
475
+ code: "INVALID_UPLOAD_BODY",
476
+ status: 400,
477
+ message: "Upload metadata must be valid JSON.",
478
+ });
479
+ }
480
+ }
481
+ function filesFromFormData(formData) {
482
+ const values = [...formData.getAll("file"), ...formData.getAll("files")];
483
+ const files = values.filter((value) => value instanceof File);
484
+ if (files.length === 0) {
485
+ throw new UploadError({
486
+ code: "INVALID_UPLOAD_BODY",
487
+ status: 400,
488
+ message: 'Multipart upload must include at least one "file" field.',
489
+ });
490
+ }
491
+ return files;
492
+ }
493
+ function fileIntentFromFile(file) {
494
+ return {
495
+ name: file.name,
496
+ contentType: file.type || "application/octet-stream",
497
+ size: file.size,
498
+ };
499
+ }
500
+ function jsonResponse(body, init) {
501
+ const headers = {
502
+ "content-type": "application/json",
503
+ };
504
+ if (init?.headers) {
505
+ new Headers(init.headers).forEach((value, key) => {
506
+ headers[key] = value;
507
+ });
508
+ }
509
+ return new Response(JSON.stringify(body), {
510
+ status: init?.status ?? 200,
511
+ headers,
512
+ });
513
+ }
514
+ function uploadErrorResponse(error) {
515
+ if (error instanceof UploadError) {
516
+ return jsonResponse({
517
+ error: {
518
+ code: error.code,
519
+ message: error.message,
520
+ ...(error.details !== undefined ? { details: error.details } : {}),
521
+ },
522
+ }, { status: error.status });
523
+ }
524
+ return jsonResponse({
525
+ error: {
526
+ code: "INTERNAL_SERVER_ERROR",
527
+ message: "Internal server error",
528
+ },
529
+ }, { status: 500 });
530
+ }
531
+ function randomUploadId() {
532
+ if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
533
+ return crypto.randomUUID();
534
+ }
535
+ return `upload_${Math.random().toString(36).slice(2)}`;
536
+ }
537
+ function isUploadDef(value) {
538
+ return (typeof value === "object" &&
539
+ value !== null &&
540
+ "kind" in value &&
541
+ value.kind === "upload");
542
+ }
543
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/uploads/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beignet/core",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "description": "Core framework primitives for Beignet",
6
6
  "exports": {
@@ -36,6 +36,10 @@
36
36
  "types": "./dist/events/index.d.ts",
37
37
  "default": "./dist/events/index.js"
38
38
  },
39
+ "./idempotency": {
40
+ "types": "./dist/idempotency/index.d.ts",
41
+ "default": "./dist/idempotency/index.js"
42
+ },
39
43
  "./jobs": {
40
44
  "types": "./dist/jobs/index.d.ts",
41
45
  "default": "./dist/jobs/index.js"
@@ -44,10 +48,22 @@
44
48
  "types": "./dist/mail/index.d.ts",
45
49
  "default": "./dist/mail/index.js"
46
50
  },
51
+ "./notifications": {
52
+ "types": "./dist/notifications/index.d.ts",
53
+ "default": "./dist/notifications/index.js"
54
+ },
47
55
  "./openapi": {
48
56
  "types": "./dist/openapi/index.d.ts",
49
57
  "default": "./dist/openapi/index.js"
50
58
  },
59
+ "./outbox": {
60
+ "types": "./dist/outbox/index.d.ts",
61
+ "default": "./dist/outbox/index.js"
62
+ },
63
+ "./pagination": {
64
+ "types": "./dist/pagination/index.d.ts",
65
+ "default": "./dist/pagination/index.js"
66
+ },
51
67
  "./ports": {
52
68
  "types": "./dist/ports/index.d.ts",
53
69
  "default": "./dist/ports/index.js"
@@ -64,6 +80,18 @@
64
80
  "types": "./dist/schedules/index.d.ts",
65
81
  "default": "./dist/schedules/index.js"
66
82
  },
83
+ "./testing": {
84
+ "types": "./dist/testing/index.d.ts",
85
+ "default": "./dist/testing/index.js"
86
+ },
87
+ "./uploads": {
88
+ "types": "./dist/uploads/index.d.ts",
89
+ "default": "./dist/uploads/index.js"
90
+ },
91
+ "./uploads/client": {
92
+ "types": "./dist/uploads/client.d.ts",
93
+ "default": "./dist/uploads/client.js"
94
+ },
67
95
  "./server": {
68
96
  "types": "./dist/server/index.d.ts",
69
97
  "default": "./dist/server/index.js"
@@ -82,7 +110,8 @@
82
110
  "build": "tsc",
83
111
  "dev": "tsc --watch",
84
112
  "clean": "rm -rf dist coverage .turbo",
85
- "test": "bun test",
113
+ "test": "bun test && bun run typecheck:types",
114
+ "typecheck:types": "tsc -p tsconfig.type-tests.json",
86
115
  "test:coverage": "bun test --coverage",
87
116
  "lint": "biome check ."
88
117
  },