@revealui/core 0.10.2 → 0.11.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 +4 -2
- package/dist/client/admin/components/DocumentForm.js +17 -6
- package/dist/client/richtext/RichTextEditor.d.ts +1 -1
- package/dist/client/richtext/RichTextEditor.d.ts.map +1 -1
- package/dist/client/richtext/RichTextEditor.js +15 -15
- package/dist/client/richtext/components/ImageNodeComponent.js +4 -4
- package/dist/collections/CollectionOperations.d.ts +5 -0
- package/dist/collections/CollectionOperations.d.ts.map +1 -1
- package/dist/collections/CollectionOperations.js +7 -0
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +20 -0
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +14 -0
- package/dist/collections/operations/drafts.d.ts +33 -0
- package/dist/collections/operations/drafts.d.ts.map +1 -0
- package/dist/collections/operations/drafts.js +43 -0
- package/dist/collections/operations/fieldValidation.d.ts +53 -0
- package/dist/collections/operations/fieldValidation.d.ts.map +1 -0
- package/dist/collections/operations/fieldValidation.js +89 -0
- package/dist/collections/operations/find.d.ts.map +1 -1
- package/dist/collections/operations/find.js +23 -5
- package/dist/collections/operations/findById.d.ts +1 -0
- package/dist/collections/operations/findById.d.ts.map +1 -1
- package/dist/collections/operations/findById.js +33 -21
- package/dist/collections/operations/snapshot.d.ts +30 -0
- package/dist/collections/operations/snapshot.d.ts.map +1 -0
- package/dist/collections/operations/snapshot.js +81 -0
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +21 -0
- package/dist/error-handling/error-boundary.d.ts.map +1 -1
- package/dist/error-handling/error-boundary.js +11 -7
- package/dist/error-handling/fallback-components.d.ts.map +1 -1
- package/dist/error-handling/fallback-components.js +68 -48
- package/dist/features.d.ts +0 -2
- package/dist/features.d.ts.map +1 -1
- package/dist/features.js +2 -5
- package/dist/generated/types/admin.d.ts +42 -35
- package/dist/generated/types/admin.d.ts.map +1 -1
- package/dist/instance/RevealUIInstance.d.ts.map +1 -1
- package/dist/instance/methods/findById.d.ts +2 -0
- package/dist/instance/methods/findById.d.ts.map +1 -1
- package/dist/license.d.ts +67 -1
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +184 -25
- package/dist/richtext/exports/client/rcc.d.ts.map +1 -1
- package/dist/richtext/exports/client/rcc.js +6 -1
- package/dist/richtext/exports/server/rsc.d.ts +15 -2
- package/dist/richtext/exports/server/rsc.d.ts.map +1 -1
- package/dist/richtext/exports/server/rsc.js +36 -6
- package/dist/storage/index.d.ts +4 -5
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +10 -13
- package/dist/storage/object-storage.d.ts +5 -5
- package/dist/storage/object-storage.js +5 -5
- package/dist/storage/types.d.ts +5 -12
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +4 -4
- package/dist/types/runtime.d.ts +51 -0
- package/dist/types/runtime.d.ts.map +1 -1
- package/package.json +22 -23
- package/dist/storage/vercel-blob-provider.d.ts +0 -28
- package/dist/storage/vercel-blob-provider.d.ts.map +0 -1
- package/dist/storage/vercel-blob-provider.js +0 -88
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
7
7
|
import { buildWhereClause } from '../../queries/queryBuilder.js';
|
|
8
8
|
import { deserializeJsonFields } from '../../utils/json-parsing.js';
|
|
9
|
+
import { publishedOnlyReadFilter } from './drafts.js';
|
|
9
10
|
import { countDocumentsQuery, escapeIdentifier, listDocumentsQuery } from './sqlAdapter.js';
|
|
10
11
|
/**
|
|
11
12
|
* Evaluate a collection's access.read function.
|
|
@@ -31,7 +32,7 @@ async function evaluateReadAccess(config, options) {
|
|
|
31
32
|
return result;
|
|
32
33
|
}
|
|
33
34
|
export async function find(config, db, options) {
|
|
34
|
-
const { where, limit = 10, page = 1, sort, depth = 0, req, populate: populateOption } = options;
|
|
35
|
+
const { where, limit = 10, page = 1, sort, depth = 0, req, populate: populateOption, draft = false, } = options;
|
|
35
36
|
// Validate depth
|
|
36
37
|
if (depth < 0 || depth > 3) {
|
|
37
38
|
throw new Error(`Depth must be between 0 and 3, got ${depth}`);
|
|
@@ -53,8 +54,25 @@ export async function find(config, db, options) {
|
|
|
53
54
|
nextPage: null,
|
|
54
55
|
};
|
|
55
56
|
}
|
|
56
|
-
// Merge
|
|
57
|
-
|
|
57
|
+
// Merge, with AND, three independent restrictions:
|
|
58
|
+
// 1. the user-provided where filter,
|
|
59
|
+
// 2. the access.read WhereClause (when access returned a clause, not `true`),
|
|
60
|
+
// 3. the drafts published-only filter (drafts-enabled collection, draft!==true).
|
|
61
|
+
// draft=true relaxes ONLY (3); it never removes (2), so a caller scoped to
|
|
62
|
+
// published content by access.read stays published-only even with draft=true.
|
|
63
|
+
const statusFilter = publishedOnlyReadFilter(config, draft);
|
|
64
|
+
const andClauses = [];
|
|
65
|
+
if (where)
|
|
66
|
+
andClauses.push(where);
|
|
67
|
+
if (accessResult !== true)
|
|
68
|
+
andClauses.push(accessResult);
|
|
69
|
+
if (statusFilter)
|
|
70
|
+
andClauses.push(statusFilter);
|
|
71
|
+
const mergedWhere = andClauses.length === 0
|
|
72
|
+
? undefined
|
|
73
|
+
: andClauses.length === 1
|
|
74
|
+
? andClauses[0]
|
|
75
|
+
: { and: andClauses };
|
|
58
76
|
// Replace where in options for downstream use.
|
|
59
77
|
// When access returned a WhereClause (not just boolean true), set overrideAccess: true
|
|
60
78
|
// to prevent infinite recursion if collectionStorage.find re-invokes this function.
|
|
@@ -78,7 +96,7 @@ export async function find(config, db, options) {
|
|
|
78
96
|
currentDepth: 1,
|
|
79
97
|
depth,
|
|
80
98
|
doc,
|
|
81
|
-
draft
|
|
99
|
+
draft,
|
|
82
100
|
fallbackLocale: req.fallbackLocale || 'en',
|
|
83
101
|
findMany: true,
|
|
84
102
|
flattenLocales: true,
|
|
@@ -187,7 +205,7 @@ export async function find(config, db, options) {
|
|
|
187
205
|
currentDepth: 1,
|
|
188
206
|
depth,
|
|
189
207
|
doc,
|
|
190
|
-
draft
|
|
208
|
+
draft,
|
|
191
209
|
fallbackLocale: req.fallbackLocale || 'en',
|
|
192
210
|
findMany: true,
|
|
193
211
|
flattenLocales: true,
|
|
@@ -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,EAGd,MAAM,sBAAsB,CAAC;
|
|
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;AAM9B,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;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAkJhC"}
|
|
@@ -5,41 +5,53 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
7
7
|
import { deserializeJsonFields } from '../../utils/json-parsing.js';
|
|
8
|
+
import { publishedOnlyReadFilter } from './drafts.js';
|
|
8
9
|
import { find } from './find.js';
|
|
9
10
|
import { selectByIdQuery } from './sqlAdapter.js';
|
|
10
11
|
export async function findByID(config, db, options) {
|
|
11
|
-
const { id, depth = 0, req, populate: populateOption } = options;
|
|
12
|
+
const { id, depth = 0, req, populate: populateOption, draft = false } = options;
|
|
12
13
|
// Validate depth
|
|
13
14
|
if (depth < 0 || depth > 3) {
|
|
14
15
|
throw new Error(`Depth must be between 0 and 3, got ${depth}`);
|
|
15
16
|
}
|
|
16
|
-
// --- Access control enforcement ---
|
|
17
|
+
// --- Access control + draft enforcement ---
|
|
17
18
|
if (!options.overrideAccess) {
|
|
18
19
|
const accessConfig = config.access;
|
|
19
20
|
const readAccess = accessConfig?.read;
|
|
21
|
+
let accessWhere;
|
|
20
22
|
if (readAccess) {
|
|
21
23
|
if (!req)
|
|
22
24
|
return null; // No request context = deny
|
|
23
25
|
const result = await readAccess({ req, id });
|
|
24
26
|
if (result === false)
|
|
25
27
|
return null;
|
|
26
|
-
if (result !== true)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
28
|
+
if (result !== true)
|
|
29
|
+
accessWhere = result;
|
|
30
|
+
}
|
|
31
|
+
// For a drafts-enabled collection read without draft mode, the row must also
|
|
32
|
+
// be published. draft=true drops THIS filter only — accessWhere still stands.
|
|
33
|
+
const statusFilter = publishedOnlyReadFilter(config, draft);
|
|
34
|
+
if (accessWhere || statusFilter) {
|
|
35
|
+
// Row-level access and/or the published-only filter apply. Route through
|
|
36
|
+
// find()'s AND-merge — the same proven path the list view uses on both
|
|
37
|
+
// storage adapters — so findByID cannot hand back a row the ownership rule
|
|
38
|
+
// or draft state was meant to scope out (cross-tenant / draft leakage).
|
|
39
|
+
// overrideAccess skips re-evaluating access.read; find() re-derives the
|
|
40
|
+
// published-only filter itself from `draft`, so only accessWhere is merged
|
|
41
|
+
// in here.
|
|
42
|
+
const where = accessWhere
|
|
43
|
+
? { and: [{ id: { equals: id } }, accessWhere] }
|
|
44
|
+
: { id: { equals: id } };
|
|
45
|
+
const scoped = await find(config, db, {
|
|
46
|
+
where,
|
|
47
|
+
limit: 1,
|
|
48
|
+
depth,
|
|
49
|
+
req,
|
|
50
|
+
draft,
|
|
51
|
+
...(populateOption !== undefined ? { populate: populateOption } : {}),
|
|
52
|
+
overrideAccess: true,
|
|
53
|
+
});
|
|
54
|
+
return scoped.docs[0] ?? null;
|
|
43
55
|
}
|
|
44
56
|
}
|
|
45
57
|
if (db?.collectionStorage?.findByID) {
|
|
@@ -60,7 +72,7 @@ export async function findByID(config, db, options) {
|
|
|
60
72
|
currentDepth: 1,
|
|
61
73
|
depth,
|
|
62
74
|
doc,
|
|
63
|
-
draft
|
|
75
|
+
draft,
|
|
64
76
|
fallbackLocale: req.fallbackLocale || 'en',
|
|
65
77
|
findMany: false,
|
|
66
78
|
flattenLocales: true,
|
|
@@ -107,7 +119,7 @@ export async function findByID(config, db, options) {
|
|
|
107
119
|
currentDepth: 1,
|
|
108
120
|
depth,
|
|
109
121
|
doc,
|
|
110
|
-
draft
|
|
122
|
+
draft,
|
|
111
123
|
fallbackLocale: req.fallbackLocale || 'en',
|
|
112
124
|
findMany: false,
|
|
113
125
|
flattenLocales: true,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot Operations
|
|
3
|
+
*
|
|
4
|
+
* Point-in-time revisions of a document, modeled on the `page_revisions`
|
|
5
|
+
* pattern (per-doc revision number, content snapshot, createdBy,
|
|
6
|
+
* changeDescription).
|
|
7
|
+
*
|
|
8
|
+
* Persistence lives behind the `collectionStorage` seam so the typed store owns
|
|
9
|
+
* the revision table — the same seam `create`/`update`/`delete` already use.
|
|
10
|
+
* Core owns the access gate. This deliberately does NOT introduce a parallel
|
|
11
|
+
* dynamic revisions table: snapshots require a registered typed storage
|
|
12
|
+
* adapter, keeping core drafts thin (the edit-session layer owns its own
|
|
13
|
+
* snapshot path and does not route through here).
|
|
14
|
+
*/
|
|
15
|
+
import type { QueryableDatabaseAdapter, RevealCollectionConfig, RevealDocument, RevealRequest } from '../../types/index.js';
|
|
16
|
+
export interface SnapshotOptions {
|
|
17
|
+
id: string | number;
|
|
18
|
+
req?: RevealRequest;
|
|
19
|
+
changeDescription?: string;
|
|
20
|
+
overrideAccess?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface RestoreOptions {
|
|
23
|
+
id: string | number;
|
|
24
|
+
revisionId: string | number;
|
|
25
|
+
req?: RevealRequest;
|
|
26
|
+
overrideAccess?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function createSnapshot(config: RevealCollectionConfig, db: QueryableDatabaseAdapter | null, options: SnapshotOptions): Promise<RevealDocument>;
|
|
29
|
+
export declare function restoreSnapshot(config: RevealCollectionConfig, db: QueryableDatabaseAdapter | null, options: RestoreOptions): Promise<RevealDocument>;
|
|
30
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,aAAa,EAEd,MAAM,sBAAsB,CAAC;AAiD9B,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,sBAAsB,EAC9B,EAAE,EAAE,wBAAwB,GAAG,IAAI,EACnC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAczB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,sBAAsB,EAC9B,EAAE,EAAE,wBAAwB,GAAG,IAAI,EACnC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAczB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snapshot Operations
|
|
3
|
+
*
|
|
4
|
+
* Point-in-time revisions of a document, modeled on the `page_revisions`
|
|
5
|
+
* pattern (per-doc revision number, content snapshot, createdBy,
|
|
6
|
+
* changeDescription).
|
|
7
|
+
*
|
|
8
|
+
* Persistence lives behind the `collectionStorage` seam so the typed store owns
|
|
9
|
+
* the revision table — the same seam `create`/`update`/`delete` already use.
|
|
10
|
+
* Core owns the access gate. This deliberately does NOT introduce a parallel
|
|
11
|
+
* dynamic revisions table: snapshots require a registered typed storage
|
|
12
|
+
* adapter, keeping core drafts thin (the edit-session layer owns its own
|
|
13
|
+
* snapshot path and does not route through here).
|
|
14
|
+
*/
|
|
15
|
+
import { find } from './find.js';
|
|
16
|
+
function accessDenied() {
|
|
17
|
+
return new Error('Access denied: insufficient permissions to snapshot this document');
|
|
18
|
+
}
|
|
19
|
+
function snapshotUnsupported(slug) {
|
|
20
|
+
const err = new Error(`Snapshots are not supported for collection '${slug}': no typed storage adapter is registered.`);
|
|
21
|
+
err.statusCode = 501;
|
|
22
|
+
return err;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Confirm the caller may write the target document — snapshotting and restoring
|
|
26
|
+
* are part of the edit lifecycle. Reuses `access.update` and the same row-level
|
|
27
|
+
* scoping `update()` uses, so a caller cannot snapshot or restore a row outside
|
|
28
|
+
* its scope.
|
|
29
|
+
*/
|
|
30
|
+
async function assertWriteAccess(config, db, id, req, overrideAccess) {
|
|
31
|
+
if (overrideAccess)
|
|
32
|
+
return;
|
|
33
|
+
const updateAccess = config.access?.update;
|
|
34
|
+
if (!updateAccess)
|
|
35
|
+
return;
|
|
36
|
+
if (!req)
|
|
37
|
+
throw accessDenied();
|
|
38
|
+
const result = await updateAccess({ req, id });
|
|
39
|
+
if (result === false)
|
|
40
|
+
throw accessDenied();
|
|
41
|
+
if (result !== true) {
|
|
42
|
+
const scoped = await find(config, db, {
|
|
43
|
+
where: { and: [{ id: { equals: id } }, result] },
|
|
44
|
+
limit: 1,
|
|
45
|
+
req,
|
|
46
|
+
overrideAccess: true,
|
|
47
|
+
});
|
|
48
|
+
if (scoped.docs.length === 0)
|
|
49
|
+
throw accessDenied();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function createSnapshot(config, db, options) {
|
|
53
|
+
const { id, req, changeDescription } = options;
|
|
54
|
+
await assertWriteAccess(config, db, id, req, options.overrideAccess);
|
|
55
|
+
const seam = db?.collectionStorage?.snapshot;
|
|
56
|
+
if (!seam)
|
|
57
|
+
throw snapshotUnsupported(config.slug);
|
|
58
|
+
const revision = await seam(config, {
|
|
59
|
+
id,
|
|
60
|
+
...(req ? { req } : {}),
|
|
61
|
+
...(changeDescription !== undefined ? { changeDescription } : {}),
|
|
62
|
+
});
|
|
63
|
+
if (revision === undefined)
|
|
64
|
+
throw snapshotUnsupported(config.slug);
|
|
65
|
+
return revision;
|
|
66
|
+
}
|
|
67
|
+
export async function restoreSnapshot(config, db, options) {
|
|
68
|
+
const { id, revisionId, req } = options;
|
|
69
|
+
await assertWriteAccess(config, db, id, req, options.overrideAccess);
|
|
70
|
+
const seam = db?.collectionStorage?.restore;
|
|
71
|
+
if (!seam)
|
|
72
|
+
throw snapshotUnsupported(config.slug);
|
|
73
|
+
const restored = await seam(config, {
|
|
74
|
+
id,
|
|
75
|
+
revisionId,
|
|
76
|
+
...(req ? { req } : {}),
|
|
77
|
+
});
|
|
78
|
+
if (restored === undefined)
|
|
79
|
+
throw snapshotUnsupported(config.slug);
|
|
80
|
+
return restored;
|
|
81
|
+
}
|
|
@@ -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,EAEpB,MAAM,sBAAsB,CAAC;
|
|
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;AAoF9B,wBAAsB,MAAM,CAC1B,MAAM,EAAE,sBAAsB,EAC9B,EAAE,EAAE,wBAAwB,GAAG,IAAI,EACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAsOzB"}
|
|
@@ -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 { runFieldValidators } from './fieldValidation.js';
|
|
11
12
|
import { find } from './find.js';
|
|
12
13
|
import { findByID } from './findById.js';
|
|
13
14
|
import { checkExistsByIdQuery, selectJsonByIdQuery, updateByIdQuery, updateByIdWithVersionQuery, } from './sqlAdapter.js';
|
|
@@ -109,6 +110,10 @@ export async function update(config, db, options) {
|
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
112
|
}
|
|
113
|
+
// Run field-level `validate` predicates for the fields present in this patch,
|
|
114
|
+
// after the built-in email check and before beforeChange hooks. Throws a
|
|
115
|
+
// ValidationError (HTTP 400) on the first failing field.
|
|
116
|
+
await runFieldValidators(config, data, 'update', options.req);
|
|
112
117
|
// Run beforeChange field hooks after validation but before the DB write.
|
|
113
118
|
await runBeforeFieldHooks(config, data, 'update', 'beforeChange', undefined, options.req);
|
|
114
119
|
// Hash password if present and not already hashed (doesn't start with $2a$ or $2b$)
|
|
@@ -116,6 +121,21 @@ export async function update(config, db, options) {
|
|
|
116
121
|
const saltRounds = 12;
|
|
117
122
|
data.password = await bcrypt.hash(data.password, saltRounds);
|
|
118
123
|
}
|
|
124
|
+
// Typed-storage write seam: a registered collectionStorage adapter may own
|
|
125
|
+
// this collection's writes. It receives the hook-processed `data` and returns
|
|
126
|
+
// the updated document, throws for not-found / optimistic-lock 409, or returns
|
|
127
|
+
// `undefined` to defer to the dynamic-SQL path below (same not-handled
|
|
128
|
+
// contract as the read seam).
|
|
129
|
+
if (db?.collectionStorage?.update) {
|
|
130
|
+
const doc = await db.collectionStorage.update(config, {
|
|
131
|
+
id,
|
|
132
|
+
data,
|
|
133
|
+
...(options.req ? { req: options.req } : {}),
|
|
134
|
+
});
|
|
135
|
+
if (doc !== undefined) {
|
|
136
|
+
return doc;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
119
139
|
if (db?.query) {
|
|
120
140
|
// Dynamic collection storage is quarantined in sqlAdapter.ts until this
|
|
121
141
|
// layer is redesigned around typed tables that Drizzle can model directly.
|
|
@@ -135,6 +155,7 @@ export async function update(config, db, options) {
|
|
|
135
155
|
'created_at',
|
|
136
156
|
'updated_at',
|
|
137
157
|
'_json',
|
|
158
|
+
'_status',
|
|
138
159
|
'password',
|
|
139
160
|
]);
|
|
140
161
|
if (config.fields) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-boundary.d.ts","sourceRoot":"","sources":["../../src/error-handling/error-boundary.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGzD,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC;IAC5E,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACxD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBACtE,KAAK,EAAE,kBAAkB;IASrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAO1E,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAgB3D,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI;IAevD,KAAK,QAAO,IAAI,CAUd;IAEF,MAAM,IAAI,SAAS;CA2BpB;
|
|
1
|
+
{"version":3,"file":"error-boundary.d.ts","sourceRoot":"","sources":["../../src/error-handling/error-boundary.tsx"],"names":[],"mappings":"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"}
|
|
@@ -79,33 +79,37 @@ export class ErrorBoundary extends Component {
|
|
|
79
79
|
}
|
|
80
80
|
function DefaultErrorFallback({ error, errorInfo, onReset, isolate, }) {
|
|
81
81
|
if (isolate) {
|
|
82
|
-
return (_jsx("div", { style: {
|
|
82
|
+
return (_jsx("div", { style: {
|
|
83
|
+
padding: '16px',
|
|
84
|
+
border: '1px solid var(--rvui-error, #f44336)',
|
|
85
|
+
borderRadius: '4px',
|
|
86
|
+
}, children: _jsx("p", { style: { color: 'var(--rvui-error, #f44336)', fontWeight: 'bold' }, children: "Something went wrong" }) }));
|
|
83
87
|
}
|
|
84
88
|
return (_jsxs("div", { role: "alert", style: {
|
|
85
89
|
padding: '24px',
|
|
86
90
|
maxWidth: '600px',
|
|
87
91
|
margin: '40px auto',
|
|
88
|
-
backgroundColor: '#fff',
|
|
89
|
-
border: '1px solid #f44336',
|
|
92
|
+
backgroundColor: 'var(--rvui-surface-0, #fff)',
|
|
93
|
+
border: '1px solid var(--rvui-error, #f44336)',
|
|
90
94
|
borderRadius: '8px',
|
|
91
|
-
}, children: [_jsx("h2", { style: { color: '#f44336', marginTop: 0 }, children: "Something went wrong" }), _jsx("p", { style: { color: '#666' }, children: "An error occurred while rendering this component." }), process.env.NODE_ENV === 'development' && (_jsxs("details", { style: { marginTop: '16px' }, children: [_jsx("summary", { style: { cursor: 'pointer', fontWeight: 'bold' }, children: "Error details" }), _jsx("pre", { style: {
|
|
95
|
+
}, children: [_jsx("h2", { style: { color: 'var(--rvui-error, #f44336)', marginTop: 0 }, children: "Something went wrong" }), _jsx("p", { style: { color: 'var(--rvui-text-2, #666)' }, children: "An error occurred while rendering this component." }), process.env.NODE_ENV === 'development' && (_jsxs("details", { style: { marginTop: '16px' }, children: [_jsx("summary", { style: { cursor: 'pointer', fontWeight: 'bold' }, children: "Error details" }), _jsx("pre", { style: {
|
|
92
96
|
marginTop: '8px',
|
|
93
97
|
padding: '12px',
|
|
94
|
-
backgroundColor: '#f5f5f5',
|
|
98
|
+
backgroundColor: 'var(--rvui-surface-2, #f5f5f5)',
|
|
95
99
|
borderRadius: '4px',
|
|
96
100
|
overflow: 'auto',
|
|
97
101
|
fontSize: '12px',
|
|
98
102
|
}, children: error.toString() }), _jsx("pre", { style: {
|
|
99
103
|
marginTop: '8px',
|
|
100
104
|
padding: '12px',
|
|
101
|
-
backgroundColor: '#f5f5f5',
|
|
105
|
+
backgroundColor: 'var(--rvui-surface-2, #f5f5f5)',
|
|
102
106
|
borderRadius: '4px',
|
|
103
107
|
overflow: 'auto',
|
|
104
108
|
fontSize: '12px',
|
|
105
109
|
}, children: errorInfo?.componentStack })] })), _jsx("button", { type: "button", onClick: onReset, style: {
|
|
106
110
|
marginTop: '16px',
|
|
107
111
|
padding: '8px 16px',
|
|
108
|
-
backgroundColor: '#2196f3',
|
|
112
|
+
backgroundColor: 'var(--rvui-brand, #2196f3)',
|
|
109
113
|
color: '#fff',
|
|
110
114
|
border: 'none',
|
|
111
115
|
borderRadius: '4px',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallback-components.d.ts","sourceRoot":"","sources":["../../src/error-handling/fallback-components.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,SAAS,EACT,KAA8B,EAC9B,OAAO,EACP,WAAoD,EACpD,OAAe,GAChB,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CA6HzC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,OAAmF,GACpF,EAAE;IACD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,KAAK,CAAC,YAAY,CAiCrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAwB,EACxB,OAAwD,EACxD,QAAQ,GACT,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,GAAG,KAAK,CAAC,YAAY,CAiCrB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAsB,EACtB,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,GAAG,KAAK,CAAC,YAAY,CAyDrB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAwE,EACxE,QAAQ,GACT,EAAE;IACD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,KAAK,CAAC,YAAY,CAkBrB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,WAAW,EACX,OAAO,EACP,QAAQ,GACT,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,KAAK,CAAC,YAAY,CAwBrB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAA2B,EAC3B,OAA4E,EAC5E,aAAa,GACd,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,KAAK,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"fallback-components.d.ts","sourceRoot":"","sources":["../../src/error-handling/fallback-components.tsx"],"names":[],"mappings":"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"}
|