tinacms 0.0.0-bf22bf8-20241004045704 → 0.0.0-c0f1b7d-20250702023438

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 (104) hide show
  1. package/README.md +1 -1
  2. package/dist/admin/api.d.ts +1 -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/TinaCloudProvider.d.ts +1 -1
  13. package/dist/cache/node-cache.d.ts +1 -0
  14. package/dist/client.js +100 -62
  15. package/dist/client.mjs +59 -36
  16. package/dist/hooks/create-page-plugin.d.ts +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +11694 -9064
  19. package/dist/index.mjs +14147 -11514
  20. package/dist/internalClient/index.d.ts +9 -3
  21. package/dist/node-cache-5e8db9f0.mjs +63 -0
  22. package/dist/react.d.ts +14 -6
  23. package/dist/react.js +71 -53
  24. package/dist/react.mjs +71 -53
  25. package/dist/rich-text/index.d.ts +3 -0
  26. package/dist/rich-text/index.js +45 -12
  27. package/dist/rich-text/index.mjs +45 -12
  28. package/dist/rich-text/prism.js +1 -1
  29. package/dist/rich-text/prism.mjs +1 -1
  30. package/dist/rich-text/static.d.ts +148 -0
  31. package/dist/rich-text/static.js +239 -0
  32. package/dist/rich-text/static.mjs +236 -0
  33. package/dist/toolkit/components/media/media-item.d.ts +1 -1
  34. package/dist/toolkit/components/media/media-manager.d.ts +1 -1
  35. package/dist/toolkit/components/ui/breadcrumb.d.ts +11 -0
  36. package/dist/toolkit/components/ui/dropdown-menu.d.ts +25 -0
  37. package/dist/toolkit/fields/components/password-field.d.ts +1 -1
  38. package/dist/toolkit/fields/components/reference/components/button.d.ts +1 -1
  39. package/dist/toolkit/fields/components/reference/components/popover.d.ts +1 -1
  40. package/dist/toolkit/fields/components/reference/model/reference-link-props.d.ts +2 -0
  41. package/dist/toolkit/fields/components/reference/reference-select.d.ts +2 -2
  42. package/dist/toolkit/fields/components/select.d.ts +2 -2
  43. package/dist/toolkit/fields/components/text-field.d.ts +1 -1
  44. package/dist/toolkit/fields/plugins/group-field-plugin.d.ts +1 -1
  45. package/dist/toolkit/fields/plugins/list-field-meta.d.ts +1 -1
  46. package/dist/toolkit/fields/plugins/mdx-field-plugin/index.d.ts +5 -2
  47. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/fixed-toolbar-buttons.d.ts +0 -4
  48. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/icons.d.ts +2 -0
  49. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/indent-list-toolbar-button.d.ts +17 -5
  50. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mark-toolbar-button.d.ts +4 -18
  51. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-element.d.ts +11 -0
  52. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-toolbar-button.d.ts +20 -0
  53. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/resizable.d.ts +39 -0
  54. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-cell-element.d.ts +27 -0
  55. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-dropdown-menu.d.ts +3 -0
  56. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-element.d.ts +14 -0
  57. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table-row-element.d.ts +13 -0
  58. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/text-area.d.ts +5 -0
  59. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/index.d.ts +1 -1
  60. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/core/common.d.ts +1 -0
  61. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/custom/mermaid-plugin.d.ts +2 -0
  62. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/code-block/index.d.ts +4 -2
  63. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/components.d.ts +64 -11
  64. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-overrides.d.ts +11 -3
  65. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-provider.d.ts +3 -3
  66. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/transforms/is-url.d.ts +1 -2
  67. package/dist/toolkit/fields/plugins/wrap-field-with-meta.d.ts +8 -0
  68. package/dist/toolkit/form-builder/fields-builder.d.ts +1 -1
  69. package/dist/toolkit/form-builder/form-builder.d.ts +15 -5
  70. package/dist/toolkit/forms/field.d.ts +3 -0
  71. package/dist/toolkit/forms/form.d.ts +22 -3
  72. package/dist/toolkit/git-client/git-client.d.ts +25 -2
  73. package/dist/toolkit/git-client/git-file.d.ts +18 -0
  74. package/dist/toolkit/git-client/git-media-store.d.ts +13 -0
  75. package/dist/toolkit/git-client/use-git-file.d.ts +4 -0
  76. package/dist/toolkit/icons/Tina.d.ts +0 -5
  77. package/dist/toolkit/index.d.ts +1 -1
  78. package/dist/toolkit/plugin-branch-switcher/branch-button.d.ts +1 -0
  79. package/dist/toolkit/plugin-branch-switcher/branch-switcher-legacy.d.ts +1 -1
  80. package/dist/toolkit/plugin-branch-switcher/branch-switcher.d.ts +1 -1
  81. package/dist/toolkit/plugin-branch-switcher/index.d.ts +0 -1
  82. package/dist/toolkit/react-cloud-config/cloud-config-plugin.d.ts +3 -3
  83. package/dist/toolkit/react-sidebar/components/VersionInfo.d.ts +2 -0
  84. package/dist/toolkit/react-sidebar/components/alert.d.ts +5 -0
  85. package/dist/toolkit/react-sidebar/components/form-list.d.ts +1 -1
  86. package/dist/toolkit/react-sidebar/components/nav.d.ts +5 -3
  87. package/dist/toolkit/react-sidebar/components/resize-handle.d.ts +0 -5
  88. package/dist/toolkit/react-sidebar/components/sidebar-body.d.ts +7 -10
  89. package/dist/toolkit/react-sidebar/components/sidebar-loading-placeholder.d.ts +2 -0
  90. package/dist/toolkit/react-sidebar/components/sidebar-no-forms-placeholder.d.ts +2 -0
  91. package/dist/toolkit/react-sidebar/components/sidebar.d.ts +0 -7
  92. package/dist/toolkit/react-sidebar/components/sync-status.d.ts +5 -8
  93. package/dist/toolkit/react-sidebar/index.d.ts +1 -1
  94. package/dist/toolkit/react-sidebar/sidebar.d.ts +2 -2
  95. package/dist/toolkit/styles/button.d.ts +2 -2
  96. package/dist/toolkit/tina-cms.d.ts +3 -3
  97. package/dist/toolkit/tina-state.d.ts +15 -0
  98. package/dist/unifiedClient/index.d.ts +8 -1
  99. package/dist/utils/cn.d.ts +2 -0
  100. package/package.json +51 -42
  101. package/dist/__vite-browser-external-d06ac358.mjs +0 -4
  102. package/dist/node-cache-7fa2452c.mjs +0 -43
  103. package/dist/toolkit/plugin-branch-switcher/branch-banner.d.ts +0 -2
  104. 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,7 @@ export declare class Client {
141
141
  }[]>;
142
142
  usingProtectedBranch(): boolean;
143
143
  createBranch({ baseBranch, branchName }: BranchData): Promise<string>;
144
+ getLatestVersion(): Promise<LatestVersionResponse>;
144
145
  }
145
146
  export declare const DEFAULT_LOCAL_TINA_GQL_SERVER_URL = "http://localhost:4001/graphql";
146
147
  export declare class LocalClient extends Client {
@@ -185,3 +186,8 @@ export declare class LocalSearchClient implements SearchClient {
185
186
  put(docs: any[]): Promise<any>;
186
187
  supportsClientSideIndexing(): boolean;
187
188
  }
189
+ export type PackageVersionInfo = {
190
+ version: string;
191
+ publishedAt: string;
192
+ };
193
+ 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,21 @@
11
11
  () => hashFromQuery(stringifiedQuery),
12
12
  [stringifiedQuery]
13
13
  );
14
- const [data, setData] = React.useState(props.data);
14
+ const processedData = React.useMemo(() => {
15
+ const dataCopy = JSON.parse(JSON.stringify(props.data));
16
+ return addMetadata(id, dataCopy, []);
17
+ }, [props.data, id]);
18
+ const [data, setData] = React.useState(processedData);
15
19
  const [isClient, setIsClient] = React.useState(false);
16
20
  const [quickEditEnabled, setQuickEditEnabled] = React.useState(false);
17
21
  const [isInTinaIframe, setIsInTinaIframe] = React.useState(false);
18
22
  React.useEffect(() => {
19
23
  setIsClient(true);
20
- setData(props.data);
21
- }, [id]);
24
+ setData(processedData);
25
+ parent.postMessage({
26
+ type: "url-changed"
27
+ });
28
+ }, [id, processedData]);
22
29
  React.useEffect(() => {
23
30
  if (quickEditEnabled) {
24
31
  let mouseDownHandler = function(e) {
@@ -100,13 +107,28 @@
100
107
  }
101
108
  }, [quickEditEnabled, isInTinaIframe]);
102
109
  React.useEffect(() => {
103
- parent.postMessage({ type: "open", ...props, id }, window.location.origin);
104
- window.addEventListener("message", (event) => {
110
+ if (props == null ? void 0 : props.experimental___selectFormByFormId) {
111
+ parent.postMessage({
112
+ type: "user-select-form",
113
+ formId: props.experimental___selectFormByFormId()
114
+ });
115
+ }
116
+ }, [id]);
117
+ React.useEffect(() => {
118
+ const { experimental___selectFormByFormId, ...rest } = props;
119
+ parent.postMessage({ type: "open", ...rest, id }, window.location.origin);
120
+ const handleMessage = (event) => {
105
121
  if (event.data.type === "quickEditEnabled") {
106
122
  setQuickEditEnabled(event.data.value);
107
123
  }
108
124
  if (event.data.id === id && event.data.type === "updateData") {
109
- setData(event.data.data);
125
+ const rawData = event.data.data;
126
+ const newlyProcessedData = addMetadata(
127
+ id,
128
+ JSON.parse(JSON.stringify(rawData)),
129
+ []
130
+ );
131
+ setData(newlyProcessedData);
110
132
  setIsInTinaIframe(true);
111
133
  const anyTinaField = document.querySelector("[data-tina-field]");
112
134
  if (anyTinaField) {
@@ -121,8 +143,10 @@
121
143
  );
122
144
  }
123
145
  }
124
- });
146
+ };
147
+ window.addEventListener("message", handleMessage);
125
148
  return () => {
149
+ window.removeEventListener("message", handleMessage);
126
150
  parent.postMessage({ type: "close", id }, window.location.origin);
127
151
  };
128
152
  }, [id, setQuickEditEnabled]);
@@ -144,59 +168,53 @@
144
168
  return { edit };
145
169
  }
146
170
  const tinaField = (object, property, index) => {
147
- var _a, _b, _c;
148
- if (!object) {
171
+ const contentSource = object == null ? void 0 : object._content_source;
172
+ if (!contentSource) {
149
173
  return "";
150
174
  }
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("---");
175
+ const { queryId, path } = contentSource;
176
+ if (!property) {
177
+ return `${queryId}---${path.join(".")}`;
168
178
  }
169
- return "";
179
+ const fullPath = typeof index === "number" ? [...path, property, index] : [...path, property];
180
+ return `${queryId}---${fullPath.join(".")}`;
170
181
  };
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
- });
182
+ const addMetadata = (id, obj, path = []) => {
183
+ if (obj === null) {
184
+ return obj;
185
+ }
186
+ if (isScalarOrUndefined(obj)) {
187
+ return obj;
188
+ }
189
+ if (obj instanceof String) {
190
+ return obj.valueOf();
191
+ }
192
+ if (Array.isArray(obj)) {
193
+ return obj.map(
194
+ (item, index) => addMetadata(id, item, [...path, index])
195
+ );
196
+ }
197
+ const transformedObj = {};
198
+ for (const [key, value] of Object.entries(obj)) {
199
+ const currentPath = [...path, key];
200
+ if ([
201
+ "__typename",
202
+ "_sys",
203
+ "_internalSys",
204
+ "_values",
205
+ "_internalValues",
206
+ "_content_source",
207
+ "_tina_metadata"
208
+ ].includes(key)) {
209
+ transformedObj[key] = value;
184
210
  } else {
185
- if (isScalarOrUndefined(value)) {
186
- return;
187
- }
188
- const itemObject = value;
189
- addMetadata(id, itemObject, [...path, key]);
211
+ transformedObj[key] = addMetadata(id, value, currentPath);
190
212
  }
191
- });
192
- if ((object == null ? void 0 : object.type) === "root") {
193
- return;
194
213
  }
195
- object._content_source = {
196
- queryId: id,
197
- path
198
- };
199
- return object;
214
+ if (transformedObj && typeof transformedObj === "object" && "type" in transformedObj && transformedObj.type === "root") {
215
+ return transformedObj;
216
+ }
217
+ return { ...transformedObj, _content_source: { queryId: id, path } };
200
218
  };
201
219
  function isScalarOrUndefined(value) {
202
220
  const type = typeof value;
package/dist/react.mjs CHANGED
@@ -8,14 +8,21 @@ 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
+ const dataCopy = JSON.parse(JSON.stringify(props.data));
13
+ return addMetadata(id, dataCopy, []);
14
+ }, [props.data, id]);
15
+ const [data, setData] = React.useState(processedData);
12
16
  const [isClient, setIsClient] = React.useState(false);
13
17
  const [quickEditEnabled, setQuickEditEnabled] = React.useState(false);
14
18
  const [isInTinaIframe, setIsInTinaIframe] = React.useState(false);
15
19
  React.useEffect(() => {
16
20
  setIsClient(true);
17
- setData(props.data);
18
- }, [id]);
21
+ setData(processedData);
22
+ parent.postMessage({
23
+ type: "url-changed"
24
+ });
25
+ }, [id, processedData]);
19
26
  React.useEffect(() => {
20
27
  if (quickEditEnabled) {
21
28
  let mouseDownHandler = function(e) {
@@ -97,13 +104,28 @@ function useTina(props) {
97
104
  }
98
105
  }, [quickEditEnabled, isInTinaIframe]);
99
106
  React.useEffect(() => {
100
- parent.postMessage({ type: "open", ...props, id }, window.location.origin);
101
- window.addEventListener("message", (event) => {
107
+ if (props == null ? void 0 : props.experimental___selectFormByFormId) {
108
+ parent.postMessage({
109
+ type: "user-select-form",
110
+ formId: props.experimental___selectFormByFormId()
111
+ });
112
+ }
113
+ }, [id]);
114
+ React.useEffect(() => {
115
+ const { experimental___selectFormByFormId, ...rest } = props;
116
+ parent.postMessage({ type: "open", ...rest, id }, window.location.origin);
117
+ const handleMessage = (event) => {
102
118
  if (event.data.type === "quickEditEnabled") {
103
119
  setQuickEditEnabled(event.data.value);
104
120
  }
105
121
  if (event.data.id === id && event.data.type === "updateData") {
106
- setData(event.data.data);
122
+ const rawData = event.data.data;
123
+ const newlyProcessedData = addMetadata(
124
+ id,
125
+ JSON.parse(JSON.stringify(rawData)),
126
+ []
127
+ );
128
+ setData(newlyProcessedData);
107
129
  setIsInTinaIframe(true);
108
130
  const anyTinaField = document.querySelector("[data-tina-field]");
109
131
  if (anyTinaField) {
@@ -118,8 +140,10 @@ function useTina(props) {
118
140
  );
119
141
  }
120
142
  }
121
- });
143
+ };
144
+ window.addEventListener("message", handleMessage);
122
145
  return () => {
146
+ window.removeEventListener("message", handleMessage);
123
147
  parent.postMessage({ type: "close", id }, window.location.origin);
124
148
  };
125
149
  }, [id, setQuickEditEnabled]);
@@ -141,59 +165,53 @@ function useEditState() {
141
165
  return { edit };
142
166
  }
143
167
  const tinaField = (object, property, index) => {
144
- var _a, _b, _c;
145
- if (!object) {
168
+ const contentSource = object == null ? void 0 : object._content_source;
169
+ if (!contentSource) {
146
170
  return "";
147
171
  }
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("---");
172
+ const { queryId, path } = contentSource;
173
+ if (!property) {
174
+ return `${queryId}---${path.join(".")}`;
165
175
  }
166
- return "";
176
+ const fullPath = typeof index === "number" ? [...path, property, index] : [...path, property];
177
+ return `${queryId}---${fullPath.join(".")}`;
167
178
  };
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
- });
179
+ const addMetadata = (id, obj, path = []) => {
180
+ if (obj === null) {
181
+ return obj;
182
+ }
183
+ if (isScalarOrUndefined(obj)) {
184
+ return obj;
185
+ }
186
+ if (obj instanceof String) {
187
+ return obj.valueOf();
188
+ }
189
+ if (Array.isArray(obj)) {
190
+ return obj.map(
191
+ (item, index) => addMetadata(id, item, [...path, index])
192
+ );
193
+ }
194
+ const transformedObj = {};
195
+ for (const [key, value] of Object.entries(obj)) {
196
+ const currentPath = [...path, key];
197
+ if ([
198
+ "__typename",
199
+ "_sys",
200
+ "_internalSys",
201
+ "_values",
202
+ "_internalValues",
203
+ "_content_source",
204
+ "_tina_metadata"
205
+ ].includes(key)) {
206
+ transformedObj[key] = value;
181
207
  } else {
182
- if (isScalarOrUndefined(value)) {
183
- return;
184
- }
185
- const itemObject = value;
186
- addMetadata(id, itemObject, [...path, key]);
208
+ transformedObj[key] = addMetadata(id, value, currentPath);
187
209
  }
188
- });
189
- if ((object == null ? void 0 : object.type) === "root") {
190
- return;
191
210
  }
192
- object._content_source = {
193
- queryId: id,
194
- path
195
- };
196
- return object;
211
+ if (transformedObj && typeof transformedObj === "object" && "type" in transformedObj && transformedObj.type === "root") {
212
+ return transformedObj;
213
+ }
214
+ return { ...transformedObj, _content_source: { queryId: id, path } };
197
215
  };
198
216
  function isScalarOrUndefined(value) {
199
217
  const type = typeof value;
@@ -65,6 +65,9 @@ type BaseComponents = {
65
65
  lang?: string;
66
66
  value: string;
67
67
  };
68
+ mermaid?: {
69
+ value: string;
70
+ };
68
71
  img?: {
69
72
  url: string;
70
73
  caption?: 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":
@@ -117,7 +117,8 @@
117
117
  // @ts-ignore FIXME: TinaMarkdownContent needs to be a union of all possible node types
118
118
  /* @__PURE__ */ React.createElement("a", { href: child.url }, /* @__PURE__ */ React.createElement(TinaMarkdown, { components, content: children }))
119
119
  );
120
- case "code_block":
120
+ case "mermaid":
121
+ case "code_block": {
121
122
  const value = child.value;
122
123
  if (components[child.type]) {
123
124
  const Component2 = components[child.type];
@@ -127,6 +128,7 @@
127
128
  );
128
129
  }
129
130
  return /* @__PURE__ */ React.createElement("pre", null, /* @__PURE__ */ React.createElement("code", null, value));
131
+ }
130
132
  case "hr":
131
133
  if (components[child.type]) {
132
134
  const Component2 = components[child.type];
@@ -150,33 +152,33 @@
150
152
  } else {
151
153
  if (child.name === "table") {
152
154
  const firstRowHeader = (_a = child.props) == null ? void 0 : _a.firstRowHeader;
153
- const rows = (firstRowHeader ? (_b = child.props) == null ? void 0 : _b.tableRows.filter((_, i) => i !== 0) : (_c = child.props) == null ? void 0 : _c.tableRows) || [];
155
+ const rows2 = (firstRowHeader ? (_b = child.props) == null ? void 0 : _b.tableRows.filter((_, i) => i !== 0) : (_c = child.props) == null ? void 0 : _c.tableRows) || [];
154
156
  const header = (_e = (_d = child.props) == null ? void 0 : _d.tableRows) == null ? void 0 : _e.at(0);
155
- const TableComponent = components["table"] || ((props2) => /* @__PURE__ */ React.createElement("table", { ...props2 }));
156
- const TrComponent = components["tr"] || ((props2) => /* @__PURE__ */ React.createElement("tr", { ...props2 }));
157
+ const TableComponent2 = components["table"] || ((props2) => /* @__PURE__ */ React.createElement("table", { ...props2 }));
158
+ const TrComponent2 = components["tr"] || ((props2) => /* @__PURE__ */ React.createElement("tr", { ...props2 }));
157
159
  const ThComponent = components["th"] || ((props2) => /* @__PURE__ */ React.createElement("th", { style: { textAlign: (props2 == null ? void 0 : props2.align) || "auto" }, ...props2 }));
158
- const TdComponent = components["td"] || ((props2) => /* @__PURE__ */ React.createElement("td", { style: { textAlign: (props2 == null ? void 0 : props2.align) || "auto" }, ...props2 }));
159
- const align = ((_f = child.props) == null ? void 0 : _f.align) || [];
160
- return /* @__PURE__ */ React.createElement(TableComponent, null, firstRowHeader && /* @__PURE__ */ React.createElement("thead", null, /* @__PURE__ */ React.createElement(TrComponent, null, header.tableCells.map((c, i) => {
160
+ const TdComponent2 = components["td"] || ((props2) => /* @__PURE__ */ React.createElement("td", { style: { textAlign: (props2 == null ? void 0 : props2.align) || "auto" }, ...props2 }));
161
+ const align2 = ((_f = child.props) == null ? void 0 : _f.align) || [];
162
+ return /* @__PURE__ */ React.createElement(TableComponent2, null, firstRowHeader && /* @__PURE__ */ React.createElement("thead", null, /* @__PURE__ */ React.createElement(TrComponent2, null, header.tableCells.map((c, i) => {
161
163
  return /* @__PURE__ */ React.createElement(
162
164
  TinaMarkdown,
163
165
  {
164
166
  key: i,
165
167
  components: {
166
- p: (props2) => /* @__PURE__ */ React.createElement(ThComponent, { align: align[i], ...props2 })
168
+ p: (props2) => /* @__PURE__ */ React.createElement(ThComponent, { align: align2[i], ...props2 })
167
169
  },
168
170
  content: c.value
169
171
  }
170
172
  );
171
- }))), /* @__PURE__ */ React.createElement("tbody", null, rows.map((row, i) => {
173
+ }))), /* @__PURE__ */ React.createElement("tbody", null, rows2.map((row, i) => {
172
174
  var _a2;
173
- return /* @__PURE__ */ React.createElement(TrComponent, { key: i }, (_a2 = row == null ? void 0 : row.tableCells) == null ? void 0 : _a2.map((c, i2) => {
175
+ return /* @__PURE__ */ React.createElement(TrComponent2, { key: i }, (_a2 = row == null ? void 0 : row.tableCells) == null ? void 0 : _a2.map((c, i2) => {
174
176
  return /* @__PURE__ */ React.createElement(
175
177
  TinaMarkdown,
176
178
  {
177
179
  key: i2,
178
180
  components: {
179
- p: (props2) => /* @__PURE__ */ React.createElement(TdComponent, { align: align[i2], ...props2 })
181
+ p: (props2) => /* @__PURE__ */ React.createElement(TdComponent2, { align: align2[i2], ...props2 })
180
182
  },
181
183
  content: c.value
182
184
  }
@@ -191,6 +193,37 @@
191
193
  return /* @__PURE__ */ React.createElement("span", null, `No component provided for ${child.name}`);
192
194
  }
193
195
  }
196
+ case "table":
197
+ const rows = child.children || [];
198
+ const TableComponent = components["table"] || ((props2) => /* @__PURE__ */ React.createElement("table", { style: { border: "1px solid #EDECF3" }, ...props2 }));
199
+ const TrComponent = components["tr"] || ((props2) => /* @__PURE__ */ React.createElement("tr", { ...props2 }));
200
+ const TdComponent = components["td"] || ((props2) => /* @__PURE__ */ React.createElement(
201
+ "td",
202
+ {
203
+ style: {
204
+ textAlign: (props2 == null ? void 0 : props2.align) || "auto",
205
+ border: "1px solid #EDECF3",
206
+ padding: "0.25rem"
207
+ },
208
+ ...props2
209
+ }
210
+ ));
211
+ const align = ((_g = child.props) == null ? void 0 : _g.align) || [];
212
+ return /* @__PURE__ */ React.createElement(TableComponent, null, /* @__PURE__ */ React.createElement("tbody", null, rows.map((row, i) => {
213
+ var _a2;
214
+ return /* @__PURE__ */ React.createElement(TrComponent, { key: i }, (_a2 = row.children) == null ? void 0 : _a2.map((cell, i2) => {
215
+ return /* @__PURE__ */ React.createElement(
216
+ TinaMarkdown,
217
+ {
218
+ key: i2,
219
+ components: {
220
+ p: (props2) => /* @__PURE__ */ React.createElement(TdComponent, { align: align[i2], ...props2 })
221
+ },
222
+ content: cell.children
223
+ }
224
+ );
225
+ }));
226
+ })));
194
227
  case "maybe_mdx":
195
228
  return null;
196
229
  case "html":