Skip to content

Commit

Permalink
fix(v2): fix theme validation for prism field and add tests (#3210)
Browse files Browse the repository at this point in the history
* fix(v2): fix theme validation for prism field

* chore(v2): minor changes

* chore(v2): remove unused dependencies
  • Loading branch information
teikjun authored Aug 5, 2020
1 parent 0d7314a commit 8f0c00f
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 63 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,60 +27,139 @@ function testValidateThemeConfig(themeConfig) {
return validateThemeConfig({themeConfig, validate});
}

describe('color mode config', () => {
test('minimal config', () => {
const colorMode = {
switchConfig: {
darkIcon: '🌙',
describe('themeConfig', () => {
test('should accept valid theme config', () => {
const userConfig = {
prism: {
theme: require('prism-react-renderer/themes/github'),
darkTheme: require('prism-react-renderer/themes/dracula'),
defaultLanguage: 'javascript',
additionalLanguages: ['kotlin', 'java'],
},
announcementBar: {
id: 'supportus',
content: 'pls support',
backgroundColor: '#fff',
textColor: '#000',
},
image: 'img/docusaurus-soc.png',
navbar: {
hideOnScroll: true,
title: 'Docusaurus',
logo: {
alt: 'Docusaurus Logo',
src: 'img/docusaurus.svg',
srcDark: 'img/docusaurus_keytar.svg',
},
items: [
{
type: 'docsVersionDropdown',
position: 'left',
nextVersionLabel: '2.0.0-next',
},
{
to: 'docs/next/support',
label: 'Community',
position: 'left',
activeBaseRegex: `docs/next/(support|team|resources)`,
'aria-label': 'Community',
},
],
},
footer: {
style: 'dark',
links: [
{
title: 'Learn',
items: [
{
label: 'Introduction',
to: 'docs',
},
],
},
],
logo: {
alt: 'Facebook Open Source Logo',
src: 'img/oss_logo.png',
href: 'https://opensource.facebook.com',
},
copyright: `Copyright © ${new Date().getFullYear()} Facebook, Inc. Built with Docusaurus.`,
},
};
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
expect(testValidateThemeConfig(userConfig)).toEqual({
colorMode: DEFAULT_COLOR_MODE_CONFIG,
...userConfig,
});
});

test('max config', () => {
const colorMode = {
defaultMode: 'dark',
disableSwitch: false,
respectPrefersColorScheme: true,
switchConfig: {
darkIcon: '🌙',
darkIconStyle: {
marginTop: '1px',
marginLeft: '2px',
},
lightIcon: '☀️',
lightIconStyle: {
marginLeft: '1px',
},
test('should accept valid prism config', () => {
const prismConfig = {
prism: {
additionalLanguages: ['kotlin', 'java'],
},
};
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
expect(testValidateThemeConfig(prismConfig)).toEqual({
colorMode: DEFAULT_COLOR_MODE_CONFIG,
...prismConfig,
});
});

test('undefined config', () => {
const colorMode = undefined;
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
describe('color mode config', () => {
test('minimal config', () => {
const colorMode = {
switchConfig: {
darkIcon: '🌙',
},
};
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
});
});

test('max config', () => {
const colorMode = {
defaultMode: 'dark',
disableSwitch: false,
respectPrefersColorScheme: true,
switchConfig: {
darkIcon: '🌙',
darkIconStyle: {
marginTop: '1px',
marginLeft: '2px',
},
lightIcon: '☀️',
lightIconStyle: {
marginLeft: '1px',
},
},
};
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
});
});
});

test('empty config', () => {
const colorMode = {};
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
test('undefined config', () => {
const colorMode = undefined;
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
});
});
});

test('empty switch config', () => {
const colorMode = {
switchConfig: {},
};
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
test('empty config', () => {
const colorMode = {};
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
});
});

test('empty switch config', () => {
const colorMode = {
switchConfig: {},
};
expect(testValidateThemeConfig({colorMode})).toEqual({
colorMode: mergeDefault(colorMode),
});
});
});
});
12 changes: 12 additions & 0 deletions packages/docusaurus-theme-classic/src/validateThemeConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,18 @@ const ThemeConfigSchema = Joi.object({
}),
),
}),
prism: Joi.object({
theme: Joi.object({
plain: Joi.alternatives().try(Joi.array(), Joi.object()).required(),
styles: Joi.alternatives().try(Joi.array(), Joi.object()).required(),
}),
darkTheme: Joi.object({
plain: Joi.alternatives().try(Joi.array(), Joi.object()).required(),
styles: Joi.alternatives().try(Joi.array(), Joi.object()).required(),
}),
defaultLanguage: Joi.string(),
additionalLanguages: Joi.array().items(Joi.string()),
}).unknown(),
});

exports.validateThemeConfig = ({validate, themeConfig}) => {
Expand Down
4 changes: 0 additions & 4 deletions packages/docusaurus-theme-live-codeblock/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
},
"license": "MIT",
"dependencies": {
"@hapi/joi": "^17.1.1",
"@philpl/buble": "^0.19.7",
"clsx": "^1.1.1",
"parse-numeric-range": "^0.0.2",
Expand All @@ -22,8 +21,5 @@
},
"engines": {
"node": ">=10.15.1"
},
"devDependencies": {
"@types/hapi__joi": "^17.1.2"
}
}
19 changes: 0 additions & 19 deletions packages/docusaurus-theme-live-codeblock/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
*/

const path = require('path');
const Joi = require('@hapi/joi');

module.exports = function () {
return {
Expand All @@ -30,21 +29,3 @@ module.exports = function () {
},
};
};

const ThemeConfigSchema = Joi.object({
prism: Joi.object({
theme: Joi.object({
plain: Joi.alternatives().try(Joi.array(), Joi.object()).required(),
styles: Joi.alternatives().try(Joi.array(), Joi.object()).required(),
}),
darkTheme: Joi.object({
plain: Joi.alternatives().try(Joi.array(), Joi.object()).required(),
styles: Joi.alternatives().try(Joi.array(), Joi.object()).required(),
}),
defaultLanguage: Joi.string(),
}),
});

module.exports.validateThemeConfig = ({validate, themeConfig}) => {
return validate(ThemeConfigSchema, themeConfig);
};

0 comments on commit 8f0c00f

Please sign in to comment.