Skip to content

Commit 3e87be0

Browse files
parse configuration and require css-modules-require-hook only once through lifetime of a plugin (perf optimization + bug fix when multiple imports/requires are in one file with advanced options), closes michalkvasnicak#7
1 parent ec3e6dc commit 3e87be0

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/index.js

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,27 @@ export default function transformCssModules({ types: t }) {
2424
return resolve(dir);
2525
}
2626

27+
/**
28+
*
29+
* @param {String} filepath javascript file path
30+
* @param {String} cssFile requireed css file path
31+
* @returns {Array} array of class names
32+
*/
33+
function requireCssFile(filepath, cssFile) {
34+
const from = resolveModulePath(filepath);
35+
return require(resolve(from, cssFile));
36+
}
37+
38+
// is css modules require hook initialized?
39+
let initialized = false;
40+
2741
return {
2842
visitor: {
29-
CallExpression(path, { file, opts }) {
43+
Program(path, { opts }) {
44+
if (initialized) {
45+
return;
46+
}
47+
3048
const currentConfig = { ...defaultOptions, ...opts };
3149

3250
// check if there are simple requires and if they are functions
@@ -105,6 +123,10 @@ export default function transformCssModules({ types: t }) {
105123

106124
require('css-modules-require-hook')(currentConfig);
107125

126+
initialized = true;
127+
},
128+
129+
CallExpression(path, { file }) {
108130
const { callee: { name: calleeName }, arguments: args } = path.node;
109131

110132
if (calleeName !== 'require' || !args.length || !t.isStringLiteral(args[0])) {
@@ -121,8 +143,7 @@ export default function transformCssModules({ types: t }) {
121143
);
122144
}
123145

124-
const from = resolveModulePath(file.opts.filename);
125-
const tokens = require(resolve(from, cssPath));
146+
const tokens = requireCssFile(file.opts.filename, args[0].value);
126147

127148
/* eslint-disable new-cap */
128149
path.replaceWith(t.ObjectExpression(

test/index.spec.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
const babel = require('babel-core');
21
import { expect } from 'chai';
32
import { resolve, join } from 'path';
43
import { readFileSync } from 'fs';
@@ -7,6 +6,10 @@ import gulpBabel from 'gulp-babel';
76

87
describe('babel-plugin-css-modules-transform', () => {
98
function transform(path, configuration = {}) {
9+
// remove css modules transform plugin (simulates clean processes)
10+
delete require.cache['/Users/Michal/Work/babel-plugin-css-modules-transform/src/index.js'];
11+
const babel = require('babel-core');
12+
1013
return babel.transformFileSync(resolve(__dirname, path), {
1114
plugins: [
1215
'transform-strict-mode',
@@ -16,7 +19,7 @@ describe('babel-plugin-css-modules-transform', () => {
1619
'transform-object-rest-spread',
1720
'transform-es2015-spread',
1821
'transform-export-extensions',
19-
['../src/index.js', configuration]
22+
['../../src/index.js', configuration]
2023
]
2124
});
2225
}
@@ -114,7 +117,7 @@ describe('babel-plugin-css-modules-transform', () => {
114117
'transform-object-rest-spread',
115118
'transform-es2015-spread',
116119
'transform-export-extensions',
117-
['../src/index.js', {}]
120+
['../../src/index.js', {}]
118121
]
119122
});
120123

0 commit comments

Comments
 (0)