@prismicio/next 0.1.0 → 0.2.0-alpha.0
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/LICENSE +202 -0
- package/README.md +4 -7
- package/dist/index.cjs +66 -71
- package/dist/index.d.ts +87 -83
- package/dist/index.js +153 -0
- package/package.json +36 -38
- package/src/PrismicPreview.tsx +112 -59
- package/src/enableAutoPreviews.ts +4 -6
- package/src/exitPreview.ts +15 -27
- package/src/index.ts +11 -4
- package/src/lib/extractPreviewRefRepositoryName.ts +60 -0
- package/src/lib/getCookie.ts +51 -0
- package/src/redirectToPreviewURL.ts +77 -19
- package/src/setPreviewData.ts +3 -11
- package/src/types.ts +1 -45
- package/dist/index.mjs +0 -156
package/dist/index.mjs
DELETED
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import * as prismic from '@prismicio/client';
|
|
2
|
-
import React, { useEffect } from 'react';
|
|
3
|
-
import { PrismicToolbar } from '@prismicio/react';
|
|
4
|
-
import { useRouter } from 'next/router';
|
|
5
|
-
|
|
6
|
-
async function setPreviewData({
|
|
7
|
-
req,
|
|
8
|
-
res
|
|
9
|
-
}) {
|
|
10
|
-
const ref = req.query.token || req.cookies[prismic.cookie.preview];
|
|
11
|
-
if (ref) {
|
|
12
|
-
res.setPreviewData({ ref });
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function exitPreview(config) {
|
|
17
|
-
const { req } = config;
|
|
18
|
-
config.res.clearPreviewData();
|
|
19
|
-
if (req.headers.referer) {
|
|
20
|
-
const url = new URL(req.headers.referer);
|
|
21
|
-
if (url.pathname !== "/api/exit-preview") {
|
|
22
|
-
config.res.redirect(req.headers.referer);
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
config.res.redirect("/");
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const readValue = (value) => {
|
|
30
|
-
return value.replace(/%3B/g, ";");
|
|
31
|
-
};
|
|
32
|
-
const parse = (cookieString) => {
|
|
33
|
-
const result = {};
|
|
34
|
-
const cookies = cookieString.split("; ");
|
|
35
|
-
for (const cookie of cookies) {
|
|
36
|
-
const parts = cookie.split("=");
|
|
37
|
-
const value = parts.slice(1).join("=");
|
|
38
|
-
const name = readValue(parts[0]).replace(/%3D/g, "=");
|
|
39
|
-
result[name] = readValue(value);
|
|
40
|
-
}
|
|
41
|
-
return result;
|
|
42
|
-
};
|
|
43
|
-
const getAll = (cookieStore) => parse(cookieStore);
|
|
44
|
-
const getCookie = (name, cookieStore) => getAll(cookieStore)[name];
|
|
45
|
-
|
|
46
|
-
const extractFirstSubdomain = (host) => host.split(".")[0];
|
|
47
|
-
const extractRepositoryNameFromObjectRef = (previewRef) => {
|
|
48
|
-
try {
|
|
49
|
-
const parsed = JSON.parse(decodeURIComponent(previewRef));
|
|
50
|
-
const keys = Object.keys(parsed);
|
|
51
|
-
const domainKey = keys.find((key) => /\.prismic\.io$/.test(key));
|
|
52
|
-
if (domainKey) {
|
|
53
|
-
return extractFirstSubdomain(domainKey);
|
|
54
|
-
} else {
|
|
55
|
-
return void 0;
|
|
56
|
-
}
|
|
57
|
-
} catch (e) {
|
|
58
|
-
return void 0;
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
const extractRepositoryNameFromURLRef = (previewRef) => {
|
|
62
|
-
try {
|
|
63
|
-
const url = new URL(previewRef);
|
|
64
|
-
return extractFirstSubdomain(url.host);
|
|
65
|
-
} catch (e) {
|
|
66
|
-
return void 0;
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
const extractPreviewRefRepositoryName = (previewRef) => {
|
|
70
|
-
return extractRepositoryNameFromObjectRef(previewRef) || extractRepositoryNameFromURLRef(previewRef);
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const isPrismicUpdateToolbarEvent = (event) => {
|
|
74
|
-
return "detail" in event && typeof event.detail.ref === "string";
|
|
75
|
-
};
|
|
76
|
-
function PrismicPreview({
|
|
77
|
-
repositoryName,
|
|
78
|
-
children,
|
|
79
|
-
updatePreviewURL = "/api/preview",
|
|
80
|
-
exitPreviewURL = "/api/exit-preview"
|
|
81
|
-
}) {
|
|
82
|
-
const router = useRouter();
|
|
83
|
-
useEffect(() => {
|
|
84
|
-
const previewRefRepositoryName = extractPreviewRefRepositoryName(getCookie("io.prismic.preview", globalThis.document.cookie));
|
|
85
|
-
const startPreviewIfLoadedFromSharedLink = async () => {
|
|
86
|
-
if (previewRefRepositoryName === repositoryName && !router.isPreview) {
|
|
87
|
-
await fetch(updatePreviewURL);
|
|
88
|
-
window.location.reload();
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
startPreviewIfLoadedFromSharedLink();
|
|
92
|
-
const handlePrismicPreviewUpdate = async (event) => {
|
|
93
|
-
if (isPrismicUpdateToolbarEvent(event)) {
|
|
94
|
-
event.preventDefault();
|
|
95
|
-
await fetch(updatePreviewURL);
|
|
96
|
-
window.location.reload();
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
const handlePrismicPreviewEnd = async (event) => {
|
|
100
|
-
event.preventDefault();
|
|
101
|
-
await fetch(exitPreviewURL);
|
|
102
|
-
window.location.reload();
|
|
103
|
-
};
|
|
104
|
-
if (window) {
|
|
105
|
-
window.addEventListener("prismicPreviewUpdate", handlePrismicPreviewUpdate);
|
|
106
|
-
window.addEventListener("prismicPreviewEnd", handlePrismicPreviewEnd);
|
|
107
|
-
}
|
|
108
|
-
return () => {
|
|
109
|
-
if (window) {
|
|
110
|
-
window.removeEventListener("prismicPreviewUpdate", handlePrismicPreviewUpdate);
|
|
111
|
-
window.removeEventListener("prismicPreviewEnd", handlePrismicPreviewEnd);
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
}, []);
|
|
115
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(PrismicToolbar, {
|
|
116
|
-
repositoryName
|
|
117
|
-
}), children);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const isPrismicNextPreviewData = (previewData) => {
|
|
121
|
-
return typeof previewData === "object" && "ref" in previewData;
|
|
122
|
-
};
|
|
123
|
-
const enableAutoPreviews = (config) => {
|
|
124
|
-
if ("previewData" in config && config.previewData) {
|
|
125
|
-
const { previewData } = config;
|
|
126
|
-
if (isPrismicNextPreviewData(previewData) && previewData.ref) {
|
|
127
|
-
config.client.queryContentFromRef(previewData.ref);
|
|
128
|
-
}
|
|
129
|
-
} else if ("req" in config && config.req) {
|
|
130
|
-
config.client.enableAutoPreviewsFromReq(config.req);
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
const isPrismicNextQuery = (query) => typeof query.documentId === "string" && typeof query.token === "string";
|
|
135
|
-
async function redirectToPreviewURL({
|
|
136
|
-
req,
|
|
137
|
-
res,
|
|
138
|
-
client,
|
|
139
|
-
linkResolver,
|
|
140
|
-
defaultURL = "/"
|
|
141
|
-
}) {
|
|
142
|
-
if (isPrismicNextQuery(req.query)) {
|
|
143
|
-
const { documentId, token } = req.query;
|
|
144
|
-
const previewUrl = await client.resolvePreviewURL({
|
|
145
|
-
linkResolver,
|
|
146
|
-
defaultURL,
|
|
147
|
-
documentID: documentId,
|
|
148
|
-
previewToken: token
|
|
149
|
-
});
|
|
150
|
-
res.redirect(previewUrl);
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
res.redirect(defaultURL);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export { PrismicPreview, enableAutoPreviews, exitPreview, redirectToPreviewURL, setPreviewData };
|