decap-cms-core 3.8.1 → 3.10.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 +23 -23
- package/dist/decap-cms-core.js.LICENSE.txt +10 -0
- package/dist/decap-cms-core.js.map +1 -1
- package/dist/esm/actions/config.js +19 -0
- package/dist/esm/actions/entries.js +10 -1
- package/dist/esm/bootstrap.js +2 -2
- package/dist/esm/components/App/StatusBar.js +41 -0
- package/dist/esm/components/Collection/Entries/Pagination.js +132 -0
- package/dist/esm/components/Editor/EditorNotesPane/AddNoteForm.js +111 -0
- package/dist/esm/components/Editor/EditorNotesPane/EditorNotesPane.js +138 -0
- package/dist/esm/components/Editor/EditorNotesPane/NoteItem.js +247 -0
- package/dist/esm/components/Editor/EditorNotesPane/NotesList.js +54 -0
- package/dist/esm/components/UI/ErrorBoundary.js +6 -9
- package/dist/esm/constants/configSchema.js +41 -23
- package/dist/esm/lib/entryCache.js +145 -0
- package/dist/esm/lib/entryHelpers.js +102 -0
- package/dist/esm/lib/formatters.js +2 -1
- package/dist/esm/lib/immutableHelpers.js +21 -0
- package/dist/esm/lib/indexFileHelper.js +36 -0
- package/dist/esm/lib/pagination.js +68 -0
- package/dist/esm/reducers/collections.js +54 -5
- package/dist/esm/reducers/entries.js +9 -4
- package/index.d.ts +10 -2
- package/package.json +2 -3
- package/src/actions/__tests__/config.spec.js +4 -4
- package/src/actions/config.ts +22 -0
- package/src/actions/entries.ts +11 -1
- package/src/components/UI/ErrorBoundary.js +1 -2
- package/src/constants/__tests__/configSchema.spec.js +84 -0
- package/src/constants/configSchema.js +34 -1
- package/src/lib/__tests__/formatters.spec.js +30 -2
- package/src/lib/formatters.ts +6 -1
- package/src/reducers/__tests__/collections.spec.js +39 -0
- package/src/reducers/__tests__/entries.spec.js +3 -3
- package/src/reducers/collections.ts +52 -5
- package/src/reducers/entries.ts +13 -5
- package/src/types/redux.ts +11 -3
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import _styled from "@emotion/styled/base";
|
|
2
|
+
function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import ImmutablePropTypes from 'react-immutable-proptypes';
|
|
6
|
+
import NoteItem from './NoteItem';
|
|
7
|
+
import { jsx as ___EmotionJSX } from "@emotion/react";
|
|
8
|
+
const ListContainer = /*#__PURE__*/_styled("div", {
|
|
9
|
+
target: "etcnkr60",
|
|
10
|
+
label: "ListContainer"
|
|
11
|
+
})(process.env.NODE_ENV === "production" ? {
|
|
12
|
+
name: "1cs7bse",
|
|
13
|
+
styles: "flex:1;overflow-y:auto;padding:8px"
|
|
14
|
+
} : {
|
|
15
|
+
name: "1cs7bse",
|
|
16
|
+
styles: "flex:1;overflow-y:auto;padding:8px/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0VkaXRvci9FZGl0b3JOb3Rlc1BhbmUvTm90ZXNMaXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9nQyIsImZpbGUiOiIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9FZGl0b3IvRWRpdG9yTm90ZXNQYW5lL05vdGVzTGlzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEltbXV0YWJsZVByb3BUeXBlcyBmcm9tICdyZWFjdC1pbW11dGFibGUtcHJvcHR5cGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcblxuaW1wb3J0IE5vdGVJdGVtIGZyb20gJy4vTm90ZUl0ZW0nO1xuXG5jb25zdCBMaXN0Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgcGFkZGluZzogOHB4O1xuYDtcblxuZnVuY3Rpb24gTm90ZXNMaXN0KHsgbm90ZXMsIG9uVXBkYXRlLCBvbkRlbGV0ZSwgb25Ub2dnbGVSZXNvbHV0aW9uLCB1c2VyLCB0IH0pIHtcbiAgLy8gU29ydCBub3RlczogdW5yZXNvbHZlZCBmaXJzdCwgdGhlbiBieSBuZXdlc3RcbiAgY29uc3Qgc29ydGVkTm90ZXMgPSBub3Rlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgLy8gRmlyc3Qgc29ydCBieSByZXNvbHZlZCBzdGF0dXMgKHVucmVzb2x2ZWQgZmlyc3QpXG4gICAgaWYgKGEuZ2V0KCdyZXNvbHZlZCcpICE9PSBiLmdldCgncmVzb2x2ZWQnKSkge1xuICAgICAgcmV0dXJuIGEuZ2V0KCdyZXNvbHZlZCcpID8gMSA6IC0xO1xuICAgIH1cbiAgICAvLyBUaGVuIHNvcnQgYnkgdGltZXN0YW1wIChuZXdlc3QgZmlyc3QpXG4gICAgcmV0dXJuIG5ldyBEYXRlKGIuZ2V0KCd0aW1lc3RhbXAnKSkgLSBuZXcgRGF0ZShhLmdldCgndGltZXN0YW1wJykpO1xuICB9KTtcblxuICByZXR1cm4gKFxuICAgIDxMaXN0Q29udGFpbmVyPlxuICAgICAge3NvcnRlZE5vdGVzLm1hcChub3RlID0+IChcbiAgICAgICAgPE5vdGVJdGVtXG4gICAgICAgICAga2V5PXtub3RlLmdldCgnaWQnKX1cbiAgICAgICAgICBub3RlPXtub3RlfVxuICAgICAgICAgIG9uVXBkYXRlPXtvblVwZGF0ZX1cbiAgICAgICAgICBvbkRlbGV0ZT17b25EZWxldGV9XG4gICAgICAgICAgb25Ub2dnbGVSZXNvbHV0aW9uPXtvblRvZ2dsZVJlc29sdXRpb259XG4gICAgICAgICAgdXNlcj17dXNlcn1cbiAgICAgICAgICB0PXt0fVxuICAgICAgICAvPlxuICAgICAgKSl9XG4gICAgPC9MaXN0Q29udGFpbmVyPlxuICApO1xufVxuXG5Ob3Rlc0xpc3QucHJvcFR5cGVzID0ge1xuICBub3RlczogSW1tdXRhYmxlUHJvcFR5cGVzLmxpc3QuaXNSZXF1aXJlZCxcbiAgb25VcGRhdGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG9uRGVsZXRlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvblRvZ2dsZVJlc29sdXRpb246IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHVzZXI6IFByb3BUeXBlcy5vYmplY3QsXG4gIHQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBOb3Rlc0xpc3Q7XG4iXX0= */",
|
|
17
|
+
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
18
|
+
});
|
|
19
|
+
function NotesList({
|
|
20
|
+
notes,
|
|
21
|
+
onUpdate,
|
|
22
|
+
onDelete,
|
|
23
|
+
onToggleResolution,
|
|
24
|
+
user,
|
|
25
|
+
t
|
|
26
|
+
}) {
|
|
27
|
+
// Sort notes: unresolved first, then by newest
|
|
28
|
+
const sortedNotes = notes.sort((a, b) => {
|
|
29
|
+
// First sort by resolved status (unresolved first)
|
|
30
|
+
if (a.get('resolved') !== b.get('resolved')) {
|
|
31
|
+
return a.get('resolved') ? 1 : -1;
|
|
32
|
+
}
|
|
33
|
+
// Then sort by timestamp (newest first)
|
|
34
|
+
return new Date(b.get('timestamp')) - new Date(a.get('timestamp'));
|
|
35
|
+
});
|
|
36
|
+
return ___EmotionJSX(ListContainer, null, sortedNotes.map(note => ___EmotionJSX(NoteItem, {
|
|
37
|
+
key: note.get('id'),
|
|
38
|
+
note: note,
|
|
39
|
+
onUpdate: onUpdate,
|
|
40
|
+
onDelete: onDelete,
|
|
41
|
+
onToggleResolution: onToggleResolution,
|
|
42
|
+
user: user,
|
|
43
|
+
t: t
|
|
44
|
+
})));
|
|
45
|
+
}
|
|
46
|
+
NotesList.propTypes = {
|
|
47
|
+
notes: ImmutablePropTypes.list.isRequired,
|
|
48
|
+
onUpdate: PropTypes.func.isRequired,
|
|
49
|
+
onDelete: PropTypes.func.isRequired,
|
|
50
|
+
onToggleResolution: PropTypes.func.isRequired,
|
|
51
|
+
user: PropTypes.object,
|
|
52
|
+
t: PropTypes.func.isRequired
|
|
53
|
+
};
|
|
54
|
+
export default NotesList;
|
|
@@ -7,7 +7,6 @@ import truncate from 'lodash/truncate';
|
|
|
7
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
|
-
import cleanStack from 'clean-stack';
|
|
11
10
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
|
12
11
|
const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new?';
|
|
13
12
|
function getIssueTemplate({
|
|
@@ -44,8 +43,8 @@ function buildIssueTemplate({
|
|
|
44
43
|
let version = '';
|
|
45
44
|
if (typeof DECAP_CMS_VERSION === 'string') {
|
|
46
45
|
version = `decap-cms@${DECAP_CMS_VERSION}`;
|
|
47
|
-
} else if (typeof "3.
|
|
48
|
-
version = `decap-cms-app@${"3.
|
|
46
|
+
} else if (typeof "3.10.0" === 'string') {
|
|
47
|
+
version = `decap-cms-app@${"3.10.0"}`;
|
|
49
48
|
}
|
|
50
49
|
const template = getIssueTemplate({
|
|
51
50
|
version,
|
|
@@ -81,15 +80,15 @@ function buildIssueUrl({
|
|
|
81
80
|
const ErrorBoundaryContainer = /*#__PURE__*/_styled("div", {
|
|
82
81
|
target: "emw4gx72",
|
|
83
82
|
label: "ErrorBoundaryContainer"
|
|
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,
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1VJL0Vycm9yQm91bmRhcnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUV5QyIsImZpbGUiOiIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9VSS9FcnJvckJvdW5kYXJ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICdyZWFjdC1wb2x5Z2xvdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB0cnVuY2F0ZSBmcm9tICdsb2Rhc2gvdHJ1bmNhdGUnO1xuaW1wb3J0IGNvcHlUb0NsaXBib2FyZCBmcm9tICdjb3B5LXRleHQtdG8tY2xpcGJvYXJkJztcbmltcG9ydCB7IGxvY2FsRm9yYWdlIH0gZnJvbSAnZGVjYXAtY21zLWxpYi11dGlsJztcbmltcG9ydCB7IGJ1dHRvbnMsIGNvbG9ycyB9IGZyb20gJ2RlY2FwLWNtcy11aS1kZWZhdWx0JztcblxuY29uc3QgSVNTVUVfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9kZWNhcG9yZy9kZWNhcC1jbXMvaXNzdWVzL25ldz8nO1xuXG5mdW5jdGlvbiBnZXRJc3N1ZVRlbXBsYXRlKHsgdmVyc2lvbiwgcHJvdmlkZXIsIGJyb3dzZXIsIGNvbmZpZyB9KSB7XG4gIHJldHVybiBgXG4qKkRlc2NyaWJlIHRoZSBidWcqKlxuXG4qKlRvIFJlcHJvZHVjZSoqXG5cbioqRXhwZWN0ZWQgYmVoYXZpb3IqKlxuXG4qKlNjcmVlbnNob3RzKipcblxuKipBcHBsaWNhYmxlIFZlcnNpb25zOioqXG4gLSBEZWNhcCBDTVMgdmVyc2lvbjogXFxgJHt2ZXJzaW9ufVxcYFxuIC0gR2l0IHByb3ZpZGVyOiBcXGAke3Byb3ZpZGVyfVxcYFxuIC0gQnJvd3NlciB2ZXJzaW9uOiBcXGAke2Jyb3dzZXJ9XFxgXG5cbioqQ01TIGNvbmZpZ3VyYXRpb24qKlxuXFxgXFxgXFxgXG4ke2NvbmZpZ31cblxcYFxcYFxcYFxuXG4qKkFkZGl0aW9uYWwgY29udGV4dCoqXG5gO1xufVxuXG5mdW5jdGlvbiBidWlsZElzc3VlVGVtcGxhdGUoeyBjb25maWcgfSkge1xuICBsZXQgdmVyc2lvbiA9ICcnO1xuICBpZiAodHlwZW9mIERFQ0FQX0NNU19WRVJTSU9OID09PSAnc3RyaW5nJykge1xuICAgIHZlcnNpb24gPSBgZGVjYXAtY21zQCR7REVDQVBfQ01TX1ZFUlNJT059YDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgREVDQVBfQ01TX0FQUF9WRVJTSU9OID09PSAnc3RyaW5nJykge1xuICAgIHZlcnNpb24gPSBgZGVjYXAtY21zLWFwcEAke0RFQ0FQX0NNU19BUFBfVkVSU0lPTn1gO1xuICB9XG4gIGNvbnN0IHRlbXBsYXRlID0gZ2V0SXNzdWVUZW1wbGF0ZSh7XG4gICAgdmVyc2lvbixcbiAgICBwcm92aWRlcjogY29uZmlnLmJhY2tlbmQubmFtZSxcbiAgICBicm93c2VyOiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgIGNvbmZpZzogeWFtbC5zdHJpbmdpZnkoY29uZmlnKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHRlbXBsYXRlO1xufVxuXG5mdW5jdGlvbiBidWlsZElzc3VlVXJsKHsgdGl0bGUsIGNvbmZpZyB9KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuYXBwZW5kKCd0aXRsZScsIHRydW5jYXRlKHRpdGxlLCB7IGxlbmd0aDogMTAwIH0pKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdib2R5JywgdHJ1bmNhdGUoYm9keSwgeyBsZW5ndGg6IDQwMDAsIG9taXNzaW9uOiAnXFxuLi4uJyB9KSk7XG4gICAgcGFyYW1zLmFwcGVuZCgnbGFiZWxzJywgJ3R5cGU6IGJ1ZycpO1xuXG4gICAgcmV0dXJuIGAke0lTU1VFX1VSTH0ke3BhcmFtcy50b1N0cmluZygpfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICByZXR1cm4gYCR7SVNTVUVfVVJMfXRlbXBsYXRlPWJ1Z19yZXBvcnQubWRgO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQm91bmRhcnlDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiA0MHB4O1xuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDI4cHg7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuICB9XG5cbiAgaDIge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgfVxuXG4gIHN0cm9uZyB7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHRMZWFkfTtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICB9XG5cbiAgaHIge1xuICAgIHdpZHRoOiAyMDBweDtcbiAgICBtYXJnaW46IDMwcHggMDtcbiAgICBib3JkZXI6IDA7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMudGV4dH07XG4gIH1cblxuICBhIHtcbiAgICBjb2xvcjogJHtjb2xvcnMuYWN0aXZlfTtcbiAgfVxuYDtcblxuY29uc3QgUHJpdmFjeVdhcm5pbmcgPSBzdHlsZWQuc3BhbmBcbiAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuYDtcblxuY29uc3QgQ29weUJ1dHRvbiA9IHN0eWxlZC5idXR0b25gXG4gICR7YnV0dG9ucy5idXR0b259O1xuICAke2J1dHRvbnMuZGVmYXVsdH07XG4gICR7YnV0dG9ucy5ncmF5fTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMTJweCAwO1xuYDtcblxuZnVuY3Rpb24gUmVjb3ZlcmVkRW50cnkoeyBlbnRyeSwgdCB9KSB7XG4gIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGhyIC8+XG4gICAgICA8aDI+e3QoJ3VpLmVycm9yQm91bmRhcnkucmVjb3ZlcmVkRW50cnkuaGVhZGluZycpfTwvaDI+XG4gICAgICA8c3Ryb25nPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlY292ZXJlZEVudHJ5Lndhcm5pbmcnKX08L3N0cm9uZz5cbiAgICAgIDxDb3B5QnV0dG9uIG9uQ2xpY2s9eygpID0+IGNvcHlUb0NsaXBib2FyZChlbnRyeSl9PlxuICAgICAgICB7dCgndWkuZXJyb3JCb3VuZGFyeS5yZWNvdmVyZWRFbnRyeS5jb3B5QnV0dG9uTGFiZWwnKX1cbiAgICAgIDwvQ29weUJ1dHRvbj5cbiAgICAgIDxwcmU+XG4gICAgICAgIDxjb2RlPntlbnRyeX08L2NvZGU+XG4gICAgICA8L3ByZT5cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICB0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICBlcnJvck1lc3NhZ2U6ICcnLFxuICAgIGVycm9yVGl0bGU6ICcnLFxuICAgIGJhY2t1cDogJycsXG4gIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcjogdHJ1ZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3Iuc3RhY2sgfHwgZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgIGVycm9yVGl0bGU6IGVycm9yLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIE1hbnVhbGx5IHZhbGlkYXRlIFByb3BUeXBlcyAtIFJlYWN0IDE5IGJyZWFraW5nIGNoYW5nZVxuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhFcnJvckJvdW5kYXJ5LnByb3BUeXBlcywgdGhpcy5wcm9wcywgJ3Byb3AnLCAnRXJyb3JCb3VuZGFyeScpO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd0JhY2t1cCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5zdGF0ZS5lcnJvck1lc3NhZ2UgIT09IG5leHRTdGF0ZS5lcnJvck1lc3NhZ2UgfHwgdGhpcy5zdGF0ZS5iYWNrdXAgIT09IG5leHRTdGF0ZS5iYWNrdXBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dCYWNrdXApIHtcbiAgICAgIGNvbnN0IGJhY2t1cCA9IGF3YWl0IGxvY2FsRm9yYWdlLmdldEl0ZW0oJ2JhY2t1cCcpO1xuICAgICAgYmFja3VwICYmIGNvbnNvbGUubG9nKGJhY2t1cCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYmFja3VwIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGJhY2t1cCwgZXJyb3JUaXRsZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IHNob3dCYWNrdXAsIHQgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFoYXNFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JCb3VuZGFyeUNvbnRhaW5lcj5cbiAgICAgICAgPGgxPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnRpdGxlJyl9PC9oMT5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPHNwYW4+e3QoJ3VpLmVycm9yQm91bmRhcnkuZGV0YWlscycpfTwvc3Bhbj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgaHJlZj17YnVpbGRJc3N1ZVVybCh7IHRpdGxlOiBlcnJvclRpdGxlLCBjb25maWc6IHRoaXMucHJvcHMuY29uZmlnIH0pfVxuICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpc3N1ZS11cmxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlcG9ydEl0Jyl9XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnByaXZhY3lXYXJuaW5nJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFByaXZhY3lXYXJuaW5nIGtleT17aW5kZXh9PntpdGVtfTwvUHJpdmFjeVdhcm5pbmc+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGhyIC8+XG4gICAgICAgIDxoMj57dCgndWkuZXJyb3JCb3VuZGFyeS5kZXRhaWxzSGVhZGluZycpfTwvaDI+XG4gICAgICAgIDxwPntlcnJvck1lc3NhZ2V9PC9wPlxuICAgICAgICB7YmFja3VwICYmIHNob3dCYWNrdXAgJiYgPFJlY292ZXJlZEVudHJ5IGVudHJ5PXtiYWNrdXB9IHQ9e3R9IC8+fVxuICAgICAgPC9FcnJvckJvdW5kYXJ5Q29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNsYXRlKCkoRXJyb3JCb3VuZGFyeSk7XG4iXX0= */"));
|
|
85
84
|
const PrivacyWarning = /*#__PURE__*/_styled("span", {
|
|
86
85
|
target: "emw4gx71",
|
|
87
86
|
label: "PrivacyWarning"
|
|
88
|
-
})("color:", colors.text, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
87
|
+
})("color:", colors.text, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1VJL0Vycm9yQm91bmRhcnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUdrQyIsImZpbGUiOiIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9VSS9FcnJvckJvdW5kYXJ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICdyZWFjdC1wb2x5Z2xvdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB0cnVuY2F0ZSBmcm9tICdsb2Rhc2gvdHJ1bmNhdGUnO1xuaW1wb3J0IGNvcHlUb0NsaXBib2FyZCBmcm9tICdjb3B5LXRleHQtdG8tY2xpcGJvYXJkJztcbmltcG9ydCB7IGxvY2FsRm9yYWdlIH0gZnJvbSAnZGVjYXAtY21zLWxpYi11dGlsJztcbmltcG9ydCB7IGJ1dHRvbnMsIGNvbG9ycyB9IGZyb20gJ2RlY2FwLWNtcy11aS1kZWZhdWx0JztcblxuY29uc3QgSVNTVUVfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9kZWNhcG9yZy9kZWNhcC1jbXMvaXNzdWVzL25ldz8nO1xuXG5mdW5jdGlvbiBnZXRJc3N1ZVRlbXBsYXRlKHsgdmVyc2lvbiwgcHJvdmlkZXIsIGJyb3dzZXIsIGNvbmZpZyB9KSB7XG4gIHJldHVybiBgXG4qKkRlc2NyaWJlIHRoZSBidWcqKlxuXG4qKlRvIFJlcHJvZHVjZSoqXG5cbioqRXhwZWN0ZWQgYmVoYXZpb3IqKlxuXG4qKlNjcmVlbnNob3RzKipcblxuKipBcHBsaWNhYmxlIFZlcnNpb25zOioqXG4gLSBEZWNhcCBDTVMgdmVyc2lvbjogXFxgJHt2ZXJzaW9ufVxcYFxuIC0gR2l0IHByb3ZpZGVyOiBcXGAke3Byb3ZpZGVyfVxcYFxuIC0gQnJvd3NlciB2ZXJzaW9uOiBcXGAke2Jyb3dzZXJ9XFxgXG5cbioqQ01TIGNvbmZpZ3VyYXRpb24qKlxuXFxgXFxgXFxgXG4ke2NvbmZpZ31cblxcYFxcYFxcYFxuXG4qKkFkZGl0aW9uYWwgY29udGV4dCoqXG5gO1xufVxuXG5mdW5jdGlvbiBidWlsZElzc3VlVGVtcGxhdGUoeyBjb25maWcgfSkge1xuICBsZXQgdmVyc2lvbiA9ICcnO1xuICBpZiAodHlwZW9mIERFQ0FQX0NNU19WRVJTSU9OID09PSAnc3RyaW5nJykge1xuICAgIHZlcnNpb24gPSBgZGVjYXAtY21zQCR7REVDQVBfQ01TX1ZFUlNJT059YDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgREVDQVBfQ01TX0FQUF9WRVJTSU9OID09PSAnc3RyaW5nJykge1xuICAgIHZlcnNpb24gPSBgZGVjYXAtY21zLWFwcEAke0RFQ0FQX0NNU19BUFBfVkVSU0lPTn1gO1xuICB9XG4gIGNvbnN0IHRlbXBsYXRlID0gZ2V0SXNzdWVUZW1wbGF0ZSh7XG4gICAgdmVyc2lvbixcbiAgICBwcm92aWRlcjogY29uZmlnLmJhY2tlbmQubmFtZSxcbiAgICBicm93c2VyOiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgIGNvbmZpZzogeWFtbC5zdHJpbmdpZnkoY29uZmlnKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHRlbXBsYXRlO1xufVxuXG5mdW5jdGlvbiBidWlsZElzc3VlVXJsKHsgdGl0bGUsIGNvbmZpZyB9KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuYXBwZW5kKCd0aXRsZScsIHRydW5jYXRlKHRpdGxlLCB7IGxlbmd0aDogMTAwIH0pKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdib2R5JywgdHJ1bmNhdGUoYm9keSwgeyBsZW5ndGg6IDQwMDAsIG9taXNzaW9uOiAnXFxuLi4uJyB9KSk7XG4gICAgcGFyYW1zLmFwcGVuZCgnbGFiZWxzJywgJ3R5cGU6IGJ1ZycpO1xuXG4gICAgcmV0dXJuIGAke0lTU1VFX1VSTH0ke3BhcmFtcy50b1N0cmluZygpfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICByZXR1cm4gYCR7SVNTVUVfVVJMfXRlbXBsYXRlPWJ1Z19yZXBvcnQubWRgO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQm91bmRhcnlDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiA0MHB4O1xuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDI4cHg7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuICB9XG5cbiAgaDIge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgfVxuXG4gIHN0cm9uZyB7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHRMZWFkfTtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICB9XG5cbiAgaHIge1xuICAgIHdpZHRoOiAyMDBweDtcbiAgICBtYXJnaW46IDMwcHggMDtcbiAgICBib3JkZXI6IDA7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMudGV4dH07XG4gIH1cblxuICBhIHtcbiAgICBjb2xvcjogJHtjb2xvcnMuYWN0aXZlfTtcbiAgfVxuYDtcblxuY29uc3QgUHJpdmFjeVdhcm5pbmcgPSBzdHlsZWQuc3BhbmBcbiAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuYDtcblxuY29uc3QgQ29weUJ1dHRvbiA9IHN0eWxlZC5idXR0b25gXG4gICR7YnV0dG9ucy5idXR0b259O1xuICAke2J1dHRvbnMuZGVmYXVsdH07XG4gICR7YnV0dG9ucy5ncmF5fTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMTJweCAwO1xuYDtcblxuZnVuY3Rpb24gUmVjb3ZlcmVkRW50cnkoeyBlbnRyeSwgdCB9KSB7XG4gIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGhyIC8+XG4gICAgICA8aDI+e3QoJ3VpLmVycm9yQm91bmRhcnkucmVjb3ZlcmVkRW50cnkuaGVhZGluZycpfTwvaDI+XG4gICAgICA8c3Ryb25nPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlY292ZXJlZEVudHJ5Lndhcm5pbmcnKX08L3N0cm9uZz5cbiAgICAgIDxDb3B5QnV0dG9uIG9uQ2xpY2s9eygpID0+IGNvcHlUb0NsaXBib2FyZChlbnRyeSl9PlxuICAgICAgICB7dCgndWkuZXJyb3JCb3VuZGFyeS5yZWNvdmVyZWRFbnRyeS5jb3B5QnV0dG9uTGFiZWwnKX1cbiAgICAgIDwvQ29weUJ1dHRvbj5cbiAgICAgIDxwcmU+XG4gICAgICAgIDxjb2RlPntlbnRyeX08L2NvZGU+XG4gICAgICA8L3ByZT5cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICB0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICBlcnJvck1lc3NhZ2U6ICcnLFxuICAgIGVycm9yVGl0bGU6ICcnLFxuICAgIGJhY2t1cDogJycsXG4gIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcjogdHJ1ZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3Iuc3RhY2sgfHwgZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgIGVycm9yVGl0bGU6IGVycm9yLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIE1hbnVhbGx5IHZhbGlkYXRlIFByb3BUeXBlcyAtIFJlYWN0IDE5IGJyZWFraW5nIGNoYW5nZVxuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhFcnJvckJvdW5kYXJ5LnByb3BUeXBlcywgdGhpcy5wcm9wcywgJ3Byb3AnLCAnRXJyb3JCb3VuZGFyeScpO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd0JhY2t1cCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5zdGF0ZS5lcnJvck1lc3NhZ2UgIT09IG5leHRTdGF0ZS5lcnJvck1lc3NhZ2UgfHwgdGhpcy5zdGF0ZS5iYWNrdXAgIT09IG5leHRTdGF0ZS5iYWNrdXBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dCYWNrdXApIHtcbiAgICAgIGNvbnN0IGJhY2t1cCA9IGF3YWl0IGxvY2FsRm9yYWdlLmdldEl0ZW0oJ2JhY2t1cCcpO1xuICAgICAgYmFja3VwICYmIGNvbnNvbGUubG9nKGJhY2t1cCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYmFja3VwIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGJhY2t1cCwgZXJyb3JUaXRsZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IHNob3dCYWNrdXAsIHQgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFoYXNFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JCb3VuZGFyeUNvbnRhaW5lcj5cbiAgICAgICAgPGgxPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnRpdGxlJyl9PC9oMT5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPHNwYW4+e3QoJ3VpLmVycm9yQm91bmRhcnkuZGV0YWlscycpfTwvc3Bhbj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgaHJlZj17YnVpbGRJc3N1ZVVybCh7IHRpdGxlOiBlcnJvclRpdGxlLCBjb25maWc6IHRoaXMucHJvcHMuY29uZmlnIH0pfVxuICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpc3N1ZS11cmxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlcG9ydEl0Jyl9XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnByaXZhY3lXYXJuaW5nJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFByaXZhY3lXYXJuaW5nIGtleT17aW5kZXh9PntpdGVtfTwvUHJpdmFjeVdhcm5pbmc+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGhyIC8+XG4gICAgICAgIDxoMj57dCgndWkuZXJyb3JCb3VuZGFyeS5kZXRhaWxzSGVhZGluZycpfTwvaDI+XG4gICAgICAgIDxwPntlcnJvck1lc3NhZ2V9PC9wPlxuICAgICAgICB7YmFja3VwICYmIHNob3dCYWNrdXAgJiYgPFJlY292ZXJlZEVudHJ5IGVudHJ5PXtiYWNrdXB9IHQ9e3R9IC8+fVxuICAgICAgPC9FcnJvckJvdW5kYXJ5Q29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNsYXRlKCkoRXJyb3JCb3VuZGFyeSk7XG4iXX0= */"));
|
|
89
88
|
const CopyButton = /*#__PURE__*/_styled("button", {
|
|
90
89
|
target: "emw4gx70",
|
|
91
90
|
label: "CopyButton"
|
|
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,
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1VJL0Vycm9yQm91bmRhcnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBdUdnQyIsImZpbGUiOiIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9VSS9FcnJvckJvdW5kYXJ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICdyZWFjdC1wb2x5Z2xvdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB0cnVuY2F0ZSBmcm9tICdsb2Rhc2gvdHJ1bmNhdGUnO1xuaW1wb3J0IGNvcHlUb0NsaXBib2FyZCBmcm9tICdjb3B5LXRleHQtdG8tY2xpcGJvYXJkJztcbmltcG9ydCB7IGxvY2FsRm9yYWdlIH0gZnJvbSAnZGVjYXAtY21zLWxpYi11dGlsJztcbmltcG9ydCB7IGJ1dHRvbnMsIGNvbG9ycyB9IGZyb20gJ2RlY2FwLWNtcy11aS1kZWZhdWx0JztcblxuY29uc3QgSVNTVUVfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9kZWNhcG9yZy9kZWNhcC1jbXMvaXNzdWVzL25ldz8nO1xuXG5mdW5jdGlvbiBnZXRJc3N1ZVRlbXBsYXRlKHsgdmVyc2lvbiwgcHJvdmlkZXIsIGJyb3dzZXIsIGNvbmZpZyB9KSB7XG4gIHJldHVybiBgXG4qKkRlc2NyaWJlIHRoZSBidWcqKlxuXG4qKlRvIFJlcHJvZHVjZSoqXG5cbioqRXhwZWN0ZWQgYmVoYXZpb3IqKlxuXG4qKlNjcmVlbnNob3RzKipcblxuKipBcHBsaWNhYmxlIFZlcnNpb25zOioqXG4gLSBEZWNhcCBDTVMgdmVyc2lvbjogXFxgJHt2ZXJzaW9ufVxcYFxuIC0gR2l0IHByb3ZpZGVyOiBcXGAke3Byb3ZpZGVyfVxcYFxuIC0gQnJvd3NlciB2ZXJzaW9uOiBcXGAke2Jyb3dzZXJ9XFxgXG5cbioqQ01TIGNvbmZpZ3VyYXRpb24qKlxuXFxgXFxgXFxgXG4ke2NvbmZpZ31cblxcYFxcYFxcYFxuXG4qKkFkZGl0aW9uYWwgY29udGV4dCoqXG5gO1xufVxuXG5mdW5jdGlvbiBidWlsZElzc3VlVGVtcGxhdGUoeyBjb25maWcgfSkge1xuICBsZXQgdmVyc2lvbiA9ICcnO1xuICBpZiAodHlwZW9mIERFQ0FQX0NNU19WRVJTSU9OID09PSAnc3RyaW5nJykge1xuICAgIHZlcnNpb24gPSBgZGVjYXAtY21zQCR7REVDQVBfQ01TX1ZFUlNJT059YDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgREVDQVBfQ01TX0FQUF9WRVJTSU9OID09PSAnc3RyaW5nJykge1xuICAgIHZlcnNpb24gPSBgZGVjYXAtY21zLWFwcEAke0RFQ0FQX0NNU19BUFBfVkVSU0lPTn1gO1xuICB9XG4gIGNvbnN0IHRlbXBsYXRlID0gZ2V0SXNzdWVUZW1wbGF0ZSh7XG4gICAgdmVyc2lvbixcbiAgICBwcm92aWRlcjogY29uZmlnLmJhY2tlbmQubmFtZSxcbiAgICBicm93c2VyOiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgIGNvbmZpZzogeWFtbC5zdHJpbmdpZnkoY29uZmlnKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHRlbXBsYXRlO1xufVxuXG5mdW5jdGlvbiBidWlsZElzc3VlVXJsKHsgdGl0bGUsIGNvbmZpZyB9KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYm9keSA9IGJ1aWxkSXNzdWVUZW1wbGF0ZSh7IGNvbmZpZyB9KTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuYXBwZW5kKCd0aXRsZScsIHRydW5jYXRlKHRpdGxlLCB7IGxlbmd0aDogMTAwIH0pKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdib2R5JywgdHJ1bmNhdGUoYm9keSwgeyBsZW5ndGg6IDQwMDAsIG9taXNzaW9uOiAnXFxuLi4uJyB9KSk7XG4gICAgcGFyYW1zLmFwcGVuZCgnbGFiZWxzJywgJ3R5cGU6IGJ1ZycpO1xuXG4gICAgcmV0dXJuIGAke0lTU1VFX1VSTH0ke3BhcmFtcy50b1N0cmluZygpfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgICByZXR1cm4gYCR7SVNTVUVfVVJMfXRlbXBsYXRlPWJ1Z19yZXBvcnQubWRgO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQm91bmRhcnlDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiA0MHB4O1xuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDI4cHg7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuICB9XG5cbiAgaDIge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgfVxuXG4gIHN0cm9uZyB7XG4gICAgY29sb3I6ICR7Y29sb3JzLnRleHRMZWFkfTtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICB9XG5cbiAgaHIge1xuICAgIHdpZHRoOiAyMDBweDtcbiAgICBtYXJnaW46IDMwcHggMDtcbiAgICBib3JkZXI6IDA7XG4gICAgaGVpZ2h0OiAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMudGV4dH07XG4gIH1cblxuICBhIHtcbiAgICBjb2xvcjogJHtjb2xvcnMuYWN0aXZlfTtcbiAgfVxuYDtcblxuY29uc3QgUHJpdmFjeVdhcm5pbmcgPSBzdHlsZWQuc3BhbmBcbiAgY29sb3I6ICR7Y29sb3JzLnRleHR9O1xuYDtcblxuY29uc3QgQ29weUJ1dHRvbiA9IHN0eWxlZC5idXR0b25gXG4gICR7YnV0dG9ucy5idXR0b259O1xuICAke2J1dHRvbnMuZGVmYXVsdH07XG4gICR7YnV0dG9ucy5ncmF5fTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMTJweCAwO1xuYDtcblxuZnVuY3Rpb24gUmVjb3ZlcmVkRW50cnkoeyBlbnRyeSwgdCB9KSB7XG4gIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGhyIC8+XG4gICAgICA8aDI+e3QoJ3VpLmVycm9yQm91bmRhcnkucmVjb3ZlcmVkRW50cnkuaGVhZGluZycpfTwvaDI+XG4gICAgICA8c3Ryb25nPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlY292ZXJlZEVudHJ5Lndhcm5pbmcnKX08L3N0cm9uZz5cbiAgICAgIDxDb3B5QnV0dG9uIG9uQ2xpY2s9eygpID0+IGNvcHlUb0NsaXBib2FyZChlbnRyeSl9PlxuICAgICAgICB7dCgndWkuZXJyb3JCb3VuZGFyeS5yZWNvdmVyZWRFbnRyeS5jb3B5QnV0dG9uTGFiZWwnKX1cbiAgICAgIDwvQ29weUJ1dHRvbj5cbiAgICAgIDxwcmU+XG4gICAgICAgIDxjb2RlPntlbnRyeX08L2NvZGU+XG4gICAgICA8L3ByZT5cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICB0OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICBlcnJvck1lc3NhZ2U6ICcnLFxuICAgIGVycm9yVGl0bGU6ICcnLFxuICAgIGJhY2t1cDogJycsXG4gIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcjogdHJ1ZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3Iuc3RhY2sgfHwgZXJyb3IudG9TdHJpbmcoKSxcbiAgICAgIGVycm9yVGl0bGU6IGVycm9yLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIE1hbnVhbGx5IHZhbGlkYXRlIFByb3BUeXBlcyAtIFJlYWN0IDE5IGJyZWFraW5nIGNoYW5nZVxuICAgIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyhFcnJvckJvdW5kYXJ5LnByb3BUeXBlcywgdGhpcy5wcm9wcywgJ3Byb3AnLCAnRXJyb3JCb3VuZGFyeScpO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd0JhY2t1cCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5zdGF0ZS5lcnJvck1lc3NhZ2UgIT09IG5leHRTdGF0ZS5lcnJvck1lc3NhZ2UgfHwgdGhpcy5zdGF0ZS5iYWNrdXAgIT09IG5leHRTdGF0ZS5iYWNrdXBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnNob3dCYWNrdXApIHtcbiAgICAgIGNvbnN0IGJhY2t1cCA9IGF3YWl0IGxvY2FsRm9yYWdlLmdldEl0ZW0oJ2JhY2t1cCcpO1xuICAgICAgYmFja3VwICYmIGNvbnNvbGUubG9nKGJhY2t1cCk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYmFja3VwIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGJhY2t1cCwgZXJyb3JUaXRsZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IHNob3dCYWNrdXAsIHQgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKCFoYXNFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8RXJyb3JCb3VuZGFyeUNvbnRhaW5lcj5cbiAgICAgICAgPGgxPnt0KCd1aS5lcnJvckJvdW5kYXJ5LnRpdGxlJyl9PC9oMT5cbiAgICAgICAgPHA+XG4gICAgICAgICAgPHNwYW4+e3QoJ3VpLmVycm9yQm91bmRhcnkuZGV0YWlscycpfTwvc3Bhbj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgaHJlZj17YnVpbGRJc3N1ZVVybCh7IHRpdGxlOiBlcnJvclRpdGxlLCBjb25maWc6IHRoaXMucHJvcHMuY29uZmlnIH0pfVxuICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpc3N1ZS11cmxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnJlcG9ydEl0Jyl9XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt0KCd1aS5lcnJvckJvdW5kYXJ5LnByaXZhY3lXYXJuaW5nJylcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPFByaXZhY3lXYXJuaW5nIGtleT17aW5kZXh9PntpdGVtfTwvUHJpdmFjeVdhcm5pbmc+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGhyIC8+XG4gICAgICAgIDxoMj57dCgndWkuZXJyb3JCb3VuZGFyeS5kZXRhaWxzSGVhZGluZycpfTwvaDI+XG4gICAgICAgIDxwPntlcnJvck1lc3NhZ2V9PC9wPlxuICAgICAgICB7YmFja3VwICYmIHNob3dCYWNrdXAgJiYgPFJlY292ZXJlZEVudHJ5IGVudHJ5PXtiYWNrdXB9IHQ9e3R9IC8+fVxuICAgICAgPC9FcnJvckJvdW5kYXJ5Q29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNsYXRlKCkoRXJyb3JCb3VuZGFyeSk7XG4iXX0= */"));
|
|
93
92
|
function RecoveredEntry({
|
|
94
93
|
entry,
|
|
95
94
|
t
|
|
@@ -115,9 +114,7 @@ export class ErrorBoundary extends React.Component {
|
|
|
115
114
|
console.error(error);
|
|
116
115
|
return {
|
|
117
116
|
hasError: true,
|
|
118
|
-
errorMessage:
|
|
119
|
-
basePath: window.location.origin || ''
|
|
120
|
-
}),
|
|
117
|
+
errorMessage: error.stack || error.toString(),
|
|
121
118
|
errorTitle: error.toString()
|
|
122
119
|
};
|
|
123
120
|
}
|
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
function _extendableBuiltin(cls) {
|
|
2
|
-
function ExtendableBuiltin() {
|
|
3
|
-
var instance = Reflect.construct(cls, Array.from(arguments));
|
|
4
|
-
Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
|
|
5
|
-
return instance;
|
|
6
|
-
}
|
|
7
|
-
ExtendableBuiltin.prototype = Object.create(cls.prototype, {
|
|
8
|
-
constructor: {
|
|
9
|
-
value: cls,
|
|
10
|
-
enumerable: false,
|
|
11
|
-
writable: true,
|
|
12
|
-
configurable: true
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
if (Object.setPrototypeOf) {
|
|
16
|
-
Object.setPrototypeOf(ExtendableBuiltin, cls);
|
|
17
|
-
} else {
|
|
18
|
-
ExtendableBuiltin.__proto__ = cls;
|
|
19
|
-
}
|
|
20
|
-
return ExtendableBuiltin;
|
|
21
|
-
}
|
|
22
1
|
import AJV from 'ajv';
|
|
23
2
|
import { select, uniqueItemProperties, instanceof as instanceOf, prohibited } from 'ajv-keywords/dist/keywords';
|
|
24
3
|
import ajvErrors from 'ajv-errors';
|
|
@@ -410,7 +389,29 @@ function getConfigSchema() {
|
|
|
410
389
|
sortable_fields: {
|
|
411
390
|
type: 'array',
|
|
412
391
|
items: {
|
|
413
|
-
|
|
392
|
+
oneOf: [{
|
|
393
|
+
type: 'string'
|
|
394
|
+
}, {
|
|
395
|
+
type: 'object',
|
|
396
|
+
properties: {
|
|
397
|
+
field: {
|
|
398
|
+
type: 'string'
|
|
399
|
+
},
|
|
400
|
+
label: {
|
|
401
|
+
type: 'string'
|
|
402
|
+
},
|
|
403
|
+
default_sort: {
|
|
404
|
+
oneOf: [{
|
|
405
|
+
type: 'boolean'
|
|
406
|
+
}, {
|
|
407
|
+
type: 'string',
|
|
408
|
+
enum: ['asc', 'desc']
|
|
409
|
+
}]
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
required: ['field'],
|
|
413
|
+
additionalProperties: false
|
|
414
|
+
}]
|
|
414
415
|
}
|
|
415
416
|
},
|
|
416
417
|
sortableFields: {
|
|
@@ -523,7 +524,7 @@ function getWidgetSchemas() {
|
|
|
523
524
|
}));
|
|
524
525
|
return Object.assign(...schemas);
|
|
525
526
|
}
|
|
526
|
-
class ConfigError extends
|
|
527
|
+
class ConfigError extends Error {
|
|
527
528
|
constructor(errors, ...args) {
|
|
528
529
|
const message = errors.map(({
|
|
529
530
|
message,
|
|
@@ -602,4 +603,21 @@ export function validateConfig(config) {
|
|
|
602
603
|
console.error('Config Errors', errors);
|
|
603
604
|
throw new ConfigError(errors);
|
|
604
605
|
}
|
|
606
|
+
|
|
607
|
+
// Custom validation: only one sortable field can have default_sort property
|
|
608
|
+
if (config.collections) {
|
|
609
|
+
config.collections.forEach((collection, index) => {
|
|
610
|
+
if (collection.sortable_fields) {
|
|
611
|
+
const defaultFields = collection.sortable_fields.filter(field => typeof field === 'object' && field.default_sort !== undefined);
|
|
612
|
+
if (defaultFields.length > 1) {
|
|
613
|
+
const error = {
|
|
614
|
+
instancePath: `/collections/${index}/sortable_fields`,
|
|
615
|
+
message: 'only one sortable field can have the default_sort property'
|
|
616
|
+
};
|
|
617
|
+
console.error('Config Errors', [error]);
|
|
618
|
+
throw new ConfigError([error]);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
}
|
|
605
623
|
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entry Cache Module
|
|
3
|
+
*
|
|
4
|
+
* Provides localStorage-based caching for collection entries to improve performance
|
|
5
|
+
* when navigating between pages, sorting, or filtering.
|
|
6
|
+
*
|
|
7
|
+
* Cache Strategy:
|
|
8
|
+
* - Store fetched entries with timestamps
|
|
9
|
+
* - Invalidate on entry changes (persist, delete)
|
|
10
|
+
* - Time-based expiration (default: 5 minutes)
|
|
11
|
+
* - Collection-specific cache keys
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import localForage from 'decap-cms-lib-util/src/localForage';
|
|
15
|
+
const CACHE_PREFIX = 'decap_entry_cache_';
|
|
16
|
+
const CACHE_EXPIRATION_MS = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generate cache key for a collection
|
|
20
|
+
*/
|
|
21
|
+
function getCacheKey(collectionName) {
|
|
22
|
+
return `${CACHE_PREFIX}${collectionName}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Check if cached data is still valid
|
|
27
|
+
*/
|
|
28
|
+
function isCacheValid(cacheEntry) {
|
|
29
|
+
if (!cacheEntry) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
const age = now - cacheEntry.timestamp;
|
|
34
|
+
return age < CACHE_EXPIRATION_MS;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Get cached entries for a collection
|
|
39
|
+
*
|
|
40
|
+
* @param collectionName - Name of the collection
|
|
41
|
+
* @returns Cached entries or null if cache miss/expired
|
|
42
|
+
*/
|
|
43
|
+
export async function getCachedEntries(collectionName) {
|
|
44
|
+
try {
|
|
45
|
+
const cacheKey = getCacheKey(collectionName);
|
|
46
|
+
const cached = await localForage.getItem(cacheKey);
|
|
47
|
+
if (cached && isCacheValid(cached)) {
|
|
48
|
+
console.log(`[EntryCache] Cache HIT for collection: ${collectionName}`);
|
|
49
|
+
return cached.entries;
|
|
50
|
+
}
|
|
51
|
+
console.log(`[EntryCache] Cache MISS for collection: ${collectionName}`);
|
|
52
|
+
return null;
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.warn('[EntryCache] Error reading cache:', error);
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Store entries in cache
|
|
61
|
+
*
|
|
62
|
+
* @param collectionName - Name of the collection
|
|
63
|
+
* @param entries - Entries to cache
|
|
64
|
+
*/
|
|
65
|
+
export async function setCachedEntries(collectionName, entries) {
|
|
66
|
+
try {
|
|
67
|
+
const cacheKey = getCacheKey(collectionName);
|
|
68
|
+
const cacheEntry = {
|
|
69
|
+
entries,
|
|
70
|
+
timestamp: Date.now(),
|
|
71
|
+
collectionName,
|
|
72
|
+
version: 1
|
|
73
|
+
};
|
|
74
|
+
await localForage.setItem(cacheKey, cacheEntry);
|
|
75
|
+
console.log(`[EntryCache] Cached ${entries.length} entries for collection: ${collectionName}`);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.warn('[EntryCache] Error writing cache:', error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Invalidate cache for a specific collection
|
|
83
|
+
*
|
|
84
|
+
* Should be called when:
|
|
85
|
+
* - Entry is created
|
|
86
|
+
* - Entry is updated
|
|
87
|
+
* - Entry is deleted
|
|
88
|
+
*
|
|
89
|
+
* @param collectionName - Name of the collection to invalidate
|
|
90
|
+
*/
|
|
91
|
+
export async function invalidateCollectionCache(collectionName) {
|
|
92
|
+
try {
|
|
93
|
+
const cacheKey = getCacheKey(collectionName);
|
|
94
|
+
await localForage.removeItem(cacheKey);
|
|
95
|
+
console.log(`[EntryCache] Invalidated cache for collection: ${collectionName}`);
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.warn('[EntryCache] Error invalidating cache:', error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Clear all entry caches
|
|
103
|
+
*
|
|
104
|
+
* Useful for logout or manual cache clearing
|
|
105
|
+
*/
|
|
106
|
+
export async function clearAllEntryCaches() {
|
|
107
|
+
try {
|
|
108
|
+
const keys = await localForage.keys();
|
|
109
|
+
const cacheKeys = keys.filter(key => key.startsWith(CACHE_PREFIX));
|
|
110
|
+
await Promise.all(cacheKeys.map(key => localForage.removeItem(key)));
|
|
111
|
+
console.log(`[EntryCache] Cleared ${cacheKeys.length} collection caches`);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
console.warn('[EntryCache] Error clearing all caches:', error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get cache statistics for debugging
|
|
119
|
+
*/
|
|
120
|
+
export async function getCacheStats() {
|
|
121
|
+
try {
|
|
122
|
+
const keys = await localForage.keys();
|
|
123
|
+
const cacheKeys = keys.filter(key => key.startsWith(CACHE_PREFIX));
|
|
124
|
+
const cacheEntries = await Promise.all(cacheKeys.map(async key => {
|
|
125
|
+
const entry = await localForage.getItem(key);
|
|
126
|
+
return entry;
|
|
127
|
+
}));
|
|
128
|
+
const validCaches = cacheEntries.filter(entry => entry !== null);
|
|
129
|
+
const timestamps = validCaches.map(c => c.timestamp);
|
|
130
|
+
return {
|
|
131
|
+
collections: validCaches.map(c => c.collectionName),
|
|
132
|
+
totalEntries: validCaches.reduce((sum, c) => sum + c.entries.length, 0),
|
|
133
|
+
oldestCache: timestamps.length > 0 ? Math.min(...timestamps) : null,
|
|
134
|
+
newestCache: timestamps.length > 0 ? Math.max(...timestamps) : null
|
|
135
|
+
};
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.warn('[EntryCache] Error getting cache stats:', error);
|
|
138
|
+
return {
|
|
139
|
+
collections: [],
|
|
140
|
+
totalEntries: 0,
|
|
141
|
+
oldestCache: null,
|
|
142
|
+
newestCache: null
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for working with entries, filters, sorts, and groups
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Check if any filters are active in the Redux state
|
|
7
|
+
*/
|
|
8
|
+
export function hasActiveFilters(activeFilters) {
|
|
9
|
+
if (!activeFilters) return false;
|
|
10
|
+
|
|
11
|
+
// Check if it's an Immutable collection with a 'some' method
|
|
12
|
+
if (typeof activeFilters === 'object' &&
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
typeof activeFilters.some === 'function') {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
return activeFilters.some(f => f.get('active') === true);
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Check if any groups are active in the Redux state
|
|
23
|
+
*/
|
|
24
|
+
export function hasActiveGroups(activeGroups) {
|
|
25
|
+
if (!activeGroups) return false;
|
|
26
|
+
|
|
27
|
+
// Check if it's an Immutable collection with a 'some' method
|
|
28
|
+
if (typeof activeGroups === 'object' &&
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
typeof activeGroups.some === 'function') {
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
+
return activeGroups.some(g => g.get('active') === true);
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Check if any sorts are active in the Redux state
|
|
39
|
+
*/
|
|
40
|
+
export function hasActiveSorts(activeSorts) {
|
|
41
|
+
if (!activeSorts) return false;
|
|
42
|
+
|
|
43
|
+
// Check if it's an Immutable collection with a 'size' property
|
|
44
|
+
if (typeof activeSorts === 'object' &&
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
typeof activeSorts.size === 'number') {
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
|
+
return activeSorts.size > 0;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get value from a nested field path (e.g., "data.title" or "data.nested.field")
|
|
55
|
+
*/
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
57
|
+
export function getFieldValue(obj, fieldPath) {
|
|
58
|
+
const pathParts = fieldPath.split('.');
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
let value = obj;
|
|
61
|
+
for (const part of pathParts) {
|
|
62
|
+
value = value?.[part];
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Extract active filters from Immutable collection into plain array
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
export function extractActiveFilters(activeFilters) {
|
|
72
|
+
const filters = [];
|
|
73
|
+
if (!activeFilters) return filters;
|
|
74
|
+
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
+
if (typeof activeFilters.forEach === 'function') {
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
+
activeFilters.forEach(f => {
|
|
79
|
+
if (f.get('active') === true) {
|
|
80
|
+
filters.push({
|
|
81
|
+
pattern: f.get('pattern'),
|
|
82
|
+
field: f.get('field')
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return filters;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Apply filters to an entry
|
|
92
|
+
*/
|
|
93
|
+
export function matchesFilters(entry, filters) {
|
|
94
|
+
return filters.every(({
|
|
95
|
+
pattern,
|
|
96
|
+
field
|
|
97
|
+
}) => {
|
|
98
|
+
const data = ('data' in entry ? entry.data : entry) || {};
|
|
99
|
+
const value = getFieldValue(data, field);
|
|
100
|
+
return value !== undefined && new RegExp(String(pattern)).test(String(value));
|
|
101
|
+
});
|
|
102
|
+
}
|
|
@@ -11,6 +11,7 @@ import { COMMIT_AUTHOR, COMMIT_DATE } from '../constants/commitProps';
|
|
|
11
11
|
const {
|
|
12
12
|
compileStringTemplate,
|
|
13
13
|
parseDateFromEntry,
|
|
14
|
+
parseDateFromEntryData,
|
|
14
15
|
SLUG_MISSING_REQUIRED_DATE,
|
|
15
16
|
keyToPathArray,
|
|
16
17
|
addFileTemplateFields
|
|
@@ -91,7 +92,7 @@ export function slugFormatter(collection, entryData, slugConfig) {
|
|
|
91
92
|
throw new Error('Collection must have a field name that is a valid entry identifier, or must have `identifier_field` set');
|
|
92
93
|
}
|
|
93
94
|
const processSegment = getProcessSegment(slugConfig);
|
|
94
|
-
const date = new Date();
|
|
95
|
+
const date = parseDateFromEntryData(entryData, selectInferredField(collection, 'date')) || new Date(Date.now());
|
|
95
96
|
const slug = compileStringTemplate(slugTemplate, date, identifier, entryData, processSegment);
|
|
96
97
|
if (!collection.has('path')) {
|
|
97
98
|
return slug;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Map } from 'immutable';
|
|
2
|
+
/**
|
|
3
|
+
* Type guard to check if an object is an Immutable.js Map
|
|
4
|
+
*/
|
|
5
|
+
export function isImmutableMap(obj) {
|
|
6
|
+
return Map.isMap(obj);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Helper to safely get a value from either an Immutable Map or plain object
|
|
11
|
+
*/
|
|
12
|
+
export function getValue(obj, key) {
|
|
13
|
+
if (!obj) return undefined;
|
|
14
|
+
if (isImmutableMap(obj)) {
|
|
15
|
+
return obj.get(key);
|
|
16
|
+
}
|
|
17
|
+
if (typeof obj === 'object' && obj !== null) {
|
|
18
|
+
return obj[key];
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determines if a file slug matches the index file pattern for a collection.
|
|
3
|
+
* @param filePath - The file slug or path to check
|
|
4
|
+
* @param pattern - The regex pattern from the collection's index_file config
|
|
5
|
+
* @param nested - Whether the collection is nested (affects how the slug is extracted)
|
|
6
|
+
* @returns True if the file matches the index file pattern
|
|
7
|
+
*/
|
|
8
|
+
export function isIndexFile(filePath, pattern, nested) {
|
|
9
|
+
const fileSlug = nested ? filePath?.split('/').pop() : filePath;
|
|
10
|
+
return !!(fileSlug && new RegExp(pattern).test(fileSlug));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Determines if an entry is an index file entry.
|
|
15
|
+
* Checks both the meta.path_type field (set by the backend) and the slug pattern.
|
|
16
|
+
* @param entry - The entry to check
|
|
17
|
+
* @param collection - The collection configuration containing index_file pattern
|
|
18
|
+
* @returns True if the entry is an index file
|
|
19
|
+
*/
|
|
20
|
+
export function isIndexFileEntry(entry, collection) {
|
|
21
|
+
if (!entry) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const pathType = entry.getIn(['meta', 'path_type']);
|
|
25
|
+
if (pathType === 'index') {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
const indexFileConfig = collection.get('index_file');
|
|
29
|
+
if (!indexFileConfig) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const slug = entry.get('slug');
|
|
33
|
+
const pattern = indexFileConfig.get('pattern');
|
|
34
|
+
const nested = !!collection.get('nested');
|
|
35
|
+
return isIndexFile(slug, pattern, nested);
|
|
36
|
+
}
|