diff --git a/package-lock.json b/package-lock.json index 1be352238..0efc9440c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -831,9 +831,9 @@ "dev": true }, "@types/node": { - "version": "10.3.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.3.5.tgz", - "integrity": "sha512-6lRwZN0Y3TuglwaaZN2XPocobmzLlhxcqDjKFjNYSsXG/TFAGYkCqkzZh4+ms8iTHHQE6gJXLHPV7TziVGeWhg==", + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.1.tgz", + "integrity": "sha512-AFLl1IALIuyt6oK4AYZsgWVJ/5rnyzQWud7IebaZWWV3YmgtPZkQmYio9R5Ze/2pdd7XfqF5bP+hWS11mAKoOQ==", "dev": true }, "@webassemblyjs/ast": { @@ -4807,12 +4807,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4832,7 +4834,8 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", @@ -10480,9 +10483,9 @@ } }, "rollup": { - "version": "0.61.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.61.2.tgz", - "integrity": "sha512-NN7GaX3c9I3oz+CjEex7+JbnSxrLMTBXNRThI4qdN2Tq0K/7RiedlEzOHyuVAHPZKvQeoPiRioTWL3xhmN+oCg==", + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.62.0.tgz", + "integrity": "sha512-mZS0aIGfYzuJySJD78znu9/hCJsNfBzg4lDuZGMj0hFVcYHt2evNRHv8aqiu9/w6z6Qn8AQoVl4iyEjDmisGeA==", "dev": true, "requires": { "@types/estree": "0.0.39", diff --git a/package.json b/package.json index 84c63b244..3527fd68b 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "lint-staged": "^7.0.4", "modular-css-core": "file:./packages/core", "pegjs": "^0.10.0", - "rollup": "^0.61.2", + "rollup": "^0.62.0", "rollup-plugin-svelte": "^4.1.0", "shelljs": "^0.8.1", "svelte": "^2.8.1", diff --git a/packages/rollup/rollup.js b/packages/rollup/rollup.js index 8f38b9138..66e6ec120 100644 --- a/packages/rollup/rollup.js +++ b/packages/rollup/rollup.js @@ -34,6 +34,8 @@ module.exports = function(opts) { const filter = utils.createFilter(options.include, options.exclude); const processor = options.processor || new Processor(options); + + let runs = 0; return { name : "modular-css-rollup", @@ -42,13 +44,20 @@ module.exports = function(opts) { if(!filter(id)) { return null; } - + // If the file is being re-processed we need to remove it to // avoid cache staleness issues if(id in processor.files) { - processor.dependencies(id) - .concat(id) - .forEach((file) => processor.remove(file)); + let files = [ id ]; + + // First time build should only remove the file and any files that depend on it + // but watchs update need to clear out the file, any files that depend on it, + // AND any files it depends on + if(runs) { + files = processor.dependencies(id).concat(files); + } + + files.forEach((file) => processor.remove(file)); } return processor.string(id, code).then((result) => { @@ -80,6 +89,11 @@ module.exports = function(opts) { }); }, + // Track # of runs since remove functionality needs to change + buildEnd() { + runs++; + }, + async generateBundle(outputOptions, bundles) { const usage = new Map(); const common = new Map(); diff --git a/packages/rollup/test/__snapshots__/rollup.test.js.snap b/packages/rollup/test/__snapshots__/rollup.test.js.snap index d0ffbf5e4..a65d9416e 100644 --- a/packages/rollup/test/__snapshots__/rollup.test.js.snap +++ b/packages/rollup/test/__snapshots__/rollup.test.js.snap @@ -247,6 +247,45 @@ console.log(css); } `; +exports[`/rollup.js shouldn't over-remove files from an existing processor instance 1`] = ` +"var css = { + \\"a\\": \\"c a\\" +}; + +var css$1 = { + \\"b\\": \\"c b\\" +}; + +console.log(css, css$1); +" +`; + +exports[`/rollup.js shouldn't over-remove files from an existing processor instance 2`] = ` +"/* packages/rollup/test/specimens/repeated-references/a.css */ +.a { + + color: red; +} +/* packages/rollup/test/specimens/repeated-references/b.css */ +.b { + + color: blue; +} +" +`; + +exports[`/rollup.js shouldn't over-remove files from an existing processor instance 3`] = ` +"/* packages/rollup/test/specimens/repeated-references/d.css */ +.d { + color: darkblue; +} +/* packages/rollup/test/specimens/repeated-references/c.css */ +.c { + color: cadetblue; +} +" +`; + exports[`/rollup.js watch should correctly add new css files in watch mode when files change 1`] = ` "/* packages/rollup/test/output/one.css */ .mc19ef5610_one { diff --git a/packages/rollup/test/rollup.test.js b/packages/rollup/test/rollup.test.js index 5d3540380..89dd0ee07 100644 --- a/packages/rollup/test/rollup.test.js +++ b/packages/rollup/test/rollup.test.js @@ -299,7 +299,7 @@ describe("/rollup.js", () => { expect(read("dependencies/dependencies.js")).toMatchSnapshot(); expect(read("dependencies/assets/dependencies.css")).toMatchSnapshot(); }); - + it("should accept an existing processor instance", async () => { const processor = new Processor({ namer, @@ -333,6 +333,36 @@ describe("/rollup.js", () => { expect(read("existing-processor/assets/common.css")).toMatchSnapshot(); }); + it("shouldn't over-remove files from an existing processor instance", async () => { + const processor = new Processor({ + namer, + map, + }); + + await processor.file(require.resolve("./specimens/repeated-references/b.css")); + + const bundle = await rollup({ + input : require.resolve("./specimens/repeated-references/a.js"), + plugins : [ + plugin({ + processor, + }), + ], + }); + + await bundle.write({ + format, + sourcemap, + assetFileNames, + + file : `${output}/repeated-references/repeated-references.js`, + }); + + expect(read("repeated-references/repeated-references.js")).toMatchSnapshot(); + expect(read("repeated-references/assets/repeated-references.css")).toMatchSnapshot(); + expect(read("repeated-references/assets/common.css")).toMatchSnapshot(); + }); + describe("errors", () => { function checkError(err) { expect(err.toString()).toMatch("error-plugin:"); diff --git a/packages/rollup/test/specimens/repeated-references/a.css b/packages/rollup/test/specimens/repeated-references/a.css new file mode 100644 index 000000000..02f54c7c1 --- /dev/null +++ b/packages/rollup/test/specimens/repeated-references/a.css @@ -0,0 +1,5 @@ +.a { + composes: c from "./c.css"; + + color: red; +} diff --git a/packages/rollup/test/specimens/repeated-references/a.js b/packages/rollup/test/specimens/repeated-references/a.js new file mode 100644 index 000000000..8479cfd57 --- /dev/null +++ b/packages/rollup/test/specimens/repeated-references/a.js @@ -0,0 +1,4 @@ +import css from "./a.css"; +import b from "./b.js"; + +console.log(css, b); diff --git a/packages/rollup/test/specimens/repeated-references/b.css b/packages/rollup/test/specimens/repeated-references/b.css new file mode 100644 index 000000000..37ce050fc --- /dev/null +++ b/packages/rollup/test/specimens/repeated-references/b.css @@ -0,0 +1,5 @@ +.b { + composes: c from "./c.css"; + + color: blue; +} diff --git a/packages/rollup/test/specimens/repeated-references/b.js b/packages/rollup/test/specimens/repeated-references/b.js new file mode 100644 index 000000000..cc61d65d9 --- /dev/null +++ b/packages/rollup/test/specimens/repeated-references/b.js @@ -0,0 +1,3 @@ +import css from "./b.css"; + +export default css; diff --git a/packages/rollup/test/specimens/repeated-references/c.css b/packages/rollup/test/specimens/repeated-references/c.css new file mode 100644 index 000000000..e38c48644 --- /dev/null +++ b/packages/rollup/test/specimens/repeated-references/c.css @@ -0,0 +1,7 @@ +.c { + color: cadetblue; +} + +.other { + composes: d from "./d.css"; +} diff --git a/packages/rollup/test/specimens/repeated-references/d.css b/packages/rollup/test/specimens/repeated-references/d.css new file mode 100644 index 000000000..82df04199 --- /dev/null +++ b/packages/rollup/test/specimens/repeated-references/d.css @@ -0,0 +1,3 @@ +.d { + color: darkblue; +}