Skip to content

Commit 929a4d0

Browse files
refactor(HarmonyModulesHelpers): upgrade to ES6
1 parent 045219e commit 929a4d0

2 files changed

Lines changed: 249 additions & 66 deletions

File tree

lib/dependencies/HarmonyModulesHelpers.js

Lines changed: 71 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,79 +2,84 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
5-
var HarmonyModulesHelpers = exports;
5+
"use strict";
66

7-
HarmonyModulesHelpers.getModuleVar = function(state, request) {
8-
if(!state.harmonyModules) state.harmonyModules = [];
9-
var idx = state.harmonyModules.indexOf(request);
10-
if(idx < 0) {
11-
idx = state.harmonyModules.length;
12-
state.harmonyModules.push(request);
7+
class HarmonyModulesHelpers {
8+
9+
static getModuleVar(state, request) {
10+
if(!state.harmonyModules) state.harmonyModules = [];
11+
var idx = state.harmonyModules.indexOf(request);
12+
if(idx < 0) {
13+
idx = state.harmonyModules.length;
14+
state.harmonyModules.push(request);
15+
}
16+
return "__WEBPACK_IMPORTED_MODULE_" + idx + "_" + request.replace(/[^A-Za-z0-9_]/g, "_").replace(/__+/g, "_") + "__";
1317
}
14-
return "__WEBPACK_IMPORTED_MODULE_" + idx + "_" + request.replace(/[^A-Za-z0-9_]/g, "_").replace(/__+/g, "_") + "__";
15-
};
1618

17-
HarmonyModulesHelpers.getNewModuleVar = function(state, request) {
18-
if(state.harmonyModules && state.harmonyModules.indexOf(request) >= 0)
19-
return null;
20-
return HarmonyModulesHelpers.getModuleVar(state, request);
21-
};
19+
static getNewModuleVar(state, request) {
20+
if(state.harmonyModules && state.harmonyModules.indexOf(request) >= 0)
21+
return null;
22+
return this.getModuleVar(state, request);
23+
}
2224

23-
HarmonyModulesHelpers.checkModuleVar = function(state, request) {
24-
if(!state.harmonyModules || state.harmonyModules.indexOf(request) < 0)
25-
return null;
26-
return HarmonyModulesHelpers.getModuleVar(state, request);
27-
};
25+
static checkModuleVar(state, request) {
26+
if(!state.harmonyModules || state.harmonyModules.indexOf(request) < 0)
27+
return null;
28+
return this.getModuleVar(state, request);
29+
}
2830

29-
// checks if an harmony dependency is active in a module according to
30-
// precedence rules.
31-
HarmonyModulesHelpers.isActive = function(module, depInQuestion) {
32-
var desc = depInQuestion.describeHarmonyExport();
33-
if(!desc.exportedName) return true;
34-
var before = true;
35-
for(var i = 0; i < module.dependencies.length; i++) {
36-
var dep = module.dependencies[i];
37-
if(dep === depInQuestion) {
38-
before = false;
39-
continue;
40-
}
41-
if(!dep.describeHarmonyExport) continue;
42-
var d = dep.describeHarmonyExport();
43-
if(!d || !d.exportedName) continue;
44-
if(d.exportedName === desc.exportedName) {
45-
if(d.precedence < desc.precedence) {
46-
return false;
31+
// checks if an harmony dependency is active in a module according to
32+
// precedence rules.
33+
static isActive(module, depInQuestion) {
34+
var desc = depInQuestion.describeHarmonyExport();
35+
if(!desc.exportedName) return true;
36+
var before = true;
37+
for(var i = 0; i < module.dependencies.length; i++) {
38+
var dep = module.dependencies[i];
39+
if(dep === depInQuestion) {
40+
before = false;
41+
continue;
4742
}
48-
if(d.precedence === desc.precedence && !before) {
49-
return false;
43+
if(!dep.describeHarmonyExport) continue;
44+
var d = dep.describeHarmonyExport();
45+
if(!d || !d.exportedName) continue;
46+
if(d.exportedName === desc.exportedName) {
47+
if(d.precedence < desc.precedence) {
48+
return false;
49+
}
50+
if(d.precedence === desc.precedence && !before) {
51+
return false;
52+
}
5053
}
5154
}
55+
return true;
5256
}
53-
return true;
54-
};
5557

56-
// get a list of named exports defined in a module
57-
// doesn't include * reexports.
58-
HarmonyModulesHelpers.getActiveExports = function(module, currentDependency) {
59-
var desc = currentDependency && currentDependency.describeHarmonyExport();
60-
var currentIndex = currentDependency ? module.dependencies.indexOf(currentDependency) : -1;
61-
return module.dependencies.map(function(dep, idx) {
62-
return {
63-
dep: dep,
64-
idx: idx
65-
};
66-
}).reduce(function(arr, data) {
67-
var dep = data.dep;
68-
if(!dep.describeHarmonyExport) return arr;
69-
var d = dep.describeHarmonyExport();
70-
if(!d) return arr;
71-
if(!desc || (d.precedence < desc.precedence) || (d.precedence === desc.precedence && data.idx < currentIndex)) {
72-
var names = [].concat(d.exportedName);
73-
names.forEach(function(name) {
74-
if(name && arr.indexOf(name) < 0)
75-
arr.push(name);
76-
});
77-
}
78-
return arr;
79-
}, []);
80-
};
58+
// get a list of named exports defined in a module
59+
// doesn't include * reexports.
60+
static getActiveExports(module, currentDependency) {
61+
var desc = currentDependency && currentDependency.describeHarmonyExport();
62+
var currentIndex = currentDependency ? module.dependencies.indexOf(currentDependency) : -1;
63+
return module.dependencies.map((dep, idx) => {
64+
return {
65+
dep: dep,
66+
idx: idx
67+
};
68+
}).reduce((arr, data) => {
69+
var dep = data.dep;
70+
if(!dep.describeHarmonyExport) return arr;
71+
var d = dep.describeHarmonyExport();
72+
if(!d) return arr;
73+
if(!desc || (d.precedence < desc.precedence) || (d.precedence === desc.precedence && data.idx < currentIndex)) {
74+
var names = [].concat(d.exportedName);
75+
names.forEach(function(name) {
76+
if(name && arr.indexOf(name) < 0)
77+
arr.push(name);
78+
});
79+
}
80+
return arr;
81+
}, []);
82+
}
83+
}
84+
85+
module.exports = HarmonyModulesHelpers;

test/HarmonyModulesHelpers.test.js

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/* globals describe, it, beforeEach */
2+
"use strict";
3+
4+
const should = require("should");
5+
const HarmonyModulesHelpers = require("../lib/dependencies/HarmonyModulesHelpers");
6+
7+
describe("HarmonyModulesHelpers", () => {
8+
9+
describe("getModuleVar", () => {
10+
it("returns a module var without special characters", () => {
11+
should(HarmonyModulesHelpers.getModuleVar({}, 'w*thspeci@lcharact#rs')).be.eql("__WEBPACK_IMPORTED_MODULE_0_w_thspeci_lcharact_rs__");
12+
});
13+
14+
it("returns a module var without double underscore", () => {
15+
should(HarmonyModulesHelpers.getModuleVar({}, 'without__double__underscore')).be.eql("__WEBPACK_IMPORTED_MODULE_0_without_double_underscore__");
16+
});
17+
18+
it("returns a module var without spaces", () => {
19+
should(HarmonyModulesHelpers.getModuleVar({}, ' without spaces')).be.eql("__WEBPACK_IMPORTED_MODULE_0__without_spaces__");
20+
});
21+
22+
describe("when has harmonyModules information", () => {
23+
let request, state, harmonyModuleVarInformation;
24+
before(() => {
25+
request = 'requested module';
26+
state = {
27+
harmonyModules: ['sample test', request]
28+
};
29+
harmonyModuleVarInformation = HarmonyModulesHelpers.getModuleVar(state, request);
30+
});
31+
32+
it("returns a module based on request position in state harmonyModules array", () => {
33+
should(harmonyModuleVarInformation).be.containEql(1);
34+
});
35+
36+
it("returns a module based on harmonyModules information", () => {
37+
should(harmonyModuleVarInformation).be.eql("__WEBPACK_IMPORTED_MODULE_1_requested_module__");
38+
});
39+
});
40+
});
41+
42+
describe("getNewModuleVar", () => {
43+
it("returns module var based on `getModuleVar` method", () => {
44+
const request = 'sample test';
45+
const state = {
46+
harmonyModules: []
47+
};
48+
should(HarmonyModulesHelpers.getNewModuleVar(state, request)).be.eql('__WEBPACK_IMPORTED_MODULE_0_sample_test__');
49+
});
50+
51+
it("returns null if has request information inside state harmonyModules", () => {
52+
const request = 'sample test';
53+
const state = {
54+
harmonyModules: [request]
55+
};
56+
should(HarmonyModulesHelpers.getNewModuleVar(state, request)).be.eql(null);
57+
});
58+
});
59+
60+
describe("checkModuleVar", () => {
61+
it("returns null if has current dependency and module dependency are different", () => {
62+
should(HarmonyModulesHelpers.checkModuleVar({
63+
harmonyModules: ['sample test']
64+
}, 'other sample test')).be.eql(null);
65+
});
66+
67+
it("returns null if has NOT request information inside state harmonyModules", () => {
68+
should(HarmonyModulesHelpers.checkModuleVar({
69+
harmonyModules: []
70+
}, 'sample test')).be.eql(null);
71+
});
72+
73+
it("returns module var based on `getModuleVar` method", () => {
74+
const request = 'sample test';
75+
const state = {
76+
harmonyModules: []
77+
};
78+
should(HarmonyModulesHelpers.getNewModuleVar(state, request)).be.eql('__WEBPACK_IMPORTED_MODULE_0_sample_test__');
79+
});
80+
});
81+
82+
describe("isActive", () => {
83+
it("returns `true` if module has NOT dependencies", () => {
84+
const currentDependency = {
85+
describeHarmonyExport: () => {
86+
return {
87+
exportedName: '',
88+
precedence: 1
89+
};
90+
}
91+
};
92+
const module = {
93+
dependencies: []
94+
};
95+
should(HarmonyModulesHelpers.isActive(module, currentDependency)).be.eql(true);
96+
});
97+
98+
it("returns `false` if module currentDependency has precedence greater than module dependency", () => {
99+
const currentDependency = {
100+
describeHarmonyExport: () => {
101+
return {
102+
exportedName: 'first dependency',
103+
precedence: 2
104+
};
105+
}
106+
};
107+
const module = {
108+
dependencies: [{
109+
describeHarmonyExport: () => {
110+
return {
111+
exportedName: 'first dependency',
112+
precedence: 1
113+
};
114+
}
115+
}]
116+
};
117+
should(HarmonyModulesHelpers.isActive(module, currentDependency)).be.eql(false);
118+
});
119+
120+
describe("getActiveExports", () => {
121+
it("returns an empty array with modules has no dependency", () => {
122+
const currentDependency = {
123+
describeHarmonyExport: () => {}
124+
};
125+
const module = {
126+
dependencies: []
127+
};
128+
should(HarmonyModulesHelpers.getActiveExports(module, currentDependency)).be.eql([]);
129+
});
130+
131+
it("returns an empty array if the precedence of current dependency is less than module dependency", () => {
132+
const currentDependency = {
133+
describeHarmonyExport: () => {
134+
return {
135+
exportedName: 'first dependency',
136+
precedence: 1
137+
};
138+
}
139+
};
140+
const module = {
141+
dependencies: [{
142+
describeHarmonyExport: () => {
143+
return {
144+
exportedName: 'first dependency',
145+
precedence: 2
146+
};
147+
}
148+
}]
149+
};
150+
should(HarmonyModulesHelpers.getActiveExports(module, currentDependency)).be.eql([]);
151+
});
152+
153+
it("returns an array with modules if currentDependency has precedence greater than module dependency", () => {
154+
const currentDependency = {
155+
describeHarmonyExport: () => {
156+
return {
157+
exportedName: 'first dependency',
158+
precedence: 2
159+
};
160+
}
161+
};
162+
const module = {
163+
dependencies: [{
164+
describeHarmonyExport: () => {
165+
return {
166+
exportedName: 'first dependency',
167+
precedence: 1
168+
};
169+
}
170+
}]
171+
};
172+
should(HarmonyModulesHelpers.getActiveExports(module, currentDependency)).be.eql(['first dependency']);
173+
});
174+
});
175+
176+
});
177+
178+
});

0 commit comments

Comments
 (0)