@dyrected/core 2.6.3 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/access-features.test.d.ts +2 -0
- package/dist/__tests__/access-features.test.d.ts.map +1 -0
- package/dist/__tests__/access-features.test.js +159 -0
- package/dist/__tests__/access-features.test.js.map +1 -0
- package/dist/__tests__/access-parity.test.d.ts +2 -0
- package/dist/__tests__/access-parity.test.d.ts.map +1 -0
- package/dist/__tests__/access-parity.test.js +338 -0
- package/dist/__tests__/access-parity.test.js.map +1 -0
- package/dist/__tests__/access.test.d.ts +2 -0
- package/dist/__tests__/access.test.d.ts.map +1 -0
- package/dist/__tests__/access.test.js +137 -0
- package/dist/__tests__/access.test.js.map +1 -0
- package/dist/__tests__/admin-auth.test.d.ts +2 -0
- package/dist/__tests__/admin-auth.test.d.ts.map +1 -0
- package/dist/__tests__/admin-auth.test.js +440 -0
- package/dist/__tests__/admin-auth.test.js.map +1 -0
- package/dist/__tests__/app.test.d.ts +2 -0
- package/dist/__tests__/app.test.d.ts.map +1 -0
- package/dist/__tests__/app.test.js +112 -0
- package/dist/__tests__/app.test.js.map +1 -0
- package/dist/__tests__/audit.test.d.ts +2 -0
- package/dist/__tests__/audit.test.d.ts.map +1 -0
- package/dist/__tests__/audit.test.js +125 -0
- package/dist/__tests__/audit.test.js.map +1 -0
- package/dist/__tests__/auth-hydration.test.d.ts +2 -0
- package/dist/__tests__/auth-hydration.test.d.ts.map +1 -0
- package/dist/__tests__/auth-hydration.test.js +90 -0
- package/dist/__tests__/auth-hydration.test.js.map +1 -0
- package/dist/__tests__/auth-invite.test.d.ts +2 -0
- package/dist/__tests__/auth-invite.test.d.ts.map +1 -0
- package/dist/__tests__/auth-invite.test.js +152 -0
- package/dist/__tests__/auth-invite.test.js.map +1 -0
- package/dist/__tests__/auth-lockout.test.d.ts +2 -0
- package/dist/__tests__/auth-lockout.test.d.ts.map +1 -0
- package/dist/__tests__/auth-lockout.test.js +154 -0
- package/dist/__tests__/auth-lockout.test.js.map +1 -0
- package/dist/__tests__/auth-sessions.test.d.ts +2 -0
- package/dist/__tests__/auth-sessions.test.d.ts.map +1 -0
- package/dist/__tests__/auth-sessions.test.js +118 -0
- package/dist/__tests__/auth-sessions.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +402 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/define-field.test.d.ts +2 -0
- package/dist/__tests__/define-field.test.d.ts.map +1 -0
- package/dist/__tests__/define-field.test.js +121 -0
- package/dist/__tests__/define-field.test.js.map +1 -0
- package/dist/__tests__/deleteMany.test.d.ts +2 -0
- package/dist/__tests__/deleteMany.test.d.ts.map +1 -0
- package/dist/__tests__/deleteMany.test.js +75 -0
- package/dist/__tests__/deleteMany.test.js.map +1 -0
- package/dist/__tests__/depth.test.d.ts +2 -0
- package/dist/__tests__/depth.test.d.ts.map +1 -0
- package/dist/__tests__/depth.test.js +115 -0
- package/dist/__tests__/depth.test.js.map +1 -0
- package/dist/__tests__/dynamic-options.test.d.ts +2 -0
- package/dist/__tests__/dynamic-options.test.d.ts.map +1 -0
- package/dist/__tests__/dynamic-options.test.js +168 -0
- package/dist/__tests__/dynamic-options.test.js.map +1 -0
- package/dist/__tests__/email.service.test.d.ts +2 -0
- package/dist/__tests__/email.service.test.d.ts.map +1 -0
- package/dist/__tests__/email.service.test.js +52 -0
- package/dist/__tests__/email.service.test.js.map +1 -0
- package/dist/__tests__/field-inference.test-types.d.ts +161 -0
- package/dist/__tests__/field-inference.test-types.d.ts.map +1 -0
- package/dist/__tests__/field-inference.test-types.js +87 -0
- package/dist/__tests__/field-inference.test-types.js.map +1 -0
- package/dist/__tests__/fixtures/editorial-workflow.d.ts +14 -0
- package/dist/__tests__/fixtures/editorial-workflow.d.ts.map +1 -0
- package/dist/__tests__/fixtures/editorial-workflow.js +12 -0
- package/dist/__tests__/fixtures/editorial-workflow.js.map +1 -0
- package/dist/__tests__/hooks.test.d.ts +2 -0
- package/dist/__tests__/hooks.test.d.ts.map +1 -0
- package/dist/__tests__/hooks.test.js +320 -0
- package/dist/__tests__/hooks.test.js.map +1 -0
- package/dist/__tests__/mocks.d.ts +75 -0
- package/dist/__tests__/mocks.d.ts.map +1 -0
- package/dist/__tests__/mocks.js +170 -0
- package/dist/__tests__/mocks.js.map +1 -0
- package/dist/__tests__/observability.test.d.ts +2 -0
- package/dist/__tests__/observability.test.d.ts.map +1 -0
- package/dist/__tests__/observability.test.js +233 -0
- package/dist/__tests__/observability.test.js.map +1 -0
- package/dist/__tests__/openapi.test.d.ts +2 -0
- package/dist/__tests__/openapi.test.d.ts.map +1 -0
- package/dist/__tests__/openapi.test.js +105 -0
- package/dist/__tests__/openapi.test.js.map +1 -0
- package/dist/__tests__/parse-sort.test.d.ts +2 -0
- package/dist/__tests__/parse-sort.test.d.ts.map +1 -0
- package/dist/__tests__/parse-sort.test.js +24 -0
- package/dist/__tests__/parse-sort.test.js.map +1 -0
- package/dist/__tests__/preferences.test.d.ts +2 -0
- package/dist/__tests__/preferences.test.d.ts.map +1 -0
- package/dist/__tests__/preferences.test.js +168 -0
- package/dist/__tests__/preferences.test.js.map +1 -0
- package/dist/__tests__/router.test.d.ts +2 -0
- package/dist/__tests__/router.test.d.ts.map +1 -0
- package/dist/__tests__/router.test.js +70 -0
- package/dist/__tests__/router.test.js.map +1 -0
- package/dist/__tests__/search.test.d.ts +2 -0
- package/dist/__tests__/search.test.d.ts.map +1 -0
- package/dist/__tests__/search.test.js +174 -0
- package/dist/__tests__/search.test.js.map +1 -0
- package/dist/__tests__/upload-validation.test.d.ts +2 -0
- package/dist/__tests__/upload-validation.test.d.ts.map +1 -0
- package/dist/__tests__/upload-validation.test.js +41 -0
- package/dist/__tests__/upload-validation.test.js.map +1 -0
- package/dist/__tests__/where.test.d.ts +2 -0
- package/dist/__tests__/where.test.d.ts.map +1 -0
- package/dist/__tests__/where.test.js +105 -0
- package/dist/__tests__/where.test.js.map +1 -0
- package/dist/__tests__/workflow.test.d.ts +2 -0
- package/dist/__tests__/workflow.test.d.ts.map +1 -0
- package/dist/__tests__/workflow.test.js +684 -0
- package/dist/__tests__/workflow.test.js.map +1 -0
- package/dist/app-config-C9VJ6rTv.d.cts +2092 -0
- package/dist/app-config-C9VJ6rTv.d.ts +2092 -0
- package/dist/app-config-CYV70eoF.d.cts +2100 -0
- package/dist/app-config-CYV70eoF.d.ts +2100 -0
- package/dist/app-config-ChsrBB7p.d.cts +2100 -0
- package/dist/app-config-ChsrBB7p.d.ts +2100 -0
- package/dist/app.d.ts +35 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +164 -0
- package/dist/app.js.map +1 -0
- package/dist/auth/access.d.ts +5 -0
- package/dist/auth/access.d.ts.map +1 -0
- package/dist/auth/access.js +59 -0
- package/dist/auth/access.js.map +1 -0
- package/dist/auth/jexl.d.ts +13 -0
- package/dist/auth/jexl.d.ts.map +1 -0
- package/dist/auth/jexl.js +30 -0
- package/dist/auth/jexl.js.map +1 -0
- package/dist/auth/lockout.d.ts +11 -0
- package/dist/auth/lockout.d.ts.map +1 -0
- package/dist/auth/lockout.js +37 -0
- package/dist/auth/lockout.js.map +1 -0
- package/dist/auth/password.d.ts +10 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +28 -0
- package/dist/auth/password.js.map +1 -0
- package/dist/auth/sessions.d.ts +39 -0
- package/dist/auth/sessions.d.ts.map +1 -0
- package/dist/auth/sessions.js +126 -0
- package/dist/auth/sessions.js.map +1 -0
- package/dist/auth/token.d.ts +23 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +40 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/chunk-23NM4LDU.js +2883 -0
- package/dist/chunk-2TKDCCIR.js +2622 -0
- package/dist/chunk-3SFITPX4.js +2628 -0
- package/dist/chunk-CQVTQ67D.js +2632 -0
- package/dist/chunk-ELHRRPKX.js +2863 -0
- package/dist/chunk-HRLSFTLR.js +3061 -0
- package/dist/chunk-QTIAQBNH.js +3097 -0
- package/dist/chunk-T2DGC4MD.js +3008 -0
- package/dist/chunk-TLU77TLE.js +3203 -0
- package/dist/chunk-YEBCT77K.js +3269 -0
- package/dist/chunk-YXEKNN5X.js +3085 -0
- package/dist/controllers/admin-auth.controller.d.ts +71 -0
- package/dist/controllers/admin-auth.controller.d.ts.map +1 -0
- package/dist/controllers/admin-auth.controller.js +450 -0
- package/dist/controllers/admin-auth.controller.js.map +1 -0
- package/dist/controllers/audit.controller.d.ts +42 -0
- package/dist/controllers/audit.controller.d.ts.map +1 -0
- package/dist/controllers/audit.controller.js +149 -0
- package/dist/controllers/audit.controller.js.map +1 -0
- package/dist/controllers/auth.controller.d.ts +143 -0
- package/dist/controllers/auth.controller.d.ts.map +1 -0
- package/dist/controllers/auth.controller.js +572 -0
- package/dist/controllers/auth.controller.js.map +1 -0
- package/dist/controllers/collection.controller.d.ts +170 -0
- package/dist/controllers/collection.controller.d.ts.map +1 -0
- package/dist/controllers/collection.controller.js +1033 -0
- package/dist/controllers/collection.controller.js.map +1 -0
- package/dist/controllers/global.controller.d.ts +20 -0
- package/dist/controllers/global.controller.d.ts.map +1 -0
- package/dist/controllers/global.controller.js +182 -0
- package/dist/controllers/global.controller.js.map +1 -0
- package/dist/controllers/media.controller.d.ts +39 -0
- package/dist/controllers/media.controller.d.ts.map +1 -0
- package/dist/controllers/media.controller.js +178 -0
- package/dist/controllers/media.controller.js.map +1 -0
- package/dist/controllers/preview.controller.d.ts +37 -0
- package/dist/controllers/preview.controller.d.ts.map +1 -0
- package/dist/controllers/preview.controller.js +48 -0
- package/dist/controllers/preview.controller.js.map +1 -0
- package/dist/index.cjs +707 -27
- package/dist/index.d.cts +77 -5
- package/dist/index.d.ts +77 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +19 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +157 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +9 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +75 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/network.d.ts +6 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +70 -0
- package/dist/network.js.map +1 -0
- package/dist/observability.d.ts +113 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +497 -0
- package/dist/observability.js.map +1 -0
- package/dist/router.d.ts +8 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +704 -0
- package/dist/router.js.map +1 -0
- package/dist/server.cjs +861 -54
- package/dist/server.d.cts +9 -1
- package/dist/server.d.ts +9 -1
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +189 -26
- package/dist/server.js.map +1 -0
- package/dist/services/audit.service.d.ts +23 -0
- package/dist/services/audit.service.d.ts.map +1 -0
- package/dist/services/audit.service.js +39 -0
- package/dist/services/audit.service.js.map +1 -0
- package/dist/services/defaults.service.d.ts +8 -0
- package/dist/services/defaults.service.d.ts.map +1 -0
- package/dist/services/defaults.service.js +55 -0
- package/dist/services/defaults.service.js.map +1 -0
- package/dist/services/email-template.d.ts +46 -0
- package/dist/services/email-template.d.ts.map +1 -0
- package/dist/services/email-template.js +88 -0
- package/dist/services/email-template.js.map +1 -0
- package/dist/services/email.service.d.ts +34 -0
- package/dist/services/email.service.d.ts.map +1 -0
- package/dist/services/email.service.js +129 -0
- package/dist/services/email.service.js.map +1 -0
- package/dist/services/media.service.d.ts +20 -0
- package/dist/services/media.service.d.ts.map +1 -0
- package/dist/services/media.service.js +49 -0
- package/dist/services/media.service.js.map +1 -0
- package/dist/services/population.service.d.ts +20 -0
- package/dist/services/population.service.d.ts.map +1 -0
- package/dist/services/population.service.js +224 -0
- package/dist/services/population.service.js.map +1 -0
- package/dist/types/access.d.ts +48 -0
- package/dist/types/access.d.ts.map +1 -0
- package/dist/types/access.js +2 -0
- package/dist/types/access.js.map +1 -0
- package/dist/types/adapters.d.ts +152 -0
- package/dist/types/adapters.d.ts.map +1 -0
- package/dist/types/adapters.js +2 -0
- package/dist/types/adapters.js.map +1 -0
- package/dist/types/admin-auth.d.ts +132 -0
- package/dist/types/admin-auth.d.ts.map +1 -0
- package/dist/types/admin-auth.js +2 -0
- package/dist/types/admin-auth.js.map +1 -0
- package/dist/types/admin.d.ts +86 -0
- package/dist/types/admin.d.ts.map +1 -0
- package/dist/types/admin.js +2 -0
- package/dist/types/admin.js.map +1 -0
- package/dist/types/app-config.d.ts +279 -0
- package/dist/types/app-config.d.ts.map +1 -0
- package/dist/types/app-config.js +2 -0
- package/dist/types/app-config.js.map +1 -0
- package/dist/types/documents.d.ts +65 -0
- package/dist/types/documents.d.ts.map +1 -0
- package/dist/types/documents.js +2 -0
- package/dist/types/documents.js.map +1 -0
- package/dist/types/hooks.d.ts +122 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/hooks.js +2 -0
- package/dist/types/hooks.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/request.d.ts +42 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +2 -0
- package/dist/types/request.js.map +1 -0
- package/dist/types/schema-config.d.ts +443 -0
- package/dist/types/schema-config.d.ts.map +1 -0
- package/dist/types/schema-config.js +2 -0
- package/dist/types/schema-config.js.map +1 -0
- package/dist/types/schema-core.d.ts +628 -0
- package/dist/types/schema-core.d.ts.map +1 -0
- package/dist/types/schema-core.js +2 -0
- package/dist/types/schema-core.js.map +1 -0
- package/dist/types/schema-inference.d.ts +73 -0
- package/dist/types/schema-inference.d.ts.map +1 -0
- package/dist/types/schema-inference.js +2 -0
- package/dist/types/schema-inference.js.map +1 -0
- package/dist/types/workflows.d.ts +121 -0
- package/dist/types/workflows.d.ts.map +1 -0
- package/dist/types/workflows.js +7 -0
- package/dist/types/workflows.js.map +1 -0
- package/dist/utils/access-control.d.ts +35 -0
- package/dist/utils/access-control.d.ts.map +1 -0
- package/dist/utils/access-control.js +161 -0
- package/dist/utils/access-control.js.map +1 -0
- package/dist/utils/admin-auth.d.ts +5 -0
- package/dist/utils/admin-auth.d.ts.map +1 -0
- package/dist/utils/admin-auth.js +39 -0
- package/dist/utils/admin-auth.js.map +1 -0
- package/dist/utils/block-references.d.ts +10 -0
- package/dist/utils/block-references.d.ts.map +1 -0
- package/dist/utils/block-references.js +100 -0
- package/dist/utils/block-references.js.map +1 -0
- package/dist/utils/collection-search.d.ts +11 -0
- package/dist/utils/collection-search.d.ts.map +1 -0
- package/dist/utils/collection-search.js +204 -0
- package/dist/utils/collection-search.js.map +1 -0
- package/dist/utils/config.d.ts +8 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +336 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/hooks.d.ts +41 -0
- package/dist/utils/hooks.d.ts.map +1 -0
- package/dist/utils/hooks.js +177 -0
- package/dist/utils/hooks.js.map +1 -0
- package/dist/utils/openapi.d.ts +6 -0
- package/dist/utils/openapi.d.ts.map +1 -0
- package/dist/utils/openapi.js +981 -0
- package/dist/utils/openapi.js.map +1 -0
- package/dist/utils/parse-sort.d.ts +43 -0
- package/dist/utils/parse-sort.d.ts.map +1 -0
- package/dist/utils/parse-sort.js +70 -0
- package/dist/utils/parse-sort.js.map +1 -0
- package/dist/utils/parse-where.d.ts +69 -0
- package/dist/utils/parse-where.d.ts.map +1 -0
- package/dist/utils/parse-where.js +202 -0
- package/dist/utils/parse-where.js.map +1 -0
- package/dist/utils/readonly-db.d.ts +9 -0
- package/dist/utils/readonly-db.d.ts.map +1 -0
- package/dist/utils/readonly-db.js +21 -0
- package/dist/utils/readonly-db.js.map +1 -0
- package/dist/utils/swagger.d.ts +11 -0
- package/dist/utils/swagger.d.ts.map +1 -0
- package/dist/utils/swagger.js +62 -0
- package/dist/utils/swagger.js.map +1 -0
- package/dist/utils/upload-validation.d.ts +23 -0
- package/dist/utils/upload-validation.d.ts.map +1 -0
- package/dist/utils/upload-validation.js +46 -0
- package/dist/utils/upload-validation.js.map +1 -0
- package/dist/utils/where-sanitizer.d.ts +10 -0
- package/dist/utils/where-sanitizer.d.ts.map +1 -0
- package/dist/utils/where-sanitizer.js +67 -0
- package/dist/utils/where-sanitizer.js.map +1 -0
- package/dist/workflows.d.ts +86 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +405 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { DefaultsService } from "./defaults.service.js";
|
|
2
|
+
import jexl from "jexl";
|
|
3
|
+
export class PopulationService {
|
|
4
|
+
db;
|
|
5
|
+
collections;
|
|
6
|
+
constructor(db, collections) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
this.collections = collections;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Recursively populate relationship fields in a document or array of documents.
|
|
12
|
+
*/
|
|
13
|
+
async populate(args) {
|
|
14
|
+
const { data, fields, currentDepth = 0, maxDepth = 10 } = args;
|
|
15
|
+
if (currentDepth >= maxDepth || !data) {
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
if (Array.isArray(data)) {
|
|
19
|
+
return Promise.all(data.map((item) => this.populate({ ...args, data: item })));
|
|
20
|
+
}
|
|
21
|
+
const populatedDoc = { ...data };
|
|
22
|
+
for (const field of fields) {
|
|
23
|
+
// Handle Join Fields within the remaining depth budget.
|
|
24
|
+
if (field.type === "join" &&
|
|
25
|
+
field.collection &&
|
|
26
|
+
field.on &&
|
|
27
|
+
currentDepth < maxDepth) {
|
|
28
|
+
const targetCollection = this.collections.find((c) => c.slug === field.collection);
|
|
29
|
+
if (targetCollection) {
|
|
30
|
+
const docId = populatedDoc.id;
|
|
31
|
+
if (docId) {
|
|
32
|
+
const where = { [field.on]: { equals: docId } };
|
|
33
|
+
const joinLimit = field.limit ?? 10;
|
|
34
|
+
const result = await this.db.find({
|
|
35
|
+
collection: field.collection,
|
|
36
|
+
where,
|
|
37
|
+
limit: joinLimit,
|
|
38
|
+
});
|
|
39
|
+
// Join population consumes one depth level, matching relationship fields.
|
|
40
|
+
const populatedDocs = await this.populate({
|
|
41
|
+
data: result.docs.map((doc) => DefaultsService.apply(targetCollection.fields, doc)),
|
|
42
|
+
fields: targetCollection.fields,
|
|
43
|
+
currentDepth: currentDepth + 1,
|
|
44
|
+
maxDepth,
|
|
45
|
+
});
|
|
46
|
+
populatedDoc[field.name] = {
|
|
47
|
+
docs: populatedDocs,
|
|
48
|
+
hasNextPage: result.page * result.limit < result.total,
|
|
49
|
+
totalDocs: result.total,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (field.type === "row" && field.fields) {
|
|
56
|
+
const rowPopulated = await this.populate({
|
|
57
|
+
data,
|
|
58
|
+
fields: field.fields,
|
|
59
|
+
currentDepth,
|
|
60
|
+
maxDepth,
|
|
61
|
+
});
|
|
62
|
+
Object.assign(populatedDoc, rowPopulated);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (!field.name)
|
|
66
|
+
continue;
|
|
67
|
+
const value = populatedDoc[field.name];
|
|
68
|
+
// Handle Relationship Fields
|
|
69
|
+
if (field.type === "relationship" && field.relationTo && value) {
|
|
70
|
+
const relatedCollection = this.collections.find((c) => c.slug === field.relationTo);
|
|
71
|
+
if (!relatedCollection)
|
|
72
|
+
continue;
|
|
73
|
+
if (Array.isArray(value)) {
|
|
74
|
+
// Multi-relationship
|
|
75
|
+
populatedDoc[field.name] = await Promise.all(value.map(async (id) => {
|
|
76
|
+
if (!id)
|
|
77
|
+
return id;
|
|
78
|
+
let doc = id;
|
|
79
|
+
if (typeof id === "string") {
|
|
80
|
+
doc = await this.db.findOne({
|
|
81
|
+
collection: field.relationTo,
|
|
82
|
+
id,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (!doc || typeof doc !== "object")
|
|
86
|
+
return id;
|
|
87
|
+
const docWithDefaults = DefaultsService.apply(relatedCollection.fields, doc);
|
|
88
|
+
return this.populate({
|
|
89
|
+
data: docWithDefaults,
|
|
90
|
+
fields: relatedCollection.fields,
|
|
91
|
+
currentDepth: currentDepth + 1,
|
|
92
|
+
maxDepth,
|
|
93
|
+
});
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
else if (value) {
|
|
97
|
+
// Single relationship
|
|
98
|
+
let doc = value;
|
|
99
|
+
if (typeof value === "string") {
|
|
100
|
+
doc = await this.db.findOne({
|
|
101
|
+
collection: field.relationTo,
|
|
102
|
+
id: value,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (doc && typeof doc === "object") {
|
|
106
|
+
const docWithDefaults = DefaultsService.apply(relatedCollection.fields, doc);
|
|
107
|
+
populatedDoc[field.name] = await this.populate({
|
|
108
|
+
data: docWithDefaults,
|
|
109
|
+
fields: relatedCollection.fields,
|
|
110
|
+
currentDepth: currentDepth + 1,
|
|
111
|
+
maxDepth,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Handle URL Fields with internal relationships
|
|
117
|
+
if (field.type === "url" &&
|
|
118
|
+
value &&
|
|
119
|
+
typeof value === "object" &&
|
|
120
|
+
value.type === "internal" &&
|
|
121
|
+
value.relationTo &&
|
|
122
|
+
value.value) {
|
|
123
|
+
const relatedCollection = this.collections.find((c) => c.slug === value.relationTo);
|
|
124
|
+
if (relatedCollection) {
|
|
125
|
+
const doc = await this.db.findOne({
|
|
126
|
+
collection: value.relationTo,
|
|
127
|
+
id: value.value,
|
|
128
|
+
});
|
|
129
|
+
if (doc && typeof doc === "object") {
|
|
130
|
+
const docWithDefaults = DefaultsService.apply(relatedCollection.fields, doc);
|
|
131
|
+
const populatedDocValue = await this.populate({
|
|
132
|
+
data: docWithDefaults,
|
|
133
|
+
fields: relatedCollection.fields,
|
|
134
|
+
currentDepth: currentDepth + 1,
|
|
135
|
+
maxDepth,
|
|
136
|
+
});
|
|
137
|
+
const identifier = docWithDefaults.slug || docWithDefaults.id;
|
|
138
|
+
let resolvedUrl = `/collections/${value.relationTo}/${identifier}`;
|
|
139
|
+
const previewUrlPattern = relatedCollection.admin?.previewUrl ||
|
|
140
|
+
relatedCollection.admin?.urlPattern;
|
|
141
|
+
if (previewUrlPattern) {
|
|
142
|
+
if (typeof previewUrlPattern === "function") {
|
|
143
|
+
try {
|
|
144
|
+
resolvedUrl =
|
|
145
|
+
previewUrlPattern(docWithDefaults, { locale: "en" }) ||
|
|
146
|
+
resolvedUrl;
|
|
147
|
+
}
|
|
148
|
+
catch { }
|
|
149
|
+
}
|
|
150
|
+
else if (typeof previewUrlPattern === "string") {
|
|
151
|
+
if (previewUrlPattern.includes("{{")) {
|
|
152
|
+
resolvedUrl = previewUrlPattern.replace(/{{(.*?)}}/g, (_, key) => String(docWithDefaults[key.trim()] || ""));
|
|
153
|
+
}
|
|
154
|
+
else if (previewUrlPattern.includes("+") ||
|
|
155
|
+
previewUrlPattern.includes("?") ||
|
|
156
|
+
previewUrlPattern.includes("==") ||
|
|
157
|
+
previewUrlPattern.includes("siteUrl")) {
|
|
158
|
+
try {
|
|
159
|
+
resolvedUrl = jexl.evalSync(previewUrlPattern, docWithDefaults);
|
|
160
|
+
}
|
|
161
|
+
catch (_err) {
|
|
162
|
+
resolvedUrl = previewUrlPattern.replace(/:([a-zA-Z0-9_]+)/g, (_, key) => String(docWithDefaults[key] || ""));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
resolvedUrl = previewUrlPattern.replace(/:([a-zA-Z0-9_]+)/g, (_, key) => String(docWithDefaults[key] || ""));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
populatedDoc[field.name] = {
|
|
171
|
+
...value,
|
|
172
|
+
url: resolvedUrl,
|
|
173
|
+
doc: populatedDocValue,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Handle Nested Fields (Arrays/Objects)
|
|
179
|
+
if ((field.type === "array" || field.type === "object") &&
|
|
180
|
+
field.fields &&
|
|
181
|
+
value) {
|
|
182
|
+
populatedDoc[field.name] = await this.populate({
|
|
183
|
+
data: value,
|
|
184
|
+
fields: field.fields,
|
|
185
|
+
currentDepth, // Nested fields don't consume depth, only relationships do
|
|
186
|
+
maxDepth,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
// Handle Blocks
|
|
190
|
+
if (field.type === "blocks" && field.blocks && Array.isArray(value)) {
|
|
191
|
+
populatedDoc[field.name] = await Promise.all(value.map(async (blockData) => {
|
|
192
|
+
const blockConfig = field.blocks.find((b) => b.slug === blockData.blockType);
|
|
193
|
+
if (!blockConfig)
|
|
194
|
+
return blockData;
|
|
195
|
+
return this.populate({
|
|
196
|
+
data: blockData,
|
|
197
|
+
fields: blockConfig.fields,
|
|
198
|
+
currentDepth,
|
|
199
|
+
maxDepth,
|
|
200
|
+
});
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return populatedDoc;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Helper to populate a PaginatedResult
|
|
208
|
+
*/
|
|
209
|
+
async populateResult(result, fields, maxDepth) {
|
|
210
|
+
if (maxDepth <= 0)
|
|
211
|
+
return result;
|
|
212
|
+
const populatedDocs = await this.populate({
|
|
213
|
+
data: result.docs,
|
|
214
|
+
fields,
|
|
215
|
+
currentDepth: 0,
|
|
216
|
+
maxDepth,
|
|
217
|
+
});
|
|
218
|
+
return {
|
|
219
|
+
...result,
|
|
220
|
+
docs: populatedDocs,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=population.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"population.service.js","sourceRoot":"","sources":["../../src/services/population.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AuthenticatedUser, HookRequestContext } from "./request.js";
|
|
2
|
+
export interface AccessFunctionArgs<TDoc extends object = Record<string, unknown>, TUser extends AuthenticatedUser = AuthenticatedUser> {
|
|
3
|
+
user: TUser | undefined;
|
|
4
|
+
doc?: TDoc;
|
|
5
|
+
data?: Partial<TDoc>;
|
|
6
|
+
req: HookRequestContext;
|
|
7
|
+
}
|
|
8
|
+
export interface NamedAccessPolicy<TDoc extends object = Record<string, unknown>> {
|
|
9
|
+
policy: string;
|
|
10
|
+
params?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export type AccessResult = boolean | Record<string, unknown>;
|
|
13
|
+
/**
|
|
14
|
+
* A function that determines whether the current user can perform an operation.
|
|
15
|
+
*
|
|
16
|
+
* Return `true` to allow, `false` to deny.
|
|
17
|
+
* Return a `where`-style object to allow access only to matching documents
|
|
18
|
+
* (useful for multi-tenant setups where users can only see their own data).
|
|
19
|
+
*
|
|
20
|
+
* Can also be expressed as a Jexl expression **string** for simple role checks
|
|
21
|
+
* that need to be serialised (e.g. stored in the database or sent to the Admin UI).
|
|
22
|
+
*
|
|
23
|
+
* @template TDoc The shape of the collection's document.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Simple role check
|
|
27
|
+
* access: {
|
|
28
|
+
* delete: ({ user }) => user?.roles?.includes('admin') ?? false,
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* // Row-level: users can only read their own documents
|
|
33
|
+
* access: {
|
|
34
|
+
* read: ({ user }) => ({ owner: { equals: user?.sub } }),
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* // Jexl string — evaluated server-side
|
|
39
|
+
* access: {
|
|
40
|
+
* update: "user.roles contains 'editor'",
|
|
41
|
+
* }
|
|
42
|
+
*/
|
|
43
|
+
export type AccessFunction<TDoc extends object = Record<string, unknown>, TUser extends AuthenticatedUser = AuthenticatedUser> = (args: AccessFunctionArgs<TDoc, TUser>) => AccessResult | Promise<AccessResult>;
|
|
44
|
+
export type AccessRule<TDoc extends object = Record<string, unknown>, TUser extends AuthenticatedUser = AuthenticatedUser> = boolean | string | AccessFunction<TDoc, TUser> | NamedAccessPolicy<TDoc>;
|
|
45
|
+
export type AccessPolicyResolver<TDoc extends object = Record<string, unknown>, TUser extends AuthenticatedUser = AuthenticatedUser> = (args: AccessFunctionArgs<TDoc, TUser> & {
|
|
46
|
+
params?: Record<string, unknown>;
|
|
47
|
+
}) => AccessResult | Promise<AccessResult>;
|
|
48
|
+
//# sourceMappingURL=access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/types/access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE1E,MAAM,WAAW,kBAAkB,CACjC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,KAAK,SAAS,iBAAiB,GAAG,iBAAiB;IAEnD,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,GAAG,EAAE,kBAAkB,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,KAAK,SAAS,iBAAiB,GAAG,iBAAiB,IACjD,CACF,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,KAClC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAE1C,MAAM,MAAM,UAAU,CACpB,IAAI,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,KAAK,SAAS,iBAAiB,GAAG,iBAAiB,IAEjD,OAAO,GACP,MAAM,GACN,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,GAC3B,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAE5B,MAAM,MAAM,oBAAoB,CAC9B,IAAI,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,KAAK,SAAS,iBAAiB,GAAG,iBAAiB,IACjD,CACF,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KACzE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/types/access.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { BaseDocument, FileData, PaginatedResult } from "./documents.js";
|
|
2
|
+
import type { CollectionConfig, GlobalConfig } from "./schema-config.js";
|
|
3
|
+
import type { Field, UploadConfig } from "./schema-core.js";
|
|
4
|
+
/**
|
|
5
|
+
* The interface every database adapter must implement.
|
|
6
|
+
*
|
|
7
|
+
* Dyrected ships adapters for PostgreSQL, MySQL, SQLite, and MongoDB.
|
|
8
|
+
* Implement this interface to connect any other database.
|
|
9
|
+
*/
|
|
10
|
+
export interface DatabaseAdapter {
|
|
11
|
+
/** Find a paginated list of documents in a collection. */
|
|
12
|
+
find(args: {
|
|
13
|
+
collection: string;
|
|
14
|
+
where?: Record<string, unknown>;
|
|
15
|
+
limit?: number;
|
|
16
|
+
page?: number;
|
|
17
|
+
sort?: string;
|
|
18
|
+
/**
|
|
19
|
+
* The collection's field definitions. Optional, so simple adapters can
|
|
20
|
+
* ignore it; SQL adapters use it to sort numeric fields by magnitude.
|
|
21
|
+
*/
|
|
22
|
+
fields?: Field[];
|
|
23
|
+
}): Promise<PaginatedResult>;
|
|
24
|
+
/** Find a single document by its ID. Returns `null` if not found. */
|
|
25
|
+
findOne(args: {
|
|
26
|
+
collection: string;
|
|
27
|
+
id: string;
|
|
28
|
+
}): Promise<BaseDocument | null>;
|
|
29
|
+
/** Insert a new document and return it with its generated `id`. */
|
|
30
|
+
create(args: {
|
|
31
|
+
collection: string;
|
|
32
|
+
data: Record<string, unknown>;
|
|
33
|
+
}): Promise<BaseDocument>;
|
|
34
|
+
/** Update a document by ID and return the updated document. */
|
|
35
|
+
update(args: {
|
|
36
|
+
collection: string;
|
|
37
|
+
id: string;
|
|
38
|
+
data: Record<string, unknown>;
|
|
39
|
+
}): Promise<BaseDocument>;
|
|
40
|
+
/** Delete a document by ID. Return value is intentionally untyped — callers do not use it. */
|
|
41
|
+
delete(args: {
|
|
42
|
+
collection: string;
|
|
43
|
+
id: string;
|
|
44
|
+
}): Promise<unknown>;
|
|
45
|
+
/** Fetch the singleton document for a global. Returns an empty object if not yet initialised. */
|
|
46
|
+
getGlobal(args: {
|
|
47
|
+
slug: string;
|
|
48
|
+
}): Promise<Record<string, unknown>>;
|
|
49
|
+
/** Create or replace the singleton document for a global. */
|
|
50
|
+
updateGlobal(args: {
|
|
51
|
+
slug: string;
|
|
52
|
+
data: Record<string, unknown>;
|
|
53
|
+
}): Promise<Record<string, unknown>>;
|
|
54
|
+
/**
|
|
55
|
+
* Sync the database schema with the current collection and global configs.
|
|
56
|
+
* Called on startup to create tables/collections that don't exist yet.
|
|
57
|
+
* Not all adapters implement this (e.g. MongoDB is schema-less).
|
|
58
|
+
*/
|
|
59
|
+
sync?(collections: CollectionConfig[], globals: GlobalConfig[]): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Execute a raw SQL query or database command.
|
|
62
|
+
* Optional — not all adapters support raw access.
|
|
63
|
+
*/
|
|
64
|
+
execute?(query: string, params?: unknown[]): Promise<unknown>;
|
|
65
|
+
/**
|
|
66
|
+
* Run all adapter operations in `callback` as one atomic transaction.
|
|
67
|
+
* Shipped adapters implement this; workflow transitions require it.
|
|
68
|
+
*/
|
|
69
|
+
transaction?<T>(callback: (db: DatabaseAdapter) => Promise<T>): Promise<T>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Read-only view of the database adapter. Exposes only `find`, `findOne`,
|
|
73
|
+
* and `getGlobal` — no write operations.
|
|
74
|
+
*
|
|
75
|
+
* Passed to `beforeChange`, `beforeDelete`, `beforeRead`, `afterRead`,
|
|
76
|
+
* and field-level hooks. Write operations are available in `afterChange`
|
|
77
|
+
* and `afterDelete` hooks where the full {@link DatabaseAdapter} is provided.
|
|
78
|
+
*/
|
|
79
|
+
export type ReadonlyDatabaseAdapter = Pick<DatabaseAdapter, "find" | "findOne" | "getGlobal">;
|
|
80
|
+
/**
|
|
81
|
+
* The interface every storage adapter must implement.
|
|
82
|
+
*
|
|
83
|
+
* Dyrected ships adapters for local disk, AWS S3 and other S3-compatible
|
|
84
|
+
* services through the S3 adapter, Cloudinary, and Backblaze B2. Implement
|
|
85
|
+
* this interface to use any other storage provider.
|
|
86
|
+
*/
|
|
87
|
+
export interface StorageAdapter {
|
|
88
|
+
/**
|
|
89
|
+
* Upload a file and return its metadata (URL, dimensions, etc.).
|
|
90
|
+
* The `prefix` is a path prefix used for multi-tenant setups.
|
|
91
|
+
*/
|
|
92
|
+
upload(args: {
|
|
93
|
+
filename: string;
|
|
94
|
+
buffer: Uint8Array;
|
|
95
|
+
mimeType: string;
|
|
96
|
+
prefix?: string;
|
|
97
|
+
}): Promise<FileData>;
|
|
98
|
+
/** Delete a file by its stored filename. */
|
|
99
|
+
delete(args: {
|
|
100
|
+
filename: string;
|
|
101
|
+
}): Promise<void>;
|
|
102
|
+
/** Return the public URL for a stored file. */
|
|
103
|
+
getURL(args: {
|
|
104
|
+
filename: string;
|
|
105
|
+
}): string;
|
|
106
|
+
/**
|
|
107
|
+
* Retrieve the file's raw bytes and MIME type for serving via the API.
|
|
108
|
+
* Only needed by adapters that serve files through the Dyrected API
|
|
109
|
+
* (e.g. `LocalStorage`). Cloud adapters return `null` here and rely on
|
|
110
|
+
* direct CDN URLs instead.
|
|
111
|
+
*/
|
|
112
|
+
resolve?(args: {
|
|
113
|
+
filename: string;
|
|
114
|
+
}): Promise<{
|
|
115
|
+
buffer: Uint8Array;
|
|
116
|
+
mimeType: string;
|
|
117
|
+
} | null>;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Processes uploaded images — generates metadata (dimensions, BlurHash) and
|
|
121
|
+
* produces resized variants defined in `UploadConfig.imageSizes`.
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* import { SharpImageService } from '@dyrected/image-sharp'
|
|
125
|
+
* defineConfig({ image: new SharpImageService(), ... })
|
|
126
|
+
*/
|
|
127
|
+
export interface ImageService {
|
|
128
|
+
process(args: {
|
|
129
|
+
buffer: Uint8Array;
|
|
130
|
+
mimeType: string;
|
|
131
|
+
config?: boolean | UploadConfig;
|
|
132
|
+
focalPoint?: {
|
|
133
|
+
x: number;
|
|
134
|
+
y: number;
|
|
135
|
+
};
|
|
136
|
+
}): Promise<{
|
|
137
|
+
metadata: {
|
|
138
|
+
width?: number;
|
|
139
|
+
height?: number;
|
|
140
|
+
/** Base64-encoded BlurHash for progressive loading. */
|
|
141
|
+
blurhash?: string;
|
|
142
|
+
};
|
|
143
|
+
/** Generated image sizes keyed by their `name`. */
|
|
144
|
+
sizes?: Record<string, {
|
|
145
|
+
buffer: Uint8Array;
|
|
146
|
+
width: number;
|
|
147
|
+
height: number;
|
|
148
|
+
filename: string;
|
|
149
|
+
}>;
|
|
150
|
+
}>;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/types/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd;;;WAGG;QACH,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;KAClB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE7B,qEAAqE;IACrE,OAAO,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAEhF,mEAAmE;IACnE,MAAM,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3F,+DAA+D;IAC/D,MAAM,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAEvG,8FAA8F;IAC9F,MAAM,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnE,iGAAiG;IACjG,SAAS,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpE,6DAA6D;IAC7D,YAAY,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtG;;;;OAIG;IACH,IAAI,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/E;;;OAGG;IACH,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9D;;;OAGG;IACH,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5E;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC;AAE9F;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE7G,4CAA4C;IAC5C,MAAM,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD,+CAA+C;IAC/C,MAAM,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IAE3C;;;;;OAKG;IACH,OAAO,CAAC,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CAChG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,IAAI,EAAE;QACZ,MAAM,EAAE,UAAU,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;QAChC,UAAU,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACvC,GAAG,OAAO,CAAC;QACV,QAAQ,EAAE;YACR,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,uDAAuD;YACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,mDAAmD;QACnD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,UAAU,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjG,CAAC,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/types/adapters.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { HookRequestContext } from "./request.js";
|
|
2
|
+
export interface AdminAuthMember {
|
|
3
|
+
id: string;
|
|
4
|
+
email: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
roles: string[];
|
|
7
|
+
siteAccess?: string[];
|
|
8
|
+
status?: "active" | "pending";
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
export type AdminAuthProvisioningMode = "jit_only" | "jit_plus_membership_management" | "preprovisioned_only";
|
|
12
|
+
export interface AdminAuthClaimMapping {
|
|
13
|
+
sub?: string;
|
|
14
|
+
email?: string;
|
|
15
|
+
name?: string;
|
|
16
|
+
roles?: string;
|
|
17
|
+
groups?: string;
|
|
18
|
+
siteIds?: string;
|
|
19
|
+
workspaceIds?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface AdminAuthResolvedIdentity {
|
|
22
|
+
sub: string;
|
|
23
|
+
email?: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
roles?: string[];
|
|
26
|
+
groups?: string[];
|
|
27
|
+
siteIds?: string[];
|
|
28
|
+
workspaceIds?: string[];
|
|
29
|
+
rawClaims?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export interface AdminAuthAccessResolution {
|
|
32
|
+
allowed: boolean;
|
|
33
|
+
roles?: string[];
|
|
34
|
+
data?: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
export interface AdminAuthResolveAccessArgs {
|
|
37
|
+
identity: AdminAuthResolvedIdentity;
|
|
38
|
+
providerId: string;
|
|
39
|
+
siteId?: string;
|
|
40
|
+
workspaceId?: string;
|
|
41
|
+
req: {
|
|
42
|
+
method: string;
|
|
43
|
+
path: string;
|
|
44
|
+
url: string;
|
|
45
|
+
headers: Record<string, string | undefined>;
|
|
46
|
+
};
|
|
47
|
+
user: Record<string, unknown> | null;
|
|
48
|
+
}
|
|
49
|
+
export interface AdminAuthProviderMembersConfig {
|
|
50
|
+
list?: (args: {
|
|
51
|
+
limit?: number;
|
|
52
|
+
page?: number;
|
|
53
|
+
sort?: string;
|
|
54
|
+
where?: Record<string, any>;
|
|
55
|
+
req: HookRequestContext;
|
|
56
|
+
}) => Promise<{
|
|
57
|
+
docs: AdminAuthMember[];
|
|
58
|
+
totalDocs: number;
|
|
59
|
+
limit: number;
|
|
60
|
+
page: number;
|
|
61
|
+
totalPages: number;
|
|
62
|
+
hasNextPage: boolean;
|
|
63
|
+
hasPrevPage: boolean;
|
|
64
|
+
}>;
|
|
65
|
+
get?: (args: {
|
|
66
|
+
externalSubject: string;
|
|
67
|
+
req: HookRequestContext;
|
|
68
|
+
}) => Promise<AdminAuthMember | null>;
|
|
69
|
+
create?: (args: {
|
|
70
|
+
data: Record<string, any>;
|
|
71
|
+
req: HookRequestContext;
|
|
72
|
+
}) => Promise<AdminAuthMember>;
|
|
73
|
+
update?: (args: {
|
|
74
|
+
externalSubject: string;
|
|
75
|
+
data: Record<string, any>;
|
|
76
|
+
req: HookRequestContext;
|
|
77
|
+
}) => Promise<AdminAuthMember>;
|
|
78
|
+
delete?: (args: {
|
|
79
|
+
externalSubject: string;
|
|
80
|
+
req: HookRequestContext;
|
|
81
|
+
}) => Promise<void>;
|
|
82
|
+
}
|
|
83
|
+
export interface BaseAdminAuthProvider {
|
|
84
|
+
id: string;
|
|
85
|
+
type: "oidc" | "custom" | "cloud";
|
|
86
|
+
displayName?: string;
|
|
87
|
+
autoRedirect?: boolean;
|
|
88
|
+
allowJitProvisioning?: boolean;
|
|
89
|
+
claimMapping?: AdminAuthClaimMapping;
|
|
90
|
+
members?: AdminAuthProviderMembersConfig;
|
|
91
|
+
}
|
|
92
|
+
export interface OIDCAdminAuthProvider extends BaseAdminAuthProvider {
|
|
93
|
+
type: "oidc";
|
|
94
|
+
issuer: string;
|
|
95
|
+
clientId: string;
|
|
96
|
+
clientSecret: string;
|
|
97
|
+
redirectUri?: string;
|
|
98
|
+
scopes?: string[];
|
|
99
|
+
authorizationEndpoint?: string;
|
|
100
|
+
tokenEndpoint?: string;
|
|
101
|
+
userInfoEndpoint?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface CustomAdminAuthProvider extends BaseAdminAuthProvider {
|
|
104
|
+
type: "custom" | "cloud";
|
|
105
|
+
startUrl?: string;
|
|
106
|
+
issuer?: string;
|
|
107
|
+
audience?: string;
|
|
108
|
+
secret?: string;
|
|
109
|
+
jwksUri?: string;
|
|
110
|
+
tokenParam?: string;
|
|
111
|
+
}
|
|
112
|
+
export type AdminAuthProvider = OIDCAdminAuthProvider | CustomAdminAuthProvider;
|
|
113
|
+
export interface PublicAdminAuthProvider {
|
|
114
|
+
id: string;
|
|
115
|
+
type: AdminAuthProvider["type"];
|
|
116
|
+
displayName: string;
|
|
117
|
+
autoRedirect?: boolean;
|
|
118
|
+
}
|
|
119
|
+
export interface PublicAdminAuthConfig {
|
|
120
|
+
mode: "local" | "external";
|
|
121
|
+
collectionSlug?: string;
|
|
122
|
+
provisioningMode?: AdminAuthProvisioningMode;
|
|
123
|
+
providers: PublicAdminAuthProvider[];
|
|
124
|
+
}
|
|
125
|
+
export interface AdminAuthConfig {
|
|
126
|
+
mode: "local" | "external";
|
|
127
|
+
collectionSlug?: string;
|
|
128
|
+
provisioningMode?: AdminAuthProvisioningMode;
|
|
129
|
+
providers: AdminAuthProvider[];
|
|
130
|
+
resolveAccess?: (args: AdminAuthResolveAccessArgs) => Promise<AdminAuthAccessResolution> | AdminAuthAccessResolution;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=admin-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-auth.d.ts","sourceRoot":"","sources":["../../src/types/admin-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-auth.js","sourceRoot":"","sources":["../../src/types/admin-auth.ts"],"names":[],"mappings":""}
|