tinacms 0.0.0-f9fb00b-20250728042847 → 0.0.0-fa62b83-20251209001612
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/__vite-browser-external-d06ac358.js +4 -0
- package/dist/admin/api.d.ts +1 -1
- package/dist/auth/AuthModal.d.ts +1 -4
- package/dist/auth/TinaCloudProvider.d.ts +0 -1
- package/dist/cache/node-cache.d.ts +2 -2
- package/dist/client.js +131 -185
- package/dist/index.js +118199 -117393
- package/dist/internalClient/index.d.ts +1 -1
- package/dist/node-cache-5da2d6a2.js +74 -0
- package/dist/react.js +210 -213
- package/dist/rich-text/index.d.ts +6 -0
- package/dist/rich-text/index.js +234 -230
- package/dist/rich-text/prism.js +16 -18
- package/dist/rich-text/static.d.ts +6 -0
- package/dist/rich-text/static.js +229 -225
- package/dist/tina-cms.d.ts +1 -1
- package/dist/toolkit/components/media/media-item.d.ts +10 -0
- package/dist/toolkit/components/ui/button.d.ts +11 -0
- package/dist/toolkit/components/ui/calendar.d.ts +8 -0
- package/dist/toolkit/components/ui/date-time-picker.d.ts +111 -0
- package/dist/toolkit/components/ui/input.d.ts +3 -0
- package/dist/toolkit/components/ui/popover.d.ts +7 -0
- package/dist/toolkit/components/ui/select.d.ts +13 -0
- package/dist/toolkit/fields/components/color-picker/block-widget.d.ts +3 -0
- package/dist/toolkit/fields/components/color-picker/color-input.d.ts +35 -0
- package/dist/toolkit/fields/components/color-picker/color-picker.d.ts +6 -2
- package/dist/toolkit/fields/components/color-picker/color-utils.d.ts +37 -0
- package/dist/toolkit/fields/components/color-picker/sketch-widget.d.ts +3 -0
- package/dist/toolkit/fields/components/select.d.ts +1 -1
- package/dist/toolkit/fields/plugins/button-toggle-field-plugin.d.ts +2 -2
- package/dist/toolkit/fields/plugins/checkbox-group-field-plugin.d.ts +2 -2
- package/dist/toolkit/fields/plugins/color-field-plugin.d.ts +1 -0
- package/dist/toolkit/fields/plugins/date-field-plugin.d.ts +0 -2
- package/dist/toolkit/fields/plugins/dnd-kit-wrapper.d.ts +49 -0
- package/dist/toolkit/fields/plugins/group-list-field-plugin.d.ts +2 -1
- package/dist/toolkit/fields/plugins/list-field-plugin.d.ts +2 -0
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/editor.d.ts +2 -2
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/blockquote-element.d.ts +1 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/button.d.ts +2 -2
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-block/code-block-element.d.ts +1 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/code-line-element.d.ts +1 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/command.d.ts +7 -7
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/list-element.d.ts +2 -2
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/paragraph-element.d.ts +1 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/slash-input-element.d.ts +1 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-cell-element.d.ts +2 -2
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-element.d.ts +1 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/table/table-row-element.d.ts +1 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/use-floating-toolbar-hook.d.ts +1 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/components.d.ts +18 -18
- package/dist/toolkit/fields/plugins/radio-group-field-plugin.d.ts +2 -2
- package/dist/toolkit/fields/plugins/select-field-plugin.d.ts +2 -2
- package/dist/toolkit/fields/plugins/toggle-field-plugin.d.ts +2 -2
- package/dist/toolkit/form-builder/create-branch-modal.d.ts +13 -0
- package/dist/toolkit/form-builder/form-builder.d.ts +0 -11
- package/dist/toolkit/form-builder/index.d.ts +1 -0
- package/dist/toolkit/icons/TinaExtended.d.ts +4 -0
- package/dist/toolkit/icons/index.d.ts +1 -0
- package/dist/toolkit/index.d.ts +1 -1
- package/dist/toolkit/plugin-branch-switcher/branch-button.d.ts +3 -1
- package/dist/toolkit/react-modals/modal/modal-actions.d.ts +2 -1
- package/dist/toolkit/react-modals/modal/modal-header.d.ts +1 -1
- package/dist/toolkit/react-sidebar/components/NavMenuTrigger.d.ts +11 -0
- package/dist/toolkit/react-sidebar/components/badge.d.ts +6 -0
- package/dist/toolkit/react-sidebar/components/callout.d.ts +5 -0
- package/dist/toolkit/react-sidebar/components/local-warning.d.ts +3 -1
- package/dist/toolkit/react-sidebar/components/nav-components.d.ts +11 -0
- package/dist/toolkit/react-sidebar/components/nav-context.d.ts +15 -0
- package/dist/toolkit/react-sidebar/components/nav.d.ts +3 -3
- package/dist/toolkit/react-sidebar/index.d.ts +3 -0
- package/dist/toolkit/styles/button.d.ts +1 -1
- package/dist/toolkit/styles/dropdown-button.d.ts +75 -0
- package/dist/toolkit/styles/index.d.ts +1 -0
- package/dist/unifiedClient/index.d.ts +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/package.json +28 -58
- package/dist/client.mjs +0 -132
- package/dist/index.mjs +0 -122628
- package/dist/node-cache-5e8db9f0.mjs +0 -63
- package/dist/react.mjs +0 -254
- package/dist/rich-text/index.mjs +0 -249
- package/dist/rich-text/prism.mjs +0 -16
- package/dist/rich-text/static.mjs +0 -236
- package/dist/toolkit/react-datetime/DateTime.d.ts +0 -135
- package/dist/toolkit/react-sidebar/components/alert.d.ts +0 -5
- /package/dist/admin/components/{Sidebar.d.ts → AdminNav.d.ts} +0 -0
|
@@ -2,7 +2,7 @@ import { BranchData, EventBus } from '@tinacms/toolkit';
|
|
|
2
2
|
import { DocumentNode, GraphQLSchema } from 'graphql';
|
|
3
3
|
import { TokenObject } from '../auth/authenticate';
|
|
4
4
|
import { AuthProvider, Schema, TinaSchema } from '@tinacms/schema-tools';
|
|
5
|
-
import { SearchClient } from '@tinacms/search/
|
|
5
|
+
import { SearchClient } from '@tinacms/search/index-client';
|
|
6
6
|
import gql from 'graphql-tag';
|
|
7
7
|
import { TinaCloudProject } from './types';
|
|
8
8
|
export * from './authProvider';
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const getRootPath = (pathParts, path) => {
|
|
2
|
+
if (pathParts.length === 0)
|
|
3
|
+
return null;
|
|
4
|
+
const isWindows = path.sep === "\\";
|
|
5
|
+
const root = pathParts[0];
|
|
6
|
+
return isWindows ? `${root}${path.sep}` : `${path.sep}${root}`;
|
|
7
|
+
};
|
|
8
|
+
const makeCacheDir = async (dir, fs, path, os) => {
|
|
9
|
+
const normalizedDir = path.normalize(dir);
|
|
10
|
+
const pathParts = normalizedDir.split(path.sep).filter(Boolean);
|
|
11
|
+
const cacheHash = pathParts[pathParts.length - 1];
|
|
12
|
+
const rootPath = getRootPath(pathParts, path);
|
|
13
|
+
const rootExists = rootPath && fs.existsSync(rootPath);
|
|
14
|
+
const cacheDir = rootExists ? normalizedDir : path.join(os.tmpdir(), cacheHash);
|
|
15
|
+
try {
|
|
16
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.warn(
|
|
19
|
+
`Warning: Failed to create cache directory: ${error.message}. Caching will be disabled.`
|
|
20
|
+
);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return cacheDir;
|
|
24
|
+
};
|
|
25
|
+
const NodeCache = async (dir) => {
|
|
26
|
+
const fs = await import("./__vite-browser-external-d06ac358.js");
|
|
27
|
+
const path = await import("./__vite-browser-external-d06ac358.js");
|
|
28
|
+
const os = await import("./__vite-browser-external-d06ac358.js");
|
|
29
|
+
const crypto = await import("./__vite-browser-external-d06ac358.js");
|
|
30
|
+
const cacheDir = await makeCacheDir(dir, fs, path, os);
|
|
31
|
+
if (cacheDir === null) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
makeKey: (key) => {
|
|
36
|
+
const input = key && key instanceof Object ? JSON.stringify(key) : key || "";
|
|
37
|
+
return crypto.createHash("sha256").update(input).digest("hex");
|
|
38
|
+
},
|
|
39
|
+
get: async (key) => {
|
|
40
|
+
let readValue;
|
|
41
|
+
const cacheFilename = path.join(cacheDir, key);
|
|
42
|
+
try {
|
|
43
|
+
const data = await fs.promises.readFile(cacheFilename, "utf-8");
|
|
44
|
+
readValue = JSON.parse(data);
|
|
45
|
+
} catch (e) {
|
|
46
|
+
if (e.code !== "ENOENT") {
|
|
47
|
+
console.warn(
|
|
48
|
+
`Warning: Failed to read cache file ${cacheFilename}: ${e.message}`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return readValue;
|
|
53
|
+
},
|
|
54
|
+
set: async (key, value) => {
|
|
55
|
+
const cacheFilename = path.join(cacheDir, key);
|
|
56
|
+
try {
|
|
57
|
+
await fs.promises.writeFile(cacheFilename, JSON.stringify(value), {
|
|
58
|
+
encoding: "utf-8",
|
|
59
|
+
flag: "wx"
|
|
60
|
+
});
|
|
61
|
+
} catch (e) {
|
|
62
|
+
if (e.code !== "EEXIST") {
|
|
63
|
+
console.warn(
|
|
64
|
+
`Warning: Failed to write cache file ${cacheFilename}: ${e.message}`
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export {
|
|
72
|
+
NodeCache,
|
|
73
|
+
makeCacheDir
|
|
74
|
+
};
|
package/dist/react.js
CHANGED
|
@@ -1,73 +1,70 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
function useTina(props) {
|
|
3
|
+
const stringifiedQuery = JSON.stringify({
|
|
4
|
+
query: props.query,
|
|
5
|
+
variables: props.variables
|
|
6
|
+
});
|
|
7
|
+
const id = React.useMemo(
|
|
8
|
+
() => hashFromQuery(stringifiedQuery),
|
|
9
|
+
[stringifiedQuery]
|
|
10
|
+
);
|
|
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);
|
|
18
|
+
const [isClient, setIsClient] = React.useState(false);
|
|
19
|
+
const [quickEditEnabled, setQuickEditEnabled] = React.useState(false);
|
|
20
|
+
const [isInTinaIframe, setIsInTinaIframe] = React.useState(false);
|
|
21
|
+
React.useEffect(() => {
|
|
22
|
+
setIsClient(true);
|
|
23
|
+
setData(processedData);
|
|
24
|
+
parent.postMessage({
|
|
25
|
+
type: "url-changed"
|
|
9
26
|
});
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
setData(processedData);
|
|
27
|
-
parent.postMessage({
|
|
28
|
-
type: "url-changed"
|
|
29
|
-
});
|
|
30
|
-
}, [id, processedData]);
|
|
31
|
-
React.useEffect(() => {
|
|
32
|
-
if (quickEditEnabled) {
|
|
33
|
-
let mouseDownHandler = function(e) {
|
|
34
|
-
const attributeNames = e.target.getAttributeNames();
|
|
35
|
-
const tinaAttribute = attributeNames.find(
|
|
36
|
-
(name) => name.startsWith("data-tina-field")
|
|
27
|
+
}, [id, processedData]);
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
if (quickEditEnabled) {
|
|
30
|
+
let mouseDownHandler = function(e) {
|
|
31
|
+
const attributeNames = e.target.getAttributeNames();
|
|
32
|
+
const tinaAttribute = attributeNames.find(
|
|
33
|
+
(name) => name.startsWith("data-tina-field")
|
|
34
|
+
);
|
|
35
|
+
let fieldName;
|
|
36
|
+
if (tinaAttribute) {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
e.stopPropagation();
|
|
39
|
+
fieldName = e.target.getAttribute(tinaAttribute);
|
|
40
|
+
} else {
|
|
41
|
+
const ancestor = e.target.closest(
|
|
42
|
+
"[data-tina-field], [data-tina-field-overlay]"
|
|
37
43
|
);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
fieldName = e.target.getAttribute(tinaAttribute);
|
|
43
|
-
} else {
|
|
44
|
-
const ancestor = e.target.closest(
|
|
45
|
-
"[data-tina-field], [data-tina-field-overlay]"
|
|
44
|
+
if (ancestor) {
|
|
45
|
+
const attributeNames2 = ancestor.getAttributeNames();
|
|
46
|
+
const tinaAttribute2 = attributeNames2.find(
|
|
47
|
+
(name) => name.startsWith("data-tina-field")
|
|
46
48
|
);
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
);
|
|
52
|
-
if (tinaAttribute2) {
|
|
53
|
-
e.preventDefault();
|
|
54
|
-
e.stopPropagation();
|
|
55
|
-
fieldName = ancestor.getAttribute(tinaAttribute2);
|
|
56
|
-
}
|
|
49
|
+
if (tinaAttribute2) {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
e.stopPropagation();
|
|
52
|
+
fieldName = ancestor.getAttribute(tinaAttribute2);
|
|
57
53
|
}
|
|
58
54
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
55
|
+
}
|
|
56
|
+
if (fieldName) {
|
|
57
|
+
if (isInTinaIframe) {
|
|
58
|
+
parent.postMessage(
|
|
59
|
+
{ type: "field:selected", fieldName },
|
|
60
|
+
window.location.origin
|
|
61
|
+
);
|
|
66
62
|
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const style = document.createElement("style");
|
|
66
|
+
style.type = "text/css";
|
|
67
|
+
style.textContent = `
|
|
71
68
|
[data-tina-field] {
|
|
72
69
|
outline: 2px dashed rgba(34,150,254,0.5);
|
|
73
70
|
transition: box-shadow ease-out 150ms;
|
|
@@ -98,160 +95,160 @@
|
|
|
98
95
|
opacity: 1;
|
|
99
96
|
}
|
|
100
97
|
`;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return () => {
|
|
105
|
-
document.removeEventListener("click", mouseDownHandler, true);
|
|
106
|
-
document.body.classList.remove("__tina-quick-editing-enabled");
|
|
107
|
-
style.remove();
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
}, [quickEditEnabled, isInTinaIframe]);
|
|
111
|
-
React.useEffect(() => {
|
|
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) => {
|
|
123
|
-
if (event.data.type === "quickEditEnabled") {
|
|
124
|
-
setQuickEditEnabled(event.data.value);
|
|
125
|
-
}
|
|
126
|
-
if (event.data.id === id && event.data.type === "updateData") {
|
|
127
|
-
const rawData = event.data.data;
|
|
128
|
-
const newlyProcessedData = addMetadata(
|
|
129
|
-
id,
|
|
130
|
-
JSON.parse(JSON.stringify(rawData)),
|
|
131
|
-
[]
|
|
132
|
-
);
|
|
133
|
-
setData(newlyProcessedData);
|
|
134
|
-
setIsInTinaIframe(true);
|
|
135
|
-
const anyTinaField = document.querySelector("[data-tina-field]");
|
|
136
|
-
if (anyTinaField) {
|
|
137
|
-
parent.postMessage(
|
|
138
|
-
{ type: "quick-edit", value: true },
|
|
139
|
-
window.location.origin
|
|
140
|
-
);
|
|
141
|
-
} else {
|
|
142
|
-
parent.postMessage(
|
|
143
|
-
{ type: "quick-edit", value: false },
|
|
144
|
-
window.location.origin
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
window.addEventListener("message", handleMessage);
|
|
98
|
+
document.head.appendChild(style);
|
|
99
|
+
document.body.classList.add("__tina-quick-editing-enabled");
|
|
100
|
+
document.addEventListener("click", mouseDownHandler, true);
|
|
150
101
|
return () => {
|
|
151
|
-
|
|
152
|
-
|
|
102
|
+
document.removeEventListener("click", mouseDownHandler, true);
|
|
103
|
+
document.body.classList.remove("__tina-quick-editing-enabled");
|
|
104
|
+
style.remove();
|
|
153
105
|
};
|
|
154
|
-
}, [id, setQuickEditEnabled]);
|
|
155
|
-
return { data, isClient };
|
|
156
|
-
}
|
|
157
|
-
function useEditState() {
|
|
158
|
-
const [edit, setEdit] = React.useState(false);
|
|
159
|
-
React.useEffect(() => {
|
|
160
|
-
if (typeof window !== "undefined") {
|
|
161
|
-
parent.postMessage({ type: "isEditMode" }, window.location.origin);
|
|
162
|
-
window.addEventListener("message", (event) => {
|
|
163
|
-
var _a;
|
|
164
|
-
if (((_a = event.data) == null ? void 0 : _a.type) === "tina:editMode") {
|
|
165
|
-
setEdit(true);
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
}, []);
|
|
170
|
-
return { edit };
|
|
171
|
-
}
|
|
172
|
-
const tinaField = (object, property, index) => {
|
|
173
|
-
const contentSource = object == null ? void 0 : object._content_source;
|
|
174
|
-
if (!contentSource) {
|
|
175
|
-
return "";
|
|
176
|
-
}
|
|
177
|
-
const { queryId, path } = contentSource;
|
|
178
|
-
if (!property) {
|
|
179
|
-
return `${queryId}---${path.join(".")}`;
|
|
180
|
-
}
|
|
181
|
-
const fullPath = typeof index === "number" ? [...path, property, index] : [...path, property];
|
|
182
|
-
return `${queryId}---${fullPath.join(".")}`;
|
|
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
106
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
107
|
+
}, [quickEditEnabled, isInTinaIframe]);
|
|
108
|
+
React.useEffect(() => {
|
|
109
|
+
if (props == null ? void 0 : props.experimental___selectFormByFormId) {
|
|
110
|
+
parent.postMessage({
|
|
111
|
+
type: "user-select-form",
|
|
112
|
+
formId: props.experimental___selectFormByFormId()
|
|
113
|
+
});
|
|
198
114
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
"_values",
|
|
207
|
-
"_internalValues",
|
|
208
|
-
"_content_source",
|
|
209
|
-
"_tina_metadata"
|
|
210
|
-
].includes(key)) {
|
|
211
|
-
transformedObj[key] = value;
|
|
212
|
-
} else {
|
|
213
|
-
transformedObj[key] = addMetadata(id, value, currentPath);
|
|
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) => {
|
|
120
|
+
if (event.data.type === "quickEditEnabled") {
|
|
121
|
+
setQuickEditEnabled(event.data.value);
|
|
214
122
|
}
|
|
123
|
+
if (event.data.id === id && event.data.type === "updateData") {
|
|
124
|
+
const rawData = event.data.data;
|
|
125
|
+
const newlyProcessedData = addMetadata(
|
|
126
|
+
id,
|
|
127
|
+
JSON.parse(JSON.stringify(rawData)),
|
|
128
|
+
[]
|
|
129
|
+
);
|
|
130
|
+
setData(newlyProcessedData);
|
|
131
|
+
setIsInTinaIframe(true);
|
|
132
|
+
const anyTinaField = document.querySelector("[data-tina-field]");
|
|
133
|
+
if (anyTinaField) {
|
|
134
|
+
parent.postMessage(
|
|
135
|
+
{ type: "quick-edit", value: true },
|
|
136
|
+
window.location.origin
|
|
137
|
+
);
|
|
138
|
+
} else {
|
|
139
|
+
parent.postMessage(
|
|
140
|
+
{ type: "quick-edit", value: false },
|
|
141
|
+
window.location.origin
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
window.addEventListener("message", handleMessage);
|
|
147
|
+
return () => {
|
|
148
|
+
window.removeEventListener("message", handleMessage);
|
|
149
|
+
parent.postMessage({ type: "close", id }, window.location.origin);
|
|
150
|
+
};
|
|
151
|
+
}, [id, setQuickEditEnabled]);
|
|
152
|
+
return { data, isClient };
|
|
153
|
+
}
|
|
154
|
+
function useEditState() {
|
|
155
|
+
const [edit, setEdit] = React.useState(false);
|
|
156
|
+
React.useEffect(() => {
|
|
157
|
+
if (typeof window !== "undefined") {
|
|
158
|
+
parent.postMessage({ type: "isEditMode" }, window.location.origin);
|
|
159
|
+
window.addEventListener("message", (event) => {
|
|
160
|
+
var _a;
|
|
161
|
+
if (((_a = event.data) == null ? void 0 : _a.type) === "tina:editMode") {
|
|
162
|
+
setEdit(true);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
215
165
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
if (value instanceof Boolean)
|
|
238
|
-
return true;
|
|
239
|
-
return false;
|
|
166
|
+
}, []);
|
|
167
|
+
return { edit };
|
|
168
|
+
}
|
|
169
|
+
const tinaField = (object, property, index) => {
|
|
170
|
+
const contentSource = object == null ? void 0 : object._content_source;
|
|
171
|
+
if (!contentSource) {
|
|
172
|
+
return "";
|
|
173
|
+
}
|
|
174
|
+
const { queryId, path } = contentSource;
|
|
175
|
+
if (!property) {
|
|
176
|
+
return `${queryId}---${path.join(".")}`;
|
|
177
|
+
}
|
|
178
|
+
const fullPath = typeof index === "number" ? [...path, property, index] : [...path, property];
|
|
179
|
+
return `${queryId}---${fullPath.join(".")}`;
|
|
180
|
+
};
|
|
181
|
+
const addMetadata = (id, obj, path = []) => {
|
|
182
|
+
if (obj === null) {
|
|
183
|
+
return obj;
|
|
184
|
+
}
|
|
185
|
+
if (isScalarOrUndefined(obj)) {
|
|
186
|
+
return obj;
|
|
240
187
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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;
|
|
209
|
+
} else {
|
|
210
|
+
transformedObj[key] = addMetadata(id, value, currentPath);
|
|
246
211
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
return
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
212
|
+
}
|
|
213
|
+
if (transformedObj && typeof transformedObj === "object" && "type" in transformedObj && transformedObj.type === "root") {
|
|
214
|
+
return transformedObj;
|
|
215
|
+
}
|
|
216
|
+
return { ...transformedObj, _content_source: { queryId: id, path } };
|
|
217
|
+
};
|
|
218
|
+
function isScalarOrUndefined(value) {
|
|
219
|
+
const type = typeof value;
|
|
220
|
+
if (type === "string")
|
|
221
|
+
return true;
|
|
222
|
+
if (type === "number")
|
|
223
|
+
return true;
|
|
224
|
+
if (type === "boolean")
|
|
225
|
+
return true;
|
|
226
|
+
if (type === "undefined")
|
|
227
|
+
return true;
|
|
228
|
+
if (value == null)
|
|
229
|
+
return true;
|
|
230
|
+
if (value instanceof String)
|
|
231
|
+
return true;
|
|
232
|
+
if (value instanceof Number)
|
|
233
|
+
return true;
|
|
234
|
+
if (value instanceof Boolean)
|
|
235
|
+
return true;
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
const hashFromQuery = (input) => {
|
|
239
|
+
let hash = 0;
|
|
240
|
+
for (let i = 0; i < input.length; i++) {
|
|
241
|
+
const char = input.charCodeAt(i);
|
|
242
|
+
hash = (hash << 5) - hash + char & 4294967295;
|
|
243
|
+
}
|
|
244
|
+
const nonNegativeHash = Math.abs(hash);
|
|
245
|
+
const alphanumericHash = nonNegativeHash.toString(36);
|
|
246
|
+
return alphanumericHash;
|
|
247
|
+
};
|
|
248
|
+
export {
|
|
249
|
+
addMetadata,
|
|
250
|
+
hashFromQuery,
|
|
251
|
+
tinaField,
|
|
252
|
+
useEditState,
|
|
253
|
+
useTina
|
|
254
|
+
};
|
|
@@ -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;
|