@vertz/cloudflare 0.2.10 → 0.2.12

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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @vertz/cloudflare
2
2
 
3
+ ## 0.2.12
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`c7e3ec2`](https://github.com/vertz-dev/vertz/commit/c7e3ec2e926b0a2cd6d35f58124f3d7f50fc6fb9)]:
8
+ - @vertz/ui-server@0.2.12
9
+ - @vertz/core@0.2.12
10
+
11
+ ## 0.2.11
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [[`b2878cf`](https://github.com/vertz-dev/vertz/commit/b2878cfe2acb3d1155ca5e0da13b2ee91c9aea9a), [`5ed4c1a`](https://github.com/vertz-dev/vertz/commit/5ed4c1a4c5c9ea946e97b1636011251c6287eaf4), [`1fc9e33`](https://github.com/vertz-dev/vertz/commit/1fc9e33a9aa5283898c8974084f519a3caacbabb)]:
16
+ - @vertz/ui-server@0.2.11
17
+ - @vertz/core@0.2.11
18
+
3
19
  ## 0.2.8
4
20
 
5
21
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertz/cloudflare",
3
- "version": "0.2.10",
3
+ "version": "0.2.12",
4
4
  "description": "Cloudflare Workers adapter for vertz",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -19,19 +19,18 @@
19
19
  "scripts": {
20
20
  "build": "tsc",
21
21
  "typecheck": "tsc --noEmit",
22
- "test": "vitest run"
22
+ "test": "bun test"
23
23
  },
24
24
  "dependencies": {
25
- "@vertz/core": "^0.2.4"
25
+ "@vertz/core": "^0.2.11"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@cloudflare/workers-types": "^4.20260305.0",
29
- "@vertz/ui-server": "^0.2.4",
30
- "@vitest/coverage-v8": "^4.0.18",
29
+ "@vertz/ui-server": "^0.2.11",
31
30
  "typescript": "^5.7.3"
32
31
  },
33
32
  "peerDependencies": {
34
- "@vertz/ui-server": "^0.2.4"
33
+ "@vertz/ui-server": "^0.2.11"
35
34
  },
36
35
  "peerDependenciesMeta": {
37
36
  "@vertz/ui-server": {
@@ -1,16 +1,16 @@
1
1
  import type { AppBuilder } from '@vertz/core';
2
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { afterEach, beforeEach, describe, expect, it, mock, spyOn } from 'bun:test';
3
3
  import { createHandler, generateHTMLTemplate, generateNonce } from '../src/handler.js';
4
4
 
5
5
  function mockApp(handler?: (...args: unknown[]) => Promise<Response>): AppBuilder {
6
6
  return {
7
- handler: handler ?? vi.fn().mockResolvedValue(new Response('OK')),
7
+ handler: handler ?? mock().mockResolvedValue(new Response('OK')),
8
8
  } as unknown as AppBuilder;
9
9
  }
10
10
 
11
11
  describe('createHandler', () => {
12
12
  it('returns proper Worker export with fetch method', () => {
13
- const mockHandler = vi.fn().mockResolvedValue(new Response('OK'));
13
+ const mockHandler = mock().mockResolvedValue(new Response('OK'));
14
14
  const mockApp = {
15
15
  handler: mockHandler,
16
16
  } as unknown as AppBuilder;
@@ -23,7 +23,7 @@ describe('createHandler', () => {
23
23
 
24
24
  it('forwards requests to the vertz handler', async () => {
25
25
  const mockResponse = new Response('Hello from handler');
26
- const mockHandler = vi.fn().mockResolvedValue(mockResponse);
26
+ const mockHandler = mock().mockResolvedValue(mockResponse);
27
27
  const mockApp = {
28
28
  handler: mockHandler,
29
29
  } as unknown as AppBuilder;
@@ -40,7 +40,7 @@ describe('createHandler', () => {
40
40
  });
41
41
 
42
42
  it('strips basePath prefix from pathname', async () => {
43
- const mockHandler = vi.fn().mockResolvedValue(new Response('OK'));
43
+ const mockHandler = mock().mockResolvedValue(new Response('OK'));
44
44
  const mockApp = {
45
45
  handler: mockHandler,
46
46
  } as unknown as AppBuilder;
@@ -59,7 +59,7 @@ describe('createHandler', () => {
59
59
  });
60
60
 
61
61
  it('strips basePath with trailing slash correctly', async () => {
62
- const mockHandler = vi.fn().mockResolvedValue(new Response('OK'));
62
+ const mockHandler = mock().mockResolvedValue(new Response('OK'));
63
63
  const mockApp = {
64
64
  handler: mockHandler,
65
65
  } as unknown as AppBuilder;
@@ -77,7 +77,7 @@ describe('createHandler', () => {
77
77
  });
78
78
 
79
79
  it('handles basePath when pathname does not start with basePath', async () => {
80
- const mockHandler = vi.fn().mockResolvedValue(new Response('OK'));
80
+ const mockHandler = mock().mockResolvedValue(new Response('OK'));
81
81
  const mockApp = {
82
82
  handler: mockHandler,
83
83
  } as unknown as AppBuilder;
@@ -95,7 +95,7 @@ describe('createHandler', () => {
95
95
  });
96
96
 
97
97
  it('preserves query parameters when stripping basePath', async () => {
98
- const mockHandler = vi.fn().mockResolvedValue(new Response('OK'));
98
+ const mockHandler = mock().mockResolvedValue(new Response('OK'));
99
99
  const mockApp = {
100
100
  handler: mockHandler,
101
101
  } as unknown as AppBuilder;
@@ -115,7 +115,7 @@ describe('createHandler', () => {
115
115
  });
116
116
 
117
117
  it('preserves request headers and method', async () => {
118
- const mockHandler = vi.fn().mockResolvedValue(new Response('OK'));
118
+ const mockHandler = mock().mockResolvedValue(new Response('OK'));
119
119
  const mockApp = {
120
120
  handler: mockHandler,
121
121
  } as unknown as AppBuilder;
@@ -141,7 +141,7 @@ describe('createHandler', () => {
141
141
 
142
142
  it('works without basePath option', async () => {
143
143
  const mockResponse = new Response('No basePath');
144
- const mockHandler = vi.fn().mockResolvedValue(mockResponse);
144
+ const mockHandler = mock().mockResolvedValue(mockResponse);
145
145
  const mockApp = {
146
146
  handler: mockHandler,
147
147
  } as unknown as AppBuilder;
@@ -160,9 +160,9 @@ describe('createHandler', () => {
160
160
  });
161
161
 
162
162
  it('returns 500 response when handler throws an error', async () => {
163
- const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
163
+ const consoleErrorSpy = spyOn(console, 'error').mockImplementation(() => {});
164
164
  const testError = new Error('Test error');
165
- const mockHandler = vi.fn().mockRejectedValue(testError);
165
+ const mockHandler = mock().mockRejectedValue(testError);
166
166
  const mockApp = {
167
167
  handler: mockHandler,
168
168
  } as unknown as AppBuilder;
@@ -192,12 +192,12 @@ describe('createHandler (config object)', () => {
192
192
  const mockCtx = {} as ExecutionContext;
193
193
 
194
194
  it('routes API requests to app handler and SSR to ssr handler', async () => {
195
- const apiHandler = vi.fn().mockResolvedValue(
195
+ const apiHandler = mock().mockResolvedValue(
196
196
  new Response('{"items":[]}', {
197
197
  headers: { 'Content-Type': 'application/json' },
198
198
  }),
199
199
  );
200
- const ssrHandler = vi.fn().mockResolvedValue(
200
+ const ssrHandler = mock().mockResolvedValue(
201
201
  new Response('<html>SSR</html>', {
202
202
  headers: { 'Content-Type': 'text/html' },
203
203
  }),
@@ -225,8 +225,8 @@ describe('createHandler (config object)', () => {
225
225
  });
226
226
 
227
227
  it('passes env to the app factory and caches the result', async () => {
228
- const apiHandler = vi.fn().mockResolvedValue(new Response('OK'));
229
- const appFactory = vi.fn().mockReturnValue(mockApp(apiHandler));
228
+ const apiHandler = mock().mockResolvedValue(new Response('OK'));
229
+ const appFactory = mock().mockReturnValue(mockApp(apiHandler));
230
230
 
231
231
  const worker = createHandler({
232
232
  app: appFactory,
@@ -245,7 +245,7 @@ describe('createHandler (config object)', () => {
245
245
 
246
246
  it('adds security headers when securityHeaders is true', async () => {
247
247
  const worker = createHandler({
248
- app: () => mockApp(vi.fn().mockResolvedValue(new Response('OK'))),
248
+ app: () => mockApp(mock().mockResolvedValue(new Response('OK'))),
249
249
  basePath: '/api',
250
250
  securityHeaders: true,
251
251
  });
@@ -276,7 +276,7 @@ describe('createHandler (config object)', () => {
276
276
  });
277
277
 
278
278
  it('passes full URL to app handler (no basePath stripping)', async () => {
279
- const apiHandler = vi.fn().mockResolvedValue(new Response('OK'));
279
+ const apiHandler = mock().mockResolvedValue(new Response('OK'));
280
280
 
281
281
  const worker = createHandler({
282
282
  app: () => mockApp(apiHandler),
@@ -291,10 +291,10 @@ describe('createHandler (config object)', () => {
291
291
  });
292
292
 
293
293
  it('returns 500 with error message when app handler throws', async () => {
294
- const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
294
+ const consoleErrorSpy = spyOn(console, 'error').mockImplementation(() => {});
295
295
 
296
296
  const worker = createHandler({
297
- app: () => mockApp(vi.fn().mockRejectedValue(new Error('DB connection failed'))),
297
+ app: () => mockApp(mock().mockRejectedValue(new Error('DB connection failed'))),
298
298
  basePath: '/api',
299
299
  });
300
300
 
@@ -310,7 +310,7 @@ describe('createHandler (config object)', () => {
310
310
  });
311
311
 
312
312
  it('returns 500 with error message when SSR handler throws', async () => {
313
- const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
313
+ const consoleErrorSpy = spyOn(console, 'error').mockImplementation(() => {});
314
314
 
315
315
  const worker = createHandler({
316
316
  app: () => mockApp(),
@@ -368,25 +368,21 @@ describe('createHandler (SSR module config)', () => {
368
368
 
369
369
  // We mock @vertz/ui-server's createSSRHandler to isolate wiring logic.
370
370
  // The mock returns a handler that echoes 'SSR Module' so we can verify routing.
371
- const mockSSRRequestHandler = vi.fn().mockResolvedValue(
371
+ const mockSSRRequestHandler = mock().mockResolvedValue(
372
372
  new Response('<html>SSR Module</html>', {
373
373
  headers: { 'Content-Type': 'text/html' },
374
374
  }),
375
375
  );
376
- const mockCreateSSRHandler = vi.fn().mockReturnValue(mockSSRRequestHandler);
376
+ const mockCreateSSRHandler = mock().mockReturnValue(mockSSRRequestHandler);
377
377
 
378
378
  beforeEach(() => {
379
- vi.doMock('@vertz/ui-server/ssr', () => ({
379
+ mock.module('@vertz/ui-server/ssr', () => ({
380
380
  createSSRHandler: mockCreateSSRHandler,
381
381
  }));
382
382
  mockSSRRequestHandler.mockClear();
383
383
  mockCreateSSRHandler.mockClear();
384
384
  });
385
385
 
386
- afterEach(() => {
387
- vi.doUnmock('@vertz/ui-server/ssr');
388
- });
389
-
390
386
  it('routes non-API requests through the SSR handler created from module config', async () => {
391
387
  const { createHandler: freshCreateHandler } = await import('../src/handler.js');
392
388
 
@@ -463,7 +459,7 @@ describe('createHandler (SSR module config)', () => {
463
459
  it('still works with ssr callback (backward compat)', async () => {
464
460
  const { createHandler: freshCreateHandler } = await import('../src/handler.js');
465
461
 
466
- const ssrCallback = vi.fn().mockResolvedValue(
462
+ const ssrCallback = mock().mockResolvedValue(
467
463
  new Response('<html>Callback SSR</html>', {
468
464
  headers: { 'Content-Type': 'text/html' },
469
465
  }),
@@ -486,7 +482,7 @@ describe('createHandler (SSR module config)', () => {
486
482
  it('routes API requests to app handler even with SSR module config', async () => {
487
483
  const { createHandler: freshCreateHandler } = await import('../src/handler.js');
488
484
 
489
- const apiHandler = vi.fn().mockResolvedValue(
485
+ const apiHandler = mock().mockResolvedValue(
490
486
  new Response('{"items":[]}', {
491
487
  headers: { 'Content-Type': 'application/json' },
492
488
  }),
@@ -540,7 +536,7 @@ describe('nonce-based CSP headers', () => {
540
536
 
541
537
  it('CSP header contains nonce (not unsafe-inline) for script-src', async () => {
542
538
  const worker = createHandler({
543
- app: () => mockApp(vi.fn().mockResolvedValue(new Response('OK'))),
539
+ app: () => mockApp(mock().mockResolvedValue(new Response('OK'))),
544
540
  basePath: '/api',
545
541
  securityHeaders: true,
546
542
  });
@@ -563,7 +559,7 @@ describe('nonce-based CSP headers', () => {
563
559
 
564
560
  it('CSP header keeps unsafe-inline for style-src', async () => {
565
561
  const worker = createHandler({
566
- app: () => mockApp(vi.fn().mockResolvedValue(new Response('OK'))),
562
+ app: () => mockApp(mock().mockResolvedValue(new Response('OK'))),
567
563
  basePath: '/api',
568
564
  securityHeaders: true,
569
565
  });
@@ -580,7 +576,7 @@ describe('nonce-based CSP headers', () => {
580
576
 
581
577
  it('each request gets a different nonce in the CSP header', async () => {
582
578
  const worker = createHandler({
583
- app: () => mockApp(vi.fn().mockResolvedValue(new Response('OK'))),
579
+ app: () => mockApp(mock().mockResolvedValue(new Response('OK'))),
584
580
  basePath: '/api',
585
581
  securityHeaders: true,
586
582
  });
@@ -637,10 +633,10 @@ describe('nonce-based CSP headers', () => {
637
633
  });
638
634
 
639
635
  it('applies nonce-based CSP to 500 error responses', async () => {
640
- const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
636
+ const consoleErrorSpy = spyOn(console, 'error').mockImplementation(() => {});
641
637
 
642
638
  const worker = createHandler({
643
- app: () => mockApp(vi.fn().mockRejectedValue(new Error('fail'))),
639
+ app: () => mockApp(mock().mockRejectedValue(new Error('fail'))),
644
640
  basePath: '/api',
645
641
  securityHeaders: true,
646
642
  });
@@ -1,11 +0,0 @@
1
- $ vitest run
2
-
3
-  RUN  v4.0.18 /Users/viniciusdacal/vertz-dev/vertz/packages/cloudflare
4
-
5
- ✓ tests/handler.test.ts (33 tests) 58ms
6
-
7
-  Test Files  1 passed (1)
8
-  Tests  33 passed (33)
9
-  Start at  08:45:02
10
-  Duration  521ms (transform 190ms, setup 0ms, import 224ms, tests 58ms, environment 0ms)
11
-
@@ -1 +0,0 @@
1
- $ tsc --noEmit
package/vitest.config.ts DELETED
@@ -1,21 +0,0 @@
1
- import { dirname, resolve } from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- import { defineConfig } from 'vitest/config';
4
-
5
- const __dirname = dirname(fileURLToPath(import.meta.url));
6
-
7
- export default defineConfig({
8
- test: {
9
- include: ['src/**/*.test.ts', 'tests/**/*.test.ts'],
10
- environment: 'node',
11
- alias: {
12
- '@': resolve(__dirname, './src'),
13
- },
14
- coverage: {
15
- reporter: ['text', 'json-summary', 'json'],
16
- provider: 'v8',
17
- include: ['src/**/*.ts'],
18
- exclude: ['src/**/*.test.ts', 'src/**/*.test-d.ts', 'src/index.ts'],
19
- },
20
- },
21
- });