@@ -80,12 +80,12 @@ export interface CmsFieldBase {
80
80
comment ?: string ;
81
81
}
82
82
83
- export interface CmsFieldBoolean {
83
+ export interface CmsFieldBoolean extends CmsFieldBase {
84
84
widget : 'boolean' ;
85
85
default ?: boolean ;
86
86
}
87
87
88
- export interface CmsFieldCode {
88
+ export interface CmsFieldCode extends CmsFieldBase {
89
89
widget : 'code' ;
90
90
default ?: unknown ; // was any in public types
91
91
@@ -95,15 +95,15 @@ export interface CmsFieldCode {
95
95
output_code_only ?: boolean ;
96
96
}
97
97
98
- export interface CmsFieldColor {
98
+ export interface CmsFieldColor extends CmsFieldBase {
99
99
widget : 'color' ;
100
100
default ?: string ;
101
101
102
102
allowInput ?: boolean ;
103
103
enableAlpha ?: boolean ;
104
104
}
105
105
106
- export interface CmsFieldDateTime {
106
+ export interface CmsFieldDateTime extends CmsFieldBase {
107
107
widget : 'datetime' ;
108
108
default ?: string ;
109
109
@@ -126,7 +126,7 @@ export interface CmsFieldDateTime {
126
126
pickerUtc ?: boolean ;
127
127
}
128
128
129
- export interface CmsFieldFileOrImage {
129
+ export interface CmsFieldFileOrImage extends CmsFieldBase {
130
130
widget : 'file' | 'image' ;
131
131
default ?: string ;
132
132
@@ -136,7 +136,7 @@ export interface CmsFieldFileOrImage {
136
136
config ?: unknown ; // was any in public type
137
137
}
138
138
139
- export interface CmsFieldObject {
139
+ export interface CmsFieldObject extends CmsFieldBase {
140
140
widget : 'object' ;
141
141
default ?: unknown ; // was any in public
142
142
@@ -145,7 +145,7 @@ export interface CmsFieldObject {
145
145
fields : CmsField [ ] ;
146
146
}
147
147
148
- export interface CmsFieldList {
148
+ export interface CmsFieldList extends CmsFieldBase {
149
149
widget : 'list' ;
150
150
default ?: unknown ; // was any in public
151
151
@@ -162,15 +162,15 @@ export interface CmsFieldList {
162
162
types ?: ( CmsFieldBase & CmsFieldObject ) [ ] ;
163
163
}
164
164
165
- export interface CmsFieldMap {
165
+ export interface CmsFieldMap extends CmsFieldBase {
166
166
widget : 'map' ;
167
167
default ?: string ;
168
168
169
169
decimals ?: number ;
170
170
type ?: CmsMapWidgetType ;
171
171
}
172
172
173
- export interface CmsFieldMarkdown {
173
+ export interface CmsFieldMarkdown extends CmsFieldBase {
174
174
widget : 'markdown' ;
175
175
default ?: string ;
176
176
@@ -185,7 +185,7 @@ export interface CmsFieldMarkdown {
185
185
editorComponents ?: string [ ] ;
186
186
}
187
187
188
- export interface CmsFieldNumber {
188
+ export interface CmsFieldNumber extends CmsFieldBase {
189
189
widget : 'number' ;
190
190
default ?: string | number ;
191
191
@@ -201,7 +201,7 @@ export interface CmsFieldNumber {
201
201
valueType ?: 'int' | 'float' | string ;
202
202
}
203
203
204
- export interface CmsFieldSelect {
204
+ export interface CmsFieldSelect extends CmsFieldBase {
205
205
widget : 'select' ;
206
206
default ?: string | string [ ] ;
207
207
@@ -211,7 +211,7 @@ export interface CmsFieldSelect {
211
211
max ?: number ;
212
212
}
213
213
214
- export interface CmsFieldRelation {
214
+ export interface CmsFieldRelation extends CmsFieldBase {
215
215
widget : 'relation' ;
216
216
default ?: string | string [ ] ;
217
217
@@ -241,54 +241,93 @@ export interface CmsFieldRelation {
241
241
optionsLength ?: number ;
242
242
}
243
243
244
- export interface CmsFieldHidden {
244
+ export interface CmsFieldHidden extends CmsFieldBase {
245
245
widget : 'hidden' ;
246
246
default ?: unknown ; // was any in public type
247
247
}
248
248
249
- export interface CmsFieldStringOrText {
250
- // This is the default widget, so declaring its type is optional.
251
- widget ?: 'string' | 'text' ;
249
+ export interface CmsFieldStringBase extends CmsFieldBase {
252
250
default ?: string ;
253
251
visualEditing ?: boolean ;
254
252
}
255
253
256
- export interface CmsFieldMeta {
257
- name : string ;
258
- label : string ;
259
- widget : string ;
260
- required : boolean ;
254
+ export interface CmsFieldString extends CmsFieldStringBase {
255
+ widget : 'string' ;
256
+ }
257
+
258
+ export interface CmsFieldText extends CmsFieldStringBase {
259
+ widget : 'text' ;
260
+ }
261
+
262
+ /**
263
+ * Interface that can be augmented by custom widgets to add their own properties.
264
+ */
265
+ export interface CmsFields {
266
+ boolean : CmsFieldBoolean ;
267
+ code : CmsFieldCode ;
268
+ color : CmsFieldColor ;
269
+ datetime : CmsFieldDateTime ;
270
+ file : CmsFieldFileOrImage ;
271
+ image : CmsFieldFileOrImage ;
272
+ list : CmsFieldList ;
273
+ map : CmsFieldMap ;
274
+ markdown : CmsFieldMarkdown ;
275
+ number : CmsFieldNumber ;
276
+ object : CmsFieldObject ;
277
+ relation : CmsFieldRelation ;
278
+ select : CmsFieldSelect ;
279
+ hidden : CmsFieldHidden ;
280
+ string : CmsFieldString ;
281
+ text : CmsFieldText ;
282
+ }
283
+
284
+ type RegisteredCmsField = {
285
+ [ K in keyof CmsFields ] : { widget : K } & CmsFields [ K ] ;
286
+ } [ keyof CmsFields ] ;
287
+
288
+ /**
289
+ * Meta fields are defined outside of the fields[] array but added to it
290
+ * internally.
291
+ */
292
+ export type CmsFieldMeta < IsInternal extends boolean = false > = {
261
293
index_file : string ;
262
- meta : boolean ;
263
- }
264
-
265
- export type CmsFieldCore =
266
- | CmsFieldBoolean
267
- | CmsFieldCode
268
- | CmsFieldColor
269
- | CmsFieldDateTime
270
- | CmsFieldFileOrImage
271
- | CmsFieldList
272
- | CmsFieldMap
273
- | CmsFieldMarkdown
274
- | CmsFieldNumber
275
- | CmsFieldObject
276
- | CmsFieldRelation
277
- | CmsFieldSelect
278
- | CmsFieldHidden
279
- | CmsFieldStringOrText ;
280
-
281
- export type CmsFieldCustom = Record < string , any > & {
282
- widget : Exclude < string , CmsFieldCore [ 'widget' ] > ;
283
- } ;
284
-
285
- export type CmsField = CmsFieldBase & ( CmsFieldCore | CmsFieldMeta | CmsFieldCustom ) ;
286
-
287
- export interface CmsCollectionFile {
294
+ label ?: string ;
295
+ hint ?: string ;
296
+ comment ?: string ;
297
+ } & IsInternal extends true
298
+ ? {
299
+ widget : 'string' ;
300
+ name : 'path' ;
301
+ meta : true ;
302
+ required : true ;
303
+ }
304
+ : {
305
+ widget ?: 'string' ;
306
+ name ?: never ;
307
+ } ;
308
+
309
+ /**
310
+ * Fields without a widget prop are treated as string fields.
311
+ */
312
+ export type CmsFieldDefault < IsInternal extends boolean = true > = CmsFieldStringBase &
313
+ ( IsInternal extends true
314
+ ? {
315
+ widget : 'string' ;
316
+ }
317
+ : {
318
+ widget ?: never ;
319
+ } ) ;
320
+
321
+ export type CmsField < IsInternal extends boolean = true > =
322
+ | RegisteredCmsField
323
+ | CmsFieldDefault < IsInternal >
324
+ | CmsFieldMeta < IsInternal > ;
325
+
326
+ export interface CmsCollectionFile < IsInternal extends boolean = true > {
288
327
name : string ;
289
328
label : string ;
290
329
file : string ;
291
- fields : CmsField [ ] ;
330
+ fields : CmsField < IsInternal > [ ] ;
292
331
label_singular ?: string ;
293
332
description ?: string ;
294
333
preview_path ?: string ;
@@ -310,13 +349,13 @@ export type ViewGroup<IsInternal extends boolean = true> = {
310
349
pattern : string ;
311
350
} & ( IsInternal extends true ? { id : string } : { } ) ;
312
351
313
- export type CmsCollection < IsInternal extends boolean = false > = {
352
+ export type CmsCollection < IsInternal extends boolean = true > = {
314
353
name : string ;
315
354
label : string ;
316
355
label_singular ?: string ;
317
356
description ?: string ;
318
357
folder ?: string ;
319
- files ?: CmsCollectionFile [ ] ;
358
+ files ?: CmsCollectionFile < IsInternal > [ ] ;
320
359
identifier_field ?: string ;
321
360
summary ?: string ;
322
361
slug ?: string ;
@@ -333,7 +372,7 @@ export type CmsCollection<IsInternal extends boolean = false> = {
333
372
nested ?: {
334
373
depth : number ;
335
374
} ;
336
- meta ?: { path ?: { label : string ; widget : string ; index_file : string } } ;
375
+ meta ?: { path ?: CmsFieldMeta < IsInternal > } ;
337
376
338
377
/**
339
378
* It accepts the following values: yml, yaml, toml, json, md, markdown, html
@@ -344,7 +383,7 @@ export type CmsCollection<IsInternal extends boolean = false> = {
344
383
format ?: CmsCollectionFormatType ;
345
384
346
385
frontmatter_delimiter ?: string [ ] | string ;
347
- fields ?: CmsField [ ] ;
386
+ fields ?: CmsField < IsInternal > [ ] ;
348
387
filter ?: { field : string ; value : unknown } ; // value way any in public type!
349
388
path ?: string ;
350
389
media_folder ?: string ;
@@ -397,7 +436,7 @@ export interface CmsLocalBackend {
397
436
allowed_hosts ?: string [ ] ;
398
437
}
399
438
400
- export type CmsConfig < IsInternal extends boolean = false > = {
439
+ export type CmsConfig < IsInternal extends boolean = true > = {
401
440
backend : CmsBackend ;
402
441
collections : CmsCollection < IsInternal > [ ] ;
403
442
locale ?: string ;
@@ -699,7 +738,7 @@ export type Cursors = StaticallyTypedRecord<{}>;
699
738
700
739
export interface State {
701
740
auth : Auth ;
702
- config : CmsConfig < true > ;
741
+ config : CmsConfig ;
703
742
cursors : Cursors ;
704
743
collections : Collections ;
705
744
deploys : Deploys ;
0 commit comments