1 | #!/usr/bin/env node
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | require('@babel/register')({
|
11 | babelrc: false,
|
12 | only: [__dirname, `${process.cwd()}/core`],
|
13 | plugins: [
|
14 | require('./server/translate-plugin.js'),
|
15 | require('@babel/plugin-proposal-class-properties').default,
|
16 | require('@babel/plugin-proposal-object-rest-spread').default,
|
17 | ],
|
18 | presets: [
|
19 | require('@babel/preset-react').default,
|
20 | require('@babel/preset-env').default,
|
21 | ],
|
22 | });
|
23 |
|
24 | const program = require('commander');
|
25 | const chalk = require('chalk');
|
26 | const glob = require('glob');
|
27 | const fs = require('fs-extra');
|
28 | const mkdirp = require('mkdirp');
|
29 | const path = require('path');
|
30 |
|
31 | const readMetadata = require('./server/readMetadata.js');
|
32 | const utils = require('./server/utils.js');
|
33 | const versionFallback = require('./server/versionFallback.js');
|
34 | const metadataUtils = require('./server/metadataUtils.js');
|
35 | const env = require('./server/env.js');
|
36 |
|
37 | const CWD = process.cwd();
|
38 | let versions;
|
39 | if (fs.existsSync(`${CWD}/versions.json`)) {
|
40 | versions = require(`${CWD}/versions.json`);
|
41 | } else {
|
42 | versions = [];
|
43 | }
|
44 |
|
45 | let version;
|
46 |
|
47 | program
|
48 | .arguments('<version>')
|
49 | .action(ver => {
|
50 | version = ver;
|
51 | })
|
52 | .parse(process.argv);
|
53 |
|
54 | if (env.versioning.missingVersionsPage) {
|
55 | env.versioning.printMissingVersionsPageError();
|
56 | process.exit(1);
|
57 | }
|
58 |
|
59 | if (version.includes('/')) {
|
60 | console.error(
|
61 | `${chalk.red(
|
62 | 'Invalid version number specified! Do not include slash (/). Try something like: 1.0.0',
|
63 | )}`,
|
64 | );
|
65 | process.exit(1);
|
66 | }
|
67 |
|
68 | if (typeof version === 'undefined') {
|
69 | console.error(
|
70 | `${chalk.yellow(
|
71 | 'No version number specified!',
|
72 | )}\nPass the version you wish to create as an argument.\nEx: 1.0.0`,
|
73 | );
|
74 | process.exit(1);
|
75 | }
|
76 |
|
77 | if (versions.includes(version)) {
|
78 | console.error(
|
79 | `${chalk.yellow(
|
80 | 'This version already exists!',
|
81 | )}\nSpecify a new version to create that does not already exist.`,
|
82 | );
|
83 | process.exit(1);
|
84 | }
|
85 |
|
86 | function makeHeader(metadata) {
|
87 | let header = '---\n';
|
88 | Object.keys(metadata).forEach(key => {
|
89 | header += `${key}: ${metadata[key]}\n`;
|
90 | });
|
91 | header += '---\n';
|
92 | return header;
|
93 | }
|
94 |
|
95 | function writeFileAndCreateFolder(file, content, encoding) {
|
96 | mkdirp.sync(path.dirname(file));
|
97 |
|
98 | fs.writeFileSync(file, content, encoding);
|
99 | }
|
100 |
|
101 | const versionFolder = `${CWD}/versioned_docs/version-${version}`;
|
102 |
|
103 | mkdirp.sync(versionFolder);
|
104 |
|
105 |
|
106 | const files = glob.sync(`${CWD}/../${readMetadata.getDocsPath()}/**`);
|
107 | files.forEach(file => {
|
108 | const ext = path.extname(file);
|
109 | if (ext !== '.md' && ext !== '.markdown') {
|
110 | return;
|
111 | }
|
112 |
|
113 | const res = metadataUtils.extractMetadata(fs.readFileSync(file, 'utf8'));
|
114 | const metadata = res.metadata;
|
115 |
|
116 | if (Object.keys(metadata).length === 0) {
|
117 | return;
|
118 | }
|
119 | const rawContent = res.rawContent;
|
120 | if (!metadata.id) {
|
121 | metadata.id = path.basename(file, path.extname(file));
|
122 | }
|
123 | if (metadata.id.includes('/')) {
|
124 | throw new Error('Document id cannot include "/".');
|
125 | }
|
126 | if (!metadata.title) {
|
127 | metadata.title = metadata.id;
|
128 | }
|
129 |
|
130 | const docsDir = path.join(CWD, '../', readMetadata.getDocsPath());
|
131 | const subDir = utils.getSubDir(file, docsDir);
|
132 | const docId = subDir ? `${subDir}/${metadata.id}` : metadata.id;
|
133 | if (!versionFallback.diffLatestDoc(file, docId)) {
|
134 | return;
|
135 | }
|
136 |
|
137 | metadata.original_id = metadata.id;
|
138 | metadata.id = `version-${version}-${metadata.id}`;
|
139 | const targetFile = subDir
|
140 | ? `${versionFolder}/${subDir}/${path.basename(file)}`
|
141 | : `${versionFolder}/${path.basename(file)}`;
|
142 |
|
143 | writeFileAndCreateFolder(
|
144 | targetFile,
|
145 | makeHeader(metadata) + rawContent,
|
146 | 'utf8',
|
147 | );
|
148 | });
|
149 |
|
150 |
|
151 | if (versionFallback.diffLatestSidebar()) {
|
152 | mkdirp(`${CWD}/versioned_sidebars`);
|
153 | const sidebar = JSON.parse(fs.readFileSync(`${CWD}/sidebars.json`, 'utf8'));
|
154 | const versioned = {};
|
155 |
|
156 | Object.keys(sidebar).forEach(sb => {
|
157 | const versionSidebar = `version-${version}-${sb}`;
|
158 | versioned[versionSidebar] = {};
|
159 |
|
160 | const categories = sidebar[sb];
|
161 | Object.keys(categories).forEach(category => {
|
162 | versioned[versionSidebar][category] = [];
|
163 |
|
164 | const categoryItems = categories[category];
|
165 | categoryItems.forEach(categoryItem => {
|
166 | let versionedCategoryItem = categoryItem;
|
167 | if (typeof categoryItem === 'object') {
|
168 | if (categoryItem.ids && categoryItem.ids.length > 0) {
|
169 | versionedCategoryItem.ids = categoryItem.ids.map(
|
170 | id => `version-${version}-${id}`,
|
171 | );
|
172 | }
|
173 | } else if (typeof categoryItem === 'string') {
|
174 | versionedCategoryItem = `version-${version}-${categoryItem}`;
|
175 | }
|
176 | versioned[versionSidebar][category].push(versionedCategoryItem);
|
177 | });
|
178 | });
|
179 | });
|
180 |
|
181 | fs.writeFileSync(
|
182 | `${CWD}/versioned_sidebars/version-${version}-sidebars.json`,
|
183 | `${JSON.stringify(versioned, null, 2)}\n`,
|
184 | 'utf8',
|
185 | );
|
186 | }
|
187 |
|
188 |
|
189 | versions.unshift(version);
|
190 | fs.writeFileSync(
|
191 | `${CWD}/versions.json`,
|
192 | `${JSON.stringify(versions, null, 2)}\n`,
|
193 | );
|
194 |
|
195 | console.log(`${chalk.green(`Version ${version} created!\n`)}`);
|