tinacms 0.0.0-e0ddb8c-20241004065742 → 0.0.0-e1b6d05-20251114052813

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.
Files changed (178) hide show
  1. package/README.md +1 -1
  2. package/dist/admin/api.d.ts +4 -0
  3. package/dist/admin/components/GetCollection.d.ts +2 -2
  4. package/dist/admin/components/Page.d.ts +3 -9
  5. package/dist/admin/components/Sidebar.d.ts +0 -3
  6. package/dist/admin/components/ui/tooltip.d.ts +7 -0
  7. package/dist/admin/pages/CollectionCreatePage.d.ts +1 -1
  8. package/dist/admin/pages/CollectionListPage.d.ts +2 -2
  9. package/dist/admin/pages/DashboardPage.d.ts +0 -3
  10. package/dist/admin/pages/ScreenPage.d.ts +0 -3
  11. package/dist/admin/types.d.ts +3 -0
  12. package/dist/auth/AuthModal.d.ts +1 -4
  13. package/dist/auth/TinaCloudProvider.d.ts +1 -2
  14. package/dist/cache/node-cache.d.ts +1 -0
  15. package/dist/client.js +100 -62
  16. package/dist/client.mjs +59 -36
  17. package/dist/hooks/create-page-plugin.d.ts +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js +104151 -14618
  20. package/dist/index.mjs +104717 -15181
  21. package/dist/internalClient/index.d.ts +28 -3
  22. package/dist/node-cache-5e8db9f0.mjs +63 -0
  23. package/dist/react.d.ts +14 -6
  24. package/dist/react.js +73 -53
  25. package/dist/react.mjs +73 -53
  26. package/dist/rich-text/index.d.ts +6 -0
  27. package/dist/rich-text/index.js +60 -16
  28. package/dist/rich-text/index.mjs +60 -16
  29. package/dist/rich-text/prism.js +1 -1
  30. package/dist/rich-text/prism.mjs +1 -1
  31. package/dist/rich-text/static.d.ts +154 -0
  32. package/dist/rich-text/static.js +246 -0
  33. package/dist/rich-text/static.mjs +243 -0
  34. package/dist/tina-cms.d.ts +1 -1
  35. package/dist/toolkit/components/ProgressBar.d.ts +11 -0
  36. package/dist/toolkit/components/media/media-item.d.ts +11 -1
  37. package/dist/toolkit/components/media/media-manager.d.ts +1 -1
  38. package/dist/toolkit/components/ui/breadcrumb.d.ts +11 -0
  39. package/dist/toolkit/components/ui/dropdown-menu.d.ts +25 -0
  40. package/dist/toolkit/fields/components/password-field.d.ts +1 -1
  41. package/dist/toolkit/fields/components/reference/components/button.d.ts +2 -2
  42. package/dist/toolkit/fields/components/reference/components/command.d.ts +21 -33
  43. package/dist/toolkit/fields/components/reference/components/popover.d.ts +1 -1
  44. package/dist/toolkit/fields/components/reference/model/reference-link-props.d.ts +2 -0
  45. package/dist/toolkit/fields/components/reference/reference-select.d.ts +2 -2
  46. package/dist/toolkit/fields/components/select.d.ts +2 -2
  47. package/dist/toolkit/fields/components/text-field.d.ts +1 -1
  48. package/dist/toolkit/fields/plugins/group-field-plugin.d.ts +1 -1
  49. package/dist/toolkit/fields/plugins/group-list-field-plugin.d.ts +1 -0
  50. package/dist/toolkit/fields/plugins/list-field-meta.d.ts +1 -1
  51. package/dist/toolkit/fields/plugins/list-field-plugin.d.ts +1 -0
  52. package/dist/toolkit/fields/plugins/mdx-field-plugin/index.d.ts +5 -2
  53. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/editor.d.ts +20 -18
  54. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/fixed-toolbar-buttons.d.ts +0 -4
  55. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/blockquote-element.d.ts +14 -10
  56. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/button.d.ts +5 -5
  57. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block/code-block-element.d.ts +17 -0
  58. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block/error-message.d.ts +6 -0
  59. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-combobox.d.ts +6 -0
  60. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-toolbar-button.d.ts +6 -6
  61. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-leaf.d.ts +2 -11
  62. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-line-element.d.ts +14 -10
  63. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-syntax-leaf.d.ts +2 -11
  64. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/command.d.ts +112 -0
  65. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/dialog.d.ts +12 -0
  66. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/dropdown-menu.d.ts +10 -10
  67. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/floating-toolbar.d.ts +2 -2
  68. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/hr-element.d.ts +3 -0
  69. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/hr-toolbar-button.d.ts +18 -0
  70. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/icons.d.ts +2 -1
  71. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/image-toolbar-button.d.ts +6 -6
  72. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/indent-list-toolbar-button.d.ts +6 -7
  73. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/inline-combobox.d.ts +1 -1
  74. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/input.d.ts +3 -3
  75. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-element.d.ts +4 -11
  76. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-floating-toolbar.d.ts +4 -5
  77. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/link-toolbar-button.d.ts +4 -4
  78. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/list-element.d.ts +28 -11
  79. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mark-toolbar-button.d.ts +4 -18
  80. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-element.d.ts +3 -10
  81. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-toolbar-button.d.ts +6 -8
  82. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/paragraph-element.d.ts +15 -0
  83. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/popover.d.ts +7 -2
  84. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/quote-toolbar-button.d.ts +6 -6
  85. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/raw-markdown-toolbar-button.d.ts +6 -6
  86. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/resizable.d.ts +42 -0
  87. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/separator.d.ts +2 -2
  88. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/slash-input-element.d.ts +15 -11
  89. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/block-selection.d.ts +6 -0
  90. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-cell-element.d.ts +33 -0
  91. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-dropdown-menu.d.ts +4 -0
  92. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-element.d.ts +20 -0
  93. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-row-element.d.ts +15 -0
  94. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/toolbar.d.ts +7 -7
  95. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/use-floating-toolbar-hook.d.ts +10 -0
  96. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/use-floating-toolbar-state.d.ts +22 -0
  97. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/hooks/use-create-editor.d.ts +6 -0
  98. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/index.d.ts +1 -1
  99. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-block.d.ts +1 -1
  100. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-lists.d.ts +1 -1
  101. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-marks.d.ts +1 -1
  102. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/autoformat/autoformat-utils.d.ts +3 -5
  103. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/common.d.ts +12 -6
  104. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/formatting.d.ts +18 -2
  105. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/index.d.ts +0 -1
  106. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-html-block/index.d.ts +6 -0
  107. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-img-plugin/index.d.ts +2 -2
  108. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-invalid-markdown-plugin/index.d.ts +5 -5
  109. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-mdx-plugins/component.d.ts +7 -4
  110. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-mdx-plugins/index.d.ts +3 -5
  111. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/editor-plugins.d.ts +520 -0
  112. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/components.d.ts +264 -166
  113. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/floating-toolbar-plugin.d.ts +1 -0
  114. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-overrides.d.ts +11 -3
  115. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-provider.d.ts +2 -2
  116. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/transforms/is-url.d.ts +1 -2
  117. package/dist/toolkit/fields/plugins/wrap-field-with-meta.d.ts +8 -0
  118. package/dist/toolkit/form-builder/create-branch-modal.d.ts +13 -0
  119. package/dist/toolkit/form-builder/editorial-workflow-constants.d.ts +17 -0
  120. package/dist/toolkit/form-builder/fields-builder.d.ts +1 -1
  121. package/dist/toolkit/form-builder/form-builder.d.ts +8 -9
  122. package/dist/toolkit/form-builder/index.d.ts +1 -0
  123. package/dist/toolkit/forms/field.d.ts +3 -0
  124. package/dist/toolkit/forms/form.d.ts +22 -3
  125. package/dist/toolkit/git-client/git-client.d.ts +25 -2
  126. package/dist/toolkit/git-client/git-file.d.ts +18 -0
  127. package/dist/toolkit/git-client/git-media-store.d.ts +13 -0
  128. package/dist/toolkit/git-client/use-git-file.d.ts +4 -0
  129. package/dist/toolkit/icons/Tina.d.ts +0 -5
  130. package/dist/toolkit/icons/TinaExtended.d.ts +4 -0
  131. package/dist/toolkit/icons/index.d.ts +1 -0
  132. package/dist/toolkit/index.d.ts +1 -1
  133. package/dist/toolkit/plugin-branch-switcher/branch-button.d.ts +4 -1
  134. package/dist/toolkit/plugin-branch-switcher/branch-switcher-legacy.d.ts +1 -1
  135. package/dist/toolkit/plugin-branch-switcher/branch-switcher.d.ts +1 -1
  136. package/dist/toolkit/plugin-branch-switcher/index.d.ts +0 -1
  137. package/dist/toolkit/react-cloud-config/cloud-config-plugin.d.ts +3 -3
  138. package/dist/toolkit/react-modals/modal/modal-actions.d.ts +2 -1
  139. package/dist/toolkit/react-modals/modal/modal-header.d.ts +1 -1
  140. package/dist/toolkit/react-sidebar/components/VersionInfo.d.ts +2 -0
  141. package/dist/toolkit/react-sidebar/components/badge.d.ts +5 -0
  142. package/dist/toolkit/react-sidebar/components/callout.d.ts +5 -0
  143. package/dist/toolkit/react-sidebar/components/form-list.d.ts +1 -1
  144. package/dist/toolkit/react-sidebar/components/local-warning.d.ts +3 -1
  145. package/dist/toolkit/react-sidebar/components/nav.d.ts +6 -3
  146. package/dist/toolkit/react-sidebar/components/resize-handle.d.ts +0 -5
  147. package/dist/toolkit/react-sidebar/components/sidebar-body.d.ts +7 -10
  148. package/dist/toolkit/react-sidebar/components/sidebar-loading-placeholder.d.ts +2 -0
  149. package/dist/toolkit/react-sidebar/components/sidebar-no-forms-placeholder.d.ts +2 -0
  150. package/dist/toolkit/react-sidebar/components/sidebar.d.ts +0 -7
  151. package/dist/toolkit/react-sidebar/components/sync-status.d.ts +5 -8
  152. package/dist/toolkit/react-sidebar/index.d.ts +1 -1
  153. package/dist/toolkit/react-sidebar/sidebar.d.ts +2 -2
  154. package/dist/toolkit/styles/button.d.ts +2 -2
  155. package/dist/toolkit/styles/dropdown-button.d.ts +75 -0
  156. package/dist/toolkit/styles/index.d.ts +1 -0
  157. package/dist/toolkit/tina-cms.d.ts +3 -3
  158. package/dist/toolkit/tina-state.d.ts +15 -0
  159. package/dist/unifiedClient/index.d.ts +8 -1
  160. package/dist/utils/cn.d.ts +2 -0
  161. package/package.json +75 -61
  162. package/dist/__vite-browser-external-d06ac358.mjs +0 -4
  163. package/dist/admin/pages/IndexingPage.d.ts +0 -2
  164. package/dist/node-cache-7fa2452c.mjs +0 -43
  165. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block-element.d.ts +0 -11
  166. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/hooks/use-mermaid-element.d.ts +0 -3
  167. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/with-correct-void-behavior.d.ts +0 -8
  168. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-code-block/index.d.ts +0 -3
  169. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/create-link-plugin/index.d.ts +0 -15
  170. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/custom/mermaid-plugin.d.ts +0 -2
  171. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/create-soft-break-plugin.d.ts +0 -7
  172. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/index.d.ts +0 -6
  173. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/on-key-down-soft-break.d.ts +0 -5
  174. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/soft-break/types.d.ts +0 -11
  175. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/code-block/index.d.ts +0 -11
  176. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/transforms/insert-empty-block.d.ts +0 -2
  177. package/dist/toolkit/plugin-branch-switcher/branch-banner.d.ts +0 -2
  178. package/dist/toolkit/react-sidebar/components/no-forms-placeholder.d.ts +0 -8
@@ -1,10 +1,10 @@
1
- import { TokenObject } from '../auth/authenticate';
2
1
  import { BranchData, EventBus } from '@tinacms/toolkit';
3
2
  import { DocumentNode, GraphQLSchema } from 'graphql';
3
+ import { TokenObject } from '../auth/authenticate';
4
+ import { AuthProvider, Schema, TinaSchema } from '@tinacms/schema-tools';
5
+ import { SearchClient } from '@tinacms/search/dist/index-client';
4
6
  import gql from 'graphql-tag';
5
- import { TinaSchema, Schema, AuthProvider } from '@tinacms/schema-tools';
6
7
  import { TinaCloudProject } from './types';
7
- import { SearchClient } from '@tinacms/search/dist/index-client';
8
8
  export * from './authProvider';
9
9
  export type OnLoginFunc = (args: {
10
10
  token?: TokenObject;
@@ -141,6 +141,26 @@ export declare class Client {
141
141
  }[]>;
142
142
  usingProtectedBranch(): boolean;
143
143
  createBranch({ baseBranch, branchName }: BranchData): Promise<string>;
144
+ getLatestVersion(): Promise<LatestVersionResponse>;
145
+ /**
146
+ * Initiate and poll for the results of an editorial workflow operation
147
+ *
148
+ * @param options Editorial workflow options
149
+ * @returns Object with branch and PR info when complete
150
+ */
151
+ executeEditorialWorkflow(options: {
152
+ branchName: string;
153
+ baseBranch: string;
154
+ prTitle?: string;
155
+ graphQLContentOp?: {
156
+ query: string;
157
+ variables: Record<string, unknown>;
158
+ };
159
+ onStatusUpdate?: (status: {
160
+ status: string;
161
+ message?: string;
162
+ }) => void;
163
+ }): Promise<any>;
144
164
  }
145
165
  export declare const DEFAULT_LOCAL_TINA_GQL_SERVER_URL = "http://localhost:4001/graphql";
146
166
  export declare class LocalClient extends Client {
@@ -185,3 +205,8 @@ export declare class LocalSearchClient implements SearchClient {
185
205
  put(docs: any[]): Promise<any>;
186
206
  supportsClientSideIndexing(): boolean;
187
207
  }
208
+ export type PackageVersionInfo = {
209
+ version: string;
210
+ publishedAt: string;
211
+ };
212
+ export type LatestVersionResponse = Record<string, PackageVersionInfo>;
@@ -0,0 +1,63 @@
1
+ const makeCacheDir = async (dir, fs, path, os) => {
2
+ const pathParts = dir.split(path.sep).filter(Boolean);
3
+ const cacheHash = pathParts[pathParts.length - 1];
4
+ const rootUser = pathParts[0];
5
+ let cacheDir = dir;
6
+ if (!fs.existsSync(path.join(path.sep, rootUser))) {
7
+ cacheDir = path.join(os.tmpdir(), cacheHash);
8
+ }
9
+ try {
10
+ fs.mkdirSync(cacheDir, { recursive: true });
11
+ } catch (error) {
12
+ throw new Error(`Failed to create cache directory: ${error.message}`);
13
+ }
14
+ return cacheDir;
15
+ };
16
+ const NodeCache = async (dir) => {
17
+ const fs = require("node:fs");
18
+ const path = require("node:path");
19
+ const os = require("node:os");
20
+ const { createHash } = require("node:crypto");
21
+ const cacheDir = await makeCacheDir(dir, fs, path, os);
22
+ return {
23
+ makeKey: (key) => {
24
+ const input = key && key instanceof Object ? JSON.stringify(key) : key || "";
25
+ return createHash("sha256").update(input).digest("hex");
26
+ },
27
+ get: async (key) => {
28
+ let readValue;
29
+ const cacheFilename = `${cacheDir}/${key}`;
30
+ try {
31
+ const data = await fs.promises.readFile(cacheFilename, "utf-8");
32
+ readValue = JSON.parse(data);
33
+ } catch (e) {
34
+ if (e.code !== "ENOENT") {
35
+ console.error(
36
+ `Failed to read cache file to ${cacheFilename}: ${e.message}`
37
+ );
38
+ }
39
+ }
40
+ return readValue;
41
+ },
42
+ set: async (key, value) => {
43
+ const cacheFilename = `${cacheDir}/${key}`;
44
+ try {
45
+ await fs.promises.writeFile(cacheFilename, JSON.stringify(value), {
46
+ encoding: "utf-8",
47
+ flag: "wx"
48
+ // Don't overwrite existing caches
49
+ });
50
+ } catch (e) {
51
+ if (e.code !== "EEXIST") {
52
+ console.error(
53
+ `Failed to write cache file to ${cacheFilename}: ${e.message}`
54
+ );
55
+ }
56
+ }
57
+ }
58
+ };
59
+ };
60
+ export {
61
+ NodeCache,
62
+ makeCacheDir
63
+ };
package/dist/react.d.ts CHANGED
@@ -2,6 +2,7 @@ export declare function useTina<T extends object>(props: {
2
2
  query: string;
3
3
  variables: object;
4
4
  data: T;
5
+ experimental___selectFormByFormId?: () => string | false | undefined;
5
6
  }): {
6
7
  data: T;
7
8
  isClient: boolean;
@@ -14,16 +15,23 @@ export declare function useEditState(): {
14
15
  * to signal to Tina which DOM element the field
15
16
  * is working with.
16
17
  */
17
- export declare const tinaField: <T extends (object & {
18
+ /**
19
+ * Generate a field identifier for Tina to associate DOM elements with form fields.
20
+ * Format: "queryId---path.to.field" or "queryId---path.to.array.index"
21
+ */
22
+ export declare const tinaField: <T extends {
18
23
  _content_source?: {
19
24
  queryId: string;
20
25
  path: (number | string)[];
21
26
  };
22
- }) | undefined | null>(object: T, property?: keyof Omit<NonNullable<T>, "__typename" | "_sys">, index?: number) => string;
23
- export declare const addMetadata: <T extends object>(id: string, object: T & {
24
- type?: string;
25
- _content_source?: unknown;
26
- }, path: (string | number)[]) => T;
27
+ } | Record<string, unknown> | null | undefined>(object: T, property?: keyof Omit<NonNullable<T>, "__typename" | "_sys">, index?: number) => string;
28
+ /**
29
+ * FIX: This function is updated to be more robust. It explicitly checks for
30
+ * `null` and `String` objects to prevent them from being processed as
31
+ * iterable objects, which is the root cause of the "Objects are not valid
32
+ * as a React child" error.
33
+ */
34
+ export declare const addMetadata: <T extends object>(id: string, obj: T, path?: (string | number)[]) => T;
27
35
  /**
28
36
  * This is a pretty rudimentary approach to hashing the query and variables to
29
37
  * ensure we treat multiple queries on the page uniquely. It's possible
package/dist/react.js CHANGED
@@ -11,14 +11,23 @@
11
11
  () => hashFromQuery(stringifiedQuery),
12
12
  [stringifiedQuery]
13
13
  );
14
- const [data, setData] = React.useState(props.data);
14
+ const processedData = React.useMemo(() => {
15
+ if (props.data) {
16
+ const dataCopy = JSON.parse(JSON.stringify(props.data));
17
+ return addMetadata(id, dataCopy, []);
18
+ }
19
+ }, [props.data, id]);
20
+ const [data, setData] = React.useState(processedData);
15
21
  const [isClient, setIsClient] = React.useState(false);
16
22
  const [quickEditEnabled, setQuickEditEnabled] = React.useState(false);
17
23
  const [isInTinaIframe, setIsInTinaIframe] = React.useState(false);
18
24
  React.useEffect(() => {
19
25
  setIsClient(true);
20
- setData(props.data);
21
- }, [id]);
26
+ setData(processedData);
27
+ parent.postMessage({
28
+ type: "url-changed"
29
+ });
30
+ }, [id, processedData]);
22
31
  React.useEffect(() => {
23
32
  if (quickEditEnabled) {
24
33
  let mouseDownHandler = function(e) {
@@ -100,13 +109,28 @@
100
109
  }
101
110
  }, [quickEditEnabled, isInTinaIframe]);
102
111
  React.useEffect(() => {
103
- parent.postMessage({ type: "open", ...props, id }, window.location.origin);
104
- window.addEventListener("message", (event) => {
112
+ if (props == null ? void 0 : props.experimental___selectFormByFormId) {
113
+ parent.postMessage({
114
+ type: "user-select-form",
115
+ formId: props.experimental___selectFormByFormId()
116
+ });
117
+ }
118
+ }, [id]);
119
+ React.useEffect(() => {
120
+ const { experimental___selectFormByFormId, ...rest } = props;
121
+ parent.postMessage({ type: "open", ...rest, id }, window.location.origin);
122
+ const handleMessage = (event) => {
105
123
  if (event.data.type === "quickEditEnabled") {
106
124
  setQuickEditEnabled(event.data.value);
107
125
  }
108
126
  if (event.data.id === id && event.data.type === "updateData") {
109
- setData(event.data.data);
127
+ const rawData = event.data.data;
128
+ const newlyProcessedData = addMetadata(
129
+ id,
130
+ JSON.parse(JSON.stringify(rawData)),
131
+ []
132
+ );
133
+ setData(newlyProcessedData);
110
134
  setIsInTinaIframe(true);
111
135
  const anyTinaField = document.querySelector("[data-tina-field]");
112
136
  if (anyTinaField) {
@@ -121,8 +145,10 @@
121
145
  );
122
146
  }
123
147
  }
124
- });
148
+ };
149
+ window.addEventListener("message", handleMessage);
125
150
  return () => {
151
+ window.removeEventListener("message", handleMessage);
126
152
  parent.postMessage({ type: "close", id }, window.location.origin);
127
153
  };
128
154
  }, [id, setQuickEditEnabled]);
@@ -144,59 +170,53 @@
144
170
  return { edit };
145
171
  }
146
172
  const tinaField = (object, property, index) => {
147
- var _a, _b, _c;
148
- if (!object) {
173
+ const contentSource = object == null ? void 0 : object._content_source;
174
+ if (!contentSource) {
149
175
  return "";
150
176
  }
151
- if (object._content_source) {
152
- if (!property) {
153
- return [
154
- (_a = object._content_source) == null ? void 0 : _a.queryId,
155
- object._content_source.path.join(".")
156
- ].join("---");
157
- }
158
- if (typeof index === "number") {
159
- return [
160
- (_b = object._content_source) == null ? void 0 : _b.queryId,
161
- [...object._content_source.path, property, index].join(".")
162
- ].join("---");
163
- }
164
- return [
165
- (_c = object._content_source) == null ? void 0 : _c.queryId,
166
- [...object._content_source.path, property].join(".")
167
- ].join("---");
177
+ const { queryId, path } = contentSource;
178
+ if (!property) {
179
+ return `${queryId}---${path.join(".")}`;
168
180
  }
169
- return "";
181
+ const fullPath = typeof index === "number" ? [...path, property, index] : [...path, property];
182
+ return `${queryId}---${fullPath.join(".")}`;
170
183
  };
171
- const addMetadata = (id, object, path) => {
172
- Object.entries(object).forEach(([key, value]) => {
173
- if (Array.isArray(value)) {
174
- value.forEach((item, index) => {
175
- if (isScalarOrUndefined(item)) {
176
- return;
177
- }
178
- if (Array.isArray(item)) {
179
- return;
180
- }
181
- const itemObject = item;
182
- addMetadata(id, itemObject, [...path, key, index]);
183
- });
184
+ const addMetadata = (id, obj, path = []) => {
185
+ if (obj === null) {
186
+ return obj;
187
+ }
188
+ if (isScalarOrUndefined(obj)) {
189
+ return obj;
190
+ }
191
+ if (obj instanceof String) {
192
+ return obj.valueOf();
193
+ }
194
+ if (Array.isArray(obj)) {
195
+ return obj.map(
196
+ (item, index) => addMetadata(id, item, [...path, index])
197
+ );
198
+ }
199
+ const transformedObj = {};
200
+ for (const [key, value] of Object.entries(obj)) {
201
+ const currentPath = [...path, key];
202
+ if ([
203
+ "__typename",
204
+ "_sys",
205
+ "_internalSys",
206
+ "_values",
207
+ "_internalValues",
208
+ "_content_source",
209
+ "_tina_metadata"
210
+ ].includes(key)) {
211
+ transformedObj[key] = value;
184
212
  } else {
185
- if (isScalarOrUndefined(value)) {
186
- return;
187
- }
188
- const itemObject = value;
189
- addMetadata(id, itemObject, [...path, key]);
213
+ transformedObj[key] = addMetadata(id, value, currentPath);
190
214
  }
191
- });
192
- if ((object == null ? void 0 : object.type) === "root") {
193
- return;
194
215
  }
195
- object._content_source = {
196
- queryId: id,
197
- path
198
- };
199
- return object;
216
+ if (transformedObj && typeof transformedObj === "object" && "type" in transformedObj && transformedObj.type === "root") {
217
+ return transformedObj;
218
+ }
219
+ return { ...transformedObj, _content_source: { queryId: id, path } };
200
220
  };
201
221
  function isScalarOrUndefined(value) {
202
222
  const type = typeof value;
package/dist/react.mjs CHANGED
@@ -8,14 +8,23 @@ function useTina(props) {
8
8
  () => hashFromQuery(stringifiedQuery),
9
9
  [stringifiedQuery]
10
10
  );
11
- const [data, setData] = React.useState(props.data);
11
+ const processedData = React.useMemo(() => {
12
+ if (props.data) {
13
+ const dataCopy = JSON.parse(JSON.stringify(props.data));
14
+ return addMetadata(id, dataCopy, []);
15
+ }
16
+ }, [props.data, id]);
17
+ const [data, setData] = React.useState(processedData);
12
18
  const [isClient, setIsClient] = React.useState(false);
13
19
  const [quickEditEnabled, setQuickEditEnabled] = React.useState(false);
14
20
  const [isInTinaIframe, setIsInTinaIframe] = React.useState(false);
15
21
  React.useEffect(() => {
16
22
  setIsClient(true);
17
- setData(props.data);
18
- }, [id]);
23
+ setData(processedData);
24
+ parent.postMessage({
25
+ type: "url-changed"
26
+ });
27
+ }, [id, processedData]);
19
28
  React.useEffect(() => {
20
29
  if (quickEditEnabled) {
21
30
  let mouseDownHandler = function(e) {
@@ -97,13 +106,28 @@ function useTina(props) {
97
106
  }
98
107
  }, [quickEditEnabled, isInTinaIframe]);
99
108
  React.useEffect(() => {
100
- parent.postMessage({ type: "open", ...props, id }, window.location.origin);
101
- window.addEventListener("message", (event) => {
109
+ if (props == null ? void 0 : props.experimental___selectFormByFormId) {
110
+ parent.postMessage({
111
+ type: "user-select-form",
112
+ formId: props.experimental___selectFormByFormId()
113
+ });
114
+ }
115
+ }, [id]);
116
+ React.useEffect(() => {
117
+ const { experimental___selectFormByFormId, ...rest } = props;
118
+ parent.postMessage({ type: "open", ...rest, id }, window.location.origin);
119
+ const handleMessage = (event) => {
102
120
  if (event.data.type === "quickEditEnabled") {
103
121
  setQuickEditEnabled(event.data.value);
104
122
  }
105
123
  if (event.data.id === id && event.data.type === "updateData") {
106
- setData(event.data.data);
124
+ const rawData = event.data.data;
125
+ const newlyProcessedData = addMetadata(
126
+ id,
127
+ JSON.parse(JSON.stringify(rawData)),
128
+ []
129
+ );
130
+ setData(newlyProcessedData);
107
131
  setIsInTinaIframe(true);
108
132
  const anyTinaField = document.querySelector("[data-tina-field]");
109
133
  if (anyTinaField) {
@@ -118,8 +142,10 @@ function useTina(props) {
118
142
  );
119
143
  }
120
144
  }
121
- });
145
+ };
146
+ window.addEventListener("message", handleMessage);
122
147
  return () => {
148
+ window.removeEventListener("message", handleMessage);
123
149
  parent.postMessage({ type: "close", id }, window.location.origin);
124
150
  };
125
151
  }, [id, setQuickEditEnabled]);
@@ -141,59 +167,53 @@ function useEditState() {
141
167
  return { edit };
142
168
  }
143
169
  const tinaField = (object, property, index) => {
144
- var _a, _b, _c;
145
- if (!object) {
170
+ const contentSource = object == null ? void 0 : object._content_source;
171
+ if (!contentSource) {
146
172
  return "";
147
173
  }
148
- if (object._content_source) {
149
- if (!property) {
150
- return [
151
- (_a = object._content_source) == null ? void 0 : _a.queryId,
152
- object._content_source.path.join(".")
153
- ].join("---");
154
- }
155
- if (typeof index === "number") {
156
- return [
157
- (_b = object._content_source) == null ? void 0 : _b.queryId,
158
- [...object._content_source.path, property, index].join(".")
159
- ].join("---");
160
- }
161
- return [
162
- (_c = object._content_source) == null ? void 0 : _c.queryId,
163
- [...object._content_source.path, property].join(".")
164
- ].join("---");
174
+ const { queryId, path } = contentSource;
175
+ if (!property) {
176
+ return `${queryId}---${path.join(".")}`;
165
177
  }
166
- return "";
178
+ const fullPath = typeof index === "number" ? [...path, property, index] : [...path, property];
179
+ return `${queryId}---${fullPath.join(".")}`;
167
180
  };
168
- const addMetadata = (id, object, path) => {
169
- Object.entries(object).forEach(([key, value]) => {
170
- if (Array.isArray(value)) {
171
- value.forEach((item, index) => {
172
- if (isScalarOrUndefined(item)) {
173
- return;
174
- }
175
- if (Array.isArray(item)) {
176
- return;
177
- }
178
- const itemObject = item;
179
- addMetadata(id, itemObject, [...path, key, index]);
180
- });
181
+ const addMetadata = (id, obj, path = []) => {
182
+ if (obj === null) {
183
+ return obj;
184
+ }
185
+ if (isScalarOrUndefined(obj)) {
186
+ return obj;
187
+ }
188
+ if (obj instanceof String) {
189
+ return obj.valueOf();
190
+ }
191
+ if (Array.isArray(obj)) {
192
+ return obj.map(
193
+ (item, index) => addMetadata(id, item, [...path, index])
194
+ );
195
+ }
196
+ const transformedObj = {};
197
+ for (const [key, value] of Object.entries(obj)) {
198
+ const currentPath = [...path, key];
199
+ if ([
200
+ "__typename",
201
+ "_sys",
202
+ "_internalSys",
203
+ "_values",
204
+ "_internalValues",
205
+ "_content_source",
206
+ "_tina_metadata"
207
+ ].includes(key)) {
208
+ transformedObj[key] = value;
181
209
  } else {
182
- if (isScalarOrUndefined(value)) {
183
- return;
184
- }
185
- const itemObject = value;
186
- addMetadata(id, itemObject, [...path, key]);
210
+ transformedObj[key] = addMetadata(id, value, currentPath);
187
211
  }
188
- });
189
- if ((object == null ? void 0 : object.type) === "root") {
190
- return;
191
212
  }
192
- object._content_source = {
193
- queryId: id,
194
- path
195
- };
196
- return object;
213
+ if (transformedObj && typeof transformedObj === "object" && "type" in transformedObj && transformedObj.type === "root") {
214
+ return transformedObj;
215
+ }
216
+ return { ...transformedObj, _content_source: { queryId: id, path } };
197
217
  };
198
218
  function isScalarOrUndefined(value) {
199
219
  const type = typeof value;
@@ -58,9 +58,15 @@ type BaseComponents = {
58
58
  lic?: {
59
59
  children: JSX.Element;
60
60
  };
61
+ /**
62
+ * @deprecated Use `blockquote` instead. This was incorrectly named and will be removed in a future version.
63
+ */
61
64
  block_quote?: {
62
65
  children: JSX.Element;
63
66
  };
67
+ blockquote?: {
68
+ children: JSX.Element;
69
+ };
64
70
  code_block?: {
65
71
  lang?: string;
66
72
  value: string;
@@ -72,7 +72,7 @@
72
72
  return MNode;
73
73
  };
74
74
  const Node = ({ components, child }) => {
75
- var _a, _b, _c, _d, _e, _f;
75
+ var _a, _b, _c, _d, _e, _f, _g;
76
76
  const { children, ...props } = child;
77
77
  switch (child.type) {
78
78
  case "h1":
@@ -82,7 +82,6 @@
82
82
  case "h5":
83
83
  case "h6":
84
84
  case "p":
85
- case "blockquote":
86
85
  case "ol":
87
86
  case "ul":
88
87
  case "li":
@@ -99,6 +98,14 @@
99
98
  return /* @__PURE__ */ React.createElement(Component2, { ...props }, /* @__PURE__ */ React.createElement(TinaMarkdown, { components, content: children }));
100
99
  }
101
100
  return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(TinaMarkdown, { components, content: child.children }));
101
+ case "blockquote":
102
+ const BlockquoteComponent = components.blockquote || components.block_quote;
103
+ if (BlockquoteComponent) {
104
+ return /* @__PURE__ */ React.createElement(BlockquoteComponent, { ...props }, /* @__PURE__ */ React.createElement(TinaMarkdown, { components, content: children }));
105
+ }
106
+ return React.createElement("blockquote", {
107
+ children: /* @__PURE__ */ React.createElement(TinaMarkdown, { components, content: children })
108
+ });
102
109
  case "img":
103
110
  if (components[child.type]) {
104
111
  const Component2 = components[child.type];
@@ -117,17 +124,23 @@
117
124
  // @ts-ignore FIXME: TinaMarkdownContent needs to be a union of all possible node types
118
125
  /* @__PURE__ */ React.createElement("a", { href: child.url }, /* @__PURE__ */ React.createElement(TinaMarkdown, { components, content: children }))
119
126
  );
120
- case "mermaid":
121
127
  case "code_block": {
122
- const value = child.value;
128
+ let codeString = "";
129
+ if (Array.isArray(child.children)) {
130
+ codeString = child.children.map(
131
+ (line) => Array.isArray(line.children) ? line.children.map((t) => t.text).join("") : ""
132
+ ).join("\n");
133
+ } else if (typeof child.value === "string") {
134
+ codeString = child.value;
135
+ }
123
136
  if (components[child.type]) {
124
137
  const Component2 = components[child.type];
125
138
  return (
126
139
  // @ts-ignore FIXME: TinaMarkdownContent needs to be a union of all possible node types
127
- /* @__PURE__ */ React.createElement(Component2, { ...props })
140
+ /* @__PURE__ */ React.createElement(Component2, { ...props, value: codeString })
128
141
  );
129
142
  }
130
- return /* @__PURE__ */ React.createElement("pre", null, /* @__PURE__ */ React.createElement("code", null, value));
143
+ return /* @__PURE__ */ React.createElement("pre", null, /* @__PURE__ */ React.createElement("code", null, codeString));
131
144
  }
132
145
  case "hr":
133
146
  if (components[child.type]) {
@@ -152,33 +165,33 @@
152
165
  } else {
153
166
  if (child.name === "table") {
154
167
  const firstRowHeader = (_a = child.props) == null ? void 0 : _a.firstRowHeader;
155
- const rows = (firstRowHeader ? (_b = child.props) == null ? void 0 : _b.tableRows.filter((_, i) => i !== 0) : (_c = child.props) == null ? void 0 : _c.tableRows) || [];
168
+ const rows2 = (firstRowHeader ? (_b = child.props) == null ? void 0 : _b.tableRows.filter((_, i) => i !== 0) : (_c = child.props) == null ? void 0 : _c.tableRows) || [];
156
169
  const header = (_e = (_d = child.props) == null ? void 0 : _d.tableRows) == null ? void 0 : _e.at(0);
157
- const TableComponent = components["table"] || ((props2) => /* @__PURE__ */ React.createElement("table", { ...props2 }));
158
- const TrComponent = components["tr"] || ((props2) => /* @__PURE__ */ React.createElement("tr", { ...props2 }));
170
+ const TableComponent2 = components["table"] || ((props2) => /* @__PURE__ */ React.createElement("table", { ...props2 }));
171
+ const TrComponent2 = components["tr"] || ((props2) => /* @__PURE__ */ React.createElement("tr", { ...props2 }));
159
172
  const ThComponent = components["th"] || ((props2) => /* @__PURE__ */ React.createElement("th", { style: { textAlign: (props2 == null ? void 0 : props2.align) || "auto" }, ...props2 }));
160
- const TdComponent = components["td"] || ((props2) => /* @__PURE__ */ React.createElement("td", { style: { textAlign: (props2 == null ? void 0 : props2.align) || "auto" }, ...props2 }));
161
- const align = ((_f = child.props) == null ? void 0 : _f.align) || [];
162
- return /* @__PURE__ */ React.createElement(TableComponent, null, firstRowHeader && /* @__PURE__ */ React.createElement("thead", null, /* @__PURE__ */ React.createElement(TrComponent, null, header.tableCells.map((c, i) => {
173
+ const TdComponent2 = components["td"] || ((props2) => /* @__PURE__ */ React.createElement("td", { style: { textAlign: (props2 == null ? void 0 : props2.align) || "auto" }, ...props2 }));
174
+ const align2 = ((_f = child.props) == null ? void 0 : _f.align) || [];
175
+ return /* @__PURE__ */ React.createElement(TableComponent2, null, firstRowHeader && /* @__PURE__ */ React.createElement("thead", null, /* @__PURE__ */ React.createElement(TrComponent2, null, header.tableCells.map((c, i) => {
163
176
  return /* @__PURE__ */ React.createElement(
164
177
  TinaMarkdown,
165
178
  {
166
179
  key: i,
167
180
  components: {
168
- p: (props2) => /* @__PURE__ */ React.createElement(ThComponent, { align: align[i], ...props2 })
181
+ p: (props2) => /* @__PURE__ */ React.createElement(ThComponent, { align: align2[i], ...props2 })
169
182
  },
170
183
  content: c.value
171
184
  }
172
185
  );
173
- }))), /* @__PURE__ */ React.createElement("tbody", null, rows.map((row, i) => {
186
+ }))), /* @__PURE__ */ React.createElement("tbody", null, rows2.map((row, i) => {
174
187
  var _a2;
175
- return /* @__PURE__ */ React.createElement(TrComponent, { key: i }, (_a2 = row == null ? void 0 : row.tableCells) == null ? void 0 : _a2.map((c, i2) => {
188
+ return /* @__PURE__ */ React.createElement(TrComponent2, { key: i }, (_a2 = row == null ? void 0 : row.tableCells) == null ? void 0 : _a2.map((c, i2) => {
176
189
  return /* @__PURE__ */ React.createElement(
177
190
  TinaMarkdown,
178
191
  {
179
192
  key: i2,
180
193
  components: {
181
- p: (props2) => /* @__PURE__ */ React.createElement(TdComponent, { align: align[i2], ...props2 })
194
+ p: (props2) => /* @__PURE__ */ React.createElement(TdComponent2, { align: align2[i2], ...props2 })
182
195
  },
183
196
  content: c.value
184
197
  }
@@ -193,6 +206,37 @@
193
206
  return /* @__PURE__ */ React.createElement("span", null, `No component provided for ${child.name}`);
194
207
  }
195
208
  }
209
+ case "table":
210
+ const rows = child.children || [];
211
+ const TableComponent = components["table"] || ((props2) => /* @__PURE__ */ React.createElement("table", { style: { border: "1px solid #EDECF3" }, ...props2 }));
212
+ const TrComponent = components["tr"] || ((props2) => /* @__PURE__ */ React.createElement("tr", { ...props2 }));
213
+ const TdComponent = components["td"] || ((props2) => /* @__PURE__ */ React.createElement(
214
+ "td",
215
+ {
216
+ style: {
217
+ textAlign: (props2 == null ? void 0 : props2.align) || "auto",
218
+ border: "1px solid #EDECF3",
219
+ padding: "0.25rem"
220
+ },
221
+ ...props2
222
+ }
223
+ ));
224
+ const align = ((_g = child.props) == null ? void 0 : _g.align) || [];
225
+ return /* @__PURE__ */ React.createElement(TableComponent, null, /* @__PURE__ */ React.createElement("tbody", null, rows.map((row, i) => {
226
+ var _a2;
227
+ return /* @__PURE__ */ React.createElement(TrComponent, { key: i }, (_a2 = row.children) == null ? void 0 : _a2.map((cell, i2) => {
228
+ return /* @__PURE__ */ React.createElement(
229
+ TinaMarkdown,
230
+ {
231
+ key: i2,
232
+ components: {
233
+ p: (props2) => /* @__PURE__ */ React.createElement(TdComponent, { align: align[i2], ...props2 })
234
+ },
235
+ content: cell.children
236
+ }
237
+ );
238
+ }));
239
+ })));
196
240
  case "maybe_mdx":
197
241
  return null;
198
242
  case "html":