@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.
- package/README.md +223 -0
- package/dist/ai/mock.d.ts +14 -0
- package/dist/ai/mock.d.ts.map +1 -0
- package/dist/ai/mock.js +38 -0
- package/dist/ai/mock.js.map +1 -0
- package/dist/ai/production.d.ts +17 -0
- package/dist/ai/production.d.ts.map +1 -0
- package/dist/ai/production.js +41 -0
- package/dist/ai/production.js.map +1 -0
- package/dist/analytics/client.d.ts +21 -0
- package/dist/analytics/client.d.ts.map +1 -0
- package/dist/analytics/client.js +60 -0
- package/dist/analytics/client.js.map +1 -0
- package/dist/assets/client.d.ts +23 -0
- package/dist/assets/client.d.ts.map +1 -0
- package/dist/assets/client.js +105 -0
- package/dist/assets/client.js.map +1 -0
- package/dist/auth/client.d.ts +20 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +53 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/types.d.ts +50 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +5 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/db/mock.d.ts +43 -0
- package/dist/db/mock.d.ts.map +1 -0
- package/dist/db/mock.js +343 -0
- package/dist/db/mock.js.map +1 -0
- package/dist/db/production.d.ts +16 -0
- package/dist/db/production.d.ts.map +1 -0
- package/dist/db/production.js +77 -0
- package/dist/db/production.js.map +1 -0
- package/dist/edge/database/index.d.ts +46 -0
- package/dist/edge/database/index.d.ts.map +1 -0
- package/dist/edge/database/index.js +82 -0
- package/dist/edge/database/index.js.map +1 -0
- package/dist/edge/database/providers/flex-db.d.ts +22 -0
- package/dist/edge/database/providers/flex-db.d.ts.map +1 -0
- package/dist/edge/database/providers/flex-db.js +351 -0
- package/dist/edge/database/providers/flex-db.js.map +1 -0
- package/dist/edge/database/providers/index.d.ts +7 -0
- package/dist/edge/database/providers/index.d.ts.map +1 -0
- package/dist/edge/database/providers/index.js +11 -0
- package/dist/edge/database/providers/index.js.map +1 -0
- package/dist/edge/database/types.d.ts +148 -0
- package/dist/edge/database/types.d.ts.map +1 -0
- package/dist/edge/database/types.js +8 -0
- package/dist/edge/database/types.js.map +1 -0
- package/dist/edge/index.d.ts +12 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +12 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge/kv/index.d.ts +50 -0
- package/dist/edge/kv/index.d.ts.map +1 -0
- package/dist/edge/kv/index.js +83 -0
- package/dist/edge/kv/index.js.map +1 -0
- package/dist/edge/kv/providers/cloudflare-kv.d.ts +31 -0
- package/dist/edge/kv/providers/cloudflare-kv.d.ts.map +1 -0
- package/dist/edge/kv/providers/cloudflare-kv.js +115 -0
- package/dist/edge/kv/providers/cloudflare-kv.js.map +1 -0
- package/dist/edge/kv/providers/index.d.ts +7 -0
- package/dist/edge/kv/providers/index.d.ts.map +1 -0
- package/dist/edge/kv/providers/index.js +10 -0
- package/dist/edge/kv/providers/index.js.map +1 -0
- package/dist/edge/kv/types.d.ts +155 -0
- package/dist/edge/kv/types.d.ts.map +1 -0
- package/dist/edge/kv/types.js +8 -0
- package/dist/edge/kv/types.js.map +1 -0
- package/dist/edge/storage/index.d.ts +50 -0
- package/dist/edge/storage/index.d.ts.map +1 -0
- package/dist/edge/storage/index.js +83 -0
- package/dist/edge/storage/index.js.map +1 -0
- package/dist/edge/storage/providers/cloudflare-r2.d.ts +28 -0
- package/dist/edge/storage/providers/cloudflare-r2.d.ts.map +1 -0
- package/dist/edge/storage/providers/cloudflare-r2.js +178 -0
- package/dist/edge/storage/providers/cloudflare-r2.js.map +1 -0
- package/dist/edge/storage/providers/index.d.ts +7 -0
- package/dist/edge/storage/providers/index.d.ts.map +1 -0
- package/dist/edge/storage/providers/index.js +10 -0
- package/dist/edge/storage/providers/index.js.map +1 -0
- package/dist/edge/storage/types.d.ts +305 -0
- package/dist/edge/storage/types.d.ts.map +1 -0
- package/dist/edge/storage/types.js +8 -0
- package/dist/edge/storage/types.js.map +1 -0
- package/dist/identity/client.d.ts +20 -0
- package/dist/identity/client.d.ts.map +1 -0
- package/dist/identity/client.js +40 -0
- package/dist/identity/client.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/client.d.ts +20 -0
- package/dist/notifications/client.d.ts.map +1 -0
- package/dist/notifications/client.js +38 -0
- package/dist/notifications/client.js.map +1 -0
- package/dist/payments/client.d.ts +21 -0
- package/dist/payments/client.d.ts.map +1 -0
- package/dist/payments/client.js +52 -0
- package/dist/payments/client.js.map +1 -0
- package/dist/platform.d.ts +65 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +254 -0
- package/dist/platform.js.map +1 -0
- package/dist/social/client.d.ts +29 -0
- package/dist/social/client.d.ts.map +1 -0
- package/dist/social/client.js +83 -0
- package/dist/social/client.js.map +1 -0
- package/dist/storage/mock.d.ts +27 -0
- package/dist/storage/mock.d.ts.map +1 -0
- package/dist/storage/mock.js +102 -0
- package/dist/storage/mock.js.map +1 -0
- package/dist/storage/production.d.ts +28 -0
- package/dist/storage/production.d.ts.map +1 -0
- package/dist/storage/production.js +75 -0
- package/dist/storage/production.js.map +1 -0
- package/dist/types.d.ts +399 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database abstraction types for edge runtime
|
|
3
|
+
*
|
|
4
|
+
* Provides a MongoDB-like interface that can be implemented by various providers
|
|
5
|
+
* (FlexDB/D1, Turso, MongoDB Atlas, 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/database/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge runtime exports
|
|
3
|
+
*
|
|
4
|
+
* Services and utilities designed specifically for Cloudflare Workers / Pages edge runtime
|
|
5
|
+
*/
|
|
6
|
+
export { getDatabase, createDatabase } from './database';
|
|
7
|
+
export type * from './database/types';
|
|
8
|
+
export { getKV, createKV } from './kv';
|
|
9
|
+
export type * from './kv/types';
|
|
10
|
+
export { getStorage, createStorage } from './storage';
|
|
11
|
+
export type * from './storage/types';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/edge/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACzD,mBAAmB,kBAAkB,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACvC,mBAAmB,YAAY,CAAC;AAGhC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtD,mBAAmB,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge runtime exports
|
|
3
|
+
*
|
|
4
|
+
* Services and utilities designed specifically for Cloudflare Workers / Pages edge runtime
|
|
5
|
+
*/
|
|
6
|
+
// Database exports
|
|
7
|
+
export { getDatabase, createDatabase } from './database';
|
|
8
|
+
// KV (Key-Value) exports
|
|
9
|
+
export { getKV, createKV } from './kv';
|
|
10
|
+
// Storage (Object Storage / R2) exports
|
|
11
|
+
export { getStorage, createStorage } from './storage';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/edge/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGzD,yBAAyB;AACzB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGvC,wCAAwC;AACxC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge KV (Key-Value) Storage API
|
|
3
|
+
*
|
|
4
|
+
* Provides a simple key-value store interface for user-generated apps.
|
|
5
|
+
* Automatically selects the appropriate provider based on environment configuration.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { getKV } from '@thewhateverapp/platform/edge';
|
|
10
|
+
*
|
|
11
|
+
* export async function GET(req: NextRequest) {
|
|
12
|
+
* const kv = await getKV(req);
|
|
13
|
+
*
|
|
14
|
+
* // Store data
|
|
15
|
+
* await kv.set('user:123', { name: 'Alice', score: 100 });
|
|
16
|
+
*
|
|
17
|
+
* // Retrieve data
|
|
18
|
+
* const user = await kv.get('user:123', 'json');
|
|
19
|
+
*
|
|
20
|
+
* return NextResponse.json(user);
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import type { KVProvider, CloudflareKVEnv, KVRequest } from './types';
|
|
25
|
+
export type * from './types';
|
|
26
|
+
/**
|
|
27
|
+
* Get a KV instance for the current request
|
|
28
|
+
*
|
|
29
|
+
* Automatically selects the appropriate provider based on environment:
|
|
30
|
+
* - 'cloudflare' (default): Cloudflare KV
|
|
31
|
+
* - 'upstash': Upstash Redis
|
|
32
|
+
* - 'vercel': Vercel KV
|
|
33
|
+
*
|
|
34
|
+
* @param req - NextRequest or object with env property
|
|
35
|
+
* @returns KV provider instance
|
|
36
|
+
*/
|
|
37
|
+
export declare function getKV(req: KVRequest | {
|
|
38
|
+
env: CloudflareKVEnv;
|
|
39
|
+
}): Promise<KVProvider>;
|
|
40
|
+
/**
|
|
41
|
+
* Create a KV instance directly (for advanced usage)
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const kv = createKV({ KV: env.KV });
|
|
46
|
+
* await kv.set('key', 'value');
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function createKV(env: CloudflareKVEnv): KVProvider;
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/edge/kv/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAItE,mBAAmB,SAAS,CAAC;AAE7B;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG;IAAE,GAAG,EAAE,eAAe,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAqC1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,UAAU,CAezD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge KV (Key-Value) Storage API
|
|
3
|
+
*
|
|
4
|
+
* Provides a simple key-value store interface for user-generated apps.
|
|
5
|
+
* Automatically selects the appropriate provider based on environment configuration.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { getKV } from '@thewhateverapp/platform/edge';
|
|
10
|
+
*
|
|
11
|
+
* export async function GET(req: NextRequest) {
|
|
12
|
+
* const kv = await getKV(req);
|
|
13
|
+
*
|
|
14
|
+
* // Store data
|
|
15
|
+
* await kv.set('user:123', { name: 'Alice', score: 100 });
|
|
16
|
+
*
|
|
17
|
+
* // Retrieve data
|
|
18
|
+
* const user = await kv.get('user:123', 'json');
|
|
19
|
+
*
|
|
20
|
+
* return NextResponse.json(user);
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import { CloudflareKV } from './providers';
|
|
25
|
+
/**
|
|
26
|
+
* Get a KV instance for the current request
|
|
27
|
+
*
|
|
28
|
+
* Automatically selects the appropriate provider based on environment:
|
|
29
|
+
* - 'cloudflare' (default): Cloudflare KV
|
|
30
|
+
* - 'upstash': Upstash Redis
|
|
31
|
+
* - 'vercel': Vercel KV
|
|
32
|
+
*
|
|
33
|
+
* @param req - NextRequest or object with env property
|
|
34
|
+
* @returns KV provider instance
|
|
35
|
+
*/
|
|
36
|
+
export async function getKV(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 KV binding
|
|
42
|
+
if (!env.KV) {
|
|
43
|
+
throw new Error('No KV namespace binding found. Add a KV namespace binding named "KV" to your wrangler.jsonc');
|
|
44
|
+
}
|
|
45
|
+
// Get provider from environment (defaults to 'cloudflare')
|
|
46
|
+
const provider = env.KV_PROVIDER || 'cloudflare';
|
|
47
|
+
switch (provider) {
|
|
48
|
+
case 'cloudflare':
|
|
49
|
+
return new CloudflareKV(env.KV);
|
|
50
|
+
case 'upstash':
|
|
51
|
+
// Future: Upstash Redis implementation
|
|
52
|
+
throw new Error('Upstash KV provider not yet implemented. Use KV_PROVIDER=cloudflare or remove KV_PROVIDER.');
|
|
53
|
+
case 'vercel':
|
|
54
|
+
// Future: Vercel KV implementation
|
|
55
|
+
throw new Error('Vercel KV provider not yet implemented. Use KV_PROVIDER=cloudflare or remove KV_PROVIDER.');
|
|
56
|
+
default:
|
|
57
|
+
console.warn(`Unknown KV_PROVIDER: ${provider}. Falling back to Cloudflare KV.`);
|
|
58
|
+
return new CloudflareKV(env.KV);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a KV instance directly (for advanced usage)
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const kv = createKV({ KV: env.KV });
|
|
67
|
+
* await kv.set('key', 'value');
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export function createKV(env) {
|
|
71
|
+
if (!env.KV) {
|
|
72
|
+
throw new Error('No KV namespace binding found.');
|
|
73
|
+
}
|
|
74
|
+
const provider = env.KV_PROVIDER || 'cloudflare';
|
|
75
|
+
switch (provider) {
|
|
76
|
+
case 'cloudflare':
|
|
77
|
+
return new CloudflareKV(env.KV);
|
|
78
|
+
default:
|
|
79
|
+
console.warn(`Unknown KV_PROVIDER: ${provider}. Falling back to Cloudflare KV.`);
|
|
80
|
+
return new CloudflareKV(env.KV);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/edge/kv/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAyC;IACnE,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,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,YAAY,CAAC;IAEjD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,YAAY;YACf,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElC,KAAK,SAAS;YACZ,uCAAuC;YACvC,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;QAEJ,KAAK,QAAQ;YACX,mCAAmC;YACnC,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;QAEJ;YACE,OAAO,CAAC,IAAI,CAAC,wBAAwB,QAAQ,kCAAkC,CAAC,CAAC;YACjF,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAoB;IAC3C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,YAAY,CAAC;IAEjD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,YAAY;YACf,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElC;YACE,OAAO,CAAC,IAAI,CAAC,wBAAwB,QAAQ,kCAAkC,CAAC,CAAC;YACjF,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare KV provider implementation
|
|
3
|
+
*
|
|
4
|
+
* Direct wrapper around Cloudflare KV with consistent API
|
|
5
|
+
*/
|
|
6
|
+
import type { KVProvider, KVValue, KVValueType, KVSetOptions, KVListOptions, KVListResult, KVMetadata } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Cloudflare KV implementation
|
|
9
|
+
*/
|
|
10
|
+
export declare class CloudflareKV implements KVProvider {
|
|
11
|
+
private kv;
|
|
12
|
+
constructor(kv: KVNamespace);
|
|
13
|
+
get<T = string>(key: string, type?: KVValueType): Promise<T | null>;
|
|
14
|
+
set(key: string, value: KVValue, options?: KVSetOptions): Promise<void>;
|
|
15
|
+
delete(key: string): Promise<void>;
|
|
16
|
+
deleteMany(keys: string[]): Promise<void>;
|
|
17
|
+
has(key: string): Promise<boolean>;
|
|
18
|
+
list(options?: KVListOptions): Promise<KVListResult>;
|
|
19
|
+
getMetadata(key: string): Promise<KVMetadata | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Increment a numeric value atomically
|
|
22
|
+
* Note: KV doesn't support atomic operations, so this is best-effort
|
|
23
|
+
*/
|
|
24
|
+
increment(key: string, amount?: number): Promise<number>;
|
|
25
|
+
/**
|
|
26
|
+
* Decrement a numeric value atomically
|
|
27
|
+
* Note: KV doesn't support atomic operations, so this is best-effort
|
|
28
|
+
*/
|
|
29
|
+
decrement(key: string, amount?: number): Promise<number>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=cloudflare-kv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-kv.d.ts","sourceRoot":"","sources":["../../../../src/edge/kv/providers/cloudflare-kv.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,OAAO,EACP,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACX,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,qBAAa,YAAa,YAAW,UAAU;IACjC,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,WAAW;IAE7B,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAoB,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAmB3E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BvE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,IAAI,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BpD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAY1D;;;OAGG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjE;;;OAGG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;CAGlE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare KV provider implementation
|
|
3
|
+
*
|
|
4
|
+
* Direct wrapper around Cloudflare KV with consistent API
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Cloudflare KV implementation
|
|
8
|
+
*/
|
|
9
|
+
export class CloudflareKV {
|
|
10
|
+
kv;
|
|
11
|
+
constructor(kv) {
|
|
12
|
+
this.kv = kv;
|
|
13
|
+
}
|
|
14
|
+
async get(key, type = 'text') {
|
|
15
|
+
switch (type) {
|
|
16
|
+
case 'text':
|
|
17
|
+
return (await this.kv.get(key, 'text'));
|
|
18
|
+
case 'json':
|
|
19
|
+
return (await this.kv.get(key, 'json'));
|
|
20
|
+
case 'arrayBuffer':
|
|
21
|
+
return (await this.kv.get(key, 'arrayBuffer'));
|
|
22
|
+
case 'stream':
|
|
23
|
+
return (await this.kv.get(key, 'stream'));
|
|
24
|
+
default:
|
|
25
|
+
return (await this.kv.get(key, 'text'));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async set(key, value, options) {
|
|
29
|
+
const kvOptions = {};
|
|
30
|
+
if (options?.ttl) {
|
|
31
|
+
kvOptions.expirationTtl = options.ttl;
|
|
32
|
+
}
|
|
33
|
+
if (options?.expirationTtl) {
|
|
34
|
+
kvOptions.expiration = options.expirationTtl;
|
|
35
|
+
}
|
|
36
|
+
if (options?.metadata) {
|
|
37
|
+
kvOptions.metadata = options.metadata;
|
|
38
|
+
}
|
|
39
|
+
// Handle different value types
|
|
40
|
+
if (typeof value === 'string') {
|
|
41
|
+
await this.kv.put(key, value, kvOptions);
|
|
42
|
+
}
|
|
43
|
+
else if (value instanceof ReadableStream) {
|
|
44
|
+
await this.kv.put(key, value, kvOptions);
|
|
45
|
+
}
|
|
46
|
+
else if (value instanceof ArrayBuffer) {
|
|
47
|
+
await this.kv.put(key, value, kvOptions);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Object - serialize to JSON
|
|
51
|
+
await this.kv.put(key, JSON.stringify(value), kvOptions);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async delete(key) {
|
|
55
|
+
await this.kv.delete(key);
|
|
56
|
+
}
|
|
57
|
+
async deleteMany(keys) {
|
|
58
|
+
// Cloudflare KV doesn't have batch delete, so delete one by one
|
|
59
|
+
await Promise.all(keys.map((key) => this.kv.delete(key)));
|
|
60
|
+
}
|
|
61
|
+
async has(key) {
|
|
62
|
+
const value = await this.kv.get(key, 'text');
|
|
63
|
+
return value !== null;
|
|
64
|
+
}
|
|
65
|
+
async list(options) {
|
|
66
|
+
const listOptions = {};
|
|
67
|
+
if (options?.prefix) {
|
|
68
|
+
listOptions.prefix = options.prefix;
|
|
69
|
+
}
|
|
70
|
+
if (options?.limit) {
|
|
71
|
+
listOptions.limit = options.limit;
|
|
72
|
+
}
|
|
73
|
+
if (options?.cursor) {
|
|
74
|
+
listOptions.cursor = options.cursor;
|
|
75
|
+
}
|
|
76
|
+
const result = await this.kv.list(listOptions);
|
|
77
|
+
return {
|
|
78
|
+
keys: result.keys.map((key) => ({
|
|
79
|
+
name: key.name,
|
|
80
|
+
expiration: key.expiration,
|
|
81
|
+
metadata: key.metadata,
|
|
82
|
+
})),
|
|
83
|
+
complete: result.list_complete,
|
|
84
|
+
cursor: !result.list_complete && result.keys.length > 0 ? undefined : undefined,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async getMetadata(key) {
|
|
88
|
+
const result = await this.kv.getWithMetadata(key, 'text');
|
|
89
|
+
if (result.value === null) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
metadata: result.metadata,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Increment a numeric value atomically
|
|
98
|
+
* Note: KV doesn't support atomic operations, so this is best-effort
|
|
99
|
+
*/
|
|
100
|
+
async increment(key, amount = 1) {
|
|
101
|
+
const current = await this.get(key, 'text');
|
|
102
|
+
const currentValue = current ? parseInt(current, 10) : 0;
|
|
103
|
+
const newValue = currentValue + amount;
|
|
104
|
+
await this.set(key, String(newValue));
|
|
105
|
+
return newValue;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Decrement a numeric value atomically
|
|
109
|
+
* Note: KV doesn't support atomic operations, so this is best-effort
|
|
110
|
+
*/
|
|
111
|
+
async decrement(key, amount = 1) {
|
|
112
|
+
return this.increment(key, -amount);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=cloudflare-kv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-kv.js","sourceRoot":"","sources":["../../../../src/edge/kv/providers/cloudflare-kv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/edge/kv/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KV provider registry
|
|
3
|
+
*
|
|
4
|
+
* Export all available KV providers
|
|
5
|
+
*/
|
|
6
|
+
export { CloudflareKV } from './cloudflare-kv';
|
|
7
|
+
// Future providers:
|
|
8
|
+
// export { UpstashKV } from './upstash-kv';
|
|
9
|
+
// export { VercelKV } from './vercel-kv';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/edge/kv/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,oBAAoB;AACpB,4CAA4C;AAC5C,0CAA0C"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KV (Key-Value) storage abstraction types for edge runtime
|
|
3
|
+
*
|
|
4
|
+
* Provides a simple key-value store interface that can be implemented by various providers
|
|
5
|
+
* (Cloudflare KV, Upstash Redis, Vercel KV, etc.) allowing seamless upgrades as apps scale.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Main KV provider interface
|
|
9
|
+
*/
|
|
10
|
+
export interface KVProvider {
|
|
11
|
+
/**
|
|
12
|
+
* Get a value by key
|
|
13
|
+
* @param key - The key to retrieve
|
|
14
|
+
* @param type - Optional type hint ('text', 'json', 'arrayBuffer', 'stream')
|
|
15
|
+
*/
|
|
16
|
+
get<T = string>(key: string, type?: KVValueType): Promise<T | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Set a value by key
|
|
19
|
+
* @param key - The key to set
|
|
20
|
+
* @param value - The value to store
|
|
21
|
+
* @param options - Optional storage options (TTL, metadata)
|
|
22
|
+
*/
|
|
23
|
+
set(key: string, value: KVValue, options?: KVSetOptions): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Delete a value by key
|
|
26
|
+
* @param key - The key to delete
|
|
27
|
+
*/
|
|
28
|
+
delete(key: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Delete multiple values by keys
|
|
31
|
+
* @param keys - Array of keys to delete
|
|
32
|
+
*/
|
|
33
|
+
deleteMany(keys: string[]): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if a key exists
|
|
36
|
+
* @param key - The key to check
|
|
37
|
+
*/
|
|
38
|
+
has(key: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* List keys matching a prefix
|
|
41
|
+
* @param options - List options (prefix, limit, cursor)
|
|
42
|
+
*/
|
|
43
|
+
list(options?: KVListOptions): Promise<KVListResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Get metadata for a key without retrieving the value
|
|
46
|
+
* @param key - The key to get metadata for
|
|
47
|
+
*/
|
|
48
|
+
getMetadata(key: string): Promise<KVMetadata | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Increment a numeric value atomically
|
|
51
|
+
* @param key - The key to increment
|
|
52
|
+
* @param amount - Amount to increment by (default: 1)
|
|
53
|
+
*/
|
|
54
|
+
increment?(key: string, amount?: number): Promise<number>;
|
|
55
|
+
/**
|
|
56
|
+
* Decrement a numeric value atomically
|
|
57
|
+
* @param key - The key to decrement
|
|
58
|
+
* @param amount - Amount to decrement by (default: 1)
|
|
59
|
+
*/
|
|
60
|
+
decrement?(key: string, amount?: number): Promise<number>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Value types supported by KV
|
|
64
|
+
*/
|
|
65
|
+
export type KVValueType = 'text' | 'json' | 'arrayBuffer' | 'stream';
|
|
66
|
+
/**
|
|
67
|
+
* Values that can be stored in KV
|
|
68
|
+
*/
|
|
69
|
+
export type KVValue = string | ReadableStream | ArrayBuffer | object;
|
|
70
|
+
/**
|
|
71
|
+
* Options for setting values
|
|
72
|
+
*/
|
|
73
|
+
export interface KVSetOptions {
|
|
74
|
+
/**
|
|
75
|
+
* Time-to-live in seconds (0 = never expire)
|
|
76
|
+
*/
|
|
77
|
+
ttl?: number;
|
|
78
|
+
/**
|
|
79
|
+
* Expiration timestamp (Unix seconds)
|
|
80
|
+
*/
|
|
81
|
+
expirationTtl?: number;
|
|
82
|
+
/**
|
|
83
|
+
* Metadata to attach to the key-value pair
|
|
84
|
+
*/
|
|
85
|
+
metadata?: Record<string, any>;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Options for listing keys
|
|
89
|
+
*/
|
|
90
|
+
export interface KVListOptions {
|
|
91
|
+
/**
|
|
92
|
+
* Filter keys by prefix
|
|
93
|
+
*/
|
|
94
|
+
prefix?: string;
|
|
95
|
+
/**
|
|
96
|
+
* Maximum number of keys to return
|
|
97
|
+
*/
|
|
98
|
+
limit?: number;
|
|
99
|
+
/**
|
|
100
|
+
* Cursor for pagination
|
|
101
|
+
*/
|
|
102
|
+
cursor?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Result from listing keys
|
|
106
|
+
*/
|
|
107
|
+
export interface KVListResult {
|
|
108
|
+
/**
|
|
109
|
+
* Array of keys with optional metadata
|
|
110
|
+
*/
|
|
111
|
+
keys: Array<{
|
|
112
|
+
name: string;
|
|
113
|
+
expiration?: number;
|
|
114
|
+
metadata?: Record<string, any>;
|
|
115
|
+
}>;
|
|
116
|
+
/**
|
|
117
|
+
* Whether the list is complete
|
|
118
|
+
*/
|
|
119
|
+
complete: boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Cursor for next page (if not complete)
|
|
122
|
+
*/
|
|
123
|
+
cursor?: string;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Metadata associated with a key
|
|
127
|
+
*/
|
|
128
|
+
export interface KVMetadata {
|
|
129
|
+
/**
|
|
130
|
+
* Expiration timestamp (Unix seconds)
|
|
131
|
+
*/
|
|
132
|
+
expiration?: number;
|
|
133
|
+
/**
|
|
134
|
+
* Custom metadata
|
|
135
|
+
*/
|
|
136
|
+
metadata?: Record<string, any>;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Cloudflare environment interface for KV
|
|
140
|
+
*/
|
|
141
|
+
export interface CloudflareKVEnv {
|
|
142
|
+
KV: KVNamespace;
|
|
143
|
+
KV_PROVIDER?: 'cloudflare' | 'upstash' | 'vercel';
|
|
144
|
+
UPSTASH_REDIS_REST_URL?: string;
|
|
145
|
+
UPSTASH_REDIS_REST_TOKEN?: string;
|
|
146
|
+
VERCEL_KV_REST_URL?: string;
|
|
147
|
+
VERCEL_KV_REST_TOKEN?: string;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Request wrapper for NextRequest compatibility
|
|
151
|
+
*/
|
|
152
|
+
export interface KVRequest {
|
|
153
|
+
env: CloudflareKVEnv;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/edge/kv/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KV (Key-Value) storage abstraction types for edge runtime
|
|
3
|
+
*
|
|
4
|
+
* Provides a simple key-value store interface that can be implemented by various providers
|
|
5
|
+
* (Cloudflare KV, Upstash Redis, Vercel KV, 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/kv/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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 type { StorageProvider, CloudflareStorageEnv, StorageRequest } from './types';
|
|
25
|
+
export type * from './types';
|
|
26
|
+
/**
|
|
27
|
+
* Get a storage instance for the current request
|
|
28
|
+
*
|
|
29
|
+
* Automatically selects the appropriate provider based on environment:
|
|
30
|
+
* - 'r2' (default): Cloudflare R2
|
|
31
|
+
* - 's3': AWS S3
|
|
32
|
+
* - 'backblaze': Backblaze B2
|
|
33
|
+
*
|
|
34
|
+
* @param req - NextRequest or object with env property
|
|
35
|
+
* @returns Storage provider instance
|
|
36
|
+
*/
|
|
37
|
+
export declare function getStorage(req: StorageRequest | {
|
|
38
|
+
env: CloudflareStorageEnv;
|
|
39
|
+
}): Promise<StorageProvider>;
|
|
40
|
+
/**
|
|
41
|
+
* Create a storage instance directly (for advanced usage)
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const storage = createStorage({ STORAGE: env.STORAGE });
|
|
46
|
+
* await storage.put('file.txt', 'Hello World');
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function createStorage(env: CloudflareStorageEnv): StorageProvider;
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/edge/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIrF,mBAAmB,SAAS,CAAC;AAE7B;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,cAAc,GAAG;IAAE,GAAG,EAAE,oBAAoB,CAAA;CAAE,GAClD,OAAO,CAAC,eAAe,CAAC,CAqC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,eAAe,CAexE"}
|