mirror of
https://github.com/facebook/docusaurus.git
synced 2025-04-30 10:48:05 +02:00
270 lines
7.9 KiB
JavaScript
Executable file
270 lines
7.9 KiB
JavaScript
Executable file
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* 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 commander = require('commander');
|
|
const fs = require('fs-extra');
|
|
const glob = require('glob');
|
|
const path = require('path');
|
|
|
|
const CWD = process.cwd();
|
|
|
|
const toHex = (color) => {
|
|
const hex = color.toString(16);
|
|
return hex.length === 1 ? `0${hex}` : hex;
|
|
};
|
|
|
|
const colorScheme = () => {
|
|
let primaryColor = '#';
|
|
let secondaryColor = '#';
|
|
for (let i = 0; i < 3; i++) {
|
|
// 175 is our ceiling to prevent the color from being too bright
|
|
const color = Math.floor(Math.random() * 176);
|
|
const darkColor = Math.floor(color * 0.7);
|
|
primaryColor += toHex(color);
|
|
secondaryColor += toHex(darkColor);
|
|
}
|
|
return {primaryColor, secondaryColor};
|
|
};
|
|
|
|
let feature;
|
|
|
|
commander
|
|
.arguments('[feature]')
|
|
.action((feat) => {
|
|
feature = feat;
|
|
})
|
|
.parse(process.argv);
|
|
|
|
// add scripts to package.json file
|
|
if (fs.existsSync(`${CWD}/package.json`)) {
|
|
const packageContent = JSON.parse(
|
|
fs.readFileSync(`${CWD}/package.json`, 'utf8'),
|
|
);
|
|
if (!packageContent.scripts) {
|
|
packageContent.scripts = {};
|
|
}
|
|
packageContent.scripts.start = 'docusaurus-start';
|
|
packageContent.scripts.build = 'docusaurus-build';
|
|
packageContent.scripts['publish-gh-pages'] = 'docusaurus-publish';
|
|
packageContent.scripts.examples = 'docusaurus-examples';
|
|
packageContent.scripts['write-translations'] =
|
|
'docusaurus-write-translations';
|
|
packageContent.scripts.version = 'docusaurus-version';
|
|
packageContent.scripts['rename-version'] = 'docusaurus-rename-version';
|
|
fs.writeFileSync(
|
|
`${CWD}/package.json`,
|
|
`${JSON.stringify(packageContent, null, 2)}\n`,
|
|
);
|
|
console.log(
|
|
`${chalk.green('Wrote docusaurus scripts to package.json file.')}\n`,
|
|
);
|
|
}
|
|
|
|
const outerFolder = path.basename(path.dirname(CWD));
|
|
|
|
let docsCreatedInIntendedDirectory = true;
|
|
|
|
// handles cases where feature is "translations", "versions" or neither/not present
|
|
if (feature === 'translations') {
|
|
// copy files for translations
|
|
const folder = path.join(__dirname, '..', 'examples', 'translations');
|
|
if (fs.existsSync(`${CWD}/../crowdin.yaml`)) {
|
|
console.log(
|
|
`${chalk.yellow('crowdin.yaml already exists')} in ${chalk.yellow(
|
|
`${outerFolder}/`,
|
|
)}. Rename or remove the file to regenerate an example version.\n`,
|
|
);
|
|
} else {
|
|
fs.copySync(`${folder}/crowdin.yaml`, `${CWD}/../crowdin.yaml`);
|
|
}
|
|
const files = glob.sync(`${folder}/**/*`);
|
|
files.forEach((file) => {
|
|
if (fs.lstatSync(file).isDirectory()) {
|
|
return;
|
|
}
|
|
if (path.basename(file) === 'crowdin.yaml') {
|
|
return;
|
|
}
|
|
const filePath = path.resolve(file).split(path.resolve(folder))[1];
|
|
try {
|
|
fs.copySync(file, CWD + filePath, {
|
|
overwrite: false,
|
|
errorOnExist: true,
|
|
});
|
|
} catch (e) {
|
|
console.log(
|
|
`${chalk.yellow(
|
|
`${path.basename(filePath)} already exists`,
|
|
)} in ${chalk.yellow(
|
|
`website${filePath.split(path.basename(filePath))[0]}`,
|
|
)}. Rename or remove the file to regenerate an example version.\n`,
|
|
);
|
|
}
|
|
});
|
|
} else if (feature === 'versions') {
|
|
// copy files for versions
|
|
const folder = path.join(__dirname, '..', 'examples', 'versions');
|
|
const files = glob.sync(`${folder}/**/*`);
|
|
files.forEach((file) => {
|
|
if (fs.lstatSync(file).isDirectory()) {
|
|
return;
|
|
}
|
|
const filePath = path.resolve(file).split(path.resolve(folder))[1];
|
|
try {
|
|
fs.copySync(file, CWD + filePath, {
|
|
overwrite: false,
|
|
errorOnExist: true,
|
|
});
|
|
} catch (e) {
|
|
console.log(
|
|
`${chalk.yellow(
|
|
`${path.basename(filePath)} already exists`,
|
|
)} in ${chalk.yellow(
|
|
`website${filePath.split(path.basename(filePath))[0]}`,
|
|
)}. Rename or remove the file to regenerate an example version.\n`,
|
|
);
|
|
}
|
|
});
|
|
} else {
|
|
const folder = path.join(__dirname, '..', 'examples', 'basics');
|
|
// copy docs examples
|
|
let targetDocsDir = `${CWD}/../docs`;
|
|
if (fs.existsSync(targetDocsDir)) {
|
|
console.log(
|
|
`- ${chalk.green('docs')} already exists in ${chalk.blue(
|
|
outerFolder,
|
|
)}. Copying into ${CWD}/../docs-examples-from-docusaurus instead.`,
|
|
);
|
|
targetDocsDir = `${CWD}/../docs-examples-from-docusaurus`;
|
|
docsCreatedInIntendedDirectory = false;
|
|
}
|
|
|
|
fs.copySync(`${folder}/docs`, targetDocsDir);
|
|
|
|
// copy blog examples
|
|
if (fs.existsSync(`${CWD}/blog`)) {
|
|
console.log(
|
|
`- ${chalk.green('blog')} already exists in ${chalk.blue(
|
|
`${outerFolder}/website`,
|
|
)}.`,
|
|
);
|
|
} else {
|
|
fs.copySync(path.join(folder, 'blog'), path.join(CWD, 'blog'));
|
|
}
|
|
|
|
const copyFileToProjectFolder = (fileNameFrom, fileNameTo) => {
|
|
const copiedFileName = fileNameTo || fileNameFrom;
|
|
const src = path.join(folder, fileNameFrom);
|
|
const dest = path.join(CWD, '..', copiedFileName);
|
|
if (fs.existsSync(dest)) {
|
|
console.log(
|
|
`- ${chalk.green(copiedFileName)} already exists in ${chalk.blue(
|
|
outerFolder,
|
|
)}.`,
|
|
);
|
|
} else {
|
|
fs.copySync(src, dest);
|
|
}
|
|
};
|
|
|
|
// copy .gitignore file
|
|
copyFileToProjectFolder('gitignore', '.gitignore');
|
|
|
|
// copy Dockerfile file
|
|
copyFileToProjectFolder('Dockerfile');
|
|
|
|
// copy docker-compose.yml file
|
|
copyFileToProjectFolder('docker-compose.yml');
|
|
|
|
// copy .dockerignore file
|
|
copyFileToProjectFolder('dockerignore', '.dockerignore');
|
|
|
|
// copy other files
|
|
const files = glob.sync(`${folder}/**/*`);
|
|
const {primaryColor, secondaryColor} = colorScheme();
|
|
files.forEach((file) => {
|
|
if (fs.lstatSync(file).isDirectory()) {
|
|
return;
|
|
}
|
|
const containingFolder = path.basename(path.dirname(file));
|
|
if (
|
|
path.basename(file) === 'gitignore' ||
|
|
path.basename(file) === 'Dockerfile' ||
|
|
path.basename(file) === 'docker-compose.yml' ||
|
|
path.basename(file) === 'dockerignore' ||
|
|
containingFolder === 'blog' ||
|
|
containingFolder === 'docs'
|
|
) {
|
|
return;
|
|
}
|
|
const filePath = path.resolve(file).split(path.resolve(folder))[1];
|
|
if (
|
|
path.basename(file) === 'siteConfig.js' &&
|
|
!fs.existsSync(CWD + filePath)
|
|
) {
|
|
const siteConfig = fs
|
|
.readFileSync(file, 'utf8')
|
|
.replace('{{primaryColor}}', primaryColor)
|
|
.replace('{{secondaryColor}}', secondaryColor);
|
|
fs.writeFileSync(CWD + filePath, siteConfig);
|
|
} else {
|
|
try {
|
|
fs.copySync(file, CWD + filePath, {
|
|
overwrite: false,
|
|
errorOnExist: true,
|
|
});
|
|
} catch (e) {
|
|
console.log(
|
|
`- ${chalk.green(
|
|
`${path.basename(filePath)}`,
|
|
)} already exists in ${chalk.blue(
|
|
`${outerFolder}/website${
|
|
filePath.split(path.basename(filePath))[0]
|
|
}`,
|
|
)}.`,
|
|
);
|
|
}
|
|
}
|
|
});
|
|
|
|
const svgs = glob.sync(`${CWD}/static/img/**/*.svg`);
|
|
svgs.forEach((file) => {
|
|
// Replace primary colors of SVGs.
|
|
const newImage = fs
|
|
.readFileSync(file, 'utf8')
|
|
.replace(/{{primaryColor}}/g, primaryColor);
|
|
fs.writeFileSync(file, newImage);
|
|
});
|
|
|
|
try {
|
|
const tree = require('tree-node-cli');
|
|
const dirString = tree(path.join(CWD, '..'), {
|
|
exclude: [
|
|
/node_modules/, // npm
|
|
/vendor/, // composer
|
|
],
|
|
});
|
|
console.log(dirString);
|
|
} catch (error) {
|
|
console.warn(`Error printing directory: ${error}`);
|
|
}
|
|
}
|
|
|
|
if (!docsCreatedInIntendedDirectory) {
|
|
console.log(
|
|
`The ${chalk.yellow(
|
|
`${outerFolder}/docs`,
|
|
)} directory was not created because it already exists. ` +
|
|
`Please manually convert the contents into a Docusaurus-compatible format ` +
|
|
`by referring to the examples from ${chalk.yellow(
|
|
`${outerFolder}/docs-examples-from-docusaurus`,
|
|
)}.\n`,
|
|
);
|
|
}
|