@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,286 @@
1
+ import flow from 'lodash/flow';
2
+ import partialRight from 'lodash/partialRight';
3
+ import trimEnd from 'lodash/trimEnd';
4
+ import trimStart from 'lodash/trimStart';
5
+ import { stringTemplate } from 'decap-cms-lib-widgets';
6
+ import { stripIndent } from 'common-tags';
7
+
8
+ import {
9
+ selectIdentifier,
10
+ selectField,
11
+ selectInferredField,
12
+ getFileFromSlug,
13
+ } from '../reducers/collections';
14
+ import { sanitizeSlug } from './urlHelper';
15
+ import { FILES } from '../constants/collectionTypes';
16
+ import { COMMIT_AUTHOR, COMMIT_DATE } from '../constants/commitProps';
17
+
18
+ import type { Collection, CmsConfig, CmsSlug, EntryMap } from '../types/redux';
19
+ import type { Map } from 'immutable';
20
+
21
+ const {
22
+ compileStringTemplate,
23
+ parseDateFromEntry,
24
+ parseDateFromEntryData,
25
+ SLUG_MISSING_REQUIRED_DATE,
26
+ keyToPathArray,
27
+ addFileTemplateFields,
28
+ } = stringTemplate;
29
+
30
+ const commitMessageTemplates = {
31
+ create: 'Create {{collection}} “{{slug}}”',
32
+ update: 'Update {{collection}} “{{slug}}”',
33
+ delete: 'Delete {{collection}} “{{slug}}”',
34
+ uploadMedia: 'Upload “{{path}}”',
35
+ deleteMedia: 'Delete “{{path}}”',
36
+ openAuthoring: '{{message}}',
37
+ } as const;
38
+
39
+ const variableRegex = /\{\{([^}]+)\}\}/g;
40
+
41
+ type Options = {
42
+ slug?: string;
43
+ path?: string;
44
+ collection?: Collection;
45
+ authorLogin?: string;
46
+ authorName?: string;
47
+ };
48
+
49
+ export function commitMessageFormatter(
50
+ type: keyof typeof commitMessageTemplates,
51
+ config: CmsConfig,
52
+ { slug, path, collection, authorLogin, authorName }: Options,
53
+ isOpenAuthoring?: boolean,
54
+ ) {
55
+ const templates = { ...commitMessageTemplates, ...(config.backend.commit_messages || {}) };
56
+
57
+ const commitMessage = templates[type].replace(variableRegex, (_, variable) => {
58
+ switch (variable) {
59
+ case 'slug':
60
+ return slug || '';
61
+ case 'path':
62
+ return path || '';
63
+ case 'collection':
64
+ return collection ? collection.get('label_singular') || collection.get('label') : '';
65
+ case 'author-login':
66
+ return authorLogin || '';
67
+ case 'author-name':
68
+ return authorName || '';
69
+ default:
70
+ console.warn(`Ignoring unknown variable “${variable}” in commit message template.`);
71
+ return '';
72
+ }
73
+ });
74
+
75
+ if (!isOpenAuthoring) {
76
+ return commitMessage;
77
+ }
78
+
79
+ const message = templates.openAuthoring.replace(variableRegex, (_, variable) => {
80
+ switch (variable) {
81
+ case 'message':
82
+ return commitMessage;
83
+ case 'author-login':
84
+ return authorLogin || '';
85
+ case 'author-name':
86
+ return authorName || '';
87
+ default:
88
+ console.warn(`Ignoring unknown variable “${variable}” in open authoring message template.`);
89
+ return '';
90
+ }
91
+ });
92
+
93
+ return message;
94
+ }
95
+
96
+ export function prepareSlug(slug: string, preserveCase = false) {
97
+ let result = slug.trim();
98
+
99
+ // Convert slug to lower-case (unless preserveCase is true)
100
+ if (!preserveCase) {
101
+ result = result.toLocaleLowerCase();
102
+ }
103
+
104
+ return (
105
+ result
106
+ // Remove single quotes.
107
+ .replace(/[']/g, '')
108
+
109
+ // Replace periods with dashes.
110
+ .replace(/[.]/g, '-')
111
+ );
112
+ }
113
+
114
+ export function getProcessSegment(
115
+ slugConfig?: CmsSlug,
116
+ ignoreValues?: string[],
117
+ preserveCase = false,
118
+ ) {
119
+ return (value: string) =>
120
+ ignoreValues && ignoreValues.includes(value)
121
+ ? value
122
+ : flow([
123
+ (value: string) => String(value),
124
+ (value: string) => prepareSlug(value, preserveCase),
125
+ partialRight(sanitizeSlug, slugConfig),
126
+ ])(value);
127
+ }
128
+
129
+ export function slugFormatter(
130
+ collection: Collection,
131
+ entryData: Map<string, unknown>,
132
+ slugConfig?: CmsSlug,
133
+ ) {
134
+ const slugTemplate = collection.get('slug') || '{{slug}}';
135
+
136
+ const identifier = entryData.getIn(keyToPathArray(selectIdentifier(collection) as string));
137
+ if (!identifier) {
138
+ throw new Error(
139
+ 'Collection must have a field name that is a valid entry identifier, or must have `identifier_field` set',
140
+ );
141
+ }
142
+
143
+ const processSegment = getProcessSegment(slugConfig);
144
+ const date =
145
+ parseDateFromEntryData(
146
+ entryData as unknown as Map<string, unknown>,
147
+ selectInferredField(collection, 'date'),
148
+ ) || new Date(Date.now());
149
+ const slug = compileStringTemplate(slugTemplate, date, identifier, entryData, processSegment);
150
+
151
+ if (!collection.has('path')) {
152
+ return slug;
153
+ } else {
154
+ const pathTemplate = prepareSlug(collection.get('path') as string);
155
+ return compileStringTemplate(pathTemplate, date, slug, entryData, (value: string) =>
156
+ value === slug ? value : processSegment(value),
157
+ );
158
+ }
159
+ }
160
+
161
+ export function previewUrlFormatter(
162
+ baseUrl: string,
163
+ collection: Collection,
164
+ slug: string,
165
+ entry: EntryMap,
166
+ slugConfig?: CmsSlug,
167
+ ) {
168
+ /**
169
+ * Preview URL can't be created without `baseUrl`. This makes preview URLs
170
+ * optional for backends that don't support them.
171
+ */
172
+ if (!baseUrl) {
173
+ return;
174
+ }
175
+
176
+ const basePath = trimEnd(baseUrl, '/');
177
+
178
+ const isFileCollection = collection.get('type') === FILES;
179
+ const file = isFileCollection ? getFileFromSlug(collection, entry.get('slug')) : undefined;
180
+
181
+ function getPathTemplate() {
182
+ return file?.get('preview_path') ?? collection.get('preview_path');
183
+ }
184
+
185
+ function getDateField() {
186
+ return file?.get('preview_path_date_field') ?? collection.get('preview_path_date_field');
187
+ }
188
+
189
+ /**
190
+ * If a `previewPath` is provided for the collection/file, use it to construct the
191
+ * URL path.
192
+ */
193
+ const pathTemplate = getPathTemplate();
194
+
195
+ /**
196
+ * Without a `previewPath` for the collection/file (via config), the preview URL
197
+ * will be the URL provided by the backend.
198
+ */
199
+ if (!pathTemplate) {
200
+ return baseUrl;
201
+ }
202
+
203
+ let fields = entry.get('data') as Map<string, string>;
204
+ fields = addFileTemplateFields(entry.get('path'), fields, collection.get('folder'));
205
+ const dateFieldName = getDateField() || selectInferredField(collection, 'date');
206
+ const date = parseDateFromEntry(entry as unknown as Map<string, unknown>, dateFieldName);
207
+
208
+ // Prepare and sanitize slug variables only, leave the rest of the
209
+ // `preview_path` template as is.
210
+ const processSegment = getProcessSegment(slugConfig, [fields.get('dirname')]);
211
+ let compiledPath;
212
+
213
+ try {
214
+ compiledPath = compileStringTemplate(pathTemplate, date, slug, fields, processSegment);
215
+ } catch (err) {
216
+ // Print an error and ignore `preview_path` if both:
217
+ // 1. Date is invalid (according to DayJs), and
218
+ // 2. A date expression (eg. `{{year}}`) is used in `preview_path`
219
+ if (err.name === SLUG_MISSING_REQUIRED_DATE) {
220
+ console.error(stripIndent`
221
+ Collection "${collection.get('name')}" configuration error:
222
+ \`preview_path_date_field\` must be a field with a valid date. Ignoring \`preview_path\`.
223
+ `);
224
+ return basePath;
225
+ }
226
+ throw err;
227
+ }
228
+
229
+ const previewPath = trimStart(compiledPath, ' /');
230
+ return `${basePath}/${previewPath}`;
231
+ }
232
+
233
+ export function summaryFormatter(summaryTemplate: string, entry: EntryMap, collection: Collection) {
234
+ let entryData = entry.get('data');
235
+ const date =
236
+ parseDateFromEntry(
237
+ entry as unknown as Map<string, unknown>,
238
+ selectInferredField(collection, 'date'),
239
+ ) || null;
240
+ const identifier = entryData.getIn(keyToPathArray(selectIdentifier(collection) as string));
241
+
242
+ entryData = addFileTemplateFields(entry.get('path'), entryData, collection.get('folder'));
243
+ // allow commit information in summary template
244
+ if (entry.get('author') && !selectField(collection, COMMIT_AUTHOR)) {
245
+ entryData = entryData.set(COMMIT_AUTHOR, entry.get('author'));
246
+ }
247
+ if (entry.get('updatedOn') && !selectField(collection, COMMIT_DATE)) {
248
+ entryData = entryData.set(COMMIT_DATE, entry.get('updatedOn'));
249
+ }
250
+ const summary = compileStringTemplate(summaryTemplate, date, identifier, entryData);
251
+ return summary;
252
+ }
253
+
254
+ export function folderFormatter(
255
+ folderTemplate: string,
256
+ entry: EntryMap | undefined,
257
+ collection: Collection,
258
+ defaultFolder: string,
259
+ folderKey: string,
260
+ slugConfig?: CmsSlug,
261
+ ) {
262
+ if (!entry || !entry.get('data')) {
263
+ return folderTemplate;
264
+ }
265
+
266
+ let fields = (entry.get('data') as Map<string, string>).set(folderKey, defaultFolder);
267
+ fields = addFileTemplateFields(entry.get('path'), fields, collection.get('folder'));
268
+
269
+ const date =
270
+ parseDateFromEntry(
271
+ entry as unknown as Map<string, unknown>,
272
+ selectInferredField(collection, 'date'),
273
+ ) || null;
274
+ const identifier = fields.getIn(keyToPathArray(selectIdentifier(collection) as string));
275
+ const processSegment = getProcessSegment(slugConfig, [defaultFolder, fields.get('dirname')]);
276
+
277
+ const mediaFolder = compileStringTemplate(
278
+ folderTemplate,
279
+ date,
280
+ identifier,
281
+ fields,
282
+ processSegment,
283
+ );
284
+
285
+ return mediaFolder;
286
+ }