@evfrenkel/decap-cms-core 3.13.0-image-conversions.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.
Files changed (306) hide show
  1. package/README.md +9 -0
  2. package/dist/20.decap-cms-core.js +2 -0
  3. package/dist/20.decap-cms-core.js.map +1 -0
  4. package/dist/3802306e7b58a11862fb.wasm +0 -0
  5. package/dist/@evfrenkel/20.decap-cms-core.js +2 -0
  6. package/dist/@evfrenkel/20.decap-cms-core.js.map +1 -0
  7. package/dist/@evfrenkel/decap-cms-core.js +44 -0
  8. package/dist/@evfrenkel/decap-cms-core.js.LICENSE.txt +126 -0
  9. package/dist/@evfrenkel/decap-cms-core.js.map +1 -0
  10. package/dist/decap-cms-core.js +47 -0
  11. package/dist/decap-cms-core.js.LICENSE.txt +126 -0
  12. package/dist/decap-cms-core.js.map +1 -0
  13. package/dist/esm/actions/auth.js +97 -0
  14. package/dist/esm/actions/collections.js +15 -0
  15. package/dist/esm/actions/config.js +503 -0
  16. package/dist/esm/actions/deploys.js +80 -0
  17. package/dist/esm/actions/editorialWorkflow.js +480 -0
  18. package/dist/esm/actions/entries.js +876 -0
  19. package/dist/esm/actions/media.js +147 -0
  20. package/dist/esm/actions/mediaLibrary.js +599 -0
  21. package/dist/esm/actions/notifications.js +21 -0
  22. package/dist/esm/actions/search.js +149 -0
  23. package/dist/esm/actions/status.js +74 -0
  24. package/dist/esm/actions/waitUntil.js +32 -0
  25. package/dist/esm/backend.js +1090 -0
  26. package/dist/esm/bootstrap.js +101 -0
  27. package/dist/esm/components/App/App.js +296 -0
  28. package/dist/esm/components/App/Header.js +172 -0
  29. package/dist/esm/components/App/NotFoundPage.js +19 -0
  30. package/dist/esm/components/Collection/Collection.js +198 -0
  31. package/dist/esm/components/Collection/CollectionControls.js +47 -0
  32. package/dist/esm/components/Collection/CollectionSearch.js +222 -0
  33. package/dist/esm/components/Collection/CollectionTop.js +68 -0
  34. package/dist/esm/components/Collection/ControlButton.js +17 -0
  35. package/dist/esm/components/Collection/Entries/Entries.js +73 -0
  36. package/dist/esm/components/Collection/Entries/EntriesCollection.js +241 -0
  37. package/dist/esm/components/Collection/Entries/EntriesSearch.js +113 -0
  38. package/dist/esm/components/Collection/Entries/EntryCard.js +192 -0
  39. package/dist/esm/components/Collection/Entries/EntryListing.js +143 -0
  40. package/dist/esm/components/Collection/FilterControl.js +33 -0
  41. package/dist/esm/components/Collection/GroupControl.js +33 -0
  42. package/dist/esm/components/Collection/NestedCollection.js +308 -0
  43. package/dist/esm/components/Collection/Sidebar.js +91 -0
  44. package/dist/esm/components/Collection/SortControl.js +59 -0
  45. package/dist/esm/components/Collection/ViewStyleControl.js +41 -0
  46. package/dist/esm/components/Editor/Editor.js +466 -0
  47. package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +398 -0
  48. package/dist/esm/components/Editor/EditorControlPane/EditorControlPane.js +254 -0
  49. package/dist/esm/components/Editor/EditorControlPane/Widget.js +374 -0
  50. package/dist/esm/components/Editor/EditorInterface.js +386 -0
  51. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreview.js +47 -0
  52. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewContent.js +67 -0
  53. package/dist/esm/components/Editor/EditorPreviewPane/EditorPreviewPane.js +306 -0
  54. package/dist/esm/components/Editor/EditorPreviewPane/PreviewHOC.js +27 -0
  55. package/dist/esm/components/Editor/EditorToolbar.js +554 -0
  56. package/dist/esm/components/Editor/withWorkflow.js +56 -0
  57. package/dist/esm/components/EditorWidgets/Unknown/UnknownControl.js +18 -0
  58. package/dist/esm/components/EditorWidgets/Unknown/UnknownPreview.js +20 -0
  59. package/dist/esm/components/EditorWidgets/index.js +4 -0
  60. package/dist/esm/components/MediaLibrary/EmptyMessage.js +22 -0
  61. package/dist/esm/components/MediaLibrary/MediaLibrary.js +446 -0
  62. package/dist/esm/components/MediaLibrary/MediaLibraryButtons.js +92 -0
  63. package/dist/esm/components/MediaLibrary/MediaLibraryCard.js +99 -0
  64. package/dist/esm/components/MediaLibrary/MediaLibraryCardGrid.js +198 -0
  65. package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +34 -0
  66. package/dist/esm/components/MediaLibrary/MediaLibraryModal.js +156 -0
  67. package/dist/esm/components/MediaLibrary/MediaLibrarySearch.js +51 -0
  68. package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +124 -0
  69. package/dist/esm/components/UI/DragDrop.js +67 -0
  70. package/dist/esm/components/UI/ErrorBoundary.js +170 -0
  71. package/dist/esm/components/UI/FileUploadButton.js +27 -0
  72. package/dist/esm/components/UI/Modal.js +104 -0
  73. package/dist/esm/components/UI/Notifications.js +62 -0
  74. package/dist/esm/components/UI/SettingsDropdown.js +107 -0
  75. package/dist/esm/components/UI/index.js +6 -0
  76. package/dist/esm/components/Workflow/Workflow.js +133 -0
  77. package/dist/esm/components/Workflow/WorkflowCard.js +128 -0
  78. package/dist/esm/components/Workflow/WorkflowList.js +204 -0
  79. package/dist/esm/constants/collectionTypes.js +2 -0
  80. package/dist/esm/constants/collectionViews.js +2 -0
  81. package/dist/esm/constants/commitProps.js +2 -0
  82. package/dist/esm/constants/configSchema.js +695 -0
  83. package/dist/esm/constants/fieldInference.js +57 -0
  84. package/dist/esm/constants/publishModes.js +18 -0
  85. package/dist/esm/constants/validationErrorTypes.js +6 -0
  86. package/dist/esm/formats/formats.js +83 -0
  87. package/dist/esm/formats/frontmatter.js +146 -0
  88. package/dist/esm/formats/helpers.js +12 -0
  89. package/dist/esm/formats/json.js +8 -0
  90. package/dist/esm/formats/toml.js +32 -0
  91. package/dist/esm/formats/yaml.js +60 -0
  92. package/dist/esm/index.js +7 -0
  93. package/dist/esm/integrations/index.js +28 -0
  94. package/dist/esm/integrations/providers/algolia/implementation.js +174 -0
  95. package/dist/esm/integrations/providers/assetStore/implementation.js +165 -0
  96. package/dist/esm/lib/consoleError.js +3 -0
  97. package/dist/esm/lib/formatters.js +201 -0
  98. package/dist/esm/lib/i18n.js +372 -0
  99. package/dist/esm/lib/imageTransformations.js +143 -0
  100. package/dist/esm/lib/phrases.js +6 -0
  101. package/dist/esm/lib/polyfill.js +8 -0
  102. package/dist/esm/lib/registry.js +332 -0
  103. package/dist/esm/lib/serializeEntryValues.js +67 -0
  104. package/dist/esm/lib/stega.js +142 -0
  105. package/dist/esm/lib/textHelper.js +9 -0
  106. package/dist/esm/lib/urlHelper.js +129 -0
  107. package/dist/esm/mediaLibrary.js +37 -0
  108. package/dist/esm/reducers/auth.js +27 -0
  109. package/dist/esm/reducers/collections.js +428 -0
  110. package/dist/esm/reducers/combinedReducer.js +8 -0
  111. package/dist/esm/reducers/config.js +29 -0
  112. package/dist/esm/reducers/cursors.js +31 -0
  113. package/dist/esm/reducers/deploys.js +50 -0
  114. package/dist/esm/reducers/editorialWorkflow.js +83 -0
  115. package/dist/esm/reducers/entries.js +568 -0
  116. package/dist/esm/reducers/entryDraft.js +211 -0
  117. package/dist/esm/reducers/globalUI.js +25 -0
  118. package/dist/esm/reducers/index.js +66 -0
  119. package/dist/esm/reducers/integrations.js +53 -0
  120. package/dist/esm/reducers/mediaLibrary.js +252 -0
  121. package/dist/esm/reducers/medias.js +68 -0
  122. package/dist/esm/reducers/notifications.js +23 -0
  123. package/dist/esm/reducers/search.js +92 -0
  124. package/dist/esm/reducers/status.js +30 -0
  125. package/dist/esm/redux/index.js +7 -0
  126. package/dist/esm/redux/middleware/waitUntilAction.js +48 -0
  127. package/dist/esm/routing/history.js +12 -0
  128. package/dist/esm/types/diacritics.d.js +0 -0
  129. package/dist/esm/types/global.d.js +1 -0
  130. package/dist/esm/types/immutable.js +7 -0
  131. package/dist/esm/types/redux.js +14 -0
  132. package/dist/esm/types/tomlify-j0.4.d.js +0 -0
  133. package/dist/esm/valueObjects/AssetProxy.js +44 -0
  134. package/dist/esm/valueObjects/EditorComponent.js +34 -0
  135. package/dist/esm/valueObjects/Entry.js +20 -0
  136. package/index.d.ts +662 -0
  137. package/package.json +100 -0
  138. package/src/__tests__/backend.spec.js +1223 -0
  139. package/src/actions/__tests__/config.spec.js +1023 -0
  140. package/src/actions/__tests__/editorialWorkflow.spec.js +216 -0
  141. package/src/actions/__tests__/entries.spec.js +610 -0
  142. package/src/actions/__tests__/media.spec.ts +171 -0
  143. package/src/actions/__tests__/mediaLibrary.spec.js +462 -0
  144. package/src/actions/__tests__/search.spec.js +209 -0
  145. package/src/actions/auth.ts +127 -0
  146. package/src/actions/collections.ts +18 -0
  147. package/src/actions/config.ts +574 -0
  148. package/src/actions/deploys.ts +105 -0
  149. package/src/actions/editorialWorkflow.ts +567 -0
  150. package/src/actions/entries.ts +1070 -0
  151. package/src/actions/media.ts +139 -0
  152. package/src/actions/mediaLibrary.ts +639 -0
  153. package/src/actions/notifications.ts +36 -0
  154. package/src/actions/search.ts +221 -0
  155. package/src/actions/status.ts +99 -0
  156. package/src/actions/waitUntil.ts +49 -0
  157. package/src/backend.ts +1411 -0
  158. package/src/bootstrap.js +104 -0
  159. package/src/components/App/App.js +295 -0
  160. package/src/components/App/Header.js +291 -0
  161. package/src/components/App/NotFoundPage.js +23 -0
  162. package/src/components/Collection/Collection.js +210 -0
  163. package/src/components/Collection/CollectionControls.js +58 -0
  164. package/src/components/Collection/CollectionSearch.js +243 -0
  165. package/src/components/Collection/CollectionTop.js +81 -0
  166. package/src/components/Collection/ControlButton.js +27 -0
  167. package/src/components/Collection/Entries/Entries.js +82 -0
  168. package/src/components/Collection/Entries/EntriesCollection.js +277 -0
  169. package/src/components/Collection/Entries/EntriesSearch.js +102 -0
  170. package/src/components/Collection/Entries/EntryCard.js +256 -0
  171. package/src/components/Collection/Entries/EntryListing.js +151 -0
  172. package/src/components/Collection/Entries/__tests__/EntriesCollection.spec.js +163 -0
  173. package/src/components/Collection/Entries/__tests__/__snapshots__/EntriesCollection.spec.js.snap +46 -0
  174. package/src/components/Collection/FilterControl.js +39 -0
  175. package/src/components/Collection/GroupControl.js +39 -0
  176. package/src/components/Collection/NestedCollection.js +330 -0
  177. package/src/components/Collection/Sidebar.js +136 -0
  178. package/src/components/Collection/SortControl.js +68 -0
  179. package/src/components/Collection/ViewStyleControl.js +52 -0
  180. package/src/components/Collection/__tests__/Collection.spec.js +75 -0
  181. package/src/components/Collection/__tests__/NestedCollection.spec.js +445 -0
  182. package/src/components/Collection/__tests__/Sidebar.spec.js +87 -0
  183. package/src/components/Collection/__tests__/__snapshots__/Collection.spec.js.snap +144 -0
  184. package/src/components/Collection/__tests__/__snapshots__/NestedCollection.spec.js.snap +550 -0
  185. package/src/components/Collection/__tests__/__snapshots__/Sidebar.spec.js.snap +312 -0
  186. package/src/components/Editor/Editor.js +497 -0
  187. package/src/components/Editor/EditorControlPane/EditorControl.js +453 -0
  188. package/src/components/Editor/EditorControlPane/EditorControlPane.js +269 -0
  189. package/src/components/Editor/EditorControlPane/Widget.js +384 -0
  190. package/src/components/Editor/EditorInterface.js +444 -0
  191. package/src/components/Editor/EditorPreviewPane/EditorPreview.js +40 -0
  192. package/src/components/Editor/EditorPreviewPane/EditorPreviewContent.js +75 -0
  193. package/src/components/Editor/EditorPreviewPane/EditorPreviewPane.js +337 -0
  194. package/src/components/Editor/EditorPreviewPane/PreviewHOC.js +33 -0
  195. package/src/components/Editor/EditorToolbar.js +728 -0
  196. package/src/components/Editor/__tests__/Editor.spec.js +221 -0
  197. package/src/components/Editor/__tests__/EditorToolbar.spec.js +166 -0
  198. package/src/components/Editor/__tests__/__snapshots__/Editor.spec.js.snap +45 -0
  199. package/src/components/Editor/__tests__/__snapshots__/EditorToolbar.spec.js.snap +4265 -0
  200. package/src/components/Editor/withWorkflow.js +61 -0
  201. package/src/components/EditorWidgets/Unknown/UnknownControl.js +17 -0
  202. package/src/components/EditorWidgets/Unknown/UnknownPreview.js +19 -0
  203. package/src/components/EditorWidgets/index.js +5 -0
  204. package/src/components/MediaLibrary/EmptyMessage.js +28 -0
  205. package/src/components/MediaLibrary/MediaLibrary.js +411 -0
  206. package/src/components/MediaLibrary/MediaLibraryButtons.js +135 -0
  207. package/src/components/MediaLibrary/MediaLibraryCard.js +128 -0
  208. package/src/components/MediaLibrary/MediaLibraryCardGrid.js +199 -0
  209. package/src/components/MediaLibrary/MediaLibraryHeader.js +48 -0
  210. package/src/components/MediaLibrary/MediaLibraryModal.js +200 -0
  211. package/src/components/MediaLibrary/MediaLibrarySearch.js +61 -0
  212. package/src/components/MediaLibrary/MediaLibraryTop.js +144 -0
  213. package/src/components/MediaLibrary/__tests__/MediaLibraryButtons.spec.js +45 -0
  214. package/src/components/MediaLibrary/__tests__/MediaLibraryCard.spec.js +49 -0
  215. package/src/components/MediaLibrary/__tests__/__snapshots__/MediaLibraryCard.spec.js.snap +264 -0
  216. package/src/components/UI/DragDrop.js +66 -0
  217. package/src/components/UI/ErrorBoundary.js +213 -0
  218. package/src/components/UI/FileUploadButton.js +24 -0
  219. package/src/components/UI/Modal.js +112 -0
  220. package/src/components/UI/Notifications.tsx +83 -0
  221. package/src/components/UI/SettingsDropdown.js +130 -0
  222. package/src/components/UI/__tests__/ErrorBoundary.spec.js +57 -0
  223. package/src/components/UI/index.js +6 -0
  224. package/src/components/Workflow/Workflow.js +169 -0
  225. package/src/components/Workflow/WorkflowCard.js +177 -0
  226. package/src/components/Workflow/WorkflowList.js +272 -0
  227. package/src/constants/__tests__/configSchema.spec.js +644 -0
  228. package/src/constants/collectionTypes.ts +2 -0
  229. package/src/constants/collectionViews.js +2 -0
  230. package/src/constants/commitProps.ts +2 -0
  231. package/src/constants/configSchema.js +489 -0
  232. package/src/constants/fieldInference.tsx +78 -0
  233. package/src/constants/publishModes.ts +22 -0
  234. package/src/constants/validationErrorTypes.js +6 -0
  235. package/src/formats/__tests__/formats.spec.js +87 -0
  236. package/src/formats/__tests__/frontmatter.spec.js +450 -0
  237. package/src/formats/__tests__/toml.spec.js +9 -0
  238. package/src/formats/__tests__/yaml.spec.js +189 -0
  239. package/src/formats/formats.ts +97 -0
  240. package/src/formats/frontmatter.ts +150 -0
  241. package/src/formats/helpers.ts +14 -0
  242. package/src/formats/json.ts +9 -0
  243. package/src/formats/toml.ts +33 -0
  244. package/src/formats/yaml.ts +73 -0
  245. package/src/index.js +8 -0
  246. package/src/integrations/index.js +35 -0
  247. package/src/integrations/providers/algolia/implementation.js +176 -0
  248. package/src/integrations/providers/assetStore/implementation.js +148 -0
  249. package/src/lib/__tests__/formatters.spec.js +844 -0
  250. package/src/lib/__tests__/i18n.spec.js +792 -0
  251. package/src/lib/__tests__/imageTransformations.spec.ts +97 -0
  252. package/src/lib/__tests__/phrases.spec.js +119 -0
  253. package/src/lib/__tests__/registry.spec.js +261 -0
  254. package/src/lib/__tests__/serializeEntryValues.spec.js +22 -0
  255. package/src/lib/__tests__/urlHelper.spec.js +145 -0
  256. package/src/lib/consoleError.js +7 -0
  257. package/src/lib/formatters.ts +297 -0
  258. package/src/lib/i18n.ts +462 -0
  259. package/src/lib/imageTransformations.ts +212 -0
  260. package/src/lib/phrases.js +8 -0
  261. package/src/lib/polyfill.js +9 -0
  262. package/src/lib/registry.js +315 -0
  263. package/src/lib/serializeEntryValues.js +75 -0
  264. package/src/lib/stega.ts +145 -0
  265. package/src/lib/textHelper.js +11 -0
  266. package/src/lib/urlHelper.ts +152 -0
  267. package/src/mediaLibrary.ts +51 -0
  268. package/src/reducers/__tests__/auth.spec.ts +38 -0
  269. package/src/reducers/__tests__/collections.spec.js +610 -0
  270. package/src/reducers/__tests__/config.spec.js +38 -0
  271. package/src/reducers/__tests__/deploys.spec.ts +111 -0
  272. package/src/reducers/__tests__/entries.spec.js +694 -0
  273. package/src/reducers/__tests__/entryDraft.spec.js +315 -0
  274. package/src/reducers/__tests__/globalUI.js +43 -0
  275. package/src/reducers/__tests__/integrations.spec.ts +76 -0
  276. package/src/reducers/__tests__/mediaLibrary.spec.js +154 -0
  277. package/src/reducers/__tests__/medias.spec.ts +49 -0
  278. package/src/reducers/auth.ts +46 -0
  279. package/src/reducers/collections.ts +535 -0
  280. package/src/reducers/combinedReducer.ts +11 -0
  281. package/src/reducers/config.ts +38 -0
  282. package/src/reducers/cursors.js +36 -0
  283. package/src/reducers/deploys.ts +54 -0
  284. package/src/reducers/editorialWorkflow.ts +163 -0
  285. package/src/reducers/entries.ts +819 -0
  286. package/src/reducers/entryDraft.js +259 -0
  287. package/src/reducers/globalUI.ts +45 -0
  288. package/src/reducers/index.ts +82 -0
  289. package/src/reducers/integrations.ts +59 -0
  290. package/src/reducers/mediaLibrary.ts +296 -0
  291. package/src/reducers/medias.ts +66 -0
  292. package/src/reducers/notifications.ts +52 -0
  293. package/src/reducers/search.ts +111 -0
  294. package/src/reducers/status.ts +40 -0
  295. package/src/redux/index.ts +18 -0
  296. package/src/redux/middleware/waitUntilAction.ts +64 -0
  297. package/src/routing/__tests__/history.spec.ts +49 -0
  298. package/src/routing/history.ts +17 -0
  299. package/src/types/diacritics.d.ts +1 -0
  300. package/src/types/global.d.ts +8 -0
  301. package/src/types/immutable.ts +49 -0
  302. package/src/types/redux.ts +875 -0
  303. package/src/types/tomlify-j0.4.d.ts +13 -0
  304. package/src/valueObjects/AssetProxy.ts +48 -0
  305. package/src/valueObjects/EditorComponent.js +38 -0
  306. package/src/valueObjects/Entry.ts +63 -0
@@ -0,0 +1,297 @@
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
+ authorEmail?: string;
48
+ };
49
+
50
+ export function commitMessageFormatter(
51
+ type: keyof typeof commitMessageTemplates,
52
+ config: CmsConfig,
53
+ { slug, path, collection, authorLogin, authorName, authorEmail }: Options,
54
+ isOpenAuthoring?: boolean,
55
+ ) {
56
+ const templates = { ...commitMessageTemplates, ...(config.backend.commit_messages || {}) };
57
+
58
+ let trailers = '';
59
+ if (config.backend.signoff_commits) {
60
+ if (!authorName) {
61
+ console.warn('Option signoff_commits is enabled, but author name is unknown');
62
+ } else if (!authorEmail) {
63
+ console.warn('Option signoff_commits is enabled, but author email is unknown');
64
+ } else {
65
+ trailers = `\n\nSigned-off-by: ${authorName} <${authorEmail}>\n`;
66
+ }
67
+ }
68
+
69
+ const commitMessage = templates[type].replace(variableRegex, (_, variable) => {
70
+ switch (variable) {
71
+ case 'slug':
72
+ return slug || '';
73
+ case 'path':
74
+ return path || '';
75
+ case 'collection':
76
+ return collection ? collection.get('label_singular') || collection.get('label') : '';
77
+ case 'author-login':
78
+ return authorLogin || '';
79
+ case 'author-name':
80
+ return authorName || '';
81
+ default:
82
+ console.warn(`Ignoring unknown variable “${variable}” in commit message template.`);
83
+ return '';
84
+ }
85
+ });
86
+
87
+ if (!isOpenAuthoring) {
88
+ return commitMessage + trailers;
89
+ }
90
+
91
+ const message = templates.openAuthoring.replace(variableRegex, (_, variable) => {
92
+ switch (variable) {
93
+ case 'message':
94
+ return commitMessage;
95
+ case 'author-login':
96
+ return authorLogin || '';
97
+ case 'author-name':
98
+ return authorName || '';
99
+ default:
100
+ console.warn(`Ignoring unknown variable “${variable}” in open authoring message template.`);
101
+ return '';
102
+ }
103
+ });
104
+
105
+ return message + trailers;
106
+ }
107
+
108
+ export function prepareSlug(slug: string) {
109
+ return (
110
+ slug
111
+ .trim()
112
+ // Convert slug to lower-case
113
+ .toLocaleLowerCase()
114
+
115
+ // Remove single quotes.
116
+ .replace(/[']/g, '')
117
+
118
+ // Replace periods with dashes.
119
+ .replace(/[.]/g, '-')
120
+ );
121
+ }
122
+
123
+ export function getProcessSegment(
124
+ slugConfig?: CmsSlug,
125
+ ignoreValues?: string[],
126
+ preserveSlashes?: boolean,
127
+ ) {
128
+ return (value: string) =>
129
+ ignoreValues && ignoreValues.includes(value)
130
+ ? value
131
+ : flow([
132
+ value => String(value),
133
+ prepareSlug,
134
+ partialRight(sanitizeSlug, slugConfig, preserveSlashes),
135
+ ])(value);
136
+ }
137
+
138
+ export function slugFormatter(
139
+ collection: Collection,
140
+ entryData: Map<string, unknown>,
141
+ slugConfig?: CmsSlug,
142
+ ) {
143
+ const slugTemplate = collection.get('slug') || '{{slug}}';
144
+
145
+ const identifier = entryData.getIn(keyToPathArray(selectIdentifier(collection) as string));
146
+ if (!identifier) {
147
+ throw new Error(
148
+ 'Collection must have a field name that is a valid entry identifier, or must have `identifier_field` set',
149
+ );
150
+ }
151
+
152
+ const processSegment = getProcessSegment(slugConfig);
153
+ const date =
154
+ parseDateFromEntryData(
155
+ entryData as unknown as Map<string, unknown>,
156
+ selectInferredField(collection, 'date'),
157
+ ) || new Date(Date.now());
158
+ const slug = compileStringTemplate(slugTemplate, date, identifier, entryData, processSegment);
159
+
160
+ if (!collection.has('path')) {
161
+ return slug;
162
+ } else {
163
+ const pathTemplate = prepareSlug(collection.get('path') as string);
164
+ return compileStringTemplate(pathTemplate, date, slug, entryData, (value: string) =>
165
+ value === slug ? value : processSegment(value),
166
+ );
167
+ }
168
+ }
169
+
170
+ export function previewUrlFormatter(
171
+ baseUrl: string,
172
+ collection: Collection,
173
+ slug: string,
174
+ entry: EntryMap,
175
+ slugConfig?: CmsSlug,
176
+ ) {
177
+ /**
178
+ * Preview URL can't be created without `baseUrl`. This makes preview URLs
179
+ * optional for backends that don't support them.
180
+ */
181
+ if (!baseUrl) {
182
+ return;
183
+ }
184
+
185
+ const basePath = trimEnd(baseUrl, '/');
186
+
187
+ const isFileCollection = collection.get('type') === FILES;
188
+ const file = isFileCollection ? getFileFromSlug(collection, entry.get('slug')) : undefined;
189
+
190
+ function getPathTemplate() {
191
+ return file?.get('preview_path') ?? collection.get('preview_path');
192
+ }
193
+
194
+ function getDateField() {
195
+ return file?.get('preview_path_date_field') ?? collection.get('preview_path_date_field');
196
+ }
197
+
198
+ /**
199
+ * If a `previewPath` is provided for the collection/file, use it to construct the
200
+ * URL path.
201
+ */
202
+ const pathTemplate = getPathTemplate();
203
+
204
+ /**
205
+ * Without a `previewPath` for the collection/file (via config), the preview URL
206
+ * will be the URL provided by the backend.
207
+ */
208
+ if (!pathTemplate) {
209
+ return baseUrl;
210
+ }
211
+
212
+ let fields = entry.get('data') as Map<string, string>;
213
+ fields = addFileTemplateFields(entry.get('path'), fields, collection.get('folder'));
214
+ const dateFieldName = getDateField() || selectInferredField(collection, 'date');
215
+ const date = parseDateFromEntry(entry as unknown as Map<string, unknown>, dateFieldName);
216
+ const previewPathPreserveSlashes = collection.get('preview_path_preserve_slashes');
217
+ const preserveSlashes = !!(previewPathPreserveSlashes ?? collection.has('nested'));
218
+
219
+ // Prepare and sanitize slug variables only, leave the rest of the
220
+ // `preview_path` template as is.
221
+ const processSegment = getProcessSegment(slugConfig, [fields.get('dirname')], preserveSlashes);
222
+ let compiledPath;
223
+
224
+ try {
225
+ compiledPath = compileStringTemplate(pathTemplate, date, slug, fields, processSegment);
226
+ } catch (err: unknown) {
227
+ // Print an error and ignore `preview_path` if both:
228
+ // 1. Date is invalid (according to DayJs), and
229
+ // 2. A date expression (eg. `{{year}}`) is used in `preview_path`
230
+ if (err instanceof Error && err.name === SLUG_MISSING_REQUIRED_DATE) {
231
+ console.error(stripIndent`
232
+ Collection "${collection.get('name')}" configuration error:
233
+ \`preview_path_date_field\` must be a field with a valid date. Ignoring \`preview_path\`.
234
+ `);
235
+ return basePath;
236
+ }
237
+ throw err;
238
+ }
239
+
240
+ const previewPath = trimStart(compiledPath, ' /');
241
+ return `${basePath}/${previewPath}`;
242
+ }
243
+
244
+ export function summaryFormatter(summaryTemplate: string, entry: EntryMap, collection: Collection) {
245
+ let entryData = entry.get('data');
246
+ const date =
247
+ parseDateFromEntry(
248
+ entry as unknown as Map<string, unknown>,
249
+ selectInferredField(collection, 'date'),
250
+ ) || null;
251
+ const identifier = entryData.getIn(keyToPathArray(selectIdentifier(collection) as string));
252
+
253
+ entryData = addFileTemplateFields(entry.get('path'), entryData, collection.get('folder'));
254
+ // allow commit information in summary template
255
+ if (entry.get('author') && !selectField(collection, COMMIT_AUTHOR)) {
256
+ entryData = entryData.set(COMMIT_AUTHOR, entry.get('author'));
257
+ }
258
+ if (entry.get('updatedOn') && !selectField(collection, COMMIT_DATE)) {
259
+ entryData = entryData.set(COMMIT_DATE, entry.get('updatedOn'));
260
+ }
261
+ const summary = compileStringTemplate(summaryTemplate, date, identifier, entryData);
262
+ return summary;
263
+ }
264
+
265
+ export function folderFormatter(
266
+ folderTemplate: string,
267
+ entry: EntryMap | undefined,
268
+ collection: Collection,
269
+ defaultFolder: string,
270
+ folderKey: string,
271
+ slugConfig?: CmsSlug,
272
+ ) {
273
+ if (!entry || !entry.get('data')) {
274
+ return folderTemplate;
275
+ }
276
+
277
+ let fields = (entry.get('data') as Map<string, string>).set(folderKey, defaultFolder);
278
+ fields = addFileTemplateFields(entry.get('path'), fields, collection.get('folder'));
279
+
280
+ const date =
281
+ parseDateFromEntry(
282
+ entry as unknown as Map<string, unknown>,
283
+ selectInferredField(collection, 'date'),
284
+ ) || null;
285
+ const identifier = fields.getIn(keyToPathArray(selectIdentifier(collection) as string));
286
+ const processSegment = getProcessSegment(slugConfig, [defaultFolder, fields.get('dirname')]);
287
+
288
+ const mediaFolder = compileStringTemplate(
289
+ folderTemplate,
290
+ date,
291
+ identifier,
292
+ fields,
293
+ processSegment,
294
+ );
295
+
296
+ return mediaFolder;
297
+ }