@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.
- package/README.md +1 -1
- package/dist/api/compression.d.ts +3 -4
- package/dist/api/compression.d.ts.map +1 -1
- package/dist/api/compression.js +1 -2
- package/dist/api/rate-limit.d.ts +10 -11
- package/dist/api/rate-limit.d.ts.map +1 -1
- package/dist/api/rate-limit.js +9 -16
- package/dist/api/response-cache.d.ts +8 -9
- package/dist/api/response-cache.d.ts.map +1 -1
- package/dist/api/response-cache.js +2 -3
- package/dist/client/admin/layout.d.ts.map +1 -1
- package/dist/client/admin/layout.js +1 -3
- package/dist/client/admin/utils/apiClient.d.ts.map +1 -1
- package/dist/client/admin/utils/apiClient.js +16 -1
- package/dist/client/richtext/index.d.ts.map +1 -1
- package/dist/client/richtext/index.js +0 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +23 -5
- package/dist/database/universal-postgres.d.ts +14 -0
- package/dist/database/universal-postgres.d.ts.map +1 -1
- package/dist/database/universal-postgres.js +97 -0
- package/dist/fieldTraversal.d.ts +1 -1
- package/dist/fieldTraversal.d.ts.map +1 -1
- package/dist/generated/types/admin.d.ts +2 -2
- package/dist/generated/types/admin.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/instance/methods/create.d.ts.map +1 -1
- package/dist/instance/methods/create.js +3 -2
- package/dist/license-encryption.d.ts +11 -2
- package/dist/license-encryption.d.ts.map +1 -1
- package/dist/license-encryption.js +77 -22
- package/dist/license.d.ts +106 -8
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +243 -35
- package/dist/nextjs/index.d.ts +0 -1
- package/dist/nextjs/index.d.ts.map +1 -1
- package/dist/nextjs/index.js +7 -2
- package/dist/nextjs/withRevealUI.d.ts +29 -1
- package/dist/nextjs/withRevealUI.d.ts.map +1 -1
- package/dist/observability/logger.d.ts +0 -4
- package/dist/observability/logger.d.ts.map +1 -1
- package/dist/observability/logger.js +2 -29
- package/dist/observability/metrics.d.ts +25 -0
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +26 -0
- package/dist/revealui.d.ts +0 -5
- package/dist/revealui.d.ts.map +1 -1
- package/dist/revealui.js +0 -10
- package/dist/revforge-license.d.ts +60 -0
- package/dist/revforge-license.d.ts.map +1 -0
- package/dist/revforge-license.js +74 -0
- package/dist/richtext/exports/server/rsc.d.ts +2 -17
- package/dist/richtext/exports/server/rsc.d.ts.map +1 -1
- package/dist/richtext/exports/server/rsc.js +9 -54
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/{legacy.d.ts → internal.d.ts} +1 -1
- package/dist/types/internal.d.ts.map +1 -0
- package/dist/types/runtime.d.ts +12 -0
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/utils/api-wrapper.d.ts +4 -6
- package/dist/utils/api-wrapper.d.ts.map +1 -1
- package/dist/utils/api-wrapper.js +8 -10
- package/package.json +71 -24
- package/dist/types/legacy.d.ts.map +0 -1
- /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
|
|
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:
|
|
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:
|
|
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:
|
|
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;
|
|
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"}
|
package/dist/api/compression.js
CHANGED
|
@@ -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
|
|
110
|
+
const newResponse = new Response(compressed, {
|
|
112
111
|
status: response.status,
|
|
113
112
|
statusText: response.statusText,
|
|
114
113
|
headers: response.headers,
|
package/dist/api/rate-limit.d.ts
CHANGED
|
@@ -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:
|
|
11
|
-
skip?: (request:
|
|
12
|
-
handler?: (request:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
89
|
-
export declare function checkSlidingWindowRateLimit(request:
|
|
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:
|
|
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":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/api/rate-limit.ts"],"names":[],"mappings":"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"}
|
package/dist/api/rate-limit.js
CHANGED
|
@@ -3,29 +3,22 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Implements rate limiting to prevent API abuse
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
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/
|
|
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
|
-
|
|
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
|
|
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:
|
|
17
|
+
export declare function generateCacheKey(request: Request): string;
|
|
19
18
|
/**
|
|
20
19
|
* Get cached response
|
|
21
20
|
*/
|
|
22
|
-
export declare function getCachedResponse(request:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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():
|
|
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;
|
|
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
|
|
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
|
|
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":"
|
|
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(
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,cAAc;IAC7C,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACX,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,cAAc,mBAAmB;IACjC,aAAa,kBAAkB;IAC/B,UAAU,eAAe;IACzB,QAAQ,cAAc;IACtB,MAAM,WAAW;CAClB;AAED,qBAAa,QAAS,SAAQ,KAAK;IAExB,IAAI,EAAE,YAAY;IAElB,MAAM,CAAC,EAAE,MAAM;IACf,KAAK,CAAC,EAAE,MAAM;gBAHd,IAAI,EAAE,YAAY,EACzB,OAAO,EAAE,MAAM,EACR,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,KAAK,CAAC,EAAE,MAAM,YAAA;CAKxB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+BD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,gBAAqB;IAW1C;;OAEG;YACW,OAAO;
|
|
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',
|
|
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":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,YAAY,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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' ||
|
package/dist/fieldTraversal.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module @revealui/core/fieldTraversal
|
|
8
8
|
*/
|
|
9
|
-
import type { RevealUITraverseFieldsArgs, RevealUITraverseFieldsResult } from './types/
|
|
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,
|
|
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"}
|