-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathcreate-rule.js
executable file
·69 lines (60 loc) · 2.26 KB
/
create-rule.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env node --harmony
const path = require('path');
const fs = require('fs');
const { exec } = require('child_process');
const argv = require('minimist')(process.argv.slice(2));
const jscodeshiftJSON = require('jscodeshift/package.json');
const ruleBoilerplateGenerator = require('./boilerplate/rule');
const testBoilerplateGenerator = require('./boilerplate/test');
const docBoilerplateGenerator = require('./boilerplate/doc');
const ruleName = argv._[0];
const author = argv.author || '$AUTHOR';
const description = argv.description || '$DESCRIPTION';
const rulePath = path.resolve(`src/rules/${ruleName}.js`);
const testPath = path.resolve(`__tests__/src/rules/${ruleName}-test.js`);
const docsPath = path.resolve(`docs/rules/${ruleName}.md`);
const readmePath = path.resolve(`README.md`);
const jscodeshiftMain = jscodeshiftJSON.main;
const jscodeshiftPath = require.resolve('jscodeshift');
const jscodeshiftRoot = jscodeshiftPath.slice(
0,
jscodeshiftPath.indexOf(jscodeshiftMain)
);
// Validate
if (!ruleName) {
throw new Error('Rule name is required');
} else if (fs.existsSync(rulePath)) {
throw new Error('Rule already exists!');
}
// Generate file boilerplate
const ruleBoilerplate = ruleBoilerplateGenerator(author, description);
const testBoilerplate = testBoilerplateGenerator(ruleName, author, description);
const docBoilerplate = docBoilerplateGenerator(ruleName);
// Create new files
fs.writeFileSync(rulePath, ruleBoilerplate);
fs.writeFileSync(testPath, testBoilerplate);
fs.writeFileSync(docsPath, docBoilerplate);
// Add the rule to the index
exec(
[
path.join(jscodeshiftRoot, jscodeshiftJSON.bin.jscodeshift),
'./src/index.js',
'-t ./scripts/addRuleToIndex.js',
'--extensions js',
'--parser flow',
`--ruleName=${ruleName}`,
`--rulePath=${rulePath}`,
].join(' '),
(error) => {
if (error) {
console.error(`exec error: ${error}`); // eslint-disable-line no-console
}
}
);
// Add the rule to README.md
const readme = fs.readFileSync(readmePath);
const lines = readme.toString().split('\n');
const index = lines.findIndex((line) => line === '### Rule Options') - 1;
const newRule = `- [${ruleName}](docs/rules/${ruleName}.md): ${description}`;
lines.splice(index, 0, newRule);
fs.writeFileSync(readmePath, lines.join('\n'));