Skip to content

Commit 54c5e01

Browse files
Mark1626SimenB
authored andcommitted
feat: add binary to scaffold new runner (#17)
Fixes #10
1 parent 6e385ce commit 54c5e01

File tree

9 files changed

+1411
-986
lines changed

9 files changed

+1411
-986
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,18 @@ module.exports = ({ testPath }) => {
8888
};
8989
```
9090

91+
## Create runner from binary
92+
93+
```shell
94+
yarn create jest-runner my-runner
95+
96+
# Or with npm
97+
npm init jest-runner my-runner
98+
```
99+
100+
**Note:** You will have to update the package name in `package.json` of the
101+
generated runner
102+
91103
## Add your runner to Jest config
92104

93105
Once you have your Jest runner you can add it to your Jest config.

generator/config.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module.exports = {
2+
dirs: ['src'],
3+
createList: [
4+
{
5+
input: '_package.json',
6+
output: 'package.json',
7+
},
8+
{
9+
input: '_README.md',
10+
output: 'README.md',
11+
},
12+
{
13+
input: 'index.js',
14+
output: 'src/index.js',
15+
},
16+
{
17+
input: 'run.js',
18+
output: 'src/run.js',
19+
},
20+
],
21+
};

generator/fixtures/_README.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# generated-jest-runner
2+
3+
## Usage
4+
5+
### Install
6+
7+
Install `jest`_(it needs Jest 21+)_ and `generated-jest-runner`
8+
9+
```bash
10+
yarn add --dev jest generated-jest-runner
11+
12+
# or with NPM
13+
14+
npm install --save-dev jest generated-jest-runner
15+
```
16+
17+
## Add your runner to Jest config
18+
19+
Once you have your Jest runner you can add it to your Jest config.
20+
21+
In your `package.json`
22+
23+
```json
24+
{
25+
"jest": {
26+
"runner": "generated-jest-runner"
27+
}
28+
}
29+
```
30+
31+
Or in `jest.config.js`
32+
33+
```js
34+
module.exports = {
35+
runner: require.resolve('generated-jest-runner'),
36+
};
37+
```
38+
39+
### Run Jest
40+
41+
```bash
42+
yarn jest
43+
```

generator/fixtures/_package.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"name": "generated-jest-runner",
3+
"version": "1.0.0",
4+
"description": "A generated jest runner",
5+
"main": "src/index.js",
6+
"scripts": {
7+
"test": "jest"
8+
},
9+
"jest": {
10+
"runner": "./test/runner"
11+
},
12+
"dependencies": {
13+
"jest": "^24.6.0",
14+
"create-jest-runner": "^0.5.0"
15+
}
16+
}

generator/fixtures/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const { createJestRunner } = require('create-jest-runner');
2+
3+
module.exports = createJestRunner(require.resolve('./run'));

generator/fixtures/run.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const fs = require('fs');
2+
const { pass, fail } = require('create-jest-runner');
3+
4+
module.exports = ({ testPath }) => {
5+
const start = Date.now();
6+
const contents = fs.readFileSync(testPath, 'utf8');
7+
const end = Date.now();
8+
9+
if (contents.includes('⚔️🏃')) {
10+
return pass({ start, end, test: { path: testPath } });
11+
}
12+
const errorMessage = 'Company policies require ⚔️ 🏃 in every file';
13+
return fail({
14+
start,
15+
end,
16+
test: { path: testPath, errorMessage, title: 'Check for ⚔️ 🏃' },
17+
});
18+
};

generator/index.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/usr/bin/env node
2+
/* eslint-disable no-console */
3+
4+
const fs = require('fs');
5+
const path = require('path');
6+
const { blue, red, green, yellow, magenta } = require('chalk');
7+
const config = require('./config');
8+
9+
const createIfNotExists = folder => {
10+
if (!fs.existsSync(folder)) {
11+
console.log(`Creating new jest-runner in ${green(folder)}`);
12+
fs.mkdirSync(folder);
13+
} else {
14+
throw new Error('Folder already exists');
15+
}
16+
};
17+
18+
const scaffoldRunner = () => {
19+
try {
20+
const fixturesPath = path.resolve(__dirname, 'fixtures');
21+
let outputDirname;
22+
const projectName = process.argv[2];
23+
if (projectName) {
24+
outputDirname = path.resolve('.', projectName);
25+
createIfNotExists(outputDirname);
26+
} else {
27+
throw new Error('Project name not specified');
28+
}
29+
30+
config.dirs.forEach(item => {
31+
console.log(`Creating ${blue('directory')} ${magenta(item)}`);
32+
fs.mkdirSync(path.resolve(outputDirname, item));
33+
});
34+
35+
config.createList.forEach(file => {
36+
const filePath = path.resolve(outputDirname, file.output);
37+
const content = fs.readFileSync(path.resolve(fixturesPath, file.input));
38+
console.log(`Creating ${yellow('file')} ${magenta(file.output)}`);
39+
fs.writeFileSync(filePath, content);
40+
});
41+
console.log(green('Scaffolding successfull'));
42+
console.log(blue('Run cd npm/yarn install'));
43+
console.log(red('Update the package name package.json'));
44+
} catch (e) {
45+
console.log(`${red('Scaffolding failed')} ${e}`);
46+
}
47+
};
48+
49+
scaffoldRunner();
50+
51+
module.exports = {
52+
scaffoldRunner,
53+
};

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"format": "prettier --single-quote --trailing-comma all --write \"!(build)/**/*.js\""
2020
},
2121
"dependencies": {
22+
"chalk": "^2.4.2",
2223
"jest-worker": "^24.0.0",
2324
"throat": "^4.1.0"
2425
},
@@ -36,5 +37,8 @@
3637
"execa": "^1.0.0",
3738
"jest": "^24.0.0",
3839
"prettier": "^1.7.4"
40+
},
41+
"bin": {
42+
"create-jest-runner": "./generator/index.js"
3943
}
4044
}

0 commit comments

Comments
 (0)