@revealui/core 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -30
- package/dist/api/rate-limit.d.ts +1 -1
- package/dist/api/rate-limit.d.ts.map +1 -1
- package/dist/api/rate-limit.js +16 -1
- package/dist/api/rest.js +2 -2
- package/dist/caching/cdn-config.d.ts +2 -2
- package/dist/caching/cdn-config.d.ts.map +1 -1
- package/dist/caching/cdn-config.js +1 -15
- package/dist/caching/edge-cache.d.ts.map +1 -1
- package/dist/caching/edge-cache.js +8 -4
- package/dist/caching/service-worker.d.ts +7 -18
- package/dist/caching/service-worker.d.ts.map +1 -1
- package/dist/caching/service-worker.js +2 -2
- package/dist/client/admin/utils/auth.d.ts +0 -4
- package/dist/client/admin/utils/auth.d.ts.map +1 -1
- package/dist/client/admin/utils/auth.js +0 -6
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +0 -2
- package/dist/collections/operations/create.js +2 -2
- package/dist/config/utils.d.ts.map +1 -1
- package/dist/config/utils.js +19 -5
- package/dist/database/safe-parse.d.ts +26 -0
- package/dist/database/safe-parse.d.ts.map +1 -0
- package/dist/database/safe-parse.js +42 -0
- package/dist/database/universal-postgres.d.ts.map +1 -1
- package/dist/database/universal-postgres.js +12 -12
- package/dist/dataloader.d.ts.map +1 -1
- package/dist/dataloader.js +16 -2
- package/dist/error-handling/error-reporter.d.ts +5 -4
- package/dist/error-handling/error-reporter.d.ts.map +1 -1
- package/dist/error-handling/error-reporter.js +19 -48
- package/dist/error-handling/index.d.ts +1 -1
- package/dist/error-handling/index.d.ts.map +1 -1
- package/dist/error-handling/index.js +1 -1
- package/dist/features.d.ts +5 -1
- package/dist/features.d.ts.map +1 -1
- package/dist/features.js +6 -3
- package/dist/generated/types/index.d.ts +0 -3
- package/dist/generated/types/index.d.ts.map +1 -1
- package/dist/generated/types/index.js +0 -7
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/instance/RevealUIInstance.d.ts.map +1 -1
- package/dist/instance/RevealUIInstance.js +44 -50
- package/dist/instance/methods/create.d.ts.map +1 -1
- package/dist/instance/methods/create.js +4 -1
- package/dist/instance/methods/delete.d.ts.map +1 -1
- package/dist/instance/methods/delete.js +4 -1
- package/dist/instance/methods/hooks.d.ts.map +1 -1
- package/dist/instance/methods/hooks.js +3 -1
- package/dist/instance/methods/update.d.ts.map +1 -1
- package/dist/instance/methods/update.js +4 -1
- package/dist/license.d.ts +14 -5
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +47 -11
- package/dist/observability/health-check.d.ts +1 -1
- package/dist/observability/health-check.d.ts.map +1 -1
- package/dist/observability/health-check.js +37 -7
- package/dist/optimization/code-splitting.d.ts +0 -13
- package/dist/optimization/code-splitting.d.ts.map +1 -1
- package/dist/optimization/code-splitting.js +0 -13
- package/dist/queries/queryBuilder.d.ts.map +1 -1
- package/dist/queries/queryBuilder.js +6 -3
- package/dist/security/auth.d.ts.map +1 -1
- package/dist/security/auth.js +8 -6
- package/dist/security/encryption.d.ts.map +1 -1
- package/dist/security/encryption.js +15 -4
- package/dist/security/gdpr.d.ts +1 -1
- package/dist/security/gdpr.d.ts.map +1 -1
- package/dist/security/gdpr.js +4 -9
- package/dist/types/generated.d.ts +0 -2
- package/dist/types/generated.d.ts.map +1 -1
- package/dist/types/generated.js +0 -1
- package/package.json +2 -11
package/README.md
CHANGED
|
@@ -1,50 +1,157 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @revealui/core
|
|
2
2
|
|
|
3
|
-
The core RevealUI
|
|
3
|
+
The core CMS engine for RevealUI — collections, admin UI, rich text, security, observability, and plugins.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
⚙️ [Source code](https://github.com/RevealUIStudio/revealui/tree/main/packages/core)
|
|
7
|
-
📦 [npm package](https://npmjs.com/package/revealui)
|
|
5
|
+
## Features
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
- **Collections & CRUD** — Define content types with field hooks, access control, and validation
|
|
8
|
+
- **Admin Dashboard** — Ready-to-use React admin UI (collection browser, document editor, global forms)
|
|
9
|
+
- **Rich Text** — Lexical-based editor with 20+ features (bold, headings, lists, links, images, blocks)
|
|
10
|
+
- **Security** — CORS, CSP, HSTS, RBAC/ABAC policy engine, encryption (AES-256-GCM), audit logging
|
|
11
|
+
- **GDPR Compliance** — Consent management, data export, deletion, anonymization, breach reporting
|
|
12
|
+
- **Observability** — Structured logging, process health monitoring, alert system, graceful shutdown
|
|
13
|
+
- **Plugins** — Extensible plugin system (form builder, nested docs, redirects)
|
|
14
|
+
- **Feature Gating** — Tier-based licensing (free, pro, max, enterprise/Forge) with JWT license keys
|
|
15
|
+
- **Database** — PostgreSQL adapters (NeonDB + PGlite for testing), connection pooling, SSL/TLS
|
|
16
|
+
- **Storage** — Pluggable storage interface (Vercel Blob adapter included)
|
|
10
17
|
|
|
11
|
-
|
|
12
|
-
- **Types**: All RevealUI types (previously `@revealui/types`)
|
|
13
|
-
- **Generated Code**: Auto-generated types, components, hooks, etc. (previously `@revealui/generated`)
|
|
14
|
-
- **Core Framework**: Main framework functionality
|
|
18
|
+
## Installation
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
```bash
|
|
21
|
+
pnpm add @revealui/core
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
### Configuration
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import { buildConfig } from '@revealui/core/config'
|
|
30
|
+
|
|
31
|
+
const config = buildConfig({
|
|
32
|
+
collections: [Posts, Categories, Users],
|
|
33
|
+
globals: [Settings, Navigation],
|
|
34
|
+
plugins: [formBuilder(), nestedDocs()],
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Collections
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import type { RevealUICollection } from '@revealui/core'
|
|
42
|
+
|
|
43
|
+
const Posts: RevealUICollection = {
|
|
44
|
+
slug: 'posts',
|
|
45
|
+
fields: [
|
|
46
|
+
{ name: 'title', type: 'text', required: true },
|
|
47
|
+
{ name: 'content', type: 'richText' },
|
|
48
|
+
{ name: 'status', type: 'select', options: ['draft', 'published'] },
|
|
49
|
+
],
|
|
50
|
+
hooks: {
|
|
51
|
+
beforeChange: [({ data }) => ({ ...data, updatedAt: new Date() })],
|
|
52
|
+
},
|
|
53
|
+
access: {
|
|
54
|
+
read: () => true,
|
|
55
|
+
create: ({ req }) => !!req.user,
|
|
56
|
+
},
|
|
57
|
+
}
|
|
58
|
+
```
|
|
17
59
|
|
|
18
|
-
###
|
|
60
|
+
### Server-Side API
|
|
19
61
|
|
|
20
62
|
```typescript
|
|
21
|
-
|
|
22
|
-
import type { Config, Page, Post } from '@revealui/core/types'
|
|
63
|
+
import { revealui } from '@revealui/core/server'
|
|
23
64
|
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
import type { RevealConfig } from '@revealui/core/types/core'
|
|
65
|
+
// Create, read, update, delete
|
|
66
|
+
const post = await revealui.create({ collection: 'posts', data: { title: 'Hello' } })
|
|
67
|
+
const posts = await revealui.find({ collection: 'posts', where: { status: { equals: 'published' } } })
|
|
28
68
|
```
|
|
29
69
|
|
|
30
|
-
###
|
|
70
|
+
### Admin UI (React)
|
|
31
71
|
|
|
32
72
|
```typescript
|
|
33
|
-
|
|
34
|
-
import { PostCard } from '@revealui/core/generated/components'
|
|
73
|
+
import { AdminDashboard } from '@revealui/core/admin'
|
|
35
74
|
|
|
36
|
-
//
|
|
37
|
-
|
|
75
|
+
// Full admin interface with collection browser, document editor, global forms
|
|
76
|
+
function App() {
|
|
77
|
+
return <AdminDashboard />
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Rich Text
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
import { RichTextEditor, BoldFeature, HeadingFeature, ListFeature } from '@revealui/core/richtext/client'
|
|
85
|
+
|
|
86
|
+
<RichTextEditor
|
|
87
|
+
features={[BoldFeature(), HeadingFeature(), ListFeature()]}
|
|
88
|
+
onChange={(json) => console.log(json)}
|
|
89
|
+
/>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Feature Gating
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import { isLicensed, isFeatureEnabled } from '@revealui/core/features'
|
|
96
|
+
|
|
97
|
+
if (isLicensed('pro')) {
|
|
98
|
+
// Pro-tier feature
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (isFeatureEnabled('ai')) {
|
|
102
|
+
// AI features enabled
|
|
103
|
+
}
|
|
104
|
+
```
|
|
38
105
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
106
|
+
## Exports
|
|
107
|
+
|
|
108
|
+
| Subpath | Purpose |
|
|
109
|
+
|---------|---------|
|
|
110
|
+
| `@revealui/core` | Main entry (RevealUI instance) |
|
|
111
|
+
| `@revealui/core/server` | Server-side CRUD API |
|
|
112
|
+
| `@revealui/core/client` | Client-side React hooks and utilities |
|
|
113
|
+
| `@revealui/core/config` | Configuration builder |
|
|
114
|
+
| `@revealui/core/admin` | Admin dashboard components |
|
|
115
|
+
| `@revealui/core/richtext` | Rich text server utilities |
|
|
116
|
+
| `@revealui/core/richtext/client` | Lexical editor React components |
|
|
117
|
+
| `@revealui/core/richtext/html` | HTML serialization |
|
|
118
|
+
| `@revealui/core/richtext/rsc` | React Server Component support |
|
|
119
|
+
| `@revealui/core/security` | Security infrastructure |
|
|
120
|
+
| `@revealui/core/auth` | Auth utilities |
|
|
121
|
+
| `@revealui/core/database` | Database adapters |
|
|
122
|
+
| `@revealui/core/storage` | Storage adapters |
|
|
123
|
+
| `@revealui/core/plugins` | Plugin system |
|
|
124
|
+
| `@revealui/core/features` | Feature flags |
|
|
125
|
+
| `@revealui/core/license` | License validation |
|
|
126
|
+
| `@revealui/core/monitoring` | Health monitoring |
|
|
127
|
+
| `@revealui/core/observability/logger` | Structured logging |
|
|
128
|
+
| `@revealui/core/types` | TypeScript type definitions |
|
|
129
|
+
| `@revealui/core/nextjs` | Next.js integration middleware |
|
|
130
|
+
| `@revealui/core/utils/*` | Utilities (cache, deep-clone, errors) |
|
|
131
|
+
|
|
132
|
+
## Development
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Build
|
|
136
|
+
pnpm build
|
|
137
|
+
|
|
138
|
+
# Type check
|
|
139
|
+
pnpm typecheck
|
|
140
|
+
|
|
141
|
+
# Run tests
|
|
142
|
+
pnpm test
|
|
143
|
+
|
|
144
|
+
# Watch mode
|
|
145
|
+
pnpm dev
|
|
42
146
|
```
|
|
43
147
|
|
|
44
|
-
##
|
|
148
|
+
## Related
|
|
45
149
|
|
|
46
|
-
|
|
150
|
+
- [Contracts Package](../contracts/README.md) — Zod schemas and TypeScript types
|
|
151
|
+
- [DB Package](../db/README.md) — Drizzle ORM schema
|
|
152
|
+
- [Auth Package](../auth/README.md) — Authentication system
|
|
153
|
+
- [Architecture Guide](../../docs/ARCHITECTURE.md)
|
|
47
154
|
|
|
48
|
-
##
|
|
155
|
+
## License
|
|
49
156
|
|
|
50
|
-
|
|
157
|
+
MIT
|
package/dist/api/rate-limit.d.ts
CHANGED
|
@@ -29,7 +29,7 @@ export declare function checkRateLimit(request: NextRequest, config: RateLimitCo
|
|
|
29
29
|
*/
|
|
30
30
|
export declare function createRateLimitMiddleware(config: RateLimitConfig): (request: NextRequest, next: () => Promise<NextResponse>) => Promise<NextResponse<unknown>>;
|
|
31
31
|
/**
|
|
32
|
-
* Cleanup expired rate limit entries
|
|
32
|
+
* Cleanup expired rate limit entries across all stores
|
|
33
33
|
*/
|
|
34
34
|
export declare function cleanupRateLimits(): number;
|
|
35
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/api/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG5D,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAA;IAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAA;IACxC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,YAAY,CAAA;CACjD;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AA0BD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAe,GACtB;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CA0CA;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,IACjD,SAAS,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC,YAAY,CAAC,oCAiBtE;AA8BD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/api/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG5D,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAA;IAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAA;IACxC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,YAAY,CAAA;CACjD;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AA0BD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAe,GACtB;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CA0CA;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,IACjD,SAAS,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC,YAAY,CAAC,oCAiBtE;AA8BD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA6B1C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,GAAE,MAAc,GAAG,MAAM,CAAC,OAAO,CAOhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB;;;;EAkBhC;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;CAoCrB,CAAA;AAEV;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,aAhKxD,WAAW,QAAQ,MAAM,OAAO,CAAC,YAAY,CAAC,oCAyKtE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,aA9K1D,WAAW,QAAQ,MAAM,OAAO,CAAC,YAAY,CAAC,oCAsLtE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,aA3L5D,WAAW,QAAQ,MAAM,OAAO,CAAC,YAAY,CAAC,oCAqMtE;AAWD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAe,GACtB;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CA4BA;AAYD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/C;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CAqCA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAEnE"}
|
package/dist/api/rate-limit.js
CHANGED
|
@@ -102,7 +102,7 @@ function createRateLimitResponse(result) {
|
|
|
102
102
|
});
|
|
103
103
|
}
|
|
104
104
|
/**
|
|
105
|
-
* Cleanup expired rate limit entries
|
|
105
|
+
* Cleanup expired rate limit entries across all stores
|
|
106
106
|
*/
|
|
107
107
|
export function cleanupRateLimits() {
|
|
108
108
|
const now = Date.now();
|
|
@@ -113,6 +113,21 @@ export function cleanupRateLimits() {
|
|
|
113
113
|
cleaned++;
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
|
+
// Evict stale sliding window entries (no timestamps within last hour)
|
|
117
|
+
for (const [key, entry] of slidingWindowStore.entries()) {
|
|
118
|
+
entry.timestamps = entry.timestamps.filter((ts) => now - ts < 3_600_000);
|
|
119
|
+
if (entry.timestamps.length === 0) {
|
|
120
|
+
slidingWindowStore.delete(key);
|
|
121
|
+
cleaned++;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Evict stale token bucket entries (idle for more than 1 hour)
|
|
125
|
+
for (const [key, entry] of tokenBucketStore.entries()) {
|
|
126
|
+
if (now - entry.lastRefill > 3_600_000) {
|
|
127
|
+
tokenBucketStore.delete(key);
|
|
128
|
+
cleaned++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
116
131
|
return cleaned;
|
|
117
132
|
}
|
|
118
133
|
/**
|
package/dist/api/rest.js
CHANGED
|
@@ -296,7 +296,7 @@ async function handleCollectionOperation(method, collection, id, revealui, reque
|
|
|
296
296
|
// Sanitize error message for client (don't expose internal details)
|
|
297
297
|
const clientMessage = status >= 500 ? 'An internal server error occurred' : message;
|
|
298
298
|
return new Response(JSON.stringify({
|
|
299
|
-
message,
|
|
299
|
+
message: clientMessage,
|
|
300
300
|
errors: [{ message: clientMessage }],
|
|
301
301
|
}), {
|
|
302
302
|
status,
|
|
@@ -358,7 +358,7 @@ async function handleGlobalOperation(method, global, revealui, request, options)
|
|
|
358
358
|
// Sanitize error message for client (don't expose internal details)
|
|
359
359
|
const clientMessage = status >= 500 ? 'An internal server error occurred' : message;
|
|
360
360
|
return new Response(JSON.stringify({
|
|
361
|
-
message,
|
|
361
|
+
message: clientMessage,
|
|
362
362
|
errors: [{ message: clientMessage }],
|
|
363
363
|
}), {
|
|
364
364
|
status,
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* CDN Cache Configuration
|
|
8
8
|
*/
|
|
9
9
|
export interface CDNCacheConfig {
|
|
10
|
-
provider?: 'cloudflare' | 'vercel' | '
|
|
10
|
+
provider?: 'cloudflare' | 'vercel' | 'fastly' | 'custom';
|
|
11
11
|
zones?: string[];
|
|
12
12
|
ttl?: number;
|
|
13
13
|
staleWhileRevalidate?: number;
|
|
@@ -77,7 +77,7 @@ export declare const CDN_CACHE_PRESETS: {
|
|
|
77
77
|
* CDN Purge Configuration
|
|
78
78
|
*/
|
|
79
79
|
export interface CDNPurgeConfig {
|
|
80
|
-
provider: 'cloudflare' | 'vercel' | '
|
|
80
|
+
provider: 'cloudflare' | 'vercel' | 'fastly';
|
|
81
81
|
apiKey?: string;
|
|
82
82
|
apiSecret?: string;
|
|
83
83
|
zoneId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdn-config.d.ts","sourceRoot":"","sources":["../../src/caching/cdn-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,YAAY,GAAG,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"cdn-config.d.ts","sourceRoot":"","sources":["../../src/caching/cdn-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -113,8 +113,6 @@ export async function purgeCDNCache(urls, config) {
|
|
|
113
113
|
return purgeCloudflare(urls, config);
|
|
114
114
|
case 'vercel':
|
|
115
115
|
return purgeVercel(urls, config);
|
|
116
|
-
case 'cloudfront':
|
|
117
|
-
return purgeCloudFront(urls, config);
|
|
118
116
|
case 'fastly':
|
|
119
117
|
return purgeFastly(urls, config);
|
|
120
118
|
default:
|
|
@@ -185,18 +183,6 @@ async function purgeVercel(urls, config) {
|
|
|
185
183
|
};
|
|
186
184
|
}
|
|
187
185
|
}
|
|
188
|
-
/**
|
|
189
|
-
* Purge CloudFront cache
|
|
190
|
-
*/
|
|
191
|
-
async function purgeCloudFront(_urls, _config) {
|
|
192
|
-
// Would require AWS SDK
|
|
193
|
-
// Placeholder implementation
|
|
194
|
-
return {
|
|
195
|
-
success: false,
|
|
196
|
-
purged: 0,
|
|
197
|
-
errors: ['CloudFront purge requires AWS SDK integration'],
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
186
|
/**
|
|
201
187
|
* Purge Fastly cache
|
|
202
188
|
*/
|
|
@@ -329,7 +315,7 @@ export async function warmCDNCache(urls, options = {}) {
|
|
|
329
315
|
}
|
|
330
316
|
const warmed = results.filter((r) => r.success).length;
|
|
331
317
|
const failed = results.filter((r) => !r.success).length;
|
|
332
|
-
const errors = results.
|
|
318
|
+
const errors = results.flatMap((r) => (r.error ? [r.error] : []));
|
|
333
319
|
return { warmed, failed, errors };
|
|
334
320
|
}
|
|
335
321
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-cache.d.ts","sourceRoot":"","sources":["../../src/caching/edge-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG5D;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;CA8Bd,CAAA;AAEV;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAWxC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"edge-cache.d.ts","sourceRoot":"","sources":["../../src/caching/edge-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG5D;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;CA8Bd,CAAA;AAEV;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAC3B,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAWxC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BnD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BnD;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C,CAAC,CA6BD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC9C,CAAC,CA6BD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,gBAAgB,CAAA;IAClE,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;QAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,eAAoB,IAClD,CAAC,EAAE,KAAK,MAAM,EAAE,UAAU,WAAW,KAAG,OAAO,CAAC,CAAC,CAAC,CAkBjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACnE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,EACxC,QAAQ,GAAE;IACR,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CACvB,GACL,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAItC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAA;CACvC;AAED,qBAAa,eAAe;IAGd,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,KAAK,CAA+D;gBAExD,MAAM,EAAE,mBAAmB;IAE/C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG;QAC3B,OAAO,EAAE,OAAO,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAA;KACd;IA+BD;;OAEG;IACH,OAAO,IAAI,IAAI;CAQhB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CA2BvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,CAoBR;AAeD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,qBAAqB,CAUpF;AAeD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE;IACN,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,GACA,YAAY,CAwBd;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,KAAK,CAAC;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAC,GACD,YAAY,CAoBd;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,MAA+D,GACvE,OAAO,CAAC;IACT,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C,CAAC,CAyCD"}
|
|
@@ -49,12 +49,14 @@ export async function generateStaticParams(fetchFn, mapFn) {
|
|
|
49
49
|
export async function revalidateTag(tag, secret) {
|
|
50
50
|
try {
|
|
51
51
|
const url = new URL('/api/revalidate', process.env.NEXT_PUBLIC_URL || 'http://localhost:3000');
|
|
52
|
-
|
|
52
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
53
53
|
if (secret) {
|
|
54
|
-
|
|
54
|
+
headers['x-revalidate-secret'] = secret;
|
|
55
55
|
}
|
|
56
56
|
const response = await fetch(url.toString(), {
|
|
57
57
|
method: 'POST',
|
|
58
|
+
headers,
|
|
59
|
+
body: JSON.stringify({ tag }),
|
|
58
60
|
});
|
|
59
61
|
const data = await response.json();
|
|
60
62
|
return {
|
|
@@ -75,12 +77,14 @@ export async function revalidateTag(tag, secret) {
|
|
|
75
77
|
export async function revalidatePath(path, secret) {
|
|
76
78
|
try {
|
|
77
79
|
const url = new URL('/api/revalidate', process.env.NEXT_PUBLIC_URL || 'http://localhost:3000');
|
|
78
|
-
|
|
80
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
79
81
|
if (secret) {
|
|
80
|
-
|
|
82
|
+
headers['x-revalidate-secret'] = secret;
|
|
81
83
|
}
|
|
82
84
|
const response = await fetch(url.toString(), {
|
|
83
85
|
method: 'POST',
|
|
86
|
+
headers,
|
|
87
|
+
body: JSON.stringify({ path }),
|
|
84
88
|
});
|
|
85
89
|
const data = await response.json();
|
|
86
90
|
return {
|
|
@@ -110,26 +110,11 @@ export declare function getServiceWorkerState(): Promise<{
|
|
|
110
110
|
active: boolean;
|
|
111
111
|
controller: boolean;
|
|
112
112
|
}>;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
*/
|
|
116
|
-
export declare function useServiceWorker(config?: ServiceWorkerConfig): {
|
|
117
|
-
register: () => Promise<null>;
|
|
113
|
+
export interface ServiceWorkerHook {
|
|
114
|
+
register: () => Promise<ServiceWorkerRegistration | null>;
|
|
118
115
|
unregister: () => Promise<boolean>;
|
|
119
116
|
update: () => Promise<void>;
|
|
120
117
|
skipWaitingAndActivate: () => Promise<void>;
|
|
121
|
-
state: {
|
|
122
|
-
registered: boolean;
|
|
123
|
-
installing: boolean;
|
|
124
|
-
waiting: boolean;
|
|
125
|
-
active: boolean;
|
|
126
|
-
controller: boolean;
|
|
127
|
-
};
|
|
128
|
-
} | {
|
|
129
|
-
register: () => Promise<ServiceWorkerRegistration | null>;
|
|
130
|
-
unregister: typeof unregisterServiceWorker;
|
|
131
|
-
update: typeof updateServiceWorker;
|
|
132
|
-
skipWaitingAndActivate: typeof skipWaitingAndActivate;
|
|
133
118
|
state: Promise<{
|
|
134
119
|
registered: boolean;
|
|
135
120
|
installing: boolean;
|
|
@@ -137,7 +122,11 @@ export declare function useServiceWorker(config?: ServiceWorkerConfig): {
|
|
|
137
122
|
active: boolean;
|
|
138
123
|
controller: boolean;
|
|
139
124
|
}>;
|
|
140
|
-
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* React hook for service worker
|
|
128
|
+
*/
|
|
129
|
+
export declare function useServiceWorker(config?: ServiceWorkerConfig): ServiceWorkerHook;
|
|
141
130
|
/**
|
|
142
131
|
* Offline detection
|
|
143
132
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-worker.d.ts","sourceRoot":"","sources":["../../src/caching/service-worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAA;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,iBAAiB,EAAE,mBAI/B,CAAA;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,GAAE,mBAAuC,GAC9C,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CA6C3C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAehE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAczD;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB5D;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;CAenB,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAA;AAEpF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,aAAa,CAAA;CACzB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAgCtD,CAAA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;CAOd,CAAA;AAEV;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBvF;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CASpD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAShE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB,CAAC,CAmBD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAWlE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;CACpB,CAAC,CAwCD;AAED
|
|
1
|
+
{"version":3,"file":"service-worker.d.ts","sourceRoot":"","sources":["../../src/caching/service-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -311,13 +311,13 @@ export function useServiceWorker(config) {
|
|
|
311
311
|
unregister: async () => false,
|
|
312
312
|
update: async () => { },
|
|
313
313
|
skipWaitingAndActivate: async () => { },
|
|
314
|
-
state: {
|
|
314
|
+
state: Promise.resolve({
|
|
315
315
|
registered: false,
|
|
316
316
|
installing: false,
|
|
317
317
|
waiting: false,
|
|
318
318
|
active: false,
|
|
319
319
|
controller: false,
|
|
320
|
-
},
|
|
320
|
+
}),
|
|
321
321
|
};
|
|
322
322
|
}
|
|
323
323
|
return {
|
|
@@ -20,8 +20,4 @@ export declare function clearAuthToken(): void;
|
|
|
20
20
|
* Get Authorization header value
|
|
21
21
|
*/
|
|
22
22
|
export declare function getAuthHeader(): string | null;
|
|
23
|
-
/**
|
|
24
|
-
* Check if user is authenticated
|
|
25
|
-
*/
|
|
26
|
-
export declare function isAuthenticated(): boolean;
|
|
27
23
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/utils/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAoB5C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAG7C
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/client/admin/utils/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAoB5C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAG7C"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export * from './admin/index.js';
|
|
7
7
|
export { useRevealUI, withRevealUIAccess } from './hooks.js';
|
|
8
|
-
export * from './http/index.js';
|
|
9
8
|
export type { FloatingToolbarPluginProps, ImageNodeData, RichTextEditorProps, SerializedImageNode, ToolbarPluginProps, } from './richtext/index.js';
|
|
10
9
|
export { $createImageNode, $isImageNode, FloatingToolbarPlugin, ImageNode, ImageNodeComponent, ImagePlugin, ImageUploadButton, INSERT_IMAGE_COMMAND, OPEN_IMAGE_UPLOAD_COMMAND, richTextEditorStyles, ToolbarPlugin, } from './richtext/index.js';
|
|
11
10
|
export * from './ui/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAA;AAEhC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,kBAAkB,CAAA;AAEhC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAI5D,YAAY,EACV,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,GACd,MAAM,qBAAqB,CAAA;AAE5B,cAAc,eAAe,CAAA"}
|
package/dist/client/index.js
CHANGED
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
export * from './admin/index.js';
|
|
8
8
|
// React hooks
|
|
9
9
|
export { useRevealUI, withRevealUIAccess } from './hooks.js';
|
|
10
|
-
// HTTP fetch utilities
|
|
11
|
-
export * from './http/index.js';
|
|
12
10
|
// Re-export specific items that don't conflict
|
|
13
11
|
export { $createImageNode, $isImageNode, FloatingToolbarPlugin, ImageNode, ImageNodeComponent, ImagePlugin, ImageUploadButton, INSERT_IMAGE_COMMAND, OPEN_IMAGE_UPLOAD_COMMAND, richTextEditorStyles, ToolbarPlugin, } from './richtext/index.js';
|
|
14
12
|
// UI components
|
|
@@ -56,7 +56,7 @@ export async function create(config, db, options) {
|
|
|
56
56
|
// Generate ID if not provided - always ensure it's a string
|
|
57
57
|
const id = String(typeof data.id === 'string' || typeof data.id === 'number'
|
|
58
58
|
? data.id
|
|
59
|
-
: `rvl_${
|
|
59
|
+
: `rvl_${crypto.randomUUID()}`);
|
|
60
60
|
// Build INSERT query (PostgreSQL uses $1, $2 style)
|
|
61
61
|
// Serialize complex values (objects, arrays) to JSON strings for SQLite
|
|
62
62
|
// Filter out fields that should be stored as JSON (not as columns)
|
|
@@ -96,6 +96,6 @@ export async function create(config, db, options) {
|
|
|
96
96
|
// Fallback
|
|
97
97
|
const id = typeof data.id === 'string' || typeof data.id === 'number'
|
|
98
98
|
? data.id
|
|
99
|
-
: `rvl_${
|
|
99
|
+
: `rvl_${crypto.randomUUID()}`;
|
|
100
100
|
return { ...data, id };
|
|
101
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/config/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/config/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAuB5E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;CACpB,GAAG,IAAI,CAQP"}
|
package/dist/config/utils.js
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
|
-
import deepmerge from 'deepmerge';
|
|
2
|
-
const overwriteArray = (_target, source) => source;
|
|
3
1
|
export function deepMerge(target, source) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
const result = { ...target };
|
|
3
|
+
for (const key of Object.keys(source)) {
|
|
4
|
+
const s = source[key];
|
|
5
|
+
const t = target[key];
|
|
6
|
+
if (Array.isArray(s)) {
|
|
7
|
+
result[key] = s;
|
|
8
|
+
}
|
|
9
|
+
else if (s !== null &&
|
|
10
|
+
typeof s === 'object' &&
|
|
11
|
+
t !== null &&
|
|
12
|
+
typeof t === 'object' &&
|
|
13
|
+
!Array.isArray(t)) {
|
|
14
|
+
result[key] = deepMerge(t, s);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
result[key] = s;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
7
21
|
}
|
|
8
22
|
/**
|
|
9
23
|
* @deprecated This function is deprecated. Use ConfigContract validation instead.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe row parsing for database results.
|
|
3
|
+
*
|
|
4
|
+
* Database drivers return untyped rows — this module provides a type guard
|
|
5
|
+
* that filters out malformed rows (missing `id`) before they reach the application.
|
|
6
|
+
* All RevealUI tables have `id` as a non-nullable primary key, so filtering these
|
|
7
|
+
* out prevents crashes from unexpected driver behavior or schema migrations.
|
|
8
|
+
*/
|
|
9
|
+
import type { RevealDocument } from '../types/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate that a raw database row is a valid RevealDocument.
|
|
12
|
+
*
|
|
13
|
+
* Checks only the structural requirement: the row must be a non-null object
|
|
14
|
+
* with an `id` field of type string or number. All other fields are passed
|
|
15
|
+
* through as-is (trusting the database schema).
|
|
16
|
+
*
|
|
17
|
+
* @param row - Raw value from database driver (unknown type)
|
|
18
|
+
* @returns The row typed as RevealDocument, or null if malformed
|
|
19
|
+
*/
|
|
20
|
+
export declare function safeParseRevealDocument(row: unknown): RevealDocument | null;
|
|
21
|
+
/**
|
|
22
|
+
* Parse an array of raw database rows into RevealDocument[], filtering out
|
|
23
|
+
* any malformed rows and logging warnings for each one skipped.
|
|
24
|
+
*/
|
|
25
|
+
export declare function safeParseRevealDocuments(rows: unknown[]): RevealDocument[];
|
|
26
|
+
//# sourceMappingURL=safe-parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-parse.d.ts","sourceRoot":"","sources":["../../src/database/safe-parse.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAgB3E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAI1E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe row parsing for database results.
|
|
3
|
+
*
|
|
4
|
+
* Database drivers return untyped rows — this module provides a type guard
|
|
5
|
+
* that filters out malformed rows (missing `id`) before they reach the application.
|
|
6
|
+
* All RevealUI tables have `id` as a non-nullable primary key, so filtering these
|
|
7
|
+
* out prevents crashes from unexpected driver behavior or schema migrations.
|
|
8
|
+
*/
|
|
9
|
+
import { defaultLogger } from '../instance/logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate that a raw database row is a valid RevealDocument.
|
|
12
|
+
*
|
|
13
|
+
* Checks only the structural requirement: the row must be a non-null object
|
|
14
|
+
* with an `id` field of type string or number. All other fields are passed
|
|
15
|
+
* through as-is (trusting the database schema).
|
|
16
|
+
*
|
|
17
|
+
* @param row - Raw value from database driver (unknown type)
|
|
18
|
+
* @returns The row typed as RevealDocument, or null if malformed
|
|
19
|
+
*/
|
|
20
|
+
export function safeParseRevealDocument(row) {
|
|
21
|
+
if (row === null || typeof row !== 'object') {
|
|
22
|
+
defaultLogger.warn('Database row is not an object — skipping', { row });
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const r = row;
|
|
26
|
+
if (typeof r.id !== 'string' && typeof r.id !== 'number') {
|
|
27
|
+
defaultLogger.warn('Database row missing required id field — skipping', {
|
|
28
|
+
keys: Object.keys(r),
|
|
29
|
+
});
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return r;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse an array of raw database rows into RevealDocument[], filtering out
|
|
36
|
+
* any malformed rows and logging warnings for each one skipped.
|
|
37
|
+
*/
|
|
38
|
+
export function safeParseRevealDocuments(rows) {
|
|
39
|
+
return rows
|
|
40
|
+
.map((row) => safeParseRevealDocument(row))
|
|
41
|
+
.filter((doc) => doc !== null);
|
|
42
|
+
}
|