@tinacms/schema-tools 0.0.0-bf22bf8-20241004045704 → 0.0.0-c19d29e-20251224001156
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2488 -2413
- package/dist/schema/TinaSchema.d.ts +21 -1
- package/dist/schema/addNamespaceToSchema.d.ts +8 -4
- package/dist/schema/resolveForm.d.ts +1 -1
- package/dist/types/index.d.ts +160 -25
- package/dist/util/normalizePath.d.ts +8 -0
- package/dist/validate/fields.d.ts +0 -3
- package/dist/validate/schema.d.ts +180 -18
- package/dist/validate/tinaCloudSchemaConfig.d.ts +105 -0
- package/dist/validate/util.d.ts +3 -0
- package/package.json +10 -18
- package/dist/index.mjs +0 -2696
|
@@ -28,6 +28,7 @@ export declare class TinaSchema {
|
|
|
28
28
|
} & Schema);
|
|
29
29
|
getIsTitleFieldName: (collection: string) => string;
|
|
30
30
|
getCollectionsByName: (collectionNames: string[]) => Collection<true>[];
|
|
31
|
+
findReferencesFromCollection(name: string): Record<string, string[]>;
|
|
31
32
|
getCollection: (collectionName: string) => Collection<true>;
|
|
32
33
|
getCollections: () => Collection<true>[];
|
|
33
34
|
getCollectionByFullPath: (filepath: string) => Collection<true>;
|
|
@@ -59,7 +60,26 @@ export declare class TinaSchema {
|
|
|
59
60
|
*
|
|
60
61
|
*/
|
|
61
62
|
getTemplatesForCollectable: (collection: Collectable) => CollectionTemplateable;
|
|
62
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Walk all fields in tina schema
|
|
65
|
+
*
|
|
66
|
+
* @param cb callback function invoked for each field
|
|
67
|
+
*/
|
|
68
|
+
walkFields(cb: (args: {
|
|
69
|
+
field: any;
|
|
70
|
+
collection: any;
|
|
71
|
+
path: string;
|
|
72
|
+
isListItem?: boolean;
|
|
73
|
+
}) => void): void;
|
|
74
|
+
/**
|
|
75
|
+
* Walk all fields in Tina Schema
|
|
76
|
+
*
|
|
77
|
+
* This is a legacy version to preserve backwards compatibility for the tina generated schema. It does not
|
|
78
|
+
* traverse fields in object lists in rich-text templates.
|
|
79
|
+
*
|
|
80
|
+
* @param cb callback function invoked for each field
|
|
81
|
+
*/
|
|
82
|
+
legacyWalkFields: (cb: (args: {
|
|
63
83
|
field: TinaField;
|
|
64
84
|
collection: Collection;
|
|
65
85
|
path: string[];
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
type Node = {
|
|
2
|
+
name?: string;
|
|
3
|
+
value?: string;
|
|
4
|
+
namespace?: string[];
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
};
|
|
7
|
+
export declare function addNamespaceToSchema<T extends Node | string>(maybeNode: T, namespace?: string[]): T;
|
|
8
|
+
export {};
|
|
@@ -13,7 +13,7 @@ export declare const resolveForm: ({ collection, basename, template, schema, }:
|
|
|
13
13
|
fields: {
|
|
14
14
|
[key: string]: unknown;
|
|
15
15
|
name: string;
|
|
16
|
-
component: NonNullable<import("
|
|
16
|
+
component: NonNullable<import("..").TinaField<true>["ui"]>["component"];
|
|
17
17
|
type: string;
|
|
18
18
|
}[];
|
|
19
19
|
};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
import type { FC } from 'react';
|
|
2
2
|
import type React from 'react';
|
|
3
|
+
export declare const CONTENT_FORMATS: readonly ["mdx", "md", "markdown", "json", "yaml", "yml", "toml"];
|
|
4
|
+
export type ContentFormat = (typeof CONTENT_FORMATS)[number];
|
|
5
|
+
export type ContentFrontmatterFormat = 'yaml' | 'toml' | 'json';
|
|
6
|
+
export type Parser = {
|
|
7
|
+
type: 'mdx';
|
|
8
|
+
} | {
|
|
9
|
+
type: 'markdown';
|
|
10
|
+
/**
|
|
11
|
+
* Tina will escape entities like `<` and `[` by default. You can choose to turn
|
|
12
|
+
* off all escaping, or specify HTML, so `<div>` will not be turned into `\<div>`
|
|
13
|
+
*/
|
|
14
|
+
skipEscaping?: 'all' | 'html' | 'none';
|
|
15
|
+
} | {
|
|
16
|
+
/**
|
|
17
|
+
* Experimental: Returns the native Slate.js document as JSON. Ideal to retain the pure editor content structure.
|
|
18
|
+
*/
|
|
19
|
+
type: 'slatejson';
|
|
20
|
+
};
|
|
3
21
|
type Meta = {
|
|
4
22
|
active?: boolean;
|
|
5
23
|
dirty?: boolean;
|
|
@@ -107,10 +125,35 @@ export type UIField<Type, List extends boolean> = {
|
|
|
107
125
|
* @deprecated use `defaultItem` at the collection level instead
|
|
108
126
|
*/
|
|
109
127
|
defaultValue?: List extends true ? Type[] : Type;
|
|
128
|
+
/**
|
|
129
|
+
* The color format for the color picker component.
|
|
130
|
+
* Can be 'hex' or 'rgb'.
|
|
131
|
+
*/
|
|
132
|
+
colorFormat?: 'hex' | 'rgb';
|
|
133
|
+
/**
|
|
134
|
+
* The widget style for the color picker component.
|
|
135
|
+
* Can be 'sketch' or 'block'.
|
|
136
|
+
*/
|
|
137
|
+
widget?: 'sketch' | 'block';
|
|
138
|
+
/**
|
|
139
|
+
* The width of the color picker component.
|
|
140
|
+
* Accepts CSS width values (e.g., '350px').
|
|
141
|
+
*/
|
|
142
|
+
width?: string;
|
|
143
|
+
/**
|
|
144
|
+
* Preset colors for the color picker component.
|
|
145
|
+
* An array of color strings (e.g., ['#D0021B', '#F5A623']).
|
|
146
|
+
*/
|
|
147
|
+
colors?: string[];
|
|
110
148
|
};
|
|
111
149
|
type FieldGeneric<Type, List extends boolean | undefined, ExtraFieldUIProps = {}> = List extends true ? {
|
|
112
150
|
list: true;
|
|
113
151
|
ui?: UIField<Type, true> & ExtraFieldUIProps;
|
|
152
|
+
/**
|
|
153
|
+
* Defines where new items will be added in the list.
|
|
154
|
+
* If not specified, defaults to `append`.
|
|
155
|
+
*/
|
|
156
|
+
addItemBehavior?: 'append' | 'prepend';
|
|
114
157
|
} : List extends false ? {
|
|
115
158
|
list?: false;
|
|
116
159
|
ui?: UIField<Type, false> & ExtraFieldUIProps;
|
|
@@ -150,14 +193,24 @@ type DateFormatProps = {
|
|
|
150
193
|
* dateFormat: 'YYYY MM DD'
|
|
151
194
|
* ```
|
|
152
195
|
*/
|
|
153
|
-
dateFormat?: string;
|
|
154
|
-
timeFormat?: string;
|
|
196
|
+
dateFormat?: string | boolean;
|
|
197
|
+
timeFormat?: string | boolean;
|
|
155
198
|
};
|
|
156
199
|
export type DateTimeField = (FieldGeneric<string, undefined, DateFormatProps> | FieldGeneric<string, true, DateFormatProps> | FieldGeneric<string, false, DateFormatProps>) & BaseField & {
|
|
157
200
|
type: 'datetime';
|
|
158
201
|
};
|
|
159
202
|
export type ImageField = (FieldGeneric<string, undefined> | FieldGeneric<string, true> | FieldGeneric<string, false>) & BaseField & {
|
|
160
203
|
type: 'image';
|
|
204
|
+
/**
|
|
205
|
+
* A function that returns the upload directory path based on the form values.
|
|
206
|
+
* This is used to organize uploaded images into specific folders.
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```ts
|
|
210
|
+
* uploadDir: (formValues) => `uploads/${formValues.category}`
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
213
|
+
uploadDir?: (formValues: Record<string, any>) => string;
|
|
161
214
|
};
|
|
162
215
|
type ReferenceFieldOptions = {
|
|
163
216
|
optionComponent?: OptionComponent;
|
|
@@ -185,7 +238,7 @@ export type ReferenceField = (FieldGeneric<string, undefined, ReferenceFieldOpti
|
|
|
185
238
|
export type PasswordField = (FieldGeneric<string, undefined> | FieldGeneric<string, false>) & BaseField & {
|
|
186
239
|
type: 'password';
|
|
187
240
|
};
|
|
188
|
-
type
|
|
241
|
+
type ToolbarOverrideType = 'heading' | 'link' | 'image' | 'quote' | 'ul' | 'ol' | 'code' | 'codeBlock' | 'bold' | 'italic' | 'raw' | 'embed' | 'mermaid' | 'table';
|
|
189
242
|
type RichTextAst = {
|
|
190
243
|
type: 'root';
|
|
191
244
|
children: Record<string, unknown>[];
|
|
@@ -198,24 +251,21 @@ export type RichTextField<WithNamespace extends boolean = false> = (FieldGeneric
|
|
|
198
251
|
* will be stored as frontmatter
|
|
199
252
|
*/
|
|
200
253
|
isBody?: boolean;
|
|
201
|
-
|
|
254
|
+
/**@deprecated use overrides.toolbar */
|
|
255
|
+
toolbarOverride?: ToolbarOverrideType[];
|
|
202
256
|
templates?: RichTextTemplate<WithNamespace>[];
|
|
257
|
+
overrides?: {
|
|
258
|
+
toolbar?: ToolbarOverrideType[];
|
|
259
|
+
/**Default set to true */
|
|
260
|
+
showFloatingToolbar?: boolean;
|
|
261
|
+
};
|
|
203
262
|
/**
|
|
204
263
|
* By default, Tina parses markdown with MDX, this is a more strict parser
|
|
205
264
|
* that allows you to use structured content inside markdown (via `templates`).
|
|
206
265
|
*
|
|
207
266
|
* Specify `"markdown"` if you're having problems with Tina parsing your content.
|
|
208
267
|
*/
|
|
209
|
-
parser?:
|
|
210
|
-
type: 'markdown';
|
|
211
|
-
/**
|
|
212
|
-
* Tina will escape entities like `<` and `[` by default. You can choose to turn
|
|
213
|
-
* off all escaping, or specify HTML, so `<div>` will not be turned into `\<div>`
|
|
214
|
-
*/
|
|
215
|
-
skipEscaping?: 'all' | 'html' | 'none';
|
|
216
|
-
} | {
|
|
217
|
-
type: 'mdx';
|
|
218
|
-
};
|
|
268
|
+
parser?: Parser;
|
|
219
269
|
};
|
|
220
270
|
export type RichTextTemplate<WithNamespace extends boolean = false> = Template<WithNamespace> & {
|
|
221
271
|
inline?: boolean;
|
|
@@ -371,7 +421,7 @@ export interface Config<CMSCallback = undefined, FormifyCallback = undefined, Do
|
|
|
371
421
|
/**
|
|
372
422
|
* The Schema is used to define the shape of the content.
|
|
373
423
|
*
|
|
374
|
-
* https://tina.io/docs/
|
|
424
|
+
* https://tina.io/docs/r/the-config-file/
|
|
375
425
|
*/
|
|
376
426
|
schema: Schema;
|
|
377
427
|
/**
|
|
@@ -394,7 +444,7 @@ export interface Config<CMSCallback = undefined, FormifyCallback = undefined, Do
|
|
|
394
444
|
token?: string | null;
|
|
395
445
|
ui?: {
|
|
396
446
|
/**
|
|
397
|
-
* When using
|
|
447
|
+
* When using TinaCloud's branching feature, provide the URL for your given branch
|
|
398
448
|
*
|
|
399
449
|
* Eg. If you're deplying to Vercel, and your repo name is 'my-app',
|
|
400
450
|
* Vercel's preview URL would be based on the branch:
|
|
@@ -408,11 +458,27 @@ export interface Config<CMSCallback = undefined, FormifyCallback = undefined, Do
|
|
|
408
458
|
* ```
|
|
409
459
|
* [more info](https://vercel.com/docs/concepts/deployments/generated-urls#url-with-git-branch)
|
|
410
460
|
*/
|
|
411
|
-
previewUrl
|
|
461
|
+
previewUrl?: (context: {
|
|
412
462
|
branch: string;
|
|
413
463
|
}) => {
|
|
414
464
|
url: string;
|
|
415
465
|
};
|
|
466
|
+
/**
|
|
467
|
+
* Opt out of update checks - this will prevent the CMS for checking for new versions
|
|
468
|
+
* If true, the CMS will not check for updates.
|
|
469
|
+
* Defaults to false if not specified.
|
|
470
|
+
*/
|
|
471
|
+
optOutOfUpdateCheck?: boolean;
|
|
472
|
+
/**
|
|
473
|
+
* Regular expression pattern that folder names must match when creating new folders.
|
|
474
|
+
* Only applies to newly created folders, not existing ones.
|
|
475
|
+
*
|
|
476
|
+
* @example "^[a-z0-9-]+$" - allows lowercase letters, numbers, and hyphens only
|
|
477
|
+
* @example "^[A-Za-z0-9_-]+$" - allows letters, numbers, underscores, and hyphens
|
|
478
|
+
*/
|
|
479
|
+
regexValidation?: {
|
|
480
|
+
folderNameRegex?: string;
|
|
481
|
+
};
|
|
416
482
|
};
|
|
417
483
|
/**
|
|
418
484
|
* Configurations for the autogenerated GraphQL HTTP client
|
|
@@ -492,7 +558,7 @@ export interface Config<CMSCallback = undefined, FormifyCallback = undefined, Do
|
|
|
492
558
|
} | {
|
|
493
559
|
/**
|
|
494
560
|
* Use Git-backed assets for media, these values will
|
|
495
|
-
* [Learn more](https://tina.io/docs/
|
|
561
|
+
* [Learn more](https://tina.io/docs/r/repo-based-media/)
|
|
496
562
|
*/
|
|
497
563
|
tina: {
|
|
498
564
|
/**
|
|
@@ -512,6 +578,54 @@ export interface Config<CMSCallback = undefined, FormifyCallback = undefined, Do
|
|
|
512
578
|
loadCustomStore?: never;
|
|
513
579
|
accept?: string | string[];
|
|
514
580
|
};
|
|
581
|
+
/**
|
|
582
|
+
* Configuration for repository-related UI features.
|
|
583
|
+
*
|
|
584
|
+
* This allows you to configure how the CMS displays repository information
|
|
585
|
+
* and generates links to view file history in your Git provider (e.g., GitHub, GitLab).
|
|
586
|
+
*
|
|
587
|
+
* @example
|
|
588
|
+
*
|
|
589
|
+
* repoProvider: {
|
|
590
|
+
* defaultBranchName: 'main',
|
|
591
|
+
* historyUrl: ({ relativePath, branch }) => ({
|
|
592
|
+
* url: `https://github.com/owner/repo/commits/${branch}/${relativePath}`
|
|
593
|
+
* })
|
|
594
|
+
* }
|
|
595
|
+
* */
|
|
596
|
+
repoProvider?: {
|
|
597
|
+
/**
|
|
598
|
+
* The default branch name to use when in local mode or when no branch is specified.
|
|
599
|
+
* When not in local mode, TinaCMS will use the branch selected in the editor.
|
|
600
|
+
*
|
|
601
|
+
* This is typically your main/master branch name (e.g., "main", "master").
|
|
602
|
+
*/
|
|
603
|
+
defaultBranchName?: string;
|
|
604
|
+
/**
|
|
605
|
+
* A function that generates a URL to view the commit history for a specific file.
|
|
606
|
+
*
|
|
607
|
+
* This URL is used to link to your Git provider's history view (e.g., GitHub's commits page).
|
|
608
|
+
* The function receives the file's relative path and current branch, and should return
|
|
609
|
+
* a URL object with the full URL to the history page.
|
|
610
|
+
*
|
|
611
|
+
* @param context - Context object containing file and branch information
|
|
612
|
+
* @param context.relativePath - The relative path of the file from the repository root
|
|
613
|
+
* @param context.branch - The current branch name
|
|
614
|
+
* @returns An object with a `url` property containing the full URL to the history page
|
|
615
|
+
*
|
|
616
|
+
* @example
|
|
617
|
+
*s
|
|
618
|
+
* historyUrl: ({ relativePath, branch }) => ({
|
|
619
|
+
* url: `https://github.com/tinacms/tinacms/commits/${branch}/examples/next-2024/${relativePath}`
|
|
620
|
+
* })
|
|
621
|
+
* */
|
|
622
|
+
historyUrl?: (context: {
|
|
623
|
+
relativePath: string;
|
|
624
|
+
branch: string;
|
|
625
|
+
}) => {
|
|
626
|
+
url: string;
|
|
627
|
+
};
|
|
628
|
+
};
|
|
515
629
|
search?: ({
|
|
516
630
|
/**
|
|
517
631
|
* An instance of a search client like Algolia
|
|
@@ -521,7 +635,7 @@ export interface Config<CMSCallback = undefined, FormifyCallback = undefined, Do
|
|
|
521
635
|
} | {
|
|
522
636
|
searchClient?: never;
|
|
523
637
|
/**
|
|
524
|
-
* Use the
|
|
638
|
+
* Use the TinaCloud search index
|
|
525
639
|
*/
|
|
526
640
|
tina: {
|
|
527
641
|
/**
|
|
@@ -536,6 +650,25 @@ export interface Config<CMSCallback = undefined, FormifyCallback = undefined, Do
|
|
|
536
650
|
* regex used for splitting tokens (default: /[\p{L}\d_]+/)
|
|
537
651
|
*/
|
|
538
652
|
tokenSplitRegex?: string;
|
|
653
|
+
/**
|
|
654
|
+
* Enable fuzzy search by default (default: true)
|
|
655
|
+
*/
|
|
656
|
+
fuzzyEnabled?: boolean;
|
|
657
|
+
/**
|
|
658
|
+
* Fuzzy search options
|
|
659
|
+
*/
|
|
660
|
+
fuzzyOptions?: {
|
|
661
|
+
/** Maximum edit distance for fuzzy matching (default: 2) */
|
|
662
|
+
maxDistance?: number;
|
|
663
|
+
/** Minimum similarity score 0-1 for matches (default: 0.6) */
|
|
664
|
+
minSimilarity?: number;
|
|
665
|
+
/** Maximum number of fuzzy matches to return per term (default: 10) */
|
|
666
|
+
maxResults?: number;
|
|
667
|
+
/** Use Damerau-Levenshtein (allows transpositions) (default: true) */
|
|
668
|
+
useTranspositions?: boolean;
|
|
669
|
+
/** Case sensitive matching (default: false) */
|
|
670
|
+
caseSensitive?: boolean;
|
|
671
|
+
};
|
|
539
672
|
};
|
|
540
673
|
}) & {
|
|
541
674
|
/**
|
|
@@ -548,7 +681,7 @@ export interface Config<CMSCallback = undefined, FormifyCallback = undefined, Do
|
|
|
548
681
|
maxSearchIndexFieldLength?: number;
|
|
549
682
|
};
|
|
550
683
|
/**
|
|
551
|
-
* Used to override the default
|
|
684
|
+
* Used to override the default TinaCloud API URL
|
|
552
685
|
*
|
|
553
686
|
* [mostly for internal use only]
|
|
554
687
|
*/
|
|
@@ -567,7 +700,7 @@ export interface Schema<WithNamespace extends boolean = false> {
|
|
|
567
700
|
/**
|
|
568
701
|
* Collections represent a type of content (EX, blog post, page, author, etc). We recommend using singular naming in a collection (Ex: use post and not posts).
|
|
569
702
|
*
|
|
570
|
-
* https://tina.io/docs/
|
|
703
|
+
* https://tina.io/docs/r/content-modelling-collections/
|
|
571
704
|
*/
|
|
572
705
|
collections: Collection<WithNamespace>[];
|
|
573
706
|
/**
|
|
@@ -581,7 +714,7 @@ interface BaseCollection {
|
|
|
581
714
|
name: string;
|
|
582
715
|
path: string;
|
|
583
716
|
indexes?: IndexType[];
|
|
584
|
-
format?:
|
|
717
|
+
format?: ContentFormat;
|
|
585
718
|
ui?: UICollection;
|
|
586
719
|
/**
|
|
587
720
|
* @deprecated - use `ui.defaultItem` on the each `template` instead
|
|
@@ -590,7 +723,7 @@ interface BaseCollection {
|
|
|
590
723
|
/**
|
|
591
724
|
* This format will be used to parse the markdown frontmatter
|
|
592
725
|
*/
|
|
593
|
-
frontmatterFormat?:
|
|
726
|
+
frontmatterFormat?: ContentFrontmatterFormat;
|
|
594
727
|
/**
|
|
595
728
|
* The delimiters used to parse the frontmatter.
|
|
596
729
|
*/
|
|
@@ -606,7 +739,7 @@ type TemplateCollection<WithNamespace extends boolean = false> = {
|
|
|
606
739
|
/**
|
|
607
740
|
* In most cases, just using fields is enough, however templates can be used when there are multiple variants of the same collection or object. For example in a "page" collection there might be a need for a marketing page template and a content page template, both under the collection "page".
|
|
608
741
|
*
|
|
609
|
-
* https://tina.io/docs/
|
|
742
|
+
* https://tina.io/docs/r/content-modelling-templates/
|
|
610
743
|
*/
|
|
611
744
|
templates: Template<WithNamespace>[];
|
|
612
745
|
fields?: undefined;
|
|
@@ -615,7 +748,7 @@ type FieldCollection<WithNamespace extends boolean = false> = {
|
|
|
615
748
|
/**
|
|
616
749
|
* Fields define the shape of the content and the user input.
|
|
617
750
|
*
|
|
618
|
-
* https://tina.io/docs/
|
|
751
|
+
* https://tina.io/docs/r/string-fields/
|
|
619
752
|
*/
|
|
620
753
|
fields: TinaField<WithNamespace>[];
|
|
621
754
|
templates?: undefined;
|
|
@@ -630,6 +763,7 @@ type Document = {
|
|
|
630
763
|
relativePath: string;
|
|
631
764
|
filename: string;
|
|
632
765
|
extension: string;
|
|
766
|
+
hasReferences?: boolean;
|
|
633
767
|
};
|
|
634
768
|
};
|
|
635
769
|
export interface UICollection<Form = any, CMS = any, TinaForm = any> {
|
|
@@ -671,6 +805,7 @@ export interface UICollection<Form = any, CMS = any, TinaForm = any> {
|
|
|
671
805
|
allowedActions?: {
|
|
672
806
|
create?: boolean;
|
|
673
807
|
delete?: boolean;
|
|
808
|
+
createFolder?: boolean;
|
|
674
809
|
createNestedFolder?: boolean;
|
|
675
810
|
};
|
|
676
811
|
/**
|
|
@@ -1 +1,9 @@
|
|
|
1
1
|
export declare const normalizePath: (filepath: string) => string;
|
|
2
|
+
/**
|
|
3
|
+
* Returns the given path such that:
|
|
4
|
+
* - The path separator is converted from '\' to '/' if necessary.
|
|
5
|
+
* - Duplicate '/' are removed
|
|
6
|
+
* - Leading and trailing '/' are cleared
|
|
7
|
+
* @param filepath Filepath to convert to its canonical form
|
|
8
|
+
*/
|
|
9
|
+
export declare const canonicalPath: (filepath: string) => string;
|