bunderstack 0.19.0 → 0.19.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 (83) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/access.js.map +1 -1
  3. package/dist/api/builder.js.map +1 -1
  4. package/dist/api/context.js.map +1 -1
  5. package/dist/api/crud-router.d.ts +2 -2
  6. package/dist/api/crud-router.d.ts.map +1 -1
  7. package/dist/api/crud-router.js +72 -67
  8. package/dist/api/crud-router.js.map +1 -1
  9. package/dist/api/list-input-schema.js.map +1 -1
  10. package/dist/api/list-spec.js.map +1 -1
  11. package/dist/api/live-view.js.map +1 -1
  12. package/dist/api/live-window.js.map +1 -1
  13. package/dist/api/openapi.js.map +1 -1
  14. package/dist/api/realtime-router.js.map +1 -1
  15. package/dist/api/registry.js.map +1 -1
  16. package/dist/api/router.js.map +1 -1
  17. package/dist/api/storage-router.js.map +1 -1
  18. package/dist/api/types.d.ts +1 -1
  19. package/dist/api/types.d.ts.map +1 -1
  20. package/dist/api/types.js.map +1 -1
  21. package/dist/auth.js.map +1 -1
  22. package/dist/blueprint-generator.js.map +1 -1
  23. package/dist/blueprint.js.map +1 -1
  24. package/dist/cli-skills.js.map +1 -1
  25. package/dist/cli.js.map +1 -1
  26. package/dist/config.js.map +1 -1
  27. package/dist/cron.js.map +1 -1
  28. package/dist/crud-operations.js.map +1 -1
  29. package/dist/database/adapter.js.map +1 -1
  30. package/dist/database/bun-sql.js.map +1 -1
  31. package/dist/database/libsql.js.map +1 -1
  32. package/dist/database/pglite.js.map +1 -1
  33. package/dist/database/postgres-js.js.map +1 -1
  34. package/dist/db.js.map +1 -1
  35. package/dist/dialect.js.map +1 -1
  36. package/dist/email/smtp.js.map +1 -1
  37. package/dist/email.js.map +1 -1
  38. package/dist/env.js.map +1 -1
  39. package/dist/errors.js.map +1 -1
  40. package/dist/handler.js.map +1 -1
  41. package/dist/idempotency.js.map +1 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/internal-tables-pg.js.map +1 -1
  44. package/dist/internal-tables.js.map +1 -1
  45. package/dist/jobs/cron.js.map +1 -1
  46. package/dist/jobs/define.js.map +1 -1
  47. package/dist/jobs/index.js.map +1 -1
  48. package/dist/jobs/queue.js.map +1 -1
  49. package/dist/jobs/runtime.js.map +1 -1
  50. package/dist/jobs/slots.js.map +1 -1
  51. package/dist/jobs/worker.js.map +1 -1
  52. package/dist/lifecycle.js.map +1 -1
  53. package/dist/list-query.js.map +1 -1
  54. package/dist/live/apply.js.map +1 -1
  55. package/dist/live/index.js.map +1 -1
  56. package/dist/live/protocol.js.map +1 -1
  57. package/dist/live/sse.js.map +1 -1
  58. package/dist/manifest.js.map +1 -1
  59. package/dist/provision-internals.js.map +1 -1
  60. package/dist/provision.js.map +1 -1
  61. package/dist/rate-limit.js.map +1 -1
  62. package/dist/realtime/facade.js.map +1 -1
  63. package/dist/realtime/filter.js.map +1 -1
  64. package/dist/realtime/heartbeat.js.map +1 -1
  65. package/dist/realtime/publisher.js.map +1 -1
  66. package/dist/schema-export-pg.js.map +1 -1
  67. package/dist/schema-export.js.map +1 -1
  68. package/dist/scope.js.map +1 -1
  69. package/dist/standard-schema.js.map +1 -1
  70. package/dist/storage/buckets.js.map +1 -1
  71. package/dist/storage/delete.js.map +1 -1
  72. package/dist/storage/file-meta.js.map +1 -1
  73. package/dist/storage/index.js.map +1 -1
  74. package/dist/storage/local.js.map +1 -1
  75. package/dist/storage/operations.js.map +1 -1
  76. package/dist/storage/registry.js.map +1 -1
  77. package/dist/storage/s3.js.map +1 -1
  78. package/dist/storage/sweep.js.map +1 -1
  79. package/dist/storage/thumbnails.js.map +1 -1
  80. package/dist/testing.js.map +1 -1
  81. package/dist/typeid-pg.js.map +1 -1
  82. package/dist/typeid.js.map +1 -1
  83. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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","sourcesContent":["// src/storage/local.ts\nimport { mkdir, readdir } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nexport class LocalStorageAdapter {\n private readonly basePath: string\n constructor(basePath: string) {\n this.basePath = basePath\n }\n\n private filePath(fileId: string) {\n return join(this.basePath, fileId)\n }\n\n async upload(\n fileId: string,\n data: Blob | ArrayBuffer,\n contentType: string,\n ): Promise<void> {\n await mkdir(this.basePath, { recursive: true })\n const bytes = data instanceof Blob ? await data.arrayBuffer() : data\n await Bun.write(\n Bun.file(this.filePath(fileId), { type: contentType }),\n bytes,\n )\n }\n\n async get(fileId: string): Promise<Response> {\n const file = Bun.file(this.filePath(fileId))\n if (!(await file.exists()))\n return new Response('Not found', { status: 404 })\n return new Response(file, {\n headers: {\n 'Content-Type': file.type,\n 'Cache-Control': 'public, max-age=31536000',\n },\n })\n }\n\n async delete(fileId: string): Promise<void> {\n const file = Bun.file(this.filePath(fileId))\n if (await file.exists()) await file.unlink()\n }\n\n async exists(fileId: string): Promise<boolean> {\n return Bun.file(this.filePath(fileId)).exists()\n }\n\n async stat(\n key: string,\n ): Promise<{ size: number; contentType: string } | null> {\n const file = Bun.file(this.filePath(key))\n if (!(await file.exists())) return null\n return { size: file.size, contentType: file.type }\n }\n\n async list(prefix: string): Promise<string[]> {\n const cleanPrefix = prefix.replace(/\\/$/, '')\n const dir = join(this.basePath, cleanPrefix)\n let entries: string[]\n try {\n entries = await readdir(dir)\n } catch {\n // Missing dir (or prefix isn't a directory) → no derivatives.\n return []\n }\n return entries.map((name) => `${cleanPrefix}/${name}`)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/storage/operations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/storage/operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto'\nimport { extname } from 'node:path'\n\nimport type { AccessContext, OperationRule } from '../access'\nimport type { AnyDb } from '../dialect'\nimport type { BucketStorageRegistry } from './registry'\n\nimport { checkAccess } from '../access'\nimport { BunderstackError } from '../errors'\nimport { deleteFileWithDerivatives } from './delete'\nimport {\n deleteFileMetaRow,\n fileMatchesScope,\n getFileMeta,\n insertPendingFile,\n insertReadyFile,\n markFileReady,\n scopeToJson,\n sumReadySize,\n type FileMetaRow,\n} from './file-meta'\nimport { parseTransformSpec, transformHash, transformImage } from './thumbnails'\n\nexport interface StorageExecutionContext {\n request: Request\n user: AccessContext['user']\n session: { activeOrganizationId: string | null }\n}\n\nexport interface StorageOperationsOptions {\n registry: BucketStorageRegistry\n db: AnyDb\n presignExpiresSec?: number\n}\n\nexport type PrepareUploadResult =\n | { mode: 'proxy'; uploadUrl: string }\n | {\n mode: 'presign'\n fileId: string\n uploadUrl: string\n method: 'PUT'\n confirmUrl: string\n }\n\nexport type StorageDownload =\n | { kind: 'redirect'; status: 302; url: string }\n | {\n kind: 'body'\n status: number\n body: ConstructorParameters<typeof Response>[0]\n headers: Headers\n }\n\nconst FILE_OWNER_COLUMN = 'ownerId'\n\nfunction matchMime(type: string, accept?: string[]): boolean {\n if (!accept || accept.length === 0) return true\n if (!type) return false\n return accept.some(\n (pattern) =>\n pattern === type ||\n (pattern.endsWith('/*') && type.startsWith(pattern.slice(0, -1))),\n )\n}\n\nfunction accessContext(\n context: StorageExecutionContext,\n extra: { row?: FileMetaRow; body?: Record<string, unknown> } = {},\n): AccessContext {\n return {\n request: context.request,\n user: context.user,\n session: context.session,\n row: extra.row,\n body: extra.body,\n }\n}\n\nasync function gate(rule: OperationRule, context: AccessContext) {\n const result = await checkAccess(rule, context, FILE_OWNER_COLUMN)\n if (!result.allowed) {\n throw new BunderstackError(\n result.status === 401 ? 'UNAUTHORIZED' : 'FORBIDDEN',\n result.status === 401 ? 'Authentication required' : 'Forbidden',\n )\n }\n}\n\nfunction notFound(message = 'Not found'): never {\n throw new BunderstackError('NOT_FOUND', message)\n}\n\nfunction sanitizeFilename(name: string): string {\n return name.replace(/[\"\\\\\\r\\n]/g, '')\n}\n\nasync function quotaExceeded(\n db: AnyDb,\n bucket: string,\n quota: { perUserBytes?: number; perScopeBytes?: number },\n ownerId: string | undefined,\n scopeJson: string | null,\n incoming: number,\n): Promise<boolean> {\n if (quota.perUserBytes !== undefined && ownerId !== undefined) {\n const current = await sumReadySize(db, { bucket, ownerId })\n if (current + incoming > quota.perUserBytes) return true\n }\n if (quota.perScopeBytes !== undefined && scopeJson != null) {\n const current = await sumReadySize(db, { bucket, scopeJson })\n if (current + incoming > quota.perScopeBytes) return true\n }\n return false\n}\n\nexport function createStorageOperations(options: StorageOperationsOptions) {\n const { registry, db } = options\n const presignExpiresSec = options.presignExpiresSec ?? 60\n\n const bucketEntry = (name: string) => {\n const entry = registry.get(name)\n if (!entry) notFound('Unknown bucket')\n return entry\n }\n\n return {\n async prepareUpload(\n bucketName: string,\n body: { filename?: string; contentType?: string },\n context: StorageExecutionContext,\n ): Promise<PrepareUploadResult> {\n const { bucket, adapter } = bucketEntry(bucketName)\n const ctx = accessContext(context, { body })\n await gate(bucket.access.create, ctx)\n\n if (!adapter.presignPut) {\n return { mode: 'proxy', uploadUrl: `/api/files/${bucket.name}` }\n }\n\n const scopeJson = scopeToJson(bucket.writeScope?.(ctx))\n if (\n bucket.quota &&\n (await quotaExceeded(\n db,\n bucket.name,\n bucket.quota,\n context.user?.id,\n scopeJson,\n bucket.upload?.maxSizeBytes ?? 0,\n ))\n ) {\n throw new BunderstackError('PAYLOAD_TOO_LARGE', 'Quota exceeded')\n }\n\n const fileId = `${bucket.name}/${randomUUID()}${extname(body.filename ?? '')}`\n await insertPendingFile(db, {\n fileId,\n bucket: bucket.name,\n ownerId: context.user?.id ?? null,\n scopeJson,\n filename: body.filename ?? null,\n contentType: body.contentType ?? null,\n })\n const uploadUrl = await adapter.presignPut(fileId, {\n contentType: body.contentType,\n expiresIn: presignExpiresSec,\n })\n const id = fileId.slice(`${bucket.name}/`.length)\n return {\n mode: 'presign',\n fileId,\n uploadUrl,\n method: 'PUT',\n confirmUrl: `/api/files/${bucket.name}/${id}/confirm`,\n }\n },\n\n async upload(\n bucketName: string,\n file: File,\n context: StorageExecutionContext,\n ) {\n const { bucket, adapter } = bucketEntry(bucketName)\n const ctx = accessContext(context)\n await gate(bucket.access.create, ctx)\n\n if (!matchMime(file.type, bucket.upload?.accept)) {\n throw new BunderstackError(\n 'BAD_REQUEST',\n `Content type ${file.type || '(none)'} not allowed`,\n )\n }\n if (\n bucket.upload?.maxSizeBytes !== undefined &&\n file.size > bucket.upload.maxSizeBytes\n ) {\n throw new BunderstackError('PAYLOAD_TOO_LARGE', 'File too large')\n }\n\n const scopeJson = scopeToJson(bucket.readScope?.(ctx))\n if (\n bucket.quota &&\n (await quotaExceeded(\n db,\n bucket.name,\n bucket.quota,\n context.user?.id,\n scopeJson,\n file.size,\n ))\n ) {\n throw new BunderstackError('PAYLOAD_TOO_LARGE', 'Quota exceeded')\n }\n\n const fileId = `${bucket.name}/${randomUUID()}${extname(file.name)}`\n await adapter.upload(fileId, await file.arrayBuffer(), file.type)\n await insertReadyFile(db, {\n fileId,\n bucket: bucket.name,\n ownerId: context.user?.id ?? null,\n scopeJson,\n filename: file.name || null,\n contentType: file.type || null,\n size: file.size,\n })\n const id = fileId.slice(`${bucket.name}/`.length)\n return {\n status: 201 as const,\n fileId,\n url: `/api/files/${bucket.name}/${id}`,\n }\n },\n\n async confirmUpload(\n bucketName: string,\n id: string,\n context: StorageExecutionContext,\n ) {\n const { bucket, adapter } = bucketEntry(bucketName)\n const fileId = `${bucketName}/${id}`\n const row = await getFileMeta(db, fileId)\n if (!row || row.bucket !== bucketName) notFound()\n if (row.ownerId != null && row.ownerId !== (context.user?.id ?? null)) {\n throw new BunderstackError('FORBIDDEN', 'Forbidden')\n }\n\n const result = { fileId, url: `/api/files/${bucketName}/${id}` }\n if (row.status === 'ready') return result\n\n const info = await adapter.stat?.(fileId)\n if (!info) notFound()\n\n const rejectUpload = async (message: string, validation = false) => {\n await adapter.delete(fileId)\n await deleteFileMetaRow(db, fileId)\n throw new BunderstackError(\n validation ? 'BAD_REQUEST' : 'PAYLOAD_TOO_LARGE',\n message,\n )\n }\n if (\n bucket.upload?.maxSizeBytes !== undefined &&\n info.size > bucket.upload.maxSizeBytes\n ) {\n await rejectUpload('File too large')\n }\n if (!matchMime(info.contentType, bucket.upload?.accept)) {\n await rejectUpload(\n `Content type ${info.contentType || '(none)'} not allowed`,\n true,\n )\n }\n if (\n bucket.quota &&\n (await quotaExceeded(\n db,\n bucket.name,\n bucket.quota,\n row.ownerId ?? undefined,\n row.scopeJson,\n info.size,\n ))\n ) {\n await rejectUpload('Quota exceeded')\n }\n\n await markFileReady(db, fileId, info)\n return result\n },\n\n async download(\n bucketName: string,\n id: string,\n query: Record<string, string>,\n context: StorageExecutionContext,\n ): Promise<StorageDownload> {\n const { bucket, adapter } = bucketEntry(bucketName)\n const fileId = `${bucketName}/${id}`\n const row = await getFileMeta(db, fileId)\n if (!row || row.status !== 'ready' || row.bucket !== bucketName)\n notFound()\n\n const ctx = accessContext(context, { row })\n await gate(bucket.access.get, ctx)\n if (!fileMatchesScope(row, bucket.readScope?.(ctx))) notFound()\n\n const spec = parseTransformSpec(query)\n if (spec) {\n if (!bucket.transforms) {\n throw new BunderstackError(\n 'BAD_REQUEST',\n 'Transforms not enabled for this bucket',\n )\n }\n const ext = spec.format ? `.${spec.format}` : extname(fileId) || '.jpg'\n const cacheKey = `${fileId}__transforms/${transformHash(spec)}${ext}`\n if (await adapter.exists(cacheKey)) {\n const cached = await adapter.get(cacheKey)\n const headers = new Headers(cached.headers)\n headers.set('Cache-Control', 'public, max-age=31536000')\n return {\n kind: 'body',\n status: cached.status,\n body: cached.body,\n headers,\n }\n }\n\n const original = await adapter.get(fileId)\n if (original.status === 404) notFound()\n const transformed = await transformImage(\n Buffer.from(await original.arrayBuffer()),\n spec,\n )\n const contentType = spec.format\n ? `image/${spec.format}`\n : (original.headers.get('Content-Type') ?? 'image/jpeg')\n const body = Uint8Array.from(transformed).buffer\n await adapter.upload(cacheKey, body, contentType)\n return {\n kind: 'body',\n status: 200,\n body,\n headers: new Headers({\n 'Content-Type': contentType,\n 'Cache-Control': 'public, max-age=31536000',\n }),\n }\n }\n\n if (bucket.visibility === 'public' && adapter.publicUrlFor) {\n const url = adapter.publicUrlFor(fileId)\n if (url) return { kind: 'redirect', status: 302, url }\n }\n if (bucket.visibility === 'private' && adapter.presignGet) {\n return {\n kind: 'redirect',\n status: 302,\n url: await adapter.presignGet(fileId, {\n expiresIn: presignExpiresSec,\n }),\n }\n }\n\n const response = await adapter.get(fileId)\n const headers = new Headers(response.headers)\n if (response.status !== 404 && row.filename) {\n headers.set(\n 'Content-Disposition',\n `inline; filename=\"${sanitizeFilename(row.filename)}\"`,\n )\n }\n return {\n kind: 'body',\n status: response.status,\n body: response.body,\n headers,\n }\n },\n\n async delete(\n bucketName: string,\n id: string,\n context: StorageExecutionContext,\n ): Promise<void> {\n const { bucket, adapter } = bucketEntry(bucketName)\n const fileId = `${bucketName}/${id}`\n const row = await getFileMeta(db, fileId)\n if (!row || row.bucket !== bucketName) notFound()\n const ctx = accessContext(context, { row })\n await gate(bucket.access.delete, ctx)\n if (!fileMatchesScope(row, bucket.readScope?.(ctx))) notFound()\n await deleteFileWithDerivatives(adapter, db, fileId)\n },\n }\n}\n\nexport type StorageOperations = ReturnType<typeof createStorageOperations>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/storage/registry.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAA;AAQvC,MAAM,UAAU,aAAa,CAAC,OAAwB;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,gBAAgB,CAAC;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgC;IAEhC,MAAM,QAAQ,GAA0B,IAAI,GAAG,EAAE,CAAA;IACjD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/storage/registry.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAA;AAQvC,MAAM,UAAU,aAAa,CAAC,OAAwB;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,gBAAgB,CAAC;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgC;IAEhC,MAAM,QAAQ,GAA0B,IAAI,GAAG,EAAE,CAAA;IACjD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC","sourcesContent":["// src/storage/registry.ts\nimport type {\n ResolvedBackend,\n ResolvedBucket,\n ResolvedStorageBuckets,\n} from './buckets'\nimport type { StorageAdapter } from './index'\n\nimport { LocalStorageAdapter } from './local'\nimport { S3StorageAdapter } from './s3'\n\nexport interface BucketStorage {\n bucket: ResolvedBucket\n adapter: StorageAdapter\n}\nexport type BucketStorageRegistry = Map<string, BucketStorage>\n\nexport function createAdapter(backend: ResolvedBackend): StorageAdapter {\n if (backend.type === 'local') {\n return new LocalStorageAdapter(backend.path)\n }\n return new S3StorageAdapter({\n bucket: backend.bucket,\n region: backend.region,\n accessKeyId: backend.accessKeyId,\n secretAccessKey: backend.secretAccessKey,\n endpoint: backend.endpoint,\n publicUrl: backend.publicUrl,\n })\n}\n\nexport function createBucketStorages(\n resolved: ResolvedStorageBuckets,\n): BucketStorageRegistry {\n const registry: BucketStorageRegistry = new Map()\n for (const [name, bucket] of resolved.buckets) {\n registry.set(name, { bucket, adapter: createAdapter(bucket.backend) })\n }\n return registry\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/storage/s3.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAmC;IAChC,SAAS,CAAS;IAEnC,YAAY,GAAa;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;YAC7B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;SAChD,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAAc,EACd,IAAwB,EACxB,WAAmB;QAEnB,MAAM,KAAK,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACpE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,sEAAsE;QACtE,uEAAuE;QACvE,uEAAuE;QACvE,6BAA6B;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;YACjC,OAAO,EAAE;gBACP,cAAc,EAAE,IAAI,CAAC,WAAW,IAAI,0BAA0B;aAC/D;SACF,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,IAAuB;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;SACpD,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,IAAuB;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,GAAW;QAEX,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACrC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAA;QACrC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9C,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAC9C,CAAC;CACF"}
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/storage/s3.ts"],"names":[],"mappings":"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","sourcesContent":["// src/storage/s3.ts\nimport type {\n PresignGetOptions,\n PresignPutOptions,\n StorageAdapter,\n} from './index'\n\ninterface S3Config {\n bucket: string\n region: string\n accessKeyId: string\n secretAccessKey: string\n endpoint?: string\n publicUrl?: string\n}\n\nexport class S3StorageAdapter implements StorageAdapter {\n private client: InstanceType<typeof Bun.S3Client>\n private readonly publicUrl?: string\n\n constructor(cfg: S3Config) {\n this.client = new Bun.S3Client({\n bucket: cfg.bucket,\n region: cfg.region,\n accessKeyId: cfg.accessKeyId,\n secretAccessKey: cfg.secretAccessKey,\n ...(cfg.endpoint && { endpoint: cfg.endpoint }),\n })\n this.publicUrl = cfg.publicUrl\n }\n\n async upload(\n fileId: string,\n data: Blob | ArrayBuffer,\n contentType: string,\n ): Promise<void> {\n const bytes = data instanceof Blob ? await data.arrayBuffer() : data\n await this.client.write(fileId, bytes, { type: contentType })\n }\n\n async get(fileId: string): Promise<Response> {\n // `stat` (a HEAD, same cost as `exists`) is the only way to learn the\n // stored Content-Type: a lazily-constructed `client.file(key)` reports\n // `type: \"\"` — it never stats, and unlike `Bun.file` it does not guess\n // from the extension either.\n const info = await this.stat(fileId)\n if (!info) return new Response('Not found', { status: 404 })\n const file = this.client.file(fileId)\n return new Response(file.stream(), {\n headers: {\n 'Content-Type': info.contentType || 'application/octet-stream',\n },\n })\n }\n\n async delete(fileId: string): Promise<void> {\n await this.client.delete(fileId)\n }\n\n async exists(fileId: string): Promise<boolean> {\n return this.client.exists(fileId)\n }\n\n async presignPut(key: string, opts: PresignPutOptions): Promise<string> {\n return this.client.presign(key, {\n method: 'PUT',\n expiresIn: opts.expiresIn,\n ...(opts.contentType && { type: opts.contentType }),\n })\n }\n\n async presignGet(key: string, opts: PresignGetOptions): Promise<string> {\n return this.client.presign(key, {\n method: 'GET',\n expiresIn: opts.expiresIn,\n })\n }\n\n async stat(\n key: string,\n ): Promise<{ size: number; contentType: string } | null> {\n try {\n const s = await this.client.stat(key)\n return { size: s.size, contentType: s.type }\n } catch {\n return null\n }\n }\n\n publicUrlFor(key: string): string | undefined {\n if (!this.publicUrl) return undefined\n return `${this.publicUrl.replace(/\\/$/, '')}/${key}`\n }\n\n async list(prefix: string): Promise<string[]> {\n const res = await this.client.list({ prefix })\n return res.contents?.map((c) => c.key) ?? []\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/storage/sweep.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEtE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA+B,EAC/B,EAAS,EACT,WAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;QACjD,MAAM,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjD,MAAM,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC"}
1
+ {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/storage/sweep.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEtE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA+B,EAC/B,EAAS,EACT,WAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;QACjD,MAAM,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjD,MAAM,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC","sourcesContent":["// src/storage/sweep.ts\nimport type { AnyDb } from '../dialect'\nimport type { BucketStorageRegistry } from './registry'\n\nimport { deleteFileMetaRow, listStalePendingFiles } from './file-meta'\n\n/**\n * Reap stale `pending` file-meta rows (two-phase uploads that never confirmed)\n * older than `olderThanMs`. For each, best-effort delete the object (it may\n * never have landed) then remove the meta row. Returns the number reaped.\n */\nexport async function sweepOrphans(\n registry: BucketStorageRegistry,\n db: AnyDb,\n olderThanMs: number,\n): Promise<number> {\n const cutoff = Date.now() - olderThanMs\n const rows = await listStalePendingFiles(db, cutoff)\n for (const row of rows) {\n const adapter = registry.get(row.bucket)?.adapter\n await adapter?.delete(row.fileId).catch(() => {})\n await deleteFileMetaRow(db, row.fileId)\n }\n return rows.length\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"thumbnails.js","sourceRoot":"","sources":["../../src/storage/thumbnails.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thumbnails.js","sourceRoot":"","sources":["../../src/storage/thumbnails.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\n\nexport interface TransformSpec {\n w?: number\n h?: number\n fit?: 'fill' | 'inside'\n format?: 'webp' | 'jpeg' | 'png' | 'avif'\n quality?: number\n}\n\n/**\n * `Bun.Image` is newer than some `bun-types` releases, and this file is shipped\n * as source — typing it against the ambient `Bun` namespace turns a consumer's\n * older types into a compile error in their build. Declaring the slice we use\n * keeps this file compiling on any `bun-types`, and the runtime check reports a\n * too-old Bun instead of `undefined is not a constructor`.\n */\ninterface BunImage {\n resize(\n width: number,\n height?: number,\n options?: { fit?: 'fill' | 'inside' },\n ): BunImage\n webp(options?: { quality?: number }): { buffer(): Promise<Buffer> }\n jpeg(options?: { quality?: number }): { buffer(): Promise<Buffer> }\n png(): { buffer(): Promise<Buffer> }\n avif(options?: { quality?: number }): { buffer(): Promise<Buffer> }\n}\n\ntype BunImageConstructor = new (input: Buffer) => BunImage\n\nfunction imageConstructor(): BunImageConstructor {\n const ctor = (Bun as unknown as { Image?: BunImageConstructor }).Image\n if (!ctor) {\n throw new Error(\n '[bunderstack] image transforms need Bun.Image — upgrade Bun (>= 1.3) or request the original file without transform params',\n )\n }\n return ctor\n}\n\nexport async function transformImage(\n input: Buffer,\n spec: TransformSpec,\n): Promise<Buffer> {\n const Image = imageConstructor()\n let img = new Image(input)\n\n if (spec.w !== undefined && spec.h !== undefined) {\n img = img.resize(spec.w, spec.h, { fit: spec.fit ?? 'fill' })\n } else if (spec.w !== undefined) {\n img = img.resize(spec.w)\n } else if (spec.h !== undefined) {\n img = img.resize(0, spec.h)\n }\n\n const q = spec.quality\n switch (spec.format) {\n case 'webp':\n return img.webp({ quality: q }).buffer()\n case 'png':\n return img.png().buffer()\n case 'avif':\n return img.avif({ quality: q }).buffer()\n default:\n return img.jpeg({ quality: q }).buffer()\n }\n}\n\nexport function transformHash(spec: TransformSpec): string {\n return createHash('sha256')\n .update(JSON.stringify(spec))\n .digest('hex')\n .slice(0, 16)\n}\n\nexport function parseTransformSpec(\n query: Record<string, string>,\n): TransformSpec | null {\n const { w, h, fit, format, quality } = query\n if (!w && !h && !fit && !format && !quality) return null\n\n const spec: TransformSpec = {}\n if (w) spec.w = Number(w)\n if (h) spec.h = Number(h)\n if (fit === 'fill' || fit === 'inside') spec.fit = fit\n if (\n format === 'webp' ||\n format === 'jpeg' ||\n format === 'png' ||\n format === 'avif'\n ) {\n spec.format = format\n }\n if (quality) spec.quality = Math.min(100, Math.max(1, Number(quality)))\n return spec\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAYhE;;GAEG;AACH,MAAM,UAAU,eAAe,CAG7B,GAAuB,EACvB,QAGS;IAET,MAAM,IAAI,GAAG,GAAG,CAAC,IAA0C,CAAA;IAC3D,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAEA,CAAA;IACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAYhE;;GAEG;AACH,MAAM,UAAU,eAAe,CAG7B,GAAuB,EACvB,QAGS;IAET,MAAM,IAAI,GAAG,GAAG,CAAC,IAA0C,CAAA;IAC3D,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAEA,CAAA;IACxB,CAAC;AACH,CAAC","sourcesContent":["// src/testing.ts — test utilities for Bunderstack applications.\n\nexport type AuthSessionResolverLike = {\n api: {\n getSession: (opts: { headers: Headers }) => Promise<unknown>\n }\n}\n\nexport type BunderstackAppLike = {\n auth: unknown\n}\n\n/**\n * Mock the auth session resolver on a Bunderstack app instance for unit testing.\n */\nexport function mockAuthSession<\n TUser extends { id: string; email: string; name?: string; role?: string },\n>(\n app: BunderstackAppLike,\n resolver: (opts: { headers: Headers }) => Promise<{\n user: TUser\n session?: { activeOrganizationId?: string | null } | null\n } | null>,\n): void {\n const auth = app.auth as unknown as AuthSessionResolverLike\n if (auth?.api) {\n auth.api.getSession = resolver as unknown as (opts: {\n headers: Headers\n }) => Promise<unknown>\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"typeid-pg.js","sourceRoot":"","sources":["../src/typeid-pg.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,+CAA+C;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,EAAE,aAAa,EAAe,MAAM,UAAU,CAAA;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAmB,MAAS;IAChD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAA;IACvD,OAAO,UAAU,CAA0C;QACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;KACvB,CAAC,EAAE,CAAA;AACN,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"typeid-pg.js","sourceRoot":"","sources":["../src/typeid-pg.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,+CAA+C;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,EAAE,aAAa,EAAe,MAAM,UAAU,CAAA;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAmB,MAAS;IAChD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAA;IACvD,OAAO,UAAU,CAA0C;QACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;KACvB,CAAC,EAAE,CAAA;AACN,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA","sourcesContent":["// src/typeid-pg.ts — Postgres twin of the typeid column builder. The codec\n// (generate/parse/encode/decode) is dialect-neutral and lives in ./typeid;\n// only the drizzle customType wrapper differs.\nimport { customType } from 'drizzle-orm/pg-core'\n\nimport { isValidPrefix, type TypeId } from './typeid'\n\n/**\n * Drizzle column builder for a branded TypeID text value (Postgres). Stores a\n * plain `text` column so drizzle-kit migrations and `$inferSelect` work\n * unchanged.\n *\n * id: typeid('post').primaryKey().$defaultFn(() => generate('post'))\n */\nexport function typeid<P extends string>(prefix: P) {\n if (!isValidPrefix(prefix))\n throw new Error(`Invalid typeid prefix: \"${prefix}\"`)\n return customType<{ data: TypeId<P>; driverData: string }>({\n dataType: () => 'text',\n })()\n}\n\nexport { generate, parse, asTypeId, encode, decode } from './typeid'\nexport type { TypeId } from './typeid'\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"typeid.js","sourceRoot":"","sources":["../src/typeid.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,EAAE;AACF,gFAAgF;AAChF,mFAAmF;AACnF,iFAAiF;AACjF,iFAAiF;AACjF,oDAAoD;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,uFAAuF;AACvF,MAAM,QAAQ,GAAG,kCAAkC,CAAA;AAEnD,uFAAuF;AACvF,MAAM,SAAS,GAAG,6BAA6B,CAAA;AAC/C,2CAA2C;AAC3C,MAAM,SAAS,GAAG,0BAA0B,CAAA;AAO5C,iEAAiE;AACjE,MAAM,UAAU,MAAM,CAAC,KAAiB;IACtC,6DAA6D;IAC7D,IAAI,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,CAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,EAAE,CAAE,CAAA;IAC/D,uDAAuD;IACvD,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;IAClE,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC7B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,MAAM,CAAC,MAAc;IACnC,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAE,CAAA;IACrD,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAE,CAAC,CAAA;IACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QACzB,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;IACxD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,KAAiB;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9E,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAA;AAC5G,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,QAAQ,CAAmB,MAAS;IAClD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IACxC,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAe,CAAA;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CACnB,EAAU,EACV,cAAkB;IAElB,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,GAAG,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;IAChC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;IACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;IACrD,IAAI,cAAc,KAAK,SAAS,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,2BAA2B,cAAc,cAAc,MAAM,GAAG,CACjE,CAAA;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAmB,MAAS,EAAE,GAAW;IAC/D,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAClB,OAAO,GAAgB,CAAA;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAmB,MAAS;IAChD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAA;IACvD,OAAO,UAAU,CAA0C;QACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;KACvB,CAAC,EAAE,CAAA;AACN,CAAC"}
1
+ {"version":3,"file":"typeid.js","sourceRoot":"","sources":["../src/typeid.ts"],"names":[],"mappings":"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","sourcesContent":["// src/typeid.ts\n//\n// Zero-dependency TypeID implementation (https://github.com/jetify-com/typeid).\n// Stripe-style prefixed, k-sortable identifiers: `prefix_<26-char base32 UUIDv7>`.\n// The only runtime primitive we need is the raw UUIDv7 bytes, which Bun gives us\n// natively via `Bun.randomUUIDv7(\"buffer\")` — so we don't pull in the `uuid` dep\n// that the reference `typeid-js` package relies on.\n\nimport { customType } from 'drizzle-orm/sqlite-core'\n\n// Crockford base32 alphabet (lowercase, excludes i/l/o/u), as used by the TypeID spec.\nconst ALPHABET = '0123456789abcdefghjkmnpqrstvwxyz'\n\n// Spec prefix rules: lowercase ascii, underscores allowed only internally, 1–63 chars.\nconst PREFIX_RE = /^[a-z]([a-z_]{0,61}[a-z])?$/\n// 26 base32 chars from the alphabet above.\nconst SUFFIX_RE = /^[0-9a-hjkmnp-tv-z]{26}$/\n\ndeclare const typeIdBrand: unique symbol\n\n/** A branded TypeID string. `TypeId<'post'>` is incompatible with `TypeId<'user'>`. */\nexport type TypeId<P extends string> = string & { readonly [typeIdBrand]?: P }\n\n/** Encode a 16-byte UUID into the 26-character base32 suffix. */\nexport function encode(bytes: Uint8Array): string {\n // First two chars cover byte 0: top 3 bits, then low 5 bits.\n let out = ALPHABET[bytes[0]! >> 5]! + ALPHABET[bytes[0]! & 31]!\n // Remaining 15 bytes (120 bits) → 24 groups of 5 bits.\n let buf = 0n\n for (let i = 1; i < 16; i++) buf = (buf << 8n) | BigInt(bytes[i]!)\n const chars: string[] = []\n for (let i = 0; i < 24; i++) {\n chars.push(ALPHABET[Number((buf >> (BigInt(23 - i) * 5n)) & 31n)]!)\n }\n return out + chars.join('')\n}\n\n/** Decode a 26-character base32 suffix back into the original 16 UUID bytes. */\nexport function decode(suffix: string): Uint8Array {\n const map: Record<string, number> = {}\n for (let i = 0; i < ALPHABET.length; i++) map[ALPHABET[i]!] = i\n const bytes = new Uint8Array(16)\n bytes[0] = (map[suffix[0]!]! << 5) | map[suffix[1]!]!\n let buf = 0n\n for (let i = 2; i < 26; i++) buf = (buf << 5n) | BigInt(map[suffix[i]!]!)\n for (let i = 0; i < 15; i++)\n bytes[15 - i] = Number((buf >> BigInt(i * 8)) & 0xffn)\n return bytes\n}\n\n/** Whether a string is a valid, non-empty TypeID prefix. */\nexport function isValidPrefix(prefix: string): boolean {\n return PREFIX_RE.test(prefix)\n}\n\nfunction bytesToUuid(bytes: Uint8Array): string {\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`\n}\n\n/** Generate a new, branded TypeID for the given prefix. */\nexport function generate<P extends string>(prefix: P): TypeId<P> {\n if (!isValidPrefix(prefix))\n throw new Error(`Invalid typeid prefix: \"${prefix}\"`)\n const bytes = Bun.randomUUIDv7('buffer')\n return `${prefix}_${encode(bytes)}` as TypeId<P>\n}\n\n/**\n * Parse a TypeID into its parts and the decoded UUID. Throws if the id is\n * malformed or — when `expectedPrefix` is given — if the prefix does not match.\n */\nexport function parse<P extends string>(\n id: string,\n expectedPrefix?: P,\n): { prefix: string; suffix: string; uuid: string } {\n const sep = id.lastIndexOf('_')\n if (sep <= 0) throw new Error(`Malformed typeid: \"${id}\"`)\n const prefix = id.slice(0, sep)\n const suffix = id.slice(sep + 1)\n if (!isValidPrefix(prefix))\n throw new Error(`Malformed typeid prefix: \"${id}\"`)\n if (!SUFFIX_RE.test(suffix))\n throw new Error(`Malformed typeid suffix: \"${id}\"`)\n if (expectedPrefix !== undefined && prefix !== expectedPrefix) {\n throw new Error(\n `Expected typeid prefix \"${expectedPrefix}\" but got \"${prefix}\"`,\n )\n }\n return { prefix, suffix, uuid: bytesToUuid(decode(suffix)) }\n}\n\n/**\n * Escape hatch: validate a raw string against a prefix and brand it as a TypeID.\n * Use at trust boundaries (e.g. a raw URL param) where the string isn't yet typed.\n */\nexport function asTypeId<P extends string>(prefix: P, raw: string): TypeId<P> {\n parse(raw, prefix)\n return raw as TypeId<P>\n}\n\n/**\n * Drizzle column builder for a branded TypeID text value. Stores a plain `text`\n * column so drizzle-kit migrations and `$inferSelect` work unchanged.\n *\n * Use Drizzle's `$defaultFn` when a column should generate IDs on insert:\n *\n * id: typeid('post').primaryKey().$defaultFn(() => generate('post'))\n */\nexport function typeid<P extends string>(prefix: P) {\n if (!isValidPrefix(prefix))\n throw new Error(`Invalid typeid prefix: \"${prefix}\"`)\n return customType<{ data: TypeId<P>; driverData: string }>({\n dataType: () => 'text',\n })()\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunderstack",
3
- "version": "0.19.0",
3
+ "version": "0.19.1",
4
4
  "description": "Batteries-included backend framework for Bun: type-safe oRPC APIs, auth, storage, realtime, jobs, email, and validated env from one config.",
5
5
  "keywords": [
6
6
  "backend",