@vexcms/core 0.0.20 → 0.1.0-alpha.3
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/LICENSE +202 -0
- package/dist/.build +1 -0
- package/dist/access/buildChecks.d.ts +58 -0
- package/dist/access/buildChecks.d.ts.map +1 -0
- package/dist/access/canAccessAdminPanel.d.ts +53 -0
- package/dist/access/canAccessAdminPanel.d.ts.map +1 -0
- package/dist/access/compileConstraints.d.ts +155 -0
- package/dist/access/compileConstraints.d.ts.map +1 -0
- package/dist/access/config.d.ts +62 -0
- package/dist/access/config.d.ts.map +1 -0
- package/dist/access/constants.d.ts +95 -0
- package/dist/access/constants.d.ts.map +1 -0
- package/dist/access/constraintTypes.d.ts +337 -0
- package/dist/access/constraintTypes.d.ts.map +1 -0
- package/dist/access/createAccessQueryBuilder.d.ts +59 -0
- package/dist/access/createAccessQueryBuilder.d.ts.map +1 -0
- package/dist/access/createFilterConstraintBuilder.d.ts +26 -0
- package/dist/access/createFilterConstraintBuilder.d.ts.map +1 -0
- package/dist/access/createIndexConstraintBuilder.d.ts +40 -0
- package/dist/access/createIndexConstraintBuilder.d.ts.map +1 -0
- package/dist/access/hasPermission.d.ts +85 -0
- package/dist/access/hasPermission.d.ts.map +1 -0
- package/dist/access/index.d.ts +13 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/pickQueryIndex.d.ts +42 -0
- package/dist/access/pickQueryIndex.d.ts.map +1 -0
- package/dist/access/resolveAccessRule.d.ts +85 -0
- package/dist/access/resolveAccessRule.d.ts.map +1 -0
- package/dist/access/types.d.ts +738 -0
- package/dist/access/types.d.ts.map +1 -0
- package/dist/access/validateAccessConstraints.d.ts +57 -0
- package/dist/access/validateAccessConstraints.d.ts.map +1 -0
- package/dist/api/client.d.ts +20 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +117 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/convex.d.ts +296 -0
- package/dist/api/convex.d.ts.map +1 -0
- package/dist/api/create/client.d.ts +50 -0
- package/dist/api/create/client.d.ts.map +1 -0
- package/dist/api/create/server.d.ts +43 -0
- package/dist/api/create/server.d.ts.map +1 -0
- package/dist/api/depth.d.ts +39 -0
- package/dist/api/depth.d.ts.map +1 -0
- package/dist/api/find/client.d.ts +90 -0
- package/dist/api/find/client.d.ts.map +1 -0
- package/dist/api/find/server.d.ts +73 -0
- package/dist/api/find/server.d.ts.map +1 -0
- package/dist/api/get/client.d.ts +56 -0
- package/dist/api/get/client.d.ts.map +1 -0
- package/dist/api/get/server.d.ts +49 -0
- package/dist/api/get/server.d.ts.map +1 -0
- package/dist/api/globals/find.client.d.ts +20 -0
- package/dist/api/globals/find.client.d.ts.map +1 -0
- package/dist/api/globals/find.server.d.ts +29 -0
- package/dist/api/globals/find.server.d.ts.map +1 -0
- package/dist/api/globals/get.client.d.ts +46 -0
- package/dist/api/globals/get.client.d.ts.map +1 -0
- package/dist/api/globals/get.server.d.ts +55 -0
- package/dist/api/globals/get.server.d.ts.map +1 -0
- package/dist/api/globals/types.d.ts +65 -0
- package/dist/api/globals/types.d.ts.map +1 -0
- package/dist/api/globals/upsert.client.d.ts +24 -0
- package/dist/api/globals/upsert.client.d.ts.map +1 -0
- package/dist/api/globals/upsert.server.d.ts +47 -0
- package/dist/api/globals/upsert.server.d.ts.map +1 -0
- package/dist/api/populate.d.ts +23 -0
- package/dist/api/populate.d.ts.map +1 -0
- package/dist/api/remove/client.d.ts +58 -0
- package/dist/api/remove/client.d.ts.map +1 -0
- package/dist/api/remove/server.d.ts +65 -0
- package/dist/api/remove/server.d.ts.map +1 -0
- package/dist/api/search/client.d.ts +58 -0
- package/dist/api/search/client.d.ts.map +1 -0
- package/dist/api/search/server.d.ts +54 -0
- package/dist/api/search/server.d.ts.map +1 -0
- package/dist/api/server.d.ts +370 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +33 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/types.d.ts +525 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/update/client.d.ts +53 -0
- package/dist/api/update/client.d.ts.map +1 -0
- package/dist/api/update/server.d.ts +47 -0
- package/dist/api/update/server.d.ts.map +1 -0
- package/dist/api/utils.d.ts +57 -0
- package/dist/api/utils.d.ts.map +1 -0
- package/dist/auth/mergeCollections.d.ts +28 -0
- package/dist/auth/mergeCollections.d.ts.map +1 -0
- package/dist/auth/types.d.ts +84 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/chunk-2DU7JDEX.js +1877 -0
- package/dist/chunk-2DU7JDEX.js.map +1 -0
- package/dist/chunk-2IB2DCN7.js +75 -0
- package/dist/chunk-2IB2DCN7.js.map +1 -0
- package/dist/collections/config.d.ts +28 -0
- package/dist/collections/config.d.ts.map +1 -0
- package/dist/collections/constants.d.ts +27 -0
- package/dist/collections/constants.d.ts.map +1 -0
- package/dist/collections/index.d.ts +7 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/indexFields.d.ts +20 -0
- package/dist/collections/indexFields.d.ts.map +1 -0
- package/dist/collections/interfaceGen.d.ts +59 -0
- package/dist/collections/interfaceGen.d.ts.map +1 -0
- package/dist/collections/internal/index.d.ts +2 -0
- package/dist/collections/internal/index.d.ts.map +1 -0
- package/dist/collections/types.d.ts +282 -0
- package/dist/collections/types.d.ts.map +1 -0
- package/dist/collections/utils.d.ts +71 -0
- package/dist/collections/utils.d.ts.map +1 -0
- package/dist/collections/validator.d.ts +73 -0
- package/dist/collections/validator.d.ts.map +1 -0
- package/dist/config/config.d.ts +43 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/sanitizeConfig.d.ts +82 -0
- package/dist/config/sanitizeConfig.d.ts.map +1 -0
- package/dist/config/types.d.ts +316 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/fields/array/config.d.ts +57 -0
- package/dist/fields/array/config.d.ts.map +1 -0
- package/dist/fields/array/index.d.ts +5 -0
- package/dist/fields/array/index.d.ts.map +1 -0
- package/dist/fields/array/inputSchema.d.ts +32 -0
- package/dist/fields/array/inputSchema.d.ts.map +1 -0
- package/dist/fields/array/types.d.ts +127 -0
- package/dist/fields/array/types.d.ts.map +1 -0
- package/dist/fields/array/validator.d.ts +30 -0
- package/dist/fields/array/validator.d.ts.map +1 -0
- package/dist/fields/baseTypes.d.ts +251 -0
- package/dist/fields/baseTypes.d.ts.map +1 -0
- package/dist/fields/blocks/config.d.ts +63 -0
- package/dist/fields/blocks/config.d.ts.map +1 -0
- package/dist/fields/blocks/index.d.ts +5 -0
- package/dist/fields/blocks/index.d.ts.map +1 -0
- package/dist/fields/blocks/inputSchema.d.ts +22 -0
- package/dist/fields/blocks/inputSchema.d.ts.map +1 -0
- package/dist/fields/blocks/types.d.ts +253 -0
- package/dist/fields/blocks/types.d.ts.map +1 -0
- package/dist/fields/blocks/validator.d.ts +32 -0
- package/dist/fields/blocks/validator.d.ts.map +1 -0
- package/dist/fields/checkbox/config.d.ts +46 -0
- package/dist/fields/checkbox/config.d.ts.map +1 -0
- package/dist/fields/checkbox/index.d.ts +5 -0
- package/dist/fields/checkbox/index.d.ts.map +1 -0
- package/dist/fields/checkbox/inputSchema.d.ts +27 -0
- package/dist/fields/checkbox/inputSchema.d.ts.map +1 -0
- package/dist/fields/checkbox/types.d.ts +67 -0
- package/dist/fields/checkbox/types.d.ts.map +1 -0
- package/dist/fields/checkbox/validator.d.ts +34 -0
- package/dist/fields/checkbox/validator.d.ts.map +1 -0
- package/dist/fields/color/config.d.ts +49 -0
- package/dist/fields/color/config.d.ts.map +1 -0
- package/dist/fields/color/convert.d.ts +72 -0
- package/dist/fields/color/convert.d.ts.map +1 -0
- package/dist/fields/color/formats.d.ts +38 -0
- package/dist/fields/color/formats.d.ts.map +1 -0
- package/dist/fields/color/index.d.ts +8 -0
- package/dist/fields/color/index.d.ts.map +1 -0
- package/dist/fields/color/inputSchema.d.ts +29 -0
- package/dist/fields/color/inputSchema.d.ts.map +1 -0
- package/dist/fields/color/types.d.ts +100 -0
- package/dist/fields/color/types.d.ts.map +1 -0
- package/dist/fields/color/utils.d.ts +100 -0
- package/dist/fields/color/utils.d.ts.map +1 -0
- package/dist/fields/color/validator.d.ts +27 -0
- package/dist/fields/color/validator.d.ts.map +1 -0
- package/dist/fields/constants.d.ts +108 -0
- package/dist/fields/constants.d.ts.map +1 -0
- package/dist/fields/date/config.d.ts +57 -0
- package/dist/fields/date/config.d.ts.map +1 -0
- package/dist/fields/date/index.d.ts +5 -0
- package/dist/fields/date/index.d.ts.map +1 -0
- package/dist/fields/date/inputSchema.d.ts +29 -0
- package/dist/fields/date/inputSchema.d.ts.map +1 -0
- package/dist/fields/date/types.d.ts +147 -0
- package/dist/fields/date/types.d.ts.map +1 -0
- package/dist/fields/date/validator.d.ts +34 -0
- package/dist/fields/date/validator.d.ts.map +1 -0
- package/dist/fields/group/config.d.ts +47 -0
- package/dist/fields/group/config.d.ts.map +1 -0
- package/dist/fields/group/index.d.ts +5 -0
- package/dist/fields/group/index.d.ts.map +1 -0
- package/dist/fields/group/inputSchema.d.ts +27 -0
- package/dist/fields/group/inputSchema.d.ts.map +1 -0
- package/dist/fields/group/types.d.ts +105 -0
- package/dist/fields/group/types.d.ts.map +1 -0
- package/dist/fields/group/validator.d.ts +41 -0
- package/dist/fields/group/validator.d.ts.map +1 -0
- package/dist/fields/index.d.ts +20 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/inputSchemas/index.d.ts +23 -0
- package/dist/fields/inputSchemas/index.d.ts.map +1 -0
- package/dist/fields/inputSchemas/utils.d.ts +25 -0
- package/dist/fields/inputSchemas/utils.d.ts.map +1 -0
- package/dist/fields/interfaceGen.d.ts +15 -0
- package/dist/fields/interfaceGen.d.ts.map +1 -0
- package/dist/fields/number/config.d.ts +48 -0
- package/dist/fields/number/config.d.ts.map +1 -0
- package/dist/fields/number/index.d.ts +5 -0
- package/dist/fields/number/index.d.ts.map +1 -0
- package/dist/fields/number/inputSchema.d.ts +23 -0
- package/dist/fields/number/inputSchema.d.ts.map +1 -0
- package/dist/fields/number/types.d.ts +100 -0
- package/dist/fields/number/types.d.ts.map +1 -0
- package/dist/fields/number/validator.d.ts +39 -0
- package/dist/fields/number/validator.d.ts.map +1 -0
- package/dist/fields/relationship/config.d.ts +45 -0
- package/dist/fields/relationship/config.d.ts.map +1 -0
- package/dist/fields/relationship/index.d.ts +5 -0
- package/dist/fields/relationship/index.d.ts.map +1 -0
- package/dist/fields/relationship/inputSchema.d.ts +31 -0
- package/dist/fields/relationship/inputSchema.d.ts.map +1 -0
- package/dist/fields/relationship/types.d.ts +126 -0
- package/dist/fields/relationship/types.d.ts.map +1 -0
- package/dist/fields/relationship/validator.d.ts +27 -0
- package/dist/fields/relationship/validator.d.ts.map +1 -0
- package/dist/fields/select/config.d.ts +59 -0
- package/dist/fields/select/config.d.ts.map +1 -0
- package/dist/fields/select/index.d.ts +5 -0
- package/dist/fields/select/index.d.ts.map +1 -0
- package/dist/fields/select/inputSchema.d.ts +28 -0
- package/dist/fields/select/inputSchema.d.ts.map +1 -0
- package/dist/fields/select/types.d.ts +89 -0
- package/dist/fields/select/types.d.ts.map +1 -0
- package/dist/fields/select/validator.d.ts +31 -0
- package/dist/fields/select/validator.d.ts.map +1 -0
- package/dist/fields/text/config.d.ts +48 -0
- package/dist/fields/text/config.d.ts.map +1 -0
- package/dist/fields/text/index.d.ts +5 -0
- package/dist/fields/text/index.d.ts.map +1 -0
- package/dist/fields/text/inputSchema.d.ts +24 -0
- package/dist/fields/text/inputSchema.d.ts.map +1 -0
- package/dist/fields/text/types.d.ts +132 -0
- package/dist/fields/text/types.d.ts.map +1 -0
- package/dist/fields/text/validator.d.ts +39 -0
- package/dist/fields/text/validator.d.ts.map +1 -0
- package/dist/fields/types.d.ts +135 -0
- package/dist/fields/types.d.ts.map +1 -0
- package/dist/fields/upload/config.d.ts +24 -0
- package/dist/fields/upload/config.d.ts.map +1 -0
- package/dist/fields/upload/index.d.ts +5 -0
- package/dist/fields/upload/index.d.ts.map +1 -0
- package/dist/fields/upload/inputSchema.d.ts +17 -0
- package/dist/fields/upload/inputSchema.d.ts.map +1 -0
- package/dist/fields/upload/types.d.ts +78 -0
- package/dist/fields/upload/types.d.ts.map +1 -0
- package/dist/fields/upload/validator.d.ts +16 -0
- package/dist/fields/upload/validator.d.ts.map +1 -0
- package/dist/fields/url/config.d.ts +49 -0
- package/dist/fields/url/config.d.ts.map +1 -0
- package/dist/fields/url/index.d.ts +5 -0
- package/dist/fields/url/index.d.ts.map +1 -0
- package/dist/fields/url/inputSchema.d.ts +31 -0
- package/dist/fields/url/inputSchema.d.ts.map +1 -0
- package/dist/fields/url/types.d.ts +70 -0
- package/dist/fields/url/types.d.ts.map +1 -0
- package/dist/fields/url/validator.d.ts +37 -0
- package/dist/fields/url/validator.d.ts.map +1 -0
- package/dist/fields/utils.d.ts +47 -0
- package/dist/fields/utils.d.ts.map +1 -0
- package/dist/fields/validators/index.d.ts +23 -0
- package/dist/fields/validators/index.d.ts.map +1 -0
- package/dist/fields/validators/utils.d.ts +24 -0
- package/dist/fields/validators/utils.d.ts.map +1 -0
- package/dist/framework.d.ts +227 -0
- package/dist/framework.d.ts.map +1 -0
- package/dist/globals/config/config.d.ts +1 -0
- package/dist/globals/config/config.d.ts.map +1 -0
- package/dist/globals/config/types.d.ts +1 -0
- package/dist/globals/config/types.d.ts.map +1 -0
- package/dist/globals/config.d.ts +47 -0
- package/dist/globals/config.d.ts.map +1 -0
- package/dist/globals/index.d.ts +5 -0
- package/dist/globals/index.d.ts.map +1 -0
- package/dist/globals/interfaceGen.d.ts +33 -0
- package/dist/globals/interfaceGen.d.ts.map +1 -0
- package/dist/globals/types.d.ts +175 -0
- package/dist/globals/types.d.ts.map +1 -0
- package/dist/globals/utils.d.ts +37 -0
- package/dist/globals/utils.d.ts.map +1 -0
- package/dist/index.d.ts +15 -3165
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2101 -3475
- package/dist/index.js.map +1 -1
- package/dist/media/api/index.d.ts +5 -0
- package/dist/media/api/index.d.ts.map +1 -0
- package/dist/media/api/mutations.d.ts +76 -0
- package/dist/media/api/mutations.d.ts.map +1 -0
- package/dist/media/api/queries.d.ts +28 -0
- package/dist/media/api/queries.d.ts.map +1 -0
- package/dist/media/api/server.d.ts +68 -0
- package/dist/media/api/server.d.ts.map +1 -0
- package/dist/media/api/types.d.ts +171 -0
- package/dist/media/api/types.d.ts.map +1 -0
- package/dist/media/config.d.ts +25 -0
- package/dist/media/config.d.ts.map +1 -0
- package/dist/media/index.d.ts +6 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/types.d.ts +332 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/utils.d.ts +35 -0
- package/dist/media/utils.d.ts.map +1 -0
- package/dist/media/validators.d.ts +61 -0
- package/dist/media/validators.d.ts.map +1 -0
- package/dist/schema/generateVexSchema.d.ts +36 -0
- package/dist/schema/generateVexSchema.d.ts.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/migrate.d.ts +73 -0
- package/dist/schema/migrate.d.ts.map +1 -0
- package/dist/types/generateVexTypes.d.ts +41 -0
- package/dist/types/generateVexTypes.d.ts.map +1 -0
- package/dist/types/generated.d.ts +382 -0
- package/dist/types/generated.d.ts.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils.d.ts +57 -0
- package/dist/utils.d.ts.map +1 -0
- package/package.json +67 -24
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// src/api/convex.ts
|
|
2
|
+
import { anyApi } from "convex/server";
|
|
3
|
+
var vexConvexApi = {
|
|
4
|
+
/**
|
|
5
|
+
* Finds documents in a collection.
|
|
6
|
+
* Called by {@link react/src!CollectionListView} in `@vexcms/react`.
|
|
7
|
+
*/
|
|
8
|
+
find: anyApi.vex.find,
|
|
9
|
+
/**
|
|
10
|
+
* Finds documents in a collection with cursor pagination.
|
|
11
|
+
* Called by {@link react/src!CollectionListView} in `@vexcms/react`.
|
|
12
|
+
*/
|
|
13
|
+
findPaginated: anyApi.vex.find,
|
|
14
|
+
/**
|
|
15
|
+
* Fetches a single document by ID.
|
|
16
|
+
* Called by {@link react/src!CollectionEditView} in `@vexcms/react` when editing.
|
|
17
|
+
*/
|
|
18
|
+
get: anyApi.vex.get,
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new document. Returns the new document's ID as a string.
|
|
21
|
+
*/
|
|
22
|
+
create: anyApi.vex.create,
|
|
23
|
+
/**
|
|
24
|
+
* Searches documents in a collection by a search index.
|
|
25
|
+
*
|
|
26
|
+
* Used by `RelationshipFieldInput` in `@vexcms/react` to populate the
|
|
27
|
+
* relationship picker combobox. The `searchIndexName` must match the
|
|
28
|
+
* `.searchIndex()` name in the Convex schema — VexCMS auto-generates
|
|
29
|
+
* `search_<useAsTitle>` when another collection has a relationship here.
|
|
30
|
+
* Pass `query: ""` to list recent documents when no search term is entered.
|
|
31
|
+
*
|
|
32
|
+
* @see {@link https://docs.convex.dev/text-search} for Convex search docs
|
|
33
|
+
*/
|
|
34
|
+
search: anyApi.vex.search,
|
|
35
|
+
/**
|
|
36
|
+
* Patches an existing document — unspecified fields are left unchanged.
|
|
37
|
+
*/
|
|
38
|
+
update: anyApi.vex.update,
|
|
39
|
+
/**
|
|
40
|
+
* Permanently deletes a document.
|
|
41
|
+
*/
|
|
42
|
+
remove: anyApi.vex.remove,
|
|
43
|
+
media: {
|
|
44
|
+
/**
|
|
45
|
+
* Generates a URL to upload a file to.
|
|
46
|
+
* Called by `MediaUploadDropzone` in `@vexcms/react`.
|
|
47
|
+
*/
|
|
48
|
+
generateUploadUrl: anyApi.vex.media.generateUploadUrl,
|
|
49
|
+
/**
|
|
50
|
+
* Creates a media document in Convex after the file is uploaded.
|
|
51
|
+
* Called by `MediaUploadDropzone` in `@vexcms/react`.
|
|
52
|
+
*/
|
|
53
|
+
createMediaDocument: anyApi.vex.media.createMediaDocument,
|
|
54
|
+
/**
|
|
55
|
+
* Deletes a media document and its file from storage.
|
|
56
|
+
* Called by `MediaLibrary` in `@vexcms/react`.
|
|
57
|
+
*/
|
|
58
|
+
deleteMedia: anyApi.vex.media.deleteMedia,
|
|
59
|
+
/**
|
|
60
|
+
* Returns a URL for a media file.
|
|
61
|
+
* Called by `UploadFieldCell` in `@vexcms/react`.
|
|
62
|
+
*/
|
|
63
|
+
getUrl: anyApi.vex.media.getUrl
|
|
64
|
+
},
|
|
65
|
+
globals: {
|
|
66
|
+
get: anyApi.vex.globals.get,
|
|
67
|
+
find: anyApi.vex.globals.find,
|
|
68
|
+
upsert: anyApi.vex.globals.upsert
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export {
|
|
73
|
+
vexConvexApi
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=chunk-2IB2DCN7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/convex.ts"],"sourcesContent":["import { anyApi } from \"convex/server\";\nimport type { FunctionReference } from \"convex/server\";\nimport type { PaginationOptions, PaginationResult, VexApiAuth } from \"./types\";\nimport { CollectionSlug, VexDocumentGlobal } from \"../types\";\n\n/**\n * Base type for all VexCMS documents as returned from Convex queries.\n *\n * All documents include the Convex system fields `_id` and `_creationTime`,\n * plus whatever field values are defined in the collection's schema.\n *\n * Framework adapters use this as the `initialData` type in view component\n * props — the actual field values are accessed via string keys.\n *\n * @example\n * ```ts\n * const title = typeof doc.title === \"string\" ? doc.title : \"\";\n * ```\n *\n * @see {@link vexConvexApi} for the query functions that return this type\n */\nexport interface VexDocument {\n /** Convex document ID string. */\n _id: string;\n /** Unix timestamp (milliseconds) when the document was created. */\n _creationTime: number;\n /** Field values defined by the collection schema. */\n [key: string]: unknown;\n}\n\n/**\n * Alias for `VexDocument` that also satisfies `Record<string, unknown>`.\n *\n * Use this type when a generic `Record` index signature is required alongside\n * the Convex system fields — for example, as the `data` type in TanStack Table\n * or as the form `defaultValues` record.\n *\n * @see {@link VexDocument} for the base type\n */\nexport type TDocument<TShape = {}> = Record<string, unknown> & TShape & VexDocument;\n\n/**\n * Type for media documents returned from Convex queries.\n *\n * Extends `VexDocument` with all required media fields: alt, filename,\n * mimeType, size, storageId, deleted, src (the file URL), and optional\n * width/height. Use this instead of `TDocument` in media collection views to\n * avoid casting fields like `row.original.src as string`.\n *\n * @example\n * ```ts\n * const src = doc.src; // string | undefined, no cast needed\n * const alt = doc.alt ?? \"\";\n * ```\n *\n * @see {@link TDocument} for the base document type with custom shape support\n */\nexport interface VexMediaDocument extends VexDocument {\n /** Alt text for accessibility and SEO. */\n alt: string;\n /** Original filename of the uploaded file. */\n filename: string;\n /** MIME type (e.g., \"image/jpeg\", \"application/pdf\"). */\n mimeType: string;\n /** File size in bytes. */\n size: number;\n /** Storage adapter ID for the uploaded file. */\n storageId: string;\n /** Whether this media item has been soft-deleted. */\n deleted: boolean;\n /** URL to the file. */\n src: string;\n /** Image width in pixels (if applicable). */\n width?: number;\n /** Image height in pixels (if applicable). */\n height?: number;\n}\n\n// ── Collection API types ───────────────────────────────────────\n//\n// Extracted arg/return shapes for the generic Vex API collection endpoints.\n// Used by `vexConvexApi` below and re-exported for user-side `vex.ts` casts\n// to avoid TS2589 from the deep conditional types in `queryApi()`.\n\n/** Args for `api.vex.find`. */\nexport interface VexFindArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n collection: CollectionSlug;\n populate?: unknown;\n depth?: number;\n limit?: number;\n paginationOpts?: PaginationOptions;\n}\n\n/** Args for `api.vex.find`. */\nexport interface VexFindPaginatedArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n collection: CollectionSlug;\n populate?: unknown;\n depth?: number;\n limit?: number;\n paginationOpts: PaginationOptions;\n}\n\n/** Args for `api.vex.get`. */\nexport interface VexGetArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n collection: string;\n id: string;\n populate?: unknown;\n depth?: number;\n}\n\n/** Args for `api.vex.search`. */\nexport interface VexSearchArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n collection: string;\n searchIndexName: string;\n searchField: string;\n query: string;\n limit?: number;\n populate?: unknown;\n depth?: number;\n paginationOpts?: PaginationOptions;\n}\n\n/** Args for `api.vex.create`. */\nexport interface VexCreateArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n collection: string;\n data: Record<string, unknown>;\n}\n\n/** Args for `api.vex.update`. */\nexport interface VexUpdateArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n collection: string;\n id: string;\n data: Record<string, unknown>;\n}\n\n/** Args for `api.vex.remove`. */\nexport interface VexRemoveArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n collection: string;\n ids: string[];\n softDelete?: string;\n}\n\n// ── Media API shallow types ──────────────────────────────────────────────\n//\n// Arg and return shapes for the generic media endpoints. These mirror the\n// `VexStorageAdapter` method signatures so the types stay in one place.\n\n/** Args for `api.vex.media.generateUploadUrl`. */\nexport interface VexMediaGenerateUploadUrlArgs {\n [key: string]: unknown;\n adapter: string;\n}\n\n/** Return for `api.vex.media.generateUploadUrl`. */\nexport interface VexMediaGenerateUploadUrlReturn {\n [key: string]: unknown;\n url: string;\n}\n\n/** Args for `api.vex.media.createMediaDocument`. */\nexport interface VexMediaCreateMediaDocumentArgs {\n [key: string]: unknown;\n adapter: string;\n collectionSlug: string;\n storageId: string;\n filename: string;\n mimeType: string;\n size: number;\n alt?: string;\n adapterFields?: Record<string, unknown>;\n}\n\n/** Return for `api.vex.media.createMediaDocument`. */\nexport type VexMediaCreateMediaDocumentReturn = string;\n\n/** Args for `api.vex.media.deleteMedia`. */\nexport interface VexMediaDeleteMediaArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n adapter: string;\n mediaId: string;\n softDelete?: boolean;\n}\n\n/** Return for `api.vex.media.deleteMedia`. */\nexport type VexMediaDeleteMediaReturn = boolean;\n\n/** Args for `api.vex.media.getUrl`. */\nexport interface VexMediaGetUrlArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n adapter: string;\n mediaId: string;\n}\n\n/** Return for `api.vex.media.getUrl`. */\nexport interface VexMediaGetUrlReturn {\n [key: string]: unknown;\n url?: string;\n error?: string;\n}\n\n// ── Media API shallow types ──────────────────────────────────────────────\n\n/** Args for `api.vex.globals.get`. */\nexport interface VexGlobalsGetArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n slug: string;\n populate?: Record<string, unknown>;\n}\n\n/** Args for `api.vex.globals.find`. */\nexport interface VexGlobalsFindArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n}\n\n/** Args for `api.vex.globals.update`. */\nexport interface VexGlobalsUpdateArgs {\n [key: string]: unknown;\n auth?: VexApiAuth;\n slug: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Typed `anyApi` references to the VexCMS generic Convex collection functions.\n *\n * These point to functions that users copy into `convex/vex/collections.ts`\n * in their project. All paths are fixed under `vex.collections.*`.\n *\n * **Required:** copy `convex/vex/collections.ts` from the VexCMS template\n * into your project before these references will resolve at runtime.\n *\n * Used internally by view components in `@vexcms/react`. Framework adapter\n * authors do not need to import this directly unless building custom views.\n *\n * @example\n * ```ts\n * import { convexQuery } from \"@convex-dev/react-query\";\n * import { useQuery } from \"@tanstack/react-query\";\n * import { vexConvexApi } from \"@vexcms/core\";\n *\n * const { data } = useQuery({\n * ...convexQuery(vexConvexApi.list, { collection: \"posts\" }),\n * });\n * ```\n */\nexport const vexConvexApi = {\n /**\n * Finds documents in a collection.\n * Called by {@link react/src!CollectionListView} in `@vexcms/react`.\n */\n find: anyApi.vex.find as FunctionReference<\n \"query\",\n \"public\",\n VexFindArgs,\n VexDocument[] | PaginationResult<VexDocument>\n >,\n /**\n * Finds documents in a collection with cursor pagination.\n * Called by {@link react/src!CollectionListView} in `@vexcms/react`.\n */\n findPaginated: anyApi.vex.find as FunctionReference<\n \"query\",\n \"public\",\n VexFindPaginatedArgs,\n PaginationResult<VexDocument>\n >,\n\n /**\n * Fetches a single document by ID.\n * Called by {@link react/src!CollectionEditView} in `@vexcms/react` when editing.\n */\n get: anyApi.vex.get as FunctionReference<\"query\", \"public\", VexGetArgs, VexDocument | null>,\n\n /**\n * Creates a new document. Returns the new document's ID as a string.\n */\n create: anyApi.vex.create as FunctionReference<\"mutation\", \"public\", VexCreateArgs, string>,\n\n /**\n * Searches documents in a collection by a search index.\n *\n * Used by `RelationshipFieldInput` in `@vexcms/react` to populate the\n * relationship picker combobox. The `searchIndexName` must match the\n * `.searchIndex()` name in the Convex schema — VexCMS auto-generates\n * `search_<useAsTitle>` when another collection has a relationship here.\n * Pass `query: \"\"` to list recent documents when no search term is entered.\n *\n * @see {@link https://docs.convex.dev/text-search} for Convex search docs\n */\n search: anyApi.vex.search as FunctionReference<\n \"query\",\n \"public\",\n VexSearchArgs,\n VexDocument[] | PaginationResult<VexDocument>\n >,\n\n /**\n * Patches an existing document — unspecified fields are left unchanged.\n */\n update: anyApi.vex.update as FunctionReference<\"mutation\", \"public\", VexUpdateArgs, void>,\n\n /**\n * Permanently deletes a document.\n */\n remove: anyApi.vex.remove as FunctionReference<\"mutation\", \"public\", VexRemoveArgs, void>,\n\n media: {\n /**\n * Generates a URL to upload a file to.\n * Called by `MediaUploadDropzone` in `@vexcms/react`.\n */\n generateUploadUrl: anyApi.vex.media.generateUploadUrl as FunctionReference<\n \"mutation\",\n \"public\",\n VexMediaGenerateUploadUrlArgs,\n VexMediaGenerateUploadUrlReturn\n >,\n\n /**\n * Creates a media document in Convex after the file is uploaded.\n * Called by `MediaUploadDropzone` in `@vexcms/react`.\n */\n createMediaDocument: anyApi.vex.media.createMediaDocument as FunctionReference<\n \"mutation\",\n \"public\",\n VexMediaCreateMediaDocumentArgs,\n VexMediaCreateMediaDocumentReturn\n >,\n\n /**\n * Deletes a media document and its file from storage.\n * Called by `MediaLibrary` in `@vexcms/react`.\n */\n deleteMedia: anyApi.vex.media.deleteMedia as FunctionReference<\n \"mutation\",\n \"public\",\n VexMediaDeleteMediaArgs,\n VexMediaDeleteMediaReturn\n >,\n\n /**\n * Returns a URL for a media file.\n * Called by `UploadFieldCell` in `@vexcms/react`.\n */\n getUrl: anyApi.vex.media.getUrl as FunctionReference<\n \"query\",\n \"public\",\n VexMediaGetUrlArgs,\n VexMediaGetUrlReturn\n >,\n },\n\n globals: {\n get: anyApi.vex.globals.get as FunctionReference<\n \"query\",\n \"public\",\n VexGlobalsGetArgs,\n VexDocumentGlobal | null\n >,\n find: anyApi.vex.globals.find as FunctionReference<\n \"query\",\n \"public\",\n VexGlobalsFindArgs,\n VexDocumentGlobal[]\n >,\n upsert: anyApi.vex.globals.upsert as FunctionReference<\n \"mutation\",\n \"public\",\n VexGlobalsUpdateArgs,\n string\n >,\n },\n} as const;\n"],"mappings":";AAAA,SAAS,cAAc;AAuQhB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1B,MAAM,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjB,eAAe,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAW1B,KAAK,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,EAKhB,QAAQ,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanB,QAAQ,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,EAUnB,QAAQ,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,EAKnB,QAAQ,OAAO,IAAI;AAAA,EAEnB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,mBAAmB,OAAO,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAWpC,qBAAqB,OAAO,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAWtC,aAAa,OAAO,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAW9B,QAAQ,OAAO,IAAI,MAAM;AAAA,EAM3B;AAAA,EAEA,SAAS;AAAA,IACP,KAAK,OAAO,IAAI,QAAQ;AAAA,IAMxB,MAAM,OAAO,IAAI,QAAQ;AAAA,IAMzB,QAAQ,OAAO,IAAI,QAAQ;AAAA,EAM7B;AACF;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { CollectionFieldMeta, ComponentHKT } from "../fields";
|
|
2
|
+
import { CollectionSlug } from "../types";
|
|
3
|
+
import { CollectionConfigInput, CollectionConfig } from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves a raw collection config input into a fully-populated `CollectionConfig`.
|
|
6
|
+
*
|
|
7
|
+
* Fills in any missing `labels` by deriving them from the `slug` — converting it
|
|
8
|
+
* to title case for `singular` and further pluralising it for `plural`.
|
|
9
|
+
*
|
|
10
|
+
* @param config - The raw collection configuration supplied by the caller.
|
|
11
|
+
* @returns The resolved `CollectionConfig` with all defaults applied.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* defineCollection({
|
|
16
|
+
* slug: "posts",
|
|
17
|
+
* fields: {
|
|
18
|
+
* title: text({ required: true }),
|
|
19
|
+
* },
|
|
20
|
+
* });
|
|
21
|
+
* // → { slug: "posts", admin: { useAsTitle: "_id" }, labels: { singular: "Post", plural: "Posts" }, fields: { ... } }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @see {@link CollectionConfigInput} for the user-facing input type
|
|
25
|
+
* @see {@link CollectionConfig} for the resolved return type
|
|
26
|
+
*/
|
|
27
|
+
export declare function defineCollection<TFieldMeta extends {} = {}, TCollectionMeta extends {} = {}, TCollectionSlug extends CollectionSlug = CollectionSlug, TFieldSlug extends string = string, TComponent extends ComponentHKT = ComponentHKT>(config: CollectionConfigInput<TFieldMeta, TCollectionMeta, TCollectionSlug, TFieldSlug, TComponent>): CollectionConfig<TFieldMeta & CollectionFieldMeta, TCollectionMeta, TCollectionSlug, TFieldSlug, TComponent>;
|
|
28
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/collections/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,mBAAmB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAsClE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,SAAS,EAAE,GAAG,EAAE,EAC1B,eAAe,SAAS,EAAE,GAAG,EAAE,EAC/B,eAAe,SAAS,cAAc,GAAG,cAAc,EACvD,UAAU,SAAS,MAAM,GAAG,MAAM,EAClC,UAAU,SAAS,YAAY,GAAG,YAAY,EAE9C,MAAM,EAAE,qBAAqB,CAC3B,UAAU,EACV,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,CACX,GACA,gBAAgB,CACjB,UAAU,GAAG,mBAAmB,EAChC,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,CACX,CAoCA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in Convex system fields that are present on every document.
|
|
3
|
+
*
|
|
4
|
+
* Maps logical names to their Convex database field slugs. These slugs are
|
|
5
|
+
* always valid values for `useAsTitle` in a collection's admin config,
|
|
6
|
+
* regardless of the collection's own field definitions.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CORE_ADMIN_FIELDS: {
|
|
9
|
+
/** The document's unique identifier, stored as `_id` in Convex. */
|
|
10
|
+
readonly id: {
|
|
11
|
+
readonly slug: "_id";
|
|
12
|
+
};
|
|
13
|
+
/** The document's creation timestamp, stored as `_creationTime` in Convex. */
|
|
14
|
+
readonly createdAt: {
|
|
15
|
+
readonly slug: "_creationTime";
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Union of the field slugs for all built-in Convex system fields.
|
|
20
|
+
*
|
|
21
|
+
* Resolves to `"_id" | "_creationTime"`. Use this type wherever a value must
|
|
22
|
+
* refer to a core system field rather than a user-defined collection field.
|
|
23
|
+
*
|
|
24
|
+
* @see {@link CORE_ADMIN_FIELDS} for the full map of logical names to slugs
|
|
25
|
+
*/
|
|
26
|
+
export type CoreAdminField = (typeof CORE_ADMIN_FIELDS)[keyof typeof CORE_ADMIN_FIELDS]["slug"];
|
|
27
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/collections/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;IAC5B,mEAAmE;;;;IAInE,8EAA8E;;;;CAItE,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GACxB,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CollectionConfig } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Groups a collection's index-bearing fields by declared index name, in
|
|
4
|
+
* field declaration order — the same computation `collectionConfigToVexSchema`
|
|
5
|
+
* uses for its `.index()` chain (`collections/validator.ts:114-118`): an
|
|
6
|
+
* explicit `field.index`, or an auto `by_<fieldKey>` for every relationship
|
|
7
|
+
* field. Search indexes are excluded — `withIndex` never targets those.
|
|
8
|
+
* Two fields declaring the SAME `field.index` value group into one compound
|
|
9
|
+
* entry, fields in the order they appear on the collection.
|
|
10
|
+
*
|
|
11
|
+
* @param props - Input props.
|
|
12
|
+
* @param props.collection - The collection to read index-bearing fields from.
|
|
13
|
+
* @returns Map of index name → field keys, in declaration order. Empty when
|
|
14
|
+
* the collection declares no indexed fields.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare function collectionConfigToIndexFields(props: {
|
|
18
|
+
collection: CollectionConfig;
|
|
19
|
+
}): Map<string, string[]>;
|
|
20
|
+
//# sourceMappingURL=indexFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexFields.d.ts","sourceRoot":"","sources":["../../src/collections/indexFields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,UAAU,EAAE,gBAAgB,CAAC;CAC9B,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAoBxB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { CollectionConfig } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Converts a resolved `CollectionConfig` to a TypeScript `export interface` source string.
|
|
4
|
+
*
|
|
5
|
+
* Each generated interface extends `VexDocument` (inheriting `_id` and `_creationTime`)
|
|
6
|
+
* and overrides `_id` with the branded Convex `Id<"slug">` type for that collection.
|
|
7
|
+
* Optional fields (`field.required === false`) are emitted with the `?` modifier.
|
|
8
|
+
* `select` fields with custom options emit a companion type alias above the interface,
|
|
9
|
+
* named `<InterfaceName><FieldKey>Option` so the same field key on two collections does
|
|
10
|
+
* not produce two aliases with one name. Override with the field's `optionInterfaceName`.
|
|
11
|
+
*
|
|
12
|
+
* @param props - Input props.
|
|
13
|
+
* @param props.collection - The resolved collection definition to convert.
|
|
14
|
+
* @returns A TypeScript source string for one document interface block.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const collection = defineCollection({
|
|
19
|
+
* slug: "posts",
|
|
20
|
+
* fields: { title: text({ required: true }), excerpt: text({ required: false }) },
|
|
21
|
+
* });
|
|
22
|
+
* collectionConfigToInterface({ collection });
|
|
23
|
+
* // → 'export interface PostsDocument extends VexDocument {\n\t_id: Id<"posts">\n\ttitle: string\n\texcerpt?: string\n}'
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @see {@link generateVexTypes} for the full-file generator that wraps this function
|
|
27
|
+
*/
|
|
28
|
+
export declare function collectionConfigToInterface(props: {
|
|
29
|
+
collection: CollectionConfig;
|
|
30
|
+
}): string;
|
|
31
|
+
/**
|
|
32
|
+
* Converts a resolved `CollectionConfig` to the TypeScript source string for its
|
|
33
|
+
* `CollectionsFieldTypeMap` entry used in the `declare module '@vexcms/core'` block.
|
|
34
|
+
*
|
|
35
|
+
* The output maps each field type present in the collection to a union of that
|
|
36
|
+
* collection's field keys of that type, plus a fixed `id: "_id"` entry. This
|
|
37
|
+
* lets framework code look up field keys by type at the TypeScript level —
|
|
38
|
+
* for example, finding all `text` fields on a given collection for search.
|
|
39
|
+
*
|
|
40
|
+
* @param props - Input props.
|
|
41
|
+
* @param props.collection - The resolved collection definition to convert.
|
|
42
|
+
* @returns A TypeScript source string for one `CollectionsFieldTypeMap` entry (without wrapping braces).
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* const posts = defineCollection({
|
|
47
|
+
* slug: "posts",
|
|
48
|
+
* fields: { title: text({ required: true }), author: relationship({ collection: { slug: "authors" } }) },
|
|
49
|
+
* });
|
|
50
|
+
* collectionConfigToFieldTypeMap({ collection: posts });
|
|
51
|
+
* // → '\tposts: {\n\t\tid: "_id"\n\t\ttext: "title"\n\t\trelationship: "author"\n\t}'
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @see {@link generateVexTypes} for the full-file generator that wraps this function
|
|
55
|
+
*/
|
|
56
|
+
export declare function collectionConfigToFieldTypeMap(props: {
|
|
57
|
+
collection: CollectionConfig;
|
|
58
|
+
}): string;
|
|
59
|
+
//# sourceMappingURL=interfaceGen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaceGen.d.ts","sourceRoot":"","sources":["../../src/collections/interfaceGen.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE,gBAAgB,CAAA;CAAE,GAAG,MAAM,CA6D3F;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE,gBAAgB,CAAA;CAAE,GAAG,MAAM,CAqB9F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/internal/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,SAAK,CAAC"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { AdminField } from "../fields";
|
|
2
|
+
import { CoreAdminField } from "./constants";
|
|
3
|
+
import type { ApplyComponent, ComponentHKT } from "../fields";
|
|
4
|
+
import type { CollectionSlug } from "../types/generated";
|
|
5
|
+
import { TDocument } from "../api/convex";
|
|
6
|
+
import { LucideIconName } from "../utils";
|
|
7
|
+
/**
|
|
8
|
+
* Props received by a custom preview component for relationship rendering.
|
|
9
|
+
*
|
|
10
|
+
* `TCollectionSlug` is the slug of the doc being rendered. In a picker row, this is the
|
|
11
|
+
* candidate target doc's slug. In a list-table cell, this is the parent
|
|
12
|
+
* collection's slug (the table row's `row.original`). In the trigger's
|
|
13
|
+
* selected-value chip, it is the resolved target doc's slug.
|
|
14
|
+
*
|
|
15
|
+
* `fieldKey` is the relationship field's key on the parent collection (e.g.
|
|
16
|
+
* `"author"`). In picker rows the component may ignore it; in list cells it
|
|
17
|
+
* gives access to the IDs via `doc[fieldKey]`.
|
|
18
|
+
*
|
|
19
|
+
* @typeParam TCollectionSlug - The slug of the doc being rendered.
|
|
20
|
+
*/
|
|
21
|
+
export interface RelationshipPreviewProps<TCollectionSlug extends CollectionSlug = CollectionSlug> {
|
|
22
|
+
/** The document being previewed. */
|
|
23
|
+
doc: TDocument;
|
|
24
|
+
/** The relationship field key on the parent collection. */
|
|
25
|
+
fieldKey: string;
|
|
26
|
+
/** The resolved collection config matching `doc`. */
|
|
27
|
+
config: CollectionConfig<TCollectionSlug>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Configuration for data table display and behavior in the admin panel.
|
|
31
|
+
*/
|
|
32
|
+
export interface CollectionTableConfigInput {
|
|
33
|
+
/**
|
|
34
|
+
* Default number of items per page.
|
|
35
|
+
* @default 10
|
|
36
|
+
*/
|
|
37
|
+
defaultPageSize?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Default number of items per page fetch from the server.
|
|
40
|
+
* @default 100
|
|
41
|
+
*/
|
|
42
|
+
serverPageSize?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Available page size options in the pagination controls.
|
|
45
|
+
* @default [10, 25, 50, 100]
|
|
46
|
+
*/
|
|
47
|
+
pageSizeOptions?: number[];
|
|
48
|
+
/**
|
|
49
|
+
* Default sort field and order.
|
|
50
|
+
* Must be an indexed field for performance.
|
|
51
|
+
* @default { field: "_creationTime", order: "desc" }
|
|
52
|
+
*/
|
|
53
|
+
defaultSort?: {
|
|
54
|
+
field: string;
|
|
55
|
+
order: "asc" | "desc";
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Bulk action configuration.
|
|
59
|
+
*/
|
|
60
|
+
bulkActions?: {
|
|
61
|
+
/**
|
|
62
|
+
* Enable bulk delete action.
|
|
63
|
+
* @default true
|
|
64
|
+
*/
|
|
65
|
+
delete: boolean;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Default visible columns (by field key).
|
|
69
|
+
* If not specified, all columns are shown.
|
|
70
|
+
* NOTE: deferred to column visibility spec.
|
|
71
|
+
*/
|
|
72
|
+
defaultColumns?: string[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Configuration for data table display and behavior in the admin panel.
|
|
76
|
+
*/
|
|
77
|
+
export interface CollectionTableConfig {
|
|
78
|
+
/**
|
|
79
|
+
* Default number of items per page on the client.
|
|
80
|
+
* @default 10
|
|
81
|
+
*/
|
|
82
|
+
defaultPageSize: number;
|
|
83
|
+
/**
|
|
84
|
+
* Default number of items per page fetch from the server.
|
|
85
|
+
* @default 100
|
|
86
|
+
*/
|
|
87
|
+
serverPageSize: number;
|
|
88
|
+
/**
|
|
89
|
+
* Available page size options in the pagination controls.
|
|
90
|
+
* @default [10, 25, 50, 100]
|
|
91
|
+
*/
|
|
92
|
+
pageSizeOptions: number[];
|
|
93
|
+
/**
|
|
94
|
+
* Default sort field and order.
|
|
95
|
+
* Must be an indexed field for performance.
|
|
96
|
+
* @default { field: "_creationTime", order: "desc" }
|
|
97
|
+
*/
|
|
98
|
+
defaultSort: {
|
|
99
|
+
field: string;
|
|
100
|
+
order: "asc" | "desc";
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Bulk action configuration.
|
|
104
|
+
*/
|
|
105
|
+
bulkActions: {
|
|
106
|
+
/**
|
|
107
|
+
* Enable bulk delete action.
|
|
108
|
+
* @default true
|
|
109
|
+
*/
|
|
110
|
+
delete: boolean;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Default visible columns (by field key).
|
|
114
|
+
* If not specified, all columns are shown.
|
|
115
|
+
* NOTE: deferred to column visibility spec.
|
|
116
|
+
*/
|
|
117
|
+
defaultColumns: string[];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Admin panel configuration input for a collection.
|
|
121
|
+
*
|
|
122
|
+
* Controls how the collection is presented and queried in the admin panel.
|
|
123
|
+
* All properties are optional.
|
|
124
|
+
*
|
|
125
|
+
* **Defaults applied by `defineCollection()`:**
|
|
126
|
+
* ```ts
|
|
127
|
+
* {
|
|
128
|
+
* useAsTitle: "_id", // falls back to the Convex document ID if not set
|
|
129
|
+
* }
|
|
130
|
+
* ```
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* defineCollection({
|
|
135
|
+
* slug: "posts",
|
|
136
|
+
* fields: { title: text({ required: true }) },
|
|
137
|
+
* admin: { useAsTitle: "title" },
|
|
138
|
+
* })
|
|
139
|
+
* ```
|
|
140
|
+
*
|
|
141
|
+
* @see {@link AdminCollectionConfig} for the resolved type after defaults are applied
|
|
142
|
+
*/
|
|
143
|
+
export interface AdminCollectionConfigInput<TFieldSlug extends string = CoreAdminField, TComponent extends ComponentHKT = ComponentHKT> {
|
|
144
|
+
/**
|
|
145
|
+
* The field whose value is displayed as the document's human-readable title
|
|
146
|
+
* throughout the admin panel (list rows, breadcrumbs, relation pickers).
|
|
147
|
+
*
|
|
148
|
+
* Accepts any user-defined field slug from this collection, or a built-in
|
|
149
|
+
* Convex system field (`"_id"` | `"_creationTime"`). Setting a user-defined
|
|
150
|
+
* field also auto-generates a database index (`by_<field>`) and a search
|
|
151
|
+
* index (`search_<field>`) for fast admin queries. Omit to fall back to `"_id"`.
|
|
152
|
+
*/
|
|
153
|
+
useAsTitle?: CoreAdminField | NoInfer<TFieldSlug>;
|
|
154
|
+
/**
|
|
155
|
+
* Custom component overrides for rendering this collection's docs in
|
|
156
|
+
* relationship contexts (picker rows, table cells, selected-value chips).
|
|
157
|
+
*
|
|
158
|
+
* Override per-relationship via `RelationshipFieldInput.admin.components.preview`.
|
|
159
|
+
*
|
|
160
|
+
* Slot type is `ApplyComponent<F, RelationshipPreviewProps>` — in pure-core
|
|
161
|
+
* context (`F = ComponentHKT`) this resolves to `unknown`. In React context
|
|
162
|
+
* (`F = ReactHKT`, exposed via `@vexcms/react`) this resolves to
|
|
163
|
+
* `ComponentType<RelationshipPreviewProps>`.
|
|
164
|
+
*/
|
|
165
|
+
components?: {
|
|
166
|
+
/** Component used to render a doc of this collection as a relationship preview. */
|
|
167
|
+
preview?: ApplyComponent<TComponent, RelationshipPreviewProps>;
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* A valid Lucide icon name for this collection in the admin sidebar
|
|
171
|
+
* See https://lucide.dev/icons/
|
|
172
|
+
*/
|
|
173
|
+
icon?: LucideIconName;
|
|
174
|
+
/**
|
|
175
|
+
* Data table configuration for list view.
|
|
176
|
+
*/
|
|
177
|
+
table?: CollectionTableConfigInput;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Resolved admin panel configuration for a collection after defaults are applied.
|
|
181
|
+
*
|
|
182
|
+
* @see {@link AdminCollectionConfigInput} for the user-facing input type
|
|
183
|
+
*/
|
|
184
|
+
export interface AdminCollectionConfig<TFieldSlug extends string = CoreAdminField, TComponent extends ComponentHKT = ComponentHKT> {
|
|
185
|
+
/** The field used as the document's human-readable title in the admin panel. */
|
|
186
|
+
useAsTitle: CoreAdminField | NoInfer<TFieldSlug>;
|
|
187
|
+
components: {
|
|
188
|
+
preview?: ApplyComponent<TComponent, RelationshipPreviewProps>;
|
|
189
|
+
};
|
|
190
|
+
icon?: LucideIconName;
|
|
191
|
+
/**
|
|
192
|
+
* Data table configuration for list view.
|
|
193
|
+
*/
|
|
194
|
+
table: CollectionTableConfig;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Configuration input for a `defineCollection()` call.
|
|
198
|
+
*
|
|
199
|
+
* A collection maps to a Convex database table. `slug` becomes the table name,
|
|
200
|
+
* `fields` defines its shape, and `labels` controls how the collection appears
|
|
201
|
+
* in the admin panel. Omitted labels are inferred from the slug.
|
|
202
|
+
*
|
|
203
|
+
* **Defaults applied by `defineCollection()`:**
|
|
204
|
+
* ```ts
|
|
205
|
+
* {
|
|
206
|
+
* labels: {
|
|
207
|
+
* singular: "Post", // title-cased from slug ("posts" → "Post")
|
|
208
|
+
* plural: "Posts", // title-cased + pluralised from slug
|
|
209
|
+
* }
|
|
210
|
+
* }
|
|
211
|
+
* ```
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```ts
|
|
215
|
+
* defineCollection({
|
|
216
|
+
* slug: "posts",
|
|
217
|
+
* fields: {
|
|
218
|
+
* title: text({ required: true }),
|
|
219
|
+
* body: richtext(),
|
|
220
|
+
* },
|
|
221
|
+
* })
|
|
222
|
+
* ```
|
|
223
|
+
*
|
|
224
|
+
* @see {@link CollectionConfig} for the resolved type after defaults are applied
|
|
225
|
+
* @see {@link defineCollection} for the config function
|
|
226
|
+
*/
|
|
227
|
+
export interface CollectionConfigInput<TFieldMeta extends {} = {}, TCollectionMeta extends {} = {}, TCollectionSlug extends string = string, TFieldSlug extends string = string, TComponent extends ComponentHKT = ComponentHKT> {
|
|
228
|
+
/** Admin panel behaviour for this collection. All properties are optional. */
|
|
229
|
+
admin?: AdminCollectionConfigInput<TFieldSlug, TComponent>;
|
|
230
|
+
/** Convex table name — used as the database table identifier and URL slug in the admin panel. */
|
|
231
|
+
slug: TCollectionSlug;
|
|
232
|
+
/**
|
|
233
|
+
* Display names shown in the admin panel navigation and list views.
|
|
234
|
+
* Both are inferred from `slug` if omitted.
|
|
235
|
+
*/
|
|
236
|
+
labels?: {
|
|
237
|
+
/** Singular display name (e.g. `"Post"`). Inferred from slug if omitted. */
|
|
238
|
+
singular?: string;
|
|
239
|
+
/** Plural display name (e.g. `"Posts"`). Inferred from slug if omitted. */
|
|
240
|
+
plural?: string;
|
|
241
|
+
};
|
|
242
|
+
/** Field definitions that make up this collection's document shape. */
|
|
243
|
+
fields: Record<TFieldSlug, AdminField<TFieldMeta>>;
|
|
244
|
+
/** Override the PascalCase interface name used in generated TypeScript types. Inferred from `slug` by `defineCollection` if omitted. */
|
|
245
|
+
interfaceName?: string;
|
|
246
|
+
/** Index definitions that create indexes on this collection in Convex. */
|
|
247
|
+
indexes?: {
|
|
248
|
+
name: string;
|
|
249
|
+
fields: NoInfer<TFieldSlug>[];
|
|
250
|
+
}[];
|
|
251
|
+
meta?: TCollectionMeta;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Resolved collection configuration after defaults are applied by `defineCollection()`.
|
|
255
|
+
*
|
|
256
|
+
* @see {@link CollectionConfigInput} for the user-facing input type
|
|
257
|
+
* @see {@link defineCollection} for the config function
|
|
258
|
+
*/
|
|
259
|
+
export interface CollectionConfig<TFieldMeta extends {} = {}, TCollectionMeta extends {} = {}, TCollectionSlug extends CollectionSlug = CollectionSlug, TFieldSlug extends string = string, TComponent extends ComponentHKT = ComponentHKT> {
|
|
260
|
+
/** Resolved admin panel configuration for this collection. */
|
|
261
|
+
admin: AdminCollectionConfig<TFieldSlug, TComponent>;
|
|
262
|
+
/** Convex table name for this collection. */
|
|
263
|
+
slug: TCollectionSlug;
|
|
264
|
+
/** Display names shown in the admin panel — always present after defaults are applied. */
|
|
265
|
+
labels: {
|
|
266
|
+
/** Singular display name (e.g. `"Post"`). */
|
|
267
|
+
singular: string;
|
|
268
|
+
/** Plural display name (e.g. `"Posts"`). */
|
|
269
|
+
plural: string;
|
|
270
|
+
};
|
|
271
|
+
/** Resolved field definitions for this collection. */
|
|
272
|
+
fields: Record<TFieldSlug, AdminField<TFieldMeta>>;
|
|
273
|
+
/** PascalCase identifier derived from `slug`, used as the TypeScript interface name in generated types (e.g. `"posts"` → `"Posts"`). */
|
|
274
|
+
interfaceName: string;
|
|
275
|
+
/** Index definitions that create indexes on this collection in Convex. */
|
|
276
|
+
indexes?: {
|
|
277
|
+
name: string;
|
|
278
|
+
fields: NoInfer<TFieldSlug>[];
|
|
279
|
+
}[];
|
|
280
|
+
meta: TCollectionMeta;
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/collections/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { CollectionConfig } from "./types";
|
|
3
|
+
import type { TDocument } from "../api/convex";
|
|
4
|
+
/**
|
|
5
|
+
* Builds the `defaultValues` object for a TanStack Form instance from a collection.
|
|
6
|
+
*
|
|
7
|
+
* When `document` is provided, uses the document's field values (edit mode).
|
|
8
|
+
* When omitted, falls back to each field's `defaultValue` (create mode).
|
|
9
|
+
* The returned object's keys match the collection field keys.
|
|
10
|
+
*
|
|
11
|
+
* @param props - Input props.
|
|
12
|
+
* @param props.collection - The collection whose fields define the form shape.
|
|
13
|
+
* @param props.document - Optional existing document to populate values from when editing.
|
|
14
|
+
* @returns A `Record<fieldKey, value>` ready to pass to `useForm({ defaultValues })`.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* // New document — uses field defaults
|
|
19
|
+
* getCollectionDefaultValues({ collection: postsCollection })
|
|
20
|
+
* // → { title: "", slug: "" }
|
|
21
|
+
*
|
|
22
|
+
* // Existing document — uses document values
|
|
23
|
+
* getCollectionDefaultValues({ collection: postsCollection, document: doc })
|
|
24
|
+
* // → { title: "Hello world", slug: "hello-world" }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function getCollectionDefaultValues(props: {
|
|
28
|
+
collection: CollectionConfig;
|
|
29
|
+
document?: TDocument | null;
|
|
30
|
+
}): Record<string, unknown>;
|
|
31
|
+
/**
|
|
32
|
+
* Builds a Zod object schema for validating all fields in a collection.
|
|
33
|
+
*
|
|
34
|
+
* Calls `adminFieldToInputSchema` for each field and combines the results
|
|
35
|
+
* into a `z.object({...})`. Used by `useCollectionForm` as the TanStack Form
|
|
36
|
+
* `onSubmitAsync` / `onBlurAsync` validator.
|
|
37
|
+
*
|
|
38
|
+
* @param props - Input props.
|
|
39
|
+
* @param props.collection - The collection whose fields define the schema shape.
|
|
40
|
+
* @returns A `z.object` schema with one key per collection field.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const schema = getCollectionInputSchema({ collection: postsCollection })
|
|
45
|
+
* // → z.object({ title: z.string().min(1), slug: z.string().min(3).max(100) })
|
|
46
|
+
* schema.parse({ title: "Hello", slug: "hello" }) // passes
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function getCollectionInputSchema(props: {
|
|
50
|
+
collection: CollectionConfig;
|
|
51
|
+
}): z.ZodObject<{
|
|
52
|
+
[x: string]: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
/**
|
|
55
|
+
* Converts a collection slug to a PascalCase identifier for use in type names.
|
|
56
|
+
*
|
|
57
|
+
* Splits on underscores and hyphens and capitalizes each segment.
|
|
58
|
+
*
|
|
59
|
+
* @param props - Input props.
|
|
60
|
+
* @param props.slug - The collection slug, e.g. `"blog_posts"`, `"authors"`.
|
|
61
|
+
* @returns PascalCase string, e.g. `"BlogPosts"`, `"Authors"`.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* slugToPascalCase({ slug: "blog_posts" }) // → "BlogPosts"
|
|
66
|
+
* slugToPascalCase({ slug: "authors" }) // → "Authors"
|
|
67
|
+
*/
|
|
68
|
+
export declare function slugToPascalCase(props: {
|
|
69
|
+
slug: string;
|
|
70
|
+
}): string;
|
|
71
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/collections/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAgB,MAAM,KAAK,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,UAAU,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B,2BAaA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE,gBAAgB,CAAA;CAAE;;kBAS/E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKhE"}
|