diff --git a/bin/stencil-init b/bin/stencil-init index 39ba03cf..f32f1369 100755 --- a/bin/stencil-init +++ b/bin/stencil-init @@ -1,13 +1,13 @@ #!/usr/bin/env node require('colors'); -var stencilInit = require('../lib/stencil-init'); -var pkg = require('../package.json'); -var Program = require('commander'); -var JspmAssembler = require('../lib/jspm-assembler'); -var ThemeConfig = require('../lib/theme-config'); -var dotStencilFilePath = './.stencil'; -var versionCheck = require('../lib/version-check'); +const StencilInit = require('../lib/stencil-init'); +const pkg = require('../package.json'); +const Program = require('commander'); +const JspmAssembler = require('../lib/jspm-assembler'); +const ThemeConfig = require('../lib/theme-config'); +const dotStencilFilePath = './.stencil'; +const versionCheck = require('../lib/version-check'); Program .version(pkg.version) @@ -20,4 +20,4 @@ if (!versionCheck()) { return; } -stencilInit(JspmAssembler, ThemeConfig, dotStencilFilePath, Program.url, Program.token, Program.port); +StencilInit.run(JspmAssembler, ThemeConfig, dotStencilFilePath, Program.url, Program.token, Program.port); diff --git a/bin/stencil-init.spec.js b/bin/stencil-init.spec.js index ac83ce95..a80f433f 100644 --- a/bin/stencil-init.spec.js +++ b/bin/stencil-init.spec.js @@ -3,45 +3,60 @@ const Code = require('code'); const Sinon = require('sinon'); const Lab = require('@hapi/lab'); +const Fs = require('fs'); const lab = exports.lab = Lab.script(); const describe = lab.describe; const Inquirer = require('inquirer'); const expect = Code.expect; const it = lab.it; const StencilInit = require('../lib/stencil-init'); +const JspmAssembler = require('../lib/jspm-assembler'); +const ThemeConfig = require('../lib/theme-config'); describe('stencil init', () => { let sandbox; + let consoleErrorStub; + let JspmAssemblerStub; + let ThemeConfigStub; + let inquirerPromptStub; lab.beforeEach(() => { sandbox = Sinon.createSandbox(); + sandbox.stub(console, 'log'); - sandbox.stub(console, 'error'); + consoleErrorStub = sandbox.stub(console, 'error'); + + inquirerPromptStub = sandbox.stub(Inquirer, 'prompt'); + inquirerPromptStub.returns({}); + + ThemeConfigStub = sandbox.stub(ThemeConfig); + ThemeConfigStub.getInstance = sandbox.stub().returns({ + getConfig: sandbox.stub().returns({}), + }); + JspmAssemblerStub = sandbox.stub(JspmAssembler); + + sandbox.stub(Fs, 'writeFileSync'); }); lab.afterEach(() => { sandbox.restore(); }); - var inquirer = Sinon.spy(Inquirer, 'prompt'); - - it('should call prompt', () => { - const dotStencilFile = '../_mocks/bin/dotStencilFile.json'; - const jspmAssembler = Sinon.stub(); - const themeConfig = Sinon.spy(); + it('Should call prompt on run and not log errors if the .stencil file is valid', async () => { + const dotStencilFilePath = './test/_mocks/bin/dotStencilFile.json'; - StencilInit(jspmAssembler, themeConfig, dotStencilFile); + await StencilInit.run(JspmAssemblerStub, ThemeConfigStub, dotStencilFilePath); - expect(inquirer.calledOnce).to.be.true(); + expect(consoleErrorStub.calledOnce).to.be.false(); + expect(inquirerPromptStub.calledOnce).to.be.true(); }); - it('should not call prompt with bad JSON from dotStencilFile', () => { - const dotStencilFile = '../_mocks/malformedSchema.json'; - const jspmAssembler = Sinon.stub(); - const themeConfig = Sinon.spy(); + it('Should inform the user if the .stencil file is broken but continue running', async () => { + const dotStencilFilePath = './test/_mocks/malformedSchema.json'; - StencilInit(jspmAssembler, themeConfig, dotStencilFile); + await StencilInit.run(JspmAssemblerStub, ThemeConfigStub, dotStencilFilePath); - expect(inquirer.calledOnce).to.be.false(); + expect(consoleErrorStub.calledOnce).to.be.true(); + expect(inquirerPromptStub.calledOnce).to.be.true(); }); }); diff --git a/lib/stencil-init.js b/lib/stencil-init.js index fd335939..69fa9329 100644 --- a/lib/stencil-init.js +++ b/lib/stencil-init.js @@ -23,7 +23,6 @@ async function performAnswers(JspmAssembler, ThemeConfig, stencilConfig, dotSten const performedStencilConfig = stencilConfig ? hoek.applyToDefaults(stencilConfig, answers) : answers; Fs.writeFileSync(dotStencilFilePath, JSON.stringify(performedStencilConfig, null, 2)); - const ready = 'You are now ready to go! To start developing, run $ ' + 'stencil start'.cyan; // bundle dev dependencies const themeConfig = ThemeConfig.getInstance(themePath).getConfig(); @@ -42,19 +41,21 @@ async function performAnswers(JspmAssembler, ThemeConfig, stencilConfig, dotSten const bundleTask = promisify(JspmAssembler.assemble.bind(JspmAssembler)); await bundleTask(themeConfig.jspm, themePath); } - - console.log(ready); } -async function implementation(JspmAssembler, ThemeConfig, dotStencilFilePath, url, token, port) { +async function run(JspmAssembler, ThemeConfig, dotStencilFilePath, url, token, port) { let stencilConfig; if (Fs.existsSync(dotStencilFilePath)) { const dotStencilFile = Fs.readFileSync(dotStencilFilePath, { encoding: 'utf-8' }); try { stencilConfig = jsonLint.parse(dotStencilFile, dotStencilFilePath); - } catch (e) { - return console.error(e.fileName, e.stack); + } catch (err) { + console.error( + 'Detected a broken .stencil file: ', + err, + '\nThe file will be rewritten with your answers', + ); } } @@ -100,6 +101,11 @@ async function implementation(JspmAssembler, ThemeConfig, dotStencilFilePath, ur const answers = await Inquirer.prompt(questions); await performAnswers(JspmAssembler, ThemeConfig, stencilConfig, dotStencilFilePath, answers); + + console.log('You are now ready to go! To start developing, run $ ' + 'stencil start'.cyan); } -module.exports = implementation; +module.exports = { + performAnswers, + run, +};