@revealui/core 0.5.6 → 0.7.0

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 (68) hide show
  1. package/README.md +1 -1
  2. package/dist/api/compression.d.ts +3 -4
  3. package/dist/api/compression.d.ts.map +1 -1
  4. package/dist/api/compression.js +1 -2
  5. package/dist/api/rate-limit.d.ts +10 -11
  6. package/dist/api/rate-limit.d.ts.map +1 -1
  7. package/dist/api/rate-limit.js +9 -16
  8. package/dist/api/response-cache.d.ts +8 -9
  9. package/dist/api/response-cache.d.ts.map +1 -1
  10. package/dist/api/response-cache.js +2 -3
  11. package/dist/client/admin/layout.d.ts.map +1 -1
  12. package/dist/client/admin/layout.js +1 -3
  13. package/dist/client/admin/utils/apiClient.d.ts.map +1 -1
  14. package/dist/client/admin/utils/apiClient.js +16 -1
  15. package/dist/client/richtext/index.d.ts.map +1 -1
  16. package/dist/client/richtext/index.js +0 -1
  17. package/dist/collections/operations/create.d.ts.map +1 -1
  18. package/dist/collections/operations/create.js +23 -5
  19. package/dist/database/universal-postgres.d.ts +14 -0
  20. package/dist/database/universal-postgres.d.ts.map +1 -1
  21. package/dist/database/universal-postgres.js +97 -0
  22. package/dist/fieldTraversal.d.ts +1 -1
  23. package/dist/fieldTraversal.d.ts.map +1 -1
  24. package/dist/generated/types/admin.d.ts +2 -2
  25. package/dist/generated/types/admin.d.ts.map +1 -1
  26. package/dist/index.d.ts +2 -2
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +6 -2
  29. package/dist/instance/methods/create.d.ts.map +1 -1
  30. package/dist/instance/methods/create.js +3 -2
  31. package/dist/license-encryption.d.ts +11 -2
  32. package/dist/license-encryption.d.ts.map +1 -1
  33. package/dist/license-encryption.js +77 -22
  34. package/dist/license.d.ts +106 -8
  35. package/dist/license.d.ts.map +1 -1
  36. package/dist/license.js +243 -35
  37. package/dist/nextjs/index.d.ts +0 -1
  38. package/dist/nextjs/index.d.ts.map +1 -1
  39. package/dist/nextjs/index.js +7 -2
  40. package/dist/nextjs/withRevealUI.d.ts +29 -1
  41. package/dist/nextjs/withRevealUI.d.ts.map +1 -1
  42. package/dist/observability/logger.d.ts +0 -4
  43. package/dist/observability/logger.d.ts.map +1 -1
  44. package/dist/observability/logger.js +2 -29
  45. package/dist/observability/metrics.d.ts +25 -0
  46. package/dist/observability/metrics.d.ts.map +1 -1
  47. package/dist/observability/metrics.js +26 -0
  48. package/dist/revealui.d.ts +0 -5
  49. package/dist/revealui.d.ts.map +1 -1
  50. package/dist/revealui.js +0 -10
  51. package/dist/revforge-license.d.ts +60 -0
  52. package/dist/revforge-license.d.ts.map +1 -0
  53. package/dist/revforge-license.js +74 -0
  54. package/dist/richtext/exports/server/rsc.d.ts +2 -17
  55. package/dist/richtext/exports/server/rsc.d.ts.map +1 -1
  56. package/dist/richtext/exports/server/rsc.js +9 -54
  57. package/dist/types/index.d.ts +1 -1
  58. package/dist/types/index.d.ts.map +1 -1
  59. package/dist/types/{legacy.d.ts → internal.d.ts} +1 -1
  60. package/dist/types/internal.d.ts.map +1 -0
  61. package/dist/types/runtime.d.ts +12 -0
  62. package/dist/types/runtime.d.ts.map +1 -1
  63. package/dist/utils/api-wrapper.d.ts +4 -6
  64. package/dist/utils/api-wrapper.d.ts.map +1 -1
  65. package/dist/utils/api-wrapper.js +8 -10
  66. package/package.json +71 -24
  67. package/dist/types/legacy.d.ts.map +0 -1
  68. /package/dist/types/{legacy.js → internal.js} +0 -0
package/README.md CHANGED
@@ -17,7 +17,7 @@ Part of the [RevealUI monorepo](https://github.com/RevealUIStudio/revealui) -
17
17
  - **GDPR Compliance** - Consent management, data export, deletion, anonymization, breach reporting
18
18
  - **Observability** - Structured logging, process health monitoring, alert system, graceful shutdown
19
19
  - **Plugins** - Extensible plugin system (form builder, nested docs, redirects)
20
- - **Feature Gating** - Tier-based licensing (free, pro, max, enterprise/Forge) with JWT license keys
20
+ - **Feature Gating** - Tier-based licensing (free, pro, max, enterprise) with JWT license keys
21
21
  - **Database** - PostgreSQL adapters (NeonDB + PGlite for testing), connection pooling, SSL/TLS
22
22
  - **Storage** - Pluggable storage interface (Vercel Blob adapter included)
23
23
 
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * Implements gzip and brotli compression for API responses
5
5
  */
6
- import { type NextRequest, NextResponse } from 'next/server';
7
6
  interface CompressionOptions {
8
7
  threshold?: number;
9
8
  level?: number;
@@ -13,11 +12,11 @@ interface CompressionOptions {
13
12
  /**
14
13
  * Compress API response
15
14
  */
16
- export declare function compressResponse(request: NextRequest, response: NextResponse, options?: CompressionOptions): Promise<NextResponse>;
15
+ export declare function compressResponse(request: Request, response: Response, options?: CompressionOptions): Promise<Response>;
17
16
  /**
18
17
  * Create compression middleware
19
18
  */
20
- export declare function createCompressionMiddleware(options?: CompressionOptions): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
19
+ export declare function createCompressionMiddleware(options?: CompressionOptions): (request: Request, next: () => Promise<Response>) => Promise<Response>;
21
20
  /**
22
21
  * Calculate compression ratio
23
22
  */
@@ -75,7 +74,7 @@ export declare function decompressBody(body: Uint8Array, encoding: string): Prom
75
74
  /**
76
75
  * Check if compression is supported
77
76
  */
78
- export declare function isCompressionSupported(request: NextRequest): {
77
+ export declare function isCompressionSupported(request: Request): {
79
78
  gzip: boolean;
80
79
  brotli: boolean;
81
80
  };
@@ -1 +1 @@
1
- {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/api/compression.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7D,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AA4GD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,YAAY,CAAC,CAuCvB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,kBAAuB,IAC5D,SAAS,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC,YAAY,CAAC,oCAItE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAExF;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,GAAG,UAAU,EACjC,cAAc,EAAE,UAAU,EAC1B,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAelB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CtB,CAAC;AAEX;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,MAAM,GAAG,IAAa,EAChC,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkB5F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG;IAC5D,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB,CAOA"}
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/api/compression.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AA4GD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,QAAQ,CAAC,CAuCnB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,kBAAuB,IAC5D,SAAS,OAAO,EAAE,MAAM,MAAM,OAAO,CAAC,QAAQ,CAAC,uBAI9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAExF;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,GAAG,UAAU,EACjC,cAAc,EAAE,UAAU,EAC1B,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAelB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CtB,CAAC;AAEX;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,MAAM,GAAG,IAAa,EAChC,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkB5F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG;IACxD,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB,CAOA"}
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * Implements gzip and brotli compression for API responses
5
5
  */
6
- import { NextResponse } from 'next/server';
7
6
  import { logger } from '../observability/logger.js';
8
7
  const DEFAULT_OPTIONS = {
9
8
  threshold: 1024, // 1KB minimum
@@ -108,7 +107,7 @@ export async function compressResponse(request, response, options = {}) {
108
107
  // Compress body
109
108
  const compressed = await compressBody(body, encoding, opts.level || 6);
110
109
  // Create new response with compressed body
111
- const newResponse = new NextResponse(compressed, {
110
+ const newResponse = new Response(compressed, {
112
111
  status: response.status,
113
112
  statusText: response.statusText,
114
113
  headers: response.headers,
@@ -3,13 +3,12 @@
3
3
  *
4
4
  * Implements rate limiting to prevent API abuse
5
5
  */
6
- import { type NextRequest, NextResponse } from 'next/server';
7
6
  interface RateLimitConfig {
8
7
  windowMs: number;
9
8
  maxRequests: number;
10
- keyGenerator?: (request: NextRequest) => string;
11
- skip?: (request: NextRequest) => boolean;
12
- handler?: (request: NextRequest) => NextResponse;
9
+ keyGenerator?: (request: Request) => string;
10
+ skip?: (request: Request) => boolean;
11
+ handler?: (request: Request) => Response;
13
12
  }
14
13
  interface RateLimitEntry {
15
14
  count: number;
@@ -18,7 +17,7 @@ interface RateLimitEntry {
18
17
  /**
19
18
  * Check if rate limit exceeded
20
19
  */
21
- export declare function checkRateLimit(request: NextRequest, config: RateLimitConfig): {
20
+ export declare function checkRateLimit(request: Request, config: RateLimitConfig): {
22
21
  allowed: boolean;
23
22
  limit: number;
24
23
  remaining: number;
@@ -27,7 +26,7 @@ export declare function checkRateLimit(request: NextRequest, config: RateLimitCo
27
26
  /**
28
27
  * Create rate limit middleware
29
28
  */
30
- export declare function createRateLimitMiddleware(config: RateLimitConfig): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
29
+ export declare function createRateLimitMiddleware(config: RateLimitConfig): (request: Request, next: () => Promise<Response>) => Promise<Response>;
31
30
  /**
32
31
  * Cleanup expired rate limit entries across all stores
33
32
  */
@@ -77,21 +76,21 @@ export declare const RATE_LIMIT_PRESETS: Record<string, RateLimitPresetConfig>;
77
76
  /**
78
77
  * Rate limit by user ID
79
78
  */
80
- export declare function createUserRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
79
+ export declare function createUserRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: Request, next: () => Promise<Response>) => Promise<Response>;
81
80
  /**
82
81
  * Rate limit by API key
83
82
  */
84
- export declare function createAPIKeyRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
83
+ export declare function createAPIKeyRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: Request, next: () => Promise<Response>) => Promise<Response>;
85
84
  /**
86
85
  * Rate limit by endpoint
87
86
  */
88
- export declare function createEndpointRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
89
- export declare function checkSlidingWindowRateLimit(request: NextRequest, config: RateLimitConfig): {
87
+ export declare function createEndpointRateLimit(config: Omit<RateLimitConfig, 'keyGenerator'>): (request: Request, next: () => Promise<Response>) => Promise<Response>;
88
+ export declare function checkSlidingWindowRateLimit(request: Request, config: RateLimitConfig): {
90
89
  allowed: boolean;
91
90
  limit: number;
92
91
  remaining: number;
93
92
  };
94
- export declare function checkTokenBucketRateLimit(request: NextRequest, config: RateLimitConfig & {
93
+ export declare function checkTokenBucketRateLimit(request: Request, config: RateLimitConfig & {
95
94
  refillRate: number;
96
95
  }): {
97
96
  allowed: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/api/rate-limit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/api/rate-limit.ts"],"names":[],"mappings":"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"}
@@ -3,29 +3,22 @@
3
3
  *
4
4
  * Implements rate limiting to prevent API abuse
5
5
  */
6
- import { NextResponse } from 'next/server';
6
+ import { getClientIp } from '@revealui/security';
7
7
  import { logger } from '../observability/logger.js';
8
8
  // WARNING: In-memory store - resets on every serverless cold start or process restart.
9
- // This module is NOT used by any app in production (API uses apps/api/src/middleware/rate-limit.ts,
9
+ // This module is NOT used by any app in production (API uses apps/server/src/middleware/rate-limit.ts,
10
10
  // admin uses @revealui/auth/server which is DB-backed). Exported for framework consumers only.
11
11
  // Replace with a database-backed store before using in production.
12
12
  const rateLimitStore = new Map();
13
13
  /**
14
- * Default key generator (by IP address)
14
+ * Default key generator (by IP address).
15
+ *
16
+ * Delegates to `@revealui/security`'s trusted-proxy-aware
17
+ * `getClientIp` so the IP cannot be spoofed via X-Forwarded-For
18
+ * on deployments that configure their proxy trust correctly.
15
19
  */
16
20
  function defaultKeyGenerator(request) {
17
- // Try to get real IP from headers
18
- const forwarded = request.headers.get('x-forwarded-for');
19
- const realIp = request.headers.get('x-real-ip');
20
- if (forwarded) {
21
- const parts = forwarded.split(',');
22
- return parts[0]?.trim() || 'unknown';
23
- }
24
- if (realIp) {
25
- return realIp;
26
- }
27
- // Fallback to unknown (NextRequest doesn't have ip property)
28
- return 'unknown';
21
+ return getClientIp(request);
29
22
  }
30
23
  /**
31
24
  * Check if rate limit exceeded
@@ -90,7 +83,7 @@ export function createRateLimitMiddleware(config) {
90
83
  */
91
84
  function createRateLimitResponse(result) {
92
85
  const retryAfter = Math.ceil((result.resetTime - Date.now()) / 1000);
93
- return NextResponse.json({
86
+ return Response.json({
94
87
  error: 'Too Many Requests',
95
88
  message: 'Rate limit exceeded. Please try again later.',
96
89
  limit: result.limit,
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * Implements HTTP caching for API responses
5
5
  */
6
- import { type NextRequest, NextResponse } from 'next/server';
7
6
  interface CacheOptions {
8
7
  ttl?: number;
9
8
  staleWhileRevalidate?: number;
@@ -15,15 +14,15 @@ interface CacheOptions {
15
14
  /**
16
15
  * Generate cache key from request
17
16
  */
18
- export declare function generateCacheKey(request: NextRequest): string;
17
+ export declare function generateCacheKey(request: Request): string;
19
18
  /**
20
19
  * Get cached response
21
20
  */
22
- export declare function getCachedResponse(request: NextRequest): Promise<NextResponse | null>;
21
+ export declare function getCachedResponse(request: Request): Promise<Response | null>;
23
22
  /**
24
23
  * Set cached response
25
24
  */
26
- export declare function setCachedResponse(request: NextRequest, response: NextResponse, options?: CacheOptions): Promise<void>;
25
+ export declare function setCachedResponse(request: Request, response: Response, options?: CacheOptions): Promise<void>;
27
26
  /**
28
27
  * Invalidate cache by key
29
28
  */
@@ -43,11 +42,11 @@ export declare function clearCache(): void;
43
42
  /**
44
43
  * Set Cache-Control headers
45
44
  */
46
- export declare function setCacheHeaders(response: NextResponse, options: CacheOptions): NextResponse;
45
+ export declare function setCacheHeaders(response: Response, options: CacheOptions): Response;
47
46
  /**
48
47
  * Create caching middleware
49
48
  */
50
- export declare function createCacheMiddleware(options?: CacheOptions): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
49
+ export declare function createCacheMiddleware(options?: CacheOptions): (request: Request, next: () => Promise<Response>) => Promise<Response>;
51
50
  /**
52
51
  * Get cache statistics
53
52
  */
@@ -69,15 +68,15 @@ export declare function startCacheCleanup(intervalMs?: number): NodeJS.Timeout;
69
68
  /**
70
69
  * Cache response with ETag
71
70
  */
72
- export declare function withETag(response: NextResponse, content: string): NextResponse;
71
+ export declare function withETag(response: Response, content: string): Response;
73
72
  /**
74
73
  * Check if request has matching ETag
75
74
  */
76
- export declare function checkETag(request: NextRequest, etag: string): boolean;
75
+ export declare function checkETag(request: Request, etag: string): boolean;
77
76
  /**
78
77
  * Create 304 Not Modified response
79
78
  */
80
- export declare function createNotModifiedResponse(): NextResponse;
79
+ export declare function createNotModifiedResponse(): Response;
81
80
  /**
82
81
  * Cache presets for common scenarios
83
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"response-cache.d.ts","sourceRoot":"","sources":["../../src/api/response-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7D,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAW7D;AAyBD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA0B1F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAW1D;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,YAAY,CA6B3F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,YAAiB,IAChD,SAAS,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC,YAAY,CAAC,oCAqBtE;AAED;;GAEG;AACH,wBAAgB,aAAa;;;;;;EA0B5B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAc1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,GAAE,MAAc,GAAG,MAAM,CAAC,OAAO,CAO5E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAQ9E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,YAAY,CAKxD;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ChB,CAAC;AAEX;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC5B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAsCvC"}
1
+ {"version":3,"file":"response-cache.d.ts","sourceRoot":"","sources":["../../src/api/response-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAWzD;AAyBD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA0BlF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAW1D;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,GAAG,QAAQ,CA6BnF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,YAAiB,IAChD,SAAS,OAAO,EAAE,MAAM,MAAM,OAAO,CAAC,QAAQ,CAAC,uBAqB9D;AAED;;GAEG;AACH,wBAAgB,aAAa;;;;;;EA0B5B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAc1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,GAAE,MAAc,GAAG,MAAM,CAAC,OAAO,CAO5E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,CAQtE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,QAAQ,CAKpD;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ChB,CAAC;AAEX;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC5B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAsCvC"}
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * Implements HTTP caching for API responses
5
5
  */
6
- import { NextResponse } from 'next/server';
7
6
  import { logger } from '../observability/logger.js';
8
7
  // In-memory cache store (no external cache dependency needed)
9
8
  const cacheStore = new Map();
@@ -58,7 +57,7 @@ export async function getCachedResponse(request) {
58
57
  const headers = new Headers(entry.response.headers);
59
58
  headers.set('X-Cache', 'HIT');
60
59
  headers.set('Age', age.toString());
61
- return new NextResponse(entry.response.body, {
60
+ return new Response(entry.response.body, {
62
61
  status: entry.response.status,
63
62
  statusText: entry.response.statusText,
64
63
  headers,
@@ -250,7 +249,7 @@ export function checkETag(request, etag) {
250
249
  * Create 304 Not Modified response
251
250
  */
252
251
  export function createNotModifiedResponse() {
253
- return new NextResponse(null, {
252
+ return new Response(null, {
254
253
  status: 304,
255
254
  statusText: 'Not Modified',
256
255
  });
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/client/admin/layout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,eAAe,2CAiBvE"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/client/admin/layout.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,eAAe,2CAiBvE"}
@@ -1,7 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // RevealUI Admin Layout - Local implementation
3
- import Head from 'next/head';
4
2
  import { ServerFunctionProvider } from './context/ServerFunctionContext.js';
5
3
  export function RootLayout({ children, serverFunction }) {
6
- return (_jsxs("html", { lang: "en", children: [_jsxs(Head, { children: [_jsx("meta", { charSet: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsx("title", { children: "RevealUI Admin" })] }), _jsx("body", { className: "antialiased", children: _jsx(ServerFunctionProvider, { serverFunction: serverFunction, children: _jsx("main", { id: "revealui-admin", className: "min-h-screen", children: children }) }) })] }));
4
+ return (_jsxs("html", { lang: "en", children: [_jsxs("head", { children: [_jsx("meta", { charSet: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsx("title", { children: "RevealUI Admin" })] }), _jsx("body", { className: "antialiased", children: _jsx(ServerFunctionProvider, { serverFunction: serverFunction, children: _jsx("main", { id: "revealui-admin", className: "min-h-screen", children: children }) }) })] }));
7
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/utils/apiClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/utils/apiClient.ts"],"names":[],"mappings":"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"}
@@ -63,8 +63,23 @@ export class APIClient {
63
63
  * Make an authenticated API request
64
64
  */
65
65
  async request(endpoint, options = {}) {
66
+ const Unsafe = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
67
+ const method = (options.method ?? 'GET').toUpperCase();
68
+ let csrfToken;
69
+ if (Unsafe.has(method) && typeof document !== 'undefined') {
70
+ for (const part of document.cookie.split(';')) {
71
+ const eqIdx = part.indexOf('=');
72
+ if (eqIdx === -1)
73
+ continue;
74
+ if (part.slice(0, eqIdx).trim() === 'revealui-csrf') {
75
+ csrfToken = part.slice(eqIdx + 1).trim() || undefined;
76
+ break;
77
+ }
78
+ }
79
+ }
66
80
  const headers = {
67
81
  'Content-Type': 'application/json',
82
+ ...(csrfToken ? { 'X-CSRF-Token': csrfToken } : {}),
68
83
  ...options.headers,
69
84
  };
70
85
  const url = `${this.baseURL}${endpoint}`;
@@ -72,7 +87,7 @@ export class APIClient {
72
87
  const response = await fetch(url, {
73
88
  ...options,
74
89
  headers,
75
- credentials: 'include', // Include cookies for authentication
90
+ credentials: 'include',
76
91
  });
77
92
  // Handle authentication errors
78
93
  if (response.status === 401) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/richtext/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/richtext/index.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,6 @@ export { ImagePlugin } from './plugins/ImagePlugin.js';
34
34
  export { PastePlugin } from './plugins/PastePlugin.js';
35
35
  // Toolbar plugins
36
36
  export { ToolbarPlugin } from './plugins/ToolbarPlugin.js';
37
- // Main editor component - production ready
38
37
  export { RichTextEditor, richTextEditorStyles } from './RichTextEditor.js';
39
38
  // Feature client components (implementations coming in Phase 2)
40
39
  // These now return a minimal React component for tree-shaking
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAwC9B,wBAAsB,MAAM,CAC1B,MAAM,EAAE,sBAAsB,EAC9B,EAAE,EAAE,wBAAwB,GAAG,IAAI,EACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CA0HzB"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAwC9B,wBAAsB,MAAM,CAC1B,MAAM,EAAE,sBAAsB,EAC9B,EAAE,EAAE,wBAAwB,GAAG,IAAI,EACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CA+IzB"}
@@ -111,12 +111,30 @@ export async function create(config, db, options) {
111
111
  return serializeValueForDatabase(data[key]);
112
112
  });
113
113
  const query = insertDocumentQuery(tableName, columns);
114
+ // Wrap INSERT + read-back in a single transaction so both run on the same
115
+ // connection and snapshot. Without this, pooled pg adapters check out a
116
+ // fresh client per `db.query()` call, and the post-insert `findByID` can
117
+ // see a pre-INSERT snapshot — throwing "Document not found in database"
118
+ // even though the row is present (see revealui#383).
119
+ //
120
+ // Adapters without `transaction` (e.g. test mocks, in-memory stores with
121
+ // same-connection visibility like PGlite used directly without our wrapper)
122
+ // fall back to sequential queries.
123
+ if (db.transaction) {
124
+ return await db.transaction(async (tx) => {
125
+ await tx.query(query, [id, ...values]);
126
+ // The create operation has already passed access control above.
127
+ // The read-back must use overrideAccess to avoid a second access
128
+ // check that fails when there's no req context (e.g. bootstrap).
129
+ const createdDoc = await findByID(config, tx, { id, overrideAccess: true });
130
+ if (!createdDoc) {
131
+ throw new Error(`Failed to retrieve created document with id ${id}. Document not found in database.`);
132
+ }
133
+ return createdDoc;
134
+ });
135
+ }
114
136
  await db.query(query, [id, ...values]);
115
- // For SQLite with WAL mode, writes are immediately visible to readers on the same connection
116
- // Return the created document by fetching it from the database
117
- // This ensures we return what was actually stored (with proper JSON deserialization)
118
- // ID is already a string, so use it directly
119
- const createdDoc = await findByID(config, db, { id });
137
+ const createdDoc = await findByID(config, db, { id, overrideAccess: true });
120
138
  if (!createdDoc) {
121
139
  throw new Error(`Failed to retrieve created document with id ${id}. Document not found in database.`);
122
140
  }
@@ -30,6 +30,20 @@ export interface UniversalPostgresAdapterConfig {
30
30
  * Force a specific provider (optional, auto-detected if not provided)
31
31
  */
32
32
  provider?: 'neon' | 'supabase' | 'electric';
33
+ /**
34
+ * Shared pg Pool instance. When provided, the adapter uses this pool
35
+ * instead of creating its own. This eliminates dual-pool issues where
36
+ * the CMS adapter and the Drizzle ORM client create separate connections
37
+ * to the same database. Pass the same pool to both systems.
38
+ */
39
+ pool?: import('pg').Pool;
40
+ /**
41
+ * Async factory that returns a shared pg Pool. Called once during
42
+ * initializeConnection. Use this instead of `pool` when the pool
43
+ * source can't be imported at the top level (e.g., Turbopack async
44
+ * module init issues in Next.js).
45
+ */
46
+ poolFactory?: () => Promise<import('pg').Pool | null>;
33
47
  }
34
48
  /**
35
49
  * Creates a universal PostgreSQL adapter that works with Neon, Supabase, and Electric Postgres
@@ -1 +1 @@
1
- {"version":3,"file":"universal-postgres.d.ts","sourceRoot":"","sources":["../../src/database/universal-postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,mBAAmB,CAAC;AAIzE,MAAM,WAAW,8BAA8B;IAC7C;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;CAC7C;AAmGD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,GAAE,8BAAmC,GAC1C,eAAe,CAwcjB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,UAAQ,GAAG,IAAI,CAa/D;AAGD,eAAe,wBAAwB,CAAC"}
1
+ {"version":3,"file":"universal-postgres.d.ts","sourceRoot":"","sources":["../../src/database/universal-postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,eAAe,EAA4C,MAAM,mBAAmB,CAAC;AAInG,MAAM,WAAW,8BAA8B;IAC7C;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5C;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,IAAI,CAAC;IACzB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;CACvD;AAmGD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,GAAE,8BAAmC,GAC1C,eAAe,CAsjBjB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,UAAQ,GAAG,IAAI,CAa/D;AAGD,eAAe,wBAAwB,CAAC"}
@@ -97,8 +97,64 @@ function detectProvider(connectionString) {
97
97
  */
98
98
  export function universalPostgresAdapter(config = {}) {
99
99
  let queryFn;
100
+ let transactionFn;
100
101
  let provider = 'generic';
102
+ const buildPgTransactionFn = (pool, providerLabel) => {
103
+ return async (fn) => {
104
+ const client = await pool.connect();
105
+ try {
106
+ await client.query('BEGIN');
107
+ const tx = {
108
+ query: async (queryString, values = []) => {
109
+ const result = await client.query(queryString, values);
110
+ return {
111
+ rows: safeParseRevealDocuments(result.rows),
112
+ rowCount: result.rowCount || 0,
113
+ };
114
+ },
115
+ };
116
+ const result = await fn(tx);
117
+ await client.query('COMMIT');
118
+ return result;
119
+ }
120
+ catch (error) {
121
+ try {
122
+ await client.query('ROLLBACK');
123
+ }
124
+ catch (rollbackErr) {
125
+ defaultLogger.error(`${providerLabel} transaction rollback failed after error:`, rollbackErr);
126
+ }
127
+ throw error;
128
+ }
129
+ finally {
130
+ client.release();
131
+ }
132
+ };
133
+ };
101
134
  const initializeConnection = async () => {
135
+ // Fast path: shared pool provided — skip all pool creation and provider detection.
136
+ // The caller (typically revealui.config.ts) passes the same pg.Pool that the
137
+ // Drizzle ORM client uses, eliminating the dual-connection-pool architecture.
138
+ // Resolve shared pool from either direct `pool` or async `poolFactory`
139
+ const sharedPool = config.pool ?? (config.poolFactory ? await config.poolFactory() : null);
140
+ if (sharedPool) {
141
+ provider = 'generic';
142
+ queryFn = async (queryString, values = []) => {
143
+ const client = await sharedPool.connect();
144
+ try {
145
+ const result = await client.query(queryString, values);
146
+ return {
147
+ rows: safeParseRevealDocuments(result.rows),
148
+ rowCount: result.rowCount || 0,
149
+ };
150
+ }
151
+ finally {
152
+ client.release();
153
+ }
154
+ };
155
+ transactionFn = buildPgTransactionFn(sharedPool, 'shared-pool');
156
+ return;
157
+ }
102
158
  // Allow explicit electric provider without a connection string (PGlite local)
103
159
  let connectionString;
104
160
  if (config.provider === 'electric') {
@@ -151,6 +207,7 @@ export function universalPostgresAdapter(config = {}) {
151
207
  throw error;
152
208
  }
153
209
  };
210
+ transactionFn = buildPgTransactionFn(neonPool, 'Neon');
154
211
  break;
155
212
  }
156
213
  case 'supabase': {
@@ -181,6 +238,7 @@ export function universalPostgresAdapter(config = {}) {
181
238
  client.release();
182
239
  }
183
240
  };
241
+ transactionFn = buildPgTransactionFn(pool, 'Supabase (txn-pool)');
184
242
  }
185
243
  else {
186
244
  // Use pg library for session pooling or direct connections (port 5432)
@@ -208,6 +266,7 @@ export function universalPostgresAdapter(config = {}) {
208
266
  throw error;
209
267
  }
210
268
  };
269
+ transactionFn = buildPgTransactionFn(pool, 'Supabase');
211
270
  }
212
271
  break;
213
272
  }
@@ -227,6 +286,23 @@ export function universalPostgresAdapter(config = {}) {
227
286
  rowCount: result.rowCount || 0,
228
287
  };
229
288
  };
289
+ // PGlite ships a native transaction(fn) with its own tx.query — wrap it
290
+ // so the callback sees a QueryableDatabaseAdapter.
291
+ transactionFn = async (fn) => {
292
+ // biome-ignore lint/style/noNonNullAssertion: db is set above in the electric branch
293
+ return await db.transaction(async (pgliteTx) => {
294
+ const tx = {
295
+ query: async (queryString, values = []) => {
296
+ const result = await pgliteTx.query(queryString, values);
297
+ return {
298
+ rows: safeParseRevealDocuments(result.rows),
299
+ rowCount: result.rowCount || 0,
300
+ };
301
+ },
302
+ };
303
+ return await fn(tx);
304
+ });
305
+ };
230
306
  break;
231
307
  }
232
308
  default: {
@@ -257,6 +333,7 @@ export function universalPostgresAdapter(config = {}) {
257
333
  throw error;
258
334
  }
259
335
  };
336
+ transactionFn = buildPgTransactionFn(pool, 'PostgreSQL');
260
337
  break;
261
338
  }
262
339
  }
@@ -333,6 +410,26 @@ export function universalPostgresAdapter(config = {}) {
333
410
  }
334
411
  return queryFn(queryString, values);
335
412
  },
413
+ async transaction(fn) {
414
+ if (!initialized) {
415
+ await initializeConnection();
416
+ initialized = true;
417
+ }
418
+ // Flush pending table creations before opening a transaction so the
419
+ // schema is in place on the same connection we're about to hold.
420
+ const pendingCreations = getWorkerPendingTableCreations();
421
+ if (pendingCreations.length > 0) {
422
+ try {
423
+ await Promise.all(pendingCreations);
424
+ pendingCreations.length = 0;
425
+ }
426
+ catch (error) {
427
+ defaultLogger.error('Failed to create tables before transaction:', error);
428
+ throw error;
429
+ }
430
+ }
431
+ return transactionFn(fn);
432
+ },
336
433
  // Create table schema for PGlite provider
337
434
  // For other providers, tables should be created via migrations
338
435
  createTable: config.provider === 'electric' ||
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module @revealui/core/fieldTraversal
8
8
  */
9
- import type { RevealUITraverseFieldsArgs, RevealUITraverseFieldsResult } from './types/legacy.js';
9
+ import type { RevealUITraverseFieldsArgs, RevealUITraverseFieldsResult } from './types/internal.js';
10
10
  /**
11
11
  * Traversal mode determines how fields are processed
12
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"fieldTraversal.d.ts","sourceRoot":"","sources":["../src/fieldTraversal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAElG;;GAEG;AACH,KAAK,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAErF;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,0BAA0B,EAChC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,4BAA4B,CAAC,CA4DvC"}
1
+ {"version":3,"file":"fieldTraversal.d.ts","sourceRoot":"","sources":["../src/fieldTraversal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEpG;;GAEG;AACH,KAAK,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAErF;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,0BAA0B,EAChC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,4BAA4B,CAAC,CA4DvC"}