Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: shorthands for themes/plugins/presets configuration #5930

Merged
merged 28 commits into from
Dec 3, 2021
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f2ee7af
feat(plugins): Add aliases resolver for plugins
fsmaia Nov 11, 2021
513b9fa
refactor: add PluginConfigs to index plugins by type (plugin or theme)
fsmaia Nov 11, 2021
bf9d2af
refactor: add PluginConfigs to index plugins by type (plugin or theme)
fsmaia Nov 11, 2021
adb095e
chore: hide implementation detail from the variable name
fsmaia Nov 12, 2021
d3fa972
feat(presets): Add aliases resolver for presets
fsmaia Nov 16, 2021
e24b980
chore: use preset alias/shorthand in examples
fsmaia Nov 16, 2021
2bc2947
style: apply generic typeguard to plugin resolver
fsmaia Nov 16, 2021
83c49c3
chore: apply shorthands to create-docusaurus instead of examples
fsmaia Nov 17, 2021
6a8b6bf
chore: apply shorthands to create-docusaurus instead of examples
fsmaia Nov 17, 2021
aafc148
chore: apply shorthands to create-docusaurus instead of examples
fsmaia Nov 17, 2021
96080e8
chore: apply shorthands to create-docusaurus instead of examples
fsmaia Nov 17, 2021
75e9aa9
Merge branch 'main' into fsmaia/main
Josh-Cena Nov 17, 2021
6a73cb4
dogfood on website
Josh-Cena Nov 17, 2021
6cf84fb
fix: apply loadPluginModule when the plugin config is array
fsmaia Nov 17, 2021
b8cf8e3
refactor: return resolvedPath into NormalizedPluginImport
fsmaia Nov 17, 2021
c664a1f
Fix e2e
Josh-Cena Nov 27, 2021
01788bf
Merge branch 'main' into fsmaia/main
Josh-Cena Nov 27, 2021
424f9d8
Refactors
Josh-Cena Nov 27, 2021
64d976a
Fix types
Josh-Cena Nov 27, 2021
3f28a10
Total refactor
Josh-Cena Nov 27, 2021
d7787d3
Less diff
Josh-Cena Nov 27, 2021
0c37a2a
Doc writeup
Josh-Cena Nov 27, 2021
c6170f1
Merge branch 'main' into fsmaia/main
Josh-Cena Nov 29, 2021
eeff8e3
Fix scoped packages
Josh-Cena Nov 30, 2021
c59b20e
Merge branch 'main' into fsmaia/main
slorber Dec 3, 2021
5781c02
dogfood names
slorber Dec 3, 2021
0b6fb24
minor doc change
slorber Dec 3, 2021
ddd3385
add tests for resolveModuleName
slorber Dec 3, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/docusaurus-types/src/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,8 @@ export type ConfigureWebpackFn = Plugin<unknown>['configureWebpack'];
export type ConfigureWebpackFnMergeStrategy = Record<string, MergeStrategy>;
export type ConfigurePostCssFn = Plugin<unknown>['configurePostCss'];

export type PluginType = 'plugin' | 'theme';

export type PluginOptions = {id?: string} & Record<string, unknown>;

export type PluginConfig =
Expand All @@ -331,6 +333,10 @@ export type PluginConfig =
| [PluginModule, PluginOptions]
| PluginModule;

export type PluginConfigs = {
[type in PluginType]: PluginConfig[];
};

export interface ChunkRegistry {
loader: string;
modulePath: string;
Expand Down
5 changes: 3 additions & 2 deletions packages/docusaurus/src/commands/swizzle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,11 @@ export default async function swizzle(
danger?: boolean,
): Promise<void> {
const context = await loadContext(siteDir);
const pluginConfigs = loadPluginConfigs(context);
const rawPluginConfigs = loadPluginConfigs(context);
const pluginConfigs = [...rawPluginConfigs.plugin, ...rawPluginConfigs.theme];
const pluginNames = getPluginNames(pluginConfigs);
const plugins = initPlugins({
pluginConfigs,
pluginConfigs: rawPluginConfigs,
context,
});
const themeNames = pluginNames.filter((_, index) =>
Expand Down
25 changes: 15 additions & 10 deletions packages/docusaurus/src/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import {
HtmlTagObject,
LoadContext,
LoadedPlugin,
PluginConfig,
PluginConfigs,
Props,
} from '@docusaurus/types';
import {loadHtmlTags} from './html-tags';
Expand Down Expand Up @@ -127,16 +127,21 @@ export async function loadContext(
};
}

export function loadPluginConfigs(context: LoadContext): PluginConfig[] {
export function loadPluginConfigs(context: LoadContext): PluginConfigs {
const {plugins: presetPlugins, themes: presetThemes} = loadPresets(context);
const {siteConfig} = context;
return [
...presetPlugins,
...presetThemes,
// Site config should be the highest priority.
...(siteConfig.plugins || []),
...(siteConfig.themes || []),
];
return {
plugin: [
...presetPlugins,
// Site config should be the highest priority.
...(siteConfig.plugins || []),
],
theme: [
...presetThemes,
// Site config should be the highest priority.
...(siteConfig.themes || []),
],
};
}

// Make a fake plugin to:
Expand Down Expand Up @@ -255,7 +260,7 @@ export async function load(
codeTranslations,
} = context;
// Plugins.
const pluginConfigs: PluginConfig[] = loadPluginConfigs(context);
const pluginConfigs: PluginConfigs = loadPluginConfigs(context);
const {plugins, pluginsRouteConfigs, globalData, themeConfigTranslated} =
await loadPlugins({pluginConfigs, context});

Expand Down
4 changes: 2 additions & 2 deletions packages/docusaurus/src/server/plugins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import fs from 'fs-extra';
import path from 'path';
import {
LoadContext,
PluginConfig,
PluginConfigs,
PluginContentLoadedActions,
RouteConfig,
AllContent,
Expand Down Expand Up @@ -70,7 +70,7 @@ export async function loadPlugins({
pluginConfigs,
context,
}: {
pluginConfigs: PluginConfig[];
pluginConfigs: PluginConfigs;
context: LoadContext;
}): Promise<{
plugins: LoadedPlugin[];
Expand Down
119 changes: 87 additions & 32 deletions packages/docusaurus/src/server/plugins/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import {
PluginConfig,
PluginOptions,
InitializedPlugin,
PluginType,
PluginConfigs,
} from '@docusaurus/types';
import {DEFAULT_PLUGIN_ID} from '../../constants';
import {getPluginVersion} from '../versions';
Expand All @@ -34,15 +36,63 @@ type NormalizedPluginConfig = {
};
};

function loadPluginModule(
pluginModuleImport: string,
pluginRequire: NodeRequire,
): ImportedPluginModule | undefined {
try {
const pluginPath = pluginRequire.resolve(pluginModuleImport);
return importFresh<ImportedPluginModule>(pluginPath);
} catch (e) {
return undefined;
}
}

function resolvePluginModule(
pluginModuleImport: string,
pluginRequire: NodeRequire,
pluginType: PluginType,
): ImportedPluginModule {
const loadedPluginModules = [
`docusaurus-${pluginType}-${pluginModuleImport}`,
`@docusaurus/${pluginType}-${pluginModuleImport}`,
`@${pluginModuleImport}/docusaurus-${pluginType}`,
pluginModuleImport,
]
.map((pluginModuleImportAttempt) =>
loadPluginModule(pluginModuleImportAttempt, pluginRequire),
)
.filter(
(pluginModule) => pluginModule !== undefined,
) as ImportedPluginModule[];

if (loadedPluginModules.length === 0) {
throw new Error(
`Docusaurus was unable to resolve the ${pluginModuleImport} ${pluginType}. Make sure one of the following packages are installed:\n${loadedPluginModules.map(
(pluginModuleImportAttempt) => `* ${pluginModuleImportAttempt}\n`,
)}`,
);
}

return loadedPluginModules[0];
}

function normalizePluginConfig(
pluginConfig: PluginConfig,
pluginRequire: NodeRequire,
pluginType: PluginType,
): NormalizedPluginConfig {
// plugins: ['./plugin']
// plugins: ['./{plugin}']
// plugins: ['docusaurus-plugin-{plugin}']
// plugins: ['@docusaurus/plugin-{plugin}']
// plugins: ['@{company}/docusaurus-plugin']
if (typeof pluginConfig === 'string') {
const pluginModuleImport = pluginConfig;
const pluginPath = pluginRequire.resolve(pluginModuleImport);
const pluginModule = importFresh<ImportedPluginModule>(pluginPath);
const pluginModule = resolvePluginModule(
pluginModuleImport,
pluginRequire,
pluginType,
);
return {
plugin: pluginModule?.default ?? pluginModule,
options: {},
Expand Down Expand Up @@ -128,7 +178,7 @@ export default function initPlugins({
pluginConfigs,
context,
}: {
pluginConfigs: PluginConfig[];
pluginConfigs: PluginConfigs;
context: LoadContext;
}): InitializedPlugin[] {
// We need to resolve plugins from the perspective of the siteDir, since the siteDir's package.json
Expand Down Expand Up @@ -184,36 +234,41 @@ export default function initPlugins({
}
}

const plugins: InitializedPlugin[] = pluginConfigs
.map((pluginConfig) => {
if (!pluginConfig) {
return null;
}
const normalizedPluginConfig = normalizePluginConfig(
pluginConfig,
pluginRequire,
);
const pluginVersion: DocusaurusPluginVersionInformation =
doGetPluginVersion(normalizedPluginConfig);
const pluginOptions = doValidatePluginOptions(normalizedPluginConfig);

// Side-effect: merge the normalized theme config in the original one
context.siteConfig.themeConfig = {
...context.siteConfig.themeConfig,
...doValidateThemeConfig(normalizedPluginConfig),
};
const pluginTypes = ['theme', 'plugin'] as PluginType[];
fsmaia marked this conversation as resolved.
Show resolved Hide resolved

const pluginInstance = normalizedPluginConfig.plugin(
context,
pluginOptions,
);
const plugins: InitializedPlugin[] = pluginTypes
.flatMap((pluginType: PluginType) =>
pluginConfigs[pluginType].map((pluginConfig) => {
if (!pluginConfig) {
return null;
}
const normalizedPluginConfig = normalizePluginConfig(
pluginConfig,
pluginRequire,
pluginType,
);
const pluginVersion: DocusaurusPluginVersionInformation =
doGetPluginVersion(normalizedPluginConfig);
const pluginOptions = doValidatePluginOptions(normalizedPluginConfig);

return {
...pluginInstance,
options: pluginOptions,
version: pluginVersion,
};
})
// Side-effect: merge the normalized theme config in the original one
context.siteConfig.themeConfig = {
...context.siteConfig.themeConfig,
...doValidateThemeConfig(normalizedPluginConfig),
};

const pluginInstance = normalizedPluginConfig.plugin(
context,
pluginOptions,
);

return {
...pluginInstance,
options: pluginOptions,
version: pluginVersion,
};
}),
)
.filter(<T>(item: T): item is Exclude<T, null> => Boolean(item));

ensureUniquePluginInstanceIds(plugins);
Expand Down