@umituz/web-cloudflare 1.4.4 → 1.4.6

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 (28) hide show
  1. package/package.json +3 -2
  2. package/src/config/patterns.ts +43 -24
  3. package/src/domain/entities/analytics.entity.ts +30 -0
  4. package/src/domain/entities/d1.entity.ts +27 -0
  5. package/src/domain/entities/image.entity.ts +48 -0
  6. package/src/domain/entities/kv.entity.ts +37 -0
  7. package/src/domain/entities/r2.entity.ts +49 -0
  8. package/src/domain/entities/worker.entity.ts +35 -0
  9. package/src/domains/analytics/entities/index.ts +2 -2
  10. package/src/domains/middleware/entities/index.ts +106 -0
  11. package/src/domains/middleware/index.ts +14 -0
  12. package/src/domains/middleware/services/auth.service.ts +110 -0
  13. package/src/domains/middleware/services/cache.service.ts +93 -0
  14. package/src/domains/middleware/services/cors.service.ts +87 -0
  15. package/src/domains/middleware/services/index.ts +9 -0
  16. package/src/domains/middleware/services/rate-limit.service.ts +93 -0
  17. package/src/domains/middleware/types/index.ts +5 -0
  18. package/src/domains/middleware/types/service.interface.ts +122 -0
  19. package/src/domains/workers/entities/index.ts +1 -1
  20. package/src/domains/workflows/entities/index.ts +60 -0
  21. package/src/domains/wrangler/entities/index.ts +2 -2
  22. package/src/domains/wrangler/services/wrangler.service.ts +16 -8
  23. package/src/domains/wrangler/types/service.interface.ts +2 -2
  24. package/src/index.ts +2 -2
  25. package/src/infrastructure/middleware/index.ts +23 -8
  26. package/src/infrastructure/router/index.ts +26 -4
  27. package/src/infrastructure/utils/helpers.ts +25 -11
  28. package/src/infrastructure/utils/utils.util.ts +3 -2
@@ -5,6 +5,23 @@
5
5
 
6
6
  import { json, notFound, badRequest } from '../utils/helpers';
7
7
 
8
+ // ============================================================
9
+ // Environment Types
10
+ // ============================================================
11
+
12
+ export interface CloudflareEnv {
13
+ KV?: KVNamespace;
14
+ R2?: R2Bucket;
15
+ D1?: D1Database;
16
+ DO?: Record<string, DurableObjectNamespace>;
17
+ QUEUE?: Record<string, Queue>;
18
+ AI?: any;
19
+ vars?: Record<string, string>;
20
+ }
21
+
22
+ // Type alias for backwards compatibility
23
+ export type Env = CloudflareEnv;
24
+
8
25
  // ============================================================
9
26
  // Route Handler Types
10
27
  // ============================================================
@@ -12,13 +29,13 @@ import { json, notFound, badRequest } from '../utils/helpers';
12
29
  export type RouteHandler = (
13
30
  request: Request,
14
31
  params?: Record<string, string>,
15
- env?: Env,
32
+ env?: CloudflareEnv,
16
33
  ctx?: ExecutionContext
17
34
  ) => Promise<Response> | Response;
18
35
 
19
36
  export type Middleware = (
20
37
  request: Request,
21
- env?: Env,
38
+ env?: CloudflareEnv,
22
39
  ctx?: ExecutionContext
23
40
  ) => Promise<Response | null> | Response | null;
24
41
 
@@ -147,7 +164,7 @@ export class Router {
147
164
  */
148
165
  async handle(
149
166
  request: Request,
150
- env?: Env,
167
+ env?: CloudflareEnv,
151
168
  ctx?: ExecutionContext
152
169
  ): Promise<Response> {
153
170
  const url = new URL(request.url);
@@ -499,7 +516,12 @@ export async function body<T = unknown>(request: Request): Promise<T> {
499
516
  */
500
517
  export function query(request: Request): Record<string, string> {
501
518
  const url = new URL(request.url);
502
- return Object.fromEntries(url.searchParams.entries());
519
+ const result: Record<string, string> = {};
520
+ // URLSearchParams.keys() is not available in Workers runtime
521
+ url.searchParams.forEach((value, key) => {
522
+ result[key] = value;
523
+ });
524
+ return result;
503
525
  }
504
526
 
505
527
  /**
@@ -19,7 +19,17 @@ export async function parseBody<T = unknown>(request: Request): Promise<T> {
19
19
 
20
20
  if (contentType.includes('application/x-www-form-urlencoded')) {
21
21
  const formData = await request.formData();
22
- return Object.fromEntries(formData) as T;
22
+ const result: Record<string, unknown> = {};
23
+ // FormData.keys() is not available in Workers runtime
24
+ // Use alternative approach with for...of
25
+ const keys: string[] = [];
26
+ formData.forEach((value, key) => {
27
+ if (!keys.includes(key)) {
28
+ keys.push(key);
29
+ }
30
+ result[key] = value;
31
+ });
32
+ return result as T;
23
33
  }
24
34
 
25
35
  if (contentType.includes('text/')) {
@@ -297,16 +307,15 @@ export function generateCacheKey(request: Request, prefix?: string): string {
297
307
  const parts = [prefix || 'cache', url.pathname];
298
308
 
299
309
  // Add query params (sorted for consistency)
300
- const sortedParams = Array.from(url.searchParams.entries()).sort(
301
- ([a], [b]) => a.localeCompare(b)
302
- );
310
+ const params: string[] = [];
311
+ // URLSearchParams.keys() is not available in Workers runtime
312
+ url.searchParams.forEach((value, key) => {
313
+ params.push(`${key}=${value}`);
314
+ });
315
+ params.sort();
303
316
 
304
- if (sortedParams.length > 0) {
305
- parts.push(
306
- sortedParams
307
- .map(([key, value]) => `${key}=${value}`)
308
- .join('&')
309
- );
317
+ if (params.length > 0) {
318
+ parts.push(params.join('&'));
310
319
  }
311
320
 
312
321
  // Add auth header if present (for user-specific caching)
@@ -479,7 +488,12 @@ export function buildURL(base: string, params: Record<string, string | number |
479
488
  */
480
489
  export function parseQueryParams(url: string): Record<string, string> {
481
490
  const params = new URL(url).searchParams;
482
- return Object.fromEntries(params.entries());
491
+ const result: Record<string, string> = {};
492
+ // URLSearchParams.keys() is not available in Workers runtime
493
+ params.forEach((value, key) => {
494
+ result[key] = value;
495
+ });
496
+ return result;
483
497
  }
484
498
 
485
499
  /**
@@ -115,12 +115,13 @@ export const transformUtils = {
115
115
  */
116
116
  async streamToBlob(stream: ReadableStream): Promise<Blob> {
117
117
  const reader = stream.getReader();
118
- const chunks: Uint8Array[] = [];
118
+ const chunks: BlobPart[] = [];
119
119
 
120
120
  while (true) {
121
121
  const { done, value } = await reader.read();
122
122
  if (done) break;
123
- chunks.push(value);
123
+ // Convert Uint8Array to BlobPart
124
+ chunks.push(value as BlobPart);
124
125
  }
125
126
 
126
127
  return new Blob(chunks);