blob: 0e04a6c3aaf83359244e721ab7d38c3228efc2a2 [file] [log] [blame]
#!/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.
*/
require('@babel/register')({
babelrc: false,
only: [__dirname, `${process.cwd()}/core`],
plugins: [
require('./server/translate-plugin.js'),
require('@babel/plugin-proposal-class-properties').default,
require('@babel/plugin-proposal-object-rest-spread').default,
],
presets: [
require('@babel/preset-react').default,
require('@babel/preset-env').default,
],
});
const program = require('commander');
const chalk = require('chalk');
const glob = require('glob');
const fs = require('fs-extra');
const mkdirp = require('mkdirp');
const path = require('path');
const readMetadata = require('./server/readMetadata.js');
const utils = require('./server/utils.js');
const versionFallback = require('./server/versionFallback.js');
const metadataUtils = require('./server/metadataUtils.js');
const env = require('./server/env.js');
const CWD = process.cwd();
let versions;
if (fs.existsSync(`${CWD}/versions.json`)) {
versions = require(`${CWD}/versions.json`);
} else {
versions = [];
}
let version;
program
.arguments('<version>')
.action(ver => {
version = ver;
})
.parse(process.argv);
if (env.versioning.missingVersionsPage) {
env.versioning.printMissingVersionsPageError();
process.exit(1);
}
if (version.includes('/')) {
console.error(
`${chalk.red(
'Invalid version number specified! Do not include slash (/). Try something like: 1.0.0',
)}`,
);
process.exit(1);
}
if (typeof version === 'undefined') {
console.error(
`${chalk.yellow(
'No version number specified!',
)}\nPass the version you wish to create as an argument.\nEx: 1.0.0`,
);
process.exit(1);
}
if (versions.includes(version)) {
console.error(
`${chalk.yellow(
'This version already exists!',
)}\nSpecify a new version to create that does not already exist.`,
);
process.exit(1);
}
function makeHeader(metadata) {
let header = '---\n';
Object.keys(metadata).forEach(key => {
header += `${key}: ${metadata[key]}\n`;
});
header += '---\n';
return header;
}
function writeFileAndCreateFolder(file, content, encoding) {
mkdirp.sync(path.dirname(file));
fs.writeFileSync(file, content, encoding);
}
const versionFolder = `${CWD}/versioned_docs/version-${version}`;
mkdirp.sync(versionFolder);
// copy necessary files to new version, changing some of its metadata to reflect the versioning
const files = glob.sync(`${CWD}/../${readMetadata.getDocsPath()}/**`);
files.forEach(file => {
const ext = path.extname(file);
if (ext !== '.md' && ext !== '.markdown') {
return;
}
const res = metadataUtils.extractMetadata(fs.readFileSync(file, 'utf8'));
const metadata = res.metadata;
// Don't version any docs without any metadata whatsoever.
if (Object.keys(metadata).length === 0) {
return;
}
const rawContent = res.rawContent;
if (!metadata.id) {
metadata.id = path.basename(file, path.extname(file));
}
if (metadata.id.includes('/')) {
throw new Error('Document id cannot include "/".');
}
if (!metadata.title) {
metadata.title = metadata.id;
}
const docsDir = path.join(CWD, '../', readMetadata.getDocsPath());
const subDir = utils.getSubDir(file, docsDir);
const docId = subDir ? `${subDir}/${metadata.id}` : metadata.id;
// if (!versionFallback.diffLatestDoc(file, docId)) {
// return;
// }
metadata.original_id = metadata.id;
metadata.id = `version-${version}-${metadata.id}`;
const targetFile = subDir
? `${versionFolder}/${subDir}/${path.basename(file)}`
: `${versionFolder}/${path.basename(file)}`;
writeFileAndCreateFolder(
targetFile,
makeHeader(metadata) + rawContent,
'utf8',
);
});
// copy sidebar if necessary
// if (versionFallback.diffLatestSidebar()) {
mkdirp(`${CWD}/versioned_sidebars`);
const sidebar = JSON.parse(fs.readFileSync(`${CWD}/sidebars.json`, 'utf8'));
const versioned = {};
Object.keys(sidebar).forEach(sb => {
const versionSidebar = `version-${version}-${sb}`;
versioned[versionSidebar] = {};
const categories = sidebar[sb];
Object.keys(categories).forEach(category => {
versioned[versionSidebar][category] = [];
const categoryItems = categories[category];
categoryItems.forEach(categoryItem => {
let versionedCategoryItem = categoryItem;
if (typeof categoryItem === 'object') {
if (categoryItem.ids && categoryItem.ids.length > 0) {
versionedCategoryItem.ids = categoryItem.ids.map(
id => `version-${version}-${id}`,
);
}
} else if (typeof categoryItem === 'string') {
versionedCategoryItem = `version-${version}-${categoryItem}`;
}
versioned[versionSidebar][category].push(versionedCategoryItem);
});
});
});
fs.writeFileSync(
`${CWD}/versioned_sidebars/version-${version}-sidebars.json`,
`${JSON.stringify(versioned, null, 2)}\n`,
'utf8',
);
// }
// update versions.json file
versions.unshift(version);
fs.writeFileSync(
`${CWD}/versions.json`,
`${JSON.stringify(versions, null, 2)}\n`,
);
console.log(`${chalk.green(`Version ${version} created!\n`)}`);