From cc5118cf5382761f85bb34e3b40563046a3fdeb9 Mon Sep 17 00:00:00 2001 From: Shane Osbourne Date: Wed, 2 May 2018 21:58:54 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20Don=E2=80=99t=20always=20add=20"defaultI?= =?UTF-8?q?gnorePatterns"=20-=20fixes=20#1543?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - cli-options/opts.start.json | 4 ++ crossbow.yaml | 14 ++++++ cypress/configs/file-watching-ignore.js | 7 +++ cypress/integration/file-watching-ignore.js | 14 ++++++ cypress/setup/bs-cli.js | 46 +++++++++++++++++++ .../transforms/addDefaultIgnorePatterns.ts | 4 ++ .../transforms/copyCLIIgnoreToWatchOptions.ts | 2 +- lib/logger.js | 10 +++- test/fixtures/bower.html | 13 ++++++ test/fixtures/bower_components/app.css | 3 ++ test/specs/cli/cli.options.watch.js | 14 ++++++ 12 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 cypress/configs/file-watching-ignore.js create mode 100644 cypress/integration/file-watching-ignore.js create mode 100644 cypress/setup/bs-cli.js create mode 100644 test/fixtures/bower.html create mode 100644 test/fixtures/bower_components/app.css diff --git a/.gitignore b/.gitignore index bafcc9f6a..54c4d8403 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ node_modules .idea npm-debug.log .sass-cache -bower_components test/fixtures/files/* test/fixtures/js/* example.server.js diff --git a/cli-options/opts.start.json b/cli-options/opts.start.json index 3a54d3473..3c5856fb7 100644 --- a/cli-options/opts.start.json +++ b/cli-options/opts.start.json @@ -7,6 +7,10 @@ "type": "string", "desc": "Working directory" }, + "json": { + "type": "boolean", + "desc": "If true, certain logs will output as json only" + }, "serveStatic": { "type": "array", "alias": "ss", diff --git a/crossbow.yaml b/crossbow.yaml index cebb309fd..330f9c106 100644 --- a/crossbow.yaml +++ b/crossbow.yaml @@ -14,8 +14,13 @@ tasks: test: - build-all - cypress:* + - cli:* (cypress): + file-watching-ignore: > + @npm node cypress/setup/run.js + '../configs/file-watching-ignore.js' + cypress/integration/file-watching-ignore.js file-reloading: > @npm node cypress/setup/run.js '../configs/file-reloading.js' @@ -61,3 +66,12 @@ tasks: client/lib/effects/* client/lib/listeners/* --write --tab-width 4 + + cli: cypress/setup/bs-cli.js + +options: + cli: + file-watching-ignore: + method: 'run' + args: ['test/fixtures', '--files', 'test/fixtures', '--no-open', '--json'] + spec: 'cypress/integration/file-watching-ignore.js' \ No newline at end of file diff --git a/cypress/configs/file-watching-ignore.js b/cypress/configs/file-watching-ignore.js new file mode 100644 index 000000000..7528e9797 --- /dev/null +++ b/cypress/configs/file-watching-ignore.js @@ -0,0 +1,7 @@ +module.exports = { + server: 'test/fixtures', + open: false, + online: false, + minify: false, + files: 'test/fixtures', +}; diff --git a/cypress/integration/file-watching-ignore.js b/cypress/integration/file-watching-ignore.js new file mode 100644 index 000000000..d27e274f0 --- /dev/null +++ b/cypress/integration/file-watching-ignore.js @@ -0,0 +1,14 @@ +describe('Watching folders', function() { + context('files option', function () { + beforeEach(function () { + cy.visit(Cypress.env('BS_URL') + '/bower.html'); + }); + it('should reload single ', function () { + cy.exec('touch test/fixtures/bower_components/app.css'); + cy.get('[id="css-style"]').should($link => { + const url = new URL($link.attr('href')); + expect(url.search).to.contain('?browsersync='); + }); + }); + }); +}); \ No newline at end of file diff --git a/cypress/setup/bs-cli.js b/cypress/setup/bs-cli.js new file mode 100644 index 000000000..660a2773d --- /dev/null +++ b/cypress/setup/bs-cli.js @@ -0,0 +1,46 @@ +const cypress = require('cypress'); +const exec = require('child_process'); +const assert = require('assert'); +const {Observable} = require('rxjs/Observable'); + +module.exports = function(opts) { + + assert.ok(Array.isArray(opts.args), '`args` should be an array of strings'); + assert.ok(opts.args.every(arg => typeof arg === 'string'), '`args` should contain only strings'); + + return Observable.create(obs => { + const ls = exec.spawn('node', [ + 'dist/bin', + ...opts.args + ]); + + ls.stdout.once('data', (data) => { + try { + const parsed = JSON.parse(String(data)); + const {urls} = parsed["service:running"].options; + + return cypress.run({ + spec: opts.spec, + env: `BS_URL=${urls.local}` + }) + .then((results) => { + // stop your server when it's complete + if (results.failures > 0) { + return obs.error(new Error('failed!')); + } + obs.complete(); + }) + } catch (e) { + console.error('Parsing Browsersync output failed', e); + return obs.error(new Error('failed!')); + } + }); + ls.stderr.on('data', (data) => { + console.log(data); + return obs.error(new Error('failed!')); + }); + return () => { + ls.kill(); + } + }); +}; diff --git a/lib/cli/transforms/addDefaultIgnorePatterns.ts b/lib/cli/transforms/addDefaultIgnorePatterns.ts index 49bec1ef0..586c53663 100644 --- a/lib/cli/transforms/addDefaultIgnorePatterns.ts +++ b/lib/cli/transforms/addDefaultIgnorePatterns.ts @@ -10,6 +10,10 @@ const defaultIgnorePatterns = [ ]; export function addDefaultIgnorePatterns(incoming) { + if (!incoming.get("watch")) { + return incoming; + } + return incoming.update("watchOptions", watchOptions => { const userIgnored = List([]) .concat(watchOptions.get("ignored")) diff --git a/lib/cli/transforms/copyCLIIgnoreToWatchOptions.ts b/lib/cli/transforms/copyCLIIgnoreToWatchOptions.ts index 8fb4b3c07..72a646246 100644 --- a/lib/cli/transforms/copyCLIIgnoreToWatchOptions.ts +++ b/lib/cli/transforms/copyCLIIgnoreToWatchOptions.ts @@ -4,7 +4,7 @@ export function copyCLIIgnoreToWatchOptions(incoming) { if (!incoming.get("ignore")) { return incoming; } - return incoming.updateIn(["watchOptions", "ignored"], ignored => { + return incoming.updateIn(["watchOptions", "ignored"], List([]), ignored => { const userIgnore = List([]).concat(incoming.get("ignore")); return ignored.concat(userIgnore); }); diff --git a/lib/logger.js b/lib/logger.js index b260437e6..de886bffa 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -121,8 +121,14 @@ module.exports.callbacks = { * @param data */ "service:running": function(bs, data) { - var type = data.type; - + const type = data.type; + if (bs.options.get('json')) { + return console.log(JSON.stringify({ + "service:running": { + "options": bs.options.toJS() + } + })); + } if (type === "server") { var baseDir = bs.options.getIn(["server", "baseDir"]); diff --git a/test/fixtures/bower.html b/test/fixtures/bower.html new file mode 100644 index 000000000..dc5ff97d3 --- /dev/null +++ b/test/fixtures/bower.html @@ -0,0 +1,13 @@ + + + + + + + Document + + + +

Bower Components

+ + \ No newline at end of file diff --git a/test/fixtures/bower_components/app.css b/test/fixtures/bower_components/app.css new file mode 100644 index 000000000..62d821435 --- /dev/null +++ b/test/fixtures/bower_components/app.css @@ -0,0 +1,3 @@ +body { + background: orange; +} \ No newline at end of file diff --git a/test/specs/cli/cli.options.watch.js b/test/specs/cli/cli.options.watch.js index 92a2548de..8928bb639 100644 --- a/test/specs/cli/cli.options.watch.js +++ b/test/specs/cli/cli.options.watch.js @@ -16,6 +16,20 @@ describe("CLI: Options: Merging Watch Option", function() { core: { globs: ["/shane", "."], objs: [] } }); }); + it("does not add default ignore paths if watch option is absent", function() { + var input = { server: true, files: ["/shane"] }; + var config = merge(input).toJS(); + assert.isUndefined(config.watchOptions.ignored); + }); + it("does not add 'default' ignore options if 'ignore' provided in config", function() { + var input = { + server: true, + files: ["/shane"], + ignore: ["/shane/*.css"] + }; + var config = merge(input).toJS(); + assert.deepEqual(config.watchOptions.ignored, ["/shane/*.css"]); + }); it("watches from serveStatic option (no files given also)", function() { var input = { serveStatic: ["./test"], watch: true }; var config = merge(input).toJS();