@revealui/core 0.7.0 → 0.9.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 +50 -6
- package/dist/collections/operations/delete.d.ts +2 -4
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +21 -4
- package/dist/collections/operations/findById.d.ts.map +1 -1
- package/dist/collections/operations/findById.js +18 -3
- package/dist/collections/operations/sqlAdapter.d.ts.map +1 -1
- package/dist/collections/operations/sqlAdapter.js +7 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +21 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/license.d.ts +20 -0
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +30 -0
- package/dist/observability/health-check.d.ts.map +1 -1
- package/dist/observability/health-check.js +8 -1
- package/dist/observability/metrics.d.ts +6 -16
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +5 -10
- package/dist/richtext/exports/server/rsc.d.ts +1 -1
- package/dist/richtext/exports/server/rsc.d.ts.map +1 -1
- package/dist/richtext/exports/server/rsc.js +6 -1
- package/dist/security/index.d.ts +9 -2
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +9 -2
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/storage/_helpers.d.ts +14 -0
- package/dist/storage/_helpers.d.ts.map +1 -0
- package/dist/storage/_helpers.js +40 -0
- package/dist/storage/index.d.ts +18 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +46 -2
- package/dist/storage/mock.d.ts +39 -0
- package/dist/storage/mock.d.ts.map +1 -0
- package/dist/storage/mock.js +91 -0
- package/dist/storage/object-storage.d.ts +41 -0
- package/dist/storage/object-storage.d.ts.map +1 -0
- package/dist/storage/{vercel-blob.js → object-storage.js} +38 -18
- package/dist/storage/r2.d.ts +13 -0
- package/dist/storage/r2.d.ts.map +1 -0
- package/dist/storage/r2.js +117 -0
- package/dist/storage/types.d.ts +110 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +16 -0
- package/dist/storage/vercel-blob-provider.d.ts +28 -0
- package/dist/storage/vercel-blob-provider.d.ts.map +1 -0
- package/dist/storage/vercel-blob-provider.js +88 -0
- package/package.json +8 -7
- package/dist/storage/vercel-blob.d.ts +0 -17
- package/dist/storage/vercel-blob.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ Part of the [RevealUI monorepo](https://github.com/RevealUIStudio/revealui) -
|
|
|
19
19
|
- **Plugins** - Extensible plugin system (form builder, nested docs, redirects)
|
|
20
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
|
-
- **Storage** - Pluggable storage interface (Vercel Blob adapter
|
|
22
|
+
- **Storage** - Pluggable storage interface (Cloudflare R2 primary; Vercel Blob legacy adapter retained during migration)
|
|
23
23
|
|
|
24
24
|
## Installation
|
|
25
25
|
|
|
@@ -113,27 +113,71 @@ if (isFeatureEnabled('ai')) {
|
|
|
113
113
|
|
|
114
114
|
| Subpath | Purpose |
|
|
115
115
|
|---------|---------|
|
|
116
|
-
| `@revealui/core` | Main entry
|
|
116
|
+
| `@revealui/core` | Main entry |
|
|
117
117
|
| `@revealui/core/server` | Server-side CRUD API |
|
|
118
118
|
| `@revealui/core/client` | Client-side React hooks and utilities |
|
|
119
|
-
| `@revealui/core/
|
|
119
|
+
| `@revealui/core/client/ui` | Client UI components |
|
|
120
|
+
| `@revealui/core/client/admin` | Client admin components |
|
|
121
|
+
| `@revealui/core/client/richtext` | Client rich text editor |
|
|
122
|
+
| `@revealui/core/config` | Configuration builder (`buildConfig`) |
|
|
120
123
|
| `@revealui/core/admin` | Admin dashboard components |
|
|
124
|
+
| `@revealui/core/admin/utils/serializeConfig` | Config serialization util |
|
|
125
|
+
| `@revealui/core/admin/utils/apiClient` | Admin API client |
|
|
126
|
+
| `@revealui/core/admin/i18n/en` | English i18n strings |
|
|
121
127
|
| `@revealui/core/richtext` | Rich text server utilities |
|
|
122
128
|
| `@revealui/core/richtext/client` | Lexical editor React components |
|
|
129
|
+
| `@revealui/core/richtext/react` | Rich text React exports |
|
|
123
130
|
| `@revealui/core/richtext/html` | HTML serialization |
|
|
124
131
|
| `@revealui/core/richtext/rsc` | React Server Component support |
|
|
132
|
+
| `@revealui/core/richtext/lexical` | Raw Lexical exports |
|
|
125
133
|
| `@revealui/core/security` | Security infrastructure |
|
|
126
134
|
| `@revealui/core/auth` | Auth utilities |
|
|
127
135
|
| `@revealui/core/database` | Database adapters |
|
|
128
|
-
| `@revealui/core/
|
|
136
|
+
| `@revealui/core/database/ssl-config` | SSL/TLS config |
|
|
137
|
+
| `@revealui/core/database/type-adapter` | Type adapter utilities |
|
|
138
|
+
| `@revealui/core/storage` | Storage adapters (R2 + legacy Vercel Blob) |
|
|
129
139
|
| `@revealui/core/plugins` | Plugin system |
|
|
130
140
|
| `@revealui/core/features` | Feature flags |
|
|
131
141
|
| `@revealui/core/license` | License validation |
|
|
142
|
+
| `@revealui/core/license-encryption` | License encryption |
|
|
143
|
+
| `@revealui/core/revforge-license` | RevForge license validation |
|
|
132
144
|
| `@revealui/core/monitoring` | Health monitoring |
|
|
145
|
+
| `@revealui/core/monitoring/process-registry` | Process registry |
|
|
146
|
+
| `@revealui/core/monitoring/query-monitor` | Query monitor |
|
|
147
|
+
| `@revealui/core/observability` | Observability root |
|
|
133
148
|
| `@revealui/core/observability/logger` | Structured logging |
|
|
149
|
+
| `@revealui/core/observability/metrics` | Metrics |
|
|
150
|
+
| `@revealui/core/observability/alerts` | Alerts |
|
|
151
|
+
| `@revealui/core/error-handling` | Error boundaries, retry, circuit breaker, fallback UI |
|
|
152
|
+
| `@revealui/core/error-handling/error-reporter` | Error reporting |
|
|
153
|
+
| `@revealui/core/caching` | Caching utilities |
|
|
154
|
+
| `@revealui/core/cache/query-cache` | Query cache |
|
|
155
|
+
| `@revealui/core/jobs` | Background jobs |
|
|
156
|
+
| `@revealui/core/translations` | i18n translations |
|
|
157
|
+
| `@revealui/core/ui` | UI component exports |
|
|
134
158
|
| `@revealui/core/types` | TypeScript type definitions |
|
|
159
|
+
| `@revealui/core/types/core` | Core types |
|
|
160
|
+
| `@revealui/core/types/schema` | Schema types |
|
|
161
|
+
| `@revealui/core/types/generated` | Generated types |
|
|
162
|
+
| `@revealui/core/types/admin` | Admin types |
|
|
163
|
+
| `@revealui/core/types/frontend` | Frontend types |
|
|
164
|
+
| `@revealui/core/generated` | Generated code |
|
|
135
165
|
| `@revealui/core/nextjs` | Next.js integration middleware |
|
|
136
|
-
| `@revealui/core/
|
|
166
|
+
| `@revealui/core/nextjs/withRevealUI` | Next.js config wrapper |
|
|
167
|
+
| `@revealui/core/api/rest` | REST API handler |
|
|
168
|
+
| `@revealui/core/api/compression` | Response compression |
|
|
169
|
+
| `@revealui/core/api/payload-optimization` | Payload optimization |
|
|
170
|
+
| `@revealui/core/api/rate-limit` | API rate limiting |
|
|
171
|
+
| `@revealui/core/api/response-cache` | Response cache |
|
|
172
|
+
| `@revealui/core/optimization/code-splitting` | Code splitting helpers |
|
|
173
|
+
| `@revealui/core/utils/logger` | Logger utility |
|
|
174
|
+
| `@revealui/core/utils/logger/client` | Client-side logger |
|
|
175
|
+
| `@revealui/core/utils/logger/server` | Server-side logger |
|
|
176
|
+
| `@revealui/core/utils/cache` | Cache utility |
|
|
177
|
+
| `@revealui/core/utils/deep-clone` | Deep clone utility |
|
|
178
|
+
| `@revealui/core/utils/errors` | Error utilities |
|
|
179
|
+
| `@revealui/core/utils/error-responses` | Error response helpers |
|
|
180
|
+
| `@revealui/core/utils/request-context` | Request context |
|
|
137
181
|
|
|
138
182
|
## Development
|
|
139
183
|
|
|
@@ -159,7 +203,7 @@ pnpm dev
|
|
|
159
203
|
- **Not** for standalone UI components - use `@revealui/presentation`
|
|
160
204
|
- **Not** for raw database queries - use `@revealui/db` directly
|
|
161
205
|
|
|
162
|
-
##
|
|
206
|
+
## Design Principles
|
|
163
207
|
|
|
164
208
|
- **Sovereign**: Self-hosted runtime engine - no vendor dependency for content management, auth, or storage
|
|
165
209
|
- **Unified**: One `buildConfig()` call wires collections, globals, plugins, security, and feature gates into a single configuration
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Deletes a document by ID with access control enforcement.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
7
|
-
export declare function deleteDocument(config: RevealCollectionConfig, db:
|
|
8
|
-
query: (query: string, values?: unknown[]) => Promise<DatabaseResult>;
|
|
9
|
-
} | null, options: RevealDeleteOptions): Promise<RevealDocument>;
|
|
6
|
+
import type { QueryableDatabaseAdapter, RevealCollectionConfig, RevealDeleteOptions, RevealDocument } from '../../types/index.js';
|
|
7
|
+
export declare function deleteDocument(config: RevealCollectionConfig, db: QueryableDatabaseAdapter | null, options: RevealDeleteOptions): Promise<RevealDocument>;
|
|
10
8
|
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAsC9B,wBAAsB,cAAc,CAClC,MAAM,EAAE,sBAAsB,EAC9B,EAAE,EAAE,wBAAwB,GAAG,IAAI,EACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAkCzB"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Deletes a document by ID with access control enforcement.
|
|
5
5
|
*/
|
|
6
|
+
import { find } from './find.js';
|
|
6
7
|
import { deleteByIdQuery } from './sqlAdapter.js';
|
|
7
8
|
/**
|
|
8
9
|
* Evaluate a collection's access.delete function.
|
|
@@ -22,16 +23,32 @@ async function evaluateDeleteAccess(config, options) {
|
|
|
22
23
|
const result = await deleteAccess({ req, id: options.id });
|
|
23
24
|
if (result === false)
|
|
24
25
|
return false;
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
if (result === true)
|
|
27
|
+
return true;
|
|
28
|
+
// A WhereClause = row-level access: allowed only for rows matching the filter.
|
|
29
|
+
return result;
|
|
27
30
|
}
|
|
28
31
|
export async function deleteDocument(config, db, options) {
|
|
29
32
|
const { id } = options;
|
|
30
33
|
// --- Access control enforcement ---
|
|
31
|
-
const
|
|
32
|
-
if (
|
|
34
|
+
const access = await evaluateDeleteAccess(config, options);
|
|
35
|
+
if (access === false) {
|
|
33
36
|
throw new Error('Access denied: insufficient permissions to delete this document');
|
|
34
37
|
}
|
|
38
|
+
if (access !== true) {
|
|
39
|
+
// Row-level access: confirm the target row matches the ownership filter
|
|
40
|
+
// before deleting, so delete() cannot remove a row outside the caller's
|
|
41
|
+
// scope. Reuse find()'s AND-merge; overrideAccess skips re-evaluation.
|
|
42
|
+
const scoped = await find(config, db, {
|
|
43
|
+
where: { and: [{ id: { equals: id } }, access] },
|
|
44
|
+
limit: 1,
|
|
45
|
+
req: options.req,
|
|
46
|
+
overrideAccess: true,
|
|
47
|
+
});
|
|
48
|
+
if (scoped.docs.length === 0) {
|
|
49
|
+
throw new Error('Access denied: insufficient permissions to delete this document');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
35
52
|
if (db?.query) {
|
|
36
53
|
// Dynamic collection storage is quarantined in sqlAdapter.ts until this
|
|
37
54
|
// layer is redesigned around typed tables that Drizzle can model directly.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findById.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findById.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,aAAa,
|
|
1
|
+
{"version":3,"file":"findById.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findById.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,aAAa,EAGd,MAAM,sBAAsB,CAAC;AAK9B,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,sBAAsB,EAC9B,EAAE,EAAE,wBAAwB,GAAG,IAAI,EACnC,OAAO,EAAE;IACP,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GACA,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAsIhC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
7
7
|
import { deserializeJsonFields } from '../../utils/json-parsing.js';
|
|
8
|
+
import { find } from './find.js';
|
|
8
9
|
import { selectByIdQuery } from './sqlAdapter.js';
|
|
9
10
|
export async function findByID(config, db, options) {
|
|
10
11
|
const { id, depth = 0, req, populate: populateOption } = options;
|
|
@@ -22,9 +23,23 @@ export async function findByID(config, db, options) {
|
|
|
22
23
|
const result = await readAccess({ req, id });
|
|
23
24
|
if (result === false)
|
|
24
25
|
return null;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
if (result !== true) {
|
|
27
|
+
// Row-level access: a WhereClause means "allowed only for rows matching
|
|
28
|
+
// this filter". Confirm THIS row matches before returning it — otherwise
|
|
29
|
+
// findByID hands back rows the ownership rule was meant to scope out
|
|
30
|
+
// (cross-tenant / unpublished-draft leakage). Reuse find()'s AND-merge so
|
|
31
|
+
// the filter runs through the same proven path the list view uses (both
|
|
32
|
+
// storage adapters); overrideAccess skips re-evaluating the rule.
|
|
33
|
+
const scoped = await find(config, db, {
|
|
34
|
+
where: { and: [{ id: { equals: id } }, result] },
|
|
35
|
+
limit: 1,
|
|
36
|
+
depth,
|
|
37
|
+
req,
|
|
38
|
+
...(populateOption !== undefined ? { populate: populateOption } : {}),
|
|
39
|
+
overrideAccess: true,
|
|
40
|
+
});
|
|
41
|
+
return scoped.docs[0] ?? null;
|
|
42
|
+
}
|
|
28
43
|
}
|
|
29
44
|
}
|
|
30
45
|
if (db?.collectionStorage?.findByID) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlAdapter.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/sqlAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;CACvE,CAAC;AA6BF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM/C;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpF;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAKjF;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"sqlAdapter.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/sqlAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;CACvE,CAAC;AA6BF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM/C;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAMvD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpF;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAKjF;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAI1E;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAKrF"}
|
|
@@ -83,7 +83,13 @@ export function insertDocumentQuery(configSlug, columns) {
|
|
|
83
83
|
return `INSERT INTO ${collectionTable(configSlug)} (id, ${escapedColumns}) VALUES ($1, ${placeholders})`;
|
|
84
84
|
}
|
|
85
85
|
export function selectJsonByIdQuery(configSlug) {
|
|
86
|
-
|
|
86
|
+
// `id` MUST be in the projection. Query results pass through
|
|
87
|
+
// safeParseRevealDocuments, which drops any row lacking an `id`. A bare
|
|
88
|
+
// `SELECT _json` row has no `id`, so it gets filtered to empty — making
|
|
89
|
+
// update() wrongly throw "Document not found" for every JSON-field
|
|
90
|
+
// collection. Keep `_json` first so existing `sql.includes('SELECT _json')`
|
|
91
|
+
// matchers still recognize this query.
|
|
92
|
+
return `SELECT _json, id FROM ${collectionTable(configSlug)} WHERE id = $1 LIMIT 1`;
|
|
87
93
|
}
|
|
88
94
|
export function checkExistsByIdQuery(configSlug) {
|
|
89
95
|
return `SELECT id FROM ${collectionTable(configSlug)} WHERE id = $1 LIMIT 1`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EAGd,mBAAmB,
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EAGd,mBAAmB,EAEpB,MAAM,sBAAsB,CAAC;AAmF9B,wBAAsB,MAAM,CAC1B,MAAM,EAAE,sBAAsB,EAC9B,EAAE,EAAE,wBAAwB,GAAG,IAAI,EACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAgNzB"}
|
|
@@ -8,6 +8,7 @@ import { defaultLogger } from '../../instance/logger.js';
|
|
|
8
8
|
import { collectJsonFields, serializeValueForDatabase } from '../../utils/json-parsing.js';
|
|
9
9
|
import { flattenFields, isJsonFieldType } from '../../utils/type-guards.js';
|
|
10
10
|
import { runBeforeFieldHooks } from './fieldHooks.js';
|
|
11
|
+
import { find } from './find.js';
|
|
11
12
|
import { findByID } from './findById.js';
|
|
12
13
|
import { checkExistsByIdQuery, selectJsonByIdQuery, updateByIdQuery, updateByIdWithVersionQuery, } from './sqlAdapter.js';
|
|
13
14
|
/**
|
|
@@ -52,16 +53,32 @@ async function evaluateUpdateAccess(config, options) {
|
|
|
52
53
|
const result = await updateAccess({ req, id: options.id, data: options.data });
|
|
53
54
|
if (result === false)
|
|
54
55
|
return false;
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
if (result === true)
|
|
57
|
+
return true;
|
|
58
|
+
// A WhereClause = row-level access: allowed only for rows matching the filter.
|
|
59
|
+
return result;
|
|
57
60
|
}
|
|
58
61
|
export async function update(config, db, options) {
|
|
59
62
|
const { id, data } = options;
|
|
60
63
|
// --- Access control enforcement ---
|
|
61
|
-
const
|
|
62
|
-
if (
|
|
64
|
+
const access = await evaluateUpdateAccess(config, options);
|
|
65
|
+
if (access === false) {
|
|
63
66
|
throw new Error('Access denied: insufficient permissions to update this document');
|
|
64
67
|
}
|
|
68
|
+
if (access !== true) {
|
|
69
|
+
// Row-level access: confirm the target row matches the ownership filter
|
|
70
|
+
// before mutating, so update() cannot modify a row outside the caller's
|
|
71
|
+
// scope. Reuse find()'s AND-merge; overrideAccess skips re-evaluation.
|
|
72
|
+
const scoped = await find(config, db, {
|
|
73
|
+
where: { and: [{ id: { equals: options.id } }, access] },
|
|
74
|
+
limit: 1,
|
|
75
|
+
req: options.req,
|
|
76
|
+
overrideAccess: true,
|
|
77
|
+
});
|
|
78
|
+
if (scoped.docs.length === 0) {
|
|
79
|
+
throw new Error('Access denied: insufficient permissions to update this document');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
65
82
|
// Run beforeValidate field hooks before validation so they can transform values.
|
|
66
83
|
await runBeforeFieldHooks(config, data, 'update', 'beforeValidate', undefined, options.req);
|
|
67
84
|
// Validate email format if email field is being updated
|
package/dist/index.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export { nestedDocsPlugin } from './plugins/nested-docs.js';
|
|
|
27
27
|
export { redirectsPlugin } from './plugins/redirects.js';
|
|
28
28
|
export { afterChangeTraverseFields, afterReadTraverseFields, beforeChangeTraverseFields, beforeValidateTraverseFields, buildWhereClause, checkDependencies, createRevealUIInstance, defaultLogger, extractWhereValues, flattenResult, getRelationshipFields, Logger, RevealUICollection, RevealUIGlobal, type RevealUILogger, type RichTextAdapter, relationshipPopulationPromise, validateRelationshipMetadata, withNullableJSONSchemaType, } from './revealui.js';
|
|
29
29
|
export { BoldFeature, FixedToolbarFeature, HeadingFeature, ItalicFeature, LinkFeature, lexicalEditor, TreeViewFeature, UnderlineFeature, } from './richtext/index.js';
|
|
30
|
-
export {
|
|
30
|
+
export { objectStorage } from './storage/object-storage.js';
|
|
31
31
|
export { LRUCache, type LRUCacheOptions } from './utils/cache.js';
|
|
32
32
|
export { deepClone } from './utils/deep-clone.js';
|
|
33
33
|
export { createApplicationErrorResponseData, createErrorResponseData, createSuccessResponseData, createValidationErrorResponseData, type ErrorResponseData, } from './utils/error-responses.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EACV,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,YAAY,EAEZ,cAAc,EACd,QAAQ,EACR,YAAY,EAEZ,SAAS,EACT,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,EACpB,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,yBAAyB,EACzB,UAAU,EACV,QAAQ,EAER,oBAAoB,EACpB,eAAe,EAEf,aAAa,EAEb,WAAW,EACX,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,YAAY,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,YAAY,EACjB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAMtB,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAEL,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAE5B,gBAAgB,EAEhB,iBAAiB,EAEjB,sBAAsB,EACtB,aAAa,EACb,kBAAkB,EAClB,aAAa,EAEb,qBAAqB,EAErB,MAAM,EAEN,kBAAkB,EAClB,cAAc,EACd,KAAK,cAAc,EAEnB,KAAK,eAAe,EACpB,6BAA6B,EAC7B,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,WAAW,EACX,aAAa,EACb,eAAe,EACf,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -66,7 +66,7 @@ RevealUICollection, RevealUIGlobal, relationshipPopulationPromise, validateRelat
|
|
|
66
66
|
// Rich text editor
|
|
67
67
|
export { BoldFeature, FixedToolbarFeature, HeadingFeature, ItalicFeature, LinkFeature, lexicalEditor, TreeViewFeature, UnderlineFeature, } from './richtext/index.js';
|
|
68
68
|
// Storage adapters
|
|
69
|
-
export {
|
|
69
|
+
export { objectStorage } from './storage/object-storage.js';
|
|
70
70
|
// Note: Logger class is exported from ./revealui.ts (instance/logger.js), not from utils/logger.js
|
|
71
71
|
export { LRUCache } from './utils/cache.js';
|
|
72
72
|
// Deep clone utility
|
package/dist/license.d.ts
CHANGED
|
@@ -139,6 +139,26 @@ export declare function getCurrentTier(): LicenseTier;
|
|
|
139
139
|
* Returns the full license payload, or null if no valid license or cache expired.
|
|
140
140
|
*/
|
|
141
141
|
export declare function getLicensePayload(): LicensePayload | null;
|
|
142
|
+
/**
|
|
143
|
+
* Returns true when `host` is covered by the license's `domains` claim.
|
|
144
|
+
*
|
|
145
|
+
* The single matching primitive for RevForge/Fleet domain-lock — consumed by
|
|
146
|
+
* the API's `requireDomain` middleware, the admin boot check, and
|
|
147
|
+
* `validateLicenseAtStartup`. Because the allowed domains come from the signed
|
|
148
|
+
* JWT `domains` claim (not a separate env var), the lock is cryptographically
|
|
149
|
+
* bound: it cannot be spoofed by editing an env file.
|
|
150
|
+
*
|
|
151
|
+
* Matching rules (no authored regex, per the fleet no-regex rule):
|
|
152
|
+
* - `host` is lower-cased and stripped of any `:port` suffix
|
|
153
|
+
* - `localhost` / `127.0.0.1` are always allowed, so a trial kit boots and
|
|
154
|
+
* serves on its default `http://localhost` regardless of the licensed domain
|
|
155
|
+
* - otherwise `host` must equal a licensed domain OR be a subdomain of one
|
|
156
|
+
* (`app.example.com` matches `example.com`)
|
|
157
|
+
*
|
|
158
|
+
* @param host raw Host header value or URL hostname (a `:port` suffix is tolerated)
|
|
159
|
+
* @param domains the license payload's `domains` claim
|
|
160
|
+
*/
|
|
161
|
+
export declare function hostMatchesLicensedDomains(host: string, domains: readonly string[]): boolean;
|
|
142
162
|
/**
|
|
143
163
|
* Checks whether the current license is at least the given tier.
|
|
144
164
|
* Also validates that the license has not expired (checks JWT exp claim).
|
package/dist/license.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
package/dist/license.js
CHANGED
|
@@ -281,6 +281,36 @@ export function getLicensePayload() {
|
|
|
281
281
|
evictStaleCache();
|
|
282
282
|
return cachedState.payload;
|
|
283
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* Returns true when `host` is covered by the license's `domains` claim.
|
|
286
|
+
*
|
|
287
|
+
* The single matching primitive for RevForge/Fleet domain-lock — consumed by
|
|
288
|
+
* the API's `requireDomain` middleware, the admin boot check, and
|
|
289
|
+
* `validateLicenseAtStartup`. Because the allowed domains come from the signed
|
|
290
|
+
* JWT `domains` claim (not a separate env var), the lock is cryptographically
|
|
291
|
+
* bound: it cannot be spoofed by editing an env file.
|
|
292
|
+
*
|
|
293
|
+
* Matching rules (no authored regex, per the fleet no-regex rule):
|
|
294
|
+
* - `host` is lower-cased and stripped of any `:port` suffix
|
|
295
|
+
* - `localhost` / `127.0.0.1` are always allowed, so a trial kit boots and
|
|
296
|
+
* serves on its default `http://localhost` regardless of the licensed domain
|
|
297
|
+
* - otherwise `host` must equal a licensed domain OR be a subdomain of one
|
|
298
|
+
* (`app.example.com` matches `example.com`)
|
|
299
|
+
*
|
|
300
|
+
* @param host raw Host header value or URL hostname (a `:port` suffix is tolerated)
|
|
301
|
+
* @param domains the license payload's `domains` claim
|
|
302
|
+
*/
|
|
303
|
+
export function hostMatchesLicensedDomains(host, domains) {
|
|
304
|
+
const normalized = (host.trim().toLowerCase().split(':')[0] ?? '').trim();
|
|
305
|
+
if (!normalized)
|
|
306
|
+
return false;
|
|
307
|
+
if (normalized === 'localhost' || normalized === '127.0.0.1')
|
|
308
|
+
return true;
|
|
309
|
+
return domains.some((domain) => {
|
|
310
|
+
const d = domain.trim().toLowerCase();
|
|
311
|
+
return d.length > 0 && (normalized === d || normalized.endsWith(`.${d}`));
|
|
312
|
+
});
|
|
313
|
+
}
|
|
284
314
|
/**
|
|
285
315
|
* Checks whether the current license is at least the given tier.
|
|
286
316
|
* Also validates that the license has not expired (checks JWT exp claim).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/observability/health-check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/observability/health-check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,SAAS,CAAsB;IAEvC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAIlC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAoD1C;;OAEG;YACW,cAAc;IAS5B;;OAEG;IACH,SAAS,IAAI,MAAM;CAGpB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,mBAA0B,CAAC;AAEnD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAmCnF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,gBAAgB,GAAE,MAAW,GAAG,WAAW,CA8ClF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,GAAE,MAAW,GAAG,WAAW,CA4ChF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,GAAE,MAAY,GAAG,WAAW,CAuC3F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,EACzC,QAAQ,GAAE,OAAe,GACxB,WAAW,CAMb;AAED;;GAEG;AACH,wBAAgB,oBAAoB,UACjB,OAAO,CAAC,QAAQ,CAAC,CAanC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,UACpB,OAAO,CAAC,QAAQ,CAAC,CA2BnC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,UACzB,QAAQ,CAqBpB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,GAAE,MAAc,EAC1B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAC9C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAsBzB"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { execFile } from 'node:child_process';
|
|
7
7
|
import { promisify } from 'node:util';
|
|
8
|
+
import { getHeapStatistics } from 'node:v8';
|
|
8
9
|
import { logger } from './logger.js';
|
|
9
10
|
const execFileAsync = promisify(execFile);
|
|
10
11
|
export class HealthCheckSystem {
|
|
@@ -145,7 +146,12 @@ export function createMemoryHealthCheck(thresholdPercent = 90) {
|
|
|
145
146
|
};
|
|
146
147
|
}
|
|
147
148
|
const usage = process.memoryUsage();
|
|
148
|
-
|
|
149
|
+
// heapTotal is V8's currently-committed heap, not the ceiling — it sits
|
|
150
|
+
// just above heapUsed and grows on demand toward heap_size_limit
|
|
151
|
+
// (--max-old-space-size), so heapUsed/heapTotal reads ~90%+ during normal
|
|
152
|
+
// operation. heap_size_limit is the real OOM-proximity denominator.
|
|
153
|
+
const heapLimit = getHeapStatistics().heap_size_limit;
|
|
154
|
+
const usedPercent = (usage.heapUsed / heapLimit) * 100;
|
|
149
155
|
let status = 'healthy';
|
|
150
156
|
let message = 'Memory usage normal';
|
|
151
157
|
if (usedPercent > thresholdPercent) {
|
|
@@ -162,6 +168,7 @@ export function createMemoryHealthCheck(thresholdPercent = 90) {
|
|
|
162
168
|
details: {
|
|
163
169
|
heapUsed: usage.heapUsed,
|
|
164
170
|
heapTotal: usage.heapTotal,
|
|
171
|
+
heapLimit,
|
|
165
172
|
usedPercent: usedPercent.toFixed(2),
|
|
166
173
|
external: usage.external,
|
|
167
174
|
rss: usage.rss,
|
|
@@ -165,7 +165,6 @@ export declare const appMetrics: {
|
|
|
165
165
|
x402PaymentRequiredTotal: Counter;
|
|
166
166
|
x402PaymentVerifyTotal: Counter;
|
|
167
167
|
x402PaymentVerifyDuration: Histogram;
|
|
168
|
-
x402SafeguardRejectionTotal: Counter;
|
|
169
168
|
};
|
|
170
169
|
/**
|
|
171
170
|
* Track HTTP request
|
|
@@ -189,25 +188,16 @@ export declare function trackError(type: string, severity?: 'low' | 'medium' | '
|
|
|
189
188
|
export declare function updateActiveConnections(type: string, delta: number): void;
|
|
190
189
|
/**
|
|
191
190
|
* Track an x402 HTTP 402 emission at a route. Call when the route returns
|
|
192
|
-
* 402 with `X-PAYMENT-REQUIRED`. `currency` is `'usdc-
|
|
193
|
-
*
|
|
194
|
-
* otherwise.
|
|
191
|
+
* 402 with `X-PAYMENT-REQUIRED`. `currency` is always `'usdc-only'` — USDC on
|
|
192
|
+
* Base is the sole settlement currency.
|
|
195
193
|
*/
|
|
196
|
-
export declare function trackX402PaymentRequired(route: string, currency: 'usdc-only'
|
|
194
|
+
export declare function trackX402PaymentRequired(route: string, currency: 'usdc-only'): void;
|
|
197
195
|
/**
|
|
198
196
|
* Track an x402 payment verification. Increments the result counter and
|
|
199
|
-
* observes the duration histogram (latency
|
|
200
|
-
*
|
|
197
|
+
* observes the duration histogram (latency = Coinbase facilitator round-trip
|
|
198
|
+
* for USDC).
|
|
201
199
|
*/
|
|
202
|
-
export declare function trackX402PaymentVerify(route: string, scheme: 'exact'
|
|
203
|
-
/**
|
|
204
|
-
* Track an RVUI safeguards pipeline rejection. Called from
|
|
205
|
-
* `verifyRvuiPayment` when `validatePayment` returns disallowed. Reasons
|
|
206
|
-
* are mapped from the safeguard's free-text reason at the call site to
|
|
207
|
-
* keep wording coupling low.
|
|
208
|
-
*/
|
|
209
|
-
export type X402SafeguardRejectionReason = 'duplicate-tx' | 'circuit-breaker' | 'single-payment-cap' | 'wallet-rate-limit' | 'discount-cap' | 'unknown';
|
|
210
|
-
export declare function trackX402SafeguardRejection(reason: X402SafeguardRejectionReason): void;
|
|
200
|
+
export declare function trackX402PaymentVerify(route: string, scheme: 'exact', result: 'valid' | 'invalid', durationMs: number): void;
|
|
211
201
|
/**
|
|
212
202
|
* Update memory usage
|
|
213
203
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -358,8 +358,7 @@ export const appMetrics = {
|
|
|
358
358
|
// x402 micropayments (GAP-149 PR 5)
|
|
359
359
|
x402PaymentRequiredTotal: metrics.counter('x402_payment_required_total', 'HTTP 402 Payment Required responses emitted by route + currency advertised', ['route', 'currency']),
|
|
360
360
|
x402PaymentVerifyTotal: metrics.counter('x402_payment_verify_total', 'x402 payment verification attempts by route, scheme, and result', ['route', 'scheme', 'result']),
|
|
361
|
-
x402PaymentVerifyDuration: metrics.histogram('x402_payment_verify_duration_seconds', 'x402 payment verification latency (Coinbase facilitator round-trip for USDC
|
|
362
|
-
x402SafeguardRejectionTotal: metrics.counter('x402_safeguard_rejection_total', 'RVUI safeguards pipeline rejections by reason (replay / cap / rate-limit / discount-cap / circuit-breaker)', ['reason']),
|
|
361
|
+
x402PaymentVerifyDuration: metrics.histogram('x402_payment_verify_duration_seconds', 'x402 payment verification latency (Coinbase facilitator round-trip for USDC)', [0.05, 0.1, 0.5, 1, 5, 10, 30], ['scheme']),
|
|
363
362
|
};
|
|
364
363
|
/**
|
|
365
364
|
* Track HTTP request
|
|
@@ -395,25 +394,21 @@ export function updateActiveConnections(type, delta) {
|
|
|
395
394
|
}
|
|
396
395
|
/**
|
|
397
396
|
* Track an x402 HTTP 402 emission at a route. Call when the route returns
|
|
398
|
-
* 402 with `X-PAYMENT-REQUIRED`. `currency` is `'usdc-
|
|
399
|
-
*
|
|
400
|
-
* otherwise.
|
|
397
|
+
* 402 with `X-PAYMENT-REQUIRED`. `currency` is always `'usdc-only'` — USDC on
|
|
398
|
+
* Base is the sole settlement currency.
|
|
401
399
|
*/
|
|
402
400
|
export function trackX402PaymentRequired(route, currency) {
|
|
403
401
|
appMetrics.x402PaymentRequiredTotal.inc(1, { route, currency });
|
|
404
402
|
}
|
|
405
403
|
/**
|
|
406
404
|
* Track an x402 payment verification. Increments the result counter and
|
|
407
|
-
* observes the duration histogram (latency
|
|
408
|
-
*
|
|
405
|
+
* observes the duration histogram (latency = Coinbase facilitator round-trip
|
|
406
|
+
* for USDC).
|
|
409
407
|
*/
|
|
410
408
|
export function trackX402PaymentVerify(route, scheme, result, durationMs) {
|
|
411
409
|
appMetrics.x402PaymentVerifyTotal.inc(1, { route, scheme, result });
|
|
412
410
|
appMetrics.x402PaymentVerifyDuration.observe(durationMs / 1000, { scheme });
|
|
413
411
|
}
|
|
414
|
-
export function trackX402SafeguardRejection(reason) {
|
|
415
|
-
appMetrics.x402SafeguardRejectionTotal.inc(1, { reason });
|
|
416
|
-
}
|
|
417
412
|
/**
|
|
418
413
|
* Update memory usage
|
|
419
414
|
*/
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Provides server-side rendering components for Lexical content.
|
|
5
5
|
* Converts Lexical JSON state to React elements without requiring a browser.
|
|
6
6
|
*/
|
|
7
|
-
import { isSafeUrl, sanitizeUrl } from '@revealui/security';
|
|
7
|
+
import { isSafeUrl, sanitizeUrl } from '@revealui/security/sanitize';
|
|
8
8
|
import type { SerializedEditorState, SerializedLexicalNode } from 'lexical';
|
|
9
9
|
import { type JSX } from 'react';
|
|
10
10
|
export type { SerializedEditorState };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../../../src/richtext/exports/server/rsc.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../../../src/richtext/exports/server/rsc.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
5
5
|
* Provides server-side rendering components for Lexical content.
|
|
6
6
|
* Converts Lexical JSON state to React elements without requiring a browser.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
// Import from the client-safe ./sanitize subpath, NOT the @revealui/security
|
|
9
|
+
// barrel: the barrel statically re-exports auth.ts/gdpr.ts, whose top-level
|
|
10
|
+
// `import 'node:crypto'` crashes this module's client/RSC bundle (blank render
|
|
11
|
+
// on routes that load rich text, e.g. marketing /blog). ./sanitize imports only
|
|
12
|
+
// parse5 and is browser-safe.
|
|
13
|
+
import { isSafeUrl, sanitizeUrl } from '@revealui/security/sanitize';
|
|
9
14
|
import { Fragment } from 'react';
|
|
10
15
|
// URL sanitization is owned by @revealui/security (single source of truth
|
|
11
16
|
// for every untrusted-string sink across RevFleet). Re-exported here so
|
package/dist/security/index.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Security & Compliance -
|
|
3
|
-
*
|
|
2
|
+
* Security & Compliance - full server-side surface.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the client-safe `@revealui/security` barrel AND the server-only
|
|
5
|
+
* `@revealui/security/server` entry (auth/gdpr/audit/ssrf — node: built-ins),
|
|
6
|
+
* so server code can pull any security symbol from one place. Because it
|
|
7
|
+
* re-exports `./server`, THIS entry is server-only: do not import
|
|
8
|
+
* `@revealui/core/security` from client/RSC code (use `@revealui/security` or
|
|
9
|
+
* `@revealui/security/sanitize` there).
|
|
4
10
|
*/
|
|
5
11
|
export * from '@revealui/security';
|
|
12
|
+
export * from '@revealui/security/server';
|
|
6
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC"}
|