docusaurus/packages/docusaurus-1.x/lib/rename-version.js
Endilie Yacop Sucipto 1f91d19a8c
chore: move to monorepo (#1297)
* chore: move to monorepo

* lint all js file

* simplify circleCI

* fix failing tests

* fix tests due to folder rename

* fix test since v1 website is renamed
2019-03-23 14:21:36 +07:00

131 lines
4 KiB
JavaScript

#!/usr/bin/env node
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const chalk = require('chalk');
const program = require('commander');
const escapeStringRegexp = require('escape-string-regexp');
const fs = require('fs');
const glob = require('glob');
const path = require('path');
const metadataUtils = require('./server/metadataUtils.js');
const CWD = process.cwd();
// generate a doc header from metadata
function makeHeader(metadata) {
let header = '---\n';
Object.keys(metadata).forEach(key => {
header += `${key}: ${metadata[key]}\n`;
});
header += '---\n';
return header;
}
let currentVersion;
let newVersion;
program
.arguments('<version_name> <new_version_name>')
.action((ver1, ver2) => {
currentVersion = ver1;
newVersion = ver2;
})
.parse(process.argv);
// require user to input two command line arguments, current version to be
// renamed, and new version name
if (
typeof currentVersion === 'undefined' ||
typeof newVersion === 'undefined'
) {
console.error(
`${chalk.yellow(
'Version numbers are not properly specified!',
)}\nSpecify as command line arguments: the current version you wish to rename, then the version number you want to rename it to. `,
);
process.exit(1);
}
// error if no versions currently exist
if (!fs.existsSync(`${CWD}/versions.json`)) {
console.error(
`${chalk.yellow(
'No versions found!',
)}\nNo versions.json file currently exists. Use the \`versions\` script if you wish to create new versions.`,
);
process.exit(1);
}
const versions = JSON.parse(fs.readFileSync(`${CWD}/versions.json`, 'utf8'));
const versionIndex = versions.indexOf(currentVersion);
// error if current specified version does not exist
if (versionIndex < 0) {
console.error(
`${chalk.yellow(
`Version ${currentVersion} does not currently exist!`,
)}\n Version ${currentVersion} is not in the versions.json file. You can only rename existing versions.`,
);
process.exit(1);
}
// replace old version with new version in versions.json file
versions[versionIndex] = newVersion;
fs.writeFileSync(
`${CWD}/versions.json`,
`${JSON.stringify(versions, null, 2)}\n`,
);
// if folder of docs for this version exists, rename folder and rewrite doc
// headers to use new version
if (fs.existsSync(`${CWD}/versioned_docs/version-${currentVersion}`)) {
fs.renameSync(
`${CWD}/versioned_docs/version-${currentVersion}`,
`${CWD}/versioned_docs/version-${newVersion}`,
);
const files = glob.sync(`${CWD}/versioned_docs/version-${newVersion}/*`);
files.forEach(file => {
const extension = path.extname(file);
if (extension !== '.md' && extension !== '.markdown') {
return;
}
const res = metadataUtils.extractMetadata(fs.readFileSync(file, 'utf8'));
const metadata = res.metadata;
const rawContent = res.rawContent;
if (!metadata.id) {
return;
}
metadata.id = metadata.id.replace(
`version-${currentVersion}-`,
`version-${newVersion}-`,
);
fs.writeFileSync(file, makeHeader(metadata) + rawContent);
});
}
// if sidebar file exists for this version, rename sidebar file and rewrite
// doc ids in the file
const currentSidebarFile = `${CWD}/versioned_sidebars/version-${currentVersion}-sidebars.json`;
const newSidebarFile = `${CWD}/versioned_sidebars/version-${newVersion}-sidebars.json`;
if (fs.existsSync(currentSidebarFile)) {
fs.renameSync(currentSidebarFile, newSidebarFile);
let sidebarContent = fs.readFileSync(newSidebarFile, 'utf8');
sidebarContent = sidebarContent.replace(
new RegExp(`version-${escapeStringRegexp(currentVersion)}-`, 'g'),
`version-${newVersion}-`,
);
fs.writeFileSync(newSidebarFile, sidebarContent);
}
console.log(
`${chalk.green('Successfully renamed version ')}${chalk.yellow(
currentVersion,
)}${chalk.green(' to version ')}${chalk.yellow(newVersion)}\n`,
);