@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,792 @@
1
+ import { fromJS } from 'immutable';
2
+
3
+ import * as i18n from '../i18n';
4
+
5
+ jest.mock('../../reducers/collections', () => {
6
+ return {
7
+ selectEntrySlug: () => 'index',
8
+ };
9
+ });
10
+
11
+ describe('i18n', () => {
12
+ describe('hasI18n', () => {
13
+ it('should return false for collection with no i18n', () => {
14
+ expect(i18n.hasI18n(fromJS({}))).toBe(false);
15
+ });
16
+
17
+ it('should return true for collection with i18n', () => {
18
+ expect(i18n.hasI18n(fromJS({ i18n: { structure: i18n.I18N_STRUCTURE.SINGLE_FILE } }))).toBe(
19
+ true,
20
+ );
21
+ });
22
+ });
23
+
24
+ describe('getI18nInfo', () => {
25
+ it('should return empty object for collection with no i18n', () => {
26
+ expect(i18n.getI18nInfo(fromJS({}))).toEqual({});
27
+ });
28
+
29
+ it('should return i18n object for collection with i18n', () => {
30
+ const i18nObject = {
31
+ locales: ['en', 'de'],
32
+ default_locale: 'en',
33
+ structure: i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS,
34
+ };
35
+ expect(i18n.getI18nInfo(fromJS({ i18n: i18nObject }))).toEqual({
36
+ locales: ['en', 'de'],
37
+ defaultLocale: 'en',
38
+ structure: i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS,
39
+ });
40
+ });
41
+ });
42
+
43
+ describe('getI18nFilesDepth', () => {
44
+ it('should increase depth when i18n structure is I18N_STRUCTURE.MULTIPLE_FOLDERS', () => {
45
+ expect(
46
+ i18n.getI18nFilesDepth(
47
+ fromJS({ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS } }),
48
+ 5,
49
+ ),
50
+ ).toBe(6);
51
+ });
52
+
53
+ it('should return current depth when i18n structure is not I18N_STRUCTURE.MULTIPLE_FOLDERS', () => {
54
+ expect(
55
+ i18n.getI18nFilesDepth(
56
+ fromJS({ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FILES } }),
57
+ 5,
58
+ ),
59
+ ).toBe(5);
60
+ expect(
61
+ i18n.getI18nFilesDepth(fromJS({ i18n: { structure: i18n.I18N_STRUCTURE.SINGLE_FILE } }), 5),
62
+ ).toBe(5);
63
+ expect(i18n.getI18nFilesDepth(fromJS({}), 5)).toBe(5);
64
+ });
65
+ });
66
+
67
+ describe('isFieldTranslatable', () => {
68
+ it('should return true when not default locale and has I18N_FIELD.TRANSLATE', () => {
69
+ expect(
70
+ i18n.isFieldTranslatable(fromJS({ i18n: i18n.I18N_FIELD.TRANSLATE }), 'en', 'de'),
71
+ ).toBe(true);
72
+ });
73
+
74
+ it('should return false when default locale and has I18N_FIELD.TRANSLATE', () => {
75
+ expect(
76
+ i18n.isFieldTranslatable(fromJS({ i18n: i18n.I18N_FIELD.TRANSLATE }), 'en', 'en'),
77
+ ).toBe(false);
78
+ });
79
+
80
+ it("should return false when doesn't have i18n", () => {
81
+ expect(i18n.isFieldTranslatable(fromJS({}), 'en', 'en')).toBe(false);
82
+ });
83
+ });
84
+
85
+ describe('isFieldDuplicate', () => {
86
+ it('should return true when not default locale and has I18N_FIELD.TRANSLATE', () => {
87
+ expect(i18n.isFieldDuplicate(fromJS({ i18n: i18n.I18N_FIELD.DUPLICATE }), 'en', 'de')).toBe(
88
+ true,
89
+ );
90
+ });
91
+
92
+ it('should return false when default locale and has I18N_FIELD.TRANSLATE', () => {
93
+ expect(i18n.isFieldDuplicate(fromJS({ i18n: i18n.I18N_FIELD.DUPLICATE }), 'en', 'en')).toBe(
94
+ false,
95
+ );
96
+ });
97
+
98
+ it("should return false when doesn't have i18n", () => {
99
+ expect(i18n.isFieldDuplicate(fromJS({}), 'en', 'en')).toBe(false);
100
+ });
101
+ });
102
+
103
+ describe('isFieldHidden', () => {
104
+ it('should return true when not default locale and has I18N_FIELD.NONE', () => {
105
+ expect(i18n.isFieldHidden(fromJS({ i18n: i18n.I18N_FIELD.NONE }), 'en', 'de')).toBe(true);
106
+ });
107
+
108
+ it('should return false when default locale and has I18N_FIELD.NONE', () => {
109
+ expect(i18n.isFieldHidden(fromJS({ i18n: i18n.I18N_FIELD.NONE }), 'en', 'en')).toBe(false);
110
+ });
111
+
112
+ it("should return false when doesn't have i18n", () => {
113
+ expect(i18n.isFieldHidden(fromJS({}), 'en', 'en')).toBe(false);
114
+ });
115
+ });
116
+
117
+ describe('getLocaleDataPath', () => {
118
+ it('should return string array with locale as part of the data path', () => {
119
+ expect(i18n.getLocaleDataPath('de')).toEqual(['i18n', 'de', 'data']);
120
+ });
121
+ });
122
+
123
+ describe('getDataPath', () => {
124
+ it('should not include locale in path for default locale', () => {
125
+ expect(i18n.getDataPath('en', 'en')).toEqual(['data']);
126
+ });
127
+
128
+ it('should include locale in path for non default locale', () => {
129
+ expect(i18n.getDataPath('de', 'en')).toEqual(['i18n', 'de', 'data']);
130
+ });
131
+ });
132
+
133
+ describe('getFilePath', () => {
134
+ it('should return directory path based on locale when structure is I18N_STRUCTURE.MULTIPLE_FOLDERS', () => {
135
+ expect(
136
+ i18n.getFilePath(
137
+ i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS,
138
+ 'md',
139
+ 'src/content/index.md',
140
+ 'index',
141
+ 'de',
142
+ ),
143
+ ).toEqual('src/content/de/index.md');
144
+ });
145
+
146
+ it('should return file path based on locale when structure is I18N_STRUCTURE.MULTIPLE_FILES', () => {
147
+ expect(
148
+ i18n.getFilePath(
149
+ i18n.I18N_STRUCTURE.MULTIPLE_FILES,
150
+ 'md',
151
+ 'src/content/file-with-md-in-the-name.md',
152
+ 'file-with-md-in-the-name',
153
+ 'de',
154
+ ),
155
+ ).toEqual('src/content/file-with-md-in-the-name.de.md');
156
+ });
157
+
158
+ it('should not modify path when structure is I18N_STRUCTURE.SINGLE_FILE', () => {
159
+ expect(
160
+ i18n.getFilePath(
161
+ i18n.I18N_STRUCTURE.SINGLE_FILE,
162
+ 'md',
163
+ 'src/content/index.md',
164
+ 'index',
165
+ 'de',
166
+ ),
167
+ ).toEqual('src/content/index.md');
168
+ });
169
+ });
170
+
171
+ describe('getFilePaths', () => {
172
+ const args = ['md', 'src/content/index.md', 'index'];
173
+
174
+ it('should return file paths for all locales', () => {
175
+ expect(
176
+ i18n.getFilePaths(
177
+ fromJS({
178
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS, locales: ['en', 'de'] },
179
+ }),
180
+ ...args,
181
+ ),
182
+ ).toEqual(['src/content/en/index.md', 'src/content/de/index.md']);
183
+ });
184
+
185
+ it('should return array with single path when structure is I18N_STRUCTURE.SINGLE_FILE', () => {
186
+ expect(
187
+ i18n.getFilePaths(
188
+ fromJS({
189
+ i18n: { structure: i18n.I18N_STRUCTURE.SINGLE_FILE, locales: ['en', 'de'] },
190
+ }),
191
+ ...args,
192
+ ),
193
+ ).toEqual(['src/content/index.md']);
194
+ });
195
+ });
196
+
197
+ describe('normalizeFilePath', () => {
198
+ it('should remove locale folder from path when structure is I18N_STRUCTURE.MULTIPLE_FOLDERS', () => {
199
+ expect(
200
+ i18n.normalizeFilePath(
201
+ i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS,
202
+ 'src/content/en/index.md',
203
+ 'en',
204
+ ),
205
+ ).toEqual('src/content/index.md');
206
+ });
207
+
208
+ it('should remove locale extension from path when structure is I18N_STRUCTURE.MULTIPLE_FILES', () => {
209
+ expect(
210
+ i18n.normalizeFilePath(i18n.I18N_STRUCTURE.MULTIPLE_FILES, 'src/content/index.en.md', 'en'),
211
+ ).toEqual('src/content/index.md');
212
+ });
213
+
214
+ it('should not modify path when structure is I18N_STRUCTURE.SINGLE_FILE', () => {
215
+ expect(
216
+ i18n.normalizeFilePath(i18n.I18N_STRUCTURE.SINGLE_FILE, 'src/content/index.md', 'en'),
217
+ ).toEqual('src/content/index.md');
218
+ });
219
+ });
220
+
221
+ describe('getLocaleFromPath', () => {
222
+ it('should return the locale from folder name in the path when structure is I18N_STRUCTURE.MULTIPLE_FOLDERS', () => {
223
+ expect(
224
+ i18n.getLocaleFromPath(
225
+ i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS,
226
+ 'md',
227
+ 'src/content/en/index.md',
228
+ ),
229
+ ).toEqual('en');
230
+ });
231
+
232
+ it('should return the locale extension from the file name when structure is I18N_STRUCTURE.MULTIPLE_FILES', () => {
233
+ expect(
234
+ i18n.getLocaleFromPath(i18n.I18N_STRUCTURE.MULTIPLE_FILES, 'md', 'src/content/index.en.md'),
235
+ ).toEqual('en');
236
+ });
237
+
238
+ it('issue #5909: return the correct locale extension for language gd', () => {
239
+ expect(
240
+ i18n.getLocaleFromPath(i18n.I18N_STRUCTURE.MULTIPLE_FILES, 'md', 'src/content/index.gd.md'),
241
+ ).toEqual('gd');
242
+ });
243
+
244
+ it('should return an empty string when structure is I18N_STRUCTURE.SINGLE_FILE', () => {
245
+ expect(
246
+ i18n.getLocaleFromPath(i18n.I18N_STRUCTURE.SINGLE_FILE, 'md', 'src/content/index.md'),
247
+ ).toEqual('');
248
+ });
249
+ });
250
+
251
+ describe('getI18nFiles', () => {
252
+ const locales = ['en', 'de', 'fr'];
253
+ const default_locale = 'en';
254
+ const args = [
255
+ 'md',
256
+ fromJS({
257
+ data: { title: 'en_title' },
258
+ i18n: { de: { data: { title: 'de_title' } }, fr: { data: { title: 'fr_title' } } },
259
+ }),
260
+ map => map.get('data').toJS(),
261
+ 'src/content/index.md',
262
+ 'index',
263
+ ];
264
+ it('should return a single file when structure is I18N_STRUCTURE.SINGLE_FILE', () => {
265
+ expect(
266
+ i18n.getI18nFiles(
267
+ fromJS({ i18n: { structure: i18n.I18N_STRUCTURE.SINGLE_FILE, locales, default_locale } }),
268
+ ...args,
269
+ ),
270
+ ).toEqual([
271
+ {
272
+ path: 'src/content/index.md',
273
+ raw: {
274
+ en: { title: 'en_title' },
275
+ de: { title: 'de_title' },
276
+ fr: { title: 'fr_title' },
277
+ },
278
+ slug: 'index',
279
+ },
280
+ ]);
281
+ });
282
+
283
+ it('should return a folder based files when structure is I18N_STRUCTURE.MULTIPLE_FOLDERS', () => {
284
+ expect(
285
+ i18n.getI18nFiles(
286
+ fromJS({
287
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS, locales, default_locale },
288
+ }),
289
+ ...args,
290
+ ),
291
+ ).toEqual([
292
+ {
293
+ path: 'src/content/en/index.md',
294
+ raw: { title: 'en_title' },
295
+ slug: 'index',
296
+ },
297
+ {
298
+ path: 'src/content/de/index.md',
299
+ raw: { title: 'de_title' },
300
+ slug: 'index',
301
+ },
302
+ {
303
+ path: 'src/content/fr/index.md',
304
+ raw: { title: 'fr_title' },
305
+ slug: 'index',
306
+ },
307
+ ]);
308
+ });
309
+
310
+ it('should return a extension based files when structure is I18N_STRUCTURE.MULTIPLE_FILES', () => {
311
+ expect(
312
+ i18n.getI18nFiles(
313
+ fromJS({
314
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FILES, locales, default_locale },
315
+ }),
316
+ ...args,
317
+ ),
318
+ ).toEqual([
319
+ {
320
+ path: 'src/content/index.en.md',
321
+ raw: { title: 'en_title' },
322
+ slug: 'index',
323
+ },
324
+ {
325
+ path: 'src/content/index.de.md',
326
+ raw: { title: 'de_title' },
327
+ slug: 'index',
328
+ },
329
+ {
330
+ path: 'src/content/index.fr.md',
331
+ raw: { title: 'fr_title' },
332
+ slug: 'index',
333
+ },
334
+ ]);
335
+ });
336
+ });
337
+
338
+ describe('getI18nEntry', () => {
339
+ const locales = ['en', 'de', 'fr', 'es'];
340
+ const default_locale = 'en';
341
+ const args = ['md', 'src/content/index.md', 'index'];
342
+
343
+ it('should return i18n entry content when structure is I18N_STRUCTURE.MULTIPLE_FOLDERS', async () => {
344
+ const data = {
345
+ 'src/content/en/index.md': {
346
+ slug: 'index',
347
+ path: 'src/content/en/index.md',
348
+ data: { title: 'en_title' },
349
+ },
350
+ 'src/content/de/index.md': {
351
+ slug: 'index',
352
+ path: 'src/content/de/index.md',
353
+ data: { title: 'de_title' },
354
+ },
355
+ 'src/content/fr/index.md': {
356
+ slug: 'index',
357
+ path: 'src/content/fr/index.md',
358
+ data: { title: 'fr_title' },
359
+ },
360
+ };
361
+ const getEntryValue = jest.fn(path =>
362
+ data[path] ? Promise.resolve(data[path]) : Promise.reject('Not found'),
363
+ );
364
+
365
+ await expect(
366
+ i18n.getI18nEntry(
367
+ fromJS({
368
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS, locales, default_locale },
369
+ }),
370
+ ...args,
371
+ getEntryValue,
372
+ ),
373
+ ).resolves.toEqual({
374
+ slug: 'index',
375
+ path: 'src/content/index.md',
376
+ data: { title: 'en_title' },
377
+ i18n: {
378
+ de: { data: { title: 'de_title' } },
379
+ fr: { data: { title: 'fr_title' } },
380
+ },
381
+ raw: '',
382
+ });
383
+ });
384
+
385
+ it('should return i18n entry content when structure is I18N_STRUCTURE.MULTIPLE_FILES', async () => {
386
+ const data = {
387
+ 'src/content/index.en.md': {
388
+ slug: 'index',
389
+ path: 'src/content/index.en.md',
390
+ data: { title: 'en_title' },
391
+ },
392
+ 'src/content/index.de.md': {
393
+ slug: 'index',
394
+ path: 'src/content/index.de.md',
395
+ data: { title: 'de_title' },
396
+ },
397
+ 'src/content/index.fr.md': {
398
+ slug: 'index',
399
+ path: 'src/content/index.fr.md',
400
+ data: { title: 'fr_title' },
401
+ },
402
+ };
403
+ const getEntryValue = jest.fn(path =>
404
+ data[path] ? Promise.resolve(data[path]) : Promise.reject('Not found'),
405
+ );
406
+
407
+ await expect(
408
+ i18n.getI18nEntry(
409
+ fromJS({
410
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FILES, locales, default_locale },
411
+ }),
412
+ ...args,
413
+ getEntryValue,
414
+ ),
415
+ ).resolves.toEqual({
416
+ slug: 'index',
417
+ path: 'src/content/index.md',
418
+ data: { title: 'en_title' },
419
+ i18n: {
420
+ de: { data: { title: 'de_title' } },
421
+ fr: { data: { title: 'fr_title' } },
422
+ },
423
+ raw: '',
424
+ });
425
+ });
426
+
427
+ it('should return single entry content when structure is I18N_STRUCTURE.SINGLE_FILE', async () => {
428
+ const data = {
429
+ 'src/content/index.md': {
430
+ slug: 'index',
431
+ path: 'src/content/index.md',
432
+ data: {
433
+ en: { title: 'en_title' },
434
+ de: { title: 'de_title' },
435
+ fr: { title: 'fr_title' },
436
+ },
437
+ },
438
+ };
439
+ const getEntryValue = jest.fn(path => Promise.resolve(data[path]));
440
+
441
+ await expect(
442
+ i18n.getI18nEntry(
443
+ fromJS({
444
+ i18n: { structure: i18n.I18N_STRUCTURE.SINGLE_FILE, locales, default_locale },
445
+ }),
446
+ ...args,
447
+ getEntryValue,
448
+ ),
449
+ ).resolves.toEqual({
450
+ slug: 'index',
451
+ path: 'src/content/index.md',
452
+ data: {
453
+ title: 'en_title',
454
+ },
455
+ i18n: {
456
+ de: { data: { title: 'de_title' } },
457
+ fr: { data: { title: 'fr_title' } },
458
+ },
459
+ raw: '',
460
+ });
461
+ });
462
+
463
+ it('should default to empty data object when file is empty and structure is I18N_STRUCTURE.SINGLE_FILE', async () => {
464
+ const data = {
465
+ 'src/content/index.md': {
466
+ slug: 'index',
467
+ path: 'src/content/index.md',
468
+ data: {},
469
+ },
470
+ };
471
+ const getEntryValue = jest.fn(path => Promise.resolve(data[path]));
472
+
473
+ await expect(
474
+ i18n.getI18nEntry(
475
+ fromJS({
476
+ i18n: { structure: i18n.I18N_STRUCTURE.SINGLE_FILE, locales, default_locale },
477
+ }),
478
+ ...args,
479
+ getEntryValue,
480
+ ),
481
+ ).resolves.toEqual({
482
+ slug: 'index',
483
+ path: 'src/content/index.md',
484
+ data: {},
485
+ i18n: {},
486
+ raw: '',
487
+ });
488
+ });
489
+ });
490
+
491
+ describe('groupEntries', () => {
492
+ const locales = ['en', 'de', 'fr'];
493
+ const default_locale = 'en';
494
+ const extension = 'md';
495
+
496
+ it('should group entries array when structure is I18N_STRUCTURE.MULTIPLE_FOLDERS', () => {
497
+ const entries = [
498
+ {
499
+ slug: 'index',
500
+ path: 'src/content/en/index.md',
501
+ data: { title: 'en_title' },
502
+ },
503
+ {
504
+ slug: 'index',
505
+ path: 'src/content/de/index.md',
506
+ data: { title: 'de_title' },
507
+ },
508
+ {
509
+ slug: 'index',
510
+ path: 'src/content/fr/index.md',
511
+ data: { title: 'fr_title' },
512
+ },
513
+ ];
514
+
515
+ expect(
516
+ i18n.groupEntries(
517
+ fromJS({
518
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS, locales, default_locale },
519
+ }),
520
+ extension,
521
+ entries,
522
+ ),
523
+ ).toEqual([
524
+ {
525
+ slug: 'index',
526
+ path: 'src/content/index.md',
527
+ data: { title: 'en_title' },
528
+ i18n: { de: { data: { title: 'de_title' } }, fr: { data: { title: 'fr_title' } } },
529
+ raw: '',
530
+ },
531
+ ]);
532
+ });
533
+
534
+ it('should group entries array when structure is I18N_STRUCTURE.MULTIPLE_FILES', () => {
535
+ const entries = [
536
+ {
537
+ slug: 'index',
538
+ path: 'src/content/index.en.md',
539
+ data: { title: 'en_title' },
540
+ },
541
+ {
542
+ slug: 'index',
543
+ path: 'src/content/index.de.md',
544
+ data: { title: 'de_title' },
545
+ },
546
+ {
547
+ slug: 'index',
548
+ path: 'src/content/index.fr.md',
549
+ data: { title: 'fr_title' },
550
+ },
551
+ ];
552
+
553
+ expect(
554
+ i18n.groupEntries(
555
+ fromJS({
556
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FILES, locales, default_locale },
557
+ }),
558
+ extension,
559
+ entries,
560
+ ),
561
+ ).toEqual([
562
+ {
563
+ slug: 'index',
564
+ path: 'src/content/index.md',
565
+ data: { title: 'en_title' },
566
+ i18n: { de: { data: { title: 'de_title' } }, fr: { data: { title: 'fr_title' } } },
567
+ raw: '',
568
+ },
569
+ ]);
570
+ });
571
+
572
+ it('should return entries array as is when structure is I18N_STRUCTURE.SINGLE_FILE', () => {
573
+ const entries = [
574
+ {
575
+ slug: 'index',
576
+ path: 'src/content/index.md',
577
+ data: {
578
+ en: { title: 'en_title' },
579
+ de: { title: 'de_title' },
580
+ fr: { title: 'fr_title' },
581
+ },
582
+ },
583
+ ];
584
+
585
+ expect(
586
+ i18n.groupEntries(
587
+ fromJS({
588
+ i18n: { structure: i18n.I18N_STRUCTURE.SINGLE_FILE, locales, default_locale },
589
+ }),
590
+ extension,
591
+ entries,
592
+ ),
593
+ ).toEqual([
594
+ {
595
+ slug: 'index',
596
+ path: 'src/content/index.md',
597
+ data: {
598
+ title: 'en_title',
599
+ },
600
+ i18n: { de: { data: { title: 'de_title' } }, fr: { data: { title: 'fr_title' } } },
601
+ raw: '',
602
+ },
603
+ ]);
604
+ });
605
+ });
606
+
607
+ describe('getI18nDataFiles', () => {
608
+ const locales = ['en', 'de', 'fr'];
609
+ const default_locale = 'en';
610
+
611
+ const args = ['md', 'src/content/index.md', 'index'];
612
+
613
+ it('should add missing locale files to diff files when structure is MULTIPLE_FOLDERS', () => {
614
+ expect(
615
+ i18n.getI18nDataFiles(
616
+ fromJS({
617
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FOLDERS, locales, default_locale },
618
+ }),
619
+ ...args,
620
+ [{ path: 'src/content/fr/index.md', id: 'id', newFile: false }],
621
+ ),
622
+ ).toEqual([
623
+ { path: 'src/content/en/index.md', id: '', newFile: false },
624
+ { path: 'src/content/de/index.md', id: '', newFile: false },
625
+ { path: 'src/content/fr/index.md', id: 'id', newFile: false },
626
+ ]);
627
+ });
628
+
629
+ it('should add missing locale files to diff files when structure is MULTIPLE_FILES', () => {
630
+ expect(
631
+ i18n.getI18nDataFiles(
632
+ fromJS({
633
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FILES, locales, default_locale },
634
+ }),
635
+ ...args,
636
+ [{ path: 'src/content/index.fr.md', id: 'id', newFile: false }],
637
+ ),
638
+ ).toEqual([
639
+ { path: 'src/content/index.en.md', id: '', newFile: false },
640
+ { path: 'src/content/index.de.md', id: '', newFile: false },
641
+ { path: 'src/content/index.fr.md', id: 'id', newFile: false },
642
+ ]);
643
+ });
644
+
645
+ it('should return a single file when structure is SINGLE_FILE', () => {
646
+ expect(
647
+ i18n.getI18nDataFiles(
648
+ fromJS({
649
+ i18n: { structure: i18n.I18N_STRUCTURE.SINGLE_FILE, locales, default_locale },
650
+ }),
651
+ ...args,
652
+ [{ path: 'src/content/index.md', id: 'id', newFile: false }],
653
+ ),
654
+ ).toEqual([{ path: 'src/content/index.md', id: 'id', newFile: false }]);
655
+ });
656
+ });
657
+
658
+ describe('getI18nBackup', () => {
659
+ it('should return i18n with raw data', () => {
660
+ const locales = ['en', 'de', 'fr'];
661
+ const default_locale = 'en';
662
+
663
+ expect(
664
+ i18n.getI18nBackup(
665
+ fromJS({
666
+ i18n: { structure: i18n.I18N_STRUCTURE.MULTIPLE_FILES, locales, default_locale },
667
+ }),
668
+ fromJS({
669
+ data: 'raw_en',
670
+ i18n: {
671
+ de: { data: 'raw_de' },
672
+ fr: { data: 'raw_fr' },
673
+ },
674
+ }),
675
+ e => e.get('data'),
676
+ ),
677
+ ).toEqual({ de: { raw: 'raw_de' }, fr: { raw: 'raw_fr' } });
678
+ });
679
+ });
680
+
681
+ describe('formatI18nBackup', () => {
682
+ it('should return i18n with formatted data', () => {
683
+ expect(
684
+ i18n.formatI18nBackup({ de: { raw: 'raw_de' }, fr: { raw: 'raw_fr' } }, raw => ({
685
+ data: raw,
686
+ })),
687
+ ).toEqual({ de: { data: 'raw_de' }, fr: { data: 'raw_fr' } });
688
+ });
689
+ });
690
+
691
+ describe('duplicateI18nFields', () => {
692
+ it('should duplicate non nested field when field i18n is DUPLICATE', () => {
693
+ const date = new Date('2020/01/01');
694
+ expect(
695
+ i18n
696
+ .duplicateI18nFields(
697
+ fromJS({ entry: { data: { date } } }),
698
+ fromJS({ name: 'date', i18n: i18n.I18N_FIELD.DUPLICATE }),
699
+ ['en', 'de', 'fr'],
700
+ 'en',
701
+ )
702
+ .toJS(),
703
+ ).toEqual({
704
+ entry: {
705
+ data: { date },
706
+ i18n: {
707
+ de: { data: { date } },
708
+ fr: { data: { date } },
709
+ },
710
+ },
711
+ });
712
+ });
713
+
714
+ it('should not duplicate field when field i18n is not DUPLICATE', () => {
715
+ const date = new Date('2020/01/01');
716
+ [i18n.I18N_FIELD.TRANSLATE, i18n.I18N_FIELD.TRANSLATE.DUPLICATE].forEach(fieldI18n => {
717
+ expect(
718
+ i18n
719
+ .duplicateI18nFields(
720
+ fromJS({ entry: { data: { date } } }),
721
+ fromJS({ name: 'date', i18n: fieldI18n }),
722
+ ['en', 'de', 'fr'],
723
+ 'en',
724
+ )
725
+ .toJS(),
726
+ ).toEqual({
727
+ entry: {
728
+ data: { date },
729
+ },
730
+ });
731
+ });
732
+ });
733
+
734
+ it('should duplicate nested field when nested fields i18n is DUPLICATE', () => {
735
+ const date = new Date('2020/01/01');
736
+ const value = fromJS({ title: 'title', date, boolean: true });
737
+ expect(
738
+ i18n
739
+ .duplicateI18nFields(
740
+ fromJS({ entry: { data: { object: value } } }),
741
+ fromJS({
742
+ name: 'object',
743
+ fields: [
744
+ { name: 'string', i18n: i18n.I18N_FIELD.TRANSLATE },
745
+ { name: 'date', i18n: i18n.I18N_FIELD.DUPLICATE },
746
+ { name: 'boolean', i18n: i18n.I18N_FIELD.NONE },
747
+ ],
748
+ i18n: i18n.I18N_FIELD.TRANSLATE,
749
+ }),
750
+ ['en', 'de', 'fr'],
751
+ 'en',
752
+ )
753
+ .toJS(),
754
+ ).toEqual({
755
+ entry: {
756
+ data: { object: value.toJS() },
757
+ i18n: {
758
+ de: { data: { object: { date } } },
759
+ fr: { data: { object: { date } } },
760
+ },
761
+ },
762
+ });
763
+ });
764
+ });
765
+
766
+ describe('getPreviewEntry', () => {
767
+ it('should set data to i18n data when locale is not default', () => {
768
+ expect(
769
+ i18n
770
+ .getPreviewEntry(
771
+ fromJS({
772
+ data: { title: 'en', body: 'markdown' },
773
+ i18n: { de: { data: { title: 'de' } } },
774
+ }),
775
+ 'de',
776
+ )
777
+ .toJS(),
778
+ ).toEqual({
779
+ data: { title: 'de' },
780
+ i18n: { de: { data: { title: 'de' } } },
781
+ });
782
+ });
783
+
784
+ it('should not change entry for default locale', () => {
785
+ const entry = fromJS({
786
+ data: { title: 'en', body: 'markdown' },
787
+ i18n: { de: { data: { title: 'de' } } },
788
+ });
789
+ expect(i18n.getPreviewEntry(entry, 'en', 'en')).toBe(entry);
790
+ });
791
+ });
792
+ });