From fd5ce2999a83a91fa459acd3e5482c93d86a809d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Fri, 22 Sep 2017 10:19:44 +0200 Subject: [PATCH 1/3] fix: Append classnames when extracting to single file --- .../__tests__/extractStyles.spec.js | 31 +++++++++++++++++++ src/babel/preval-extract/extractStyles.js | 21 ++++++++++--- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/babel/preval-extract/__tests__/extractStyles.spec.js b/src/babel/preval-extract/__tests__/extractStyles.spec.js index 9599f34b8..74bbecf9f 100644 --- a/src/babel/preval-extract/__tests__/extractStyles.spec.js +++ b/src/babel/preval-extract/__tests__/extractStyles.spec.js @@ -56,6 +56,37 @@ describe('preval-extract/extractStyles module', () => { expect(writeFileSync).not.toHaveBeenCalled(); }); + it('should append classnames when writing to single file', () => { + const writeFileSync = jest.fn(); + const opts = { single: true, filename: 'A.css' }; + + getCachedModule.mockImplementationOnce( + getCachedModuleImpl('.classname{color: #ffffff}') + ); + + extractStyles(types, null, 'file1.js', opts, { writeFileSync }); + + getCachedModule.mockImplementationOnce( + getCachedModuleImpl('.other{color: #000000}') + ); + + extractStyles(types, null, 'file2.js', opts, { writeFileSync }); + + expect(fs.writeFileSync).toHaveBeenCalledTimes(2); + expect(fs.writeFileSync.mock.calls[0][0]).toEqual( + path.join(process.cwd(), 'A.css') + ); + expect(fs.writeFileSync.mock.calls[0][1]).toMatch( + '.classname{color: #ffffff}' + ); + expect(fs.writeFileSync.mock.calls[1][0]).toEqual( + path.join(process.cwd(), 'A.css') + ); + expect(fs.writeFileSync.mock.calls[1][1]).toMatch( + '.classname{color: #ffffff}\n.other{color: #000000}' + ); + }); + describe('with cache disabled', () => { beforeEach(clearCache); diff --git a/src/babel/preval-extract/extractStyles.js b/src/babel/preval-extract/extractStyles.js index 0298ac2eb..de65edd27 100644 --- a/src/babel/preval-extract/extractStyles.js +++ b/src/babel/preval-extract/extractStyles.js @@ -10,7 +10,7 @@ import { getCachedModule } from '../lib/moduleSystem'; const preamble = '/* THIS FILE IS AUTOGENERATED. DO NOT EDIT IT DIRECTLY, NOR COMMIT IT TO VERSION CONTROL. */'; -function parseCurrentFilename(filename: string, outDir: string) { +function parseCurrentFilename(filename: string, outDir: string = '') { const dirname = path.isAbsolute(filename) ? path.dirname(filename) : path.join(process.cwd(), outDir); @@ -21,7 +21,7 @@ function parseCurrentFilename(filename: string, outDir: string) { function parseFilename( filename: string, currentFilename: string, - outDir: string + outDir: string = '' ) { const dirname = path.isAbsolute(outDir) ? outDir @@ -75,8 +75,8 @@ export default function extractStyles( single: false, ...options, filename: options.filename - ? parseFilename(options.filename, currentFilename, options.outDir || '') - : parseCurrentFilename(currentFilename, options.outDir || ''), + ? parseFilename(options.filename, currentFilename, options.outDir) + : parseCurrentFilename(currentFilename, options.outDir), }; if (!extract) { @@ -99,7 +99,18 @@ export default function extractStyles( } if (cache) { - stylesCache[filename] = data; + if (single) { + if (hasCachedStyles(currentFilename, data)) { + return; + } + stylesCache[currentFilename] = data; + } else { + if (hasCachedStyles(filename, data)) { + addRequireForCss(types, program, filename); + return; + } + stylesCache[filename] = data; + } } if (single) { From a33b10b6cdd8a16ea7b02952624268f5a4872fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Fri, 22 Sep 2017 10:33:30 +0200 Subject: [PATCH 2/3] Remove leftover code --- src/babel/preval-extract/extractStyles.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/babel/preval-extract/extractStyles.js b/src/babel/preval-extract/extractStyles.js index de65edd27..fe685422d 100644 --- a/src/babel/preval-extract/extractStyles.js +++ b/src/babel/preval-extract/extractStyles.js @@ -90,14 +90,6 @@ export default function extractStyles( return; } - if (cache && hasCachedStyles(filename, data)) { - if (!single) { - addRequireForCss(types, program, filename); - } - - return; - } - if (cache) { if (single) { if (hasCachedStyles(currentFilename, data)) { From 24e5810b2fadbf494636322429d4e3f8a0a33a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Fri, 22 Sep 2017 10:53:11 +0200 Subject: [PATCH 3/3] Move test to 'with cache' block --- .../__tests__/extractStyles.spec.js | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/babel/preval-extract/__tests__/extractStyles.spec.js b/src/babel/preval-extract/__tests__/extractStyles.spec.js index 74bbecf9f..d2c3b49d7 100644 --- a/src/babel/preval-extract/__tests__/extractStyles.spec.js +++ b/src/babel/preval-extract/__tests__/extractStyles.spec.js @@ -56,37 +56,6 @@ describe('preval-extract/extractStyles module', () => { expect(writeFileSync).not.toHaveBeenCalled(); }); - it('should append classnames when writing to single file', () => { - const writeFileSync = jest.fn(); - const opts = { single: true, filename: 'A.css' }; - - getCachedModule.mockImplementationOnce( - getCachedModuleImpl('.classname{color: #ffffff}') - ); - - extractStyles(types, null, 'file1.js', opts, { writeFileSync }); - - getCachedModule.mockImplementationOnce( - getCachedModuleImpl('.other{color: #000000}') - ); - - extractStyles(types, null, 'file2.js', opts, { writeFileSync }); - - expect(fs.writeFileSync).toHaveBeenCalledTimes(2); - expect(fs.writeFileSync.mock.calls[0][0]).toEqual( - path.join(process.cwd(), 'A.css') - ); - expect(fs.writeFileSync.mock.calls[0][1]).toMatch( - '.classname{color: #ffffff}' - ); - expect(fs.writeFileSync.mock.calls[1][0]).toEqual( - path.join(process.cwd(), 'A.css') - ); - expect(fs.writeFileSync.mock.calls[1][1]).toMatch( - '.classname{color: #ffffff}\n.other{color: #000000}' - ); - }); - describe('with cache disabled', () => { beforeEach(clearCache); @@ -179,6 +148,37 @@ describe('preval-extract/extractStyles module', () => { expect(program.node.body.length).toBe(1); }); + it('should append classnames when writing to single file', () => { + const writeFileSync = jest.fn(); + const opts = { single: true, filename: 'A.css' }; + + getCachedModule.mockImplementationOnce( + getCachedModuleImpl('.classname{color: #ffffff}') + ); + + extractStyles(types, null, 'file1.js', opts, { writeFileSync }); + + getCachedModule.mockImplementationOnce( + getCachedModuleImpl('.other{color: #000000}') + ); + + extractStyles(types, null, 'file2.js', opts, { writeFileSync }); + + expect(fs.writeFileSync).toHaveBeenCalledTimes(2); + expect(fs.writeFileSync.mock.calls[0][0]).toEqual( + path.join(process.cwd(), 'A.css') + ); + expect(fs.writeFileSync.mock.calls[0][1]).toMatch( + '.classname{color: #ffffff}' + ); + expect(fs.writeFileSync.mock.calls[1][0]).toEqual( + path.join(process.cwd(), 'A.css') + ); + expect(fs.writeFileSync.mock.calls[1][1]).toMatch( + '.classname{color: #ffffff}\n.other{color: #000000}' + ); + }); + it('should overwrite if the file has changed', () => { getCachedModule.mockImplementationOnce( getCachedModuleImpl('.classname{color: #ffffff}')