@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,450 @@
1
+ import {
2
+ FrontmatterInfer,
3
+ frontmatterJSON,
4
+ frontmatterTOML,
5
+ frontmatterYAML,
6
+ } from '../frontmatter';
7
+
8
+ describe('Frontmatter', () => {
9
+ describe('yaml', () => {
10
+ it('should parse YAML with --- delimiters', () => {
11
+ expect(
12
+ FrontmatterInfer.fromFile('---\ntitle: YAML\ndescription: Something longer\n---\nContent'),
13
+ ).toEqual({
14
+ title: 'YAML',
15
+ description: 'Something longer',
16
+ body: 'Content',
17
+ });
18
+ });
19
+
20
+ it('should parse YAML with --- delimiters when it is explicitly set as the format without a custom delimiter', () => {
21
+ expect(
22
+ frontmatterYAML().fromFile('---\ntitle: YAML\ndescription: Something longer\n---\nContent'),
23
+ ).toEqual({
24
+ title: 'YAML',
25
+ description: 'Something longer',
26
+ body: 'Content',
27
+ });
28
+ });
29
+
30
+ it('should parse YAML with custom delimiters when it is explicitly set as the format with a custom delimiter', () => {
31
+ expect(
32
+ frontmatterYAML('~~~').fromFile(
33
+ '~~~\ntitle: YAML\ndescription: Something longer\n~~~\nContent',
34
+ ),
35
+ ).toEqual({
36
+ title: 'YAML',
37
+ description: 'Something longer',
38
+ body: 'Content',
39
+ });
40
+ });
41
+
42
+ it('should parse YAML with custom delimiters when it is explicitly set as the format with different custom delimiters', () => {
43
+ expect(
44
+ frontmatterYAML(['~~~', '^^^']).fromFile(
45
+ '~~~\ntitle: YAML\ndescription: Something longer\n^^^\nContent',
46
+ ),
47
+ ).toEqual({
48
+ title: 'YAML',
49
+ description: 'Something longer',
50
+ body: 'Content',
51
+ });
52
+ });
53
+
54
+ it('should parse YAML with ---yaml delimiters', () => {
55
+ expect(
56
+ FrontmatterInfer.fromFile(
57
+ '---yaml\ntitle: YAML\ndescription: Something longer\n---\nContent',
58
+ ),
59
+ ).toEqual({
60
+ title: 'YAML',
61
+ description: 'Something longer',
62
+ body: 'Content',
63
+ });
64
+ });
65
+
66
+ it('should overwrite any body param in the front matter', () => {
67
+ expect(
68
+ FrontmatterInfer.fromFile('---\ntitle: The Title\nbody: Something longer\n---\nContent'),
69
+ ).toEqual({
70
+ title: 'The Title',
71
+ body: 'Content',
72
+ });
73
+ });
74
+
75
+ it('should throw on duplicate frontmatter keys', () => {
76
+ expect(() =>
77
+ FrontmatterInfer.fromFile('---\ntitle: Hello\ntitle: World\n---\nContent'),
78
+ ).toThrow(/Map keys must be unique/);
79
+ });
80
+
81
+ it('should throw on duplicate frontmatter keys with explicit YAML format', () => {
82
+ expect(() =>
83
+ frontmatterYAML().fromFile('---\ntitle: Hello\ntitle: World\n---\nContent'),
84
+ ).toThrow(/Map keys must be unique/);
85
+ });
86
+
87
+ it('should not throw when body contains YAML-like patterns', () => {
88
+ expect(
89
+ FrontmatterInfer.fromFile('---\ntitle: Hello\n---\ntitle: this is not a duplicate'),
90
+ ).toEqual({
91
+ title: 'Hello',
92
+ body: 'title: this is not a duplicate',
93
+ });
94
+ });
95
+
96
+ it('should stringify YAML with --- delimiters', () => {
97
+ expect(
98
+ FrontmatterInfer.toFile({
99
+ body: 'Some content\nOn another line',
100
+ tags: ['front matter', 'yaml'],
101
+ title: 'YAML',
102
+ }),
103
+ ).toEqual(
104
+ [
105
+ '---',
106
+ 'tags:',
107
+ ' - front matter',
108
+ ' - yaml',
109
+ 'title: YAML',
110
+ '---',
111
+ 'Some content',
112
+ 'On another line',
113
+ ].join('\n'),
114
+ );
115
+ });
116
+
117
+ it('should stringify YAML with missing body', () => {
118
+ expect(FrontmatterInfer.toFile({ tags: ['front matter', 'yaml'], title: 'YAML' })).toEqual(
119
+ ['---', 'tags:', ' - front matter', ' - yaml', 'title: YAML', '---', ''].join('\n'),
120
+ );
121
+ });
122
+
123
+ it('should stringify YAML with --- delimiters when it is explicitly set as the format without a custom delimiter', () => {
124
+ expect(
125
+ frontmatterYAML().toFile({
126
+ body: 'Some content\nOn another line',
127
+ tags: ['front matter', 'yaml'],
128
+ title: 'YAML',
129
+ }),
130
+ ).toEqual(
131
+ [
132
+ '---',
133
+ 'tags:',
134
+ ' - front matter',
135
+ ' - yaml',
136
+ 'title: YAML',
137
+ '---',
138
+ 'Some content',
139
+ 'On another line',
140
+ ].join('\n'),
141
+ );
142
+ });
143
+
144
+ it('should stringify YAML with --- delimiters when it is explicitly set as the format with a custom delimiter', () => {
145
+ expect(
146
+ frontmatterYAML('~~~').toFile({
147
+ body: 'Some content\nOn another line',
148
+ tags: ['front matter', 'yaml'],
149
+ title: 'YAML',
150
+ }),
151
+ ).toEqual(
152
+ [
153
+ '~~~',
154
+ 'tags:',
155
+ ' - front matter',
156
+ ' - yaml',
157
+ 'title: YAML',
158
+ '~~~',
159
+ 'Some content',
160
+ 'On another line',
161
+ ].join('\n'),
162
+ );
163
+ });
164
+
165
+ it('should stringify YAML with --- delimiters when it is explicitly set as the format with different custom delimiters', () => {
166
+ expect(
167
+ frontmatterYAML(['~~~', '^^^']).toFile({
168
+ body: 'Some content\nOn another line',
169
+ tags: ['front matter', 'yaml'],
170
+ title: 'YAML',
171
+ }),
172
+ ).toEqual(
173
+ [
174
+ '~~~',
175
+ 'tags:',
176
+ ' - front matter',
177
+ ' - yaml',
178
+ 'title: YAML',
179
+ '^^^',
180
+ 'Some content',
181
+ 'On another line',
182
+ ].join('\n'),
183
+ );
184
+ });
185
+
186
+ it('should trim last line break if added by grey-matter', () => {
187
+ expect(
188
+ frontmatterYAML().toFile({
189
+ body: 'noLineBreak',
190
+ }),
191
+ ).toEqual('noLineBreak');
192
+ });
193
+
194
+ it('should not trim last line break if not added by grey-matter', () => {
195
+ expect(
196
+ frontmatterYAML().toFile({
197
+ body: 'withLineBreak\n',
198
+ }),
199
+ ).toEqual('withLineBreak\n');
200
+ });
201
+
202
+ it('should keep field types', () => {
203
+ const frontmatter = frontmatterYAML();
204
+ const file = frontmatter.toFile({
205
+ number: 1,
206
+ string: 'Hello World!',
207
+ date: new Date('2020-01-01'),
208
+ array: ['1', new Date('2020-01-01')],
209
+ body: 'Content',
210
+ });
211
+ expect(frontmatter.fromFile(file)).toEqual({
212
+ number: 1,
213
+ string: 'Hello World!',
214
+ date: new Date('2020-01-01'),
215
+ array: ['1', new Date('2020-01-01')],
216
+ body: 'Content',
217
+ });
218
+ });
219
+ });
220
+
221
+ describe('toml', () => {
222
+ it('should parse TOML with +++ delimiters', () => {
223
+ expect(
224
+ FrontmatterInfer.fromFile(
225
+ '+++\ntitle = "TOML"\ndescription = "Front matter"\n+++\nContent',
226
+ ),
227
+ ).toEqual({
228
+ title: 'TOML',
229
+ description: 'Front matter',
230
+ body: 'Content',
231
+ });
232
+ });
233
+
234
+ it('should parse TOML with 0.5 style dates', () => {
235
+ expect(
236
+ FrontmatterInfer.fromFile('+++\ntitle = "TOML"\ndate = 2018-12-24\n+++\nContent'),
237
+ ).toEqual({
238
+ title: 'TOML',
239
+ date: new Date('2018-12-24T00:00:00.000Z'),
240
+ body: 'Content',
241
+ });
242
+ });
243
+
244
+ it('should parse TOML with +++ delimiters when it is explicitly set as the format without a custom delimiter', () => {
245
+ expect(
246
+ frontmatterTOML('~~~').fromFile(
247
+ '~~~\ntitle = "TOML"\ndescription = "Front matter"\n~~~\nContent',
248
+ ),
249
+ ).toEqual({
250
+ title: 'TOML',
251
+ description: 'Front matter',
252
+ body: 'Content',
253
+ });
254
+ });
255
+
256
+ it('should parse TOML with ---toml delimiters', () => {
257
+ expect(
258
+ FrontmatterInfer.fromFile(
259
+ '---toml\ntitle = "TOML"\ndescription = "Something longer"\n---\nContent',
260
+ ),
261
+ ).toEqual({
262
+ title: 'TOML',
263
+ description: 'Something longer',
264
+ body: 'Content',
265
+ });
266
+ });
267
+
268
+ it('should stringify TOML with +++ delimiters when it is explicitly set as the format without a custom delimiter', () => {
269
+ expect(
270
+ frontmatterTOML().toFile({
271
+ body: 'Some content\nOn another line',
272
+ tags: ['front matter', 'toml'],
273
+ title: 'TOML',
274
+ }),
275
+ ).toEqual(
276
+ [
277
+ '+++',
278
+ 'tags = ["front matter", "toml"]',
279
+ 'title = "TOML"',
280
+ '+++',
281
+ 'Some content',
282
+ 'On another line',
283
+ ].join('\n'),
284
+ );
285
+ });
286
+
287
+ it('should stringify TOML with +++ delimiters when it is explicitly set as the format with a custom delimiter', () => {
288
+ expect(
289
+ frontmatterTOML('~~~').toFile({
290
+ body: 'Some content\nOn another line',
291
+ tags: ['front matter', 'toml'],
292
+ title: 'TOML',
293
+ }),
294
+ ).toEqual(
295
+ [
296
+ '~~~',
297
+ 'tags = ["front matter", "toml"]',
298
+ 'title = "TOML"',
299
+ '~~~',
300
+ 'Some content',
301
+ 'On another line',
302
+ ].join('\n'),
303
+ );
304
+ });
305
+
306
+ it('should keep field types', () => {
307
+ const frontmatter = frontmatterTOML();
308
+ const file = frontmatter.toFile({
309
+ number: 1,
310
+ string: 'Hello World!',
311
+ date: new Date('2020-01-01'),
312
+ // in toml arrays must contain the same type
313
+ array: ['1', new Date('2020-01-01').toISOString()],
314
+ body: 'Content',
315
+ });
316
+ expect(frontmatter.fromFile(file)).toEqual({
317
+ number: 1,
318
+ string: 'Hello World!',
319
+ date: new Date('2020-01-01'),
320
+ array: ['1', new Date('2020-01-01').toISOString()],
321
+ body: 'Content',
322
+ });
323
+ });
324
+ });
325
+
326
+ describe('json', () => {
327
+ it('should parse JSON with { } delimiters', () => {
328
+ expect(
329
+ FrontmatterInfer.fromFile(
330
+ '{\n"title": "The Title",\n"description": "Something longer"\n}\nContent',
331
+ ),
332
+ ).toEqual({
333
+ title: 'The Title',
334
+ description: 'Something longer',
335
+ body: 'Content',
336
+ });
337
+ });
338
+
339
+ it('should parse JSON with { } delimiters when it is explicitly set as the format without a custom delimiter', () => {
340
+ expect(
341
+ frontmatterJSON().fromFile(
342
+ '{\n"title": "The Title",\n"description": "Something longer"\n}\nContent',
343
+ ),
344
+ ).toEqual({
345
+ title: 'The Title',
346
+ description: 'Something longer',
347
+ body: 'Content',
348
+ });
349
+ });
350
+
351
+ it('should parse JSON with { } delimiters when it is explicitly set as the format with a custom delimiter', () => {
352
+ expect(
353
+ frontmatterJSON('~~~').fromFile(
354
+ '~~~\n"title": "The Title",\n"description": "Something longer"\n~~~\nContent',
355
+ ),
356
+ ).toEqual({
357
+ title: 'The Title',
358
+ description: 'Something longer',
359
+ body: 'Content',
360
+ });
361
+ });
362
+
363
+ it('should parse JSON with ---json delimiters', () => {
364
+ expect(
365
+ FrontmatterInfer.fromFile(
366
+ '---json\n{\n"title": "The Title",\n"description": "Something longer"\n}\n---\nContent',
367
+ ),
368
+ ).toEqual({
369
+ title: 'The Title',
370
+ description: 'Something longer',
371
+ body: 'Content',
372
+ });
373
+ });
374
+
375
+ it('should parse JSON with { } delimiters ending with a nested object', () => {
376
+ expect(
377
+ FrontmatterInfer.fromFile(
378
+ '{\n "title": "The Title",\n "nested": {\n "inside": "Inside prop"\n }\n}\nContent',
379
+ ),
380
+ ).toEqual({
381
+ title: 'The Title',
382
+ nested: { inside: 'Inside prop' },
383
+ body: 'Content',
384
+ });
385
+ });
386
+
387
+ it('should stringify JSON with { } delimiters when it is explicitly set as the format without a custom delimiter', () => {
388
+ expect(
389
+ frontmatterJSON().toFile({
390
+ body: 'Some content\nOn another line',
391
+ tags: ['front matter', 'json'],
392
+ title: 'JSON',
393
+ }),
394
+ ).toEqual(
395
+ [
396
+ '{',
397
+ '"tags": [',
398
+ ' "front matter",',
399
+ ' "json"',
400
+ ' ],',
401
+ ' "title": "JSON"',
402
+ '}',
403
+ 'Some content',
404
+ 'On another line',
405
+ ].join('\n'),
406
+ );
407
+ });
408
+
409
+ it('should stringify JSON with { } delimiters when it is explicitly set as the format with a custom delimiter', () => {
410
+ expect(
411
+ frontmatterJSON('~~~').toFile({
412
+ body: 'Some content\nOn another line',
413
+ tags: ['front matter', 'json'],
414
+ title: 'JSON',
415
+ }),
416
+ ).toEqual(
417
+ [
418
+ '~~~',
419
+ '"tags": [',
420
+ ' "front matter",',
421
+ ' "json"',
422
+ ' ],',
423
+ ' "title": "JSON"',
424
+ '~~~',
425
+ 'Some content',
426
+ 'On another line',
427
+ ].join('\n'),
428
+ );
429
+ });
430
+
431
+ it('should keep field types', () => {
432
+ const frontmatter = frontmatterJSON();
433
+ const file = frontmatter.toFile({
434
+ number: 1,
435
+ string: 'Hello World!',
436
+ // no way to represent date in JSON
437
+ date: new Date('2020-01-01').toISOString(),
438
+ array: ['1', new Date('2020-01-01').toISOString()],
439
+ body: 'Content',
440
+ });
441
+ expect(frontmatter.fromFile(file)).toEqual({
442
+ number: 1,
443
+ string: 'Hello World!',
444
+ date: new Date('2020-01-01').toISOString(),
445
+ array: ['1', new Date('2020-01-01').toISOString()],
446
+ body: 'Content',
447
+ });
448
+ });
449
+ });
450
+ });
@@ -0,0 +1,9 @@
1
+ import tomlFormatter from '../toml';
2
+
3
+ describe('tomlFormatter', () => {
4
+ it('should output TOML integer values without decimals', () => {
5
+ expect(tomlFormatter.toFile({ testFloat: 123.456, testInteger: 789, title: 'TOML' })).toEqual(
6
+ ['testFloat = 123.456', 'testInteger = 789', 'title = "TOML"'].join('\n'),
7
+ );
8
+ });
9
+ });
@@ -0,0 +1,189 @@
1
+ import { stripIndent } from 'common-tags';
2
+
3
+ import yaml from '../yaml';
4
+
5
+ describe('yaml', () => {
6
+ describe('fromFile', () => {
7
+ test('loads valid yaml', () => {
8
+ expect(yaml.fromFile('[]')).toEqual([]);
9
+
10
+ const result = yaml.fromFile(stripIndent`
11
+ date: 2020-04-02T16:08:03.327Z
12
+ dateString: 2020-04-02
13
+ boolean: true
14
+ number: 1
15
+ `);
16
+ expect(result).toEqual({
17
+ date: new Date('2020-04-02T16:08:03.327Z'),
18
+ dateString: '2020-04-02',
19
+ boolean: true,
20
+ number: 1,
21
+ });
22
+ expect(yaml.fromFile('# Comment a\na: a\nb:\n # Comment c\n c:\n d: d\n')).toEqual({
23
+ a: 'a',
24
+ b: { c: { d: 'd' } },
25
+ });
26
+ expect(
27
+ yaml.fromFile(stripIndent`
28
+ # template comment
29
+ template: post
30
+ # title comment
31
+ title: title
32
+ # image comment
33
+ image: /media/netlify.png
34
+ # date comment
35
+ date: 2020-04-02T13:27:48.617Z
36
+ # object comment
37
+ object:
38
+ # object_title comment
39
+ object_title: object_title
40
+ # object_list comment
41
+ object_list:
42
+ - object_list_item_1: "1"
43
+ object_list_item_2: "2"
44
+ # list comment
45
+ list:
46
+ - "1"
47
+ `),
48
+ ).toEqual({
49
+ list: ['1'],
50
+ object: {
51
+ object_title: 'object_title',
52
+ object_list: [{ object_list_item_1: '1', object_list_item_2: '2' }],
53
+ },
54
+ date: new Date('2020-04-02T13:27:48.617Z'),
55
+ image: '/media/netlify.png',
56
+ title: 'title',
57
+ template: 'post',
58
+ });
59
+ });
60
+ test('does not fail on closing separator', () => {
61
+ expect(yaml.fromFile('---\n[]\n---')).toEqual([]);
62
+ });
63
+
64
+ test('parses single quoted string as string', () => {
65
+ expect(yaml.fromFile('name: y')).toEqual({ name: 'y' });
66
+ });
67
+
68
+ test('parses ISO date string as date', () => {
69
+ expect(yaml.fromFile('date: 2020-04-02T16:08:03.327Z')).toEqual({
70
+ date: new Date('2020-04-02T16:08:03.327Z'),
71
+ });
72
+ });
73
+
74
+ test('parses partial date string as string', () => {
75
+ expect(yaml.fromFile('date: 2020-06-12')).toEqual({
76
+ date: '2020-06-12',
77
+ });
78
+ expect(yaml.fromFile('date: 12-06-2012')).toEqual({
79
+ date: '12-06-2012',
80
+ });
81
+ });
82
+
83
+ test('parses partial time value as string', () => {
84
+ expect(yaml.fromFile('time: 10:05')).toEqual({
85
+ time: '10:05',
86
+ });
87
+ });
88
+
89
+ test('throws on duplicate keys', () => {
90
+ expect(() => yaml.fromFile('title: Hello\ntitle: World')).toThrow(
91
+ /Map keys must be unique; "title" is repeated/,
92
+ );
93
+ });
94
+
95
+ test('throws on duplicate nested keys', () => {
96
+ expect(() => yaml.fromFile('nested:\n a: 1\n a: 2')).toThrow(
97
+ /Map keys must be unique; "a" is repeated/,
98
+ );
99
+ });
100
+
101
+ test('does not throw when same key appears in different nested objects', () => {
102
+ expect(yaml.fromFile('obj1:\n name: foo\nobj2:\n name: bar')).toEqual({
103
+ obj1: { name: 'foo' },
104
+ obj2: { name: 'bar' },
105
+ });
106
+ });
107
+
108
+ test('logs warnings to console.warn', () => {
109
+ const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
110
+ // Valid YAML should produce no warnings
111
+ yaml.fromFile('title: Hello');
112
+ expect(warnSpy).not.toHaveBeenCalled();
113
+ warnSpy.mockRestore();
114
+ });
115
+ });
116
+ describe('toFile', () => {
117
+ test('outputs valid yaml', () => {
118
+ expect(yaml.toFile([])).toEqual('[]\n');
119
+ });
120
+
121
+ test('should sort keys', () => {
122
+ expect(yaml.toFile({ a: 'a', b: 'b', c: 'c', d: 'd' })).toEqual('a: a\nb: b\nc: c\nd: d\n');
123
+ expect(yaml.toFile({ a: 'a', b: 'b', c: 'c', d: 'd' }, ['d', 'b', 'a', 'c'])).toEqual(
124
+ 'd: d\nb: b\na: a\nc: c\n',
125
+ );
126
+ expect(yaml.toFile({ a: 'a', b: 'b', c: 'c', d: 'd' }, ['d', 'b', 'c'])).toEqual(
127
+ 'a: a\nd: d\nb: b\nc: c\n',
128
+ );
129
+ });
130
+
131
+ test('should add comments', () => {
132
+ expect(
133
+ yaml.toFile({ a: 'a', b: { c: { d: 'd' } } }, [], { a: 'Comment a', 'b.c': 'Comment c' }),
134
+ ).toEqual('# Comment a\na: a\nb:\n # Comment c\n c:\n d: d\n');
135
+
136
+ const expected = `# template comment
137
+ template: post
138
+ # title comment
139
+ title: title
140
+ # image comment
141
+ image: /media/netlify.png
142
+ # date comment
143
+ date: 2020-04-02T13:27:48.617Z
144
+ # object comment
145
+ object:
146
+ # object_title comment
147
+ object_title: object_title
148
+ # object_list comment
149
+ object_list:
150
+ - object_list_item_1: "1"
151
+ object_list_item_2: "2"
152
+ # list comment
153
+ list:
154
+ - "1"
155
+ `;
156
+
157
+ const result = yaml.toFile(
158
+ {
159
+ list: ['1'],
160
+ object: {
161
+ object_title: 'object_title',
162
+ object_list: [{ object_list_item_1: '1', object_list_item_2: '2' }],
163
+ },
164
+ date: new Date('2020-04-02T13:27:48.617Z'),
165
+ image: '/media/netlify.png',
166
+ title: 'title',
167
+ template: 'post',
168
+ },
169
+ ['template', 'title', 'image', 'date', 'object', 'list'],
170
+ {
171
+ list: 'list comment',
172
+ object: 'object comment',
173
+ 'object.object_title': 'object_title comment',
174
+ 'object.object_list': 'object_list comment',
175
+ date: 'date comment',
176
+ image: 'image comment',
177
+ title: 'title comment',
178
+ template: 'template comment',
179
+ },
180
+ );
181
+
182
+ expect(result).toEqual(expected);
183
+
184
+ expect(yaml.toFile({ a: 'a' }, [], { a: 'line 1\\nline 2' })).toEqual(
185
+ '# line 1\n# line 2\na: a\n',
186
+ );
187
+ });
188
+ });
189
+ });