@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.
@@ -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
- walkFields: (cb: (args: {
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
- export declare function addNamespaceToSchema<T extends object | string>(maybeNode: T, namespace?: string[]): T;
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("../types/index").TinaField<true>["ui"]>["component"];
16
+ component: NonNullable<import("..").TinaField<true>["ui"]>["component"];
17
17
  type: string;
18
18
  }[];
19
19
  };
@@ -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 toolbarItemName = 'heading' | 'link' | 'image' | 'quote' | 'ul' | 'ol' | 'code' | 'codeBlock' | 'bold' | 'italic' | 'raw' | 'embed';
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
- toolbarOverride?: toolbarItemName[];
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/reference/schema/
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 Tina Cloud's branching feature, provide the URL for your given branch
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: (context: {
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/reference/media/repo-based/)
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 Tina Cloud search index
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 Tina Cloud API URL
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/reference/collections/
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?: 'json' | 'md' | 'markdown' | 'mdx' | 'yaml' | 'yml' | 'toml';
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?: 'yaml' | 'toml' | 'json';
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/reference/templates/
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/reference/fields/
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;
@@ -1,6 +1,3 @@
1
- /**
2
-
3
- */
4
1
  import { z } from 'zod';
5
2
  import type { TinaField as TinaFieldType } from '../types/index';
6
3
  export declare const TinaFieldZod: z.ZodType<TinaFieldType>;