@pranaysahith/decap-cms-core 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +9 -0
  2. package/dist/@pranaysahith/decap-cms-core.js +52 -0
  3. package/dist/@pranaysahith/decap-cms-core.js.LICENSE.txt +141 -0
  4. package/dist/@pranaysahith/decap-cms-core.js.map +1 -0
  5. package/dist/decap-cms-core.js +47 -0
  6. package/dist/decap-cms-core.js.LICENSE.txt +116 -0
  7. package/dist/decap-cms-core.js.map +1 -0
  8. package/dist/esm/actions/auth.js +97 -0
  9. package/dist/esm/actions/collections.js +15 -0
  10. package/dist/esm/actions/config.js +493 -0
  11. package/dist/esm/actions/deploys.js +79 -0
  12. package/dist/esm/actions/editorialWorkflow.js +480 -0
  13. package/dist/esm/actions/entries.js +865 -0
  14. package/dist/esm/actions/media.js +147 -0
  15. package/dist/esm/actions/mediaLibrary.js +552 -0
  16. package/dist/esm/actions/notifications.js +21 -0
  17. package/dist/esm/actions/search.js +149 -0
  18. package/dist/esm/actions/status.js +74 -0
  19. package/dist/esm/actions/waitUntil.js +32 -0
  20. package/dist/esm/backend.js +1082 -0
  21. package/dist/esm/bootstrap.js +101 -0
  22. package/dist/esm/components/App/App.js +289 -0
  23. package/dist/esm/components/App/Header.js +172 -0
  24. package/dist/esm/components/App/NotFoundPage.js +19 -0
  25. package/dist/esm/components/Collection/Collection.js +198 -0
  26. package/dist/esm/components/Collection/CollectionControls.js +46 -0
  27. package/dist/esm/components/Collection/CollectionSearch.js +222 -0
  28. package/dist/esm/components/Collection/CollectionTop.js +68 -0
  29. package/dist/esm/components/Collection/ControlButton.js +17 -0
  30. package/dist/esm/components/Collection/Entries/Entries.js +73 -0
  31. package/dist/esm/components/Collection/Entries/EntriesCollection.js +241 -0
  32. package/dist/esm/components/Collection/Entries/EntriesSearch.js +113 -0
  33. package/dist/esm/components/Collection/Entries/EntryCard.js +177 -0
  34. package/dist/esm/components/Collection/Entries/EntryListing.js +143 -0
  35. package/dist/esm/components/Collection/FilterControl.js +33 -0
  36. package/dist/esm/components/Collection/FolderRenameControl.js +403 -0
  37. package/dist/esm/components/Collection/GroupControl.js +33 -0
  38. package/dist/esm/components/Collection/NestedCollection.js +308 -0
  39. package/dist/esm/components/Collection/Sidebar.js +91 -0
  40. package/dist/esm/components/Collection/SortControl.js +59 -0
  41. package/dist/esm/components/Collection/ViewStyleControl.js +38 -0
  42. package/dist/esm/components/Editor/Editor.js +466 -0
  43. package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +395 -0
  44. package/dist/esm/components/Editor/EditorControlPane/EditorControlPane.js +254 -0
  45. package/dist/esm/components/Editor/EditorControlPane/Widget.js +374 -0
  46. package/dist/esm/components/Editor/EditorInterface.js +386 -0
  47. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreview.js +47 -0
  48. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewContent.js +66 -0
  49. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewPane.js +288 -0
  50. package/dist/esm/components/Editor/EditorPreviewPane/PreviewHOC.js +27 -0
  51. package/dist/esm/components/Editor/EditorToolbar.js +536 -0
  52. package/dist/esm/components/Editor/EntryPathEditor.js +272 -0
  53. package/dist/esm/components/Editor/withWorkflow.js +56 -0
  54. package/dist/esm/components/EditorWidgets/Unknown/UnknownControl.js +18 -0
  55. package/dist/esm/components/EditorWidgets/Unknown/UnknownPreview.js +20 -0
  56. package/dist/esm/components/EditorWidgets/index.js +4 -0
  57. package/dist/esm/components/MediaLibrary/EmptyMessage.js +22 -0
  58. package/dist/esm/components/MediaLibrary/MediaLibrary.js +446 -0
  59. package/dist/esm/components/MediaLibrary/MediaLibraryButtons.js +93 -0
  60. package/dist/esm/components/MediaLibrary/MediaLibraryCard.js +99 -0
  61. package/dist/esm/components/MediaLibrary/MediaLibraryCardGrid.js +198 -0
  62. package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +32 -0
  63. package/dist/esm/components/MediaLibrary/MediaLibraryModal.js +156 -0
  64. package/dist/esm/components/MediaLibrary/MediaLibrarySearch.js +51 -0
  65. package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +123 -0
  66. package/dist/esm/components/UI/DragDrop.js +67 -0
  67. package/dist/esm/components/UI/ErrorBoundary.js +173 -0
  68. package/dist/esm/components/UI/FileUploadButton.js +27 -0
  69. package/dist/esm/components/UI/Modal.js +104 -0
  70. package/dist/esm/components/UI/Notifications.js +62 -0
  71. package/dist/esm/components/UI/SettingsDropdown.js +107 -0
  72. package/dist/esm/components/UI/index.js +6 -0
  73. package/dist/esm/components/Workflow/Workflow.js +133 -0
  74. package/dist/esm/components/Workflow/WorkflowCard.js +128 -0
  75. package/dist/esm/components/Workflow/WorkflowList.js +204 -0
  76. package/dist/esm/constants/collectionTypes.js +2 -0
  77. package/dist/esm/constants/collectionViews.js +2 -0
  78. package/dist/esm/constants/commitProps.js +2 -0
  79. package/dist/esm/constants/configSchema.js +644 -0
  80. package/dist/esm/constants/fieldInference.js +57 -0
  81. package/dist/esm/constants/publishModes.js +18 -0
  82. package/dist/esm/constants/validationErrorTypes.js +6 -0
  83. package/dist/esm/formats/formats.js +83 -0
  84. package/dist/esm/formats/frontmatter.js +146 -0
  85. package/dist/esm/formats/helpers.js +12 -0
  86. package/dist/esm/formats/json.js +8 -0
  87. package/dist/esm/formats/toml.js +32 -0
  88. package/dist/esm/formats/yaml.js +51 -0
  89. package/dist/esm/index.js +7 -0
  90. package/dist/esm/integrations/index.js +28 -0
  91. package/dist/esm/integrations/providers/algolia/implementation.js +174 -0
  92. package/dist/esm/integrations/providers/assetStore/implementation.js +165 -0
  93. package/dist/esm/lib/consoleError.js +3 -0
  94. package/dist/esm/lib/formatters.js +191 -0
  95. package/dist/esm/lib/i18n.js +367 -0
  96. package/dist/esm/lib/phrases.js +6 -0
  97. package/dist/esm/lib/polyfill.js +8 -0
  98. package/dist/esm/lib/registry.js +329 -0
  99. package/dist/esm/lib/serializeEntryValues.js +67 -0
  100. package/dist/esm/lib/stega.js +142 -0
  101. package/dist/esm/lib/textHelper.js +9 -0
  102. package/dist/esm/lib/urlHelper.js +111 -0
  103. package/dist/esm/mediaLibrary.js +37 -0
  104. package/dist/esm/reducers/auth.js +27 -0
  105. package/dist/esm/reducers/collections.js +428 -0
  106. package/dist/esm/reducers/combinedReducer.js +8 -0
  107. package/dist/esm/reducers/config.js +29 -0
  108. package/dist/esm/reducers/cursors.js +31 -0
  109. package/dist/esm/reducers/deploys.js +45 -0
  110. package/dist/esm/reducers/editorialWorkflow.js +83 -0
  111. package/dist/esm/reducers/entries.js +568 -0
  112. package/dist/esm/reducers/entryDraft.js +212 -0
  113. package/dist/esm/reducers/globalUI.js +25 -0
  114. package/dist/esm/reducers/index.js +66 -0
  115. package/dist/esm/reducers/integrations.js +53 -0
  116. package/dist/esm/reducers/mediaLibrary.js +252 -0
  117. package/dist/esm/reducers/medias.js +68 -0
  118. package/dist/esm/reducers/notifications.js +23 -0
  119. package/dist/esm/reducers/search.js +92 -0
  120. package/dist/esm/reducers/status.js +30 -0
  121. package/dist/esm/redux/index.js +7 -0
  122. package/dist/esm/redux/middleware/waitUntilAction.js +48 -0
  123. package/dist/esm/routing/history.js +12 -0
  124. package/dist/esm/types/diacritics.d.js +0 -0
  125. package/dist/esm/types/global.d.js +1 -0
  126. package/dist/esm/types/immutable.js +7 -0
  127. package/dist/esm/types/redux.js +14 -0
  128. package/dist/esm/types/tomlify-j0.4.d.js +0 -0
  129. package/dist/esm/valueObjects/AssetProxy.js +44 -0
  130. package/dist/esm/valueObjects/EditorComponent.js +34 -0
  131. package/dist/esm/valueObjects/Entry.js +20 -0
  132. package/index.d.ts +618 -0
  133. package/package.json +106 -0
  134. package/src/__tests__/backend.spec.js +1161 -0
  135. package/src/actions/__tests__/config.spec.js +1009 -0
  136. package/src/actions/__tests__/editorialWorkflow.spec.js +216 -0
  137. package/src/actions/__tests__/entries.spec.js +596 -0
  138. package/src/actions/__tests__/media.spec.ts +171 -0
  139. package/src/actions/__tests__/mediaLibrary.spec.js +327 -0
  140. package/src/actions/__tests__/search.spec.js +209 -0
  141. package/src/actions/auth.ts +127 -0
  142. package/src/actions/collections.ts +18 -0
  143. package/src/actions/config.ts +565 -0
  144. package/src/actions/deploys.ts +104 -0
  145. package/src/actions/editorialWorkflow.ts +567 -0
  146. package/src/actions/entries.ts +1055 -0
  147. package/src/actions/media.ts +139 -0
  148. package/src/actions/mediaLibrary.ts +574 -0
  149. package/src/actions/notifications.ts +36 -0
  150. package/src/actions/search.ts +221 -0
  151. package/src/actions/status.ts +99 -0
  152. package/src/actions/waitUntil.ts +49 -0
  153. package/src/backend.ts +1400 -0
  154. package/src/bootstrap.js +104 -0
  155. package/src/components/App/App.js +286 -0
  156. package/src/components/App/Header.js +266 -0
  157. package/src/components/App/NotFoundPage.js +23 -0
  158. package/src/components/Collection/Collection.js +210 -0
  159. package/src/components/Collection/CollectionControls.js +58 -0
  160. package/src/components/Collection/CollectionSearch.js +243 -0
  161. package/src/components/Collection/CollectionTop.js +81 -0
  162. package/src/components/Collection/ControlButton.js +27 -0
  163. package/src/components/Collection/Entries/Entries.js +82 -0
  164. package/src/components/Collection/Entries/EntriesCollection.js +277 -0
  165. package/src/components/Collection/Entries/EntriesSearch.js +102 -0
  166. package/src/components/Collection/Entries/EntryCard.js +246 -0
  167. package/src/components/Collection/Entries/EntryListing.js +151 -0
  168. package/src/components/Collection/Entries/__tests__/EntriesCollection.spec.js +163 -0
  169. package/src/components/Collection/Entries/__tests__/__snapshots__/EntriesCollection.spec.js.snap +46 -0
  170. package/src/components/Collection/FilterControl.js +39 -0
  171. package/src/components/Collection/GroupControl.js +39 -0
  172. package/src/components/Collection/NestedCollection.js +330 -0
  173. package/src/components/Collection/Sidebar.js +136 -0
  174. package/src/components/Collection/SortControl.js +68 -0
  175. package/src/components/Collection/ViewStyleControl.js +50 -0
  176. package/src/components/Collection/__tests__/Collection.spec.js +75 -0
  177. package/src/components/Collection/__tests__/NestedCollection.spec.js +445 -0
  178. package/src/components/Collection/__tests__/Sidebar.spec.js +87 -0
  179. package/src/components/Collection/__tests__/__snapshots__/Collection.spec.js.snap +144 -0
  180. package/src/components/Collection/__tests__/__snapshots__/NestedCollection.spec.js.snap +550 -0
  181. package/src/components/Collection/__tests__/__snapshots__/Sidebar.spec.js.snap +312 -0
  182. package/src/components/Editor/Editor.js +497 -0
  183. package/src/components/Editor/EditorControlPane/EditorControl.js +452 -0
  184. package/src/components/Editor/EditorControlPane/EditorControlPane.js +269 -0
  185. package/src/components/Editor/EditorControlPane/Widget.js +384 -0
  186. package/src/components/Editor/EditorInterface.js +444 -0
  187. package/src/components/Editor/EditorPreviewPane/EditorPreview.js +40 -0
  188. package/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js +74 -0
  189. package/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js +333 -0
  190. package/src/components/Editor/EditorPreviewPane/PreviewHOC.js +33 -0
  191. package/src/components/Editor/EditorToolbar.js +691 -0
  192. package/src/components/Editor/__tests__/Editor.spec.js +221 -0
  193. package/src/components/Editor/__tests__/EditorToolbar.spec.js +120 -0
  194. package/src/components/Editor/__tests__/__snapshots__/Editor.spec.js.snap +45 -0
  195. package/src/components/Editor/__tests__/__snapshots__/EditorToolbar.spec.js.snap +4233 -0
  196. package/src/components/Editor/withWorkflow.js +61 -0
  197. package/src/components/EditorWidgets/Unknown/UnknownControl.js +17 -0
  198. package/src/components/EditorWidgets/Unknown/UnknownPreview.js +19 -0
  199. package/src/components/EditorWidgets/index.js +5 -0
  200. package/src/components/MediaLibrary/EmptyMessage.js +28 -0
  201. package/src/components/MediaLibrary/MediaLibrary.js +411 -0
  202. package/src/components/MediaLibrary/MediaLibraryButtons.js +136 -0
  203. package/src/components/MediaLibrary/MediaLibraryCard.js +128 -0
  204. package/src/components/MediaLibrary/MediaLibraryCardGrid.js +199 -0
  205. package/src/components/MediaLibrary/MediaLibraryHeader.js +48 -0
  206. package/src/components/MediaLibrary/MediaLibraryModal.js +200 -0
  207. package/src/components/MediaLibrary/MediaLibrarySearch.js +61 -0
  208. package/src/components/MediaLibrary/MediaLibraryTop.js +143 -0
  209. package/src/components/MediaLibrary/__tests__/MediaLibraryButtons.spec.js +45 -0
  210. package/src/components/MediaLibrary/__tests__/MediaLibraryCard.spec.js +49 -0
  211. package/src/components/MediaLibrary/__tests__/__snapshots__/MediaLibraryCard.spec.js.snap +264 -0
  212. package/src/components/UI/DragDrop.js +66 -0
  213. package/src/components/UI/ErrorBoundary.js +214 -0
  214. package/src/components/UI/FileUploadButton.js +24 -0
  215. package/src/components/UI/Modal.js +112 -0
  216. package/src/components/UI/Notifications.tsx +83 -0
  217. package/src/components/UI/SettingsDropdown.js +103 -0
  218. package/src/components/UI/__tests__/ErrorBoundary.spec.js +57 -0
  219. package/src/components/UI/index.js +6 -0
  220. package/src/components/Workflow/Workflow.js +169 -0
  221. package/src/components/Workflow/WorkflowCard.js +177 -0
  222. package/src/components/Workflow/WorkflowList.js +272 -0
  223. package/src/constants/__tests__/configSchema.spec.js +611 -0
  224. package/src/constants/collectionTypes.ts +2 -0
  225. package/src/constants/collectionViews.js +2 -0
  226. package/src/constants/commitProps.ts +2 -0
  227. package/src/constants/configSchema.js +441 -0
  228. package/src/constants/fieldInference.tsx +78 -0
  229. package/src/constants/publishModes.ts +22 -0
  230. package/src/constants/validationErrorTypes.js +6 -0
  231. package/src/formats/__tests__/formats.spec.js +87 -0
  232. package/src/formats/__tests__/frontmatter.spec.js +429 -0
  233. package/src/formats/__tests__/toml.spec.js +9 -0
  234. package/src/formats/__tests__/yaml.spec.js +162 -0
  235. package/src/formats/formats.ts +97 -0
  236. package/src/formats/frontmatter.ts +150 -0
  237. package/src/formats/helpers.ts +14 -0
  238. package/src/formats/json.ts +9 -0
  239. package/src/formats/toml.ts +33 -0
  240. package/src/formats/yaml.ts +58 -0
  241. package/src/index.js +8 -0
  242. package/src/integrations/index.js +35 -0
  243. package/src/integrations/providers/algolia/implementation.js +176 -0
  244. package/src/integrations/providers/assetStore/implementation.js +148 -0
  245. package/src/lib/__tests__/formatters.spec.js +751 -0
  246. package/src/lib/__tests__/i18n.spec.js +792 -0
  247. package/src/lib/__tests__/phrases.spec.js +119 -0
  248. package/src/lib/__tests__/registry.spec.js +261 -0
  249. package/src/lib/__tests__/serializeEntryValues.spec.js +22 -0
  250. package/src/lib/__tests__/urlHelper.spec.js +138 -0
  251. package/src/lib/consoleError.js +7 -0
  252. package/src/lib/formatters.ts +286 -0
  253. package/src/lib/i18n.ts +454 -0
  254. package/src/lib/phrases.js +8 -0
  255. package/src/lib/polyfill.js +9 -0
  256. package/src/lib/registry.js +312 -0
  257. package/src/lib/serializeEntryValues.js +75 -0
  258. package/src/lib/stega.ts +145 -0
  259. package/src/lib/textHelper.js +11 -0
  260. package/src/lib/urlHelper.ts +128 -0
  261. package/src/mediaLibrary.ts +51 -0
  262. package/src/reducers/__tests__/auth.spec.ts +38 -0
  263. package/src/reducers/__tests__/collections.spec.js +610 -0
  264. package/src/reducers/__tests__/config.spec.js +38 -0
  265. package/src/reducers/__tests__/entries.spec.js +694 -0
  266. package/src/reducers/__tests__/entryDraft.spec.js +297 -0
  267. package/src/reducers/__tests__/globalUI.js +43 -0
  268. package/src/reducers/__tests__/integrations.spec.ts +76 -0
  269. package/src/reducers/__tests__/mediaLibrary.spec.js +154 -0
  270. package/src/reducers/__tests__/medias.spec.ts +49 -0
  271. package/src/reducers/auth.ts +46 -0
  272. package/src/reducers/collections.ts +535 -0
  273. package/src/reducers/combinedReducer.ts +11 -0
  274. package/src/reducers/config.ts +38 -0
  275. package/src/reducers/cursors.js +36 -0
  276. package/src/reducers/deploys.ts +52 -0
  277. package/src/reducers/editorialWorkflow.ts +163 -0
  278. package/src/reducers/entries.ts +819 -0
  279. package/src/reducers/entryDraft.js +260 -0
  280. package/src/reducers/globalUI.ts +45 -0
  281. package/src/reducers/index.ts +82 -0
  282. package/src/reducers/integrations.ts +59 -0
  283. package/src/reducers/mediaLibrary.ts +296 -0
  284. package/src/reducers/medias.ts +66 -0
  285. package/src/reducers/notifications.ts +52 -0
  286. package/src/reducers/search.ts +111 -0
  287. package/src/reducers/status.ts +40 -0
  288. package/src/redux/index.ts +18 -0
  289. package/src/redux/middleware/waitUntilAction.ts +64 -0
  290. package/src/routing/__tests__/history.spec.ts +49 -0
  291. package/src/routing/history.ts +17 -0
  292. package/src/types/diacritics.d.ts +1 -0
  293. package/src/types/global.d.ts +8 -0
  294. package/src/types/immutable.ts +49 -0
  295. package/src/types/redux.ts +827 -0
  296. package/src/types/tomlify-j0.4.d.ts +13 -0
  297. package/src/valueObjects/AssetProxy.ts +48 -0
  298. package/src/valueObjects/EditorComponent.js +38 -0
  299. package/src/valueObjects/Entry.ts +63 -0
@@ -0,0 +1,67 @@
1
+ import isNil from 'lodash/isNil';
2
+ import { Map, List } from 'immutable';
3
+ import { getWidgetValueSerializer } from './registry';
4
+
5
+ /**
6
+ * Methods for serializing/deserializing entry field values. Most widgets don't
7
+ * require this for their values, and those that do can typically serialize/
8
+ * deserialize on every change from within the widget. The serialization
9
+ * handlers here are for widgets whose values require heavy serialization that
10
+ * would hurt performance if run for every change.
11
+
12
+ * An example of this is the markdown widget, whose value is stored as a
13
+ * markdown string. Instead of stringifying on every change of that field, a
14
+ * deserialization method is registered from the widget's control module that
15
+ * converts the stored markdown string to an AST, and that AST serves as the
16
+ * widget model during editing.
17
+ *
18
+ * Serialization handlers should be registered for each widget that requires
19
+ * them, and the registration method is exposed through the registry. Any
20
+ * registered deserialization handlers run on entry load, and serialization
21
+ * handlers run on persist.
22
+ */
23
+ function runSerializer(values, fields, method) {
24
+ /**
25
+ * Reduce the list of fields to a map where keys are field names and values
26
+ * are field values, serializing the values of fields whose widgets have
27
+ * registered serializers. If the field is a list or object, call recursively
28
+ * for nested fields.
29
+ */
30
+ let serializedData = fields.reduce((acc, field) => {
31
+ const fieldName = field.get('name');
32
+ const value = values.get(fieldName);
33
+ const serializer = getWidgetValueSerializer(field.get('widget'));
34
+ const nestedFields = field.get('fields');
35
+
36
+ // Call recursively for fields within lists
37
+ if (nestedFields && List.isList(value)) {
38
+ return acc.set(fieldName, value.map(val => runSerializer(val, nestedFields, method)));
39
+ }
40
+
41
+ // Call recursively for fields within objects
42
+ if (nestedFields && Map.isMap(value)) {
43
+ return acc.set(fieldName, runSerializer(value, nestedFields, method));
44
+ }
45
+
46
+ // Run serialization method on value if not null or undefined
47
+ if (serializer && !isNil(value)) {
48
+ return acc.set(fieldName, serializer[method](value));
49
+ }
50
+
51
+ // If no serializer is registered for the field's widget, use the field as is
52
+ if (!isNil(value)) {
53
+ return acc.set(fieldName, value);
54
+ }
55
+ return acc;
56
+ }, Map());
57
+
58
+ //preserve unknown fields value
59
+ serializedData = values.mergeDeep(serializedData);
60
+ return serializedData;
61
+ }
62
+ export function serializeValues(values, fields) {
63
+ return runSerializer(values, fields, 'serialize');
64
+ }
65
+ export function deserializeValues(values, fields) {
66
+ return runSerializer(values, fields, 'deserialize');
67
+ }
@@ -0,0 +1,142 @@
1
+ import { vercelStegaEncode } from '@vercel/stega';
2
+ import { isImmutableMap, isImmutableList } from '../types/immutable';
3
+
4
+ /**
5
+ * Context passed to encode functions, containing the current state of the encoding process
6
+ */
7
+
8
+ /**
9
+ * Get the fields that should be used for encoding nested values
10
+ */
11
+ function getNestedFields(f) {
12
+ if (f) {
13
+ if ('types' in f) {
14
+ return f.types ?? [];
15
+ }
16
+ if ('fields' in f) {
17
+ return f.fields ?? [];
18
+ }
19
+ if ('field' in f) {
20
+ return f.field ? [f.field] : [];
21
+ }
22
+ return [f];
23
+ }
24
+ return [];
25
+ }
26
+
27
+ /**
28
+ * Encode a string value by appending steganographic data
29
+ * For markdown fields, encode each paragraph separately
30
+ */
31
+ function encodeString(value, {
32
+ fields,
33
+ path
34
+ }) {
35
+ const [field] = fields;
36
+ if (!field) return value;
37
+ const {
38
+ widget
39
+ } = field;
40
+ if (widget === 'string' || widget === 'text') {
41
+ if ('visualEditing' in field && field.visualEditing === false) return value;
42
+ const stega = vercelStegaEncode({
43
+ decap: path
44
+ });
45
+ return value + stega;
46
+ }
47
+ if (widget === 'markdown') {
48
+ const stega = vercelStegaEncode({
49
+ decap: path
50
+ });
51
+ const blocks = value.split(/(\n\n+)/);
52
+ return blocks.map(block => block.trim() ? block + stega : block).join('');
53
+ }
54
+ return value;
55
+ }
56
+
57
+ /**
58
+ * Encode a list of values, handling both simple values and nested objects/lists
59
+ * For typed lists, use the type field to determine which fields to use
60
+ */
61
+ function encodeList(list, ctx) {
62
+ let newList = list;
63
+ for (let i = 0; i < newList.size; i++) {
64
+ const item = newList.get(i);
65
+ if (isImmutableMap(item)) {
66
+ const itemType = item.get('type');
67
+ if (typeof itemType === 'string') {
68
+ // For typed items, look up fields based on type
69
+ const field = ctx.fields.find(f => f.name === itemType);
70
+ const newItem = ctx.visit(item, getNestedFields(field), `${ctx.path}.${i}`);
71
+ newList = newList.set(i, newItem);
72
+ } else {
73
+ // For untyped items, use current fields
74
+ const newItem = ctx.visit(item, ctx.fields, `${ctx.path}.${i}`);
75
+ newList = newList.set(i, newItem);
76
+ }
77
+ } else {
78
+ // For simple values, use first field if available
79
+ const field = ctx.fields[0];
80
+ const newItem = ctx.visit(item, field ? [field] : [], `${ctx.path}.${i}`);
81
+ if (newItem !== item) {
82
+ newList = newList.set(i, newItem);
83
+ }
84
+ }
85
+ }
86
+ return newList;
87
+ }
88
+
89
+ /**
90
+ * Encode a map of values, looking up the appropriate field for each key
91
+ * and recursively encoding nested values
92
+ */
93
+ function encodeMap(map, ctx) {
94
+ let newMap = map;
95
+ for (const [key, val] of newMap.entrySeq().toArray()) {
96
+ const field = ctx.fields.find(f => f.name === key);
97
+ if (field) {
98
+ const fields = getNestedFields(field);
99
+ const newVal = ctx.visit(val, fields, ctx.path ? `${ctx.path}.${key}` : key);
100
+ if (newVal !== val) {
101
+ newMap = newMap.set(key, newVal);
102
+ }
103
+ }
104
+ }
105
+ return newMap;
106
+ }
107
+
108
+ /**
109
+ * Cache for encoded values to prevent re-encoding unchanged values
110
+ * across keystrokes. The cache is keyed by path.
111
+ */
112
+ const encodingCache = new Map();
113
+
114
+ /**
115
+ * Main entry point for encoding steganographic data into entry values
116
+ * Uses a visitor pattern with caching to handle recursive structures
117
+ */
118
+ export function encodeEntry(value, fields) {
119
+ const plainFields = fields.toJS();
120
+ function visit(value, fields, path = '') {
121
+ const cached = encodingCache.get(path);
122
+ if (cached === value) return value;
123
+ const ctx = {
124
+ fields,
125
+ path,
126
+ visit
127
+ };
128
+ let result;
129
+ if (isImmutableList(value)) {
130
+ result = encodeList(value, ctx);
131
+ } else if (isImmutableMap(value)) {
132
+ result = encodeMap(value, ctx);
133
+ } else if (typeof value === 'string') {
134
+ result = encodeString(value, ctx);
135
+ } else {
136
+ result = value;
137
+ }
138
+ encodingCache.set(path, result);
139
+ return result;
140
+ }
141
+ return visit(value, plainFields);
142
+ }
@@ -0,0 +1,9 @@
1
+ export function stringToRGB(str) {
2
+ if (!str) return '000000';
3
+ let hash = 0;
4
+ for (let i = 0; i < str.length; i++) {
5
+ hash = str.charCodeAt(i) + ((hash << 5) - hash);
6
+ }
7
+ const c = (hash & 0x00ffffff).toString(16).toUpperCase();
8
+ return `00000${c}`.slice(-6);
9
+ }
@@ -0,0 +1,111 @@
1
+ import url from 'url';
2
+ import urlJoin from 'url-join';
3
+ import diacritics from 'diacritics';
4
+ import sanitizeFilename from 'sanitize-filename';
5
+ import isString from 'lodash/isString';
6
+ import escapeRegExp from 'lodash/escapeRegExp';
7
+ import flow from 'lodash/flow';
8
+ import partialRight from 'lodash/partialRight';
9
+ function getUrl(urlString, direct) {
10
+ return `${direct ? '/#' : ''}${urlString}`;
11
+ }
12
+ export function getCollectionUrl(collectionName, direct) {
13
+ return getUrl(`/collections/${collectionName}`, direct);
14
+ }
15
+ export function getNewEntryUrl(collectionName, direct) {
16
+ return getUrl(`/collections/${collectionName}/new`, direct);
17
+ }
18
+ export function addParams(urlString, params) {
19
+ const parsedUrl = url.parse(urlString, true);
20
+ parsedUrl.query = {
21
+ ...parsedUrl.query,
22
+ ...params
23
+ };
24
+ return url.format(parsedUrl);
25
+ }
26
+ export function stripProtocol(urlString) {
27
+ const protocolEndIndex = urlString.indexOf('//');
28
+ return protocolEndIndex > -1 ? urlString.slice(protocolEndIndex + 2) : urlString;
29
+ }
30
+
31
+ /* See https://www.w3.org/International/articles/idn-and-iri/#path.
32
+ * According to the new IRI (Internationalized Resource Identifier) spec, RFC 3987,
33
+ * ASCII chars should be kept the same way as in standard URIs (letters digits _ - . ~).
34
+ * Non-ASCII chars (unless they are not in the allowed "ucschars" list) should be percent-encoded.
35
+ * If the string is not encoded in Unicode, it should be converted to UTF-8 and normalized first,
36
+ * but JS stores strings as UTF-16/UCS-2 internally, so we should not normalize or re-encode.
37
+ */
38
+ const uriChars = /[\w\-.~]/i;
39
+ const ucsChars = /[\xA0-\u{D7FF}\u{F900}-\u{FDCF}\u{FDF0}-\u{FFEF}\u{10000}-\u{1FFFD}\u{20000}-\u{2FFFD}\u{30000}-\u{3FFFD}\u{40000}-\u{4FFFD}\u{50000}-\u{5FFFD}\u{60000}-\u{6FFFD}\u{70000}-\u{7FFFD}\u{80000}-\u{8FFFD}\u{90000}-\u{9FFFD}\u{A0000}-\u{AFFFD}\u{B0000}-\u{BFFFD}\u{C0000}-\u{CFFFD}\u{D0000}-\u{DFFFD}\u{E1000}-\u{EFFFD}]/u;
40
+ function validURIChar(char) {
41
+ return uriChars.test(char);
42
+ }
43
+ function validIRIChar(char) {
44
+ return uriChars.test(char) || ucsChars.test(char);
45
+ }
46
+ export function getCharReplacer(encoding, replacement) {
47
+ let validChar;
48
+ if (encoding === 'unicode') {
49
+ validChar = validIRIChar;
50
+ } else if (encoding === 'ascii') {
51
+ validChar = validURIChar;
52
+ } else {
53
+ throw new Error('`options.encoding` must be "unicode" or "ascii".');
54
+ }
55
+
56
+ // Check and make sure the replacement character is actually a safe char itself.
57
+ if (!Array.from(replacement).every(validChar)) {
58
+ throw new Error('The replacement character(s) (options.replacement) is itself unsafe.');
59
+ }
60
+ return char => validChar(char) ? char : replacement;
61
+ }
62
+ // `sanitizeURI` does not actually URI-encode the chars (that is the browser's and server's job), just removes the ones that are not allowed.
63
+ export function sanitizeURI(str, options) {
64
+ const {
65
+ replacement = '',
66
+ encoding = 'unicode'
67
+ } = options || {};
68
+ if (!isString(str)) {
69
+ throw new Error('The input slug must be a string.');
70
+ }
71
+ if (!isString(replacement)) {
72
+ throw new Error('`options.replacement` must be a string.');
73
+ }
74
+
75
+ // `Array.from` must be used instead of `String.split` because
76
+ // `split` converts things like emojis into UTF-16 surrogate pairs.
77
+ return Array.from(str).map(getCharReplacer(encoding, replacement)).join('');
78
+ }
79
+ export function sanitizeChar(char, options) {
80
+ const {
81
+ encoding = 'unicode',
82
+ sanitize_replacement: replacement = ''
83
+ } = options || {};
84
+ return getCharReplacer(encoding, replacement)(char);
85
+ }
86
+ export function sanitizeSlug(str, options) {
87
+ if (!isString(str)) {
88
+ throw new Error('The input slug must be a string.');
89
+ }
90
+ const {
91
+ encoding,
92
+ clean_accents: stripDiacritics,
93
+ sanitize_replacement: replacement
94
+ } = options || {};
95
+ const sanitizedSlug = flow([...(stripDiacritics ? [diacritics.remove] : []), partialRight(sanitizeURI, {
96
+ replacement,
97
+ encoding
98
+ }), partialRight(sanitizeFilename, {
99
+ replacement
100
+ })])(str);
101
+
102
+ // Remove any doubled or leading/trailing replacement characters (that were added in the sanitizers).
103
+ const doubleReplacement = new RegExp(`(?:${escapeRegExp(replacement)})+`, 'g');
104
+ const trailingReplacement = new RegExp(`${escapeRegExp(replacement)}$`);
105
+ const leadingReplacement = new RegExp(`^${escapeRegExp(replacement)}`);
106
+ const normalizedSlug = sanitizedSlug.replace(doubleReplacement, replacement).replace(leadingReplacement, '').replace(trailingReplacement, '');
107
+ return normalizedSlug;
108
+ }
109
+ export function joinUrlPath(base, ...path) {
110
+ return urlJoin(base, ...path);
111
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * This module is currently concerned only with external media libraries
3
+ * registered via `registerMediaLibrary`.
4
+ */
5
+ import once from 'lodash/once';
6
+ import { getMediaLibrary } from './lib/registry';
7
+ import { store } from './redux';
8
+ import { configFailed } from './actions/config';
9
+ import { createMediaLibrary, insertMedia } from './actions/mediaLibrary';
10
+ function handleInsert(url) {
11
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
12
+ // @ts-ignore
13
+ return store.dispatch(insertMedia(url, undefined));
14
+ }
15
+ const initializeMediaLibrary = once(async function initializeMediaLibrary(name, options) {
16
+ const lib = getMediaLibrary(name);
17
+ if (!lib) {
18
+ const err = new Error(`Missing external media library '${name}'. Please use 'registerMediaLibrary' to register it.`);
19
+ store.dispatch(configFailed(err));
20
+ } else {
21
+ const instance = await lib.init({
22
+ options,
23
+ handleInsert
24
+ });
25
+ store.dispatch(createMediaLibrary(instance));
26
+ }
27
+ });
28
+ store.subscribe(() => {
29
+ const state = store.getState();
30
+ if (state) {
31
+ const mediaLibraryName = state.config.media_library?.name;
32
+ if (mediaLibraryName && !state.mediaLibrary.get('externalLibrary')) {
33
+ const mediaLibraryConfig = state.config.media_library;
34
+ initializeMediaLibrary(mediaLibraryName, mediaLibraryConfig);
35
+ }
36
+ }
37
+ });
@@ -0,0 +1,27 @@
1
+ import { produce } from 'immer';
2
+ import { AUTH_REQUEST, AUTH_SUCCESS, AUTH_FAILURE, AUTH_REQUEST_DONE, LOGOUT } from '../actions/auth';
3
+ export const defaultState = {
4
+ isFetching: false,
5
+ user: undefined,
6
+ error: undefined
7
+ };
8
+ const auth = produce((state, action) => {
9
+ switch (action.type) {
10
+ case AUTH_REQUEST:
11
+ state.isFetching = true;
12
+ break;
13
+ case AUTH_SUCCESS:
14
+ state.user = action.payload;
15
+ break;
16
+ case AUTH_FAILURE:
17
+ state.error = action.payload && action.payload.toString();
18
+ break;
19
+ case AUTH_REQUEST_DONE:
20
+ state.isFetching = false;
21
+ break;
22
+ case LOGOUT:
23
+ state.user = undefined;
24
+ state.isFetching = false;
25
+ }
26
+ }, defaultState);
27
+ export default auth;