@vexcms/core 0.0.20 → 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 -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,132 @@
|
|
|
1
|
+
import { ADMIN_FIELDS } from "../constants";
|
|
2
|
+
import { BaseField, BaseFieldInput, FieldAdminConfig } from "../baseTypes";
|
|
3
|
+
/**
|
|
4
|
+
* Configuration input for a `text()` field.
|
|
5
|
+
*
|
|
6
|
+
* Text fields store short, single-line string values — titles, slugs, URLs,
|
|
7
|
+
* email addresses, status labels, etc. All properties are optional; unset
|
|
8
|
+
* properties fall back to the defaults listed below.
|
|
9
|
+
*
|
|
10
|
+
* **Defaults applied by `text()`:**
|
|
11
|
+
* ```ts
|
|
12
|
+
* {
|
|
13
|
+
* type: "text",
|
|
14
|
+
* label: "", // inferred from the field key by defineCollection
|
|
15
|
+
* required: false, // field is optional by default
|
|
16
|
+
* admin: {
|
|
17
|
+
* hidden: false, // visible in the admin form
|
|
18
|
+
* readOnly: false, // editable by default
|
|
19
|
+
* position: "main", // placed in the main content column, not the sidebar
|
|
20
|
+
* width: "full", // spans the full form width, not half
|
|
21
|
+
* cellAlignment: "left", // text aligned left in the data table column
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* // Minimal — label is inferred from the key ("Title")
|
|
29
|
+
* title: text()
|
|
30
|
+
*
|
|
31
|
+
* // Required slug with length validation and a database index
|
|
32
|
+
* slug: text({ required: true, min: { value: 3 }, max: { value: 100 }, index: "by_slug" })
|
|
33
|
+
*
|
|
34
|
+
* // Author name with a placeholder hint shown in the admin form
|
|
35
|
+
* authorName: text({
|
|
36
|
+
* required: true,
|
|
37
|
+
* admin: { width: "half", placeholder: "e.g. Jane Smith" }
|
|
38
|
+
* })
|
|
39
|
+
*
|
|
40
|
+
* // Pre-filled default for a URL field
|
|
41
|
+
* canonicalUrl: text({ defaultValue: "https://example.com" })
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @see {@link BaseFieldInput} for shared properties (`label`, `description`, `required`, `admin`, `index`, `searchIndex`)
|
|
45
|
+
*/
|
|
46
|
+
export interface TextFieldInput<TFieldMeta extends {} = {}> extends BaseFieldInput<TFieldMeta> {
|
|
47
|
+
/**
|
|
48
|
+
* Pre-filled value shown in the admin form when creating a new field.
|
|
49
|
+
* Does not apply to database values
|
|
50
|
+
*
|
|
51
|
+
*/
|
|
52
|
+
defaultValue?: string;
|
|
53
|
+
/** Minimum character length config. */
|
|
54
|
+
min?: {
|
|
55
|
+
/** Minimum character length value. */
|
|
56
|
+
value: number;
|
|
57
|
+
/** Minimum character length error message. */
|
|
58
|
+
error?: string;
|
|
59
|
+
};
|
|
60
|
+
/** Maximum character length config. */
|
|
61
|
+
max?: {
|
|
62
|
+
/** Maximum character length value. */
|
|
63
|
+
value: number;
|
|
64
|
+
/** Maximum character length error message. */
|
|
65
|
+
error?: string;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Create a full-text search index on this field.
|
|
69
|
+
* The field this is defined on becomes the `searchField`.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* title: {
|
|
74
|
+
* type: "text",
|
|
75
|
+
* searchIndex: { name: "search_title", filterFields: ["status", "author"] },
|
|
76
|
+
* }
|
|
77
|
+
* // Generates: .searchIndex("search_title", { searchField: "title", filterFields: ["status", "author"] })
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
searchIndex?: {
|
|
81
|
+
/** Search index name (must be unique within the collection). */
|
|
82
|
+
name: string;
|
|
83
|
+
/**
|
|
84
|
+
* Fields to filter search results by.
|
|
85
|
+
* String array — validated at runtime against collection field names.
|
|
86
|
+
*/
|
|
87
|
+
filterFields: string[];
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Resolved configuration for a `text()` field, after all defaults are applied.
|
|
92
|
+
*
|
|
93
|
+
* This is the type that framework adapters and field components receive —
|
|
94
|
+
* `fieldDef` in `InputComponentProps<TextField>` and `CellComponentProps<TextField>`
|
|
95
|
+
* is this type.
|
|
96
|
+
*
|
|
97
|
+
* @see {@link TextFieldInput} for the user-facing input type
|
|
98
|
+
* @see {@link text} for the config function that produces this type
|
|
99
|
+
*/
|
|
100
|
+
export interface TextField<TFieldMeta extends {} = {}> extends BaseField<TFieldMeta> {
|
|
101
|
+
readonly type: typeof ADMIN_FIELDS.text.type;
|
|
102
|
+
/** Display label shown in the admin form. Always set — inferred from the field key if not provided. */
|
|
103
|
+
label: string;
|
|
104
|
+
/** Whether this field is required in the database schema. */
|
|
105
|
+
required: boolean;
|
|
106
|
+
/** Resolved admin UI configuration with all defaults applied. */
|
|
107
|
+
admin: FieldAdminConfig;
|
|
108
|
+
/** Pre-filled value shown in the admin form when creating a new field. */
|
|
109
|
+
defaultValue: string;
|
|
110
|
+
/** Minimum allowed character length config. */
|
|
111
|
+
min?: {
|
|
112
|
+
/** Minimum allowed character length value. */
|
|
113
|
+
value: number;
|
|
114
|
+
/** Minimum allowed character length error message. */
|
|
115
|
+
error?: string;
|
|
116
|
+
};
|
|
117
|
+
/** Maximum allowed character length config. */
|
|
118
|
+
max?: {
|
|
119
|
+
/** Maximum allowed character length value. */
|
|
120
|
+
value: number;
|
|
121
|
+
/** Maximum allowed character length error message. */
|
|
122
|
+
error?: string;
|
|
123
|
+
};
|
|
124
|
+
/** Full-text search index configuration for this field. */
|
|
125
|
+
searchIndex?: {
|
|
126
|
+
/** Search index name — must be unique within the collection. */
|
|
127
|
+
name: string;
|
|
128
|
+
/** Fields to filter search results by. */
|
|
129
|
+
filterFields: string[];
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/fields/text/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,WAAW,cAAc,CAC7B,UAAU,SAAS,EAAE,GAAG,EAAE,CAC1B,SAAQ,cAAc,CAAC,UAAU,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,GAAG,CAAC,EAAE;QACJ,sCAAsC;QACtC,KAAK,EAAE,MAAM,CAAC;QACd,8CAA8C;QAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,uCAAuC;IACvC,GAAG,CAAC,EAAE;QACJ,sCAAsC;QACtC,KAAK,EAAE,MAAM,CAAC;QACd,8CAA8C;QAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE;QACZ,gEAAgE;QAChE,IAAI,EAAE,MAAM,CAAC;QACb;;;WAGG;QACH,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,SAAS,CAAC,UAAU,SAAS,EAAE,GAAG,EAAE,CAAE,SAAQ,SAAS,CAAC,UAAU,CAAC;IAClF,QAAQ,CAAC,IAAI,EAAE,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7C,uGAAuG;IACvG,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,KAAK,EAAE,gBAAgB,CAAC;IACxB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,GAAG,CAAC,EAAE;QACJ,8CAA8C;QAC9C,KAAK,EAAE,MAAM,CAAC;QACd,sDAAsD;QACtD,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,+CAA+C;IAC/C,GAAG,CAAC,EAAE;QACJ,8CAA8C;QAC9C,KAAK,EAAE,MAAM,CAAC;QACd,sDAAsD;QACtD,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,2DAA2D;IAC3D,WAAW,CAAC,EAAE;QACZ,gEAAgE;QAChE,IAAI,EAAE,MAAM,CAAC;QACb,0CAA0C;QAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { TextField } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Converts a text field definition to a Convex schema validator.
|
|
4
|
+
*
|
|
5
|
+
* Generates the appropriate v.string() or v.optional(v.string()) code
|
|
6
|
+
* for the Convex schema based on the field's required property.
|
|
7
|
+
*
|
|
8
|
+
* **Important notes:**
|
|
9
|
+
* - `min`/`max` are runtime validation constraints, NOT schema constraints
|
|
10
|
+
* - They don't affect the generated Convex value type
|
|
11
|
+
* - Validation happens in the admin panel and mutation handlers
|
|
12
|
+
* - The index property is handled separately by index collection logic
|
|
13
|
+
*
|
|
14
|
+
* This function is used by the CLI during schema generation to build
|
|
15
|
+
* the Convex schema file.
|
|
16
|
+
*
|
|
17
|
+
* @param props - textFieldToValidator() input props
|
|
18
|
+
* @param props.field - The text field definition
|
|
19
|
+
* @returns Convex value type string: "v.string()" or "v.optional(v.string())"
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const field1 = text({ required: true })
|
|
24
|
+
* textToValidatorString({ field: field1 }) // "v.string()"
|
|
25
|
+
*
|
|
26
|
+
* const field2 = text({ required: false })
|
|
27
|
+
* textToValidatorString({ field: field2 }) // "v.optional(v.string())"
|
|
28
|
+
*
|
|
29
|
+
* const field3 = text({ min: { value: 3 }, max: { value: 100 } })
|
|
30
|
+
* textToValidatorString({ field: field3 }) // "v.optional(v.string())"
|
|
31
|
+
* // Note: Length constraints don't affect schema, handled at validation layer
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @internal - Used by schema generation, not typically called by users
|
|
35
|
+
*/
|
|
36
|
+
export declare function textFieldToValidator(props: {
|
|
37
|
+
field: TextField;
|
|
38
|
+
}): string;
|
|
39
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/fields/text/validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG,MAAM,CAKxE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { NumberField } from "./number";
|
|
2
|
+
import { TextField } from "./text";
|
|
3
|
+
import { CheckboxField } from "./checkbox";
|
|
4
|
+
import { DateField } from "./date";
|
|
5
|
+
import { TDocument } from "../api/convex";
|
|
6
|
+
import { CollectionConfig } from "../collections";
|
|
7
|
+
import { Row } from "@tanstack/react-table";
|
|
8
|
+
import { SelectField } from "./select";
|
|
9
|
+
import { UrlField } from "./url";
|
|
10
|
+
import { ColorField } from "./color";
|
|
11
|
+
import { RelationshipField } from "./relationship";
|
|
12
|
+
import { ArrayField, ArrayType } from "./array";
|
|
13
|
+
import { GroupField } from "./group";
|
|
14
|
+
import { BlocksField } from "./blocks";
|
|
15
|
+
import { UploadField } from "./upload";
|
|
16
|
+
import { GlobalConfig } from "../globals";
|
|
17
|
+
export * from "./text/types";
|
|
18
|
+
export * from "./number/types";
|
|
19
|
+
export * from "./checkbox/types";
|
|
20
|
+
export * from "./blocks/types";
|
|
21
|
+
/**
|
|
22
|
+
* BaseFieldMeta - empty object
|
|
23
|
+
*/
|
|
24
|
+
export type BaseFieldMeta = {};
|
|
25
|
+
/**
|
|
26
|
+
* CollectionFieldMeta - default metadata
|
|
27
|
+
* added to all fields via defineCollection, defineMediaCollection, etc
|
|
28
|
+
*/
|
|
29
|
+
export type CollectionFieldMeta = BaseFieldMeta & {
|
|
30
|
+
collectionSlug: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Discriminated union of all field types in VexCMS.
|
|
34
|
+
*
|
|
35
|
+
* Switch on `field.type` to narrow to a specific field type and access
|
|
36
|
+
* its type-specific properties.
|
|
37
|
+
*
|
|
38
|
+
* Currently includes:
|
|
39
|
+
* - `TextField` — single-line text input
|
|
40
|
+
* - `NumberField` — numeric value (price, quantity, rating, etc.)
|
|
41
|
+
* - `CheckboxField` — boolean toggle (published state, feature flag, opt-in, etc.)
|
|
42
|
+
* - `DateField` — Unix ms timestamp (publish date, expiry date, event time, etc.)
|
|
43
|
+
* - `SelectField` — single-choice from a predefined set of options
|
|
44
|
+
* - `UrlField` — validated URL string
|
|
45
|
+
* - `ColorField` — CSS colour string, or a `var(--token)` reference when `themeColors` is on
|
|
46
|
+
* - `RelationshipField` — Convex `Id` reference to a document in another collection
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* function handleField(field: AdminField) {
|
|
51
|
+
* switch (field.type) {
|
|
52
|
+
* case "text":
|
|
53
|
+
* // field is TextField
|
|
54
|
+
* break;
|
|
55
|
+
* }
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export type AdminField<TFieldMeta extends BaseFieldMeta = BaseFieldMeta> = TextField<TFieldMeta> | NumberField<TFieldMeta> | CheckboxField<TFieldMeta> | DateField<TFieldMeta> | SelectField<TFieldMeta> | UrlField<TFieldMeta> | ColorField<TFieldMeta> | ArrayField<ArrayType, TFieldMeta> | RelationshipField<TFieldMeta> | UploadField<TFieldMeta> | BlocksField<TFieldMeta> | GroupField<TFieldMeta>;
|
|
60
|
+
/**
|
|
61
|
+
* Props passed to field input components rendered in the document edit form.
|
|
62
|
+
*
|
|
63
|
+
* Every input component registered in a framework adapter's `fields` map must
|
|
64
|
+
* accept these props. The `TField` generic narrows `fieldDef` to the specific
|
|
65
|
+
* field type (e.g. `TextField`) so type-specific properties are accessible
|
|
66
|
+
* with autocomplete.
|
|
67
|
+
*
|
|
68
|
+
* In React, use `createFieldInput<TValue, TField>` to build components that
|
|
69
|
+
* accept these props — it handles TanStack Form wiring automatically.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```tsx
|
|
73
|
+
* // React — using createFieldInput
|
|
74
|
+
* export const TextFieldInput = createFieldInput<string, TextField>(
|
|
75
|
+
* ({ name, fieldDef, readOnly, field }) => (
|
|
76
|
+
* <input
|
|
77
|
+
* value={field.state.value ?? ""}
|
|
78
|
+
* onChange={(e) => field.handleChange(e.target.value)}
|
|
79
|
+
* readOnly={readOnly}
|
|
80
|
+
* placeholder={fieldDef.admin.placeholder}
|
|
81
|
+
* />
|
|
82
|
+
* ),
|
|
83
|
+
* );
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @see {@link CellComponentProps} for the data table equivalent
|
|
87
|
+
* @see {@link FieldComponentMap} for how components are registered
|
|
88
|
+
*/
|
|
89
|
+
export interface InputComponentProps<TFieldMeta extends BaseFieldMeta = BaseFieldMeta, TField extends AdminField<TFieldMeta> = AdminField<TFieldMeta>> {
|
|
90
|
+
/** The field key name from the collection config, e.g. `"title"`. Used as the form field name. */
|
|
91
|
+
name: string;
|
|
92
|
+
/** The resolved field definition — narrows to the specific field type via `TField`. */
|
|
93
|
+
fieldDef: TField;
|
|
94
|
+
/** Whether the field is non-editable — derived from `fieldDef.admin.readOnly` or permission checks. */
|
|
95
|
+
readOnly: boolean;
|
|
96
|
+
index?: number;
|
|
97
|
+
/** The config for the collection this field is attached to. */
|
|
98
|
+
collection: CollectionConfig | GlobalConfig;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Props passed to field cell components rendered in the data table list view.
|
|
102
|
+
*
|
|
103
|
+
* Every cell component registered in a framework adapter's `fields` map must
|
|
104
|
+
* accept these props. The `TField` generic narrows `fieldDef` to the specific
|
|
105
|
+
* field type so type-specific properties are accessible.
|
|
106
|
+
*
|
|
107
|
+
* `value` is typed as `TField["defaultValue"]` which resolves to the field's
|
|
108
|
+
* stored value type (e.g. `string` for `TextField`).
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```tsx
|
|
112
|
+
* export function TextFieldCell(props: CellComponentProps<TextField>) {
|
|
113
|
+
* if (!props.value) return <span>—</span>;
|
|
114
|
+
* return <span>{props.value}</span>;
|
|
115
|
+
* }
|
|
116
|
+
* ```
|
|
117
|
+
*
|
|
118
|
+
* @see {@link InputComponentProps} for the edit form equivalent
|
|
119
|
+
* @see {@link FieldComponentMap} for how components are registered
|
|
120
|
+
*/
|
|
121
|
+
export interface CellComponentProps<TField extends AdminField = AdminField, TData extends TDocument = TDocument, TCollectionConfig extends CollectionConfig = CollectionConfig> {
|
|
122
|
+
/** The raw field value from the document — typed to the field's value type. */
|
|
123
|
+
value: TField["defaultValue"];
|
|
124
|
+
/** The full document row, for cases where the cell needs to read other fields. */
|
|
125
|
+
row: Row<TData>;
|
|
126
|
+
/** The resolved field definition — narrows to the specific field type via `TField`. */
|
|
127
|
+
fieldDef: TField;
|
|
128
|
+
/** The resolved field key on the collection for this column. */
|
|
129
|
+
fieldKey: string;
|
|
130
|
+
/** Whether this cell is the field designated as `useAsTitle` — used to render a clickable edit link. */
|
|
131
|
+
isTitleField: boolean;
|
|
132
|
+
/** The parent collection config — used by title cells to build the edit link `href`. */
|
|
133
|
+
collection: TCollectionConfig;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fields/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseFieldMeta } from "../types";
|
|
2
|
+
import type { UploadFieldInput, UploadField } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Creates an upload field that stores a reference to a media document.
|
|
5
|
+
*
|
|
6
|
+
* The `to` parameter specifies which media collection receives uploaded files.
|
|
7
|
+
* At config validation time, the `to` slug is checked against the media
|
|
8
|
+
* collections returned by all configured storage adapters.
|
|
9
|
+
*
|
|
10
|
+
* @param options — Upload field configuration. `to` is required.
|
|
11
|
+
* @returns Resolved upload field definition.
|
|
12
|
+
*
|
|
13
|
+
* @throws {Error} If `to` is empty or not a valid slug (`/^[a-zA-Z][a-zA-Z0-9_-]*$/`).
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* defineCollection({
|
|
18
|
+
* fields: {
|
|
19
|
+
* featuredImage: upload({ to: "images", label: "Featured Image" }),
|
|
20
|
+
* },
|
|
21
|
+
* });
|
|
22
|
+
*/
|
|
23
|
+
export declare function upload<TFieldMeta extends BaseFieldMeta = BaseFieldMeta>(options: UploadFieldInput<TFieldMeta>): UploadField<TFieldMeta>;
|
|
24
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/fields/upload/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,MAAM,CAAC,UAAU,SAAS,aAAa,GAAG,aAAa,EACrE,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC,GACpC,WAAW,CAAC,UAAU,CAAC,CA+BzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/upload/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ZodType } from "zod";
|
|
2
|
+
import type { UploadField } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Generates the Zod input schema for an upload field.
|
|
5
|
+
*
|
|
6
|
+
* The form stores a media document ID string. The upload component validates
|
|
7
|
+
* that the ID points to an existing media document at the UI level (by querying
|
|
8
|
+
* the media collection), but the Zod schema is a simple string check.
|
|
9
|
+
*
|
|
10
|
+
* @param props — Input schema generation options.
|
|
11
|
+
* @param props.field — The resolved upload field definition.
|
|
12
|
+
* @returns Zod schema for the form field value.
|
|
13
|
+
*/
|
|
14
|
+
export declare function uploadFieldToInputSchema(props: {
|
|
15
|
+
field: UploadField;
|
|
16
|
+
}): ZodType;
|
|
17
|
+
//# sourceMappingURL=inputSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputSchema.d.ts","sourceRoot":"","sources":["../../../src/fields/upload/inputSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAG/E"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { BaseField, BaseFieldInput } from "../baseTypes";
|
|
2
|
+
import type { MediaCollectionSlug } from "../../types/generated";
|
|
3
|
+
import { ADMIN_FIELDS } from "../constants";
|
|
4
|
+
import { BaseFieldMeta } from "../types";
|
|
5
|
+
/**
|
|
6
|
+
* Input configuration for an `upload()` field — the `to` parameter is required
|
|
7
|
+
* and references the target media collection slug.
|
|
8
|
+
*/
|
|
9
|
+
export interface UploadFieldInput<TFieldMeta extends BaseFieldMeta = BaseFieldMeta> extends BaseFieldInput<TFieldMeta> {
|
|
10
|
+
/**
|
|
11
|
+
* The slug of the media collection that stores uploaded files for this field.
|
|
12
|
+
*
|
|
13
|
+
* Must match a media collection defined via a storage adapter's
|
|
14
|
+
* `defineMediaCollection()`. After running `vex generate`, this is typed as
|
|
15
|
+
* `MediaCollectionSlug` — a union of all media collection slugs in the project.
|
|
16
|
+
* Before generation, it falls back to `string`.
|
|
17
|
+
*
|
|
18
|
+
* Config validation (in `media/config.ts`) also checks at runtime that the
|
|
19
|
+
* slug exists in `VexConfig.mediaCollections`.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* upload({ to: "images", label: "Featured Image" })
|
|
24
|
+
*/
|
|
25
|
+
to: MediaCollectionSlug;
|
|
26
|
+
/**
|
|
27
|
+
* The min number of files allowed.
|
|
28
|
+
*/
|
|
29
|
+
min?: number;
|
|
30
|
+
/**
|
|
31
|
+
* The max number of files allowed.
|
|
32
|
+
*/
|
|
33
|
+
max?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Whether this input accepts multiple files or only one.
|
|
36
|
+
*/
|
|
37
|
+
hasMany?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Pre-filled value shown in the admin form when creating a new document.
|
|
40
|
+
*/
|
|
41
|
+
defaultValue?: string[];
|
|
42
|
+
/**
|
|
43
|
+
* Restrict files that can be uploaded by mimeType.
|
|
44
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept
|
|
45
|
+
* @example 'image/*'
|
|
46
|
+
* @example 'image/*, audio/mp4'
|
|
47
|
+
* @example 'image/webp, audio/mp3'
|
|
48
|
+
*/
|
|
49
|
+
accept?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolved upload field definition after defaults are applied.
|
|
53
|
+
*/
|
|
54
|
+
export interface UploadField<TFieldMeta extends BaseFieldMeta = BaseFieldMeta> extends BaseField<TFieldMeta> {
|
|
55
|
+
readonly type: typeof ADMIN_FIELDS.upload.type;
|
|
56
|
+
to: MediaCollectionSlug;
|
|
57
|
+
/**
|
|
58
|
+
* Whether this input accepts multiple files or only one.
|
|
59
|
+
*/
|
|
60
|
+
hasMany: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* The min number of files allowed.
|
|
63
|
+
*/
|
|
64
|
+
min: number;
|
|
65
|
+
/**
|
|
66
|
+
* The max number of files allowed.
|
|
67
|
+
*/
|
|
68
|
+
max?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Pre-filled value shown in the admin form when creating a new document.
|
|
71
|
+
*/
|
|
72
|
+
defaultValue?: string[];
|
|
73
|
+
/**
|
|
74
|
+
* Restrict files that can be uploaded by mimeType.
|
|
75
|
+
*/
|
|
76
|
+
accept: string;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/fields/upload/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;GAGG;AACH,MAAM,WAAW,gBAAgB,CAC/B,UAAU,SAAS,aAAa,GAAG,aAAa,CAChD,SAAQ,cAAc,CAAC,UAAU,CAAC;IAClC;;;;;;;;;;;;;;OAcG;IACH,EAAE,EAAE,mBAAmB,CAAC;IACxB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAC1B,UAAU,SAAS,aAAa,GAAG,aAAa,CAChD,SAAQ,SAAS,CAAC,UAAU,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;IAC/C,EAAE,EAAE,mBAAmB,CAAC;IACxB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { UploadField } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Generates the Convex schema validator for an upload field.
|
|
4
|
+
*
|
|
5
|
+
* Stores a media document ID: `v.id("<to-slug>")`. The `to` slug is the
|
|
6
|
+
* media collection name — schema generation validates that the collection exists.
|
|
7
|
+
*
|
|
8
|
+
* @param props — Validator generation options.
|
|
9
|
+
* @param props.field — The resolved upload field definition.
|
|
10
|
+
* @returns Convex validator string, e.g. `"v.id(\"images\")"` or
|
|
11
|
+
* `"v.optional(v.id(\"images\"))"`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function uploadFieldToValidator(props: {
|
|
14
|
+
field: UploadField;
|
|
15
|
+
}): string;
|
|
16
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/fields/upload/validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,MAAM,CAG5E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseFieldMeta } from "../types";
|
|
2
|
+
import type { UrlFieldInput, UrlField } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a URL field with all defaults applied.
|
|
5
|
+
*
|
|
6
|
+
* URL fields store absolute URLs as strings and render them as clickable
|
|
7
|
+
* links in the admin data table. Common uses: website links, canonical
|
|
8
|
+
* URLs, external resource references, social profile URLs.
|
|
9
|
+
*
|
|
10
|
+
* Accepts {@link UrlFieldInput} (all optional) and returns {@link UrlField} with all defaults applied.
|
|
11
|
+
*
|
|
12
|
+
* **Defaults applied:**
|
|
13
|
+
* - `label` — `""` (inferred from the field key by `defineCollection`)
|
|
14
|
+
* - `required` — `false`
|
|
15
|
+
* - `admin.hidden` — `false`
|
|
16
|
+
* - `admin.readOnly` — `false`
|
|
17
|
+
* - `admin.position` — `"main"`
|
|
18
|
+
* - `admin.width` — `"full"`
|
|
19
|
+
* - `admin.cellAlignment` — `"left"`
|
|
20
|
+
*
|
|
21
|
+
* @param options - URL field configuration. All properties are optional.
|
|
22
|
+
* @returns Resolved URL field definition with all defaults applied.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { url, defineCollection } from '@vexcms/core'
|
|
27
|
+
*
|
|
28
|
+
* pages: defineCollection({
|
|
29
|
+
* fields: {
|
|
30
|
+
* // Minimal — label inferred from key ("Canonical Url")
|
|
31
|
+
* canonicalUrl: url(),
|
|
32
|
+
*
|
|
33
|
+
* // Required website URL with a length cap and database index
|
|
34
|
+
* website: url({ required: true, max: { value: 2048 }, index: "by_website" }),
|
|
35
|
+
*
|
|
36
|
+
* // Social profile URL with a placeholder hint
|
|
37
|
+
* twitterUrl: url({
|
|
38
|
+
* required: false,
|
|
39
|
+
* admin: { width: "half", placeholder: "https://twitter.com/username" },
|
|
40
|
+
* }),
|
|
41
|
+
* }
|
|
42
|
+
* })
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @see {@link UrlFieldInput} for the full input type
|
|
46
|
+
* @see {@link UrlField} for the resolved output type
|
|
47
|
+
*/
|
|
48
|
+
export declare function url<TFieldMeta extends BaseFieldMeta = BaseFieldMeta>(options?: UrlFieldInput<TFieldMeta>): UrlField<TFieldMeta>;
|
|
49
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/fields/url/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,GAAG,CAAC,UAAU,SAAS,aAAa,GAAG,aAAa,EAClE,OAAO,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,GAClC,QAAQ,CAAC,UAAU,CAAC,CA0BtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/url/index.ts"],"names":[],"mappings":"AACA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ZodType } from "zod";
|
|
2
|
+
import { UrlField } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Builds a Zod schema for validating a URL field value in the admin form.
|
|
5
|
+
*
|
|
6
|
+
* Enforces URL format via `z.url()`. Required fields add a `.min(1)` check.
|
|
7
|
+
* `.default(field.defaultValue)` is applied only when `defaultValue` is explicitly
|
|
8
|
+
* set on the field — unlike `text()`, the url field has no implicit empty-string
|
|
9
|
+
* default. Wraps in `.optional()` for non-required fields via
|
|
10
|
+
* `applyBaseInputSchemaMeta`.
|
|
11
|
+
*
|
|
12
|
+
* @param props - Input props.
|
|
13
|
+
* @param props.field - The resolved URL field definition.
|
|
14
|
+
* @returns A Zod URL schema. Optional fields are wrapped in `.optional()`. A
|
|
15
|
+
* `.default()` is only added when `field.defaultValue` is not `undefined`.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // Required — rejects empty string and non-URLs
|
|
20
|
+
* urlFieldToInputSchema({ field: url({ required: true }) })
|
|
21
|
+
* // → z.url().min(1, "This field is required.").optional() — no default
|
|
22
|
+
*
|
|
23
|
+
* // Optional with explicit default
|
|
24
|
+
* urlFieldToInputSchema({ field: url({ required: false, defaultValue: "https://example.com" }) })
|
|
25
|
+
* // → z.url().default("https://example.com").optional()
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function urlFieldToInputSchema(props: {
|
|
29
|
+
field: UrlField;
|
|
30
|
+
}): ZodType;
|
|
31
|
+
//# sourceMappingURL=inputSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputSchema.d.ts","sourceRoot":"","sources":["../../../src/fields/url/inputSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACpG,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAiBzE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ADMIN_FIELDS } from "../constants";
|
|
2
|
+
import { BaseField, BaseFieldInput } from "../baseTypes";
|
|
3
|
+
/**
|
|
4
|
+
* Configuration input for a `url()` field.
|
|
5
|
+
*
|
|
6
|
+
* URL fields store absolute URLs as strings. All properties are optional;
|
|
7
|
+
* unset properties fall back to the defaults listed below.
|
|
8
|
+
*
|
|
9
|
+
* **Defaults applied by `url()`:**
|
|
10
|
+
* ```ts
|
|
11
|
+
* {
|
|
12
|
+
* type: "url",
|
|
13
|
+
* label: "", // inferred from the field key by defineCollection
|
|
14
|
+
* required: false, // field is optional by default
|
|
15
|
+
* admin: {
|
|
16
|
+
* hidden: false, // visible in the admin form
|
|
17
|
+
* readOnly: false, // editable by default
|
|
18
|
+
* position: "main", // placed in the main content column, not the sidebar
|
|
19
|
+
* width: "full", // spans the full form width, not half
|
|
20
|
+
* cellAlignment: "left", // text aligned left in the data table column
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* // Minimal — label is inferred from the key ("Canonical Url")
|
|
28
|
+
* canonicalUrl: url()
|
|
29
|
+
*
|
|
30
|
+
* // Required website URL with a length cap and a database index
|
|
31
|
+
* website: url({ required: true, max: { value: 2048 }, index: "by_website" })
|
|
32
|
+
*
|
|
33
|
+
* // Social profile URL with a placeholder hint
|
|
34
|
+
* twitterUrl: url({
|
|
35
|
+
* required: false,
|
|
36
|
+
* admin: { width: "half", placeholder: "https://twitter.com/username" }
|
|
37
|
+
* })
|
|
38
|
+
*
|
|
39
|
+
* // Pre-filled default URL
|
|
40
|
+
* homepageUrl: url({ defaultValue: "https://example.com" })
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @see {@link BaseFieldInput} for shared properties (`label`, `description`, `required`, `admin`, `index`, `searchIndex`)
|
|
44
|
+
*/
|
|
45
|
+
export interface UrlFieldInput<TFieldMeta extends {} = {}> extends BaseFieldInput<TFieldMeta> {
|
|
46
|
+
/**
|
|
47
|
+
* Pre-filled value shown in the admin form when creating a new document.
|
|
48
|
+
* Does not affect existing database values.
|
|
49
|
+
*/
|
|
50
|
+
defaultValue?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Resolved configuration for a `url()` field, after all defaults are applied.
|
|
54
|
+
*
|
|
55
|
+
* This is the type that framework adapters and field components receive —
|
|
56
|
+
* `fieldDef` in `InputComponentProps<UrlField>` and `CellComponentProps<UrlField>`
|
|
57
|
+
* is this type.
|
|
58
|
+
*
|
|
59
|
+
* @see {@link UrlFieldInput} for the user-facing input type
|
|
60
|
+
* @see {@link url} for the config function that produces this type
|
|
61
|
+
*/
|
|
62
|
+
export interface UrlField<TFieldMeta extends {} = {}> extends BaseField<TFieldMeta> {
|
|
63
|
+
readonly type: typeof ADMIN_FIELDS.url.type;
|
|
64
|
+
/**
|
|
65
|
+
* Pre-filled value shown in the admin form when creating a new document.
|
|
66
|
+
* `undefined` means no default is applied — the input starts empty.
|
|
67
|
+
*/
|
|
68
|
+
defaultValue?: string;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=types.d.ts.map
|