decap-cms-core 3.10.1 → 3.11.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/dist/decap-cms-core.js +17 -17
- package/dist/decap-cms-core.js.map +1 -1
- package/dist/esm/actions/deploys.js +3 -2
- package/dist/esm/backend.js +5 -1
- package/dist/esm/bootstrap.js +2 -2
- package/dist/esm/components/App/StatusBar.js +1 -1
- package/dist/esm/components/Editor/EditorToolbar.js +52 -34
- package/dist/esm/components/UI/ErrorBoundary.js +9 -8
- package/dist/esm/constants/configSchema.js +9 -0
- package/dist/esm/reducers/deploys.js +8 -3
- package/index.d.ts +5 -0
- package/package.json +2 -2
- package/src/actions/deploys.ts +4 -3
- package/src/backend.ts +8 -1
- package/src/components/Editor/EditorToolbar.js +40 -3
- package/src/components/Editor/__tests__/EditorToolbar.spec.js +46 -0
- package/src/components/UI/ErrorBoundary.js +4 -3
- package/src/constants/configSchema.js +6 -0
- package/src/reducers/__tests__/deploys.spec.ts +111 -0
- package/src/reducers/deploys.ts +5 -3
- package/src/types/redux.ts +5 -0
|
@@ -8,7 +8,7 @@ import copyToClipboard from 'copy-text-to-clipboard';
|
|
|
8
8
|
import { localForage } from 'decap-cms-lib-util';
|
|
9
9
|
import { buttons, colors } from 'decap-cms-ui-default';
|
|
10
10
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
|
11
|
-
const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new
|
|
11
|
+
const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new';
|
|
12
12
|
function getIssueTemplate({
|
|
13
13
|
version,
|
|
14
14
|
provider,
|
|
@@ -43,8 +43,8 @@ function buildIssueTemplate({
|
|
|
43
43
|
let version = '';
|
|
44
44
|
if (typeof DECAP_CMS_VERSION === 'string') {
|
|
45
45
|
version = `decap-cms@${DECAP_CMS_VERSION}`;
|
|
46
|
-
} else if (typeof "3.
|
|
47
|
-
version = `decap-cms-app@${"3.
|
|
46
|
+
} else if (typeof "3.11.0" === 'string') {
|
|
47
|
+
version = `decap-cms-app@${"3.11.0"}`;
|
|
48
48
|
}
|
|
49
49
|
const template = getIssueTemplate({
|
|
50
50
|
version,
|
|
@@ -58,6 +58,7 @@ function buildIssueUrl({
|
|
|
58
58
|
title,
|
|
59
59
|
config
|
|
60
60
|
}) {
|
|
61
|
+
const issueUrl = config?.issue_reports?.url ?? ISSUE_URL;
|
|
61
62
|
try {
|
|
62
63
|
const body = buildIssueTemplate({
|
|
63
64
|
config
|
|
@@ -71,24 +72,24 @@ function buildIssueUrl({
|
|
|
71
72
|
omission: '\n...'
|
|
72
73
|
}));
|
|
73
74
|
params.append('labels', 'type: bug');
|
|
74
|
-
return `${
|
|
75
|
+
return `${issueUrl}?${params.toString()}`;
|
|
75
76
|
} catch (e) {
|
|
76
77
|
console.log(e);
|
|
77
|
-
return `${
|
|
78
|
+
return `${issueUrl}?template=bug_report.md`;
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
const ErrorBoundaryContainer = /*#__PURE__*/_styled("div", {
|
|
81
82
|
target: "emw4gx72",
|
|
82
83
|
label: "ErrorBoundaryContainer"
|
|
83
|
-
})("padding:40px;h1{font-size:28px;color:", colors.text, ";}h2{font-size:20px;}strong{color:", colors.textLead, ";font-weight:500;}hr{width:200px;margin:30px 0;border:0;height:1px;background-color:", colors.text, ";}a{color:", colors.active, ";}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
84
|
+
})("padding:40px;h1{font-size:28px;color:", colors.text, ";}h2{font-size:20px;}strong{color:", colors.textLead, ";font-weight:500;}hr{width:200px;margin:30px 0;border:0;height:1px;background-color:", colors.text, ";}a{color:", colors.active, ";}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1VJL0Vycm9yQm91bmRhcnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0V5QyIsImZpbGUiOiIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9VSS9FcnJvckJvdW5kYXJ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICdyZWFjdC1wb2x5Z2xvdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB0cnVuY2F0ZSBmcm9tICdsb2Rhc2gvdHJ1bmNhdGUnO1xuaW1wb3J0IGNvcHlUb0NsaXBib2FyZCBmcm9tICdjb3B5LXRleHQtdG8tY2xpcGJvYXJkJztcbmltcG9ydCB7IGxvY2FsRm9yYWdlIH0gZnJvbSAnZGVjYXAtY21zLWxpYi11dGlsJztcbmltcG9ydCB7IGJ1dHRvbnMsIGNvbG9ycyB9IGZyb20gJ2RlY2FwLWNtcy11aS1kZWZhdWx0JztcblxuY29uc3QgSVNTVUVfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9kZWNhcG9yZy9kZWNhcC1jbXMvaXNzdWVzL25ldyc7XG5cbmZ1bmN0aW9uIGdldElzc3VlVGVtcGxhdGUoeyB2ZXJzaW9uLCBwcm92aWRlciwgYnJvd3NlciwgY29uZmlnIH0pIHtcbiAgcmV0dXJuIGBcbioqRGVzY3JpYmUgdGhlIGJ1ZyoqXG5cbioqVG8gUmVwcm9kdWNlKipcblxuKipFeHBlY3RlZCBiZWhhdmlvcioqXG5cbioqU2NyZWVuc2hvdHMqKlxuXG4qKkFwcGxpY2FibGUgVmVyc2lvbnM6KipcbiAtIERlY2FwIENNUyB2ZXJzaW9uOiBcXGAke3ZlcnNpb259XFxgXG4gLSBHaXQgcHJvdmlkZXI6IFxcYCR7cHJvdmlkZXJ9XFxgXG4gLSBCcm93c2VyIHZlcnNpb246IFxcYCR7YnJvd3Nlcn1cXGBcblxuKipDTVMgY29uZmlndXJhdGlvbioqXG5cXGBcXGBcXGBcbiR7Y29uZmlnfVxuXFxgXFxgXFxgXG5cbioqQWRkaXRpb25hbCBjb250ZXh0KipcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KSB7XG4gIGxldCB2ZXJzaW9uID0gJyc7XG4gIGlmICh0eXBlb2YgREVDQVBfQ01TX1ZFUlNJT04gPT09ICdzdHJpbmcnKSB7XG4gICAgdmVyc2lvbiA9IGBkZWNhcC1jbXNAJHtERUNBUF9DTVNfVkVSU0lPTn1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBERUNBUF9DTVNfQVBQX1ZFUlNJT04gPT09ICdzdHJpbmcnKSB7XG4gICAgdmVyc2lvbiA9IGBkZWNhcC1jbXMtYXBwQCR7REVDQVBfQ01TX0FQUF9WRVJTSU9OfWA7XG4gIH1cbiAgY29uc3QgdGVtcGxhdGUgPSBnZXRJc3N1ZVRlbXBsYXRlKHtcbiAgICB2ZXJzaW9uLFxuICAgIHByb3ZpZGVyOiBjb25maWcuYmFja2VuZC5uYW1lLFxuICAgIGJyb3dzZXI6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgY29uZmlnOiB5YW1sLnN0cmluZ2lmeShjb25maWcpLFxuICB9KTtcblxuICByZXR1cm4gdGVtcGxhdGU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSXNzdWVVcmwoeyB0aXRsZSwgY29uZmlnIH0pIHtcbiAgY29uc3QgaXNzdWVVcmwgPSBjb25maWc/Lmlzc3VlX3JlcG9ydHM/LnVybCA/PyBJU1NVRV9VUkw7XG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuYXBwZW5kKCd0aXRsZScsIHRydW5jYXRlKHRpdGxlLCB7IGxlbmd0aDogMTAwIH0pKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdib2R5JywgdHJ1bmNhdGUoYm9keSwgeyBsZW5ndGg6IDQwMDAsIG9taXNzaW9uOiAnXFxuLi4uJyB9KSk7XG4gICAgcGFyYW1zLmFwcGVuZCgnbGFiZWxzJywgJ3R5cGU6IGJ1ZycpO1xuXG4gICAgcmV0dXJuIGAke2lzc3VlVXJsfT8ke3BhcmFtcy50b1N0cmluZygpfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICByZXR1cm4gYCR7aXNzdWVVcmx9P3RlbXBsYXRlPWJ1Z19yZXBvcnQubWRgO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQm91bmRhcnlDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiA0MHB4O1xuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDI4cHg7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuICB9XG5cbiAgaDIge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgfVxuXG4gIHN0cm9uZyB7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHRMZWFkfTtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICB9XG5cbiAgaHIge1xuICAgIHdpZHRoOiAyMDBweDtcbiAgICBtYXJnaW46IDMwcHggMDtcbiAgICBib3JkZXI6IDA7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMudGV4dH07XG4gIH1cblxuICBhIHtcbiAgICBjb2xvcjogJHtjb2xvcnMuYWN0aXZlfTtcbiAgfVxuYDtcblxuY29uc3QgUHJpdmFjeVdhcm5pbmcgPSBzdHlsZWQuc3BhbmBcbiAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuYDtcblxuY29uc3QgQ29weUJ1dHRvbiA9IHN0eWxlZC5idXR0b25gXG4gICR7YnV0dG9ucy5idXR0b259O1xuICAke2J1dHRvbnMuZGVmYXVsdH07XG4gICR7YnV0dG9ucy5ncmF5fTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMTJweCAwO1xuYDtcblxuZnVuY3Rpb24gUmVjb3ZlcmVkRW50cnkoeyBlbnRyeSwgdCB9KSB7XG4gIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGhyIC8+XG4gICAgICA8aDI+e3QoJ3VpLmVycm9yQm91bmRhcnkucmVjb3ZlcmVkRW50cnkuaGVhZGluZycpfTwvaDI+XG4gICAgICA8c3Ryb25nPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlY292ZXJlZEVudHJ5Lndhcm5pbmcnKX08L3N0cm9uZz5cbiAgICAgIDxDb3B5QnV0dG9uIG9uQ2xpY2s9eygpID0+IGNvcHlUb0NsaXBib2FyZChlbnRyeSl9PlxuICAgICAgICB7dCgndWkuZXJyb3JCb3VuZGFyeS5yZWNvdmVyZWRFbnRyeS5jb3B5QnV0dG9uTGFiZWwnKX1cbiAgICAgIDwvQ29weUJ1dHRvbj5cbiAgICAgIDxwcmU+XG4gICAgICAgIDxjb2RlPntlbnRyeX08L2NvZGU+XG4gICAgICA8L3ByZT5cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICB0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICBlcnJvck1lc3NhZ2U6ICcnLFxuICAgIGVycm9yVGl0bGU6ICcnLFxuICAgIGJhY2t1cDogJycsXG4gIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcjogdHJ1ZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3Iuc3RhY2sgfHwgZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgIGVycm9yVGl0bGU6IGVycm9yLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIE1hbnVhbGx5IHZhbGlkYXRlIFByb3BUeXBlcyAtIFJlYWN0IDE5IGJyZWFraW5nIGNoYW5nZVxuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhFcnJvckJvdW5kYXJ5LnByb3BUeXBlcywgdGhpcy5wcm9wcywgJ3Byb3AnLCAnRXJyb3JCb3VuZGFyeScpO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd0JhY2t1cCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5zdGF0ZS5lcnJvck1lc3NhZ2UgIT09IG5leHRTdGF0ZS5lcnJvck1lc3NhZ2UgfHwgdGhpcy5zdGF0ZS5iYWNrdXAgIT09IG5leHRTdGF0ZS5iYWNrdXBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dCYWNrdXApIHtcbiAgICAgIGNvbnN0IGJhY2t1cCA9IGF3YWl0IGxvY2FsRm9yYWdlLmdldEl0ZW0oJ2JhY2t1cCcpO1xuICAgICAgYmFja3VwICYmIGNvbnNvbGUubG9nKGJhY2t1cCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYmFja3VwIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGJhY2t1cCwgZXJyb3JUaXRsZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IHNob3dCYWNrdXAsIHQgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFoYXNFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JCb3VuZGFyeUNvbnRhaW5lcj5cbiAgICAgICAgPGgxPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnRpdGxlJyl9PC9oMT5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPHNwYW4+e3QoJ3VpLmVycm9yQm91bmRhcnkuZGV0YWlscycpfTwvc3Bhbj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgaHJlZj17YnVpbGRJc3N1ZVVybCh7IHRpdGxlOiBlcnJvclRpdGxlLCBjb25maWc6IHRoaXMucHJvcHMuY29uZmlnIH0pfVxuICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpc3N1ZS11cmxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlcG9ydEl0Jyl9XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnByaXZhY3lXYXJuaW5nJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFByaXZhY3lXYXJuaW5nIGtleT17aW5kZXh9PntpdGVtfTwvUHJpdmFjeVdhcm5pbmc+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGhyIC8+XG4gICAgICAgIDxoMj57dCgndWkuZXJyb3JCb3VuZGFyeS5kZXRhaWxzSGVhZGluZycpfTwvaDI+XG4gICAgICAgIDxwPntlcnJvck1lc3NhZ2V9PC9wPlxuICAgICAgICB7YmFja3VwICYmIHNob3dCYWNrdXAgJiYgPFJlY292ZXJlZEVudHJ5IGVudHJ5PXtiYWNrdXB9IHQ9e3R9IC8+fVxuICAgICAgPC9FcnJvckJvdW5kYXJ5Q29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNsYXRlKCkoRXJyb3JCb3VuZGFyeSk7XG4iXX0= */"));
|
|
84
85
|
const PrivacyWarning = /*#__PURE__*/_styled("span", {
|
|
85
86
|
target: "emw4gx71",
|
|
86
87
|
label: "PrivacyWarning"
|
|
87
|
-
})("color:", colors.text, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
88
|
+
})("color:", colors.text, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1VJL0Vycm9yQm91bmRhcnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBb0drQyIsImZpbGUiOiIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9VSS9FcnJvckJvdW5kYXJ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICdyZWFjdC1wb2x5Z2xvdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB0cnVuY2F0ZSBmcm9tICdsb2Rhc2gvdHJ1bmNhdGUnO1xuaW1wb3J0IGNvcHlUb0NsaXBib2FyZCBmcm9tICdjb3B5LXRleHQtdG8tY2xpcGJvYXJkJztcbmltcG9ydCB7IGxvY2FsRm9yYWdlIH0gZnJvbSAnZGVjYXAtY21zLWxpYi11dGlsJztcbmltcG9ydCB7IGJ1dHRvbnMsIGNvbG9ycyB9IGZyb20gJ2RlY2FwLWNtcy11aS1kZWZhdWx0JztcblxuY29uc3QgSVNTVUVfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9kZWNhcG9yZy9kZWNhcC1jbXMvaXNzdWVzL25ldyc7XG5cbmZ1bmN0aW9uIGdldElzc3VlVGVtcGxhdGUoeyB2ZXJzaW9uLCBwcm92aWRlciwgYnJvd3NlciwgY29uZmlnIH0pIHtcbiAgcmV0dXJuIGBcbioqRGVzY3JpYmUgdGhlIGJ1ZyoqXG5cbioqVG8gUmVwcm9kdWNlKipcblxuKipFeHBlY3RlZCBiZWhhdmlvcioqXG5cbioqU2NyZWVuc2hvdHMqKlxuXG4qKkFwcGxpY2FibGUgVmVyc2lvbnM6KipcbiAtIERlY2FwIENNUyB2ZXJzaW9uOiBcXGAke3ZlcnNpb259XFxgXG4gLSBHaXQgcHJvdmlkZXI6IFxcYCR7cHJvdmlkZXJ9XFxgXG4gLSBCcm93c2VyIHZlcnNpb246IFxcYCR7YnJvd3Nlcn1cXGBcblxuKipDTVMgY29uZmlndXJhdGlvbioqXG5cXGBcXGBcXGBcbiR7Y29uZmlnfVxuXFxgXFxgXFxgXG5cbioqQWRkaXRpb25hbCBjb250ZXh0KipcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KSB7XG4gIGxldCB2ZXJzaW9uID0gJyc7XG4gIGlmICh0eXBlb2YgREVDQVBfQ01TX1ZFUlNJT04gPT09ICdzdHJpbmcnKSB7XG4gICAgdmVyc2lvbiA9IGBkZWNhcC1jbXNAJHtERUNBUF9DTVNfVkVSU0lPTn1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBERUNBUF9DTVNfQVBQX1ZFUlNJT04gPT09ICdzdHJpbmcnKSB7XG4gICAgdmVyc2lvbiA9IGBkZWNhcC1jbXMtYXBwQCR7REVDQVBfQ01TX0FQUF9WRVJTSU9OfWA7XG4gIH1cbiAgY29uc3QgdGVtcGxhdGUgPSBnZXRJc3N1ZVRlbXBsYXRlKHtcbiAgICB2ZXJzaW9uLFxuICAgIHByb3ZpZGVyOiBjb25maWcuYmFja2VuZC5uYW1lLFxuICAgIGJyb3dzZXI6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgY29uZmlnOiB5YW1sLnN0cmluZ2lmeShjb25maWcpLFxuICB9KTtcblxuICByZXR1cm4gdGVtcGxhdGU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSXNzdWVVcmwoeyB0aXRsZSwgY29uZmlnIH0pIHtcbiAgY29uc3QgaXNzdWVVcmwgPSBjb25maWc/Lmlzc3VlX3JlcG9ydHM/LnVybCA/PyBJU1NVRV9VUkw7XG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuYXBwZW5kKCd0aXRsZScsIHRydW5jYXRlKHRpdGxlLCB7IGxlbmd0aDogMTAwIH0pKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdib2R5JywgdHJ1bmNhdGUoYm9keSwgeyBsZW5ndGg6IDQwMDAsIG9taXNzaW9uOiAnXFxuLi4uJyB9KSk7XG4gICAgcGFyYW1zLmFwcGVuZCgnbGFiZWxzJywgJ3R5cGU6IGJ1ZycpO1xuXG4gICAgcmV0dXJuIGAke2lzc3VlVXJsfT8ke3BhcmFtcy50b1N0cmluZygpfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICByZXR1cm4gYCR7aXNzdWVVcmx9P3RlbXBsYXRlPWJ1Z19yZXBvcnQubWRgO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQm91bmRhcnlDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiA0MHB4O1xuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDI4cHg7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuICB9XG5cbiAgaDIge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgfVxuXG4gIHN0cm9uZyB7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHRMZWFkfTtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICB9XG5cbiAgaHIge1xuICAgIHdpZHRoOiAyMDBweDtcbiAgICBtYXJnaW46IDMwcHggMDtcbiAgICBib3JkZXI6IDA7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMudGV4dH07XG4gIH1cblxuICBhIHtcbiAgICBjb2xvcjogJHtjb2xvcnMuYWN0aXZlfTtcbiAgfVxuYDtcblxuY29uc3QgUHJpdmFjeVdhcm5pbmcgPSBzdHlsZWQuc3BhbmBcbiAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuYDtcblxuY29uc3QgQ29weUJ1dHRvbiA9IHN0eWxlZC5idXR0b25gXG4gICR7YnV0dG9ucy5idXR0b259O1xuICAke2J1dHRvbnMuZGVmYXVsdH07XG4gICR7YnV0dG9ucy5ncmF5fTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMTJweCAwO1xuYDtcblxuZnVuY3Rpb24gUmVjb3ZlcmVkRW50cnkoeyBlbnRyeSwgdCB9KSB7XG4gIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGhyIC8+XG4gICAgICA8aDI+e3QoJ3VpLmVycm9yQm91bmRhcnkucmVjb3ZlcmVkRW50cnkuaGVhZGluZycpfTwvaDI+XG4gICAgICA8c3Ryb25nPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlY292ZXJlZEVudHJ5Lndhcm5pbmcnKX08L3N0cm9uZz5cbiAgICAgIDxDb3B5QnV0dG9uIG9uQ2xpY2s9eygpID0+IGNvcHlUb0NsaXBib2FyZChlbnRyeSl9PlxuICAgICAgICB7dCgndWkuZXJyb3JCb3VuZGFyeS5yZWNvdmVyZWRFbnRyeS5jb3B5QnV0dG9uTGFiZWwnKX1cbiAgICAgIDwvQ29weUJ1dHRvbj5cbiAgICAgIDxwcmU+XG4gICAgICAgIDxjb2RlPntlbnRyeX08L2NvZGU+XG4gICAgICA8L3ByZT5cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICB0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICBlcnJvck1lc3NhZ2U6ICcnLFxuICAgIGVycm9yVGl0bGU6ICcnLFxuICAgIGJhY2t1cDogJycsXG4gIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcjogdHJ1ZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3Iuc3RhY2sgfHwgZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgIGVycm9yVGl0bGU6IGVycm9yLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIE1hbnVhbGx5IHZhbGlkYXRlIFByb3BUeXBlcyAtIFJlYWN0IDE5IGJyZWFraW5nIGNoYW5nZVxuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhFcnJvckJvdW5kYXJ5LnByb3BUeXBlcywgdGhpcy5wcm9wcywgJ3Byb3AnLCAnRXJyb3JCb3VuZGFyeScpO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd0JhY2t1cCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5zdGF0ZS5lcnJvck1lc3NhZ2UgIT09IG5leHRTdGF0ZS5lcnJvck1lc3NhZ2UgfHwgdGhpcy5zdGF0ZS5iYWNrdXAgIT09IG5leHRTdGF0ZS5iYWNrdXBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dCYWNrdXApIHtcbiAgICAgIGNvbnN0IGJhY2t1cCA9IGF3YWl0IGxvY2FsRm9yYWdlLmdldEl0ZW0oJ2JhY2t1cCcpO1xuICAgICAgYmFja3VwICYmIGNvbnNvbGUubG9nKGJhY2t1cCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYmFja3VwIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGJhY2t1cCwgZXJyb3JUaXRsZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IHNob3dCYWNrdXAsIHQgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFoYXNFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JCb3VuZGFyeUNvbnRhaW5lcj5cbiAgICAgICAgPGgxPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnRpdGxlJyl9PC9oMT5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPHNwYW4+e3QoJ3VpLmVycm9yQm91bmRhcnkuZGV0YWlscycpfTwvc3Bhbj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgaHJlZj17YnVpbGRJc3N1ZVVybCh7IHRpdGxlOiBlcnJvclRpdGxlLCBjb25maWc6IHRoaXMucHJvcHMuY29uZmlnIH0pfVxuICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpc3N1ZS11cmxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlcG9ydEl0Jyl9XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnByaXZhY3lXYXJuaW5nJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFByaXZhY3lXYXJuaW5nIGtleT17aW5kZXh9PntpdGVtfTwvUHJpdmFjeVdhcm5pbmc+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGhyIC8+XG4gICAgICAgIDxoMj57dCgndWkuZXJyb3JCb3VuZGFyeS5kZXRhaWxzSGVhZGluZycpfTwvaDI+XG4gICAgICAgIDxwPntlcnJvck1lc3NhZ2V9PC9wPlxuICAgICAgICB7YmFja3VwICYmIHNob3dCYWNrdXAgJiYgPFJlY292ZXJlZEVudHJ5IGVudHJ5PXtiYWNrdXB9IHQ9e3R9IC8+fVxuICAgICAgPC9FcnJvckJvdW5kYXJ5Q29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNsYXRlKCkoRXJyb3JCb3VuZGFyeSk7XG4iXX0= */"));
|
|
88
89
|
const CopyButton = /*#__PURE__*/_styled("button", {
|
|
89
90
|
target: "emw4gx70",
|
|
90
91
|
label: "CopyButton"
|
|
91
|
-
})(buttons.button, ";", buttons.default, ";", buttons.gray, ";display:block;margin:12px 0;" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
92
|
+
})(buttons.button, ";", buttons.default, ";", buttons.gray, ";display:block;margin:12px 0;" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1VJL0Vycm9yQm91bmRhcnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0dnQyIsImZpbGUiOiIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9VSS9FcnJvckJvdW5kYXJ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICdyZWFjdC1wb2x5Z2xvdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB0cnVuY2F0ZSBmcm9tICdsb2Rhc2gvdHJ1bmNhdGUnO1xuaW1wb3J0IGNvcHlUb0NsaXBib2FyZCBmcm9tICdjb3B5LXRleHQtdG8tY2xpcGJvYXJkJztcbmltcG9ydCB7IGxvY2FsRm9yYWdlIH0gZnJvbSAnZGVjYXAtY21zLWxpYi11dGlsJztcbmltcG9ydCB7IGJ1dHRvbnMsIGNvbG9ycyB9IGZyb20gJ2RlY2FwLWNtcy11aS1kZWZhdWx0JztcblxuY29uc3QgSVNTVUVfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9kZWNhcG9yZy9kZWNhcC1jbXMvaXNzdWVzL25ldyc7XG5cbmZ1bmN0aW9uIGdldElzc3VlVGVtcGxhdGUoeyB2ZXJzaW9uLCBwcm92aWRlciwgYnJvd3NlciwgY29uZmlnIH0pIHtcbiAgcmV0dXJuIGBcbioqRGVzY3JpYmUgdGhlIGJ1ZyoqXG5cbioqVG8gUmVwcm9kdWNlKipcblxuKipFeHBlY3RlZCBiZWhhdmlvcioqXG5cbioqU2NyZWVuc2hvdHMqKlxuXG4qKkFwcGxpY2FibGUgVmVyc2lvbnM6KipcbiAtIERlY2FwIENNUyB2ZXJzaW9uOiBcXGAke3ZlcnNpb259XFxgXG4gLSBHaXQgcHJvdmlkZXI6IFxcYCR7cHJvdmlkZXJ9XFxgXG4gLSBCcm93c2VyIHZlcnNpb246IFxcYCR7YnJvd3Nlcn1cXGBcblxuKipDTVMgY29uZmlndXJhdGlvbioqXG5cXGBcXGBcXGBcbiR7Y29uZmlnfVxuXFxgXFxgXFxgXG5cbioqQWRkaXRpb25hbCBjb250ZXh0KipcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KSB7XG4gIGxldCB2ZXJzaW9uID0gJyc7XG4gIGlmICh0eXBlb2YgREVDQVBfQ01TX1ZFUlNJT04gPT09ICdzdHJpbmcnKSB7XG4gICAgdmVyc2lvbiA9IGBkZWNhcC1jbXNAJHtERUNBUF9DTVNfVkVSU0lPTn1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBERUNBUF9DTVNfQVBQX1ZFUlNJT04gPT09ICdzdHJpbmcnKSB7XG4gICAgdmVyc2lvbiA9IGBkZWNhcC1jbXMtYXBwQCR7REVDQVBfQ01TX0FQUF9WRVJTSU9OfWA7XG4gIH1cbiAgY29uc3QgdGVtcGxhdGUgPSBnZXRJc3N1ZVRlbXBsYXRlKHtcbiAgICB2ZXJzaW9uLFxuICAgIHByb3ZpZGVyOiBjb25maWcuYmFja2VuZC5uYW1lLFxuICAgIGJyb3dzZXI6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgY29uZmlnOiB5YW1sLnN0cmluZ2lmeShjb25maWcpLFxuICB9KTtcblxuICByZXR1cm4gdGVtcGxhdGU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSXNzdWVVcmwoeyB0aXRsZSwgY29uZmlnIH0pIHtcbiAgY29uc3QgaXNzdWVVcmwgPSBjb25maWc/Lmlzc3VlX3JlcG9ydHM/LnVybCA/PyBJU1NVRV9VUkw7XG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuYXBwZW5kKCd0aXRsZScsIHRydW5jYXRlKHRpdGxlLCB7IGxlbmd0aDogMTAwIH0pKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdib2R5JywgdHJ1bmNhdGUoYm9keSwgeyBsZW5ndGg6IDQwMDAsIG9taXNzaW9uOiAnXFxuLi4uJyB9KSk7XG4gICAgcGFyYW1zLmFwcGVuZCgnbGFiZWxzJywgJ3R5cGU6IGJ1ZycpO1xuXG4gICAgcmV0dXJuIGAke2lzc3VlVXJsfT8ke3BhcmFtcy50b1N0cmluZygpfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICByZXR1cm4gYCR7aXNzdWVVcmx9P3RlbXBsYXRlPWJ1Z19yZXBvcnQubWRgO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQm91bmRhcnlDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiA0MHB4O1xuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDI4cHg7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuICB9XG5cbiAgaDIge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgfVxuXG4gIHN0cm9uZyB7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHRMZWFkfTtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICB9XG5cbiAgaHIge1xuICAgIHdpZHRoOiAyMDBweDtcbiAgICBtYXJnaW46IDMwcHggMDtcbiAgICBib3JkZXI6IDA7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMudGV4dH07XG4gIH1cblxuICBhIHtcbiAgICBjb2xvcjogJHtjb2xvcnMuYWN0aXZlfTtcbiAgfVxuYDtcblxuY29uc3QgUHJpdmFjeVdhcm5pbmcgPSBzdHlsZWQuc3BhbmBcbiAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuYDtcblxuY29uc3QgQ29weUJ1dHRvbiA9IHN0eWxlZC5idXR0b25gXG4gICR7YnV0dG9ucy5idXR0b259O1xuICAke2J1dHRvbnMuZGVmYXVsdH07XG4gICR7YnV0dG9ucy5ncmF5fTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMTJweCAwO1xuYDtcblxuZnVuY3Rpb24gUmVjb3ZlcmVkRW50cnkoeyBlbnRyeSwgdCB9KSB7XG4gIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGhyIC8+XG4gICAgICA8aDI+e3QoJ3VpLmVycm9yQm91bmRhcnkucmVjb3ZlcmVkRW50cnkuaGVhZGluZycpfTwvaDI+XG4gICAgICA8c3Ryb25nPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlY292ZXJlZEVudHJ5Lndhcm5pbmcnKX08L3N0cm9uZz5cbiAgICAgIDxDb3B5QnV0dG9uIG9uQ2xpY2s9eygpID0+IGNvcHlUb0NsaXBib2FyZChlbnRyeSl9PlxuICAgICAgICB7dCgndWkuZXJyb3JCb3VuZGFyeS5yZWNvdmVyZWRFbnRyeS5jb3B5QnV0dG9uTGFiZWwnKX1cbiAgICAgIDwvQ29weUJ1dHRvbj5cbiAgICAgIDxwcmU+XG4gICAgICAgIDxjb2RlPntlbnRyeX08L2NvZGU+XG4gICAgICA8L3ByZT5cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICB0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICBlcnJvck1lc3NhZ2U6ICcnLFxuICAgIGVycm9yVGl0bGU6ICcnLFxuICAgIGJhY2t1cDogJycsXG4gIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcjogdHJ1ZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3Iuc3RhY2sgfHwgZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgIGVycm9yVGl0bGU6IGVycm9yLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIE1hbnVhbGx5IHZhbGlkYXRlIFByb3BUeXBlcyAtIFJlYWN0IDE5IGJyZWFraW5nIGNoYW5nZVxuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhFcnJvckJvdW5kYXJ5LnByb3BUeXBlcywgdGhpcy5wcm9wcywgJ3Byb3AnLCAnRXJyb3JCb3VuZGFyeScpO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd0JhY2t1cCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5zdGF0ZS5lcnJvck1lc3NhZ2UgIT09IG5leHRTdGF0ZS5lcnJvck1lc3NhZ2UgfHwgdGhpcy5zdGF0ZS5iYWNrdXAgIT09IG5leHRTdGF0ZS5iYWNrdXBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dCYWNrdXApIHtcbiAgICAgIGNvbnN0IGJhY2t1cCA9IGF3YWl0IGxvY2FsRm9yYWdlLmdldEl0ZW0oJ2JhY2t1cCcpO1xuICAgICAgYmFja3VwICYmIGNvbnNvbGUubG9nKGJhY2t1cCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYmFja3VwIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGJhY2t1cCwgZXJyb3JUaXRsZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IHNob3dCYWNrdXAsIHQgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFoYXNFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JCb3VuZGFyeUNvbnRhaW5lcj5cbiAgICAgICAgPGgxPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnRpdGxlJyl9PC9oMT5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPHNwYW4+e3QoJ3VpLmVycm9yQm91bmRhcnkuZGV0YWlscycpfTwvc3Bhbj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgaHJlZj17YnVpbGRJc3N1ZVVybCh7IHRpdGxlOiBlcnJvclRpdGxlLCBjb25maWc6IHRoaXMucHJvcHMuY29uZmlnIH0pfVxuICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpc3N1ZS11cmxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlcG9ydEl0Jyl9XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnByaXZhY3lXYXJuaW5nJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFByaXZhY3lXYXJuaW5nIGtleT17aW5kZXh9PntpdGVtfTwvUHJpdmFjeVdhcm5pbmc+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGhyIC8+XG4gICAgICAgIDxoMj57dCgndWkuZXJyb3JCb3VuZGFyeS5kZXRhaWxzSGVhZGluZycpfTwvaDI+XG4gICAgICAgIDxwPntlcnJvck1lc3NhZ2V9PC9wPlxuICAgICAgICB7YmFja3VwICYmIHNob3dCYWNrdXAgJiYgPFJlY292ZXJlZEVudHJ5IGVudHJ5PXtiYWNrdXB9IHQ9e3R9IC8+fVxuICAgICAgPC9FcnJvckJvdW5kYXJ5Q29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNsYXRlKCkoRXJyb3JCb3VuZGFyeSk7XG4iXX0= */"));
|
|
92
93
|
function RecoveredEntry({
|
|
93
94
|
entry,
|
|
94
95
|
t
|
|
@@ -281,6 +281,15 @@ function getConfigSchema() {
|
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
},
|
|
284
|
+
issue_reports: {
|
|
285
|
+
type: 'object',
|
|
286
|
+
properties: {
|
|
287
|
+
url: {
|
|
288
|
+
type: 'string',
|
|
289
|
+
examples: ['https://example.com/report-issue']
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
},
|
|
284
293
|
collections: {
|
|
285
294
|
type: 'array',
|
|
286
295
|
minItems: 1,
|
|
@@ -10,8 +10,10 @@ const deploys = produce((state, action) => {
|
|
|
10
10
|
slug
|
|
11
11
|
} = action.payload;
|
|
12
12
|
const key = `${collection}.${slug}`;
|
|
13
|
-
state[key] =
|
|
14
|
-
|
|
13
|
+
state[key] = {
|
|
14
|
+
isFetching: true,
|
|
15
|
+
status: 'PENDING'
|
|
16
|
+
};
|
|
15
17
|
break;
|
|
16
18
|
}
|
|
17
19
|
case DEPLOY_PREVIEW_SUCCESS:
|
|
@@ -34,7 +36,10 @@ const deploys = produce((state, action) => {
|
|
|
34
36
|
collection,
|
|
35
37
|
slug
|
|
36
38
|
} = action.payload;
|
|
37
|
-
|
|
39
|
+
const key = `${collection}.${slug}`;
|
|
40
|
+
state[key].isFetching = false;
|
|
41
|
+
state[key].url = undefined;
|
|
42
|
+
state[key].status = 'PENDING';
|
|
38
43
|
break;
|
|
39
44
|
}
|
|
40
45
|
}
|
package/index.d.ts
CHANGED
|
@@ -386,6 +386,10 @@ declare module 'decap-cms-core' {
|
|
|
386
386
|
allowed_hosts?: string[];
|
|
387
387
|
}
|
|
388
388
|
|
|
389
|
+
export interface CmsIssueReports {
|
|
390
|
+
url?: string;
|
|
391
|
+
}
|
|
392
|
+
|
|
389
393
|
export interface CmsConfig {
|
|
390
394
|
backend: CmsBackend;
|
|
391
395
|
collections: CmsCollection[];
|
|
@@ -403,6 +407,7 @@ declare module 'decap-cms-core' {
|
|
|
403
407
|
media_folder_relative?: boolean;
|
|
404
408
|
media_library?: CmsMediaLibrary;
|
|
405
409
|
publish_mode?: CmsPublishMode;
|
|
410
|
+
issue_reports?: CmsIssueReports;
|
|
406
411
|
load_config_file?: boolean;
|
|
407
412
|
integrations?: {
|
|
408
413
|
hooks: string[];
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "decap-cms-core",
|
|
3
3
|
"description": "Decap CMS core application, see decap-cms package for the main distribution.",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.11.0",
|
|
5
5
|
"repository": "https://github.com/decaporg/decap-cms/tree/main/packages/decap-cms-core",
|
|
6
6
|
"bugs": "https://github.com/decaporg/decap-cms/issues",
|
|
7
7
|
"module": "dist/esm/index.js",
|
|
@@ -99,5 +99,5 @@
|
|
|
99
99
|
"browser": {
|
|
100
100
|
"path": "path-browserify"
|
|
101
101
|
},
|
|
102
|
-
"gitHead": "
|
|
102
|
+
"gitHead": "af84ddd0532948c38a9da26026404518a59d0903"
|
|
103
103
|
}
|
package/src/actions/deploys.ts
CHANGED
|
@@ -55,16 +55,17 @@ export function loadDeployPreview(
|
|
|
55
55
|
slug: string,
|
|
56
56
|
entry: Entry,
|
|
57
57
|
published: boolean,
|
|
58
|
-
opts?: { maxAttempts?: number; interval?: number },
|
|
58
|
+
opts?: { maxAttempts?: number; interval?: number; signal?: AbortSignal },
|
|
59
59
|
) {
|
|
60
60
|
return async (dispatch: ThunkDispatch<State, undefined, AnyAction>, getState: () => State) => {
|
|
61
61
|
const state = getState();
|
|
62
62
|
const backend = currentBackend(state.config);
|
|
63
63
|
const collectionName = collection.get('name');
|
|
64
64
|
|
|
65
|
-
// Exit if currently fetching
|
|
65
|
+
// Exit if currently fetching, unless the caller provides a signal
|
|
66
|
+
// (indicating it manages cancellation of the previous poll externally).
|
|
66
67
|
const deployState = selectDeployPreview(state, collectionName, slug);
|
|
67
|
-
if (deployState && deployState.isFetching) {
|
|
68
|
+
if (deployState && deployState.isFetching && !opts?.signal) {
|
|
68
69
|
return;
|
|
69
70
|
}
|
|
70
71
|
|
package/src/backend.ts
CHANGED
|
@@ -1046,7 +1046,11 @@ export class Backend {
|
|
|
1046
1046
|
collection: Collection,
|
|
1047
1047
|
slug: string,
|
|
1048
1048
|
entry: EntryMap,
|
|
1049
|
-
{
|
|
1049
|
+
{
|
|
1050
|
+
maxAttempts = 1,
|
|
1051
|
+
interval = 5000,
|
|
1052
|
+
signal,
|
|
1053
|
+
}: { maxAttempts?: number; interval?: number; signal?: AbortSignal } = {},
|
|
1050
1054
|
) {
|
|
1051
1055
|
/**
|
|
1052
1056
|
* If the registered backend does not provide a `getDeployPreview` method, or
|
|
@@ -1063,6 +1067,9 @@ export class Backend {
|
|
|
1063
1067
|
let deployPreview,
|
|
1064
1068
|
count = 0;
|
|
1065
1069
|
while (!deployPreview && count < maxAttempts) {
|
|
1070
|
+
if (signal?.aborted) {
|
|
1071
|
+
return;
|
|
1072
|
+
}
|
|
1066
1073
|
count++;
|
|
1067
1074
|
deployPreview = await this.implementation.getDeployPreview(collection.get('name'), slug);
|
|
1068
1075
|
if (!deployPreview) {
|
|
@@ -230,6 +230,24 @@ const RefreshPreviewButton = styled.button`
|
|
|
230
230
|
span {
|
|
231
231
|
margin-right: 6px;
|
|
232
232
|
}
|
|
233
|
+
|
|
234
|
+
&:disabled {
|
|
235
|
+
cursor: default;
|
|
236
|
+
opacity: 0.6;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
${Icon} {
|
|
240
|
+
${props => props.$spinning && `animation: spin 1s linear infinite;`}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
@keyframes spin {
|
|
244
|
+
from {
|
|
245
|
+
transform: rotate(0deg);
|
|
246
|
+
}
|
|
247
|
+
to {
|
|
248
|
+
transform: rotate(360deg);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
233
251
|
`;
|
|
234
252
|
|
|
235
253
|
const PreviewLink = RefreshPreviewButton.withComponent('a');
|
|
@@ -285,17 +303,32 @@ export class EditorToolbar extends React.Component {
|
|
|
285
303
|
|
|
286
304
|
const { isNewEntry, loadDeployPreview } = this.props;
|
|
287
305
|
if (!isNewEntry) {
|
|
288
|
-
|
|
306
|
+
// 24 attempts × 5s interval = ~2 min polling window.
|
|
307
|
+
// With editorial workflow, saving remounts the component (navigates to
|
|
308
|
+
// the unpublished entry view), so componentDidMount is the primary
|
|
309
|
+
// polling trigger — not componentDidUpdate.
|
|
310
|
+
this._pollController = new AbortController();
|
|
311
|
+
loadDeployPreview({ maxAttempts: 24, signal: this._pollController.signal });
|
|
289
312
|
}
|
|
290
313
|
}
|
|
291
314
|
|
|
292
315
|
componentDidUpdate(prevProps) {
|
|
293
316
|
const { isNewEntry, isPersisting, loadDeployPreview } = this.props;
|
|
294
317
|
if (!isNewEntry && prevProps.isPersisting && !isPersisting) {
|
|
295
|
-
|
|
318
|
+
// Abort any in-flight poll before starting a new one.
|
|
319
|
+
this._pollController?.abort();
|
|
320
|
+
this._pollController = new AbortController();
|
|
321
|
+
// Fires on subsequent saves when the component survives (no remount).
|
|
322
|
+
// In editorial workflow the first save remounts, so this mainly
|
|
323
|
+
// covers the second-save-and-beyond case.
|
|
324
|
+
loadDeployPreview({ maxAttempts: 3, signal: this._pollController.signal });
|
|
296
325
|
}
|
|
297
326
|
}
|
|
298
327
|
|
|
328
|
+
componentWillUnmount() {
|
|
329
|
+
this._pollController?.abort();
|
|
330
|
+
}
|
|
331
|
+
|
|
299
332
|
renderSimpleControls = () => {
|
|
300
333
|
const { collection, hasChanged, isNewEntry, showDelete, onDelete, t } = this.props;
|
|
301
334
|
const canCreate = collection.get('create');
|
|
@@ -331,7 +364,11 @@ export class EditorToolbar extends React.Component {
|
|
|
331
364
|
<Icon type="new-tab" size="xsmall" />
|
|
332
365
|
</PreviewLink>
|
|
333
366
|
) : (
|
|
334
|
-
<RefreshPreviewButton
|
|
367
|
+
<RefreshPreviewButton
|
|
368
|
+
onClick={loadDeployPreview}
|
|
369
|
+
disabled={isFetching}
|
|
370
|
+
$spinning={isFetching}
|
|
371
|
+
>
|
|
335
372
|
<span>{t('editor.editorToolbar.deployPreviewPendingButtonLabel')}</span>
|
|
336
373
|
<Icon type="refresh" size="xsmall" />
|
|
337
374
|
</RefreshPreviewButton>
|
|
@@ -117,4 +117,50 @@ describe('EditorToolbar', () => {
|
|
|
117
117
|
expect(asFragment()).toMatchSnapshot();
|
|
118
118
|
});
|
|
119
119
|
});
|
|
120
|
+
|
|
121
|
+
describe('deploy preview polling', () => {
|
|
122
|
+
it('should poll with maxAttempts: 24 and an AbortSignal on mount for existing entries', () => {
|
|
123
|
+
render(<EditorToolbar {...props} isNewEntry={false} />);
|
|
124
|
+
expect(props.loadDeployPreview).toHaveBeenCalledTimes(1);
|
|
125
|
+
const opts = props.loadDeployPreview.mock.calls[0][0];
|
|
126
|
+
expect(opts.maxAttempts).toBe(24);
|
|
127
|
+
expect(opts.signal).toBeInstanceOf(AbortSignal);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should not poll on mount for new entries', () => {
|
|
131
|
+
render(<EditorToolbar {...props} isNewEntry={true} />);
|
|
132
|
+
expect(props.loadDeployPreview).not.toHaveBeenCalled();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('should poll with maxAttempts: 3 after a save completes', () => {
|
|
136
|
+
const { rerender } = render(<EditorToolbar {...props} isPersisting={true} />);
|
|
137
|
+
props.loadDeployPreview.mockClear();
|
|
138
|
+
rerender(<EditorToolbar {...props} isPersisting={false} />);
|
|
139
|
+
expect(props.loadDeployPreview).toHaveBeenCalledTimes(1);
|
|
140
|
+
const opts = props.loadDeployPreview.mock.calls[0][0];
|
|
141
|
+
expect(opts.maxAttempts).toBe(3);
|
|
142
|
+
expect(opts.signal).toBeInstanceOf(AbortSignal);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('should abort polling on unmount', () => {
|
|
146
|
+
const { unmount } = render(<EditorToolbar {...props} isNewEntry={false} />);
|
|
147
|
+
const signal = props.loadDeployPreview.mock.calls[0][0].signal;
|
|
148
|
+
expect(signal.aborted).toBe(false);
|
|
149
|
+
unmount();
|
|
150
|
+
expect(signal.aborted).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('should abort previous poll when a new save triggers a new poll', () => {
|
|
154
|
+
const { rerender } = render(<EditorToolbar {...props} isPersisting={false} />);
|
|
155
|
+
const firstSignal = props.loadDeployPreview.mock.calls[0][0].signal;
|
|
156
|
+
|
|
157
|
+
// Simulate save completing
|
|
158
|
+
rerender(<EditorToolbar {...props} isPersisting={true} />);
|
|
159
|
+
rerender(<EditorToolbar {...props} isPersisting={false} />);
|
|
160
|
+
|
|
161
|
+
expect(firstSignal.aborted).toBe(true);
|
|
162
|
+
const secondSignal = props.loadDeployPreview.mock.calls[1][0].signal;
|
|
163
|
+
expect(secondSignal.aborted).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
120
166
|
});
|
|
@@ -8,7 +8,7 @@ import copyToClipboard from 'copy-text-to-clipboard';
|
|
|
8
8
|
import { localForage } from 'decap-cms-lib-util';
|
|
9
9
|
import { buttons, colors } from 'decap-cms-ui-default';
|
|
10
10
|
|
|
11
|
-
const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new
|
|
11
|
+
const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new';
|
|
12
12
|
|
|
13
13
|
function getIssueTemplate({ version, provider, browser, config }) {
|
|
14
14
|
return `
|
|
@@ -52,6 +52,7 @@ function buildIssueTemplate({ config }) {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
function buildIssueUrl({ title, config }) {
|
|
55
|
+
const issueUrl = config?.issue_reports?.url ?? ISSUE_URL;
|
|
55
56
|
try {
|
|
56
57
|
const body = buildIssueTemplate({ config });
|
|
57
58
|
|
|
@@ -60,10 +61,10 @@ function buildIssueUrl({ title, config }) {
|
|
|
60
61
|
params.append('body', truncate(body, { length: 4000, omission: '\n...' }));
|
|
61
62
|
params.append('labels', 'type: bug');
|
|
62
63
|
|
|
63
|
-
return `${
|
|
64
|
+
return `${issueUrl}?${params.toString()}`;
|
|
64
65
|
} catch (e) {
|
|
65
66
|
console.log(e);
|
|
66
|
-
return `${
|
|
67
|
+
return `${issueUrl}?template=bug_report.md`;
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
70
|
|
|
@@ -193,6 +193,12 @@ function getConfigSchema() {
|
|
|
193
193
|
clean_accents: { type: 'boolean' },
|
|
194
194
|
},
|
|
195
195
|
},
|
|
196
|
+
issue_reports: {
|
|
197
|
+
type: 'object',
|
|
198
|
+
properties: {
|
|
199
|
+
url: { type: 'string', examples: ['https://example.com/report-issue'] },
|
|
200
|
+
},
|
|
201
|
+
},
|
|
196
202
|
collections: {
|
|
197
203
|
type: 'array',
|
|
198
204
|
minItems: 1,
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import deploys, { selectDeployPreview } from '../deploys';
|
|
2
|
+
import {
|
|
3
|
+
DEPLOY_PREVIEW_REQUEST,
|
|
4
|
+
DEPLOY_PREVIEW_SUCCESS,
|
|
5
|
+
DEPLOY_PREVIEW_FAILURE,
|
|
6
|
+
} from '../../actions/deploys';
|
|
7
|
+
|
|
8
|
+
describe('deploys reducer', () => {
|
|
9
|
+
it('should return the default state', () => {
|
|
10
|
+
const result = deploys(undefined, { type: 'UNKNOWN' });
|
|
11
|
+
expect(result).toEqual({});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
describe('DEPLOY_PREVIEW_REQUEST', () => {
|
|
15
|
+
it('should set isFetching to true and status to PENDING', () => {
|
|
16
|
+
const result = deploys(undefined, {
|
|
17
|
+
type: DEPLOY_PREVIEW_REQUEST,
|
|
18
|
+
payload: { collection: 'posts', slug: 'my-post' },
|
|
19
|
+
});
|
|
20
|
+
expect(result['posts.my-post']).toEqual({ isFetching: true, status: 'PENDING' });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should clear stale url and replace status with PENDING', () => {
|
|
24
|
+
const staleState = {
|
|
25
|
+
'posts.my-post': {
|
|
26
|
+
isFetching: false,
|
|
27
|
+
url: 'https://production.example.com/posts/my-post',
|
|
28
|
+
status: 'SUCCESS',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const result = deploys(staleState, {
|
|
32
|
+
type: DEPLOY_PREVIEW_REQUEST,
|
|
33
|
+
payload: { collection: 'posts', slug: 'my-post' },
|
|
34
|
+
});
|
|
35
|
+
expect(result['posts.my-post']).toEqual({ isFetching: true, status: 'PENDING' });
|
|
36
|
+
expect(result['posts.my-post'].url).toBeUndefined();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe('DEPLOY_PREVIEW_SUCCESS', () => {
|
|
41
|
+
it('should store the deploy preview url and status', () => {
|
|
42
|
+
const initialState = {
|
|
43
|
+
'posts.my-post': { isFetching: true },
|
|
44
|
+
};
|
|
45
|
+
const result = deploys(initialState, {
|
|
46
|
+
type: DEPLOY_PREVIEW_SUCCESS,
|
|
47
|
+
payload: {
|
|
48
|
+
collection: 'posts',
|
|
49
|
+
slug: 'my-post',
|
|
50
|
+
url: 'https://preview.example.com/posts/my-post',
|
|
51
|
+
status: 'SUCCESS',
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
expect(result['posts.my-post']).toEqual({
|
|
55
|
+
isFetching: false,
|
|
56
|
+
url: 'https://preview.example.com/posts/my-post',
|
|
57
|
+
status: 'SUCCESS',
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe('DEPLOY_PREVIEW_FAILURE', () => {
|
|
63
|
+
it('should set isFetching to false and status to PENDING', () => {
|
|
64
|
+
const initialState = {
|
|
65
|
+
'posts.my-post': { isFetching: true, status: 'PENDING' },
|
|
66
|
+
};
|
|
67
|
+
const result = deploys(initialState, {
|
|
68
|
+
type: DEPLOY_PREVIEW_FAILURE,
|
|
69
|
+
payload: { collection: 'posts', slug: 'my-post' },
|
|
70
|
+
});
|
|
71
|
+
expect(result['posts.my-post'].isFetching).toBe(false);
|
|
72
|
+
expect(result['posts.my-post'].status).toBe('PENDING');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should clear url and replace status with PENDING to prevent stale data', () => {
|
|
76
|
+
const initialState = {
|
|
77
|
+
'posts.my-post': {
|
|
78
|
+
isFetching: true,
|
|
79
|
+
url: 'https://production.example.com/posts/my-post',
|
|
80
|
+
status: 'SUCCESS',
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const result = deploys(initialState, {
|
|
84
|
+
type: DEPLOY_PREVIEW_FAILURE,
|
|
85
|
+
payload: { collection: 'posts', slug: 'my-post' },
|
|
86
|
+
});
|
|
87
|
+
expect(result['posts.my-post']).toEqual({
|
|
88
|
+
isFetching: false,
|
|
89
|
+
url: undefined,
|
|
90
|
+
status: 'PENDING',
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('selectDeployPreview', () => {
|
|
96
|
+
it('should return the deploy preview for a given collection and slug', () => {
|
|
97
|
+
const state = {
|
|
98
|
+
'posts.my-post': {
|
|
99
|
+
isFetching: false,
|
|
100
|
+
url: 'https://preview.example.com/posts/my-post',
|
|
101
|
+
status: 'SUCCESS',
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
expect(selectDeployPreview(state, 'posts', 'my-post')).toBe(state['posts.my-post']);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('should return undefined for unknown collection/slug', () => {
|
|
108
|
+
expect(selectDeployPreview({}, 'posts', 'unknown')).toBeUndefined();
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
package/src/reducers/deploys.ts
CHANGED
|
@@ -23,8 +23,7 @@ const deploys = produce((state: Deploys, action: DeploysAction) => {
|
|
|
23
23
|
case DEPLOY_PREVIEW_REQUEST: {
|
|
24
24
|
const { collection, slug } = action.payload;
|
|
25
25
|
const key = `${collection}.${slug}`;
|
|
26
|
-
state[key] =
|
|
27
|
-
state[key].isFetching = true;
|
|
26
|
+
state[key] = { isFetching: true, status: 'PENDING' };
|
|
28
27
|
break;
|
|
29
28
|
}
|
|
30
29
|
|
|
@@ -39,7 +38,10 @@ const deploys = produce((state: Deploys, action: DeploysAction) => {
|
|
|
39
38
|
|
|
40
39
|
case DEPLOY_PREVIEW_FAILURE: {
|
|
41
40
|
const { collection, slug } = action.payload;
|
|
42
|
-
|
|
41
|
+
const key = `${collection}.${slug}`;
|
|
42
|
+
state[key].isFetching = false;
|
|
43
|
+
state[key].url = undefined;
|
|
44
|
+
state[key].status = 'PENDING';
|
|
43
45
|
break;
|
|
44
46
|
}
|
|
45
47
|
}
|
package/src/types/redux.ts
CHANGED
|
@@ -399,6 +399,10 @@ export interface CmsLocalBackend {
|
|
|
399
399
|
allowed_hosts?: string[];
|
|
400
400
|
}
|
|
401
401
|
|
|
402
|
+
export interface CmsIssueReports {
|
|
403
|
+
url?: string;
|
|
404
|
+
}
|
|
405
|
+
|
|
402
406
|
export interface CmsConfig {
|
|
403
407
|
backend: CmsBackend;
|
|
404
408
|
collections: CmsCollection[];
|
|
@@ -427,6 +431,7 @@ export interface CmsConfig {
|
|
|
427
431
|
}[];
|
|
428
432
|
slug?: CmsSlug;
|
|
429
433
|
i18n?: CmsI18nConfig;
|
|
434
|
+
issue_reports?: CmsIssueReports;
|
|
430
435
|
local_backend?: boolean | CmsLocalBackend;
|
|
431
436
|
editor?: {
|
|
432
437
|
preview?: boolean;
|