Skip to content

Commit 2eb838d

Browse files
committed
setup checks, npm version >= 3
1 parent 5dcdd0a commit 2eb838d

24 files changed

+393
-93
lines changed

lib/atom/main.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ var render_1 = require('../components/render');
33
var polyfills_1 = require('../services/polyfills');
44
var subscriptions_1 = require('./subscriptions');
55
var editor_1 = require('./editor');
6-
var setup_checks_1 = require('../services/setup-checks');
6+
var setup_1 = require('../services/setup/setup');
77
var Main = (function () {
88
function Main() {
99
window.coderoad = {
1010
dir: null
1111
};
1212
polyfills_1.default();
1313
editor_1.setAtomGlobals();
14-
setup_checks_1.verifySetupComplete();
14+
setup_1.verifySetupComplete();
1515
this.root = render_1.initRoot();
1616
}
1717
Main.prototype.activate = function () {

lib/components/start/setup.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ var __extends = (this && this.__extends) || function (d, b) {
77
var React = require('react');
88
var material_ui_1 = require('material-ui');
99
var _components_1 = require('../_components');
10-
var setup_checks_1 = require('../../services/setup-checks');
10+
var setup_1 = require('../../services/setup/setup');
1111
var default_1 = (function (_super) {
1212
__extends(default_1, _super);
1313
function default_1() {
1414
_super.apply(this, arguments);
1515
}
1616
default_1.prototype.render = function () {
1717
var warning = this.props.warning;
18-
return (React.createElement("div", {className: 'cr-setup'}, React.createElement(material_ui_1.List, {subheader: 'Setup'}, React.createElement(material_ui_1.ListItem, {key: warning.key}, React.createElement("h4", null, warning.title), React.createElement(_components_1.MarkdownText, {text: warning.text}))), React.createElement("br", null), !!warning.button ? React.createElement("div", {class: 'cr-setup-action'}, React.createElement(material_ui_1.RaisedButton, {primary: true, label: warning.button, onTouchTap: warning.click}), React.createElement("br", null), React.createElement("br", null)) : null, !!warning.verify ? React.createElement("div", {class: 'cr-setup-action'}, React.createElement(material_ui_1.RaisedButton, {label: "Verify " + warning.verify, secondary: true, onTouchTap: setup_checks_1.verifySetupComplete}), React.createElement("br", null), React.createElement("br", null)) : null, React.createElement("div", {className: 'setup-guide'}, React.createElement("span", null, "Check the", React.createElement("a", {href: 'https://coderoad.github.io/docs#install'}, " ", React.createElement("strong", null, "Install Guide"))))));
18+
return (React.createElement("div", {className: 'cr-setup'}, React.createElement(material_ui_1.List, {subheader: 'Setup'}, React.createElement(material_ui_1.ListItem, {key: warning.key}, React.createElement("h4", null, warning.title), React.createElement(_components_1.MarkdownText, {text: warning.text}))), React.createElement("br", null), !!warning.button ? React.createElement("div", {class: 'cr-setup-action'}, React.createElement(material_ui_1.RaisedButton, {primary: true, label: warning.button, onTouchTap: warning.click}), React.createElement("br", null), React.createElement("br", null)) : null, !!warning.verify ? React.createElement("div", {class: 'cr-setup-action'}, React.createElement(material_ui_1.RaisedButton, {label: "Verify " + warning.verify, secondary: true, onTouchTap: setup_1.verifySetupComplete}), React.createElement("br", null), React.createElement("br", null)) : null, React.createElement("div", {className: 'setup-guide'}, React.createElement("span", null, "Check the", React.createElement("a", {href: 'https://coderoad.github.io/docs#install'}, " ", React.createElement("strong", null, "Install Guide"))))));
1919
};
2020
;
2121
return default_1;

lib/services/command-line.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"use strict";
2+
var exists_1 = require('./exists');
3+
var child_process_1 = require('child_process');
4+
function commandLine(root, commands) {
5+
if (process.platform === 'darwin' && process.resourcesPath) {
6+
var localPath = '/usr/local/bin/' + root;
7+
var globalPath = '/usr/bin/' + root;
8+
if (exists_1.fileExists(localPath)) {
9+
root = localPath;
10+
}
11+
else if (exists_1.fileExists(globalPath)) {
12+
root = globalPath;
13+
}
14+
else {
15+
throw root + ' not found. Python may not be installed';
16+
}
17+
}
18+
var run = child_process_1.exec(root + " " + commands);
19+
return new Promise(function (resolve, reject) {
20+
run.stdout.on('data', function (data) {
21+
resolve(data);
22+
});
23+
run.stderr.on('data', function (data) {
24+
reject(data);
25+
});
26+
});
27+
}
28+
Object.defineProperty(exports, "__esModule", { value: true });
29+
exports.default = commandLine;

lib/services/package.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use strict";
22
var path = require('path');
3-
var set_globals_1 = require('./set-globals');
3+
var set_globals_1 = require('./setup/set-globals');
44
var Action = require('../actions/actions');
55
var _base_1 = require('../_base');
66
var _ = require('lodash');

lib/services/setup/set-globals.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"use strict";
2+
var path = require('path');
3+
var exists_1 = require('../exists');
4+
function setGlobals(config) {
5+
window.coderoad = Object.assign(window.coderoad, {
6+
tutorial: config.name,
7+
suffix: config.config.testSuffix.substring(config.config.testSuffix.lastIndexOf('.') + 1, config.config.testSuffix.length),
8+
tutorialDir: path.join(window.coderoad.dir, 'node_modules', config.name, config.config.testDir),
9+
testRunner: config.config.testRunner,
10+
testRunnerOptions: config.config.testRunnerOptions || {}
11+
});
12+
loadRepo(config);
13+
loadRunnerDep(config);
14+
}
15+
exports.setGlobals = setGlobals;
16+
function loadRunnerDep(config) {
17+
var flatDep = path.join(window.coderoad.dir, 'node_modules', config.config.testRunner, 'package.json');
18+
var treeDep = path.join(window.coderoad.dir, 'node_modules', config.name, 'node_modules', config.config.testRunner, 'package.json');
19+
var runnerMain;
20+
var runnerRoot;
21+
if (exists_1.fileExists(flatDep)) {
22+
runnerMain = require(flatDep).main;
23+
runnerRoot = flatDep;
24+
}
25+
else if (exists_1.fileExists(treeDep)) {
26+
runnerMain = require(treeDep).main;
27+
runnerRoot = treeDep;
28+
}
29+
else {
30+
var message = 'Error loading test runner. Post an issue. https://github.com/coderoad/atom-coderoad/issues';
31+
console.log(message);
32+
throw message;
33+
}
34+
var slash = window.coderoad.win ? '\\' : '/';
35+
runnerMain = path.join.apply(null, runnerMain.split(slash));
36+
runnerRoot = runnerRoot.substring(0, runnerRoot.lastIndexOf(slash));
37+
var pathToMain = path.join(runnerRoot, runnerMain);
38+
if (!!require(pathToMain).default) {
39+
window.coderoad.runner = require(pathToMain).default;
40+
}
41+
else {
42+
window.coderoad.runner = require(pathToMain);
43+
}
44+
}
45+
function loadRepo(config) {
46+
if (config.bugs && config.bugs.url) {
47+
window.coderoad.issuesPath = config.bugs.url;
48+
}
49+
if (config.repo && config.repo.url) {
50+
var repo = config.repo.url;
51+
if (!!repo.match(/\.git$/)) {
52+
repo = repo.slice(0, repo.length - 4);
53+
}
54+
window.coderoad.repo = repo;
55+
}
56+
window.coderoad.edit = config.config.edit && !!window.coderoad.repo || false;
57+
}

lib/services/setup/setup-actions.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"use strict";
2+
var path = require('path');
3+
var editor_1 = require('../../atom/editor');
4+
var actions_1 = require('../../atom/actions');
5+
var setup_1 = require('./setup');
6+
var packageData = "{\n \"name\": \"demo\",\n \"dependencies\": {\n \"coderoad-functional-school\": \"^0.2.1\"\n }\n}";
7+
function createPackageJson() {
8+
var packagePath = path.join(window.coderoad.dir, 'package.json');
9+
return new Promise(function (resolve, reject) {
10+
editor_1.open(packagePath);
11+
setTimeout(function () {
12+
resolve();
13+
});
14+
}).then(function () {
15+
editor_1.set(packageData);
16+
setup_1.verifySetupComplete();
17+
});
18+
}
19+
exports.createPackageJson = createPackageJson;
20+
function openDirectory() {
21+
return actions_1.openFolder();
22+
}
23+
exports.openDirectory = openDirectory;
24+
function installTutorial() {
25+
return actions_1.openTerminal();
26+
}
27+
exports.installTutorial = installTutorial;

lib/services/setup/setup-checks.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
"use strict";
2+
var tutorials_1 = require('./tutorials');
3+
var setup_actions_1 = require('./setup-actions');
4+
function hasDirectory() {
5+
return new Promise(function (resolve, reject) {
6+
var hasDirectory = !!window.coderoad.dir;
7+
if (!hasDirectory) {
8+
reject({
9+
key: 'noProject',
10+
title: 'Create an Atom Project',
11+
click: setup_actions_1.openDirectory,
12+
text: 'Start by opening a folder to work in.\nFile > Open',
13+
button: 'Open Folder',
14+
verify: null
15+
});
16+
}
17+
else {
18+
resolve();
19+
}
20+
});
21+
}
22+
exports.hasDirectory = hasDirectory;
23+
function hasPackageJson() {
24+
return new Promise(function (resolve, reject) {
25+
var hasPackageJson = tutorials_1.packageJsonExists();
26+
if (!hasPackageJson) {
27+
reject({
28+
key: 'noPackageJson',
29+
title: 'Create a `package.json` file',
30+
click: setup_actions_1.createPackageJson,
31+
text: 'Open a terminal in this directory and run:\n`npm init` or `npm init --y`.\n',
32+
button: 'Create Package.json',
33+
verify: 'Package.json created'
34+
});
35+
}
36+
resolve();
37+
});
38+
}
39+
exports.hasPackageJson = hasPackageJson;
40+
function hasTutorialDep() {
41+
return new Promise(function (resolve, reject) {
42+
var packageJson = hasPackageJson ? tutorials_1.loadRootPackageJson() : null;
43+
var hasTutorialDep = !!packageJson && _tutorialInstalled(packageJson.dependencies) ||
44+
_tutorialInstalled(packageJson.devDependencies);
45+
if (!hasTutorialDep) {
46+
reject({
47+
key: 'noTutorialDep',
48+
title: 'Install a Tutorial',
49+
click: setup_actions_1.installTutorial,
50+
button: 'Install functional-school',
51+
text: 'In terminal in this project directory run:\n`npm i --save coderoad-functional-school`',
52+
verify: 'Tutorial Installed'
53+
});
54+
}
55+
resolve();
56+
});
57+
}
58+
exports.hasTutorialDep = hasTutorialDep;
59+
function _hasKeys(obj) {
60+
return Object.keys(obj).length > 0;
61+
}
62+
function _tutorialInstalled(location) {
63+
return !!location && _hasKeys(location) && tutorials_1.searchForTutorials(location).length > 0;
64+
}

lib/services/setup/setup.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"use strict";
2+
var system_checks_1 = require('./system-checks');
3+
var setup_checks_1 = require('./setup-checks');
4+
var _base_1 = require('../../_base');
5+
var Action = require('../../actions/actions');
6+
function verifySetupComplete() {
7+
system_checks_1.npmVersionThreeOrLater()
8+
.then(setup_checks_1.hasDirectory)
9+
.then(setup_checks_1.hasPackageJson)
10+
.then(setup_checks_1.hasTutorialDep)
11+
.then(function () {
12+
_base_1.store.dispatch(Action.setupWarning(null));
13+
_base_1.store.dispatch(Action.loadTutorials());
14+
})
15+
.catch(function (warning) {
16+
_base_1.store.dispatch(Action.setupWarning(warning));
17+
});
18+
}
19+
exports.verifySetupComplete = verifySetupComplete;

lib/services/setup/system-checks.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"use strict";
2+
var command_line_1 = require('../command-line');
3+
function npmVersionThreeOrLater() {
4+
var minVersion = 3;
5+
return new Promise(function (resolve, reject) {
6+
var threeOrLater = command_line_1.default('npm', '-v').then(function (res) { return parseInt(res, 10) >= minVersion; });
7+
if (!threeOrLater) {
8+
reject({
9+
key: 'updateNpm',
10+
title: 'Please update to NPM version 3+',
11+
click: null,
12+
text: 'Open a terminal and run:\n `npm install npm -g`',
13+
button: 'Update NPM',
14+
verify: 'NPM updated to version 3 or later'
15+
});
16+
}
17+
else {
18+
resolve();
19+
}
20+
});
21+
}
22+
exports.npmVersionThreeOrLater = npmVersionThreeOrLater;

lib/services/setup/tutorials.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"use strict";
2+
var path = require('path');
3+
var fs = require('fs');
4+
var exists_1 = require('../exists');
5+
var tutorialError = 'This is an error with the tutorial itself';
6+
function packageJsonExists() {
7+
var pathToPackageJson = path.join(window.coderoad.dir, 'package.json');
8+
return exists_1.fileExists(pathToPackageJson);
9+
}
10+
exports.packageJsonExists = packageJsonExists;
11+
function loadRootPackageJson() {
12+
var pathToPackageJson = path.join(window.coderoad.dir, 'package.json');
13+
if (exists_1.fileExists(pathToPackageJson)) {
14+
return JSON.parse(fs.readFileSync(pathToPackageJson, 'utf8'));
15+
}
16+
return null;
17+
}
18+
exports.loadRootPackageJson = loadRootPackageJson;
19+
function _isTutorial(name) {
20+
var pathToTutorialPackageJson = path.join(window.coderoad.dir, 'node_modules', name, 'package.json');
21+
if (!exists_1.fileExists(pathToTutorialPackageJson)) {
22+
console.log("Error with " + name + ": no package.json file found. " + tutorialError);
23+
return false;
24+
}
25+
var packageJson = JSON.parse(fs.readFileSync(pathToTutorialPackageJson, 'utf8'));
26+
if (!packageJson.main && packageJson.main.match(/coderoad.json$/)) {
27+
console.log("Error with " + name + ": main does not load a coderoad.json file. " + tutorialError);
28+
return false;
29+
}
30+
var pathToCoderoadJson = path.join(window.coderoad.dir, 'node_modules', name, packageJson.main);
31+
if (!exists_1.fileExists(pathToCoderoadJson)) {
32+
console.log("Error with " + name + ": no coderoad.json file. " + tutorialError);
33+
return false;
34+
}
35+
;
36+
if (!packageJson.config || !packageJson.config.testRunner) {
37+
console.log("Error with " + name + ": no test runner specified. " + tutorialError);
38+
return false;
39+
}
40+
var pathToTestRunner = path.join(window.coderoad.dir, 'node_modules', packageJson.config.testRunner);
41+
return true;
42+
}
43+
function searchForTutorials(deps) {
44+
if (!!deps && Object.keys(deps).length > 0) {
45+
return Object.keys(deps).filter(function (name) { return _isTutorial(name); });
46+
}
47+
else {
48+
return [];
49+
}
50+
}
51+
exports.searchForTutorials = searchForTutorials;

lib/services/write.js

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +0,0 @@
1-
"use strict";
2-
var fs = require('fs');
3-
var path = require('path');
4-
function getPath(filePath) {
5-
return path.normalize(path.join(window.coderoad.dir, filePath));
6-
}
7-
function write(filePath, text) {
8-
try {
9-
fs.writeFileSync(getPath(filePath), text, 'utf8');
10-
}
11-
catch (e) {
12-
if (e) {
13-
console.log('Error writing to filePath', filePath);
14-
}
15-
}
16-
}
17-
exports.write = write;
18-
function readWrite(writePath, readPath) {
19-
try {
20-
write(writePath, fs.readFileSync(getPath(readPath)));
21-
}
22-
catch (e) {
23-
if (e) {
24-
console.log('Error reading from filePath', readPath);
25-
}
26-
}
27-
}
28-
exports.readWrite = readWrite;

src/atom/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {render, initRoot, togglePanel} from '../components/render';
44
import loadPolyfills from '../services/polyfills';
55
import {onActivate, onDeactivate, addToStatusBar} from './subscriptions';
66
import {setAtomGlobals} from './editor';
7-
import {verifySetupComplete} from '../services/setup-checks';
7+
import {verifySetupComplete} from '../services/setup/setup';
88

99
class Main {
1010
root: HTMLElement;

src/components/start/setup.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as React from 'react';
22
import {List, ListItem, RaisedButton} from 'material-ui';
33
import {MarkdownText} from '../_components';
4-
import {verifySetupComplete} from '../../services/setup-checks';
4+
import {verifySetupComplete} from '../../services/setup/setup';
55

66
export default class extends React.Component<{warning: CR.SetupWarning}, {}> {
77
render() {

src/components/start/start.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
import * as React from 'react';
3-
import {Paper} from 'material-ui';
3+
import {Paper, RaisedButton} from 'material-ui';
44
import SetupGuide from './setup';
55
import Tutorials from './tutorials';
66

0 commit comments

Comments
 (0)