@docusaurus/plugin-content-docs 2.0.0-beta.12faed89d → 2.0.0-beta.13

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 (138) 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 +0 -3
  7. package/lib/client/docsClientUtils.js +19 -22
  8. package/lib/docFrontMatter.d.ts +1 -1
  9. package/lib/docFrontMatter.js +7 -3
  10. package/lib/docs.d.ts +25 -3
  11. package/lib/docs.js +125 -41
  12. package/lib/globalData.d.ts +1 -1
  13. package/lib/index.d.ts +1 -1
  14. package/lib/index.js +100 -131
  15. package/lib/lastUpdate.js +8 -9
  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 +48 -11
  22. package/lib/props.d.ts +7 -2
  23. package/lib/props.js +60 -8
  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 +21 -21
  45. package/lib/translations.d.ts +2 -2
  46. package/lib/translations.js +71 -29
  47. package/lib/types.d.ts +52 -63
  48. package/lib/versions.d.ts +3 -3
  49. package/lib/versions.js +41 -22
  50. package/package.json +20 -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 +745 -97
  75. package/src/__tests__/__snapshots__/translations.test.ts.snap +45 -15
  76. package/src/__tests__/cli.test.ts +15 -11
  77. package/src/__tests__/docFrontMatter.test.ts +160 -45
  78. package/src/__tests__/docs.test.ts +311 -150
  79. package/src/__tests__/index.test.ts +108 -66
  80. package/src/__tests__/lastUpdate.test.ts +1 -1
  81. package/src/__tests__/options.test.ts +48 -3
  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 -1
  85. package/src/__tests__/versions.test.ts +73 -70
  86. package/src/categoryGeneratedIndex.ts +57 -0
  87. package/src/cli.ts +8 -41
  88. package/src/client/docsClientUtils.ts +14 -26
  89. package/{types.d.ts → src/deps.d.ts} +0 -0
  90. package/src/docFrontMatter.ts +9 -4
  91. package/src/docs.ts +158 -32
  92. package/src/globalData.ts +6 -1
  93. package/src/index.ts +125 -169
  94. package/src/lastUpdate.ts +10 -13
  95. package/src/markdown/index.ts +8 -12
  96. package/src/numberPrefix.ts +5 -3
  97. package/src/options.ts +59 -14
  98. package/src/plugin-content-docs.d.ts +173 -40
  99. package/src/props.ts +90 -15
  100. package/src/routes.ts +173 -0
  101. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -0
  102. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -0
  103. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -0
  104. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category.js +0 -0
  105. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -0
  106. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-collapsed.json +0 -0
  107. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -0
  108. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -0
  109. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -0
  110. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -0
  111. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link.json +0 -0
  112. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-unknown-type.json +0 -0
  113. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-wrong-field.json +0 -0
  114. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars.json +0 -0
  115. package/src/{__tests__/__snapshots__/sidebars.test.ts.snap → sidebars/__tests__/__snapshots__/index.test.ts.snap} +36 -6
  116. package/src/{__tests__/sidebarItemsGenerator.test.ts → sidebars/__tests__/generator.test.ts} +143 -18
  117. package/src/sidebars/__tests__/index.test.ts +204 -0
  118. package/src/sidebars/__tests__/processor.test.ts +237 -0
  119. package/src/sidebars/__tests__/utils.test.ts +695 -0
  120. package/src/sidebars/__tests__/validation.test.ts +105 -0
  121. package/src/sidebars/generator.ts +310 -0
  122. package/src/sidebars/index.ts +94 -0
  123. package/src/sidebars/normalization.ts +112 -0
  124. package/src/sidebars/processor.ts +154 -0
  125. package/src/sidebars/types.ts +211 -0
  126. package/src/sidebars/utils.ts +329 -0
  127. package/src/sidebars/validation.ts +168 -0
  128. package/src/slug.ts +32 -17
  129. package/src/tags.ts +19 -0
  130. package/src/translations.ts +103 -47
  131. package/src/types.ts +64 -107
  132. package/src/versions.ts +59 -25
  133. package/lib/sidebarItemsGenerator.js +0 -211
  134. package/lib/sidebars.d.ts +0 -43
  135. package/lib/sidebars.js +0 -320
  136. package/src/__tests__/sidebars.test.ts +0 -639
  137. package/src/sidebarItemsGenerator.ts +0 -307
  138. package/src/sidebars.ts +0 -522
@@ -0,0 +1,695 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import {
9
+ createSidebarsUtils,
10
+ collectSidebarDocItems,
11
+ collectSidebarCategories,
12
+ collectSidebarLinks,
13
+ transformSidebarItems,
14
+ collectSidebarsDocIds,
15
+ SidebarNavigation,
16
+ toDocNavigationLink,
17
+ toNavigationLink,
18
+ } from '../utils';
19
+ import type {Sidebar, Sidebars} from '../types';
20
+ import {DocMetadataBase, DocNavLink} from '../../types';
21
+
22
+ describe('createSidebarsUtils', () => {
23
+ const sidebar1: Sidebar = [
24
+ {
25
+ type: 'category',
26
+ collapsed: false,
27
+ collapsible: true,
28
+ label: 'S1 Category',
29
+ items: [
30
+ {
31
+ type: 'category',
32
+ collapsed: false,
33
+ collapsible: true,
34
+ label: 'S1 Subcategory',
35
+ items: [{type: 'doc', id: 'doc1'}],
36
+ },
37
+ {type: 'doc', id: 'doc2'},
38
+ ],
39
+ },
40
+ ];
41
+
42
+ const sidebar2: Sidebar = [
43
+ {
44
+ type: 'category',
45
+ collapsed: false,
46
+ collapsible: true,
47
+ label: 'S2 Category',
48
+ items: [
49
+ {type: 'doc', id: 'doc3'},
50
+ {type: 'doc', id: 'doc4'},
51
+ ],
52
+ },
53
+ ];
54
+
55
+ const sidebar3: Sidebar = [
56
+ {
57
+ type: 'category',
58
+ collapsed: false,
59
+ collapsible: true,
60
+ label: 'S3 Category',
61
+ link: {
62
+ type: 'doc',
63
+ id: 'doc5',
64
+ },
65
+ items: [
66
+ {
67
+ type: 'category',
68
+ collapsed: false,
69
+ collapsible: true,
70
+ label: 'S3 SubCategory',
71
+ link: {
72
+ type: 'generated-index',
73
+ slug: '/s3-subcategory-index-slug',
74
+ permalink: '/s3-subcategory-index-permalink',
75
+ },
76
+ items: [
77
+ {
78
+ type: 'category',
79
+ collapsed: false,
80
+ collapsible: true,
81
+ label: 'S3 SubSubCategory',
82
+ link: {
83
+ type: 'generated-index',
84
+ slug: '/s3-subsubcategory-slug',
85
+ permalink: '/s3-subsubcategory-index-permalink',
86
+ },
87
+ items: [
88
+ {type: 'doc', id: 'doc6'},
89
+ {type: 'doc', id: 'doc7'},
90
+ ],
91
+ },
92
+ ],
93
+ },
94
+ ],
95
+ },
96
+ ];
97
+
98
+ const sidebars: Sidebars = {sidebar1, sidebar2, sidebar3};
99
+
100
+ const {
101
+ getFirstDocIdOfFirstSidebar,
102
+ getSidebarNameByDocId,
103
+ getDocNavigation,
104
+ getCategoryGeneratedIndexNavigation,
105
+ getCategoryGeneratedIndexList,
106
+ } = createSidebarsUtils(sidebars);
107
+
108
+ test('getSidebarNameByDocId', async () => {
109
+ expect(getFirstDocIdOfFirstSidebar()).toEqual('doc1');
110
+ });
111
+
112
+ test('getSidebarNameByDocId', async () => {
113
+ expect(getSidebarNameByDocId('doc1')).toEqual('sidebar1');
114
+ expect(getSidebarNameByDocId('doc2')).toEqual('sidebar1');
115
+ expect(getSidebarNameByDocId('doc3')).toEqual('sidebar2');
116
+ expect(getSidebarNameByDocId('doc4')).toEqual('sidebar2');
117
+ expect(getSidebarNameByDocId('doc5')).toEqual('sidebar3');
118
+ expect(getSidebarNameByDocId('doc6')).toEqual('sidebar3');
119
+ expect(getSidebarNameByDocId('doc7')).toEqual('sidebar3');
120
+ expect(getSidebarNameByDocId('unknown_id')).toEqual(undefined);
121
+ });
122
+
123
+ test('getDocNavigation', async () => {
124
+ expect(getDocNavigation('doc1')).toEqual({
125
+ sidebarName: 'sidebar1',
126
+ previous: undefined,
127
+ next: {
128
+ type: 'doc',
129
+ id: 'doc2',
130
+ },
131
+ } as SidebarNavigation);
132
+ expect(getDocNavigation('doc2')).toEqual({
133
+ sidebarName: 'sidebar1',
134
+ previous: {
135
+ type: 'doc',
136
+ id: 'doc1',
137
+ },
138
+ next: undefined,
139
+ } as SidebarNavigation);
140
+
141
+ expect(getDocNavigation('doc3')).toEqual({
142
+ sidebarName: 'sidebar2',
143
+ previous: undefined,
144
+ next: {
145
+ type: 'doc',
146
+ id: 'doc4',
147
+ },
148
+ } as SidebarNavigation);
149
+ expect(getDocNavigation('doc4')).toEqual({
150
+ sidebarName: 'sidebar2',
151
+ previous: {
152
+ type: 'doc',
153
+ id: 'doc3',
154
+ },
155
+ next: undefined,
156
+ } as SidebarNavigation);
157
+
158
+ expect(getDocNavigation('doc5')).toMatchObject({
159
+ sidebarName: 'sidebar3',
160
+ previous: undefined,
161
+ next: {
162
+ type: 'category',
163
+ label: 'S3 SubCategory',
164
+ },
165
+ } as SidebarNavigation);
166
+ expect(getDocNavigation('doc6')).toMatchObject({
167
+ sidebarName: 'sidebar3',
168
+ previous: {
169
+ type: 'category',
170
+ label: 'S3 SubSubCategory',
171
+ },
172
+ next: {
173
+ type: 'doc',
174
+ id: 'doc7',
175
+ },
176
+ } as SidebarNavigation);
177
+ expect(getDocNavigation('doc7')).toMatchObject({
178
+ sidebarName: 'sidebar3',
179
+ previous: {
180
+ type: 'doc',
181
+ id: 'doc6',
182
+ },
183
+ next: undefined,
184
+ } as SidebarNavigation);
185
+ });
186
+
187
+ test('getCategoryGeneratedIndexNavigation', async () => {
188
+ expect(
189
+ getCategoryGeneratedIndexNavigation('/s3-subcategory-index-permalink'),
190
+ ).toMatchObject({
191
+ sidebarName: 'sidebar3',
192
+ previous: {
193
+ type: 'category',
194
+ label: 'S3 Category',
195
+ },
196
+ next: {
197
+ type: 'category',
198
+ label: 'S3 SubSubCategory',
199
+ },
200
+ } as SidebarNavigation);
201
+
202
+ expect(
203
+ getCategoryGeneratedIndexNavigation('/s3-subsubcategory-index-permalink'),
204
+ ).toMatchObject({
205
+ sidebarName: 'sidebar3',
206
+ previous: {
207
+ type: 'category',
208
+ label: 'S3 SubCategory',
209
+ },
210
+ next: {
211
+ type: 'doc',
212
+ id: 'doc6',
213
+ },
214
+ } as SidebarNavigation);
215
+ });
216
+
217
+ test('getCategoryGeneratedIndexList', async () => {
218
+ expect(getCategoryGeneratedIndexList()).toMatchObject([
219
+ {
220
+ type: 'category',
221
+ label: 'S3 SubCategory',
222
+ },
223
+ {
224
+ type: 'category',
225
+ label: 'S3 SubSubCategory',
226
+ },
227
+ ]);
228
+ });
229
+ });
230
+
231
+ describe('collectSidebarDocItems', () => {
232
+ test('can collect docs', async () => {
233
+ const sidebar: Sidebar = [
234
+ {
235
+ type: 'category',
236
+ collapsed: false,
237
+ collapsible: true,
238
+ label: 'Category1',
239
+ items: [
240
+ {
241
+ type: 'category',
242
+ collapsed: false,
243
+ collapsible: true,
244
+ label: 'Subcategory 1',
245
+ items: [{type: 'doc', id: 'doc1'}],
246
+ },
247
+ {
248
+ type: 'category',
249
+ collapsed: false,
250
+ collapsible: true,
251
+ label: 'Subcategory 2',
252
+ items: [
253
+ {type: 'doc', id: 'doc2'},
254
+ {
255
+ type: 'category',
256
+ collapsed: false,
257
+ collapsible: true,
258
+ label: 'Sub sub category 1',
259
+ items: [{type: 'doc', id: 'doc3'}],
260
+ },
261
+ ],
262
+ },
263
+ ],
264
+ },
265
+ {
266
+ type: 'category',
267
+ collapsed: false,
268
+ collapsible: true,
269
+ label: 'Category2',
270
+ items: [
271
+ {type: 'doc', id: 'doc4'},
272
+ {type: 'doc', id: 'doc5'},
273
+ ],
274
+ },
275
+ ];
276
+
277
+ expect(collectSidebarDocItems(sidebar).map((doc) => doc.id)).toEqual([
278
+ 'doc1',
279
+ 'doc2',
280
+ 'doc3',
281
+ 'doc4',
282
+ 'doc5',
283
+ ]);
284
+ });
285
+ });
286
+
287
+ describe('collectSidebarCategories', () => {
288
+ test('can collect categories', async () => {
289
+ const sidebar: Sidebar = [
290
+ {
291
+ type: 'category',
292
+ collapsed: false,
293
+ collapsible: true,
294
+ label: 'Category1',
295
+ items: [
296
+ {
297
+ type: 'category',
298
+ collapsed: false,
299
+ collapsible: true,
300
+ label: 'Subcategory 1',
301
+ items: [{type: 'doc', id: 'doc1'}],
302
+ },
303
+ {
304
+ type: 'category',
305
+ collapsed: false,
306
+ collapsible: true,
307
+ label: 'Subcategory 2',
308
+ items: [
309
+ {type: 'doc', id: 'doc2'},
310
+ {
311
+ type: 'category',
312
+ collapsed: false,
313
+ collapsible: true,
314
+ label: 'Sub sub category 1',
315
+ items: [{type: 'doc', id: 'doc3'}],
316
+ },
317
+ ],
318
+ },
319
+ ],
320
+ },
321
+ {
322
+ type: 'category',
323
+ collapsed: false,
324
+ collapsible: true,
325
+ label: 'Category2',
326
+ items: [
327
+ {type: 'doc', id: 'doc4'},
328
+ {type: 'doc', id: 'doc5'},
329
+ ],
330
+ },
331
+ ];
332
+
333
+ expect(
334
+ collectSidebarCategories(sidebar).map((category) => category.label),
335
+ ).toEqual([
336
+ 'Category1',
337
+ 'Subcategory 1',
338
+ 'Subcategory 2',
339
+ 'Sub sub category 1',
340
+ 'Category2',
341
+ ]);
342
+ });
343
+ });
344
+
345
+ describe('collectSidebarLinks', () => {
346
+ test('can collect links', async () => {
347
+ const sidebar: Sidebar = [
348
+ {
349
+ type: 'category',
350
+ collapsed: false,
351
+ collapsible: true,
352
+ label: 'Category1',
353
+ items: [
354
+ {
355
+ type: 'link',
356
+ href: 'https://google.com',
357
+ label: 'Google',
358
+ },
359
+ {
360
+ type: 'category',
361
+ collapsed: false,
362
+ collapsible: true,
363
+ label: 'Subcategory 2',
364
+ items: [
365
+ {
366
+ type: 'link',
367
+ href: 'https://facebook.com',
368
+ label: 'Facebook',
369
+ },
370
+ ],
371
+ },
372
+ ],
373
+ },
374
+ ];
375
+
376
+ expect(collectSidebarLinks(sidebar).map((link) => link.href)).toEqual([
377
+ 'https://google.com',
378
+ 'https://facebook.com',
379
+ ]);
380
+ });
381
+ });
382
+
383
+ describe('collectSidebarsDocIds', () => {
384
+ test('can collect sidebars doc items', async () => {
385
+ const sidebar1: Sidebar = [
386
+ {
387
+ type: 'category',
388
+ collapsed: false,
389
+ collapsible: true,
390
+ label: 'Category1',
391
+ items: [
392
+ {
393
+ type: 'category',
394
+ collapsed: false,
395
+ collapsible: true,
396
+ label: 'Subcategory 1',
397
+ items: [{type: 'doc', id: 'doc1'}],
398
+ },
399
+ {type: 'doc', id: 'doc2'},
400
+ ],
401
+ },
402
+ ];
403
+
404
+ const sidebar2: Sidebar = [
405
+ {
406
+ type: 'category',
407
+ collapsed: false,
408
+ collapsible: true,
409
+ label: 'Category2',
410
+ items: [
411
+ {type: 'doc', id: 'doc3'},
412
+ {type: 'doc', id: 'doc4'},
413
+ ],
414
+ },
415
+ ];
416
+
417
+ const sidebar3: Sidebar = [
418
+ {type: 'doc', id: 'doc5'},
419
+ {type: 'doc', id: 'doc6'},
420
+ ];
421
+ expect(collectSidebarsDocIds({sidebar1, sidebar2, sidebar3})).toEqual({
422
+ sidebar1: ['doc1', 'doc2'],
423
+ sidebar2: ['doc3', 'doc4'],
424
+ sidebar3: ['doc5', 'doc6'],
425
+ });
426
+ });
427
+ });
428
+
429
+ describe('transformSidebarItems', () => {
430
+ test('can transform sidebar items', async () => {
431
+ const sidebar: Sidebar = [
432
+ {
433
+ type: 'category',
434
+ collapsed: false,
435
+ collapsible: true,
436
+ label: 'Category1',
437
+ items: [
438
+ {
439
+ type: 'category',
440
+ collapsed: false,
441
+ collapsible: true,
442
+ label: 'Subcategory 1',
443
+ items: [{type: 'doc', id: 'doc1'}],
444
+ customProps: {fakeProp: false},
445
+ },
446
+ {
447
+ type: 'category',
448
+ collapsed: false,
449
+ collapsible: true,
450
+ label: 'Subcategory 2',
451
+ items: [
452
+ {type: 'doc', id: 'doc2'},
453
+ {
454
+ type: 'category',
455
+ collapsed: false,
456
+ collapsible: true,
457
+ label: 'Sub sub category 1',
458
+ items: [
459
+ {type: 'doc', id: 'doc3', customProps: {lorem: 'ipsum'}},
460
+ ],
461
+ },
462
+ ],
463
+ },
464
+ ],
465
+ },
466
+ {
467
+ type: 'category',
468
+ collapsed: false,
469
+ collapsible: true,
470
+ label: 'Category2',
471
+ items: [
472
+ {type: 'doc', id: 'doc4'},
473
+ {type: 'doc', id: 'doc5'},
474
+ ],
475
+ },
476
+ ];
477
+
478
+ expect(
479
+ transformSidebarItems(sidebar, (item) => {
480
+ if (item.type === 'category') {
481
+ return {...item, label: `MODIFIED LABEL: ${item.label}`};
482
+ }
483
+ return item;
484
+ }),
485
+ ).toEqual([
486
+ {
487
+ type: 'category',
488
+ collapsed: false,
489
+ collapsible: true,
490
+ label: 'MODIFIED LABEL: Category1',
491
+ items: [
492
+ {
493
+ type: 'category',
494
+ collapsed: false,
495
+ collapsible: true,
496
+ label: 'MODIFIED LABEL: Subcategory 1',
497
+ items: [{type: 'doc', id: 'doc1'}],
498
+ customProps: {fakeProp: false},
499
+ },
500
+ {
501
+ type: 'category',
502
+ collapsed: false,
503
+ collapsible: true,
504
+ label: 'MODIFIED LABEL: Subcategory 2',
505
+ items: [
506
+ {type: 'doc', id: 'doc2'},
507
+ {
508
+ type: 'category',
509
+ collapsed: false,
510
+ collapsible: true,
511
+ label: 'MODIFIED LABEL: Sub sub category 1',
512
+ items: [
513
+ {type: 'doc', id: 'doc3', customProps: {lorem: 'ipsum'}},
514
+ ],
515
+ },
516
+ ],
517
+ },
518
+ ],
519
+ },
520
+ {
521
+ type: 'category',
522
+ collapsed: false,
523
+ collapsible: true,
524
+ label: 'MODIFIED LABEL: Category2',
525
+ items: [
526
+ {type: 'doc', id: 'doc4'},
527
+ {type: 'doc', id: 'doc5'},
528
+ ],
529
+ },
530
+ ]);
531
+ });
532
+ });
533
+
534
+ describe('toDocNavigationLink', () => {
535
+ type TestDoc = Pick<DocMetadataBase, 'permalink' | 'title' | 'frontMatter'>;
536
+ function testDoc(data: TestDoc) {
537
+ return data as DocMetadataBase;
538
+ }
539
+
540
+ test('with no frontmatter', () => {
541
+ expect(
542
+ toDocNavigationLink(
543
+ testDoc({
544
+ title: 'Doc Title',
545
+ permalink: '/docPermalink',
546
+ frontMatter: {},
547
+ }),
548
+ ),
549
+ ).toEqual({
550
+ title: 'Doc Title',
551
+ permalink: '/docPermalink',
552
+ } as DocNavLink);
553
+ });
554
+
555
+ test('with pagination_label frontmatter', () => {
556
+ expect(
557
+ toDocNavigationLink(
558
+ testDoc({
559
+ title: 'Doc Title',
560
+ permalink: '/docPermalink',
561
+ frontMatter: {
562
+ pagination_label: 'pagination_label',
563
+ },
564
+ }),
565
+ ),
566
+ ).toEqual({
567
+ title: 'pagination_label',
568
+ permalink: '/docPermalink',
569
+ } as DocNavLink);
570
+ });
571
+
572
+ test('with sidebar_label frontmatter', () => {
573
+ expect(
574
+ toDocNavigationLink(
575
+ testDoc({
576
+ title: 'Doc Title',
577
+ permalink: '/docPermalink',
578
+ frontMatter: {
579
+ sidebar_label: 'sidebar_label',
580
+ },
581
+ }),
582
+ ),
583
+ ).toEqual({
584
+ title: 'sidebar_label',
585
+ permalink: '/docPermalink',
586
+ } as DocNavLink);
587
+ });
588
+
589
+ test('with pagination_label + sidebar_label frontmatter', () => {
590
+ expect(
591
+ toDocNavigationLink(
592
+ testDoc({
593
+ title: 'Doc Title',
594
+ permalink: '/docPermalink',
595
+ frontMatter: {
596
+ pagination_label: 'pagination_label',
597
+ sidebar_label: 'sidebar_label',
598
+ },
599
+ }),
600
+ ),
601
+ ).toEqual({
602
+ title: 'pagination_label',
603
+ permalink: '/docPermalink',
604
+ } as DocNavLink);
605
+ });
606
+ });
607
+
608
+ describe('toNavigationLink', () => {
609
+ type TestDoc = Pick<DocMetadataBase, 'permalink' | 'title'>;
610
+ function testDoc(data: TestDoc) {
611
+ return {...data, frontMatter: {}} as DocMetadataBase;
612
+ }
613
+
614
+ const docsById: Record<string, DocMetadataBase> = {
615
+ doc1: testDoc({
616
+ title: 'Doc 1',
617
+ permalink: '/doc1',
618
+ }),
619
+ doc2: testDoc({
620
+ title: 'Doc 1',
621
+ permalink: '/doc1',
622
+ }),
623
+ };
624
+
625
+ test('with doc items', () => {
626
+ expect(toNavigationLink({type: 'doc', id: 'doc1'}, docsById)).toEqual(
627
+ toDocNavigationLink(docsById.doc1),
628
+ );
629
+ expect(toNavigationLink({type: 'doc', id: 'doc2'}, docsById)).toEqual(
630
+ toDocNavigationLink(docsById.doc2),
631
+ );
632
+ expect(() =>
633
+ toNavigationLink({type: 'doc', id: 'doc3'}, docsById),
634
+ ).toThrowErrorMatchingInlineSnapshot(
635
+ `"Can't create navigation link: no doc found with id=doc3"`,
636
+ );
637
+ });
638
+
639
+ test('with category item and doc link', () => {
640
+ expect(
641
+ toNavigationLink(
642
+ {
643
+ type: 'category',
644
+ label: 'Category',
645
+ items: [],
646
+ link: {
647
+ type: 'doc',
648
+ id: 'doc1',
649
+ },
650
+ collapsed: true,
651
+ collapsible: true,
652
+ },
653
+ docsById,
654
+ ),
655
+ ).toEqual(toDocNavigationLink(docsById.doc1));
656
+ expect(() =>
657
+ toNavigationLink(
658
+ {
659
+ type: 'category',
660
+ label: 'Category',
661
+ items: [],
662
+ link: {
663
+ type: 'doc',
664
+ id: 'doc3',
665
+ },
666
+ collapsed: true,
667
+ collapsible: true,
668
+ },
669
+ docsById,
670
+ ),
671
+ ).toThrowErrorMatchingInlineSnapshot(
672
+ `"Can't create navigation link: no doc found with id=doc3"`,
673
+ );
674
+ });
675
+
676
+ test('with category item and generated-index link', () => {
677
+ expect(
678
+ toNavigationLink(
679
+ {
680
+ type: 'category',
681
+ label: 'Category',
682
+ items: [],
683
+ link: {
684
+ type: 'generated-index',
685
+ slug: 'slug',
686
+ permalink: 'generated-index-permalink',
687
+ },
688
+ collapsed: true,
689
+ collapsible: true,
690
+ },
691
+ docsById,
692
+ ),
693
+ ).toEqual({title: 'Category', permalink: 'generated-index-permalink'});
694
+ });
695
+ });