@thewhateverapp/platform 0.0.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 (122) hide show
  1. package/README.md +223 -0
  2. package/dist/ai/mock.d.ts +14 -0
  3. package/dist/ai/mock.d.ts.map +1 -0
  4. package/dist/ai/mock.js +38 -0
  5. package/dist/ai/mock.js.map +1 -0
  6. package/dist/ai/production.d.ts +17 -0
  7. package/dist/ai/production.d.ts.map +1 -0
  8. package/dist/ai/production.js +41 -0
  9. package/dist/ai/production.js.map +1 -0
  10. package/dist/analytics/client.d.ts +21 -0
  11. package/dist/analytics/client.d.ts.map +1 -0
  12. package/dist/analytics/client.js +60 -0
  13. package/dist/analytics/client.js.map +1 -0
  14. package/dist/assets/client.d.ts +23 -0
  15. package/dist/assets/client.d.ts.map +1 -0
  16. package/dist/assets/client.js +105 -0
  17. package/dist/assets/client.js.map +1 -0
  18. package/dist/auth/client.d.ts +20 -0
  19. package/dist/auth/client.d.ts.map +1 -0
  20. package/dist/auth/client.js +53 -0
  21. package/dist/auth/client.js.map +1 -0
  22. package/dist/auth/types.d.ts +50 -0
  23. package/dist/auth/types.d.ts.map +1 -0
  24. package/dist/auth/types.js +5 -0
  25. package/dist/auth/types.js.map +1 -0
  26. package/dist/db/mock.d.ts +43 -0
  27. package/dist/db/mock.d.ts.map +1 -0
  28. package/dist/db/mock.js +343 -0
  29. package/dist/db/mock.js.map +1 -0
  30. package/dist/db/production.d.ts +16 -0
  31. package/dist/db/production.d.ts.map +1 -0
  32. package/dist/db/production.js +77 -0
  33. package/dist/db/production.js.map +1 -0
  34. package/dist/edge/database/index.d.ts +46 -0
  35. package/dist/edge/database/index.d.ts.map +1 -0
  36. package/dist/edge/database/index.js +82 -0
  37. package/dist/edge/database/index.js.map +1 -0
  38. package/dist/edge/database/providers/flex-db.d.ts +22 -0
  39. package/dist/edge/database/providers/flex-db.d.ts.map +1 -0
  40. package/dist/edge/database/providers/flex-db.js +351 -0
  41. package/dist/edge/database/providers/flex-db.js.map +1 -0
  42. package/dist/edge/database/providers/index.d.ts +7 -0
  43. package/dist/edge/database/providers/index.d.ts.map +1 -0
  44. package/dist/edge/database/providers/index.js +11 -0
  45. package/dist/edge/database/providers/index.js.map +1 -0
  46. package/dist/edge/database/types.d.ts +148 -0
  47. package/dist/edge/database/types.d.ts.map +1 -0
  48. package/dist/edge/database/types.js +8 -0
  49. package/dist/edge/database/types.js.map +1 -0
  50. package/dist/edge/index.d.ts +12 -0
  51. package/dist/edge/index.d.ts.map +1 -0
  52. package/dist/edge/index.js +12 -0
  53. package/dist/edge/index.js.map +1 -0
  54. package/dist/edge/kv/index.d.ts +50 -0
  55. package/dist/edge/kv/index.d.ts.map +1 -0
  56. package/dist/edge/kv/index.js +83 -0
  57. package/dist/edge/kv/index.js.map +1 -0
  58. package/dist/edge/kv/providers/cloudflare-kv.d.ts +31 -0
  59. package/dist/edge/kv/providers/cloudflare-kv.d.ts.map +1 -0
  60. package/dist/edge/kv/providers/cloudflare-kv.js +115 -0
  61. package/dist/edge/kv/providers/cloudflare-kv.js.map +1 -0
  62. package/dist/edge/kv/providers/index.d.ts +7 -0
  63. package/dist/edge/kv/providers/index.d.ts.map +1 -0
  64. package/dist/edge/kv/providers/index.js +10 -0
  65. package/dist/edge/kv/providers/index.js.map +1 -0
  66. package/dist/edge/kv/types.d.ts +155 -0
  67. package/dist/edge/kv/types.d.ts.map +1 -0
  68. package/dist/edge/kv/types.js +8 -0
  69. package/dist/edge/kv/types.js.map +1 -0
  70. package/dist/edge/storage/index.d.ts +50 -0
  71. package/dist/edge/storage/index.d.ts.map +1 -0
  72. package/dist/edge/storage/index.js +83 -0
  73. package/dist/edge/storage/index.js.map +1 -0
  74. package/dist/edge/storage/providers/cloudflare-r2.d.ts +28 -0
  75. package/dist/edge/storage/providers/cloudflare-r2.d.ts.map +1 -0
  76. package/dist/edge/storage/providers/cloudflare-r2.js +178 -0
  77. package/dist/edge/storage/providers/cloudflare-r2.js.map +1 -0
  78. package/dist/edge/storage/providers/index.d.ts +7 -0
  79. package/dist/edge/storage/providers/index.d.ts.map +1 -0
  80. package/dist/edge/storage/providers/index.js +10 -0
  81. package/dist/edge/storage/providers/index.js.map +1 -0
  82. package/dist/edge/storage/types.d.ts +305 -0
  83. package/dist/edge/storage/types.d.ts.map +1 -0
  84. package/dist/edge/storage/types.js +8 -0
  85. package/dist/edge/storage/types.js.map +1 -0
  86. package/dist/identity/client.d.ts +20 -0
  87. package/dist/identity/client.d.ts.map +1 -0
  88. package/dist/identity/client.js +40 -0
  89. package/dist/identity/client.js.map +1 -0
  90. package/dist/index.d.ts +21 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +25 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/notifications/client.d.ts +20 -0
  95. package/dist/notifications/client.d.ts.map +1 -0
  96. package/dist/notifications/client.js +38 -0
  97. package/dist/notifications/client.js.map +1 -0
  98. package/dist/payments/client.d.ts +21 -0
  99. package/dist/payments/client.d.ts.map +1 -0
  100. package/dist/payments/client.js +52 -0
  101. package/dist/payments/client.js.map +1 -0
  102. package/dist/platform.d.ts +65 -0
  103. package/dist/platform.d.ts.map +1 -0
  104. package/dist/platform.js +254 -0
  105. package/dist/platform.js.map +1 -0
  106. package/dist/social/client.d.ts +29 -0
  107. package/dist/social/client.d.ts.map +1 -0
  108. package/dist/social/client.js +83 -0
  109. package/dist/social/client.js.map +1 -0
  110. package/dist/storage/mock.d.ts +27 -0
  111. package/dist/storage/mock.d.ts.map +1 -0
  112. package/dist/storage/mock.js +102 -0
  113. package/dist/storage/mock.js.map +1 -0
  114. package/dist/storage/production.d.ts +28 -0
  115. package/dist/storage/production.d.ts.map +1 -0
  116. package/dist/storage/production.js +75 -0
  117. package/dist/storage/production.js.map +1 -0
  118. package/dist/types.d.ts +399 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +5 -0
  121. package/dist/types.js.map +1 -0
  122. package/package.json +51 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Edge Object Storage API
3
+ *
4
+ * Provides an S3-like object storage interface for user-generated apps.
5
+ * Automatically selects the appropriate provider based on environment configuration.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { getStorage } from '@thewhateverapp/platform/edge';
10
+ *
11
+ * export async function POST(req: NextRequest) {
12
+ * const storage = await getStorage(req);
13
+ *
14
+ * // Upload a file
15
+ * const file = await req.formData().get('file') as File;
16
+ * const result = await storage.put(`uploads/${file.name}`, file, {
17
+ * contentType: file.type
18
+ * });
19
+ *
20
+ * return NextResponse.json({ url: result.url });
21
+ * }
22
+ * ```
23
+ */
24
+ import { CloudflareR2 } from './providers';
25
+ /**
26
+ * Get a storage instance for the current request
27
+ *
28
+ * Automatically selects the appropriate provider based on environment:
29
+ * - 'r2' (default): Cloudflare R2
30
+ * - 's3': AWS S3
31
+ * - 'backblaze': Backblaze B2
32
+ *
33
+ * @param req - NextRequest or object with env property
34
+ * @returns Storage provider instance
35
+ */
36
+ export async function getStorage(req) {
37
+ const env = 'env' in req ? req.env : req.env;
38
+ if (!env) {
39
+ throw new Error('No environment found in request. Ensure you are running in edge runtime.');
40
+ }
41
+ // Check for R2 binding
42
+ if (!env.STORAGE) {
43
+ throw new Error('No R2 bucket binding found. Add an R2 bucket binding named "STORAGE" to your wrangler.jsonc');
44
+ }
45
+ // Get provider from environment (defaults to 'r2')
46
+ const provider = env.STORAGE_PROVIDER || 'r2';
47
+ switch (provider) {
48
+ case 'r2':
49
+ return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
50
+ case 's3':
51
+ // Future: AWS S3 implementation
52
+ throw new Error('AWS S3 provider not yet implemented. Use STORAGE_PROVIDER=r2 or remove STORAGE_PROVIDER.');
53
+ case 'backblaze':
54
+ // Future: Backblaze B2 implementation
55
+ throw new Error('Backblaze B2 provider not yet implemented. Use STORAGE_PROVIDER=r2 or remove STORAGE_PROVIDER.');
56
+ default:
57
+ console.warn(`Unknown STORAGE_PROVIDER: ${provider}. Falling back to Cloudflare R2.`);
58
+ return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
59
+ }
60
+ }
61
+ /**
62
+ * Create a storage instance directly (for advanced usage)
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const storage = createStorage({ STORAGE: env.STORAGE });
67
+ * await storage.put('file.txt', 'Hello World');
68
+ * ```
69
+ */
70
+ export function createStorage(env) {
71
+ if (!env.STORAGE) {
72
+ throw new Error('No R2 bucket binding found.');
73
+ }
74
+ const provider = env.STORAGE_PROVIDER || 'r2';
75
+ switch (provider) {
76
+ case 'r2':
77
+ return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
78
+ default:
79
+ console.warn(`Unknown STORAGE_PROVIDER: ${provider}. Falling back to Cloudflare R2.`);
80
+ return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
81
+ }
82
+ }
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/edge/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAmD;IAEnD,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAW,CAAC,GAAG,CAAC;IAEtD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAE9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAE/D,KAAK,IAAI;YACP,gCAAgC;YAChC,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;QAEJ,KAAK,WAAW;YACd,sCAAsC;YACtC,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;QAEJ;YACE,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,kCAAkC,CAAC,CAAC;YACtF,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,GAAyB;IACrD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAE9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAE/D;YACE,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,kCAAkC,CAAC,CAAC;YACtF,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Cloudflare R2 provider implementation
3
+ *
4
+ * Direct wrapper around Cloudflare R2 with consistent API
5
+ */
6
+ import type { StorageProvider, StorageValue, PutOptions, PutResult, GetOptions, StorageObject, StorageMetadata, ListOptions, ListResult, PublicUrlOptions } from '../types';
7
+ /**
8
+ * Cloudflare R2 implementation
9
+ */
10
+ export declare class CloudflareR2 implements StorageProvider {
11
+ private r2;
12
+ private publicUrl?;
13
+ constructor(r2: R2Bucket, publicUrl?: string | undefined);
14
+ put(key: string, data: StorageValue, options?: PutOptions): Promise<PutResult>;
15
+ get(key: string, options?: GetOptions): Promise<StorageObject | null>;
16
+ delete(key: string): Promise<void>;
17
+ deleteMany(keys: string[]): Promise<void>;
18
+ exists(key: string): Promise<boolean>;
19
+ list(options?: ListOptions): Promise<ListResult>;
20
+ head(key: string): Promise<StorageMetadata | null>;
21
+ getPublicUrl(key: string, options?: PublicUrlOptions): string;
22
+ copy(sourceKey: string, destinationKey: string): Promise<void>;
23
+ /**
24
+ * Parse range string to R2Range object
25
+ */
26
+ private parseRange;
27
+ }
28
+ //# sourceMappingURL=cloudflare-r2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-r2.d.ts","sourceRoot":"","sources":["../../../../src/edge/storage/providers/cloudflare-r2.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,UAAU,EACV,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,qBAAa,YAAa,YAAW,eAAe;IAEhD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS,CAAC;gBADV,EAAE,EAAE,QAAQ,EACZ,SAAS,CAAC,EAAE,MAAM,YAAA;IAGtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IA2B9E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgDrE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAuChD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAkBxD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;IAgBvD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpE;;OAEG;IACH,OAAO,CAAC,UAAU;CAoBnB"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Cloudflare R2 provider implementation
3
+ *
4
+ * Direct wrapper around Cloudflare R2 with consistent API
5
+ */
6
+ /**
7
+ * Cloudflare R2 implementation
8
+ */
9
+ export class CloudflareR2 {
10
+ r2;
11
+ publicUrl;
12
+ constructor(r2, publicUrl) {
13
+ this.r2 = r2;
14
+ this.publicUrl = publicUrl;
15
+ }
16
+ async put(key, data, options) {
17
+ const r2Options = {};
18
+ if (options?.contentType || options?.cacheControl || options?.contentDisposition || options?.contentEncoding) {
19
+ r2Options.httpMetadata = {
20
+ ...(options?.contentType && { contentType: options.contentType }),
21
+ ...(options?.cacheControl && { cacheControl: options.cacheControl }),
22
+ ...(options?.contentDisposition && { contentDisposition: options.contentDisposition }),
23
+ ...(options?.contentEncoding && { contentEncoding: options.contentEncoding }),
24
+ };
25
+ }
26
+ if (options?.metadata) {
27
+ r2Options.customMetadata = options.metadata;
28
+ }
29
+ const result = await this.r2.put(key, data, r2Options);
30
+ return {
31
+ key,
32
+ url: this.getPublicUrl(key),
33
+ size: result ? 0 : 0, // R2 doesn't return size on put
34
+ etag: result?.etag,
35
+ versionId: result?.version,
36
+ };
37
+ }
38
+ async get(key, options) {
39
+ const r2Options = {};
40
+ if (options?.range) {
41
+ r2Options.range = this.parseRange(options.range);
42
+ }
43
+ const object = await this.r2.get(key, r2Options);
44
+ if (!object) {
45
+ return null;
46
+ }
47
+ let body = object.body;
48
+ // Convert body based on requested type
49
+ if (options?.type) {
50
+ switch (options.type) {
51
+ case 'text':
52
+ body = await object.text();
53
+ break;
54
+ case 'json':
55
+ body = await object.json();
56
+ break;
57
+ case 'arrayBuffer':
58
+ body = await object.arrayBuffer();
59
+ break;
60
+ case 'blob':
61
+ body = await object.blob();
62
+ break;
63
+ case 'stream':
64
+ body = object.body;
65
+ break;
66
+ }
67
+ }
68
+ return {
69
+ key: object.key,
70
+ body,
71
+ size: object.size,
72
+ contentType: object.httpMetadata?.contentType,
73
+ etag: object.etag,
74
+ uploaded: object.uploaded,
75
+ metadata: object.customMetadata,
76
+ httpMetadata: object.httpMetadata,
77
+ };
78
+ }
79
+ async delete(key) {
80
+ await this.r2.delete(key);
81
+ }
82
+ async deleteMany(keys) {
83
+ await this.r2.delete(keys);
84
+ }
85
+ async exists(key) {
86
+ const object = await this.r2.head(key);
87
+ return object !== null;
88
+ }
89
+ async list(options) {
90
+ const r2Options = {};
91
+ if (options?.prefix) {
92
+ r2Options.prefix = options.prefix;
93
+ }
94
+ if (options?.limit) {
95
+ r2Options.limit = options.limit;
96
+ }
97
+ if (options?.cursor) {
98
+ r2Options.cursor = options.cursor;
99
+ }
100
+ if (options?.delimiter) {
101
+ r2Options.delimiter = options.delimiter;
102
+ }
103
+ // Note: R2 list doesn't support include parameter in current types
104
+ // Include metadata is always returned if available
105
+ const result = await this.r2.list(r2Options);
106
+ return {
107
+ objects: result.objects.map((obj) => ({
108
+ key: obj.key,
109
+ size: obj.size,
110
+ uploaded: obj.uploaded,
111
+ etag: obj.etag,
112
+ httpMetadata: obj.httpMetadata,
113
+ customMetadata: obj.customMetadata,
114
+ })),
115
+ delimitedPrefixes: result.delimitedPrefixes,
116
+ truncated: result.truncated,
117
+ cursor: !result.truncated ? undefined : undefined, // R2 uses different pagination
118
+ };
119
+ }
120
+ async head(key) {
121
+ const object = await this.r2.head(key);
122
+ if (!object) {
123
+ return null;
124
+ }
125
+ return {
126
+ key: object.key,
127
+ size: object.size,
128
+ contentType: object.httpMetadata?.contentType,
129
+ etag: object.etag,
130
+ uploaded: object.uploaded,
131
+ metadata: object.customMetadata,
132
+ httpMetadata: object.httpMetadata,
133
+ };
134
+ }
135
+ getPublicUrl(key, options) {
136
+ const baseUrl = options?.publicUrl || this.publicUrl;
137
+ if (!baseUrl) {
138
+ // Return a placeholder URL if no public URL is configured
139
+ return `r2://${key}`;
140
+ }
141
+ // Ensure baseUrl doesn't end with /
142
+ const cleanBaseUrl = baseUrl.replace(/\/$/, '');
143
+ // Ensure key doesn't start with /
144
+ const cleanKey = key.replace(/^\//, '');
145
+ return `${cleanBaseUrl}/${cleanKey}`;
146
+ }
147
+ async copy(sourceKey, destinationKey) {
148
+ // R2 doesn't have native copy, so we need to get and put
149
+ const source = await this.r2.get(sourceKey);
150
+ if (!source) {
151
+ throw new Error(`Source object not found: ${sourceKey}`);
152
+ }
153
+ await this.r2.put(destinationKey, source.body, {
154
+ httpMetadata: source.httpMetadata,
155
+ customMetadata: source.customMetadata,
156
+ });
157
+ }
158
+ /**
159
+ * Parse range string to R2Range object
160
+ */
161
+ parseRange(range) {
162
+ // Parse "bytes=start-end" format
163
+ const match = range.match(/bytes=(\d+)-(\d*)/);
164
+ if (!match) {
165
+ throw new Error(`Invalid range format: ${range}`);
166
+ }
167
+ const offset = parseInt(match[1], 10);
168
+ const end = match[2] ? parseInt(match[2], 10) : undefined;
169
+ if (end !== undefined) {
170
+ return {
171
+ offset,
172
+ length: end - offset + 1,
173
+ };
174
+ }
175
+ return { offset };
176
+ }
177
+ }
178
+ //# sourceMappingURL=cloudflare-r2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-r2.js","sourceRoot":"","sources":["../../../../src/edge/storage/providers/cloudflare-r2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Storage provider registry
3
+ *
4
+ * Export all available storage providers
5
+ */
6
+ export { CloudflareR2 } from './cloudflare-r2';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/edge/storage/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Storage provider registry
3
+ *
4
+ * Export all available storage providers
5
+ */
6
+ export { CloudflareR2 } from './cloudflare-r2';
7
+ // Future providers:
8
+ // export { AWSS3 } from './aws-s3';
9
+ // export { BackblazeB2 } from './backblaze-b2';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/edge/storage/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,oBAAoB;AACpB,oCAAoC;AACpC,gDAAgD"}
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Object Storage abstraction types for edge runtime
3
+ *
4
+ * Provides an S3-like object storage interface that can be implemented by various providers
5
+ * (Cloudflare R2, AWS S3, Backblaze B2, etc.) allowing seamless upgrades as apps scale.
6
+ */
7
+ /**
8
+ * Main storage provider interface
9
+ */
10
+ export interface StorageProvider {
11
+ /**
12
+ * Upload an object
13
+ * @param key - The object key (path)
14
+ * @param data - The data to upload
15
+ * @param options - Upload options
16
+ */
17
+ put(key: string, data: StorageValue, options?: PutOptions): Promise<PutResult>;
18
+ /**
19
+ * Get an object
20
+ * @param key - The object key (path)
21
+ * @param options - Get options
22
+ */
23
+ get(key: string, options?: GetOptions): Promise<StorageObject | null>;
24
+ /**
25
+ * Delete an object
26
+ * @param key - The object key (path)
27
+ */
28
+ delete(key: string): Promise<void>;
29
+ /**
30
+ * Delete multiple objects
31
+ * @param keys - Array of object keys to delete
32
+ */
33
+ deleteMany(keys: string[]): Promise<void>;
34
+ /**
35
+ * Check if an object exists
36
+ * @param key - The object key (path)
37
+ */
38
+ exists(key: string): Promise<boolean>;
39
+ /**
40
+ * List objects
41
+ * @param options - List options (prefix, limit, cursor)
42
+ */
43
+ list(options?: ListOptions): Promise<ListResult>;
44
+ /**
45
+ * Get object metadata without retrieving the object body
46
+ * @param key - The object key (path)
47
+ */
48
+ head(key: string): Promise<StorageMetadata | null>;
49
+ /**
50
+ * Get a public URL for an object
51
+ * @param key - The object key (path)
52
+ * @param options - URL options (expiration, etc.)
53
+ */
54
+ getPublicUrl(key: string, options?: PublicUrlOptions): string;
55
+ /**
56
+ * Get a signed URL for temporary access
57
+ * @param key - The object key (path)
58
+ * @param options - Signed URL options
59
+ */
60
+ getSignedUrl?(key: string, options?: SignedUrlOptions): Promise<string>;
61
+ /**
62
+ * Copy an object
63
+ * @param sourceKey - Source object key
64
+ * @param destinationKey - Destination object key
65
+ */
66
+ copy?(sourceKey: string, destinationKey: string): Promise<void>;
67
+ }
68
+ /**
69
+ * Values that can be stored
70
+ */
71
+ export type StorageValue = string | ReadableStream | ArrayBuffer | Blob | Uint8Array;
72
+ /**
73
+ * Options for putting objects
74
+ */
75
+ export interface PutOptions {
76
+ /**
77
+ * Content type (MIME type)
78
+ */
79
+ contentType?: string;
80
+ /**
81
+ * Cache control header
82
+ */
83
+ cacheControl?: string;
84
+ /**
85
+ * Content disposition header
86
+ */
87
+ contentDisposition?: string;
88
+ /**
89
+ * Content encoding header
90
+ */
91
+ contentEncoding?: string;
92
+ /**
93
+ * Custom metadata
94
+ */
95
+ metadata?: Record<string, string>;
96
+ /**
97
+ * HTTP headers to set
98
+ */
99
+ customMetadata?: Record<string, string>;
100
+ }
101
+ /**
102
+ * Result from putting an object
103
+ */
104
+ export interface PutResult {
105
+ /**
106
+ * The object key
107
+ */
108
+ key: string;
109
+ /**
110
+ * Public URL (if available)
111
+ */
112
+ url?: string;
113
+ /**
114
+ * Size in bytes
115
+ */
116
+ size: number;
117
+ /**
118
+ * ETag
119
+ */
120
+ etag?: string;
121
+ /**
122
+ * Version ID (if versioning enabled)
123
+ */
124
+ versionId?: string;
125
+ }
126
+ /**
127
+ * Options for getting objects
128
+ */
129
+ export interface GetOptions {
130
+ /**
131
+ * Get object as specific type
132
+ */
133
+ type?: 'text' | 'json' | 'arrayBuffer' | 'blob' | 'stream';
134
+ /**
135
+ * Byte range to retrieve (e.g., "bytes=0-1023")
136
+ */
137
+ range?: string;
138
+ }
139
+ /**
140
+ * Object retrieved from storage
141
+ */
142
+ export interface StorageObject {
143
+ /**
144
+ * The object key
145
+ */
146
+ key: string;
147
+ /**
148
+ * The object body
149
+ */
150
+ body: ReadableStream | string | ArrayBuffer | Blob | any;
151
+ /**
152
+ * Size in bytes
153
+ */
154
+ size: number;
155
+ /**
156
+ * Content type
157
+ */
158
+ contentType?: string;
159
+ /**
160
+ * ETag
161
+ */
162
+ etag?: string;
163
+ /**
164
+ * Last modified timestamp
165
+ */
166
+ uploaded: Date;
167
+ /**
168
+ * Custom metadata
169
+ */
170
+ metadata?: Record<string, string>;
171
+ /**
172
+ * HTTP headers
173
+ */
174
+ httpMetadata?: Record<string, string>;
175
+ }
176
+ /**
177
+ * Object metadata (from HEAD request)
178
+ */
179
+ export interface StorageMetadata {
180
+ /**
181
+ * The object key
182
+ */
183
+ key: string;
184
+ /**
185
+ * Size in bytes
186
+ */
187
+ size: number;
188
+ /**
189
+ * Content type
190
+ */
191
+ contentType?: string;
192
+ /**
193
+ * ETag
194
+ */
195
+ etag?: string;
196
+ /**
197
+ * Last modified timestamp
198
+ */
199
+ uploaded: Date;
200
+ /**
201
+ * Custom metadata
202
+ */
203
+ metadata?: Record<string, string>;
204
+ /**
205
+ * HTTP headers
206
+ */
207
+ httpMetadata?: Record<string, string>;
208
+ }
209
+ /**
210
+ * Options for listing objects
211
+ */
212
+ export interface ListOptions {
213
+ /**
214
+ * Filter objects by prefix
215
+ */
216
+ prefix?: string;
217
+ /**
218
+ * Maximum number of objects to return
219
+ */
220
+ limit?: number;
221
+ /**
222
+ * Cursor for pagination
223
+ */
224
+ cursor?: string;
225
+ /**
226
+ * Delimiter for grouping (e.g., '/')
227
+ */
228
+ delimiter?: string;
229
+ /**
230
+ * Include metadata in results
231
+ */
232
+ include?: Array<'httpMetadata' | 'customMetadata'>;
233
+ }
234
+ /**
235
+ * Result from listing objects
236
+ */
237
+ export interface ListResult {
238
+ /**
239
+ * Array of objects
240
+ */
241
+ objects: Array<{
242
+ key: string;
243
+ size: number;
244
+ uploaded: Date;
245
+ etag?: string;
246
+ httpMetadata?: Record<string, string>;
247
+ customMetadata?: Record<string, string>;
248
+ }>;
249
+ /**
250
+ * Common prefixes (if delimiter used)
251
+ */
252
+ delimitedPrefixes?: string[];
253
+ /**
254
+ * Whether the list is truncated
255
+ */
256
+ truncated: boolean;
257
+ /**
258
+ * Cursor for next page
259
+ */
260
+ cursor?: string;
261
+ }
262
+ /**
263
+ * Options for generating public URLs
264
+ */
265
+ export interface PublicUrlOptions {
266
+ /**
267
+ * Public bucket URL (if using custom domain)
268
+ */
269
+ publicUrl?: string;
270
+ }
271
+ /**
272
+ * Options for generating signed URLs
273
+ */
274
+ export interface SignedUrlOptions {
275
+ /**
276
+ * Expiration time in seconds
277
+ */
278
+ expiresIn: number;
279
+ /**
280
+ * HTTP method (default: 'GET')
281
+ */
282
+ method?: 'GET' | 'PUT' | 'DELETE';
283
+ }
284
+ /**
285
+ * Cloudflare environment interface for R2
286
+ */
287
+ export interface CloudflareStorageEnv {
288
+ STORAGE: R2Bucket;
289
+ STORAGE_PROVIDER?: 'r2' | 's3' | 'backblaze';
290
+ STORAGE_PUBLIC_URL?: string;
291
+ AWS_S3_BUCKET?: string;
292
+ AWS_ACCESS_KEY_ID?: string;
293
+ AWS_SECRET_ACCESS_KEY?: string;
294
+ AWS_REGION?: string;
295
+ BACKBLAZE_BUCKET?: string;
296
+ BACKBLAZE_KEY_ID?: string;
297
+ BACKBLAZE_APPLICATION_KEY?: string;
298
+ }
299
+ /**
300
+ * Request wrapper for NextRequest compatibility
301
+ */
302
+ export interface StorageRequest {
303
+ env: CloudflareStorageEnv;
304
+ }
305
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/edge/storage/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Object Storage abstraction types for edge runtime
3
+ *
4
+ * Provides an S3-like object storage interface that can be implemented by various providers
5
+ * (Cloudflare R2, AWS S3, Backblaze B2, etc.) allowing seamless upgrades as apps scale.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/edge/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Identity service client
3
+ */
4
+ import type { IdentityService, ResolveIdentityRequest, ResolveIdentityResponse, IdentityLink, UserInfo, LookupResult } from '../types';
5
+ interface IdentityConfig {
6
+ apiUrl: string;
7
+ apiKey: string;
8
+ }
9
+ export declare class IdentityAPI implements IdentityService {
10
+ private config;
11
+ constructor(config: IdentityConfig);
12
+ private request;
13
+ resolve(request: ResolveIdentityRequest): Promise<ResolveIdentityResponse>;
14
+ link(userId: string, identity: IdentityLink): Promise<void>;
15
+ unlink(userId: string, provider: string): Promise<void>;
16
+ getUser(userId: string): Promise<UserInfo | null>;
17
+ lookup(identity: IdentityLink): Promise<LookupResult>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=client.d.ts.map