@dyrected/core 2.5.51 → 2.5.53
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__/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__/config.test.js +57 -0
- package/dist/__tests__/config.test.js.map +1 -1
- 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 +46 -0
- package/dist/__tests__/email.service.test.js.map +1 -0
- package/dist/__tests__/fixtures/editorial-workflow.d.ts +9 -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__/mocks.d.ts +6 -0
- package/dist/__tests__/mocks.d.ts.map +1 -1
- package/dist/__tests__/mocks.js +8 -0
- package/dist/__tests__/mocks.js.map +1 -1
- 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 +95 -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.js +4 -0
- package/dist/__tests__/router.test.js.map +1 -1
- package/dist/__tests__/where.test.js +9 -1
- package/dist/__tests__/where.test.js.map +1 -1
- 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 +497 -0
- package/dist/__tests__/workflow.test.js.map +1 -0
- package/dist/app-config-DLK6bCaP.d.cts +1390 -0
- package/dist/app-config-DLK6bCaP.d.ts +1390 -0
- package/dist/app-config-DqCipvSI.d.cts +1411 -0
- package/dist/app-config-DqCipvSI.d.ts +1411 -0
- package/dist/app-config-oOarB6Fw.d.cts +1411 -0
- package/dist/app-config-oOarB6Fw.d.ts +1411 -0
- package/dist/auth/token.d.ts +2 -0
- package/dist/auth/token.d.ts.map +1 -1
- package/dist/auth/token.js.map +1 -1
- package/dist/controllers/admin-auth.controller.d.ts +68 -0
- package/dist/controllers/admin-auth.controller.d.ts.map +1 -0
- package/dist/controllers/admin-auth.controller.js +414 -0
- package/dist/controllers/admin-auth.controller.js.map +1 -0
- package/dist/controllers/collection.controller.d.ts +69 -0
- package/dist/controllers/collection.controller.d.ts.map +1 -1
- package/dist/controllers/collection.controller.js +232 -7
- package/dist/controllers/collection.controller.js.map +1 -1
- package/dist/controllers/global.controller.js +19 -3
- package/dist/controllers/global.controller.js.map +1 -1
- package/dist/controllers/media.controller.d.ts +2 -0
- package/dist/controllers/media.controller.d.ts.map +1 -1
- package/dist/controllers/media.controller.js +13 -6
- package/dist/controllers/media.controller.js.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +168 -6
- package/dist/router.js.map +1 -1
- package/dist/server.cjs +54 -8
- package/dist/server.d.cts +7 -1
- package/dist/server.d.ts +7 -1
- package/dist/server.js +54 -8
- 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.map +1 -1
- package/dist/services/email.service.js +25 -148
- package/dist/services/email.service.js.map +1 -1
- package/dist/services/population.service.d.ts.map +1 -1
- package/dist/services/population.service.js +27 -1
- package/dist/services/population.service.js.map +1 -1
- package/dist/types/access.d.ts +38 -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 +146 -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 +65 -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 +143 -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 +12 -1748
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +12 -2
- package/dist/types/index.js.map +1 -1
- 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 +303 -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 +294 -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 +84 -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/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/config.d.ts.map +1 -1
- package/dist/utils/config.js +86 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/hooks.d.ts.map +1 -1
- package/dist/utils/hooks.js +12 -8
- package/dist/utils/hooks.js.map +1 -1
- package/dist/utils/openapi.d.ts.map +1 -1
- package/dist/utils/openapi.js +559 -48
- package/dist/utils/openapi.js.map +1 -1
- package/dist/utils/parse-sort.d.ts +7 -0
- package/dist/utils/parse-sort.d.ts.map +1 -0
- package/dist/utils/parse-sort.js +23 -0
- package/dist/utils/parse-sort.js.map +1 -0
- package/dist/utils/swagger.d.ts +6 -0
- package/dist/utils/swagger.d.ts.map +1 -1
- package/dist/utils/swagger.js +13 -2
- package/dist/utils/swagger.js.map +1 -1
- 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 +44 -0
- package/dist/utils/upload-validation.js.map +1 -0
- package/dist/utils/where-sanitizer.d.ts.map +1 -1
- package/dist/utils/where-sanitizer.js +4 -0
- package/dist/utils/where-sanitizer.js.map +1 -1
- package/dist/workflows.d.ts +54 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +282 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AuthenticatedUser, HookRequestContext } from "./request.js";
|
|
2
|
+
/**
|
|
3
|
+
* A function that determines whether the current user can perform an operation.
|
|
4
|
+
*
|
|
5
|
+
* Return `true` to allow, `false` to deny.
|
|
6
|
+
* Return a `where`-style object to allow access only to matching documents
|
|
7
|
+
* (useful for multi-tenant setups where users can only see their own data).
|
|
8
|
+
*
|
|
9
|
+
* Can also be expressed as a Jexl expression **string** for simple role checks
|
|
10
|
+
* that need to be serialised (e.g. stored in the database or sent to the Admin UI).
|
|
11
|
+
*
|
|
12
|
+
* @template TDoc The shape of the collection's document.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Simple role check
|
|
16
|
+
* access: {
|
|
17
|
+
* delete: ({ user }) => user?.roles?.includes('admin') ?? false,
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Row-level: users can only read their own documents
|
|
22
|
+
* access: {
|
|
23
|
+
* read: ({ user }) => ({ owner: { equals: user?.sub } }),
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* // Jexl string — evaluated server-side
|
|
28
|
+
* access: {
|
|
29
|
+
* update: "user.roles contains 'editor'",
|
|
30
|
+
* }
|
|
31
|
+
*/
|
|
32
|
+
export type AccessFunction<TDoc extends object = Record<string, unknown>> = (args: {
|
|
33
|
+
user: AuthenticatedUser | undefined;
|
|
34
|
+
doc?: TDoc;
|
|
35
|
+
data?: Partial<TDoc>;
|
|
36
|
+
req: HookRequestContext;
|
|
37
|
+
}) => boolean | Record<string, unknown> | Promise<boolean | Record<string, unknown>>;
|
|
38
|
+
//# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,MAAM,cAAc,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;IACjF,IAAI,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACpC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,GAAG,EAAE,kBAAkB,CAAC;CACzB,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/types/access.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { BaseDocument, FileData, PaginatedResult } from "./documents.js";
|
|
2
|
+
import type { CollectionConfig, GlobalConfig } from "./schema-config.js";
|
|
3
|
+
import type { 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
|
+
}): Promise<PaginatedResult>;
|
|
19
|
+
/** Find a single document by its ID. Returns `null` if not found. */
|
|
20
|
+
findOne(args: {
|
|
21
|
+
collection: string;
|
|
22
|
+
id: string;
|
|
23
|
+
}): Promise<BaseDocument | null>;
|
|
24
|
+
/** Insert a new document and return it with its generated `id`. */
|
|
25
|
+
create(args: {
|
|
26
|
+
collection: string;
|
|
27
|
+
data: Record<string, unknown>;
|
|
28
|
+
}): Promise<BaseDocument>;
|
|
29
|
+
/** Update a document by ID and return the updated document. */
|
|
30
|
+
update(args: {
|
|
31
|
+
collection: string;
|
|
32
|
+
id: string;
|
|
33
|
+
data: Record<string, unknown>;
|
|
34
|
+
}): Promise<BaseDocument>;
|
|
35
|
+
/** Delete a document by ID. Return value is intentionally untyped — callers do not use it. */
|
|
36
|
+
delete(args: {
|
|
37
|
+
collection: string;
|
|
38
|
+
id: string;
|
|
39
|
+
}): Promise<unknown>;
|
|
40
|
+
/** Fetch the singleton document for a global. Returns an empty object if not yet initialised. */
|
|
41
|
+
getGlobal(args: {
|
|
42
|
+
slug: string;
|
|
43
|
+
}): Promise<Record<string, unknown>>;
|
|
44
|
+
/** Create or replace the singleton document for a global. */
|
|
45
|
+
updateGlobal(args: {
|
|
46
|
+
slug: string;
|
|
47
|
+
data: Record<string, unknown>;
|
|
48
|
+
}): Promise<Record<string, unknown>>;
|
|
49
|
+
/**
|
|
50
|
+
* Sync the database schema with the current collection and global configs.
|
|
51
|
+
* Called on startup to create tables/collections that don't exist yet.
|
|
52
|
+
* Not all adapters implement this (e.g. MongoDB is schema-less).
|
|
53
|
+
*/
|
|
54
|
+
sync?(collections: CollectionConfig[], globals: GlobalConfig[]): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Execute a raw SQL query or database command.
|
|
57
|
+
* Optional — not all adapters support raw access.
|
|
58
|
+
*/
|
|
59
|
+
execute?(query: string, params?: unknown[]): Promise<unknown>;
|
|
60
|
+
/**
|
|
61
|
+
* Run all adapter operations in `callback` as one atomic transaction.
|
|
62
|
+
* Shipped adapters implement this; workflow transitions require it.
|
|
63
|
+
*/
|
|
64
|
+
transaction?<T>(callback: (db: DatabaseAdapter) => Promise<T>): Promise<T>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Read-only view of the database adapter. Exposes only `find`, `findOne`,
|
|
68
|
+
* and `getGlobal` — no write operations.
|
|
69
|
+
*
|
|
70
|
+
* Passed to `beforeChange`, `beforeDelete`, `beforeRead`, `afterRead`,
|
|
71
|
+
* and field-level hooks. Write operations are available in `afterChange`
|
|
72
|
+
* and `afterDelete` hooks where the full {@link DatabaseAdapter} is provided.
|
|
73
|
+
*/
|
|
74
|
+
export type ReadonlyDatabaseAdapter = Pick<DatabaseAdapter, "find" | "findOne" | "getGlobal">;
|
|
75
|
+
/**
|
|
76
|
+
* The interface every storage adapter must implement.
|
|
77
|
+
*
|
|
78
|
+
* Dyrected ships adapters for local disk, S3, Cloudflare R2, Cloudinary, and
|
|
79
|
+
* Backblaze B2. Implement this interface to use any other storage provider.
|
|
80
|
+
*/
|
|
81
|
+
export interface StorageAdapter {
|
|
82
|
+
/**
|
|
83
|
+
* Upload a file and return its metadata (URL, dimensions, etc.).
|
|
84
|
+
* The `prefix` is a path prefix used for multi-tenant setups.
|
|
85
|
+
*/
|
|
86
|
+
upload(args: {
|
|
87
|
+
filename: string;
|
|
88
|
+
buffer: Uint8Array;
|
|
89
|
+
mimeType: string;
|
|
90
|
+
prefix?: string;
|
|
91
|
+
}): Promise<FileData>;
|
|
92
|
+
/** Delete a file by its stored filename. */
|
|
93
|
+
delete(args: {
|
|
94
|
+
filename: string;
|
|
95
|
+
}): Promise<void>;
|
|
96
|
+
/** Return the public URL for a stored file. */
|
|
97
|
+
getURL(args: {
|
|
98
|
+
filename: string;
|
|
99
|
+
}): string;
|
|
100
|
+
/**
|
|
101
|
+
* Retrieve the file's raw bytes and MIME type for serving via the API.
|
|
102
|
+
* Only needed by adapters that serve files through the Dyrected API
|
|
103
|
+
* (e.g. `LocalStorage`). Cloud adapters return `null` here and rely on
|
|
104
|
+
* direct CDN URLs instead.
|
|
105
|
+
*/
|
|
106
|
+
resolve?(args: {
|
|
107
|
+
filename: string;
|
|
108
|
+
}): Promise<{
|
|
109
|
+
buffer: Uint8Array;
|
|
110
|
+
mimeType: string;
|
|
111
|
+
} | null>;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Processes uploaded images — generates metadata (dimensions, BlurHash) and
|
|
115
|
+
* produces resized variants defined in `UploadConfig.imageSizes`.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* import { SharpImageService } from '@dyrected/image-sharp'
|
|
119
|
+
* defineConfig({ image: new SharpImageService(), ... })
|
|
120
|
+
*/
|
|
121
|
+
export interface ImageService {
|
|
122
|
+
process(args: {
|
|
123
|
+
buffer: Uint8Array;
|
|
124
|
+
mimeType: string;
|
|
125
|
+
config?: boolean | UploadConfig;
|
|
126
|
+
focalPoint?: {
|
|
127
|
+
x: number;
|
|
128
|
+
y: number;
|
|
129
|
+
};
|
|
130
|
+
}): Promise<{
|
|
131
|
+
metadata: {
|
|
132
|
+
width?: number;
|
|
133
|
+
height?: number;
|
|
134
|
+
/** Base64-encoded BlurHash for progressive loading. */
|
|
135
|
+
blurhash?: string;
|
|
136
|
+
};
|
|
137
|
+
/** Generated image sizes keyed by their `name`. */
|
|
138
|
+
sizes?: Record<string, {
|
|
139
|
+
buffer: Uint8Array;
|
|
140
|
+
width: number;
|
|
141
|
+
height: number;
|
|
142
|
+
filename: string;
|
|
143
|
+
}>;
|
|
144
|
+
}>;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/types/adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,MAAM,yBAAyB,GACjC,UAAU,GACV,gCAAgC,GAChC,qBAAqB,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,yBAAyB,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE;QACH,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;KAC7C,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,GAAG,EAAE,kBAAkB,CAAC;KACzB,KAAK,OAAO,CAAC;QACZ,IAAI,EAAE,eAAe,EAAE,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC,CAAC;IACH,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,kBAAkB,CAAA;KAAE,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACtG,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,EAAE,kBAAkB,CAAA;KAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACpG,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,EAAE,kBAAkB,CAAA;KAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7H,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,kBAAkB,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxF;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,YAAY,CAAC,EAAE,qBAAqB,CAAC;IACrC,OAAO,CAAC,EAAE,8BAA8B,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GACzB,qBAAqB,GACrB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAC7C,SAAS,EAAE,uBAAuB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAC7C,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,CACd,IAAI,EAAE,0BAA0B,KAC7B,OAAO,CAAC,yBAAyB,CAAC,GAAG,yBAAyB,CAAC;CACrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-auth.js","sourceRoot":"","sources":["../../src/types/admin-auth.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { icons as lucideIcons } from "lucide-react";
|
|
2
|
+
/** A valid icon component name from the Lucide icon set bundled with Dyrected Admin. */
|
|
3
|
+
export type AdminIconName = keyof typeof lucideIcons;
|
|
4
|
+
/** Ordered custom component keys rendered around the built-in Admin dashboard. */
|
|
5
|
+
export interface AdminDashboardComponentSlots {
|
|
6
|
+
beforeDashboard?: string[];
|
|
7
|
+
afterDashboard?: string[];
|
|
8
|
+
}
|
|
9
|
+
/** Ordered custom component keys rendered around a collection's list content. */
|
|
10
|
+
export interface CollectionListComponentSlots {
|
|
11
|
+
beforeList?: string[];
|
|
12
|
+
beforeListTable?: string[];
|
|
13
|
+
afterListTable?: string[];
|
|
14
|
+
afterList?: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Branding and metadata options for the Dyrected Admin UI.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* admin: {
|
|
21
|
+
* branding: {
|
|
22
|
+
* logo: '/logo.svg',
|
|
23
|
+
* primaryColor: '#6366f1',
|
|
24
|
+
* },
|
|
25
|
+
* meta: {
|
|
26
|
+
* titleSuffix: '- My App',
|
|
27
|
+
* },
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
export interface AdminConfig {
|
|
31
|
+
/** Custom component slots around the built-in dashboard. */
|
|
32
|
+
components?: AdminDashboardComponentSlots;
|
|
33
|
+
branding?: {
|
|
34
|
+
/** Full logo image shown in the expanded sidebar. URL or imported image asset. */
|
|
35
|
+
logo?: string;
|
|
36
|
+
/** Compact logo mark used in the collapsed sidebar state. */
|
|
37
|
+
logoMark?: string;
|
|
38
|
+
/** Text alternative or addition to the logo image. */
|
|
39
|
+
logoText?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Primary accent colour as any CSS colour value.
|
|
42
|
+
* @example '#6366f1'
|
|
43
|
+
* @example 'hsl(240 50% 60%)'
|
|
44
|
+
*/
|
|
45
|
+
primaryColor?: string;
|
|
46
|
+
/** Browser tab favicon URL. */
|
|
47
|
+
favicon?: string;
|
|
48
|
+
/** Font family for body and UI text. Must be loaded separately. */
|
|
49
|
+
fontSans?: string;
|
|
50
|
+
/** Font family for headings. Must be loaded separately. */
|
|
51
|
+
fontSerif?: string;
|
|
52
|
+
};
|
|
53
|
+
meta?: {
|
|
54
|
+
/**
|
|
55
|
+
* String appended to every Admin page's `<title>`.
|
|
56
|
+
* @default '- Dyrected'
|
|
57
|
+
*/
|
|
58
|
+
titleSuffix?: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* The canonical/base URL of the frontend website for links and iframe live previews.
|
|
62
|
+
*/
|
|
63
|
+
siteUrl?: string;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/types/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAEzD,wFAAwF;AACxF,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,WAAW,CAAC;AAErD,kFAAkF;AAClF,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,iFAAiF;AACjF,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,4BAA4B,CAAC;IAC1C,QAAQ,CAAC,EAAE;QACT,kFAAkF;QAClF,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,6DAA6D;QAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,sDAAsD;QACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB;;;;WAIG;QACH,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,+BAA+B;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,mEAAmE;QACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,2DAA2D;QAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,IAAI,CAAC,EAAE;QACL;;;WAGG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/types/admin.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { AdminAuthConfig } from "./admin-auth.js";
|
|
2
|
+
import type { AdminConfig } from "./admin.js";
|
|
3
|
+
import type { DatabaseAdapter, ImageService, StorageAdapter } from "./adapters.js";
|
|
4
|
+
import type { LifecycleEventHandler } from "./workflows.js";
|
|
5
|
+
import type { CollectionConfig, GlobalConfig } from "./schema-config.js";
|
|
6
|
+
/**
|
|
7
|
+
* The root configuration object passed to `createDyrectedApp`.
|
|
8
|
+
*
|
|
9
|
+
* This is the single source of truth for your entire Dyrected instance —
|
|
10
|
+
* collections, globals, database adapter, storage, email, and more.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* import { defineConfig } from '@dyrected/core'
|
|
14
|
+
* import { SQLiteAdapter } from '@dyrected/db-sqlite'
|
|
15
|
+
*
|
|
16
|
+
* export default defineConfig({
|
|
17
|
+
* db: new SQLiteAdapter({ filename: './db.sqlite' }),
|
|
18
|
+
* collections: [Posts, Users],
|
|
19
|
+
* globals: [SiteSettings],
|
|
20
|
+
* })
|
|
21
|
+
*/
|
|
22
|
+
export interface DyrectedConfig {
|
|
23
|
+
/** Collection definitions. Each collection maps to a database table/collection. */
|
|
24
|
+
collections: CollectionConfig<any>[];
|
|
25
|
+
/** Global (singleton) definitions. Each global maps to a single document. */
|
|
26
|
+
globals: GlobalConfig<any>[];
|
|
27
|
+
/**
|
|
28
|
+
* The database adapter. Required for all data operations.
|
|
29
|
+
* @see DatabaseAdapter
|
|
30
|
+
*/
|
|
31
|
+
db?: DatabaseAdapter;
|
|
32
|
+
/**
|
|
33
|
+
* The storage adapter for file uploads.
|
|
34
|
+
* Required when any collection has `upload: true`.
|
|
35
|
+
* @see StorageAdapter
|
|
36
|
+
*/
|
|
37
|
+
storage?: StorageAdapter;
|
|
38
|
+
/**
|
|
39
|
+
* The image processing service. Required when any upload collection
|
|
40
|
+
* defines `imageSizes`.
|
|
41
|
+
* @see ImageService
|
|
42
|
+
*/
|
|
43
|
+
image?: ImageService;
|
|
44
|
+
/** Admin UI branding and metadata. */
|
|
45
|
+
admin?: AdminConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Deployment-level authentication strategy for the CMS dashboard (`/admin`).
|
|
48
|
+
* This is separate from collection-level `auth: true`, which continues to
|
|
49
|
+
* power application/customer auth independently.
|
|
50
|
+
*/
|
|
51
|
+
adminAuth?: AdminAuthConfig;
|
|
52
|
+
/**
|
|
53
|
+
* Email transport configuration. Required for welcome emails, password
|
|
54
|
+
* resets, and invite links.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* email: {
|
|
58
|
+
* from: 'no-reply@myapp.com',
|
|
59
|
+
* send: async ({ to, subject, html }) => {
|
|
60
|
+
* await resend.emails.send({ from, to, subject, html })
|
|
61
|
+
* },
|
|
62
|
+
* }
|
|
63
|
+
*/
|
|
64
|
+
email?: {
|
|
65
|
+
/** The `From` address for all outbound emails. */
|
|
66
|
+
from: string;
|
|
67
|
+
/** The send function. Wire in any email provider (Resend, SendGrid, SES, etc.). */
|
|
68
|
+
send: (args: {
|
|
69
|
+
to: string;
|
|
70
|
+
subject: string;
|
|
71
|
+
html: string;
|
|
72
|
+
}) => Promise<void>;
|
|
73
|
+
/** Override the default email templates. */
|
|
74
|
+
templates?: {
|
|
75
|
+
welcome?: (args: {
|
|
76
|
+
email: string;
|
|
77
|
+
}) => {
|
|
78
|
+
subject?: string;
|
|
79
|
+
html: string;
|
|
80
|
+
};
|
|
81
|
+
invite?: (args: {
|
|
82
|
+
token: string;
|
|
83
|
+
invitedByEmail?: string;
|
|
84
|
+
}) => {
|
|
85
|
+
subject?: string;
|
|
86
|
+
html: string;
|
|
87
|
+
};
|
|
88
|
+
resetPassword?: (args: {
|
|
89
|
+
token: string;
|
|
90
|
+
url?: string;
|
|
91
|
+
}) => {
|
|
92
|
+
subject?: string;
|
|
93
|
+
html: string;
|
|
94
|
+
};
|
|
95
|
+
passwordChanged?: (args: {
|
|
96
|
+
email: string;
|
|
97
|
+
}) => {
|
|
98
|
+
subject?: string;
|
|
99
|
+
html: string;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Redis connection URL. Required for distributed caching of dynamic option
|
|
105
|
+
* resolvers and other server-side caches in multi-instance deployments.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* redis: { url: process.env.REDIS_URL }
|
|
109
|
+
*/
|
|
110
|
+
redis?: {
|
|
111
|
+
url: string;
|
|
112
|
+
};
|
|
113
|
+
/** Durable lifecycle-event delivery configuration. */
|
|
114
|
+
events?: {
|
|
115
|
+
handlers: LifecycleEventHandler[];
|
|
116
|
+
/** Maximum delivery attempts before an event remains failed. Defaults to 8. */
|
|
117
|
+
maxAttempts?: number;
|
|
118
|
+
/** Initial exponential-backoff delay in milliseconds. Defaults to 1000. */
|
|
119
|
+
retryDelayMs?: number;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Cross-Origin Resource Sharing (CORS) configuration.
|
|
123
|
+
* List all origins that are allowed to call the Dyrected API.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* cors: { origins: ['https://myapp.com', 'https://www.myapp.com'] }
|
|
127
|
+
*/
|
|
128
|
+
cors?: {
|
|
129
|
+
origins: string[];
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Callback to dynamically fetch additional collections and globals for a
|
|
133
|
+
* given site ID at request time. Used in multi-tenant deployments where each
|
|
134
|
+
* site has its own schema stored in the database.
|
|
135
|
+
*/
|
|
136
|
+
onSchemaFetch?: (siteId: string) => Promise<{
|
|
137
|
+
collections?: CollectionConfig<any>[];
|
|
138
|
+
globals?: GlobalConfig<any>[];
|
|
139
|
+
admin?: AdminConfig;
|
|
140
|
+
adminAuth?: AdminAuthConfig;
|
|
141
|
+
}>;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=app-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-config.d.ts","sourceRoot":"","sources":["../../src/types/app-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-config.js","sourceRoot":"","sources":["../../src/types/app-config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The minimum shape of every document returned by the database layer.
|
|
3
|
+
*
|
|
4
|
+
* All documents have an `id` field assigned by the adapter. Additional fields
|
|
5
|
+
* are stored as `unknown` until you narrow them with your own interface.
|
|
6
|
+
*
|
|
7
|
+
* Use this as the base when declaring your collection document types:
|
|
8
|
+
* ```ts
|
|
9
|
+
* interface Post extends BaseDocument {
|
|
10
|
+
* title: string
|
|
11
|
+
* slug: string
|
|
12
|
+
* }
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export interface BaseDocument {
|
|
16
|
+
/** The document's unique identifier, assigned by the database adapter. */
|
|
17
|
+
id: string;
|
|
18
|
+
[key: string]: any;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The envelope returned by collection list endpoints (`GET /api/collections/:slug`).
|
|
22
|
+
*
|
|
23
|
+
* @template T The document type.
|
|
24
|
+
*/
|
|
25
|
+
export interface PaginatedResult<T = Record<string, any>> {
|
|
26
|
+
/** The documents on the current page. */
|
|
27
|
+
docs: T[];
|
|
28
|
+
/** Total number of documents matching the query (across all pages). */
|
|
29
|
+
total: number;
|
|
30
|
+
/** Maximum number of documents per page as requested. */
|
|
31
|
+
limit: number;
|
|
32
|
+
/** The current page number (1-indexed). */
|
|
33
|
+
page: number;
|
|
34
|
+
/** Total number of pages given the current `limit`. */
|
|
35
|
+
totalPages: number;
|
|
36
|
+
/** Whether a next page exists. */
|
|
37
|
+
hasNextPage: boolean;
|
|
38
|
+
/** Whether a previous page exists. */
|
|
39
|
+
hasPrevPage: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Metadata returned after a file is uploaded and stored.
|
|
43
|
+
* Stored on the document in upload collections.
|
|
44
|
+
*/
|
|
45
|
+
export interface FileData {
|
|
46
|
+
filename: string;
|
|
47
|
+
filesize?: number;
|
|
48
|
+
mimeType: string;
|
|
49
|
+
/** Public URL of the stored file. */
|
|
50
|
+
url: string;
|
|
51
|
+
width?: number;
|
|
52
|
+
height?: number;
|
|
53
|
+
focalPoint?: {
|
|
54
|
+
x: number;
|
|
55
|
+
y: number;
|
|
56
|
+
};
|
|
57
|
+
/** Base64-encoded BlurHash string for progressive image loading. */
|
|
58
|
+
blurhash?: string;
|
|
59
|
+
/** `'upload'` for server-stored files; `'external'` for provider-managed files. */
|
|
60
|
+
type?: "upload" | "external";
|
|
61
|
+
provider?: string;
|
|
62
|
+
provider_metadata?: unknown;
|
|
63
|
+
[key: string]: unknown;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=documents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/types/documents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACtD,yCAAyC;IACzC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
|