@vexcms/core 0.0.19 → 0.1.0-alpha.2
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 -3470
- 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,332 @@
|
|
|
1
|
+
import type { GenericDataModel, GenericMutationCtx, GenericQueryCtx } from "convex/server";
|
|
2
|
+
import type { CollectionConfig, CollectionConfigInput } from "../collections";
|
|
3
|
+
import type { BaseFieldMeta, ComponentHKT } from "../fields";
|
|
4
|
+
import type { MediaCollectionSlug, StorageAdapterSlug } from "../types";
|
|
5
|
+
/**
|
|
6
|
+
* Metadata attached to every media collection linking it to a specific storage adapter.
|
|
7
|
+
*
|
|
8
|
+
* Set by `defineMediaCollection()` and tagged onto each collection by the
|
|
9
|
+
* adapter when it processes its `mediaCollections` array. Core uses
|
|
10
|
+
* `storageAdapter` to route upload, delete, and URL operations to the
|
|
11
|
+
* correct adapter at runtime.
|
|
12
|
+
*/
|
|
13
|
+
export type MediaCollectionMeta = {
|
|
14
|
+
/**
|
|
15
|
+
* Which storage adapter this collection is linked to specifically. "convex" supported by default
|
|
16
|
+
*/
|
|
17
|
+
storageAdapter: StorageAdapterSlug;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Configuration input for a `defineMediaCollection()` call.
|
|
21
|
+
*
|
|
22
|
+
* Identical to `CollectionConfigInput` except `fields` is omitted — media
|
|
23
|
+
* collections have a fixed set of system fields (`alt`, `filename`, `mimeType`,
|
|
24
|
+
* `size`, `storageId`, `deleted`, `convexUrl`, `width`, `height`) that
|
|
25
|
+
* `defineMediaCollection()` always injects. Pass extra custom fields via the
|
|
26
|
+
* `fields` override on `defineMediaCollection()`.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const images = defineMediaCollection({
|
|
31
|
+
* slug: "images",
|
|
32
|
+
* labels: { singular: "Image", plural: "Images" },
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @see {@link MediaCollectionConfig} for the resolved type after defaults are applied
|
|
37
|
+
* @see {@link file-storage-convex/src!defineMediaCollection} from `@vexcms/file-storage-convex`
|
|
38
|
+
*/
|
|
39
|
+
export type MediaCollectionConfigInput<TFieldMeta extends BaseFieldMeta = BaseFieldMeta, TCollectionMeta extends MediaCollectionMeta = MediaCollectionMeta, TCollectionSlug extends MediaCollectionSlug = MediaCollectionSlug, TFieldSlug extends string = string, TComponent extends ComponentHKT = ComponentHKT> = Omit<CollectionConfigInput<TFieldMeta, TCollectionMeta, TCollectionSlug, TFieldSlug, TComponent>, "fields">;
|
|
40
|
+
/**
|
|
41
|
+
* Resolved media collection configuration after `defineMediaCollection()` applies system fields and defaults.
|
|
42
|
+
*
|
|
43
|
+
* Structurally identical to `CollectionConfig` — all schema generation, admin
|
|
44
|
+
* panel rendering, and query helpers work against this type. Media collections
|
|
45
|
+
* are stored in `VexConfig.mediaCollections` separately from user-defined
|
|
46
|
+
* `collections` and appear under a dedicated "Media" section in the admin panel.
|
|
47
|
+
*
|
|
48
|
+
* @see {@link MediaCollectionConfigInput} for the user-facing input type
|
|
49
|
+
* @see {@link file-storage-convex/src!defineMediaCollection} from `@vexcms/file-storage-convex`
|
|
50
|
+
*/
|
|
51
|
+
export type MediaCollectionConfig<TFieldMeta extends BaseFieldMeta = BaseFieldMeta, TCollectionMeta extends MediaCollectionMeta = MediaCollectionMeta, TCollectionSlug extends MediaCollectionSlug = MediaCollectionSlug, TFieldSlug extends string = string, TComponent extends ComponentHKT = ComponentHKT> = CollectionConfig<TFieldMeta, TCollectionMeta, TCollectionSlug, TFieldSlug, TComponent>;
|
|
52
|
+
/**
|
|
53
|
+
* Error thrown when storage configuration is invalid.
|
|
54
|
+
*
|
|
55
|
+
* Covers: missing required fields on media collections, slug collisions
|
|
56
|
+
* (between collections and media collections, or across adapters), upload
|
|
57
|
+
* fields referencing non-existent media collections, or `upload()` used
|
|
58
|
+
* without a configured storage adapter.
|
|
59
|
+
*/
|
|
60
|
+
export declare class VexStorageConfigError extends Error {
|
|
61
|
+
/**
|
|
62
|
+
* @param message — Human-readable description of the configuration error.
|
|
63
|
+
*/
|
|
64
|
+
constructor(message: string);
|
|
65
|
+
}
|
|
66
|
+
/** Protocol type for file upload methods. */
|
|
67
|
+
export declare const STORAGE_ADAPTER_PROTOCOLS: {
|
|
68
|
+
readonly presignedUrl: "presigned-url";
|
|
69
|
+
};
|
|
70
|
+
/** Protocol type for file upload methods. */
|
|
71
|
+
export type StorageAdapterProtocol = (typeof STORAGE_ADAPTER_PROTOCOLS)[keyof typeof STORAGE_ADAPTER_PROTOCOLS];
|
|
72
|
+
/**
|
|
73
|
+
* Return type for `getUrl` — either a resolved URL or an error message, never both.
|
|
74
|
+
*/
|
|
75
|
+
export type GetUrlReturn = {
|
|
76
|
+
url: string;
|
|
77
|
+
error?: never;
|
|
78
|
+
} | {
|
|
79
|
+
url?: never;
|
|
80
|
+
error: string;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Shared interface implemented by all storage adapters.
|
|
84
|
+
*
|
|
85
|
+
* Defines the minimum contract — `name`, `type`, `mediaCollections`, and the
|
|
86
|
+
* four lifecycle methods (`createMediaDocument`, `deleteMedia`, `getUrl`,
|
|
87
|
+
* `uploadFile`) — that every adapter must satisfy regardless of protocol.
|
|
88
|
+
*
|
|
89
|
+
* @see {@link StorageAdapterPresignedUrlInterface} for the presigned-URL sub-interface
|
|
90
|
+
* @see {@link StorageAdapterPresignedUrl} for the abstract base class
|
|
91
|
+
*/
|
|
92
|
+
export interface StorageAdapterBaseInterface {
|
|
93
|
+
/** Protocol name — tells the admin panel what the identifier of this storage adapter is. */
|
|
94
|
+
readonly name: StorageAdapterSlug;
|
|
95
|
+
/** Protocol type — tells the admin panel how to upload files. */
|
|
96
|
+
readonly type: StorageAdapterProtocol;
|
|
97
|
+
/**
|
|
98
|
+
* Processed media collections ready for schema generation and admin panel.
|
|
99
|
+
*
|
|
100
|
+
* The adapter validates, augments, and returns these collections. Each
|
|
101
|
+
* collection is tagged with `meta.storageAdapterName` equal to this adapter's
|
|
102
|
+
* `name`. Core merges all collections from all adapters into
|
|
103
|
+
* `VexConfig.mediaCollections` — separate from user-defined `collections`.
|
|
104
|
+
*/
|
|
105
|
+
mediaCollections: MediaCollectionConfig[];
|
|
106
|
+
admin: {
|
|
107
|
+
/**
|
|
108
|
+
* When `true`, delete operations set `deleted: true` on the media document
|
|
109
|
+
* instead of physically removing the file. The file remains in storage until
|
|
110
|
+
* a scheduled cleanup job purges it.
|
|
111
|
+
*
|
|
112
|
+
* @default false
|
|
113
|
+
*/
|
|
114
|
+
softDelete: boolean;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Creates a media document in Convex after the file is uploaded.
|
|
118
|
+
* All adapters must use this exact signature.
|
|
119
|
+
*/
|
|
120
|
+
createMediaDocument<TDataModel extends GenericDataModel = GenericDataModel>(ctx: GenericMutationCtx<TDataModel>, args: {
|
|
121
|
+
collectionSlug: string;
|
|
122
|
+
storageId: string;
|
|
123
|
+
filename: string;
|
|
124
|
+
mimeType: string;
|
|
125
|
+
size: number;
|
|
126
|
+
alt?: string;
|
|
127
|
+
adapterFields?: Record<string, unknown>;
|
|
128
|
+
}): Promise<string>;
|
|
129
|
+
/**
|
|
130
|
+
* Deletes a media document and its file from storage.
|
|
131
|
+
* All adapters must use this exact signature.
|
|
132
|
+
*/
|
|
133
|
+
deleteMedia<TDataModel extends GenericDataModel = GenericDataModel>(ctx: GenericMutationCtx<TDataModel>, args: {
|
|
134
|
+
collectionSlug: string;
|
|
135
|
+
mediaId: string;
|
|
136
|
+
softDelete?: boolean;
|
|
137
|
+
}): Promise<boolean>;
|
|
138
|
+
/**
|
|
139
|
+
* Returns a URL for a media file.
|
|
140
|
+
* All adapters must use this exact signature.
|
|
141
|
+
*/
|
|
142
|
+
getUrl<TDataModel extends GenericDataModel = GenericDataModel>(ctx: GenericQueryCtx<TDataModel>, args: {
|
|
143
|
+
collectionSlug: string;
|
|
144
|
+
mediaId: string;
|
|
145
|
+
}): Promise<GetUrlReturn>;
|
|
146
|
+
/**
|
|
147
|
+
* Uploads a file to the storage backend and returns the storage ID.
|
|
148
|
+
*
|
|
149
|
+
* This is a pure JS function that can be called from any framework
|
|
150
|
+
* (React, Next.js, Svelte, etc.) or even directly in the browser.
|
|
151
|
+
*
|
|
152
|
+
* @param file - The file to upload
|
|
153
|
+
* @param uploadUrl - The presigned URL from generateUploadUrl
|
|
154
|
+
* @returns Promise resolving to { storageId, url, ... } with adapter-specific fields
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```ts
|
|
158
|
+
* // React component
|
|
159
|
+
* const { storageId } = await adapter.uploadFile(file, uploadUrl);
|
|
160
|
+
* await createMediaDocument({ storageId, ... });
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
uploadFile(file: any, uploadUrl: string): Promise<{
|
|
164
|
+
storageId: string;
|
|
165
|
+
url?: string;
|
|
166
|
+
[key: string]: unknown;
|
|
167
|
+
}>;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Return type for `generateUploadUrl` — the upload URL and an optional adapter-assigned storage ID.
|
|
171
|
+
*/
|
|
172
|
+
export type GenerateUploadUrlReturn = {
|
|
173
|
+
url: string;
|
|
174
|
+
storageId?: string;
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* Return type for `uploadFile` — the adapter-assigned storage ID, an optional public URL,
|
|
178
|
+
* and any adapter-specific fields (e.g. Cloudinary `public_id`, S3 `key`).
|
|
179
|
+
*/
|
|
180
|
+
export type UploadFileReturn = {
|
|
181
|
+
storageId: string;
|
|
182
|
+
url?: string;
|
|
183
|
+
[key: string]: unknown;
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Storage adapter interface for the presigned-URL upload protocol.
|
|
187
|
+
*
|
|
188
|
+
* Extends `StorageAdapterBaseInterface` with `generateUploadUrl` — the client
|
|
189
|
+
* requests a short-lived URL from the server, POSTs the file directly to
|
|
190
|
+
* storage, then calls `createMediaDocument` with the returned `storageId`.
|
|
191
|
+
*
|
|
192
|
+
* @see {@link StorageAdapterBaseInterface} for the shared base contract
|
|
193
|
+
* @see {@link StorageAdapterPresignedUrl} for the abstract base class to extend
|
|
194
|
+
*/
|
|
195
|
+
export interface StorageAdapterPresignedUrlInterface extends StorageAdapterBaseInterface {
|
|
196
|
+
readonly type: (typeof STORAGE_ADAPTER_PROTOCOLS)["presignedUrl"];
|
|
197
|
+
/**
|
|
198
|
+
* Generates a URL to upload a file to. Returns different shapes per protocol:
|
|
199
|
+
* - presigned-url: `{ url: string }` — POST the file to this URL
|
|
200
|
+
* - direct-upload: `{ url: string; storageId?: string }` — PUT the file to this URL
|
|
201
|
+
* - streaming: `{ url: string; storageId?: string }` — resumable upload session
|
|
202
|
+
*/
|
|
203
|
+
generateUploadUrl<TDataModel extends GenericDataModel = GenericDataModel>(ctx: GenericMutationCtx<TDataModel>): Promise<GenerateUploadUrlReturn>;
|
|
204
|
+
/**
|
|
205
|
+
* Uploads a file to the storage backend and returns the storage ID.
|
|
206
|
+
*
|
|
207
|
+
* This is a pure JS function that can be called from any framework
|
|
208
|
+
* (React, Next.js, Svelte, etc.) or even directly in the browser.
|
|
209
|
+
*
|
|
210
|
+
* @param file - The file to upload
|
|
211
|
+
* @param uploadUrl - The presigned URL from generateUploadUrl
|
|
212
|
+
* @returns Promise resolving to { storageId, url, ... } with adapter-specific fields
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```ts
|
|
216
|
+
* // React component
|
|
217
|
+
* const { storageId } = await adapter.uploadFile(file, uploadUrl);
|
|
218
|
+
* await createMediaDocument({ storageId, ... });
|
|
219
|
+
* ```
|
|
220
|
+
*/
|
|
221
|
+
uploadFile(file: any, uploadUrl: string): Promise<UploadFileReturn>;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Base class for storage adapters.
|
|
225
|
+
*
|
|
226
|
+
* All file storage adapters must extend this class to ensure consistent
|
|
227
|
+
* behavior in the admin panel. Adapters override methods to implement
|
|
228
|
+
* adapter-specific logic (e.g., different storage backends).
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```ts
|
|
232
|
+
* // In file-storage-convex/src/adapter/index.ts
|
|
233
|
+
* import { BaseStorageAdapter } from "@vexcms/core";
|
|
234
|
+
*
|
|
235
|
+
* export class ConvexStorageAdapter extends BaseStorageAdapter {
|
|
236
|
+
* readonly name = "convex";
|
|
237
|
+
*
|
|
238
|
+
* async generateUploadUrl(ctx) {
|
|
239
|
+
* const url = await ctx.storage.generateUploadUrl();
|
|
240
|
+
* return { url };
|
|
241
|
+
* }
|
|
242
|
+
*
|
|
243
|
+
* // Override other methods as needed...
|
|
244
|
+
* }
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
export declare abstract class StorageAdapterPresignedUrl implements StorageAdapterPresignedUrlInterface {
|
|
248
|
+
/** Protocol name — tells the admin panel what the identifier of this storage adapter is. */
|
|
249
|
+
abstract readonly name: StorageAdapterSlug;
|
|
250
|
+
/** Protocol type — tells the admin panel how to upload files. */
|
|
251
|
+
abstract readonly type: StorageAdapterProtocol;
|
|
252
|
+
abstract mediaCollections: MediaCollectionConfig[];
|
|
253
|
+
abstract admin: {
|
|
254
|
+
softDelete: boolean;
|
|
255
|
+
};
|
|
256
|
+
/**
|
|
257
|
+
* Generates a URL to upload a file to.
|
|
258
|
+
* Override in subclass for adapter-specific implementation.
|
|
259
|
+
*/
|
|
260
|
+
abstract generateUploadUrl<TDataModel extends GenericDataModel = GenericDataModel>(ctx: GenericMutationCtx<TDataModel>): Promise<{
|
|
261
|
+
url: string;
|
|
262
|
+
storageId?: string;
|
|
263
|
+
}>;
|
|
264
|
+
/**
|
|
265
|
+
* Creates a media document in Convex after the file is uploaded.
|
|
266
|
+
* Override in subclass for adapter-specific implementation.
|
|
267
|
+
*/
|
|
268
|
+
abstract createMediaDocument<TDataModel extends GenericDataModel = GenericDataModel>(ctx: GenericMutationCtx<TDataModel>, args: {
|
|
269
|
+
collectionSlug: string;
|
|
270
|
+
storageId: string;
|
|
271
|
+
filename: string;
|
|
272
|
+
mimeType: string;
|
|
273
|
+
size: number;
|
|
274
|
+
alt?: string;
|
|
275
|
+
adapterFields?: Record<string, unknown>;
|
|
276
|
+
}): Promise<string>;
|
|
277
|
+
/**
|
|
278
|
+
* Deletes a media document and its file from storage.
|
|
279
|
+
* Override in subclass for adapter-specific implementation.
|
|
280
|
+
*/
|
|
281
|
+
abstract deleteMedia<TDataModel extends GenericDataModel = GenericDataModel>(ctx: GenericMutationCtx<TDataModel>, args: {
|
|
282
|
+
collectionSlug: string;
|
|
283
|
+
mediaId: string;
|
|
284
|
+
softDelete?: boolean;
|
|
285
|
+
}): Promise<boolean>;
|
|
286
|
+
/**
|
|
287
|
+
* Returns a URL for a media file.
|
|
288
|
+
* Override in subclass for adapter-specific implementation.
|
|
289
|
+
*/
|
|
290
|
+
abstract getUrl<TDataModel extends GenericDataModel = GenericDataModel>(ctx: GenericQueryCtx<TDataModel>, args: {
|
|
291
|
+
collectionSlug: string;
|
|
292
|
+
mediaId: string;
|
|
293
|
+
}): Promise<{
|
|
294
|
+
url: string;
|
|
295
|
+
error?: never;
|
|
296
|
+
} | {
|
|
297
|
+
url?: never;
|
|
298
|
+
error: string;
|
|
299
|
+
}>;
|
|
300
|
+
/**
|
|
301
|
+
* Uploads a file to the storage backend and returns the storage ID.
|
|
302
|
+
*
|
|
303
|
+
* This is a pure JS function that can be called from any framework
|
|
304
|
+
* (React, Next.js, Svelte, etc.) or even directly in the browser.
|
|
305
|
+
*
|
|
306
|
+
* @param file - The file to upload
|
|
307
|
+
* @param uploadUrl - The presigned URL from generateUploadUrl
|
|
308
|
+
* @returns Promise resolving to { storageId, url, ... } with adapter-specific fields
|
|
309
|
+
*
|
|
310
|
+
* @example
|
|
311
|
+
* ```ts
|
|
312
|
+
* // React component
|
|
313
|
+
* const { storageId } = await adapter.uploadFile(file, uploadUrl);
|
|
314
|
+
* await createMediaDocument({ storageId, ... });
|
|
315
|
+
* ```
|
|
316
|
+
*/
|
|
317
|
+
abstract uploadFile(file: any, uploadUrl: string): Promise<{
|
|
318
|
+
storageId: string;
|
|
319
|
+
url?: string;
|
|
320
|
+
[key: string]: unknown;
|
|
321
|
+
}>;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Union of all supported storage adapter interface types.
|
|
325
|
+
*
|
|
326
|
+
* Currently only presigned-URL adapters are supported. Extend this union
|
|
327
|
+
* as new upload protocols are added.
|
|
328
|
+
*
|
|
329
|
+
* @see {@link StorageAdapterPresignedUrlInterface}
|
|
330
|
+
*/
|
|
331
|
+
export type VexStorageAdapter = StorageAdapterPresignedUrlInterface;
|
|
332
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats byte count into human-readable file size.
|
|
3
|
+
*
|
|
4
|
+
* Converts raw byte count into appropriate units (B, KB, MB, GB, TB)
|
|
5
|
+
* with sensible precision for each scale.
|
|
6
|
+
*
|
|
7
|
+
* @param bytes - File size in bytes
|
|
8
|
+
* @returns Formatted string with unit (e.g. "248 KB", "1.4 MB")
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* formatBytes(1024) // "1 KB"
|
|
13
|
+
* formatBytes(1536) // "1.5 KB"
|
|
14
|
+
* formatBytes(1048576) // "1 MB"
|
|
15
|
+
* formatBytes(248000) // "242.2 KB"
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function formatBytes(bytes: number): string;
|
|
19
|
+
/**
|
|
20
|
+
* Formats MIME type into short display name.
|
|
21
|
+
*
|
|
22
|
+
* Extracts the subtype from a MIME type and normalizes common variants.
|
|
23
|
+
*
|
|
24
|
+
* @param mimeType - Full MIME type (e.g. "image/jpeg")
|
|
25
|
+
* @returns Uppercase short name (e.g. "JPG")
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* formatMimeType("image/jpeg") // "JPG"
|
|
30
|
+
* formatMimeType("image/svg+xml") // "SVG"
|
|
31
|
+
* formatMimeType("application/pdf") // "PDF"
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatMimeType(mimeType: string): string;
|
|
35
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/media/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convex validator for `createMediaDocument` arguments.
|
|
3
|
+
* Every storage adapter must use this in its `createMediaDocument` mutation.
|
|
4
|
+
*/
|
|
5
|
+
export declare const createMediaDocumentArgs: import("convex/values").VObject<{
|
|
6
|
+
alt?: string | undefined;
|
|
7
|
+
adapterFields?: Record<string, any> | undefined;
|
|
8
|
+
storageId: string;
|
|
9
|
+
collectionSlug: string;
|
|
10
|
+
fileName: string;
|
|
11
|
+
mimeType: string;
|
|
12
|
+
size: number;
|
|
13
|
+
}, {
|
|
14
|
+
collectionSlug: import("convex/values").VString<string, "required">;
|
|
15
|
+
storageId: import("convex/values").VString<string, "required">;
|
|
16
|
+
fileName: import("convex/values").VString<string, "required">;
|
|
17
|
+
mimeType: import("convex/values").VString<string, "required">;
|
|
18
|
+
size: import("convex/values").VFloat64<number, "required">;
|
|
19
|
+
alt: import("convex/values").VString<string | undefined, "optional">;
|
|
20
|
+
adapterFields: import("convex/values").VRecord<Record<string, any> | undefined, import("convex/values").VString<string, "required">, import("convex/values").VAny<any, "required", string>, "optional", string>;
|
|
21
|
+
}, "required", "storageId" | "collectionSlug" | "fileName" | "mimeType" | "size" | "alt" | "adapterFields" | `adapterFields.${string}`>;
|
|
22
|
+
/**
|
|
23
|
+
* Convex validator for `createMediaDocument` return value.
|
|
24
|
+
* Returns the created media document ID.
|
|
25
|
+
*/
|
|
26
|
+
export declare const createMediaDocumentReturn: import("convex/values").VString<string, "required">;
|
|
27
|
+
/**
|
|
28
|
+
* Convex validator for `deleteMedia` arguments.
|
|
29
|
+
* Every storage adapter must use this in its `deleteMedia` mutation.
|
|
30
|
+
*/
|
|
31
|
+
export declare const deleteMediaArgs: import("convex/values").VObject<{
|
|
32
|
+
collectionSlug: string;
|
|
33
|
+
mediaId: string;
|
|
34
|
+
}, {
|
|
35
|
+
collectionSlug: import("convex/values").VString<string, "required">;
|
|
36
|
+
mediaId: import("convex/values").VString<string, "required">;
|
|
37
|
+
}, "required", "collectionSlug" | "mediaId">;
|
|
38
|
+
/**
|
|
39
|
+
* Convex validator for `deleteMedia` return value.
|
|
40
|
+
*/
|
|
41
|
+
export declare const deleteMediaReturn: import("convex/values").VBoolean<boolean, "required">;
|
|
42
|
+
/**
|
|
43
|
+
* Convex validator for `getUrl` arguments.
|
|
44
|
+
* Every storage adapter must use this in its `getUrl` query.
|
|
45
|
+
*/
|
|
46
|
+
export declare const getUrlArgs: import("convex/values").VObject<{
|
|
47
|
+
collectionSlug: string;
|
|
48
|
+
mediaId: string;
|
|
49
|
+
}, {
|
|
50
|
+
collectionSlug: import("convex/values").VString<string, "required">;
|
|
51
|
+
mediaId: import("convex/values").VString<string, "required">;
|
|
52
|
+
}, "required", "collectionSlug" | "mediaId">;
|
|
53
|
+
/**
|
|
54
|
+
* Convex validator for `getUrl` return value.
|
|
55
|
+
*/
|
|
56
|
+
export declare const getUrlReturn: import("convex/values").VObject<{
|
|
57
|
+
url: string;
|
|
58
|
+
}, {
|
|
59
|
+
url: import("convex/values").VString<string, "required">;
|
|
60
|
+
}, "required", "url">;
|
|
61
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/media/validators.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;uIAQlC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,yBAAyB,qDAAa,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;4CAG1B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,uDAAc,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;4CAGrB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY;;;;qBAEvB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { VexConfig } from "../config/types";
|
|
2
|
+
/**
|
|
3
|
+
* Generates the full contents of `vex.schema.ts` from a resolved `VexConfig`.
|
|
4
|
+
*
|
|
5
|
+
* Returns `{ update: false, contents }` when there are no collections — the output
|
|
6
|
+
* contains only the auto-generated header and no imports or table declarations.
|
|
7
|
+
* Returns `{ update: true, contents }` when collections are present — the output
|
|
8
|
+
* includes the header, `convex/server` and `convex/values` imports, and one
|
|
9
|
+
* `export const` block per collection.
|
|
10
|
+
*
|
|
11
|
+
* @param props - Input props.
|
|
12
|
+
* @param props.config - The fully resolved Vex configuration.
|
|
13
|
+
* @returns An object with `update` (whether the file should be written to disk) and `contents` (the file string).
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const config = defineConfig({
|
|
18
|
+
* collections: [
|
|
19
|
+
* defineCollection({ slug: "posts", fields: { title: text() } }),
|
|
20
|
+
* ],
|
|
21
|
+
* });
|
|
22
|
+
* const { update, contents } = generateVexSchema({ config });
|
|
23
|
+
* // update → true
|
|
24
|
+
* // contents → '// ⚠️ AUTO-GENERATED BY VEX CMS ...\nimport { defineTable } from "convex/server"\n...'
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @see {@link collectionConfigToVexSchema} for the per-collection string builder
|
|
28
|
+
* @see {@link VexConfig} for the resolved config shape
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateVexSchema(props: {
|
|
31
|
+
config: VexConfig;
|
|
32
|
+
}): {
|
|
33
|
+
update: boolean;
|
|
34
|
+
contents: string;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=generateVexSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateVexSchema.d.ts","sourceRoot":"","sources":["../../src/schema/generateVexSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWjD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG;IAC/D,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CA+BA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { VexConfig } from "../config/types";
|
|
2
|
+
/** A field that needs migration when its schema changes. */
|
|
3
|
+
export interface NeedsMigrationField {
|
|
4
|
+
table: string;
|
|
5
|
+
field: string;
|
|
6
|
+
isOptional: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** Metadata about a field that was removed from the config. */
|
|
9
|
+
export interface RemovedFieldInfo {
|
|
10
|
+
table: string;
|
|
11
|
+
field: string;
|
|
12
|
+
}
|
|
13
|
+
/** Diff result between two schema strings. */
|
|
14
|
+
export interface SchemaDiff {
|
|
15
|
+
needsMigration: NeedsMigrationField[];
|
|
16
|
+
removedFields: RemovedFieldInfo[];
|
|
17
|
+
}
|
|
18
|
+
/** A single field backfill operation produced by `planMigration`. */
|
|
19
|
+
export type MigrationOp = {
|
|
20
|
+
table: string;
|
|
21
|
+
field: string;
|
|
22
|
+
defaultValue: unknown;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Computes a diff between two schema strings, identifying fields that now
|
|
26
|
+
* need migration and fields that were removed. Stub — always returns an
|
|
27
|
+
* empty diff; schema-string diffing is not yet implemented.
|
|
28
|
+
*
|
|
29
|
+
* @param _previous - The prior schema source string. Currently unused;
|
|
30
|
+
* placeholder for the not-yet-implemented diffing logic.
|
|
31
|
+
* @param _next - The new schema source string. Currently unused;
|
|
32
|
+
* placeholder for the not-yet-implemented diffing logic.
|
|
33
|
+
* @returns An empty {@link SchemaDiff} until diffing is implemented.
|
|
34
|
+
*/
|
|
35
|
+
export declare function diffSchema(_previous: string, _next: string): SchemaDiff;
|
|
36
|
+
/**
|
|
37
|
+
* Returns a copy of the schema string with the given fields made optional.
|
|
38
|
+
* Stub — currently returns `schema` unchanged; the rewrite is not yet
|
|
39
|
+
* implemented.
|
|
40
|
+
*
|
|
41
|
+
* @param schema - The schema source string to rewrite.
|
|
42
|
+
* @param _fields - The fields that should be made optional. Currently
|
|
43
|
+
* unused; placeholder for the not-yet-implemented rewrite.
|
|
44
|
+
* @returns The schema string, unchanged until this is implemented.
|
|
45
|
+
*/
|
|
46
|
+
export declare function makeFieldsOptional(schema: string, _fields: NeedsMigrationField[]): string;
|
|
47
|
+
/**
|
|
48
|
+
* Returns a copy of the schema string with previously removed fields
|
|
49
|
+
* re-added as optional. Stub — currently returns `schema` unchanged; the
|
|
50
|
+
* rewrite is not yet implemented.
|
|
51
|
+
*
|
|
52
|
+
* @param schema - The schema source string to rewrite.
|
|
53
|
+
* @param _removedFields - The fields that were removed from the config and
|
|
54
|
+
* should be re-added as optional. Currently unused; placeholder for the
|
|
55
|
+
* not-yet-implemented rewrite.
|
|
56
|
+
* @returns The schema string, unchanged until this is implemented.
|
|
57
|
+
*/
|
|
58
|
+
export declare function addRemovedFieldsAsOptional(schema: string, _removedFields: RemovedFieldInfo[]): string;
|
|
59
|
+
/**
|
|
60
|
+
* Plans backfill operations from a schema diff. Stub — always returns an
|
|
61
|
+
* empty array; migration planning is not yet implemented.
|
|
62
|
+
*
|
|
63
|
+
* @param _props - The schema diff and resolved config to plan backfills
|
|
64
|
+
* from. Currently unused; placeholder for the not-yet-implemented
|
|
65
|
+
* planning logic.
|
|
66
|
+
* @returns An empty list of {@link MigrationOp}s until planning is
|
|
67
|
+
* implemented.
|
|
68
|
+
*/
|
|
69
|
+
export declare function planMigration(_props: {
|
|
70
|
+
diff: SchemaDiff;
|
|
71
|
+
config: VexConfig;
|
|
72
|
+
}): MigrationOp[];
|
|
73
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/schema/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,4DAA4D;AAC5D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACnC;AAED,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAEvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,EAAE,GAC7B,MAAM,CAER;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,gBAAgB,EAAE,GACjC,MAAM,CAER;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;CACnB,GAAG,WAAW,EAAE,CAEhB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { VexConfig } from "../config/types";
|
|
2
|
+
/**
|
|
3
|
+
* Generates the full contents of `vex.types.ts` from a resolved `VexConfig`.
|
|
4
|
+
*
|
|
5
|
+
* When there are no collections, returns only the auto-generated header.
|
|
6
|
+
* When collections are present, the output contains:
|
|
7
|
+
* - Imports for `Id` (from `@convex/_generated/dataModel`) and `VexDocument` (from `@vexcms/core`)
|
|
8
|
+
* - One `export interface` per collection, extending `VexDocument` with a branded `Id<"slug">` for `_id`
|
|
9
|
+
* - `export type CollectionSlug` — union of all collection slugs
|
|
10
|
+
* - `export type DocumentBySlug` — map of slug to document interface
|
|
11
|
+
* - `declare module '@vexcms/core'` block that augments `GeneratedVexTypes`, narrowing
|
|
12
|
+
* `CollectionSlug` and `DocumentBySlug` inside `@vexcms/core` itself
|
|
13
|
+
*
|
|
14
|
+
* @param props - Input props.
|
|
15
|
+
* @param props.config - The fully resolved Vex configuration.
|
|
16
|
+
* @returns The complete TypeScript source string to write to `vex.types.ts`.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const config = defineConfig({
|
|
21
|
+
* collections: [
|
|
22
|
+
* defineCollection({ slug: "posts", fields: { title: text({ required: true }) } }),
|
|
23
|
+
* ],
|
|
24
|
+
* });
|
|
25
|
+
* const contents = generateVexTypes({ config });
|
|
26
|
+
* // Writes to vex.types.ts:
|
|
27
|
+
* // import type { Id } from "@convex/_generated/dataModel"
|
|
28
|
+
* // import type { VexDocument } from "@vexcms/core"
|
|
29
|
+
* // export interface PostsDocument extends VexDocument { _id: Id<"posts">; title: string }
|
|
30
|
+
* // export type CollectionSlug = "posts"
|
|
31
|
+
* // export type DocumentBySlug = { posts: PostsDocument }
|
|
32
|
+
* // declare module "@vexcms/core" { interface GeneratedVexTypes { ... } }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @see {@link collectionConfigToInterface} for the per-collection interface builder
|
|
36
|
+
* @see {@link VexConfig} for the resolved config shape
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateVexTypes(props: {
|
|
39
|
+
config: VexConfig;
|
|
40
|
+
}): string;
|
|
41
|
+
//# sourceMappingURL=generateVexTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateVexTypes.d.ts","sourceRoot":"","sources":["../../src/types/generateVexTypes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA2CjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GAAG,MAAM,CA8HrE"}
|