Skip to content

Commit

Permalink
feat(core): support docusaurus.config.cjs as default file name
Browse files Browse the repository at this point in the history
  • Loading branch information
Josh-Cena committed May 8, 2022
1 parent 87c7639 commit 5da38e4
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 21 deletions.
5 changes: 4 additions & 1 deletion packages/docusaurus-utils/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,11 @@ export const DEFAULT_BUILD_DIR_NAME = 'build';
/**
* Can be overridden with cli option `--config`. Code should generally use
* `context.siteConfigPath` instead (which is always absolute).
*
* This does not have extensions, so that we can substitute different ones
* when resolving the path.
*/
export const DEFAULT_CONFIG_FILE_NAME = 'docusaurus.config.js';
export const DEFAULT_CONFIG_FILE_NAME = 'docusaurus.config';

/** Can be absolute or relative to site directory. */
export const BABEL_CONFIG_FILE_NAME =
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,5 +1,54 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`loadSiteConfig website with .cjs siteConfig 1`] = `
{
"siteConfig": {
"baseUrl": "/",
"baseUrlIssueBanner": true,
"clientModules": [
"foo.js",
],
"customFields": {},
"favicon": "img/docusaurus.ico",
"i18n": {
"defaultLocale": "en",
"localeConfigs": {},
"locales": [
"en",
],
},
"noIndex": false,
"onBrokenLinks": "throw",
"onBrokenMarkdownLinks": "warn",
"onDuplicateRoutes": "warn",
"organizationName": "endiliey",
"plugins": [
[
"@docusaurus/plugin-content-docs",
{
"path": "../docs",
},
],
"@docusaurus/plugin-content-pages",
],
"presets": [],
"projectName": "hello",
"scripts": [],
"staticDirectories": [
"static",
],
"stylesheets": [],
"tagline": "Hello World",
"themeConfig": {},
"themes": [],
"title": "Hello",
"titleDelimiter": "|",
"url": "https://docusaurus.io",
},
"siteConfigPath": "<PROJECT_ROOT>/packages/docusaurus/src/server/__tests__/__fixtures__/simple-site/docusaurus.config.js",
}
`;

exports[`loadSiteConfig website with valid async config 1`] = `
{
"siteConfig": {
Expand Down
10 changes: 9 additions & 1 deletion packages/docusaurus/src/server/__tests__/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ describe('loadSiteConfig', () => {
expect(config).not.toEqual({});
});

it('website with .cjs siteConfig', async () => {
const config = await loadSiteConfig({
siteDir: path.join(__dirname, '__fixtures__', 'simple-site'),
});
expect(config).toMatchSnapshot();
expect(config).not.toEqual({});
});

it('website with valid config creator function', async () => {
const config = await loadSiteConfig({
siteDir,
Expand Down Expand Up @@ -65,7 +73,7 @@ describe('loadSiteConfig', () => {
customConfigFilePath: 'wrong.config.js',
}),
).rejects.toThrowErrorMatchingInlineSnapshot(`
"These field(s) ("useLessField",) are not recognized in docusaurus.config.js.
"These field(s) ("useLessField",) are not recognized in wrong.config.js.
If you still want these fields to be in your configuration, put them in the "customFields" field.
See https://docusaurus.io/docs/api/docusaurus-config/#customfields"
`);
Expand Down
20 changes: 12 additions & 8 deletions packages/docusaurus/src/server/__tests__/configValidation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ const baseConfig: DocusaurusConfig = {
url: 'https://mysite.com',
};

const normalizeConfig = (config) => validateConfig({...baseConfig, ...config});
const normalizeConfig = (config) =>
validateConfig({...baseConfig, ...config}, 'docusaurus.config.js');

describe('normalizeConfig', () => {
it('normalizes empty config', () => {
Expand Down Expand Up @@ -289,13 +290,16 @@ describe('normalizeConfig', () => {

it('throws error for required fields', () => {
expect(() =>
validateConfig({
invalidField: true,
presets: {},
stylesheets: {},
themes: {},
scripts: {},
}),
validateConfig(
{
invalidField: true,
presets: {},
stylesheets: {},
themes: {},
scripts: {},
},
'docusaurus.config.js',
),
).toThrowErrorMatchingSnapshot();
});
});
Expand Down
32 changes: 26 additions & 6 deletions packages/docusaurus/src/server/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,38 @@
import path from 'path';
import fs from 'fs-extra';
import importFresh from 'import-fresh';
import {DEFAULT_CONFIG_FILE_NAME} from '@docusaurus/utils';
import logger from '@docusaurus/logger';
import {DEFAULT_CONFIG_FILE_NAME, findAsyncSequential} from '@docusaurus/utils';
import type {LoadContext} from '@docusaurus/types';
import {validateConfig} from './configValidation';

async function findConfig(siteDir: string) {
// We could support .mjs, .ts, etc. in the future
const candidates = ['.js', 'cjs'].map(
(ext) => DEFAULT_CONFIG_FILE_NAME + ext,
);
const configPath = await findAsyncSequential(
candidates.map((file) => path.join(siteDir, file)),
fs.pathExists,
);
if (!configPath) {
logger.error('No config file found.');
logger.info`Expected one of:${candidates}You can provide a custom config path with the code=${'--config'} option.`;
throw new Error();
}
return configPath;
}

export async function loadSiteConfig({
siteDir,
customConfigFilePath,
}: {
siteDir: string;
customConfigFilePath?: string;
}): Promise<Pick<LoadContext, 'siteConfig' | 'siteConfigPath'>> {
const siteConfigPath = path.resolve(
siteDir,
customConfigFilePath ?? DEFAULT_CONFIG_FILE_NAME,
);
const siteConfigPath = customConfigFilePath
? path.resolve(siteDir, customConfigFilePath)
: await findConfig(siteDir);

if (!(await fs.pathExists(siteConfigPath))) {
throw new Error(`Config file at "${siteConfigPath}" not found.`);
Expand All @@ -35,6 +52,9 @@ export async function loadSiteConfig({
? await importedConfig()
: await importedConfig;

const siteConfig = validateConfig(loadedConfig);
const siteConfig = validateConfig(
loadedConfig,
path.relative(siteDir, siteConfigPath),
);
return {siteConfig, siteConfigPath};
}
8 changes: 3 additions & 5 deletions packages/docusaurus/src/server/configValidation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@
*/

import type {DocusaurusConfig, I18nConfig} from '@docusaurus/types';
import {
DEFAULT_CONFIG_FILE_NAME,
DEFAULT_STATIC_DIR_NAME,
} from '@docusaurus/utils';
import {DEFAULT_STATIC_DIR_NAME} from '@docusaurus/utils';
import {Joi, URISchema, printWarning} from '@docusaurus/utils-validation';

const DEFAULT_I18N_LOCALE = 'en';
Expand Down Expand Up @@ -239,6 +236,7 @@ export const ConfigSchema = Joi.object({
// TODO move to @docusaurus/utils-validation
export function validateConfig(
config: Partial<DocusaurusConfig>,
siteConfigPath: string,
): DocusaurusConfig {
const {error, warning, value} = ConfigSchema.validate(config, {
abortEarly: false,
Expand All @@ -261,7 +259,7 @@ export function validateConfig(
'',
);
formattedError = unknownFields
? `${formattedError}These field(s) (${unknownFields}) are not recognized in ${DEFAULT_CONFIG_FILE_NAME}.\nIf you still want these fields to be in your configuration, put them in the "customFields" field.\nSee https://docusaurus.io/docs/api/docusaurus-config/#customfields`
? `${formattedError}These field(s) (${unknownFields}) are not recognized in ${siteConfigPath}.\nIf you still want these fields to be in your configuration, put them in the "customFields" field.\nSee https://docusaurus.io/docs/api/docusaurus-config/#customfields`
: formattedError;
throw new Error(formattedError);
} else {
Expand Down

0 comments on commit 5da38e4

Please sign in to comment.