@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
package/README.md ADDED
@@ -0,0 +1,223 @@
1
+ # @thewhateverapp/platform
2
+
3
+ > ⚠️ **Beta Release (v0.0.1)**: This package is in early preview. Backend platform API is in development. Use `mock: true` mode for local development and testing. Production mode will be available when the platform API is deployed.
4
+
5
+ Universal SDK for building apps on The Whatever App platform. Provides domain-specific services for storage, AI, database, analytics, identity, and more.
6
+
7
+ ## Features
8
+
9
+ - **Auth Service**: OAuth-like permission system for app access to user data
10
+ - **Storage Service**: Persistent KV storage scoped per app
11
+ - **Database Service**: MongoDB-compatible document storage
12
+ - **AI Service**: Multi-provider AI access (Claude, GPT, Gemini)
13
+ - **Analytics Service**: Event tracking and metrics
14
+ - **Identity Service**: User authentication across apps
15
+ - **Assets Service**: File storage with CDN delivery
16
+ - **Social Service**: Comments, likes, shares across apps
17
+
18
+ ### Coming Soon
19
+
20
+ - **Payments Service**: Accept payments (Stripe + crypto) - _Feature gated_
21
+ - **Notifications Service**: Email, push, and in-app notifications - _Feature gated_
22
+
23
+ ## Installation
24
+
25
+ ```bash
26
+ npm install @thewhateverapp/platform
27
+ ```
28
+
29
+ ## Quick Start
30
+
31
+ ```typescript
32
+ import { createPlatform } from '@thewhateverapp/platform';
33
+
34
+ // In your app's worker
35
+ export default {
36
+ async fetch(request, env, ctx) {
37
+ const platform = createPlatform({
38
+ env,
39
+ request,
40
+ waitUntil: ctx.waitUntil
41
+ });
42
+
43
+ const { storage, db, ai, analytics } = platform.getServices();
44
+
45
+ // Use services
46
+ await storage.set('user:123', { score: 100 });
47
+ const user = await db.collection('users').findOne({ _id: '123' });
48
+ const response = await ai.ask('Generate a greeting');
49
+ await analytics.track('page_view', { path: '/home' });
50
+
51
+ return new Response('Hello from Whatever!');
52
+ }
53
+ };
54
+ ```
55
+
56
+ ## Architecture
57
+
58
+ ```
59
+ App Code (using @thewhateverapp/platform)
60
+
61
+ WhateverPlatform Container (DI)
62
+
63
+ 7 Services (abstracted)
64
+
65
+ Platform API (platform.thewhatever.app)
66
+
67
+ Backend Microservices (Kubernetes)
68
+
69
+ MongoDB + Cloudflare
70
+ ```
71
+
72
+ ## Services
73
+
74
+ ### Auth Service
75
+
76
+ OAuth-like permission system where apps start with minimal access (user ID only) and request additional permissions.
77
+
78
+ ```typescript
79
+ import { AuthAPI } from '@thewhateverapp/platform';
80
+
81
+ const auth = new AuthAPI({
82
+ apiUrl: 'https://platform.thewhatever.app',
83
+ apiKey: env.PLATFORM_API_KEY
84
+ });
85
+
86
+ // Verify user access token from tile SDK
87
+ const payload = await auth.verifyUserToken(token);
88
+ console.log(payload.userId, payload.scopes);
89
+
90
+ // Get user context with granted scopes
91
+ const user = await auth.getUserContext(userId, ['profile', 'email']);
92
+ console.log(user.username, user.email);
93
+
94
+ // Check what permissions user granted
95
+ const perms = await auth.checkPermissions(userId, appId, ['email', 'wallet']);
96
+ console.log(perms.granted, perms.pending, perms.denied);
97
+
98
+ // Grant permissions (called by parent window)
99
+ await auth.grantPermissions(userId, appId, ['profile', 'email']);
100
+
101
+ // Revoke app permissions
102
+ await auth.revokePermissions(userId, appId);
103
+ ```
104
+
105
+ **Permission Scopes:**
106
+ - `id` - User ID (always granted)
107
+ - `profile` - Username, avatar, display name
108
+ - `email` - Email address
109
+ - `wallet` - Wallet addresses
110
+ - `analytics:read` - View user analytics
111
+ - `analytics:write` - Track analytics (auto-granted)
112
+ - `storage:read` - Read storage (auto-granted)
113
+ - `storage:write` - Write storage (auto-granted)
114
+
115
+ ### Storage Service
116
+ ```typescript
117
+ await storage.set('key', value, { ttl: 3600 });
118
+ const data = await storage.get('key');
119
+ await storage.delete('key');
120
+ const keys = await storage.list({ prefix: 'user:' });
121
+ ```
122
+
123
+ ### Database Service
124
+ ```typescript
125
+ const users = db.collection('users');
126
+ await users.insertOne({ name: 'Alice', score: 100 });
127
+ const user = await users.findOne({ name: 'Alice' });
128
+ await users.updateOne({ name: 'Alice' }, { $inc: { score: 50 } });
129
+ ```
130
+
131
+ ### AI Service
132
+ ```typescript
133
+ const response = await ai.ask('What is the meaning of life?', {
134
+ provider: 'anthropic',
135
+ maxTokens: 500
136
+ });
137
+
138
+ const result = await ai.prompt({
139
+ prompt: 'Analyze this image',
140
+ capabilities: ['vision'],
141
+ images: [{ type: 'url', data: 'https://...' }]
142
+ });
143
+ ```
144
+
145
+ ### Analytics Service
146
+ ```typescript
147
+ await analytics.track('button_click', { button: 'submit' });
148
+ await analytics.pageView('/home');
149
+ const metrics = await analytics.getMetrics('7d');
150
+ ```
151
+
152
+ ### Identity Service
153
+ ```typescript
154
+ const { userId, isNew } = await identity.resolve({
155
+ email: 'user@example.com'
156
+ });
157
+
158
+ await identity.link(userId, { walletAddress: '0x...' });
159
+ const user = await identity.getUser(userId);
160
+ ```
161
+
162
+ ### Assets Service
163
+ ```typescript
164
+ const result = await assets.upload('images/avatar.jpg', buffer, {
165
+ contentType: 'image/jpeg'
166
+ });
167
+
168
+ const url = assets.getUrl('images/avatar.jpg');
169
+ await assets.delete('images/avatar.jpg');
170
+ ```
171
+
172
+ ### Payments Service
173
+ ```typescript
174
+ const session = await payments.createCheckout({
175
+ amount: 999, // cents
176
+ currency: 'USD',
177
+ description: 'Premium feature'
178
+ });
179
+
180
+ const status = await payments.getStatus(session.id);
181
+ ```
182
+
183
+ ### Notifications Service
184
+ ```typescript
185
+ await notifications.send({
186
+ userId: 'user_123',
187
+ channel: 'email',
188
+ template: 'welcome',
189
+ data: { name: 'Alice' }
190
+ });
191
+
192
+ await notifications.schedule({
193
+ userId: 'user_123',
194
+ channel: 'push',
195
+ message: 'Your report is ready',
196
+ scheduledFor: '2025-12-25T10:00:00Z'
197
+ });
198
+ ```
199
+
200
+ ### Social Service
201
+ ```typescript
202
+ await social.addComment({
203
+ entityId: 'post_123',
204
+ userId: 'user_456',
205
+ content: 'Great post!'
206
+ });
207
+
208
+ await social.like('post_123', 'user_456');
209
+ const likes = await social.getLikes('post_123');
210
+ const comments = await social.getComments('post_123');
211
+ ```
212
+
213
+ ## Security
214
+
215
+ - All services are automatically scoped by app ID
216
+ - Rate limiting enforced per app
217
+ - API keys never exposed to client
218
+ - All data isolated between apps
219
+ - Type-safe APIs with full TypeScript support
220
+
221
+ ## License
222
+
223
+ Proprietary - All rights reserved
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Mock AI service
3
+ */
4
+ import type { AIService, AskOptions, PromptRequest, PromptResponse } from '../types';
5
+ export declare class MockAI implements AIService {
6
+ private debug;
7
+ constructor(config?: {
8
+ debug?: boolean;
9
+ });
10
+ private log;
11
+ ask(prompt: string, options?: AskOptions): Promise<string>;
12
+ prompt(request: PromptRequest): Promise<PromptResponse>;
13
+ }
14
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/ai/mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,qBAAa,MAAO,YAAW,SAAS;IACtC,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;IAI5C,OAAO,CAAC,GAAG;IAML,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAO1D,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAoB9D"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Mock AI service
3
+ */
4
+ export class MockAI {
5
+ debug;
6
+ constructor(config = {}) {
7
+ this.debug = config.debug || false;
8
+ }
9
+ log(message, ...args) {
10
+ if (this.debug) {
11
+ console.log(`[MockAI] ${message}`, ...args);
12
+ }
13
+ }
14
+ async ask(prompt, options) {
15
+ this.log('Ask:', { prompt: prompt.substring(0, 100), options });
16
+ // Return a mock response
17
+ return `Mock AI response to: ${prompt.substring(0, 50)}...`;
18
+ }
19
+ async prompt(request) {
20
+ this.log('Prompt:', {
21
+ prompt: request.prompt.substring(0, 100),
22
+ provider: request.provider,
23
+ });
24
+ const text = `Mock AI response to: ${request.prompt.substring(0, 50)}...`;
25
+ return {
26
+ text,
27
+ provider: request.provider || 'mock',
28
+ model: request.model || 'mock-1.0',
29
+ tokensUsed: {
30
+ input: Math.floor(request.prompt.length / 4),
31
+ output: Math.floor(text.length / 4),
32
+ total: Math.floor((request.prompt.length + text.length) / 4),
33
+ },
34
+ cached: false,
35
+ };
36
+ }
37
+ }
38
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/ai/mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,OAAO,MAAM;IACT,KAAK,CAAU;IAEvB,YAAY,SAA8B,EAAE;QAC1C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;IACrC,CAAC;IAEO,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW;QACzC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,OAAoB;QAC5C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAEhE,yBAAyB;QACzB,OAAO,wBAAwB,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,wBAAwB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;QAE1E,OAAO;YACL,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,UAAU;YAClC,UAAU,EAAE;gBACV,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC5C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;aAC7D;YACD,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Production AI service
3
+ */
4
+ import type { AIService, AskOptions, PromptRequest, PromptResponse } from '../types';
5
+ interface ProductionAIConfig {
6
+ apiUrl: string;
7
+ apiKey?: string;
8
+ }
9
+ export declare class ProductionAI implements AIService {
10
+ private config;
11
+ constructor(config: ProductionAIConfig);
12
+ private request;
13
+ ask(prompt: string, options?: AskOptions): Promise<string>;
14
+ prompt(request: PromptRequest): Promise<PromptResponse>;
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=production.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production.d.ts","sourceRoot":"","sources":["../../src/ai/production.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAa,YAAW,SAAS;IAChC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,kBAAkB;YAEhC,OAAO;IAuBf,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1D,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAG9D"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Production AI service
3
+ */
4
+ export class ProductionAI {
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async request(endpoint, body) {
10
+ const headers = {
11
+ 'Content-Type': 'application/json',
12
+ };
13
+ if (this.config.apiKey) {
14
+ headers['X-API-Key'] = this.config.apiKey;
15
+ }
16
+ const response = await fetch(`${this.config.apiUrl}/ai${endpoint}`, {
17
+ method: 'POST',
18
+ headers,
19
+ body: JSON.stringify(body),
20
+ });
21
+ if (!response.ok) {
22
+ const error = await response.json().catch(() => ({}));
23
+ throw new Error(error.error || `AI service error: ${response.statusText}`);
24
+ }
25
+ return response.json();
26
+ }
27
+ async ask(prompt, options) {
28
+ const result = await this.prompt({
29
+ prompt,
30
+ provider: options?.provider,
31
+ capabilities: options?.capabilities,
32
+ maxTokens: options?.maxTokens,
33
+ temperature: options?.temperature,
34
+ });
35
+ return result.text;
36
+ }
37
+ async prompt(request) {
38
+ return this.request('/prompt', request);
39
+ }
40
+ }
41
+ //# sourceMappingURL=production.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"production.js","sourceRoot":"","sources":["../../src/ai/production.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,MAAM,OAAO,YAAY;IACH;IAApB,YAAoB,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;IAAG,CAAC;IAE1C,KAAK,CAAC,OAAO,CAAI,QAAgB,EAAE,IAAS;QAClD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,MAAM,QAAQ,EAAE,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,qBAAqB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,OAAoB;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YAC/B,MAAM;YACN,QAAQ,EAAE,OAAO,EAAE,QAAQ;YAC3B,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,WAAW,EAAE,OAAO,EAAE,WAAW;SAClC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAsB;QACjC,OAAO,IAAI,CAAC,OAAO,CAAiB,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Analytics service client
3
+ */
4
+ import type { AnalyticsService, AnalyticsEvent, MetricsData, EventQueryOptions } from '../types';
5
+ interface AnalyticsConfig {
6
+ apiUrl: string;
7
+ apiKey: string;
8
+ appId: string;
9
+ }
10
+ export declare class AnalyticsAPI implements AnalyticsService {
11
+ private config;
12
+ constructor(config: AnalyticsConfig);
13
+ private request;
14
+ track(event: string, properties?: Record<string, any>): Promise<void>;
15
+ pageView(path: string, properties?: Record<string, any>): Promise<void>;
16
+ identify(userId: string, traits?: Record<string, any>): Promise<void>;
17
+ getMetrics(period: string): Promise<MetricsData>;
18
+ getEvents(options?: EventQueryOptions): Promise<AnalyticsEvent[]>;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/analytics/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,YAAa,YAAW,gBAAgB;IACvC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;YAE7B,OAAO;IAuBf,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhD,SAAS,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAUxE"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Analytics service client
3
+ */
4
+ export class AnalyticsAPI {
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async request(method, path, body) {
10
+ const response = await fetch(`${this.config.apiUrl}/analytics${path}`, {
11
+ method,
12
+ headers: {
13
+ 'Content-Type': 'application/json',
14
+ 'X-API-Key': this.config.apiKey,
15
+ 'X-App-ID': this.config.appId,
16
+ },
17
+ body: body ? JSON.stringify(body) : undefined,
18
+ });
19
+ if (!response.ok) {
20
+ const error = await response.json().catch(() => ({}));
21
+ throw new Error(error.error || `Analytics error: ${response.statusText}`);
22
+ }
23
+ return response.json();
24
+ }
25
+ async track(event, properties) {
26
+ await this.request('POST', '/track', {
27
+ event,
28
+ properties,
29
+ timestamp: new Date().toISOString(),
30
+ });
31
+ }
32
+ async pageView(path, properties) {
33
+ await this.track('page_view', { path, ...properties });
34
+ }
35
+ async identify(userId, traits) {
36
+ await this.request('POST', '/identify', {
37
+ userId,
38
+ traits,
39
+ timestamp: new Date().toISOString(),
40
+ });
41
+ }
42
+ async getMetrics(period) {
43
+ return this.request('GET', `/metrics?period=${period}`);
44
+ }
45
+ async getEvents(options) {
46
+ const params = new URLSearchParams();
47
+ if (options?.event)
48
+ params.set('event', options.event);
49
+ if (options?.userId)
50
+ params.set('userId', options.userId);
51
+ if (options?.startDate)
52
+ params.set('startDate', options.startDate);
53
+ if (options?.endDate)
54
+ params.set('endDate', options.endDate);
55
+ if (options?.limit)
56
+ params.set('limit', options.limit.toString());
57
+ return this.request('GET', `/events?${params.toString()}`);
58
+ }
59
+ }
60
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/analytics/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,MAAM,OAAO,YAAY;IACH;IAApB,YAAoB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAEvC,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAU;QAEV,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,aAAa,IAAI,EAAE,EAAE;YACrE,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC/B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;aAC9B;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,oBAAoB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,UAAgC;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE;YACnC,KAAK;YACL,UAAU;YACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,UAAgC;QAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,MAA4B;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE;YACtC,MAAM;YACN,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAA2B;QACzC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,EAAE,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,OAAO,EAAE,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,OAAO,EAAE,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,OAAO,EAAE,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAElE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Assets service client for file storage
3
+ */
4
+ import type { AssetsService, UploadOptions, UploadResult, AssetInfo, AssetListOptions, AssetListResult } from '../types';
5
+ interface AssetsConfig {
6
+ apiUrl: string;
7
+ apiKey: string;
8
+ appId: string;
9
+ }
10
+ export declare class AssetsAPI implements AssetsService {
11
+ private config;
12
+ constructor(config: AssetsConfig);
13
+ private request;
14
+ upload(path: string, data: ArrayBuffer | Blob | ReadableStream | string, options?: UploadOptions): Promise<UploadResult>;
15
+ get(path: string): Promise<AssetInfo | null>;
16
+ getUrl(path: string): string;
17
+ delete(path: string): Promise<boolean>;
18
+ deleteMany(paths: string[]): Promise<number>;
19
+ list(options?: AssetListOptions): Promise<AssetListResult>;
20
+ exists(path: string): Promise<boolean>;
21
+ }
22
+ export {};
23
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/assets/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAU,YAAW,aAAa;IACjC,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;YAE1B,OAAO;IAkCf,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,cAAc,GAAG,MAAM,EAClD,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC;IA6BlB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAWlD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAItB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAO5C,IAAI,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAS1D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI7C"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Assets service client for file storage
3
+ */
4
+ export class AssetsAPI {
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async request(method, path, body, headers) {
10
+ const defaultHeaders = {
11
+ 'X-API-Key': this.config.apiKey,
12
+ 'X-App-ID': this.config.appId,
13
+ };
14
+ if (body && typeof body === 'object' && !(body instanceof FormData)) {
15
+ defaultHeaders['Content-Type'] = 'application/json';
16
+ }
17
+ const response = await fetch(`${this.config.apiUrl}/assets${path}`, {
18
+ method,
19
+ headers: { ...defaultHeaders, ...headers },
20
+ body: body instanceof FormData || typeof body === 'string'
21
+ ? body
22
+ : body
23
+ ? JSON.stringify(body)
24
+ : undefined,
25
+ });
26
+ if (!response.ok) {
27
+ const error = await response.json().catch(() => ({}));
28
+ throw new Error(error.error || `Assets error: ${response.statusText}`);
29
+ }
30
+ return response.json();
31
+ }
32
+ async upload(path, data, options) {
33
+ const formData = new FormData();
34
+ formData.append('path', path);
35
+ if (data instanceof ArrayBuffer) {
36
+ formData.append('file', new Blob([data]));
37
+ }
38
+ else if (data instanceof Blob) {
39
+ formData.append('file', data);
40
+ }
41
+ else if (typeof data === 'string') {
42
+ formData.append('file', new Blob([data]));
43
+ }
44
+ else {
45
+ throw new Error('Unsupported data type for upload');
46
+ }
47
+ if (options?.contentType) {
48
+ formData.append('contentType', options.contentType);
49
+ }
50
+ if (options?.cacheControl) {
51
+ formData.append('cacheControl', options.cacheControl);
52
+ }
53
+ if (options?.metadata) {
54
+ formData.append('metadata', JSON.stringify(options.metadata));
55
+ }
56
+ return this.request('POST', '/upload', formData);
57
+ }
58
+ async get(path) {
59
+ try {
60
+ return await this.request('GET', `/${encodeURIComponent(path)}`);
61
+ }
62
+ catch (e) {
63
+ if (e.message.includes('404')) {
64
+ return null;
65
+ }
66
+ throw e;
67
+ }
68
+ }
69
+ getUrl(path) {
70
+ return `${this.config.apiUrl}/assets/${this.config.appId}/${path}`;
71
+ }
72
+ async delete(path) {
73
+ try {
74
+ await this.request('DELETE', `/${encodeURIComponent(path)}`);
75
+ return true;
76
+ }
77
+ catch (e) {
78
+ if (e.message.includes('404')) {
79
+ return false;
80
+ }
81
+ throw e;
82
+ }
83
+ }
84
+ async deleteMany(paths) {
85
+ const result = await this.request('POST', '/delete-many', {
86
+ paths,
87
+ });
88
+ return result.deleted;
89
+ }
90
+ async list(options) {
91
+ const params = new URLSearchParams();
92
+ if (options?.prefix)
93
+ params.set('prefix', options.prefix);
94
+ if (options?.limit)
95
+ params.set('limit', options.limit.toString());
96
+ if (options?.cursor)
97
+ params.set('cursor', options.cursor);
98
+ return this.request('GET', `/list?${params.toString()}`);
99
+ }
100
+ async exists(path) {
101
+ const asset = await this.get(path);
102
+ return asset !== null;
103
+ }
104
+ }
105
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/assets/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Authentication service client
3
+ */
4
+ import type { AuthService, AccessTokenPayload, UserContext, PermissionScope, CheckPermissionsResult } from './types';
5
+ interface AuthConfig {
6
+ apiUrl: string;
7
+ apiKey: string;
8
+ }
9
+ export declare class AuthAPI implements AuthService {
10
+ private config;
11
+ constructor(config: AuthConfig);
12
+ private request;
13
+ verifyUserToken(token: string): Promise<AccessTokenPayload | null>;
14
+ getUserContext(userId: string, scopes: PermissionScope[]): Promise<UserContext>;
15
+ checkPermissions(userId: string, appId: string, scopes: PermissionScope[]): Promise<CheckPermissionsResult>;
16
+ grantPermissions(userId: string, appId: string, scopes: PermissionScope[]): Promise<void>;
17
+ revokePermissions(userId: string, appId: string): Promise<void>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAEjB,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,OAAQ,YAAW,WAAW;IAC7B,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;YAExB,OAAO;IAsBf,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAQlE,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,WAAW,CAAC;IAIjB,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,sBAAsB,CAAC;IAQ5B,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;IAQV,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGtE"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Authentication service client
3
+ */
4
+ export class AuthAPI {
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async request(method, path, body) {
10
+ const response = await fetch(`${this.config.apiUrl}/auth${path}`, {
11
+ method,
12
+ headers: {
13
+ 'Content-Type': 'application/json',
14
+ 'X-API-Key': this.config.apiKey,
15
+ },
16
+ body: body ? JSON.stringify(body) : undefined,
17
+ });
18
+ if (!response.ok) {
19
+ const error = await response.json().catch(() => ({}));
20
+ throw new Error(error.error || `Auth error: ${response.statusText}`);
21
+ }
22
+ return response.json();
23
+ }
24
+ async verifyUserToken(token) {
25
+ try {
26
+ return await this.request('POST', '/token/verify', { token });
27
+ }
28
+ catch (error) {
29
+ return null;
30
+ }
31
+ }
32
+ async getUserContext(userId, scopes) {
33
+ return this.request('POST', '/user', { userId, scopes });
34
+ }
35
+ async checkPermissions(userId, appId, scopes) {
36
+ return this.request('POST', '/permissions/check', {
37
+ userId,
38
+ appId,
39
+ scopes,
40
+ });
41
+ }
42
+ async grantPermissions(userId, appId, scopes) {
43
+ await this.request('POST', '/permissions/grant', {
44
+ userId,
45
+ appId,
46
+ scopes,
47
+ });
48
+ }
49
+ async revokePermissions(userId, appId) {
50
+ await this.request('DELETE', `/permissions/${appId}/${userId}`);
51
+ }
52
+ }
53
+ //# sourceMappingURL=client.js.map