UNPKG

donejs

Version:
356 lines (303 loc) 9.14 kB
var automate = require("guide-automation"); var isWindowsCI = require("is-appveyor"); var join = require("path").join; var rimraf = require("rimraf").sync; var streamWhen = require("stream-when"); var nodeVersion = +process.version.substr(1).split(".")[0]; // Only run in AppVeyor if version >= 7 if(isWindowsCI && nodeVersion <= 7) { process.exit(0); } var guide = automate({ spinner: true, log: true }); var wait = function(){ var ms = isWindowsCI ? 5000 : 2000; return guide.wait(ms); }; /** * @Step 1 */ guide.step("Remove existing dependencies", function(){ rimraf(join("node_modules", "donejs-cli")); rimraf(join("node_modules", "generator-donejs")); }); guide.step("Install donejs", function(){ var branch = process.env.TRAVIS_PULL_REQUEST_BRANCH || process.env.TRAVIS_BRANCH || process.env.APPVEYOR_REPO_COMMIT || 'master'; var repo = process.env.TRAVIS_PULL_REQUEST_SLUG || process.env.TRAVIS_REPO_SLUG || "donejs/donejs"; return guide.executeCommand("npm", ["install", repo + "#" + branch, "-g"]); }); // Move to a temp folder for the rest of the guide guide.moveToTmp(); /** * @Step 2 */ guide.step("Run donejs add app", function(){ var init = guide.answerPrompts("donejs", ["add", "app", "donejs-chat", "--skip-install", "--yes"]); return init.promise; }); /** * @Step 3 */ guide.step("Move to donejs-chat folder", function(){ process.chdir("donejs-chat"); return guide.injectSpy("src/index.stache"); }); guide.step("Run NPM install", function() { return guide.executeCommand("npm", ["install"]).then(guide.wait(10000)); }); /** * @Step 4 */ guide.step("Start donejs develop", function(){ var child = guide.canServe = guide.executeCommand("donejs", ["develop"]).childProcess; console.log("done-serve running as", child.pid); var server = streamWhen(child.stdout, /done-serve starting on/); var liveReload = streamWhen(child.stderr, /Live-reload server/); return Promise.all([server, liveReload]).then(wait); }); guide.test(function(){ return guide.nodeTest(join(__dirname, "steps", "3-donejs-develop", "test.js")); }); guide.launchBrowser("http://localhost:8080"); /** * @Step 5 */ guide.step("Install bootstrap", function(){ return guide.executeCommand("npm", ["install", "bootstrap@3", "--save"]) .then(wait) .then(function(){ return guide.replaceFile(join("src", "index.stache"), join(__dirname, "steps", "4-bootstrap", "index.stache")); }) .then(function(){ return guide.injectSpy("src/index.stache"); }) .then(wait) .then(wait); }); guide.test(function(){ console.log("Running bootstrap tests"); return guide.functionalTest(join(__dirname, "steps", "4-bootstrap", "test.js")) .then(wait); }); /** * @Step 6 */ guide.step("Generate custom elements", function(){ return guide.executeCommand("donejs", ["add","component","pages/home.component","chat-home"]) .then(function(){ return guide.executeCommand("donejs", ["add","component","pages/messages", "chat-messages"]); }).then(wait); }); /** * @Step 7 */ guide.step("Navigate between pages", function(){ return guide.replaceFile(join("src", "pages", "home.component"), join(__dirname, "steps", "7-navigate", "home.component")) .then(function(){ return guide.replaceFile(join("src", "pages", "messages", "messages.stache"), join(__dirname, "steps", "7-navigate", "messages.stache")); }) .then(function(){ return guide.replaceFile(join("src", "app.js"), join(__dirname, "steps", "7-navigate", "app.js")); }) .then(function(){ return guide.replaceFile(join("src", "index.stache"), join(__dirname, "steps", "7-navigate", "index.stache")); }) .then(function(){ return guide.injectSpy("src/index.stache"); }) .then(wait); }); guide.test(function(){ return guide.functionalTest(join(__dirname, "steps", "7-navigate", "test.js")); }); guide.test(function(){ return guide.nodeTest(join(__dirname, "steps", "7-navigate", "ssr_test.js")); }); /** * @Step 8 */ guide.step("Install and use bit-tabs", function(){ function installWait(){ return guide.wait(10000); } return guide.executeCommand("npm", ["install", "bit-tabs@2", "--save"]) .then(installWait) .then(function(){ return guide.replaceFile(join("src", "pages", "home.component"), join(__dirname, "steps", "8-bit-tabs", "home.component")); }) .then(wait); }); guide.test(function(){ console.log("Running bit-tabs tests"); // Check that the tabs have appeared. return guide.functionalTest(join(__dirname, "steps", "8-bit-tabs", "tabs_test.js")) .then(wait); }); /** * @Step 9 */ guide.step("Generate the Message model", function(){ var supermodel = guide.answerPrompts("donejs", ["add", "supermodel", "message"]); var answer = supermodel.answer; answer(/URL endpoint/, "https://chat.donejs.com/api/messages\n"); answer(/property name/, "\n"); answer(/service URL/, "Yes\n"); return supermodel.promise; }); /** * @Step 10 */ guide.step("Use the connection", function(){ return guide.replaceFile(join("src", "pages", "messages", "messages.stache"), join(__dirname, "steps", "10-use-connection", "messages.stache")) .then(function() { return guide.replaceFile(join("src", "pages", "messages", "messages.js"), join(__dirname, "steps", "10-use-connection", "messages.js")) }) .then(wait); }); guide.test(function(){ return guide.functionalTest(join(__dirname, "steps", "10-use-connection", "test.js")); }); /** * @Step 11 */ guide.step("Create messages", function(){ return guide.replaceFile(join("src", "pages", "messages", "messages.js"), join(__dirname, "steps", "11-create-messages", "messages.js")) .then(function(){ return guide.replaceFile(join("src", "pages", "messages", "messages.stache"), join(__dirname, "steps", "11-create-messages", "messages.stache")); }).then(wait); }); guide.test(function(){ return guide.functionalTest(join(__dirname, "steps", "11-create-messages", "test.js")); }); /** * @Step 12 */ guide.step("Enable a real-time connection", function(){ return guide.executeCommand("npm", ["install", "steal-socket.io@2", "--save"]) .then(wait) .then(function(){ return guide.replaceFile(join("src", "models", "message.js"), join(__dirname, "steps", "12-real-time", "message.js")); }); }); guide.test(function(){ return guide.functionalTest(join(__dirname, "steps", "12-real-time", "test.js")); }); /** * @Step 13 */ guide.closeBrowser(); guide.step("Stop development mode", function(){ return guide.kill(guide.canServe) .then(function(){ guide.canServe = null; return guide.wait(2000); }); }); /** * @ Step 14 */ guide.step("Production build", function(){ return guide.executeCommand("donejs", ["build"]); }); /** * @ Step 15 */ guide.step("Open in production", function(){ process.env["NODE_ENV"] = "production"; var child = guide.canServe = guide.executeCommand("donejs", ["start"]) .childProcess; var server = streamWhen(child.stdout, /done-serve starting on/); return server.then(wait); }); guide.test(function(){ return guide.nodeTest(join(__dirname, "steps", "15-production", "test.js")); }); guide.step("Stop production mode", function(){ return guide.kill(guide.canServe) .then(function(){ guide.canServe = null; return guide.wait(2000); }); }); /** * @Step 16 */ guide.stepIf("Deploy to CDN", function() { return !!guide.options.app; }, function(){ return guide.executeCommand("donejs", ["add", "firebase"]) .then(function(){ return guide.executeCommand("donejs", ["build"]); }) .then(function(){ return guide.executeCommand("donejs", ["deploy"]); }); }); /** * @Step 17 */ guide.stepIf("Desktop and mobile apps: Cordova", function() { return process.platform === 'darwin'; }, function(){ return guide.executeCommand("npm", ["install", "-g", "ios-sim"]) .then(function(){ var proc = guide.answerPrompts("donejs", ["add", "cordova"]); var answer = proc.answer; answer(/Name of project/, "donejs chat\n"); answer(/ID of project/, "com.donejs.donejschat\n"); answer(/service layer/, "\n"); answer(/What platforms/, "\n"); return proc.promise; }) .then(function(){ return guide.executeCommand("donejs", ["build", "cordova"]); }); }); /** * @Step 18 */ guide.step("Desktop and mobile apps: Electron", function(){ var proc = guide.answerPrompts("donejs", ["add", "electron"]); var answer = proc.answer; answer(/Main HTML file/, "\n"); answer(/service layer/, "\n"); answer(/What platforms/, "\n"); answer(/What architectures/, "\n"); return proc.promise .then(function(){ return guide.executeCommand("donejs", ["build", "electron"]); }); }); /** * Run the test */ guide.run().then( function(){ console.log("All done!"); return 0; }, function(err){ console.error("Oh no", err.message, err.stack, err); return 1; } ).then(function(exitCode){ if(guide.canServe) { guide.canServe.kill(); } return exitCode; }).then(function(exitCode){ process.exit(exitCode); });