@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,372 @@
1
+ import { Map, List } from 'immutable';
2
+ import set from 'lodash/set';
3
+ import groupBy from 'lodash/groupBy';
4
+ import escapeRegExp from 'lodash/escapeRegExp';
5
+ import { selectEntrySlug } from '../reducers/collections';
6
+ export const I18N = 'i18n';
7
+ export let I18N_STRUCTURE = /*#__PURE__*/function (I18N_STRUCTURE) {
8
+ I18N_STRUCTURE["MULTIPLE_FOLDERS"] = "multiple_folders";
9
+ I18N_STRUCTURE["MULTIPLE_FILES"] = "multiple_files";
10
+ I18N_STRUCTURE["SINGLE_FILE"] = "single_file";
11
+ return I18N_STRUCTURE;
12
+ }({});
13
+ export let I18N_FIELD = /*#__PURE__*/function (I18N_FIELD) {
14
+ I18N_FIELD["TRANSLATE"] = "translate";
15
+ I18N_FIELD["DUPLICATE"] = "duplicate";
16
+ I18N_FIELD["NONE"] = "none";
17
+ return I18N_FIELD;
18
+ }({});
19
+ export function hasI18n(collection) {
20
+ return collection.has(I18N);
21
+ }
22
+ export function getI18nInfo(collection) {
23
+ if (!hasI18n(collection)) {
24
+ return {};
25
+ }
26
+ const {
27
+ structure,
28
+ locales,
29
+ default_locale: defaultLocale
30
+ } = collection.get(I18N).toJS();
31
+ return {
32
+ structure,
33
+ locales,
34
+ defaultLocale
35
+ };
36
+ }
37
+ export function getI18nFilesDepth(collection, depth) {
38
+ const {
39
+ structure
40
+ } = getI18nInfo(collection);
41
+ if (structure === I18N_STRUCTURE.MULTIPLE_FOLDERS) {
42
+ return depth + 1;
43
+ }
44
+ return depth;
45
+ }
46
+ export function isFieldTranslatable(field, locale, defaultLocale) {
47
+ const isTranslatable = locale !== defaultLocale && field.get(I18N) === I18N_FIELD.TRANSLATE;
48
+ return isTranslatable;
49
+ }
50
+ export function isFieldDuplicate(field, locale, defaultLocale) {
51
+ const isDuplicate = locale !== defaultLocale && field.get(I18N) === I18N_FIELD.DUPLICATE;
52
+ return isDuplicate;
53
+ }
54
+ export function isFieldHidden(field, locale, defaultLocale) {
55
+ const isHidden = locale !== defaultLocale && field.get(I18N) === I18N_FIELD.NONE;
56
+ return isHidden;
57
+ }
58
+ export function getLocaleDataPath(locale) {
59
+ return [I18N, locale, 'data'];
60
+ }
61
+ export function getDataPath(locale, defaultLocale) {
62
+ const dataPath = locale !== defaultLocale ? getLocaleDataPath(locale) : ['data'];
63
+ return dataPath;
64
+ }
65
+ export function getFilePath(structure, extension, path, slug, locale) {
66
+ switch (structure) {
67
+ case I18N_STRUCTURE.MULTIPLE_FOLDERS:
68
+ return path.replace(`/${slug}`, `/${locale}/${slug}`);
69
+ case I18N_STRUCTURE.MULTIPLE_FILES:
70
+ return path.replace(new RegExp(`${escapeRegExp(extension)}$`), `${locale}.${extension}`);
71
+ case I18N_STRUCTURE.SINGLE_FILE:
72
+ default:
73
+ return path;
74
+ }
75
+ }
76
+ export function getLocaleFromPath(structure, extension, path) {
77
+ switch (structure) {
78
+ case I18N_STRUCTURE.MULTIPLE_FOLDERS:
79
+ {
80
+ const parts = path.split('/');
81
+ // filename
82
+ parts.pop();
83
+ // locale
84
+ return parts.pop();
85
+ }
86
+ case I18N_STRUCTURE.MULTIPLE_FILES:
87
+ {
88
+ const parts = path.slice(0, -`.${extension}`.length);
89
+ return parts.split('.').pop();
90
+ }
91
+ case I18N_STRUCTURE.SINGLE_FILE:
92
+ default:
93
+ return '';
94
+ }
95
+ }
96
+ export function getFilePaths(collection, extension, path, slug) {
97
+ const {
98
+ structure,
99
+ locales
100
+ } = getI18nInfo(collection);
101
+ if (structure === I18N_STRUCTURE.SINGLE_FILE) {
102
+ return [path];
103
+ }
104
+ const paths = locales.map(locale => getFilePath(structure, extension, path, slug, locale));
105
+ return paths;
106
+ }
107
+ export function normalizeFilePath(structure, path, locale) {
108
+ switch (structure) {
109
+ case I18N_STRUCTURE.MULTIPLE_FOLDERS:
110
+ return path.replace(`${locale}/`, '');
111
+ case I18N_STRUCTURE.MULTIPLE_FILES:
112
+ return path.replace(`.${locale}`, '');
113
+ case I18N_STRUCTURE.SINGLE_FILE:
114
+ default:
115
+ return path;
116
+ }
117
+ }
118
+ export function getI18nFiles(collection, extension, entryDraft, entryToRaw, path, slug, newPath) {
119
+ const {
120
+ structure,
121
+ defaultLocale,
122
+ locales
123
+ } = getI18nInfo(collection);
124
+ if (structure === I18N_STRUCTURE.SINGLE_FILE) {
125
+ const data = locales.reduce((map, locale) => {
126
+ const dataPath = getDataPath(locale, defaultLocale);
127
+ return map.set(locale, entryDraft.getIn(dataPath));
128
+ }, Map({}));
129
+ const draft = entryDraft.set('data', data);
130
+ return [{
131
+ path: getFilePath(structure, extension, path, slug, locales[0]),
132
+ slug,
133
+ raw: entryToRaw(draft),
134
+ ...(newPath && {
135
+ newPath: getFilePath(structure, extension, newPath, slug, locales[0])
136
+ })
137
+ }];
138
+ }
139
+ const dataFiles = locales.map(locale => {
140
+ const dataPath = getDataPath(locale, defaultLocale);
141
+ const draft = entryDraft.set('data', entryDraft.getIn(dataPath));
142
+ return {
143
+ path: getFilePath(structure, extension, path, slug, locale),
144
+ slug,
145
+ raw: draft.get('data') ? entryToRaw(draft) : '',
146
+ ...(newPath && {
147
+ newPath: getFilePath(structure, extension, newPath, slug, locale)
148
+ })
149
+ };
150
+ }).filter(dataFile => dataFile.raw);
151
+ return dataFiles;
152
+ }
153
+ export function getI18nBackup(collection, entry, entryToRaw) {
154
+ const {
155
+ locales,
156
+ defaultLocale
157
+ } = getI18nInfo(collection);
158
+ const i18nBackup = locales.filter(l => l !== defaultLocale).reduce((acc, locale) => {
159
+ const dataPath = getDataPath(locale, defaultLocale);
160
+ const data = entry.getIn(dataPath);
161
+ if (!data) {
162
+ return acc;
163
+ }
164
+ const draft = entry.set('data', data);
165
+ return {
166
+ ...acc,
167
+ [locale]: {
168
+ raw: entryToRaw(draft)
169
+ }
170
+ };
171
+ }, {});
172
+ return i18nBackup;
173
+ }
174
+ export function formatI18nBackup(i18nBackup, formatRawData) {
175
+ const i18n = Object.entries(i18nBackup).reduce((acc, [locale, {
176
+ raw
177
+ }]) => {
178
+ const entry = formatRawData(raw);
179
+ return {
180
+ ...acc,
181
+ [locale]: {
182
+ data: entry.data
183
+ }
184
+ };
185
+ }, {});
186
+ return i18n;
187
+ }
188
+ function applyDefaultI18nValues(collection, value, defaultLocaleValue) {
189
+ if (collection.get('fields') === undefined) {
190
+ return;
191
+ }
192
+ collection.get('fields').forEach(field => {
193
+ if (field && field.get(I18N) === I18N_FIELD.DUPLICATE) {
194
+ const data = value.data[field.get('name')];
195
+ if (!data) {
196
+ value.data[field.get('name')] = defaultLocaleValue.data[field.get('name')];
197
+ }
198
+ }
199
+ });
200
+ }
201
+ function mergeValues(collection, structure, defaultLocale, values) {
202
+ let defaultEntry = values.find(e => e.locale === defaultLocale);
203
+ if (!defaultEntry) {
204
+ defaultEntry = values[0];
205
+ console.warn(`Could not locale entry for default locale '${defaultLocale}'`);
206
+ }
207
+ const i18n = values.filter(e => e.locale !== defaultEntry.locale).reduce((acc, {
208
+ locale,
209
+ value
210
+ }) => {
211
+ const dataPath = getLocaleDataPath(locale);
212
+ if (defaultEntry) {
213
+ applyDefaultI18nValues(collection, value, defaultEntry.value);
214
+ }
215
+ return set(acc, dataPath, value.data);
216
+ }, {});
217
+ const path = normalizeFilePath(structure, defaultEntry.value.path, defaultLocale);
218
+ const slug = selectEntrySlug(collection, path);
219
+ const entryValue = {
220
+ ...defaultEntry.value,
221
+ raw: '',
222
+ ...i18n,
223
+ path,
224
+ slug
225
+ };
226
+ return entryValue;
227
+ }
228
+ function mergeSingleFileValue(entryValue, defaultLocale, locales) {
229
+ const data = entryValue.data[defaultLocale] || {};
230
+ const i18n = locales.filter(l => l !== defaultLocale).map(l => ({
231
+ locale: l,
232
+ value: entryValue.data[l]
233
+ })).filter(e => e.value).reduce((acc, e) => {
234
+ return {
235
+ ...acc,
236
+ [e.locale]: {
237
+ data: e.value
238
+ }
239
+ };
240
+ }, {});
241
+ return {
242
+ ...entryValue,
243
+ data,
244
+ i18n,
245
+ raw: ''
246
+ };
247
+ }
248
+ export async function getI18nEntry(collection, extension, path, slug, getEntryValue) {
249
+ const {
250
+ structure,
251
+ locales,
252
+ defaultLocale
253
+ } = getI18nInfo(collection);
254
+ let entryValue;
255
+ if (structure === I18N_STRUCTURE.SINGLE_FILE) {
256
+ entryValue = mergeSingleFileValue(await getEntryValue(path), defaultLocale, locales);
257
+ } else {
258
+ const entryValuesResults = await Promise.allSettled(locales.map(async locale => {
259
+ const entryPath = getFilePath(structure, extension, path, slug, locale);
260
+ const value = await getEntryValue(entryPath);
261
+ return {
262
+ value,
263
+ locale
264
+ };
265
+ }));
266
+ const nonNullValues = entryValuesResults.map(e => e.status === 'fulfilled' ? e.value : undefined).filter(e => e !== undefined);
267
+ if (nonNullValues.length === 0) {
268
+ // mergeValues will throw on an empty list, and show the error messages.
269
+ const [error = new Error('No entry values found for any locale')] = entryValuesResults.map(e => e.status === 'rejected' ? e.reason : undefined).filter(e => e !== undefined);
270
+ throw error;
271
+ }
272
+ entryValue = mergeValues(collection, structure, defaultLocale, nonNullValues);
273
+ }
274
+ return entryValue;
275
+ }
276
+ export function groupEntries(collection, extension, entries) {
277
+ const {
278
+ structure,
279
+ defaultLocale,
280
+ locales
281
+ } = getI18nInfo(collection);
282
+ if (structure === I18N_STRUCTURE.SINGLE_FILE) {
283
+ return entries.map(e => mergeSingleFileValue(e, defaultLocale, locales));
284
+ }
285
+ const grouped = groupBy(entries.map(e => ({
286
+ locale: getLocaleFromPath(structure, extension, e.path),
287
+ value: e
288
+ })), ({
289
+ locale,
290
+ value: e
291
+ }) => {
292
+ return normalizeFilePath(structure, e.path, locale);
293
+ });
294
+ const groupedEntries = Object.values(grouped).reduce((acc, values) => {
295
+ const entryValue = mergeValues(collection, structure, defaultLocale, values);
296
+ return [...acc, entryValue];
297
+ }, []);
298
+ return groupedEntries;
299
+ }
300
+ export function getI18nDataFiles(collection, extension, path, slug, diffFiles) {
301
+ const {
302
+ structure
303
+ } = getI18nInfo(collection);
304
+ if (structure === I18N_STRUCTURE.SINGLE_FILE) {
305
+ return diffFiles;
306
+ }
307
+ const paths = getFilePaths(collection, extension, path, slug);
308
+ const dataFiles = paths.reduce((acc, path) => {
309
+ const dataFile = diffFiles.find(file => file.path === path);
310
+ if (dataFile) {
311
+ return [...acc, dataFile];
312
+ } else {
313
+ return [...acc, {
314
+ path,
315
+ id: '',
316
+ newFile: false
317
+ }];
318
+ }
319
+ }, []);
320
+ return dataFiles;
321
+ }
322
+
323
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
324
+ export function duplicateDefaultI18nFields(collection, dataFields) {
325
+ const {
326
+ locales,
327
+ defaultLocale
328
+ } = getI18nInfo(collection);
329
+ const i18nFields = Object.fromEntries(locales.filter(locale => locale !== defaultLocale).map(locale => [locale, {
330
+ data: dataFields
331
+ }]));
332
+ return i18nFields;
333
+ }
334
+ export function duplicateI18nFields(entryDraft, field, locales, defaultLocale, fieldPath = [field.get('name')]) {
335
+ const value = entryDraft.getIn(['entry', 'data', ...fieldPath]);
336
+ if (field.get(I18N) === I18N_FIELD.DUPLICATE) {
337
+ locales.filter(l => l !== defaultLocale).forEach(l => {
338
+ entryDraft = entryDraft.setIn(['entry', ...getDataPath(l, defaultLocale), ...fieldPath], value);
339
+ });
340
+ }
341
+ if (field.has('field') && !List.isList(value)) {
342
+ const fields = [field.get('field')];
343
+ fields.forEach(field => {
344
+ entryDraft = duplicateI18nFields(entryDraft, field, locales, defaultLocale, [...fieldPath, field.get('name')]);
345
+ });
346
+ } else if (field.has('fields') && !List.isList(value)) {
347
+ const fields = field.get('fields').toArray();
348
+ fields.forEach(field => {
349
+ entryDraft = duplicateI18nFields(entryDraft, field, locales, defaultLocale, [...fieldPath, field.get('name')]);
350
+ });
351
+ }
352
+ return entryDraft;
353
+ }
354
+ export function getPreviewEntry(entry, locale, defaultLocale) {
355
+ if (locale === defaultLocale) {
356
+ return entry;
357
+ }
358
+ return entry.set('data', entry.getIn([I18N, locale, 'data']));
359
+ }
360
+ export function serializeI18n(collection, entry,
361
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
362
+ serializeValues) {
363
+ const {
364
+ locales,
365
+ defaultLocale
366
+ } = getI18nInfo(collection);
367
+ locales.filter(locale => locale !== defaultLocale).forEach(locale => {
368
+ const dataPath = getLocaleDataPath(locale);
369
+ entry = entry.setIn(dataPath, serializeValues(entry.getIn(dataPath)));
370
+ });
371
+ return entry;
372
+ }
@@ -0,0 +1,143 @@
1
+ import { join } from 'path';
2
+ import { basename, fileExtension, fileExtensionWithSeparator } from 'decap-cms-lib-util';
3
+ const TRANSFORMATIONS_FOLDER = '_transformations';
4
+ const SUPPORTED_OUTPUT_FORMATS = ['jpg', 'jpeg', 'png', 'webp'];
5
+ function getFieldImageTransformations(field) {
6
+ const imageTransformations = field?.get('image_transformations');
7
+ return imageTransformations?.toJS ? imageTransformations.toJS() : imageTransformations;
8
+ }
9
+ function normalizeVariant(variant) {
10
+ const format = variant.format?.toLowerCase();
11
+ return {
12
+ ...variant,
13
+ format: format === 'jpeg' ? 'jpg' : format
14
+ };
15
+ }
16
+ export function getImageTransformationsConfig(config, field) {
17
+ const imageTransformations = getFieldImageTransformations(field) ?? config.image_transformations;
18
+ if (!imageTransformations) {
19
+ return undefined;
20
+ }
21
+ if (Array.isArray(imageTransformations)) {
22
+ return {
23
+ keepOriginal: true,
24
+ variants: imageTransformations.map(normalizeVariant)
25
+ };
26
+ }
27
+ return {
28
+ keepOriginal: imageTransformations.keep_original ?? true,
29
+ variants: (imageTransformations.variants || []).map(normalizeVariant)
30
+ };
31
+ }
32
+ export function shouldTransformImage(file, config) {
33
+ return !!config && config.variants.length > 0 && file.type.startsWith('image/') && file.type !== 'image/svg+xml';
34
+ }
35
+ function getOutputFormat(fileName, variant) {
36
+ const inputFormat = fileExtension(fileName).toLowerCase();
37
+ const outputFormat = variant.format || inputFormat;
38
+ return SUPPORTED_OUTPUT_FORMATS.includes(outputFormat) ? outputFormat : 'png';
39
+ }
40
+ function getMimeType(format) {
41
+ switch (format) {
42
+ case 'jpg':
43
+ case 'jpeg':
44
+ return 'image/jpeg';
45
+ case 'webp':
46
+ return 'image/webp';
47
+ default:
48
+ return 'image/png';
49
+ }
50
+ }
51
+ function getVariantFileName(fileName, format) {
52
+ const extension = fileExtensionWithSeparator(fileName);
53
+ const baseName = extension ? basename(fileName, extension) : basename(fileName);
54
+ return `${baseName}.${format === 'jpeg' ? 'jpg' : format}`;
55
+ }
56
+ function getVariantPath(originalPath, variantName, variantFileName) {
57
+ const originalName = basename(originalPath);
58
+ const parent = originalPath.slice(0, Math.max(0, originalPath.length - originalName.length));
59
+ return join(parent, TRANSFORMATIONS_FOLDER, variantName, variantFileName);
60
+ }
61
+ function getResizeDimensions(image, variant) {
62
+ const originalWidth = image.get_width();
63
+ const originalHeight = image.get_height();
64
+ if (variant.keep_original_size || !variant.width && !variant.height) {
65
+ return {
66
+ width: originalWidth,
67
+ height: originalHeight
68
+ };
69
+ }
70
+ if (variant.width && variant.height) {
71
+ const scale = Math.min(variant.width / originalWidth, variant.height / originalHeight);
72
+ return {
73
+ width: Math.round(originalWidth * scale),
74
+ height: Math.round(originalHeight * scale)
75
+ };
76
+ }
77
+ if (variant.width) {
78
+ return {
79
+ width: variant.width,
80
+ height: Math.round(originalHeight * variant.width / originalWidth)
81
+ };
82
+ }
83
+ const height = variant.height;
84
+ return {
85
+ width: Math.round(originalWidth * height / originalHeight),
86
+ height
87
+ };
88
+ }
89
+ function getImageBytes(image, format, quality = 75) {
90
+ if (format === 'jpg' || format === 'jpeg') {
91
+ return image.get_bytes_jpeg(quality);
92
+ }
93
+ if (format === 'webp') {
94
+ return image.get_bytes_webp();
95
+ }
96
+ return image.get_bytes();
97
+ }
98
+ export async function transformImage(file, originalPath, config) {
99
+ const photon = await import('@silvia-odwyer/photon');
100
+ const initPhoton = photon.default;
101
+ await initPhoton();
102
+ const originalImage = photon.PhotonImage.new_from_blob(file);
103
+ try {
104
+ const transformedFiles = config.variants.map(variant => {
105
+ const {
106
+ width,
107
+ height
108
+ } = getResizeDimensions(originalImage, variant);
109
+ const resizedImage = width === originalImage.get_width() && height === originalImage.get_height() ? originalImage : photon.resize(originalImage, width, height, photon.SamplingFilter.Lanczos3);
110
+ const format = getOutputFormat(file.name, variant);
111
+ const variantFileName = getVariantFileName(file.name, format);
112
+ const bytes = getImageBytes(resizedImage, format, variant.quality);
113
+ const transformedFile = new File([bytes], variantFileName, {
114
+ type: getMimeType(format)
115
+ });
116
+ if (resizedImage !== originalImage) {
117
+ resizedImage.free();
118
+ }
119
+ return {
120
+ file: transformedFile,
121
+ path: getVariantPath(originalPath, variant.name, variantFileName),
122
+ default: variant.default
123
+ };
124
+ });
125
+ return config.keepOriginal ? [{
126
+ file,
127
+ path: originalPath,
128
+ original: true
129
+ }, ...transformedFiles] : transformedFiles;
130
+ } finally {
131
+ originalImage.free();
132
+ }
133
+ }
134
+ export function sortTransformationFilesForSelection(files) {
135
+ const defaultIndex = files.findIndex(file => file.default);
136
+ const originalIndex = files.findIndex(file => file.original);
137
+ const selectedIndex = defaultIndex >= 0 ? defaultIndex : originalIndex;
138
+ if (selectedIndex < 0) {
139
+ return files;
140
+ }
141
+ const selectedFile = files[selectedIndex];
142
+ return [...files.slice(0, selectedIndex), ...files.slice(selectedIndex + 1), selectedFile];
143
+ }
@@ -0,0 +1,6 @@
1
+ import merge from 'lodash/merge';
2
+ import { getLocale } from './registry';
3
+ export function getPhrases(locale) {
4
+ const phrases = merge({}, getLocale('en'), getLocale(locale));
5
+ return phrases;
6
+ }
@@ -0,0 +1,8 @@
1
+ import { Buffer } from 'buffer';
2
+ if (typeof window !== 'undefined') {
3
+ // Polyfill global for packages like @iarna/toml
4
+ window.global = window;
5
+
6
+ // Polyfill Buffer for packages like gray-matter
7
+ window.Buffer = Buffer;
8
+ }