@docusaurus/plugin-content-docs 2.0.0-beta.1 → 2.0.0-beta.10

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 (140) hide show
  1. package/lib/.tsbuildinfo +1 -1
  2. package/lib/categoryGeneratedIndex.d.ts +12 -0
  3. package/lib/categoryGeneratedIndex.js +37 -0
  4. package/lib/cli.d.ts +2 -2
  5. package/lib/cli.js +12 -34
  6. package/lib/client/docsClientUtils.d.ts +1 -4
  7. package/lib/client/docsClientUtils.js +21 -31
  8. package/lib/docFrontMatter.d.ts +1 -1
  9. package/lib/docFrontMatter.js +10 -6
  10. package/lib/docs.d.ts +25 -3
  11. package/lib/docs.js +125 -38
  12. package/lib/globalData.d.ts +1 -1
  13. package/lib/index.d.ts +1 -1
  14. package/lib/index.js +104 -138
  15. package/lib/lastUpdate.js +9 -10
  16. package/lib/markdown/index.d.ts +3 -6
  17. package/lib/markdown/index.js +3 -3
  18. package/lib/markdown/linkify.js +2 -2
  19. package/lib/numberPrefix.d.ts +1 -1
  20. package/lib/options.d.ts +3 -3
  21. package/lib/options.js +49 -17
  22. package/lib/props.d.ts +7 -2
  23. package/lib/props.js +61 -9
  24. package/lib/routes.d.ts +27 -0
  25. package/lib/routes.js +105 -0
  26. package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +5 -2
  27. package/lib/sidebars/generator.js +216 -0
  28. package/lib/sidebars/index.d.ts +15 -0
  29. package/lib/sidebars/index.js +73 -0
  30. package/lib/sidebars/normalization.d.ts +14 -0
  31. package/lib/sidebars/normalization.js +77 -0
  32. package/lib/sidebars/processor.d.ts +18 -0
  33. package/lib/sidebars/processor.js +85 -0
  34. package/lib/sidebars/types.d.ts +127 -0
  35. package/lib/sidebars/types.js +8 -0
  36. package/lib/sidebars/utils.d.ts +35 -0
  37. package/lib/sidebars/utils.js +228 -0
  38. package/lib/sidebars/validation.d.ts +10 -0
  39. package/lib/sidebars/validation.js +138 -0
  40. package/lib/slug.d.ts +4 -3
  41. package/lib/slug.js +27 -15
  42. package/lib/tags.d.ts +8 -0
  43. package/lib/tags.js +20 -0
  44. package/lib/theme/hooks/useDocs.js +24 -21
  45. package/lib/translations.d.ts +2 -2
  46. package/lib/translations.js +71 -29
  47. package/lib/types.d.ts +52 -62
  48. package/lib/versions.d.ts +3 -3
  49. package/lib/versions.js +76 -24
  50. package/package.json +22 -20
  51. package/src/__tests__/__fixtures__/simple-site/docs/_partials/somePartial.md +3 -0
  52. package/src/__tests__/__fixtures__/simple-site/docs/_partials/subfolder/somePartial.md +3 -0
  53. package/src/__tests__/__fixtures__/simple-site/docs/_somePartial.md +3 -0
  54. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +5 -0
  55. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +2 -0
  56. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +2 -0
  57. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +2 -0
  58. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +2 -0
  59. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +2 -0
  60. package/src/__tests__/__fixtures__/simple-site/sidebars.json +15 -1
  61. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +1 -0
  62. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +6 -0
  63. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +3 -0
  64. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +3 -0
  65. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +3 -0
  66. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +3 -0
  67. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/_partials/somePartial.md +3 -0
  68. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/_partials/subfolder/somePartial.md +3 -0
  69. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/_somePartial.md +3 -0
  70. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +3 -0
  71. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +2 -2
  72. package/src/__tests__/__snapshots__/cli.test.ts.snap +48 -73
  73. package/src/__tests__/__snapshots__/docs.test.ts.snap +140 -0
  74. package/src/__tests__/__snapshots__/index.test.ts.snap +753 -112
  75. package/src/__tests__/__snapshots__/translations.test.ts.snap +45 -18
  76. package/src/__tests__/cli.test.ts +15 -11
  77. package/src/__tests__/docFrontMatter.test.ts +195 -40
  78. package/src/__tests__/docs.test.ts +311 -150
  79. package/src/__tests__/index.test.ts +112 -69
  80. package/src/__tests__/lastUpdate.test.ts +3 -2
  81. package/src/__tests__/options.test.ts +48 -4
  82. package/src/__tests__/props.test.ts +62 -0
  83. package/src/__tests__/slug.test.ts +127 -20
  84. package/src/__tests__/translations.test.ts +7 -2
  85. package/src/__tests__/versions.test.ts +93 -67
  86. package/src/categoryGeneratedIndex.ts +57 -0
  87. package/src/cli.ts +8 -41
  88. package/src/client/__tests__/docsClientUtils.test.ts +4 -5
  89. package/src/client/docsClientUtils.ts +19 -41
  90. package/{types.d.ts → src/deps.d.ts} +0 -0
  91. package/src/docFrontMatter.ts +13 -7
  92. package/src/docs.ts +158 -29
  93. package/src/globalData.ts +6 -1
  94. package/src/index.ts +134 -179
  95. package/src/lastUpdate.ts +10 -9
  96. package/src/markdown/index.ts +8 -12
  97. package/src/numberPrefix.ts +5 -3
  98. package/src/options.ts +59 -28
  99. package/src/plugin-content-docs.d.ts +179 -35
  100. package/src/props.ts +91 -16
  101. package/src/routes.ts +173 -0
  102. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -0
  103. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -0
  104. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -0
  105. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category.js +0 -0
  106. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -0
  107. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-collapsed.json +0 -0
  108. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -0
  109. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -0
  110. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -0
  111. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -0
  112. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link.json +0 -0
  113. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-unknown-type.json +0 -0
  114. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-wrong-field.json +0 -0
  115. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars.json +0 -0
  116. package/src/{__tests__/__snapshots__/sidebars.test.ts.snap → sidebars/__tests__/__snapshots__/index.test.ts.snap} +36 -6
  117. package/src/{__tests__/sidebarItemsGenerator.test.ts → sidebars/__tests__/generator.test.ts} +143 -18
  118. package/src/sidebars/__tests__/index.test.ts +204 -0
  119. package/src/sidebars/__tests__/processor.test.ts +237 -0
  120. package/src/sidebars/__tests__/utils.test.ts +695 -0
  121. package/src/sidebars/__tests__/validation.test.ts +105 -0
  122. package/src/sidebars/generator.ts +310 -0
  123. package/src/sidebars/index.ts +94 -0
  124. package/src/sidebars/normalization.ts +112 -0
  125. package/src/sidebars/processor.ts +154 -0
  126. package/src/sidebars/types.ts +211 -0
  127. package/src/sidebars/utils.ts +329 -0
  128. package/src/sidebars/validation.ts +168 -0
  129. package/src/slug.ts +32 -17
  130. package/src/tags.ts +19 -0
  131. package/src/theme/hooks/useDocs.ts +5 -1
  132. package/src/translations.ts +103 -47
  133. package/src/types.ts +67 -105
  134. package/src/versions.ts +117 -21
  135. package/lib/sidebarItemsGenerator.js +0 -211
  136. package/lib/sidebars.d.ts +0 -43
  137. package/lib/sidebars.js +0 -319
  138. package/src/__tests__/sidebars.test.ts +0 -639
  139. package/src/sidebarItemsGenerator.ts +0 -307
  140. package/src/sidebars.ts +0 -506
@@ -8,6 +8,14 @@ Array [
8
8
  "description": "The label for category Getting started in sidebar docs",
9
9
  "message": "Getting started",
10
10
  },
11
+ "sidebar.docs.category.Getting started.link.generated-index.description": Object {
12
+ "description": "The generated-index page description for category Getting started in sidebar docs",
13
+ "message": "Getting started index description",
14
+ },
15
+ "sidebar.docs.category.Getting started.link.generated-index.title": Object {
16
+ "description": "The generated-index page title for category Getting started in sidebar docs",
17
+ "message": "Getting started index title",
18
+ },
11
19
  "sidebar.docs.link.Link label": Object {
12
20
  "description": "The label for link Link label in sidebar docs, linking to https://facebook.com",
13
21
  "message": "Link label",
@@ -25,6 +33,14 @@ Array [
25
33
  "description": "The label for category Getting started in sidebar docs",
26
34
  "message": "Getting started",
27
35
  },
36
+ "sidebar.docs.category.Getting started.link.generated-index.description": Object {
37
+ "description": "The generated-index page description for category Getting started in sidebar docs",
38
+ "message": "Getting started index description",
39
+ },
40
+ "sidebar.docs.category.Getting started.link.generated-index.title": Object {
41
+ "description": "The generated-index page title for category Getting started in sidebar docs",
42
+ "message": "Getting started index title",
43
+ },
28
44
  "sidebar.docs.link.Link label": Object {
29
45
  "description": "The label for link Link label in sidebar docs, linking to https://facebook.com",
30
46
  "message": "Link label",
@@ -42,6 +58,14 @@ Array [
42
58
  "description": "The label for category Getting started in sidebar docs",
43
59
  "message": "Getting started",
44
60
  },
61
+ "sidebar.docs.category.Getting started.link.generated-index.description": Object {
62
+ "description": "The generated-index page description for category Getting started in sidebar docs",
63
+ "message": "Getting started index description",
64
+ },
65
+ "sidebar.docs.category.Getting started.link.generated-index.title": Object {
66
+ "description": "The generated-index page title for category Getting started in sidebar docs",
67
+ "message": "Getting started index title",
68
+ },
45
69
  "sidebar.docs.link.Link label": Object {
46
70
  "description": "The label for link Link label in sidebar docs, linking to https://facebook.com",
47
71
  "message": "Link label",
@@ -67,7 +91,6 @@ Object {
67
91
  "description": "doc1 description",
68
92
  "editUrl": "any",
69
93
  "id": "doc1",
70
- "isDocsHomePage": false,
71
94
  "lastUpdatedAt": 0,
72
95
  "lastUpdatedBy": "any",
73
96
  "next": undefined,
@@ -84,7 +107,6 @@ Object {
84
107
  "description": "doc2 description",
85
108
  "editUrl": "any",
86
109
  "id": "doc2",
87
- "isDocsHomePage": false,
88
110
  "lastUpdatedAt": 0,
89
111
  "lastUpdatedBy": "any",
90
112
  "next": undefined,
@@ -101,7 +123,6 @@ Object {
101
123
  "description": "doc3 description",
102
124
  "editUrl": "any",
103
125
  "id": "doc3",
104
- "isDocsHomePage": false,
105
126
  "lastUpdatedAt": 0,
106
127
  "lastUpdatedBy": "any",
107
128
  "next": undefined,
@@ -118,7 +139,6 @@ Object {
118
139
  "description": "doc4 description",
119
140
  "editUrl": "any",
120
141
  "id": "doc4",
121
- "isDocsHomePage": false,
122
142
  "lastUpdatedAt": 0,
123
143
  "lastUpdatedBy": "any",
124
144
  "next": undefined,
@@ -135,7 +155,6 @@ Object {
135
155
  "description": "doc5 description",
136
156
  "editUrl": "any",
137
157
  "id": "doc5",
138
- "isDocsHomePage": false,
139
158
  "lastUpdatedAt": 0,
140
159
  "lastUpdatedBy": "any",
141
160
  "next": undefined,
@@ -151,7 +170,6 @@ Object {
151
170
  ],
152
171
  "isLast": true,
153
172
  "mainDocId": "",
154
- "permalinkToSidebar": Object {},
155
173
  "routePriority": undefined,
156
174
  "sidebarFilePath": "any",
157
175
  "sidebars": Object {
@@ -178,6 +196,13 @@ Object {
178
196
  },
179
197
  ],
180
198
  "label": "Getting started (translated)",
199
+ "link": Object {
200
+ "description": "Getting started index description (translated)",
201
+ "permalink": "/docs/category/getting-started-index-slug",
202
+ "slug": "/category/getting-started-index-slug",
203
+ "title": "Getting started index title (translated)",
204
+ "type": "generated-index",
205
+ },
181
206
  "type": "category",
182
207
  },
183
208
  Object {
@@ -208,7 +233,6 @@ Object {
208
233
  "description": "doc1 description",
209
234
  "editUrl": "any",
210
235
  "id": "doc1",
211
- "isDocsHomePage": false,
212
236
  "lastUpdatedAt": 0,
213
237
  "lastUpdatedBy": "any",
214
238
  "next": undefined,
@@ -225,7 +249,6 @@ Object {
225
249
  "description": "doc2 description",
226
250
  "editUrl": "any",
227
251
  "id": "doc2",
228
- "isDocsHomePage": false,
229
252
  "lastUpdatedAt": 0,
230
253
  "lastUpdatedBy": "any",
231
254
  "next": undefined,
@@ -242,7 +265,6 @@ Object {
242
265
  "description": "doc3 description",
243
266
  "editUrl": "any",
244
267
  "id": "doc3",
245
- "isDocsHomePage": false,
246
268
  "lastUpdatedAt": 0,
247
269
  "lastUpdatedBy": "any",
248
270
  "next": undefined,
@@ -259,7 +281,6 @@ Object {
259
281
  "description": "doc4 description",
260
282
  "editUrl": "any",
261
283
  "id": "doc4",
262
- "isDocsHomePage": false,
263
284
  "lastUpdatedAt": 0,
264
285
  "lastUpdatedBy": "any",
265
286
  "next": undefined,
@@ -276,7 +297,6 @@ Object {
276
297
  "description": "doc5 description",
277
298
  "editUrl": "any",
278
299
  "id": "doc5",
279
- "isDocsHomePage": false,
280
300
  "lastUpdatedAt": 0,
281
301
  "lastUpdatedBy": "any",
282
302
  "next": undefined,
@@ -292,7 +312,6 @@ Object {
292
312
  ],
293
313
  "isLast": true,
294
314
  "mainDocId": "",
295
- "permalinkToSidebar": Object {},
296
315
  "routePriority": undefined,
297
316
  "sidebarFilePath": "any",
298
317
  "sidebars": Object {
@@ -319,6 +338,13 @@ Object {
319
338
  },
320
339
  ],
321
340
  "label": "Getting started (translated)",
341
+ "link": Object {
342
+ "description": "Getting started index description (translated)",
343
+ "permalink": "/docs/category/getting-started-index-slug",
344
+ "slug": "/category/getting-started-index-slug",
345
+ "title": "Getting started index title (translated)",
346
+ "type": "generated-index",
347
+ },
322
348
  "type": "category",
323
349
  },
324
350
  Object {
@@ -349,7 +375,6 @@ Object {
349
375
  "description": "doc1 description",
350
376
  "editUrl": "any",
351
377
  "id": "doc1",
352
- "isDocsHomePage": false,
353
378
  "lastUpdatedAt": 0,
354
379
  "lastUpdatedBy": "any",
355
380
  "next": undefined,
@@ -366,7 +391,6 @@ Object {
366
391
  "description": "doc2 description",
367
392
  "editUrl": "any",
368
393
  "id": "doc2",
369
- "isDocsHomePage": false,
370
394
  "lastUpdatedAt": 0,
371
395
  "lastUpdatedBy": "any",
372
396
  "next": undefined,
@@ -383,7 +407,6 @@ Object {
383
407
  "description": "doc3 description",
384
408
  "editUrl": "any",
385
409
  "id": "doc3",
386
- "isDocsHomePage": false,
387
410
  "lastUpdatedAt": 0,
388
411
  "lastUpdatedBy": "any",
389
412
  "next": undefined,
@@ -400,7 +423,6 @@ Object {
400
423
  "description": "doc4 description",
401
424
  "editUrl": "any",
402
425
  "id": "doc4",
403
- "isDocsHomePage": false,
404
426
  "lastUpdatedAt": 0,
405
427
  "lastUpdatedBy": "any",
406
428
  "next": undefined,
@@ -417,7 +439,6 @@ Object {
417
439
  "description": "doc5 description",
418
440
  "editUrl": "any",
419
441
  "id": "doc5",
420
- "isDocsHomePage": false,
421
442
  "lastUpdatedAt": 0,
422
443
  "lastUpdatedBy": "any",
423
444
  "next": undefined,
@@ -433,7 +454,6 @@ Object {
433
454
  ],
434
455
  "isLast": true,
435
456
  "mainDocId": "",
436
- "permalinkToSidebar": Object {},
437
457
  "routePriority": undefined,
438
458
  "sidebarFilePath": "any",
439
459
  "sidebars": Object {
@@ -460,6 +480,13 @@ Object {
460
480
  },
461
481
  ],
462
482
  "label": "Getting started (translated)",
483
+ "link": Object {
484
+ "description": "Getting started index description (translated)",
485
+ "permalink": "/docs/category/getting-started-index-slug",
486
+ "slug": "/category/getting-started-index-slug",
487
+ "title": "Getting started index title (translated)",
488
+ "type": "generated-index",
489
+ },
463
490
  "type": "category",
464
491
  },
465
492
  Object {
@@ -7,23 +7,26 @@
7
7
 
8
8
  import path from 'path';
9
9
  import {cliDocsVersionCommand} from '../cli';
10
- import {PathOptions} from '../types';
10
+ import {PathOptions, SidebarOptions} from '../types';
11
11
  import fs from 'fs-extra';
12
12
  import {
13
13
  getVersionedDocsDirPath,
14
14
  getVersionsFilePath,
15
15
  getVersionedSidebarsDirPath,
16
16
  } from '../versions';
17
- import {DEFAULT_PLUGIN_ID} from '@docusaurus/core/lib/constants';
17
+ import {DEFAULT_PLUGIN_ID} from '@docusaurus/utils';
18
18
 
19
19
  const fixtureDir = path.join(__dirname, '__fixtures__');
20
20
 
21
21
  describe('docsVersion', () => {
22
22
  const simpleSiteDir = path.join(fixtureDir, 'simple-site');
23
23
  const versionedSiteDir = path.join(fixtureDir, 'versioned-site');
24
- const DEFAULT_OPTIONS: PathOptions = {
24
+
25
+ const DEFAULT_OPTIONS: PathOptions & SidebarOptions = {
25
26
  path: 'docs',
26
27
  sidebarPath: '',
28
+ sidebarCollapsed: true,
29
+ sidebarCollapsible: true,
27
30
  };
28
31
 
29
32
  test('no version tag provided', () => {
@@ -186,17 +189,17 @@ describe('docsVersion', () => {
186
189
  let versionedSidebarPath;
187
190
  writeMock.mockImplementationOnce((filepath, content) => {
188
191
  versionedSidebarPath = filepath;
189
- versionedSidebar = JSON.parse(content);
192
+ versionedSidebar = JSON.parse(content as string);
190
193
  });
191
194
  let versionsPath;
192
195
  let versions;
193
196
  writeMock.mockImplementationOnce((filepath, content) => {
194
197
  versionsPath = filepath;
195
- versions = JSON.parse(content);
198
+ versions = JSON.parse(content as string);
196
199
  });
197
200
  const consoleMock = jest.spyOn(console, 'log').mockImplementation();
198
201
  const options = {
199
- path: 'docs',
202
+ ...DEFAULT_OPTIONS,
200
203
  sidebarPath: path.join(simpleSiteDir, 'sidebars.json'),
201
204
  };
202
205
  cliDocsVersionCommand('1.0.0', simpleSiteDir, DEFAULT_PLUGIN_ID, options);
@@ -234,17 +237,17 @@ describe('docsVersion', () => {
234
237
  let versionedSidebarPath;
235
238
  writeMock.mockImplementationOnce((filepath, content) => {
236
239
  versionedSidebarPath = filepath;
237
- versionedSidebar = JSON.parse(content);
240
+ versionedSidebar = JSON.parse(content as string);
238
241
  });
239
242
  let versionsPath;
240
243
  let versions;
241
244
  writeMock.mockImplementationOnce((filepath, content) => {
242
245
  versionsPath = filepath;
243
- versions = JSON.parse(content);
246
+ versions = JSON.parse(content as string);
244
247
  });
245
248
  const consoleMock = jest.spyOn(console, 'log').mockImplementation();
246
249
  const options = {
247
- path: 'docs',
250
+ ...DEFAULT_OPTIONS,
248
251
  sidebarPath: path.join(versionedSiteDir, 'sidebars.json'),
249
252
  };
250
253
  cliDocsVersionCommand(
@@ -289,16 +292,17 @@ describe('docsVersion', () => {
289
292
  let versionedSidebarPath;
290
293
  writeMock.mockImplementationOnce((filepath, content) => {
291
294
  versionedSidebarPath = filepath;
292
- versionedSidebar = JSON.parse(content);
295
+ versionedSidebar = JSON.parse(content as string);
293
296
  });
294
297
  let versionsPath;
295
298
  let versions;
296
299
  writeMock.mockImplementationOnce((filepath, content) => {
297
300
  versionsPath = filepath;
298
- versions = JSON.parse(content);
301
+ versions = JSON.parse(content as string);
299
302
  });
300
303
  const consoleMock = jest.spyOn(console, 'log').mockImplementation();
301
304
  const options = {
305
+ ...DEFAULT_OPTIONS,
302
306
  path: 'community',
303
307
  sidebarPath: path.join(versionedSiteDir, 'community_sidebars.json'),
304
308
  };
@@ -5,10 +5,12 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import {DocFrontMatter, validateDocFrontMatter} from '../docFrontMatter';
8
+ import {validateDocFrontMatter} from '../docFrontMatter';
9
+ import {DocFrontMatter} from '../types';
10
+ import escapeStringRegexp from 'escape-string-regexp';
9
11
 
10
12
  function testField(params: {
11
- fieldName: keyof DocFrontMatter;
13
+ prefix: string;
12
14
  validFrontMatters: DocFrontMatter[];
13
15
  convertibleFrontMatter?: [
14
16
  ConvertableFrontMatter: Record<string, unknown>,
@@ -19,27 +21,38 @@ function testField(params: {
19
21
  ErrorMessage: string,
20
22
  ][];
21
23
  }) {
22
- describe(`"${params.fieldName}" field`, () => {
23
- test('accept valid values', () => {
24
- params.validFrontMatters.forEach((frontMatter) => {
25
- expect(validateDocFrontMatter(frontMatter)).toEqual(frontMatter);
26
- });
24
+ test(`[${params.prefix}] accept valid values`, () => {
25
+ params.validFrontMatters.forEach((frontMatter) => {
26
+ expect(validateDocFrontMatter(frontMatter)).toEqual(frontMatter);
27
27
  });
28
+ });
28
29
 
29
- test('convert valid values', () => {
30
- params.convertibleFrontMatter?.forEach(
31
- ([convertibleFrontMatter, convertedFrontMatter]) => {
32
- expect(validateDocFrontMatter(convertibleFrontMatter)).toEqual(
33
- convertedFrontMatter,
34
- );
35
- },
36
- );
37
- });
30
+ test(`[${params.prefix}] convert valid values`, () => {
31
+ params.convertibleFrontMatter?.forEach(
32
+ ([convertibleFrontMatter, convertedFrontMatter]) => {
33
+ expect(validateDocFrontMatter(convertibleFrontMatter)).toEqual(
34
+ convertedFrontMatter,
35
+ );
36
+ },
37
+ );
38
+ });
38
39
 
39
- test('throw error for values', () => {
40
- params.invalidFrontMatters?.forEach(([frontMatter, message]) => {
41
- expect(() => validateDocFrontMatter(frontMatter)).toThrow(message);
42
- });
40
+ test(`[${params.prefix}] throw error for values`, () => {
41
+ params.invalidFrontMatters?.forEach(([frontMatter, message]) => {
42
+ try {
43
+ validateDocFrontMatter(frontMatter);
44
+ fail(
45
+ new Error(
46
+ `Doc frontmatter is expected to be rejected, but was accepted successfully:\n ${JSON.stringify(
47
+ frontMatter,
48
+ null,
49
+ 2,
50
+ )}`,
51
+ ),
52
+ );
53
+ } catch (e) {
54
+ expect(e.message).toMatch(new RegExp(escapeStringRegexp(message)));
55
+ }
43
56
  });
44
57
  });
45
58
  }
@@ -54,24 +67,30 @@ describe('validateDocFrontMatter', () => {
54
67
  const frontMatter = {abc: '1'};
55
68
  expect(validateDocFrontMatter(frontMatter)).toEqual(frontMatter);
56
69
  });
70
+ });
57
71
 
72
+ describe('validateDocFrontMatter id', () => {
58
73
  testField({
59
- fieldName: 'id',
74
+ prefix: 'id',
60
75
  validFrontMatters: [{id: '123'}, {id: 'unique_id'}],
61
76
  invalidFrontMatters: [[{id: ''}, 'is not allowed to be empty']],
62
77
  });
78
+ });
63
79
 
80
+ describe('validateDocFrontMatter title', () => {
64
81
  testField({
65
- fieldName: 'title',
82
+ prefix: 'title',
66
83
  validFrontMatters: [
67
84
  // See https://github.com/facebook/docusaurus/issues/4591#issuecomment-822372398
68
85
  {title: ''},
69
86
  {title: 'title'},
70
87
  ],
71
88
  });
89
+ });
72
90
 
91
+ describe('validateDocFrontMatter hide_title', () => {
73
92
  testField({
74
- fieldName: 'hide_title',
93
+ prefix: 'hide_title',
75
94
  validFrontMatters: [{hide_title: true}, {hide_title: false}],
76
95
  convertibleFrontMatter: [
77
96
  [{hide_title: 'true'}, {hide_title: true}],
@@ -83,9 +102,11 @@ describe('validateDocFrontMatter', () => {
83
102
  [{hide_title: ''}, 'must be a boolean'],
84
103
  ],
85
104
  });
105
+ });
86
106
 
107
+ describe('validateDocFrontMatter hide_table_of_contents', () => {
87
108
  testField({
88
- fieldName: 'hide_table_of_contents',
109
+ prefix: 'hide_table_of_contents',
89
110
  validFrontMatters: [
90
111
  {hide_table_of_contents: true},
91
112
  {hide_table_of_contents: false},
@@ -100,9 +121,11 @@ describe('validateDocFrontMatter', () => {
100
121
  [{hide_table_of_contents: ''}, 'must be a boolean'],
101
122
  ],
102
123
  });
124
+ });
103
125
 
126
+ describe('validateDocFrontMatter keywords', () => {
104
127
  testField({
105
- fieldName: 'keywords',
128
+ prefix: 'keywords',
106
129
  validFrontMatters: [
107
130
  {keywords: ['hello']},
108
131
  {keywords: ['hello', 'world']},
@@ -115,29 +138,36 @@ describe('validateDocFrontMatter', () => {
115
138
  [{keywords: []}, 'does not contain 1 required value(s)'],
116
139
  ],
117
140
  });
141
+ });
118
142
 
143
+ describe('validateDocFrontMatter image', () => {
119
144
  testField({
120
- fieldName: 'image',
121
- validFrontMatters: [{image: 'https://docusaurus.io/blog/image.png'}],
145
+ prefix: 'image',
146
+ validFrontMatters: [
147
+ {image: 'https://docusaurus.io/blog/image.png'},
148
+ {image: '/absolute/image.png'},
149
+ {image: '../relative/image.png'},
150
+ ],
122
151
  invalidFrontMatters: [
123
- [{image: ''}, 'is not allowed to be empty'],
124
- [{image: './api/@docusaurus/plugin-debug'}, 'must be a valid uri'],
125
- [{image: '/api/@docusaurus/plugin-debug'}, 'must be a valid uri'],
126
- [{image: '@site/api/asset/image.png'}, 'must be a valid uri'],
152
+ [{image: ''}, '"image" does not look like a valid url (value=\'\')'],
127
153
  ],
128
154
  });
155
+ });
129
156
 
157
+ describe('validateDocFrontMatter description', () => {
130
158
  testField({
131
- fieldName: 'description',
159
+ prefix: 'description',
132
160
  validFrontMatters: [
133
161
  // See https://github.com/facebook/docusaurus/issues/4591#issuecomment-822372398
134
162
  {description: ''},
135
163
  {description: 'description'},
136
164
  ],
137
165
  });
166
+ });
138
167
 
168
+ describe('validateDocFrontMatter slug', () => {
139
169
  testField({
140
- fieldName: 'slug',
170
+ prefix: 'slug',
141
171
  validFrontMatters: [
142
172
  {slug: '/'},
143
173
  {slug: 'slug'},
@@ -150,31 +180,37 @@ describe('validateDocFrontMatter', () => {
150
180
  ],
151
181
  invalidFrontMatters: [[{slug: ''}, 'is not allowed to be empty']],
152
182
  });
183
+ });
153
184
 
185
+ describe('validateDocFrontMatter sidebar_label', () => {
154
186
  testField({
155
- fieldName: 'sidebar_label',
187
+ prefix: 'sidebar_label',
156
188
  validFrontMatters: [{sidebar_label: 'Awesome docs'}],
157
189
  invalidFrontMatters: [[{sidebar_label: ''}, 'is not allowed to be empty']],
158
190
  });
191
+ });
159
192
 
193
+ describe('validateDocFrontMatter sidebar_position', () => {
160
194
  testField({
161
- fieldName: 'sidebar_position',
195
+ prefix: 'sidebar_position',
162
196
  validFrontMatters: [
197
+ {sidebar_position: -5},
198
+ {sidebar_position: -3.5},
163
199
  {sidebar_position: 0},
164
200
  {sidebar_position: 5},
165
201
  {sidebar_position: 3.5},
166
202
  ],
167
203
  convertibleFrontMatter: [
204
+ [{sidebar_position: '-1.5'}, {sidebar_position: -1.5}],
168
205
  [{sidebar_position: '1'}, {sidebar_position: 1}],
169
206
  [{sidebar_position: '1.5'}, {sidebar_position: 1.5}],
170
207
  ],
171
- invalidFrontMatters: [
172
- [{sidebar_position: -1}, 'must be greater than or equal to 0'],
173
- ],
174
208
  });
209
+ });
175
210
 
211
+ describe('validateDocFrontMatter custom_edit_url', () => {
176
212
  testField({
177
- fieldName: 'custom_edit_url',
213
+ prefix: 'custom_edit_url',
178
214
  validFrontMatters: [
179
215
  // See https://github.com/demisto/content-docs/pull/616#issuecomment-827087566
180
216
  {custom_edit_url: ''},
@@ -184,9 +220,11 @@ describe('validateDocFrontMatter', () => {
184
220
  {custom_edit_url: '@site/api/docs/markdown.md'},
185
221
  ],
186
222
  });
223
+ });
187
224
 
225
+ describe('validateDocFrontMatter parse_number_prefixes', () => {
188
226
  testField({
189
- fieldName: 'parse_number_prefixes',
227
+ prefix: 'parse_number_prefixes',
190
228
  validFrontMatters: [
191
229
  {parse_number_prefixes: true},
192
230
  {parse_number_prefixes: false},
@@ -202,3 +240,120 @@ describe('validateDocFrontMatter', () => {
202
240
  ],
203
241
  });
204
242
  });
243
+
244
+ describe('validateDocFrontMatter tags', () => {
245
+ testField({
246
+ prefix: 'tags',
247
+ validFrontMatters: [{}, {tags: undefined}, {tags: ['tag1', 'tag2']}],
248
+ convertibleFrontMatter: [[{tags: ['tag1', 42]}, {tags: ['tag1', '42']}]],
249
+ invalidFrontMatters: [
250
+ [{tags: 42}, '"tags" does not look like a valid FrontMatter Yaml array.'],
251
+ [
252
+ {tags: 'tag1, tag2'},
253
+ '"tags" does not look like a valid FrontMatter Yaml array.',
254
+ ],
255
+ [{tags: [{}]}, '"tags[0]" does not look like a valid tag'],
256
+ [{tags: [true]}, '"tags[0]" does not look like a valid tag'],
257
+ [
258
+ {tags: ['tag1', {hey: 'test'}]},
259
+ '"tags[1]" does not look like a valid tag',
260
+ ],
261
+ ],
262
+ });
263
+ });
264
+
265
+ describe('validateDocFrontMatter toc_min_heading_level', () => {
266
+ testField({
267
+ prefix: 'toc_min_heading_level',
268
+ validFrontMatters: [
269
+ {},
270
+ {toc_min_heading_level: undefined},
271
+ {toc_min_heading_level: 2},
272
+ {toc_min_heading_level: 3},
273
+ {toc_min_heading_level: 4},
274
+ {toc_min_heading_level: 5},
275
+ {toc_min_heading_level: 6},
276
+ ],
277
+ convertibleFrontMatter: [
278
+ [{toc_min_heading_level: '2'}, {toc_min_heading_level: 2}],
279
+ ],
280
+ invalidFrontMatters: [
281
+ [
282
+ {toc_min_heading_level: 1},
283
+ '"toc_min_heading_level" must be greater than or equal to 2',
284
+ ],
285
+ [
286
+ {toc_min_heading_level: 7},
287
+ '"toc_min_heading_level" must be less than or equal to 6',
288
+ ],
289
+ [
290
+ {toc_min_heading_level: 'hello'},
291
+ '"toc_min_heading_level" must be a number',
292
+ ],
293
+ [
294
+ {toc_min_heading_level: true},
295
+ '"toc_min_heading_level" must be a number',
296
+ ],
297
+ ],
298
+ });
299
+ });
300
+
301
+ describe('validateDocFrontMatter toc_max_heading_level', () => {
302
+ testField({
303
+ prefix: 'toc_max_heading_level',
304
+ validFrontMatters: [
305
+ {},
306
+ {toc_max_heading_level: undefined},
307
+ {toc_max_heading_level: 2},
308
+ {toc_max_heading_level: 3},
309
+ {toc_max_heading_level: 4},
310
+ {toc_max_heading_level: 5},
311
+ {toc_max_heading_level: 6},
312
+ ],
313
+ convertibleFrontMatter: [
314
+ [{toc_max_heading_level: '2'}, {toc_max_heading_level: 2}],
315
+ ],
316
+ invalidFrontMatters: [
317
+ [
318
+ {toc_max_heading_level: 1},
319
+ '"toc_max_heading_level" must be greater than or equal to 2',
320
+ ],
321
+ [
322
+ {toc_max_heading_level: 7},
323
+ '"toc_max_heading_level" must be less than or equal to 6',
324
+ ],
325
+ [
326
+ {toc_max_heading_level: 'hello'},
327
+ '"toc_max_heading_level" must be a number',
328
+ ],
329
+ [
330
+ {toc_max_heading_level: true},
331
+ '"toc_max_heading_level" must be a number',
332
+ ],
333
+ ],
334
+ });
335
+ });
336
+
337
+ describe('validateDocFrontMatter toc min/max consistency', () => {
338
+ testField({
339
+ prefix: 'toc min/max',
340
+ validFrontMatters: [
341
+ {},
342
+ {toc_min_heading_level: undefined, toc_max_heading_level: undefined},
343
+ {toc_min_heading_level: 2, toc_max_heading_level: 2},
344
+ {toc_min_heading_level: 2, toc_max_heading_level: 6},
345
+ {toc_min_heading_level: 2, toc_max_heading_level: 3},
346
+ {toc_min_heading_level: 3, toc_max_heading_level: 3},
347
+ ],
348
+ invalidFrontMatters: [
349
+ [
350
+ {toc_min_heading_level: 4, toc_max_heading_level: 3},
351
+ '"toc_min_heading_level" must be less than or equal to ref:toc_max_heading_level',
352
+ ],
353
+ [
354
+ {toc_min_heading_level: 6, toc_max_heading_level: 2},
355
+ '"toc_min_heading_level" must be less than or equal to ref:toc_max_heading_level',
356
+ ],
357
+ ],
358
+ });
359
+ });