mirror of https://github.com/webpack/webpack.git
refactor(HarmonyModulesHelpers): upgrade to ES6
This commit is contained in:
parent
045219e531
commit
929a4d057e
|
|
@ -2,79 +2,84 @@
|
|||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var HarmonyModulesHelpers = exports;
|
||||
"use strict";
|
||||
|
||||
HarmonyModulesHelpers.getModuleVar = function(state, request) {
|
||||
if(!state.harmonyModules) state.harmonyModules = [];
|
||||
var idx = state.harmonyModules.indexOf(request);
|
||||
if(idx < 0) {
|
||||
idx = state.harmonyModules.length;
|
||||
state.harmonyModules.push(request);
|
||||
}
|
||||
return "__WEBPACK_IMPORTED_MODULE_" + idx + "_" + request.replace(/[^A-Za-z0-9_]/g, "_").replace(/__+/g, "_") + "__";
|
||||
};
|
||||
class HarmonyModulesHelpers {
|
||||
|
||||
HarmonyModulesHelpers.getNewModuleVar = function(state, request) {
|
||||
if(state.harmonyModules && state.harmonyModules.indexOf(request) >= 0)
|
||||
return null;
|
||||
return HarmonyModulesHelpers.getModuleVar(state, request);
|
||||
};
|
||||
|
||||
HarmonyModulesHelpers.checkModuleVar = function(state, request) {
|
||||
if(!state.harmonyModules || state.harmonyModules.indexOf(request) < 0)
|
||||
return null;
|
||||
return HarmonyModulesHelpers.getModuleVar(state, request);
|
||||
};
|
||||
|
||||
// checks if an harmony dependency is active in a module according to
|
||||
// precedence rules.
|
||||
HarmonyModulesHelpers.isActive = function(module, depInQuestion) {
|
||||
var desc = depInQuestion.describeHarmonyExport();
|
||||
if(!desc.exportedName) return true;
|
||||
var before = true;
|
||||
for(var i = 0; i < module.dependencies.length; i++) {
|
||||
var dep = module.dependencies[i];
|
||||
if(dep === depInQuestion) {
|
||||
before = false;
|
||||
continue;
|
||||
static getModuleVar(state, request) {
|
||||
if(!state.harmonyModules) state.harmonyModules = [];
|
||||
var idx = state.harmonyModules.indexOf(request);
|
||||
if(idx < 0) {
|
||||
idx = state.harmonyModules.length;
|
||||
state.harmonyModules.push(request);
|
||||
}
|
||||
if(!dep.describeHarmonyExport) continue;
|
||||
var d = dep.describeHarmonyExport();
|
||||
if(!d || !d.exportedName) continue;
|
||||
if(d.exportedName === desc.exportedName) {
|
||||
if(d.precedence < desc.precedence) {
|
||||
return false;
|
||||
return "__WEBPACK_IMPORTED_MODULE_" + idx + "_" + request.replace(/[^A-Za-z0-9_]/g, "_").replace(/__+/g, "_") + "__";
|
||||
}
|
||||
|
||||
static getNewModuleVar(state, request) {
|
||||
if(state.harmonyModules && state.harmonyModules.indexOf(request) >= 0)
|
||||
return null;
|
||||
return this.getModuleVar(state, request);
|
||||
}
|
||||
|
||||
static checkModuleVar(state, request) {
|
||||
if(!state.harmonyModules || state.harmonyModules.indexOf(request) < 0)
|
||||
return null;
|
||||
return this.getModuleVar(state, request);
|
||||
}
|
||||
|
||||
// checks if an harmony dependency is active in a module according to
|
||||
// precedence rules.
|
||||
static isActive(module, depInQuestion) {
|
||||
var desc = depInQuestion.describeHarmonyExport();
|
||||
if(!desc.exportedName) return true;
|
||||
var before = true;
|
||||
for(var i = 0; i < module.dependencies.length; i++) {
|
||||
var dep = module.dependencies[i];
|
||||
if(dep === depInQuestion) {
|
||||
before = false;
|
||||
continue;
|
||||
}
|
||||
if(d.precedence === desc.precedence && !before) {
|
||||
return false;
|
||||
if(!dep.describeHarmonyExport) continue;
|
||||
var d = dep.describeHarmonyExport();
|
||||
if(!d || !d.exportedName) continue;
|
||||
if(d.exportedName === desc.exportedName) {
|
||||
if(d.precedence < desc.precedence) {
|
||||
return false;
|
||||
}
|
||||
if(d.precedence === desc.precedence && !before) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
// get a list of named exports defined in a module
|
||||
// doesn't include * reexports.
|
||||
HarmonyModulesHelpers.getActiveExports = function(module, currentDependency) {
|
||||
var desc = currentDependency && currentDependency.describeHarmonyExport();
|
||||
var currentIndex = currentDependency ? module.dependencies.indexOf(currentDependency) : -1;
|
||||
return module.dependencies.map(function(dep, idx) {
|
||||
return {
|
||||
dep: dep,
|
||||
idx: idx
|
||||
};
|
||||
}).reduce(function(arr, data) {
|
||||
var dep = data.dep;
|
||||
if(!dep.describeHarmonyExport) return arr;
|
||||
var d = dep.describeHarmonyExport();
|
||||
if(!d) return arr;
|
||||
if(!desc || (d.precedence < desc.precedence) || (d.precedence === desc.precedence && data.idx < currentIndex)) {
|
||||
var names = [].concat(d.exportedName);
|
||||
names.forEach(function(name) {
|
||||
if(name && arr.indexOf(name) < 0)
|
||||
arr.push(name);
|
||||
});
|
||||
}
|
||||
return arr;
|
||||
}, []);
|
||||
};
|
||||
// get a list of named exports defined in a module
|
||||
// doesn't include * reexports.
|
||||
static getActiveExports(module, currentDependency) {
|
||||
var desc = currentDependency && currentDependency.describeHarmonyExport();
|
||||
var currentIndex = currentDependency ? module.dependencies.indexOf(currentDependency) : -1;
|
||||
return module.dependencies.map((dep, idx) => {
|
||||
return {
|
||||
dep: dep,
|
||||
idx: idx
|
||||
};
|
||||
}).reduce((arr, data) => {
|
||||
var dep = data.dep;
|
||||
if(!dep.describeHarmonyExport) return arr;
|
||||
var d = dep.describeHarmonyExport();
|
||||
if(!d) return arr;
|
||||
if(!desc || (d.precedence < desc.precedence) || (d.precedence === desc.precedence && data.idx < currentIndex)) {
|
||||
var names = [].concat(d.exportedName);
|
||||
names.forEach(function(name) {
|
||||
if(name && arr.indexOf(name) < 0)
|
||||
arr.push(name);
|
||||
});
|
||||
}
|
||||
return arr;
|
||||
}, []);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = HarmonyModulesHelpers;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,178 @@
|
|||
/* globals describe, it, beforeEach */
|
||||
"use strict";
|
||||
|
||||
const should = require("should");
|
||||
const HarmonyModulesHelpers = require("../lib/dependencies/HarmonyModulesHelpers");
|
||||
|
||||
describe("HarmonyModulesHelpers", () => {
|
||||
|
||||
describe("getModuleVar", () => {
|
||||
it("returns a module var without special characters", () => {
|
||||
should(HarmonyModulesHelpers.getModuleVar({}, 'w*thspeci@lcharact#rs')).be.eql("__WEBPACK_IMPORTED_MODULE_0_w_thspeci_lcharact_rs__");
|
||||
});
|
||||
|
||||
it("returns a module var without double underscore", () => {
|
||||
should(HarmonyModulesHelpers.getModuleVar({}, 'without__double__underscore')).be.eql("__WEBPACK_IMPORTED_MODULE_0_without_double_underscore__");
|
||||
});
|
||||
|
||||
it("returns a module var without spaces", () => {
|
||||
should(HarmonyModulesHelpers.getModuleVar({}, ' without spaces')).be.eql("__WEBPACK_IMPORTED_MODULE_0__without_spaces__");
|
||||
});
|
||||
|
||||
describe("when has harmonyModules information", () => {
|
||||
let request, state, harmonyModuleVarInformation;
|
||||
before(() => {
|
||||
request = 'requested module';
|
||||
state = {
|
||||
harmonyModules: ['sample test', request]
|
||||
};
|
||||
harmonyModuleVarInformation = HarmonyModulesHelpers.getModuleVar(state, request);
|
||||
});
|
||||
|
||||
it("returns a module based on request position in state harmonyModules array", () => {
|
||||
should(harmonyModuleVarInformation).be.containEql(1);
|
||||
});
|
||||
|
||||
it("returns a module based on harmonyModules information", () => {
|
||||
should(harmonyModuleVarInformation).be.eql("__WEBPACK_IMPORTED_MODULE_1_requested_module__");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("getNewModuleVar", () => {
|
||||
it("returns module var based on `getModuleVar` method", () => {
|
||||
const request = 'sample test';
|
||||
const state = {
|
||||
harmonyModules: []
|
||||
};
|
||||
should(HarmonyModulesHelpers.getNewModuleVar(state, request)).be.eql('__WEBPACK_IMPORTED_MODULE_0_sample_test__');
|
||||
});
|
||||
|
||||
it("returns null if has request information inside state harmonyModules", () => {
|
||||
const request = 'sample test';
|
||||
const state = {
|
||||
harmonyModules: [request]
|
||||
};
|
||||
should(HarmonyModulesHelpers.getNewModuleVar(state, request)).be.eql(null);
|
||||
});
|
||||
});
|
||||
|
||||
describe("checkModuleVar", () => {
|
||||
it("returns null if has current dependency and module dependency are different", () => {
|
||||
should(HarmonyModulesHelpers.checkModuleVar({
|
||||
harmonyModules: ['sample test']
|
||||
}, 'other sample test')).be.eql(null);
|
||||
});
|
||||
|
||||
it("returns null if has NOT request information inside state harmonyModules", () => {
|
||||
should(HarmonyModulesHelpers.checkModuleVar({
|
||||
harmonyModules: []
|
||||
}, 'sample test')).be.eql(null);
|
||||
});
|
||||
|
||||
it("returns module var based on `getModuleVar` method", () => {
|
||||
const request = 'sample test';
|
||||
const state = {
|
||||
harmonyModules: []
|
||||
};
|
||||
should(HarmonyModulesHelpers.getNewModuleVar(state, request)).be.eql('__WEBPACK_IMPORTED_MODULE_0_sample_test__');
|
||||
});
|
||||
});
|
||||
|
||||
describe("isActive", () => {
|
||||
it("returns `true` if module has NOT dependencies", () => {
|
||||
const currentDependency = {
|
||||
describeHarmonyExport: () => {
|
||||
return {
|
||||
exportedName: '',
|
||||
precedence: 1
|
||||
};
|
||||
}
|
||||
};
|
||||
const module = {
|
||||
dependencies: []
|
||||
};
|
||||
should(HarmonyModulesHelpers.isActive(module, currentDependency)).be.eql(true);
|
||||
});
|
||||
|
||||
it("returns `false` if module currentDependency has precedence greater than module dependency", () => {
|
||||
const currentDependency = {
|
||||
describeHarmonyExport: () => {
|
||||
return {
|
||||
exportedName: 'first dependency',
|
||||
precedence: 2
|
||||
};
|
||||
}
|
||||
};
|
||||
const module = {
|
||||
dependencies: [{
|
||||
describeHarmonyExport: () => {
|
||||
return {
|
||||
exportedName: 'first dependency',
|
||||
precedence: 1
|
||||
};
|
||||
}
|
||||
}]
|
||||
};
|
||||
should(HarmonyModulesHelpers.isActive(module, currentDependency)).be.eql(false);
|
||||
});
|
||||
|
||||
describe("getActiveExports", () => {
|
||||
it("returns an empty array with modules has no dependency", () => {
|
||||
const currentDependency = {
|
||||
describeHarmonyExport: () => {}
|
||||
};
|
||||
const module = {
|
||||
dependencies: []
|
||||
};
|
||||
should(HarmonyModulesHelpers.getActiveExports(module, currentDependency)).be.eql([]);
|
||||
});
|
||||
|
||||
it("returns an empty array if the precedence of current dependency is less than module dependency", () => {
|
||||
const currentDependency = {
|
||||
describeHarmonyExport: () => {
|
||||
return {
|
||||
exportedName: 'first dependency',
|
||||
precedence: 1
|
||||
};
|
||||
}
|
||||
};
|
||||
const module = {
|
||||
dependencies: [{
|
||||
describeHarmonyExport: () => {
|
||||
return {
|
||||
exportedName: 'first dependency',
|
||||
precedence: 2
|
||||
};
|
||||
}
|
||||
}]
|
||||
};
|
||||
should(HarmonyModulesHelpers.getActiveExports(module, currentDependency)).be.eql([]);
|
||||
});
|
||||
|
||||
it("returns an array with modules if currentDependency has precedence greater than module dependency", () => {
|
||||
const currentDependency = {
|
||||
describeHarmonyExport: () => {
|
||||
return {
|
||||
exportedName: 'first dependency',
|
||||
precedence: 2
|
||||
};
|
||||
}
|
||||
};
|
||||
const module = {
|
||||
dependencies: [{
|
||||
describeHarmonyExport: () => {
|
||||
return {
|
||||
exportedName: 'first dependency',
|
||||
precedence: 1
|
||||
};
|
||||
}
|
||||
}]
|
||||
};
|
||||
should(HarmonyModulesHelpers.getActiveExports(module, currentDependency)).be.eql(['first dependency']);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
Loading…
Reference in New Issue