Skip to content

Commit

Permalink
Add code coverage using Istanbul and Coveralls
Browse files Browse the repository at this point in the history
  • Loading branch information
chuckdumont committed Oct 3, 2017
1 parent f0b4416 commit 7adcd94
Show file tree
Hide file tree
Showing 8 changed files with 716 additions and 124 deletions.
1 change: 1 addition & 0 deletions .eslintignore
@@ -1,3 +1,4 @@
node/**
node_modules/**
test/js/**
coverage/**
1 change: 1 addition & 0 deletions .eslintrc
Expand Up @@ -20,6 +20,7 @@
"no-trailing-spaces": 2,
"no-undef": 2,
"semi": 2,
"no-debugger": "error",
# Helps ensure we don't require unused modules.
"no-unused-vars": [2, {
"args": "all",
Expand Down
1 change: 1 addition & 0 deletions .gitignore
@@ -1,2 +1,3 @@
/node_modules/
/test/js/
/coverage/
3 changes: 3 additions & 0 deletions .travis.yml
Expand Up @@ -10,3 +10,6 @@ cache:
- node_modules

sudo: false

after_success:
- npm run coveralls
117 changes: 117 additions & 0 deletions lib/DojoAMDMainTemplate.runtime.js
@@ -0,0 +1,117 @@
/*
* (C) Copyright IBM Corp. 2012, 2016 All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* globals loaderScope __webpack_require__ installedModules */

module.exports = function() {
function toUrl(name, referenceModule) {
return loaderScope.require.toUrl(name, referenceModule);
}

function toAbsMid(name, referenceModule) {
return loaderScope.require.toAbsMid(name, referenceModule);
}

// dojo require function");
function req(config, dependencies, callback) {
return contextRequire(config, dependencies, callback, 0, req);
}

function createContextRequire(moduleId) { // eslint-disable-line no-unused-vars
if (typeof(moduleId) === "number") { // Number.isInteger does not work in IE
moduleId = req.absMidsById[moduleId];
}
if (!moduleId) return req;
var result = function(a1, a2, a3) {
return contextRequire(a1, a2, a3, moduleId, req);
};
for (var p in req) {
if (req.hasOwnProperty(p)) {
result[p] = req[p];
}
}
result.toUrl = function(name) {
return toUrl(name, moduleId ? {mid: moduleId} : null);
};
result.toAbsMid = function(name) {
return toAbsMid(name, moduleId ? {mid: moduleId} : null);
};
return result;
}

function registerAbsMids(absMids) { // eslint-disable-line no-unused-vars
for (var s in absMids) {
req.absMids[s] = absMids[s];
req.absMidsById[absMids[s]] = s;
}
}

function resolveTernaryHasExpression(expr) { // eslint-disable-line no-unused-vars
// Expects an expression of the form supported by dojo/has.js loader, except that module identifiers are
// integers corresponding to webpack module ids. Returns a module reference if evaluation of the expression
// using the currently defined features returns a module id, or else undefined.

var has = req("dojo/has");
var id = has.normalize(expr, function(arg){return arg;});
return id && __webpack_require__(id) || undefined;
}

function findModule(mid, referenceModule, noInstall) {
var isRelative = mid.charAt(0) === '.';
if(/(^\/)|(\:)|(^[^!]*\.js$)/.test(mid) || (isRelative && !referenceModule)){
throw new Error('Unsupported URL: ' + mid);
}
mid = mid.split("!").map(function(segment) {
return toAbsMid(segment, referenceModule ? {mid: referenceModule} : null);
}).join("!");
var result;
if (mid in req.absMids && __webpack_require__.m[req.absMids[mid]]) {
if (noInstall) {
const module = installedModules[req.absMids[mid]];
result = module && module.l && module.exports;
} else {
result = __webpack_require__(req.absMids[mid]);
}
}
if (!result) {
throw new Error('Module not found: ' + mid);
}
return result;
}

function dojoModuleFromWebpackModule(webpackModule) { // eslint-disable-line no-unused-vars
return {exports: webpackModule.exports, i: req.absMidsById[webpackModule.i]};
}

function contextRequire(a1, a2, a3__, referenceModule, req) { // eslint-disable-line no-shadow
var type = ({}.toString).call(a1);
if (type === '[object String]') {
return findModule(a1, referenceModule, true);
} else if (type === '[object Object]') {
throw new Error('Require config is not supported by WebPack');
}
if (type === '[object Array]') {
var modules = [], callback = a2;
a1.forEach(function(mid) {
modules.push(findModule(mid, referenceModule));
});
callback.apply(this, modules);
return req;
} else {
throw new Error('Unsupported require call');
}
}

};
121 changes: 3 additions & 118 deletions lib/DojoAMDMainTemplatePlugin.js
Expand Up @@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*global __webpack_require__: false, loaderScope:false, req:false, installedModules:false */

/*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Expand All @@ -24,111 +23,14 @@

const util = require('util');
const ConcatSource = require("webpack-sources").ConcatSource;
const Template = require("webpack/lib/Template");

module.exports = class DojoAMDMainTemplatePlugin {
constructor(options) {
this.options = options;
}
apply(compilation) {
const options = this.options;
function toUrl(name, referenceModule) {
return loaderScope.require.toUrl(name, referenceModule);
}

function toAbsMid(name, referenceModule) {
return loaderScope.require.toAbsMid(name, referenceModule);
}

function createContextRequire(moduleId) {
if (typeof(moduleId) === "number") { // Number.isInteger does not work in IE
moduleId = req.absMidsById[moduleId];
}
if (!moduleId) return req;
var result = function(a1, a2, a3) {
return contextRequire(a1, a2, a3, moduleId, req);
};
for (var p in req) {
if (req.hasOwnProperty(p)) {
result[p] = req[p];
}
}
result.toUrl = function(name) {
return toUrl(name, moduleId ? {mid: moduleId} : null);
};
result.toAbsMid = function(name) {
return toAbsMid(name, moduleId ? {mid: moduleId} : null);
};
return result;
}

function registerAbsMids(absMids) {
for (var s in absMids) {
req.absMids[s] = absMids[s];
req.absMidsById[absMids[s]] = s;
}

}

function resolveTernaryHasExpression(expr) {
// Expects an expression of the form supported by dojo/has.js loader, except that module identifiers are
// integers corresponding to webpack module ids. Returns a module reference if evaluation of the expression
// using the currently defined features returns a module id, or else undefined.

var has = req("dojo/has");
var id = has.normalize(expr, function(arg){return arg;});
return id && __webpack_require__(id) || undefined;
}

function findModule(mid, referenceModule, noInstall) {
var isRelative = mid.charAt(0) === '.';
if(/(^\/)|(\:)|(^[^!]*\.js$)/.test(mid) || (isRelative && !referenceModule)){
throw new Error('Unsupported URL: ' + mid);
}
mid = mid.split("!").map(function(segment) {
return toAbsMid(segment, referenceModule ? {mid: referenceModule} : null);
}).join("!");
var result;
if (mid in req.absMids && __webpack_require__.m[req.absMids[mid]]) {
if (noInstall) {
const module = installedModules[req.absMids[mid]];
result = module && module.l && module.exports;
} else {
result = __webpack_require__(req.absMids[mid]);
}
}
if (!result) {
throw new Error('Module not found: ' + mid);
}
return result;
}

function dojoModuleFromWebpackModule(webpackModule) {
var dojoModule = {};
Object.keys(webpackModule).forEach(key => {
dojoModule[key] = webpackModule[key];
});
dojoModule.i = req.absMidsById[webpackModule.i] || webpackModule.i;
return dojoModule;
}

function contextRequire(a1, a2, a3__, referenceModule, req) {
var type = ({}.toString).call(a1);
if (type === '[object String]') {
return findModule(a1, referenceModule, true);
} else if (type === '[object Object]') {
throw new Error('Require config is not supported by WebPack');
}
if (type === '[object Array]') {
var modules = [], callback = a2;
a1.forEach(function(mid) {
modules.push(findModule(mid, referenceModule));
});
callback.apply(this, modules);
return req;
} else {
throw new Error('Unsupported require call');
}
}

// For unit testing only
compilation.mainTemplate.plugin("require", function(source) {
Expand Down Expand Up @@ -157,26 +59,9 @@ module.exports = class DojoAMDMainTemplatePlugin {

compilation.mainTemplate.plugin("bootstrap", function(source, chunk) {
const buf = [];
const runtimeSource = Template.getFunctionContent(require("./DojoAMDMainTemplate.runtime.js"));
buf.push(source);
buf.push("");
buf.push("// Dojo loader compatibility functions");
buf.push(toUrl.toString());
buf.push(toAbsMid.toString());
buf.push("");
buf.push(createContextRequire.toString());
buf.push("// dojo require function");
buf.push("var req = function(config, dependencies, callback) {");
buf.push(this.indent("return contextRequire(config, dependencies, callback, 0, req);"));
buf.push("};");
buf.push("");
buf.push(findModule.toString());
buf.push("");
buf.push(contextRequire.toString());
buf.push("");
buf.push(dojoModuleFromWebpackModule.toString());
buf.push("");
buf.push(registerAbsMids.toString());
buf.push(resolveTernaryHasExpression.toString());
buf.push(runtimeSource);
buf.push("req.toUrl = toUrl;");
buf.push("req.toAbsMid = toAbsMid;");
buf.push("req.absMids = {};");
Expand Down

0 comments on commit 7adcd94

Please sign in to comment.