Skip to content

Commit 998f1d1

Browse files
committed
refactor create for programmatic use
1 parent d8d542a commit 998f1d1

File tree

9 files changed

+160
-108
lines changed

9 files changed

+160
-108
lines changed

lib/cli.js

100644100755
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,14 @@ if (program.build) {
2424
var tutorial = program.args[0] || 'tutorial/tutorial.md';
2525
var output = 'coderoad.json';
2626
process.stdout.write(chalk_1.grey("building coderoad.json for " + tutorial + "..."));
27-
var built = build_1.default(tutorial, output);
28-
if (!built) {
27+
if (!build_1.default(tutorial, output)) {
2928
result_1.fail();
3029
}
3130
}
3231
else if (program.create) {
3332
var packageName = program.args[0];
34-
var created = create_1.default(packageName);
35-
if (!created) {
33+
process.stdout.write("Creating demo tutorial \"coderoad-" + packageName + "\"...");
34+
if (!create_1.default(packageName)) {
3635
result_1.fail();
3736
}
3837
}

lib/create/index.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
"use strict";
22
var validate_1 = require('./validate');
33
var write_demo_1 = require('./write-demo');
4-
var build_1 = require('../build/build');
4+
var chalk_1 = require('chalk');
5+
var build_1 = require('../build');
56
function create(name) {
6-
if (!validate_1.validatePackageName(name)) {
7-
return false;
8-
}
9-
process.stdout.write("Creating demo tutorial \"coderoad-" + name + "\"...");
107
return Promise.all([
8+
validate_1.validatePackageName(name),
119
write_demo_1.createPackageJson(name),
1210
write_demo_1.createTutorialMd()
1311
]).then(function () {
1412
build_1.default('tutorial/tutorial.md', 'coderoad.json');
1513
return true;
14+
}).catch(function (e) {
15+
switch (e.type) {
16+
case 'error':
17+
console.log(chalk_1.red(e.msg));
18+
break;
19+
case 'warning':
20+
console.log(chalk_1.yellow(e.msg));
21+
break;
22+
default:
23+
console.log(e);
24+
}
25+
return false;
1626
});
1727
}
1828
Object.defineProperty(exports, "__esModule", { value: true });

lib/create/validate.js

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
11
"use strict";
2-
var chalk_1 = require('chalk');
32
var validateNpm = require('validate-npm-package-name');
43
var lodash_kebabcase_1 = require('lodash.kebabcase');
54
function validatePackageName(name) {
6-
var validated = validateNpm(name);
7-
if (!validated.validForNewPackages || !validated.validForOldPackages) {
8-
if (validated.errors) {
9-
validated.errors.forEach(function (error) {
10-
console.log(chalk_1.red('\nPackage ' + error));
11-
});
5+
return new Promise(function (resolve, reject) {
6+
var validated = validateNpm(name);
7+
if (!validated.validForNewPackages || !validated.validForOldPackages) {
8+
if (validated.errors) {
9+
validated.errors.forEach(function (error) {
10+
throw {
11+
type: 'error',
12+
msg: '\nPackage ' + error,
13+
};
14+
});
15+
}
16+
if (validated.warnings) {
17+
validated.warnings.forEach(function (warning) {
18+
throw {
19+
type: 'warning',
20+
msg: '\nPackage ' + warning,
21+
};
22+
});
23+
}
24+
if (!validated.errors && !validated.warnings) {
25+
throw {
26+
type: 'error',
27+
msg: "\nInvalid package name. Try using kebab-case.\n > coderoad create " + lodash_kebabcase_1.default(name) + "\n"
28+
};
29+
}
1230
}
13-
if (validated.warnings) {
14-
validated.warnings.forEach(function (warning) {
15-
console.log(chalk_1.yellow('\nPackage ' + warning));
16-
});
17-
}
18-
if (!validated.errors && !validated.warnings) {
19-
console.log(chalk_1.red("\n Invalid package name. Try using kebab-case.\n > coderoad create " + lodash_kebabcase_1.default(name) + "\n "));
20-
}
21-
return false;
22-
}
23-
return true;
31+
resolve(true);
32+
});
2433
}
2534
exports.validatePackageName = validatePackageName;

lib/create/write-demo.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use strict";
22
var fs_1 = require('fs');
33
var path_1 = require('path');
4+
var sort_package_json_1 = require('sort-package-json');
45
var file_1 = require('../tools/file');
56
function createFile(pathToFile) {
67
if (!file_1.fileExists(pathToFile)) {
@@ -33,7 +34,7 @@ function createTutorialMd() {
3334
return new Promise(function (resolve, reject) {
3435
folders.forEach(function (folder) { return createFolder(folder); });
3536
files.forEach(function (file) { return createFile(file); });
36-
resolve();
37+
resolve(true);
3738
});
3839
}
3940
exports.createTutorialMd = createTutorialMd;
@@ -43,12 +44,12 @@ function createPackageJson(name) {
4344
var inputPath = path_1.join(__dirname, '..', '..', 'setup', 'package.json');
4445
var packageJson = JSON.parse(fs_1.readFileSync(inputPath, 'utf8'));
4546
packageJson.name = 'coderoad-' + name;
46-
var packageJsonString = JSON.stringify(packageJson, null, 2);
47+
var packageJsonString = sort_package_json_1.sortPackageJson(JSON.stringify(packageJson, null, 2));
4748
fs_1.writeFileSync('package.json', packageJsonString, 'utf8');
48-
resolve();
49+
resolve(true);
4950
}
5051
else {
51-
resolve();
52+
resolve(true);
5253
}
5354
});
5455
}

package.json

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,38 @@
11
{
2-
"name": "coderoad-cli",
3-
"version": "0.6.0",
4-
"description": "Command line interface for CodeRoad. Build project files.",
5-
"keywords": [
6-
"coderoad"
7-
],
8-
"directories": {
9-
"test": "test"
10-
},
11-
"scripts": {
12-
"test": "echo \"Error: no test specified\" && exit 1"
13-
},
14-
"author": "Shawn McKay <shawn.j.mckay@gmail.com>",
15-
"license": "ISC",
16-
"preferGlobal": true,
17-
"bin": {
18-
"coderoad": "lib/cli.js"
19-
},
20-
"files": [
21-
"setup",
22-
"lib",
23-
"package.json",
24-
"*.md"
25-
],
26-
"dependencies": {
27-
"chalk": "1.1.3",
28-
"commander": "2.9.0",
29-
"lodash.kebabcase": "4.0.1",
30-
"prompt": "1.0.0",
31-
"validate-npm-package-name": "2.2.2"
32-
},
33-
"devDependencies": {
34-
"chai": "3.5.0",
35-
"mocha": "2.5.3"
36-
}
2+
"name": "coderoad-cli",
3+
"version": "0.6.0",
4+
"description": "Command line interface for CodeRoad. Build project files.",
5+
"keywords": [
6+
"coderoad"
7+
],
8+
"directories": {
9+
"test": "test"
10+
},
11+
"scripts": {
12+
"test": "echo \"Error: no test specified\" && exit 1"
13+
},
14+
"author": "Shawn McKay <shawn.j.mckay@gmail.com>",
15+
"license": "ISC",
16+
"preferGlobal": true,
17+
"bin": {
18+
"coderoad": "lib/cli.js"
19+
},
20+
"files": [
21+
"setup",
22+
"lib",
23+
"package.json",
24+
"*.md"
25+
],
26+
"dependencies": {
27+
"chalk": "1.1.3",
28+
"commander": "2.9.0",
29+
"lodash.kebabcase": "4.0.1",
30+
"prompt": "1.0.0",
31+
"sort-package-json": "^1.4.0",
32+
"validate-npm-package-name": "2.2.2"
33+
},
34+
"devDependencies": {
35+
"chai": "3.5.0",
36+
"mocha": "2.5.3"
37+
}
3738
}

src/cli.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,14 @@ if (program.build) {
3030
const tutorial = program.args[0] || 'tutorial/tutorial.md';
3131
const output = 'coderoad.json';
3232
process.stdout.write(grey(`building coderoad.json for ${tutorial}...`));
33-
const built = build(tutorial, output);
34-
if (!built) {
33+
if (!build(tutorial, output)) {
3534
fail();
3635
}
3736

3837
} else if (program.create) {
3938
const packageName = program.args[0];
40-
const created = create(packageName);
41-
if (!created) {
39+
process.stdout.write(`Creating demo tutorial "coderoad-${packageName}"...`);
40+
if (!create(packageName)) {
4241
fail();
4342
}
4443

src/create/index.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
11
import {validatePackageName} from './validate';
22
import {createPackageJson, createTutorialMd} from './write-demo';
3-
import build from '../build/build';
3+
import {red, yellow} from 'chalk';
4+
import build from '../build';
45

56
export default function create(name: string): boolean | Promise<boolean> {
6-
// check
7-
if (!validatePackageName(name)) {
8-
return false;
9-
}
10-
11-
// continue
12-
process.stdout.write(`Creating demo tutorial "coderoad-${name}"...`);
137

148
// npm package
159
return Promise.all([
10+
validatePackageName(name),
1611
createPackageJson(name),
1712
createTutorialMd()
1813
]).then(() => {
1914
build('tutorial/tutorial.md', 'coderoad.json');
2015
return true;
16+
}).catch((e) => {
17+
18+
switch (e.type) {
19+
case 'error':
20+
console.log(red(e.msg));
21+
break;
22+
case 'warning':
23+
console.log(yellow(e.msg));
24+
break;
25+
default:
26+
console.log(e);
27+
}
28+
29+
// fail
30+
return false;
2131
});
2232
}

src/create/validate.ts

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
1-
import {red, yellow} from 'chalk';
21
import * as validateNpm from 'validate-npm-package-name';
32
import kebabCase from 'lodash.kebabcase';
43

5-
export function validatePackageName(name: string): boolean {
6-
let validated: Validated = validateNpm(name);
7-
if (!validated.validForNewPackages || !validated.validForOldPackages) {
8-
if (validated.errors) {
9-
validated.errors.forEach((error) => {
10-
console.log(red('\nPackage ' + error));
11-
});
4+
export function validatePackageName(name: string): Promise<boolean> {
5+
return new Promise((resolve, reject) => {
6+
let validated: Validated = validateNpm(name);
7+
if (!validated.validForNewPackages || !validated.validForOldPackages) {
8+
if (validated.errors) {
9+
validated.errors.forEach((error) => {
10+
throw {
11+
type: 'error',
12+
msg: '\nPackage ' + error,
13+
};
14+
});
15+
}
16+
if (validated.warnings) {
17+
validated.warnings.forEach((warning) => {
18+
throw {
19+
type: 'warning',
20+
msg: '\nPackage ' + warning,
21+
};
22+
});
23+
}
24+
if (!validated.errors && !validated.warnings) {
25+
throw {
26+
type: 'error',
27+
msg: `\nInvalid package name. Try using kebab-case.
28+
> coderoad create ${kebabCase(name)}\n`
29+
};
30+
}
1231
}
13-
if (validated.warnings) {
14-
validated.warnings.forEach((warning) => {
15-
console.log(yellow('\nPackage ' + warning));
16-
});
17-
}
18-
if (!validated.errors && !validated.warnings) {
19-
console.log(red(`
20-
Invalid package name. Try using kebab-case.
21-
> coderoad create ${kebabCase(name) }
22-
`));
23-
}
24-
return false;
25-
}
26-
return true;
32+
resolve(true);
33+
});
2734
}

src/create/write-demo.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {readFileSync, writeFileSync, mkdirSync} from 'fs';
22
import {join} from 'path';
3+
import {sortPackageJson} from 'sort-package-json'
34
import {fileExists} from '../tools/file';
45

56
function createFile(pathToFile: string): void {
@@ -33,25 +34,40 @@ const files = [
3334
join('tutorial', '02', '02.spec.js')
3435
];
3536

36-
export function createTutorialMd(): void {
37+
export function createTutorialMd(): Promise<boolean> {
3738
return new Promise((resolve, reject) => {
3839
folders.forEach((folder) => createFolder(folder));
3940
files.forEach((file) => createFile(file));
40-
resolve();
41+
resolve(true);
4142
});
4243
}
4344

44-
export function createPackageJson(name: string): void {
45+
export function createPackageJson(name: string): Promise<boolean> {
4546
return new Promise((resolve, reject) => {
4647
if (!fileExists('package.json')) {
47-
let inputPath: string = join(__dirname, '..', '..', 'setup', 'package.json');
48-
let packageJson: PackageJson = JSON.parse(readFileSync(inputPath, 'utf8'));
48+
49+
// read from existing package.json
50+
const inputPath: string = join(
51+
__dirname, '..', '..', 'setup', 'package.json'
52+
);
53+
54+
const packageJson: PackageJson = JSON.parse(
55+
readFileSync(inputPath, 'utf8')
56+
);
4957
packageJson.name = 'coderoad-' + name;
50-
let packageJsonString: string = JSON.stringify(packageJson, null, 2);
58+
59+
// sort package.json keys
60+
const packageJsonString: string = sortPackageJson(
61+
JSON.stringify(packageJson, null, 2)
62+
);
63+
5164
writeFileSync('package.json', packageJsonString, 'utf8');
52-
resolve();
65+
resolve(true);
5366
} else {
54-
resolve();
67+
// TODO: validate package.json
68+
69+
// already created
70+
resolve(true);
5571
}
5672
});
5773
}

0 commit comments

Comments
 (0)