refactor(migrate): change internal methods' parameter style (#6609)

This commit is contained in:
Joshua Chen 2022-02-05 13:14:53 +08:00 committed by GitHub
parent ed34a92957
commit 10c292cb05
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -12,7 +12,6 @@ import glob from 'glob';
import Color from 'color'; import Color from 'color';
import type { import type {
ClassicPresetEntries,
SidebarEntry, SidebarEntry,
SidebarEntries, SidebarEntries,
VersionOneConfig, VersionOneConfig,
@ -61,11 +60,10 @@ function sanitizedFileContent(
return sanitizedData; return sanitizedData;
} }
// TODO refactor this new type should be used everywhere instead of passing many
// params to each method
type MigrationContext = { type MigrationContext = {
siteDir: string; siteDir: string;
newDir: string; newDir: string;
deps: Record<string, string>;
shouldMigrateMdFiles: boolean; shouldMigrateMdFiles: boolean;
shouldMigratePages: boolean; shouldMigratePages: boolean;
v1Config: VersionOneConfig; v1Config: VersionOneConfig;
@ -81,9 +79,17 @@ export async function migrateDocusaurusProject(
async function createMigrationContext(): Promise<MigrationContext> { async function createMigrationContext(): Promise<MigrationContext> {
const v1Config = importFresh(`${siteDir}/siteConfig`) as VersionOneConfig; const v1Config = importFresh(`${siteDir}/siteConfig`) as VersionOneConfig;
logger.info('Starting migration from v1 to v2...'); logger.info('Starting migration from v1 to v2...');
const deps: Record<string, string> = {
'@docusaurus/core': DOCUSAURUS_VERSION,
'@docusaurus/preset-classic': DOCUSAURUS_VERSION,
clsx: '^1.1.1',
react: '^17.0.2',
'react-dom': '^17.0.2',
};
const partialMigrationContext = { const partialMigrationContext = {
siteDir, siteDir,
newDir, newDir,
deps,
shouldMigrateMdFiles, shouldMigrateMdFiles,
shouldMigratePages, shouldMigratePages,
v1Config, v1Config,
@ -96,23 +102,9 @@ export async function migrateDocusaurusProject(
} }
const migrationContext = await createMigrationContext(); const migrationContext = await createMigrationContext();
// TODO need refactor legacy, we pass migrationContext to all methods
const siteConfig = migrationContext.v1Config;
const config = migrationContext.v2Config;
const classicPreset = migrationContext.v2Config.presets[0][1];
const deps: Record<string, string> = {
'@docusaurus/core': DOCUSAURUS_VERSION,
'@docusaurus/preset-classic': DOCUSAURUS_VERSION,
clsx: '^1.1.1',
react: '^17.0.1',
'react-dom': '^17.0.1',
};
let errorCount = 0; let errorCount = 0;
try { try {
createClientRedirects(siteConfig, deps, config); createClientRedirects(migrationContext);
logger.success('Created client redirect for non clean URL'); logger.success('Created client redirect for non clean URL');
} catch (e) { } catch (e) {
logger.error(`Failed to creating redirects: ${e}`); logger.error(`Failed to creating redirects: ${e}`);
@ -120,7 +112,7 @@ export async function migrateDocusaurusProject(
} }
if (shouldMigratePages) { if (shouldMigratePages) {
try { try {
createPages(newDir, siteDir); createPages(migrationContext);
logger.success( logger.success(
'Created new doc pages (check migration page for more details)', 'Created new doc pages (check migration page for more details)',
); );
@ -130,7 +122,7 @@ export async function migrateDocusaurusProject(
} }
} else { } else {
try { try {
createDefaultLandingPage(newDir); createDefaultLandingPage(migrationContext);
logger.success( logger.success(
'Created landing page (check migration page for more details)', 'Created landing page (check migration page for more details)',
); );
@ -141,34 +133,34 @@ export async function migrateDocusaurusProject(
} }
try { try {
migrateStaticFiles(siteDir, newDir); migrateStaticFiles(migrationContext);
logger.success('Migrated static folder'); logger.success('Migrated static folder');
} catch (e) { } catch (e) {
logger.error(`Failed to copy static folder: ${e}`); logger.error(`Failed to copy static folder: ${e}`);
errorCount += 1; errorCount += 1;
} }
try { try {
migrateBlogFiles(siteDir, newDir, classicPreset, shouldMigrateMdFiles); migrateBlogFiles(migrationContext);
} catch (e) { } catch (e) {
logger.error(`Failed to migrate blogs: ${e}`); logger.error(`Failed to migrate blogs: ${e}`);
errorCount += 1; errorCount += 1;
} }
try { try {
handleVersioning(siteDir, siteConfig, newDir, config, shouldMigrateMdFiles); handleVersioning(migrationContext);
} catch (e) { } catch (e) {
logger.error(`Failed to migrate versioned docs: ${e}`); logger.error(`Failed to migrate versioned docs: ${e}`);
errorCount += 1; errorCount += 1;
} }
try { try {
migrateLatestDocs(siteDir, newDir, shouldMigrateMdFiles, classicPreset); migrateLatestDocs(migrationContext);
} catch (e) { } catch (e) {
logger.error(`Failed to migrate docs: ${e}`); logger.error(`Failed to migrate docs: ${e}`);
errorCount += 1; errorCount += 1;
} }
try { try {
migrateLatestSidebar(siteDir, newDir, classicPreset, siteConfig); migrateLatestSidebar(migrationContext);
} catch (e) { } catch (e) {
logger.error(`Failed to migrate sidebar: ${e}`); logger.error(`Failed to migrate sidebar: ${e}`);
errorCount += 1; errorCount += 1;
@ -177,7 +169,7 @@ export async function migrateDocusaurusProject(
try { try {
fs.writeFileSync( fs.writeFileSync(
path.join(newDir, 'docusaurus.config.js'), path.join(newDir, 'docusaurus.config.js'),
`module.exports=${JSON.stringify(config, null, 2)}`, `module.exports=${JSON.stringify(migrationContext.v2Config, null, 2)}`,
); );
logger.success( logger.success(
`Created a new config file with new navbar and footer config`, `Created a new config file with new navbar and footer config`,
@ -187,7 +179,7 @@ export async function migrateDocusaurusProject(
errorCount += 1; errorCount += 1;
} }
try { try {
await migratePackageFile(siteDir, deps, newDir); await migratePackageFile(migrationContext);
} catch (e) { } catch (e) {
logger.error( logger.error(
`Error occurred while creating package.json file for project: ${e}`, `Error occurred while creating package.json file for project: ${e}`,
@ -366,21 +358,18 @@ export function createConfigFile({
}; };
} }
function createClientRedirects( function createClientRedirects(context: MigrationContext): void {
siteConfig: VersionOneConfig, if (!context.v1Config.cleanUrl) {
deps: {[key: string]: string}, context.deps['@docusaurus/plugin-client-redirects'] = DOCUSAURUS_VERSION;
config: VersionTwoConfig, context.v2Config.plugins.push([
): void {
if (!siteConfig.cleanUrl) {
deps['@docusaurus/plugin-client-redirects'] = DOCUSAURUS_VERSION;
config.plugins.push([
'@docusaurus/plugin-client-redirects', '@docusaurus/plugin-client-redirects',
{fromExtensions: ['html']}, {fromExtensions: ['html']},
]); ]);
} }
} }
function createPages(newDir: string, siteDir: string): void { function createPages(context: MigrationContext): void {
const {newDir, siteDir} = context;
fs.mkdirpSync(path.join(newDir, 'src', 'pages')); fs.mkdirpSync(path.join(newDir, 'src', 'pages'));
if (fs.existsSync(path.join(siteDir, 'pages', 'en'))) { if (fs.existsSync(path.join(siteDir, 'pages', 'en'))) {
try { try {
@ -398,14 +387,14 @@ function createPages(newDir: string, siteDir: string): void {
}); });
} catch (e) { } catch (e) {
logger.error(`Unable to migrate Pages: ${e}`); logger.error(`Unable to migrate Pages: ${e}`);
createDefaultLandingPage(newDir); createDefaultLandingPage(context);
} }
} else { } else {
logger.info('Ignoring Pages'); logger.info('Ignoring Pages');
} }
} }
function createDefaultLandingPage(newDir: string) { function createDefaultLandingPage({newDir}: MigrationContext) {
const indexPage = `import Layout from "@theme/Layout"; const indexPage = `import Layout from "@theme/Layout";
import React from "react"; import React from "react";
@ -417,7 +406,7 @@ function createDefaultLandingPage(newDir: string) {
fs.writeFileSync(`${newDir}/src/pages/index.js`, indexPage); fs.writeFileSync(`${newDir}/src/pages/index.js`, indexPage);
} }
function migrateStaticFiles(siteDir: string, newDir: string): void { function migrateStaticFiles({siteDir, newDir}: MigrationContext): void {
if (fs.existsSync(path.join(siteDir, 'static'))) { if (fs.existsSync(path.join(siteDir, 'static'))) {
fs.copySync(path.join(siteDir, 'static'), path.join(newDir, 'static')); fs.copySync(path.join(siteDir, 'static'), path.join(newDir, 'static'));
} else { } else {
@ -425,33 +414,27 @@ function migrateStaticFiles(siteDir: string, newDir: string): void {
} }
} }
function migrateBlogFiles( function migrateBlogFiles(context: MigrationContext): void {
siteDir: string, const {siteDir, newDir, shouldMigrateMdFiles} = context;
newDir: string,
classicPreset: ClassicPresetEntries,
migrateMDFiles: boolean,
): void {
if (fs.existsSync(path.join(siteDir, 'blog'))) { if (fs.existsSync(path.join(siteDir, 'blog'))) {
fs.copySync(path.join(siteDir, 'blog'), path.join(newDir, 'blog')); fs.copySync(path.join(siteDir, 'blog'), path.join(newDir, 'blog'));
const files = walk(path.join(newDir, 'blog')); const files = walk(path.join(newDir, 'blog'));
files.forEach((file) => { files.forEach((file) => {
const content = String(fs.readFileSync(file)); const content = String(fs.readFileSync(file));
fs.writeFileSync(file, sanitizedFileContent(content, migrateMDFiles)); fs.writeFileSync(
file,
sanitizedFileContent(content, shouldMigrateMdFiles),
);
}); });
classicPreset.blog.path = 'blog'; context.v2Config.presets[0][1].blog.path = 'blog';
logger.success('Migrated blogs to version 2 with change in front matter'); logger.success('Migrated blogs to version 2 with change in front matter');
} else { } else {
logger.warn('Blog not found. Skipping migration for blog'); logger.warn('Blog not found. Skipping migration for blog');
} }
} }
function handleVersioning( function handleVersioning(context: MigrationContext): void {
siteDir: string, const {siteDir, newDir} = context;
siteConfig: VersionOneConfig,
newDir: string,
config: VersionTwoConfig,
migrateMDFiles: boolean,
): void {
if (fs.existsSync(path.join(siteDir, 'versions.json'))) { if (fs.existsSync(path.join(siteDir, 'versions.json'))) {
const loadedVersions: Array<string> = JSON.parse( const loadedVersions: Array<string> = JSON.parse(
String(fs.readFileSync(path.join(siteDir, 'versions.json'))), String(fs.readFileSync(path.join(siteDir, 'versions.json'))),
@ -462,16 +445,9 @@ function handleVersioning(
); );
const versions = loadedVersions.reverse(); const versions = loadedVersions.reverse();
const versionRegex = new RegExp(`version-(${versions.join('|')})-`, 'mgi'); const versionRegex = new RegExp(`version-(${versions.join('|')})-`, 'mgi');
migrateVersionedSidebar(siteDir, newDir, versions, versionRegex, config); migrateVersionedSidebar(context, versions, versionRegex);
fs.mkdirpSync(path.join(newDir, 'versioned_docs')); fs.mkdirpSync(path.join(newDir, 'versioned_docs'));
migrateVersionedDocs( migrateVersionedDocs(context, versions, versionRegex);
siteConfig,
versions,
siteDir,
newDir,
versionRegex,
migrateMDFiles,
);
logger.success`Migrated version docs and sidebar. The following doc versions have been created:name=${loadedVersions}`; logger.success`Migrated version docs and sidebar. The following doc versions have been created:name=${loadedVersions}`;
} else { } else {
logger.warn( logger.warn(
@ -481,17 +457,15 @@ function handleVersioning(
} }
function migrateVersionedDocs( function migrateVersionedDocs(
siteConfig: VersionOneConfig, context: MigrationContext,
versions: string[], versions: string[],
siteDir: string,
newDir: string,
versionRegex: RegExp, versionRegex: RegExp,
migrateMDFiles: boolean,
): void { ): void {
const {siteDir, newDir, shouldMigrateMdFiles} = context;
versions.reverse().forEach((version, index) => { versions.reverse().forEach((version, index) => {
if (index === 0) { if (index === 0) {
fs.copySync( fs.copySync(
path.join(siteDir, '..', siteConfig.customDocsPath || 'docs'), path.join(siteDir, '..', context.v1Config.customDocsPath || 'docs'),
path.join(newDir, 'versioned_docs', `version-${version}`), path.join(newDir, 'versioned_docs', `version-${version}`),
); );
fs.copySync( fs.copySync(
@ -523,19 +497,21 @@ function migrateVersionedDocs(
const content = fs.readFileSync(pathToFile).toString(); const content = fs.readFileSync(pathToFile).toString();
fs.writeFileSync( fs.writeFileSync(
pathToFile, pathToFile,
sanitizedFileContent(content.replace(versionRegex, ''), migrateMDFiles), sanitizedFileContent(
content.replace(versionRegex, ''),
shouldMigrateMdFiles,
),
); );
} }
}); });
} }
function migrateVersionedSidebar( function migrateVersionedSidebar(
siteDir: string, context: MigrationContext,
newDir: string,
versions: string[], versions: string[],
versionRegex: RegExp, versionRegex: RegExp,
config: VersionTwoConfig,
): void { ): void {
const {siteDir, newDir} = context;
if (fs.existsSync(path.join(siteDir, 'versioned_sidebars'))) { if (fs.existsSync(path.join(siteDir, 'versioned_sidebars'))) {
fs.mkdirpSync(path.join(newDir, 'versioned_sidebars')); fs.mkdirpSync(path.join(newDir, 'versioned_sidebars'));
const sidebars: { const sidebars: {
@ -623,7 +599,7 @@ function migrateVersionedSidebar(
JSON.stringify(newSidebar, null, 2), JSON.stringify(newSidebar, null, 2),
); );
}); });
config.themeConfig.navbar.items.push({ context.v2Config.themeConfig.navbar.items.push({
label: 'Version', label: 'Version',
to: 'docs', to: 'docs',
position: 'right', position: 'right',
@ -650,31 +626,27 @@ function migrateVersionedSidebar(
} }
} }
function migrateLatestSidebar( function migrateLatestSidebar(context: MigrationContext): void {
siteDir: string, const {siteDir, newDir} = context;
newDir: string,
classicPreset: ClassicPresetEntries,
siteConfig: VersionOneConfig,
): void {
try { try {
fs.copyFileSync( fs.copyFileSync(
path.join(siteDir, 'sidebars.json'), path.join(siteDir, 'sidebars.json'),
path.join(newDir, 'sidebars.json'), path.join(newDir, 'sidebars.json'),
); );
classicPreset.docs.sidebarPath = path.join( context.v2Config.presets[0][1].docs.sidebarPath = path.join(
path.relative(newDir, siteDir), path.relative(newDir, siteDir),
'sidebars.json', 'sidebars.json',
); );
} catch { } catch {
logger.warn('Sidebar not found. Skipping migration for sidebar'); logger.warn('Sidebar not found. Skipping migration for sidebar');
} }
if (siteConfig.colors) { if (context.v1Config.colors) {
const primaryColor = Color(siteConfig.colors.primaryColor); const primaryColor = Color(context.v1Config.colors.primaryColor);
const css = `:root{ const css = `:root{
--ifm-color-primary-lightest: ${primaryColor.darken(-0.3).hex()}; --ifm-color-primary-lightest: ${primaryColor.darken(-0.3).hex()};
--ifm-color-primary-lighter: ${primaryColor.darken(-0.15).hex()}; --ifm-color-primary-lighter: ${primaryColor.darken(-0.15).hex()};
--ifm-color-primary-light: ${primaryColor.darken(-0.1).hex()}; --ifm-color-primary-light: ${primaryColor.darken(-0.1).hex()};
--ifm-color-primary: ${siteConfig.colors.primaryColor}; --ifm-color-primary: ${primaryColor.hex()};
--ifm-color-primary-dark: ${primaryColor.darken(0.1).hex()}; --ifm-color-primary-dark: ${primaryColor.darken(0.1).hex()};
--ifm-color-primary-darker: ${primaryColor.darken(0.15).hex()}; --ifm-color-primary-darker: ${primaryColor.darken(0.15).hex()};
--ifm-color-primary-darkest: ${primaryColor.darken(0.3).hex()}; --ifm-color-primary-darkest: ${primaryColor.darken(0.3).hex()};
@ -682,7 +654,7 @@ function migrateLatestSidebar(
`; `;
fs.mkdirpSync(path.join(newDir, 'src', 'css')); fs.mkdirpSync(path.join(newDir, 'src', 'css'));
fs.writeFileSync(path.join(newDir, 'src', 'css', 'customTheme.css'), css); fs.writeFileSync(path.join(newDir, 'src', 'css', 'customTheme.css'), css);
classicPreset.theme.customCss = path.join( context.v2Config.presets[0][1].theme.customCss = path.join(
path.relative(newDir, path.join(siteDir, '..')), path.relative(newDir, path.join(siteDir, '..')),
'src', 'src',
'css', 'css',
@ -691,14 +663,10 @@ function migrateLatestSidebar(
} }
} }
function migrateLatestDocs( function migrateLatestDocs(context: MigrationContext): void {
siteDir: string, const {siteDir, newDir, shouldMigrateMdFiles} = context;
newDir: string,
migrateMDFiles: boolean,
classicPreset: ClassicPresetEntries,
): void {
if (fs.existsSync(path.join(siteDir, '..', 'docs'))) { if (fs.existsSync(path.join(siteDir, '..', 'docs'))) {
classicPreset.docs.path = path.join( context.v2Config.presets[0][1].docs.path = path.join(
path.relative(newDir, path.join(siteDir, '..')), path.relative(newDir, path.join(siteDir, '..')),
'docs', 'docs',
); );
@ -706,7 +674,10 @@ function migrateLatestDocs(
files.forEach((file) => { files.forEach((file) => {
if (path.extname(file) === '.md') { if (path.extname(file) === '.md') {
const content = fs.readFileSync(file).toString(); const content = fs.readFileSync(file).toString();
fs.writeFileSync(file, sanitizedFileContent(content, migrateMDFiles)); fs.writeFileSync(
file,
sanitizedFileContent(content, shouldMigrateMdFiles),
);
} }
}); });
logger.success('Migrated docs to version 2'); logger.success('Migrated docs to version 2');
@ -715,11 +686,8 @@ function migrateLatestDocs(
} }
} }
async function migratePackageFile( async function migratePackageFile(context: MigrationContext): Promise<void> {
siteDir: string, const {deps, siteDir, newDir} = context;
deps: {[key: string]: string},
newDir: string,
): Promise<void> {
const packageFile = importFresh(`${siteDir}/package.json`) as { const packageFile = importFresh(`${siteDir}/package.json`) as {
scripts?: Record<string, string>; scripts?: Record<string, string>;
dependencies?: Record<string, string>; dependencies?: Record<string, string>;