docusaurus/lib/version.js

140 lines
3.6 KiB
JavaScript
Raw Normal View History

2017-08-03 13:25:01 -04:00
#!/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.
2017-08-03 13:25:01 -04:00
*/
const glob = require('glob');
const fs = require('fs-extra');
const path = require('path');
const mkdirp = require('mkdirp');
const chalk = require('chalk');
const readMetadata = require('./server/readMetadata.js');
const versionFallback = require('./server/versionFallback.js');
2017-08-03 13:25:01 -04:00
const CWD = process.cwd();
let versions;
if (fs.existsSync(CWD + '/versions.json')) {
versions = require(CWD + '/versions.json');
} else {
versions = [];
}
2017-08-03 13:25:01 -04:00
let version;
const program = require('commander');
2017-08-03 13:25:01 -04:00
program
.arguments('<version>')
2017-08-03 13:25:01 -04:00
.action(ver => {
version = ver;
})
.parse(process.argv);
if (typeof version === 'undefined') {
2017-08-03 13:25:01 -04:00
console.error(
`${chalk.yellow(
'No version number specified!'
)}\nPass the version you wish to create as an argument.\nEx: 1.0.0`
2017-08-03 13:25:01 -04:00
);
process.exit(1);
}
if (versions.includes(version)) {
2017-08-03 13:25:01 -04:00
console.error(
`${chalk.yellow(
'This version already exists!'
)}\nSpecify a new version to create that does not already exist.`
2017-08-03 13:25:01 -04:00
);
process.exit(1);
}
function makeHeader(metadata) {
let header = '---\n';
2017-08-03 13:25:01 -04:00
Object.keys(metadata).forEach(key => {
header += key + ': ' + metadata[key] + '\n';
2017-08-03 13:25:01 -04:00
});
header += '---\n';
2017-08-03 13:25:01 -04:00
return header;
}
const versionFolder = CWD + '/versioned_docs/version-' + version;
2017-08-03 13:25:01 -04:00
mkdirp.sync(versionFolder);
2017-08-03 14:14:56 -04:00
// copy necessary files to new version, changing some of its metadata to reflect the versioning
let files = glob.sync(CWD + '/../' + readMetadata.getDocsPath() + '/*');
2017-08-03 13:25:01 -04:00
files.forEach(file => {
const ext = path.extname(file);
if (ext !== '.md' && ext !== '.markdown') {
2017-08-03 13:25:01 -04:00
return;
}
const res = readMetadata.extractMetadata(fs.readFileSync(file, 'utf8'));
2017-08-03 13:25:01 -04:00
let metadata = res.metadata;
// Don't version any docs without any metadata whatsoever.
if (Object.keys(metadata).length === 0) {
return;
}
2017-08-03 13:25:01 -04:00
let rawContent = res.rawContent;
if (!metadata.id) {
metadata.id = path.basename(file, path.extname(file));
}
if (metadata.id.includes('/')) {
2017-08-14 13:19:01 -04:00
throw new Error('Document id cannot include "/".');
}
if (!metadata.title) {
metadata.title = metadata.id;
2017-08-03 13:25:01 -04:00
}
if (!versionFallback.diffLatestDoc(file, metadata.id)) {
return;
}
metadata.original_id = metadata.id;
metadata.id = 'version-' + version + '-' + metadata.id;
2017-08-03 13:25:01 -04:00
const targetFile = versionFolder + '/' + path.basename(file);
fs.writeFileSync(targetFile, makeHeader(metadata) + rawContent, 'utf8');
2017-08-03 13:25:01 -04:00
});
2017-08-03 14:14:56 -04:00
// copy sidebar if necessary
2017-08-03 13:25:01 -04:00
if (versionFallback.diffLatestSidebar()) {
mkdirp(CWD + '/versioned_sidebars');
const sidebar = JSON.parse(fs.readFileSync(CWD + '/sidebars.json', 'utf8'));
2017-08-03 13:25:01 -04:00
const versioned = {};
Object.keys(sidebar).forEach(sb => {
const version_sb = 'version-' + version + '-' + sb;
2017-08-03 13:25:01 -04:00
versioned[version_sb] = {};
const categories = sidebar[sb];
Object.keys(categories).forEach(category => {
versioned[version_sb][category] = [];
const ids = categories[category];
ids.forEach((id, index) => {
versioned[version_sb][category].push('version-' + version + '-' + id);
2017-08-03 13:25:01 -04:00
});
});
});
fs.writeFileSync(
CWD + '/versioned_sidebars/version-' + version + '-sidebars.json',
JSON.stringify(versioned, null, 2) + '\n',
'utf8'
2017-08-03 13:25:01 -04:00
);
}
// update versions.json file
versions.unshift(version);
fs.writeFileSync(
CWD + '/versions.json',
JSON.stringify(versions, null, 2) + '\n'
);
2017-08-09 19:17:39 -04:00
console.log(`${chalk.green('Version ' + version + ' created!\n')}`);