@docusaurus/plugin-content-docs 2.0.0-beta.8bda3b2db → 2.0.0-beta.9

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 (117) hide show
  1. package/lib/.tsbuildinfo +1 -1
  2. package/lib/cli.d.ts +2 -2
  3. package/lib/cli.js +20 -24
  4. package/lib/client/docsClientUtils.d.ts +1 -4
  5. package/lib/client/docsClientUtils.js +12 -16
  6. package/lib/docFrontMatter.js +7 -3
  7. package/lib/docs.d.ts +4 -2
  8. package/lib/docs.js +77 -23
  9. package/lib/index.js +88 -94
  10. package/lib/lastUpdate.js +8 -8
  11. package/lib/markdown/index.d.ts +3 -6
  12. package/lib/markdown/index.js +3 -3
  13. package/lib/markdown/linkify.js +2 -2
  14. package/lib/options.d.ts +1 -1
  15. package/lib/options.js +39 -11
  16. package/lib/props.d.ts +7 -2
  17. package/lib/props.js +27 -4
  18. package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +3 -1
  19. package/lib/sidebars/generator.js +174 -0
  20. package/lib/sidebars/index.d.ts +14 -0
  21. package/lib/sidebars/index.js +64 -0
  22. package/lib/sidebars/normalization.d.ts +9 -0
  23. package/lib/sidebars/normalization.js +58 -0
  24. package/lib/sidebars/processor.d.ts +16 -0
  25. package/lib/sidebars/processor.js +70 -0
  26. package/lib/sidebars/types.d.ts +87 -0
  27. package/lib/sidebars/types.js +13 -0
  28. package/lib/sidebars/utils.d.ts +22 -0
  29. package/lib/sidebars/utils.js +101 -0
  30. package/lib/sidebars/validation.d.ts +8 -0
  31. package/lib/sidebars/validation.js +102 -0
  32. package/lib/slug.js +4 -4
  33. package/lib/tags.d.ts +8 -0
  34. package/lib/tags.js +22 -0
  35. package/lib/theme/hooks/useDocs.js +24 -21
  36. package/lib/translations.d.ts +1 -1
  37. package/lib/translations.js +13 -13
  38. package/lib/types.d.ts +35 -58
  39. package/lib/versions.d.ts +1 -1
  40. package/lib/versions.js +75 -22
  41. package/package.json +15 -14
  42. package/src/__tests__/__fixtures__/simple-site/docs/_partials/somePartial.md +3 -0
  43. package/src/__tests__/__fixtures__/simple-site/docs/_partials/subfolder/somePartial.md +3 -0
  44. package/src/__tests__/__fixtures__/simple-site/docs/_somePartial.md +3 -0
  45. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +5 -0
  46. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +1 -0
  47. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +2 -0
  48. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +2 -0
  49. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +2 -0
  50. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +2 -0
  51. package/src/__tests__/__fixtures__/simple-site/sidebars.json +15 -1
  52. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +6 -0
  53. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/_partials/somePartial.md +3 -0
  54. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/_partials/subfolder/somePartial.md +3 -0
  55. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/_somePartial.md +3 -0
  56. package/src/__tests__/__snapshots__/cli.test.ts.snap +33 -0
  57. package/src/__tests__/__snapshots__/docs.test.ts.snap +140 -0
  58. package/src/__tests__/__snapshots__/index.test.ts.snap +478 -60
  59. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -3
  60. package/src/__tests__/cli.test.ts +14 -10
  61. package/src/__tests__/docFrontMatter.test.ts +163 -48
  62. package/src/__tests__/docs.test.ts +167 -21
  63. package/src/__tests__/index.test.ts +74 -30
  64. package/src/__tests__/lastUpdate.test.ts +3 -2
  65. package/src/__tests__/options.test.ts +46 -3
  66. package/src/__tests__/props.test.ts +62 -0
  67. package/src/__tests__/translations.test.ts +0 -1
  68. package/src/__tests__/versions.test.ts +88 -60
  69. package/src/cli.ts +27 -30
  70. package/src/client/__tests__/docsClientUtils.test.ts +4 -5
  71. package/src/client/docsClientUtils.ts +6 -27
  72. package/src/docFrontMatter.ts +8 -3
  73. package/src/docs.ts +92 -9
  74. package/src/index.ts +114 -121
  75. package/src/lastUpdate.ts +10 -6
  76. package/src/markdown/index.ts +8 -12
  77. package/src/numberPrefix.ts +4 -2
  78. package/src/options.ts +47 -17
  79. package/src/plugin-content-docs.d.ts +121 -34
  80. package/src/props.ts +42 -6
  81. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -0
  82. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -0
  83. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -0
  84. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-category.js +0 -0
  85. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -0
  86. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-collapsed.json +0 -0
  87. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -0
  88. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -0
  89. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -0
  90. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -0
  91. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-link.json +0 -0
  92. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-unknown-type.json +0 -0
  93. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars-wrong-field.json +0 -0
  94. package/src/{__tests__ → sidebars/__tests__}/__fixtures__/sidebars/sidebars.json +0 -0
  95. package/src/{__tests__/__snapshots__/sidebars.test.ts.snap → sidebars/__tests__/__snapshots__/index.test.ts.snap} +21 -6
  96. package/src/{__tests__/sidebarItemsGenerator.test.ts → sidebars/__tests__/generator.test.ts} +29 -7
  97. package/src/sidebars/__tests__/index.test.ts +202 -0
  98. package/src/sidebars/__tests__/processor.test.ts +148 -0
  99. package/src/sidebars/__tests__/utils.test.ts +395 -0
  100. package/src/sidebars/generator.ts +253 -0
  101. package/src/sidebars/index.ts +84 -0
  102. package/src/sidebars/normalization.ts +88 -0
  103. package/src/sidebars/processor.ts +124 -0
  104. package/src/sidebars/types.ts +156 -0
  105. package/src/sidebars/utils.ts +146 -0
  106. package/src/sidebars/validation.ts +124 -0
  107. package/src/tags.ts +21 -0
  108. package/src/theme/hooks/useDocs.ts +5 -1
  109. package/src/translations.ts +26 -36
  110. package/src/types.ts +48 -99
  111. package/src/versions.ts +109 -17
  112. package/lib/sidebarItemsGenerator.js +0 -211
  113. package/lib/sidebars.d.ts +0 -43
  114. package/lib/sidebars.js +0 -319
  115. package/src/__tests__/sidebars.test.ts +0 -639
  116. package/src/sidebarItemsGenerator.ts +0 -307
  117. package/src/sidebars.ts +0 -506
@@ -151,7 +151,6 @@ Object {
151
151
  ],
152
152
  "isLast": true,
153
153
  "mainDocId": "",
154
- "permalinkToSidebar": Object {},
155
154
  "routePriority": undefined,
156
155
  "sidebarFilePath": "any",
157
156
  "sidebars": Object {
@@ -292,7 +291,6 @@ Object {
292
291
  ],
293
292
  "isLast": true,
294
293
  "mainDocId": "",
295
- "permalinkToSidebar": Object {},
296
294
  "routePriority": undefined,
297
295
  "sidebarFilePath": "any",
298
296
  "sidebars": Object {
@@ -433,7 +431,6 @@ Object {
433
431
  ],
434
432
  "isLast": true,
435
433
  "mainDocId": "",
436
- "permalinkToSidebar": Object {},
437
434
  "routePriority": undefined,
438
435
  "sidebarFilePath": "any",
439
436
  "sidebars": Object {
@@ -7,7 +7,7 @@
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,
@@ -21,9 +21,12 @@ const fixtureDir = path.join(__dirname, '__fixtures__');
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
  };
@@ -10,7 +10,7 @@ import {DocFrontMatter} from '../types';
10
10
  import escapeStringRegexp from 'escape-string-regexp';
11
11
 
12
12
  function testField(params: {
13
- fieldName: keyof DocFrontMatter;
13
+ prefix: string;
14
14
  validFrontMatters: DocFrontMatter[];
15
15
  convertibleFrontMatter?: [
16
16
  ConvertableFrontMatter: Record<string, unknown>,
@@ -21,40 +21,38 @@ function testField(params: {
21
21
  ErrorMessage: string,
22
22
  ][];
23
23
  }) {
24
- describe(`"${params.fieldName}" field`, () => {
25
- test('accept valid values', () => {
26
- params.validFrontMatters.forEach((frontMatter) => {
27
- expect(validateDocFrontMatter(frontMatter)).toEqual(frontMatter);
28
- });
24
+ test(`[${params.prefix}] accept valid values`, () => {
25
+ params.validFrontMatters.forEach((frontMatter) => {
26
+ expect(validateDocFrontMatter(frontMatter)).toEqual(frontMatter);
29
27
  });
28
+ });
30
29
 
31
- test('convert valid values', () => {
32
- params.convertibleFrontMatter?.forEach(
33
- ([convertibleFrontMatter, convertedFrontMatter]) => {
34
- expect(validateDocFrontMatter(convertibleFrontMatter)).toEqual(
35
- convertedFrontMatter,
36
- );
37
- },
38
- );
39
- });
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
+ });
40
39
 
41
- test('throw error for values', () => {
42
- params.invalidFrontMatters?.forEach(([frontMatter, message]) => {
43
- try {
44
- validateDocFrontMatter(frontMatter);
45
- fail(
46
- new Error(
47
- `Doc frontmatter is expected to be rejected, but was accepted successfully:\n ${JSON.stringify(
48
- frontMatter,
49
- null,
50
- 2,
51
- )}`,
52
- ),
53
- );
54
- } catch (e) {
55
- expect(e.message).toMatch(new RegExp(escapeStringRegexp(message)));
56
- }
57
- });
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
+ }
58
56
  });
59
57
  });
60
58
  }
@@ -73,7 +71,7 @@ describe('validateDocFrontMatter', () => {
73
71
 
74
72
  describe('validateDocFrontMatter id', () => {
75
73
  testField({
76
- fieldName: 'id',
74
+ prefix: 'id',
77
75
  validFrontMatters: [{id: '123'}, {id: 'unique_id'}],
78
76
  invalidFrontMatters: [[{id: ''}, 'is not allowed to be empty']],
79
77
  });
@@ -81,7 +79,7 @@ describe('validateDocFrontMatter id', () => {
81
79
 
82
80
  describe('validateDocFrontMatter title', () => {
83
81
  testField({
84
- fieldName: 'title',
82
+ prefix: 'title',
85
83
  validFrontMatters: [
86
84
  // See https://github.com/facebook/docusaurus/issues/4591#issuecomment-822372398
87
85
  {title: ''},
@@ -92,7 +90,7 @@ describe('validateDocFrontMatter title', () => {
92
90
 
93
91
  describe('validateDocFrontMatter hide_title', () => {
94
92
  testField({
95
- fieldName: 'hide_title',
93
+ prefix: 'hide_title',
96
94
  validFrontMatters: [{hide_title: true}, {hide_title: false}],
97
95
  convertibleFrontMatter: [
98
96
  [{hide_title: 'true'}, {hide_title: true}],
@@ -108,7 +106,7 @@ describe('validateDocFrontMatter hide_title', () => {
108
106
 
109
107
  describe('validateDocFrontMatter hide_table_of_contents', () => {
110
108
  testField({
111
- fieldName: 'hide_table_of_contents',
109
+ prefix: 'hide_table_of_contents',
112
110
  validFrontMatters: [
113
111
  {hide_table_of_contents: true},
114
112
  {hide_table_of_contents: false},
@@ -127,7 +125,7 @@ describe('validateDocFrontMatter hide_table_of_contents', () => {
127
125
 
128
126
  describe('validateDocFrontMatter keywords', () => {
129
127
  testField({
130
- fieldName: 'keywords',
128
+ prefix: 'keywords',
131
129
  validFrontMatters: [
132
130
  {keywords: ['hello']},
133
131
  {keywords: ['hello', 'world']},
@@ -144,21 +142,21 @@ describe('validateDocFrontMatter keywords', () => {
144
142
 
145
143
  describe('validateDocFrontMatter image', () => {
146
144
  testField({
147
- fieldName: 'image',
145
+ prefix: 'image',
148
146
  validFrontMatters: [
149
147
  {image: 'https://docusaurus.io/blog/image.png'},
150
148
  {image: '/absolute/image.png'},
151
149
  {image: '../relative/image.png'},
152
150
  ],
153
151
  invalidFrontMatters: [
154
- [{image: ''}, 'does not match any of the allowed types'],
152
+ [{image: ''}, '"image" does not look like a valid url (value=\'\')'],
155
153
  ],
156
154
  });
157
155
  });
158
156
 
159
157
  describe('validateDocFrontMatter description', () => {
160
158
  testField({
161
- fieldName: 'description',
159
+ prefix: 'description',
162
160
  validFrontMatters: [
163
161
  // See https://github.com/facebook/docusaurus/issues/4591#issuecomment-822372398
164
162
  {description: ''},
@@ -169,7 +167,7 @@ describe('validateDocFrontMatter description', () => {
169
167
 
170
168
  describe('validateDocFrontMatter slug', () => {
171
169
  testField({
172
- fieldName: 'slug',
170
+ prefix: 'slug',
173
171
  validFrontMatters: [
174
172
  {slug: '/'},
175
173
  {slug: 'slug'},
@@ -186,7 +184,7 @@ describe('validateDocFrontMatter slug', () => {
186
184
 
187
185
  describe('validateDocFrontMatter sidebar_label', () => {
188
186
  testField({
189
- fieldName: 'sidebar_label',
187
+ prefix: 'sidebar_label',
190
188
  validFrontMatters: [{sidebar_label: 'Awesome docs'}],
191
189
  invalidFrontMatters: [[{sidebar_label: ''}, 'is not allowed to be empty']],
192
190
  });
@@ -194,25 +192,25 @@ describe('validateDocFrontMatter sidebar_label', () => {
194
192
 
195
193
  describe('validateDocFrontMatter sidebar_position', () => {
196
194
  testField({
197
- fieldName: 'sidebar_position',
195
+ prefix: 'sidebar_position',
198
196
  validFrontMatters: [
197
+ {sidebar_position: -5},
198
+ {sidebar_position: -3.5},
199
199
  {sidebar_position: 0},
200
200
  {sidebar_position: 5},
201
201
  {sidebar_position: 3.5},
202
202
  ],
203
203
  convertibleFrontMatter: [
204
+ [{sidebar_position: '-1.5'}, {sidebar_position: -1.5}],
204
205
  [{sidebar_position: '1'}, {sidebar_position: 1}],
205
206
  [{sidebar_position: '1.5'}, {sidebar_position: 1.5}],
206
207
  ],
207
- invalidFrontMatters: [
208
- [{sidebar_position: -1}, 'must be greater than or equal to 0'],
209
- ],
210
208
  });
211
209
  });
212
210
 
213
211
  describe('validateDocFrontMatter custom_edit_url', () => {
214
212
  testField({
215
- fieldName: 'custom_edit_url',
213
+ prefix: 'custom_edit_url',
216
214
  validFrontMatters: [
217
215
  // See https://github.com/demisto/content-docs/pull/616#issuecomment-827087566
218
216
  {custom_edit_url: ''},
@@ -226,7 +224,7 @@ describe('validateDocFrontMatter custom_edit_url', () => {
226
224
 
227
225
  describe('validateDocFrontMatter parse_number_prefixes', () => {
228
226
  testField({
229
- fieldName: 'parse_number_prefixes',
227
+ prefix: 'parse_number_prefixes',
230
228
  validFrontMatters: [
231
229
  {parse_number_prefixes: true},
232
230
  {parse_number_prefixes: false},
@@ -242,3 +240,120 @@ describe('validateDocFrontMatter parse_number_prefixes', () => {
242
240
  ],
243
241
  });
244
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
+ });