Comparing version 0.2.1 to 0.3.0
{ | ||
"name": "espower", | ||
"version": "0.2.1", | ||
"version": "0.3.0", | ||
"main": "lib/espower.js", | ||
@@ -13,6 +13,12 @@ "ignore": [ | ||
], | ||
"dependencies": { | ||
"estraverse": "~1.5.0" | ||
}, | ||
"devDependencies": { | ||
"esprima": "~1.0.4", | ||
"escodegen": "~0.0.28" | ||
"escodegen": "~0.0.28", | ||
"mocha": "~1.14.0", | ||
"requirejs": "~2.1.5", | ||
"assert": "Jxck/assert" | ||
} | ||
} |
module.exports = function(grunt) { | ||
var pkg = grunt.file.readJSON('package.json'); | ||
(function () { | ||
var taskName; | ||
for(taskName in pkg.devDependencies) { | ||
if(taskName.substring(0, 6) === 'grunt-') { | ||
grunt.loadNpmTasks(taskName); | ||
} | ||
} | ||
})(); | ||
require('load-grunt-tasks')(grunt); | ||
grunt.initConfig({ | ||
pkg: pkg, | ||
bower: { | ||
all: { | ||
rjsConfig: 'test/rjsconfig.js', | ||
options: { | ||
baseUrl: 'test' | ||
} | ||
} | ||
}, | ||
bump: { | ||
options: { | ||
files: ['package.json', 'bower.json'], | ||
updateConfigs: ['pkg'], | ||
commit: true, | ||
commitMessage: '%VERSION%', | ||
commitFiles: ['package.json', 'bower.json'], // '-a' for all files | ||
createTag: true, | ||
tagName: 'v%VERSION%', | ||
tagMessage: '%VERSION%', | ||
push: false, | ||
pushTo: 'upstream', | ||
gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d' // options to use with '$ git describe' | ||
} | ||
}, | ||
connect: { | ||
server: { | ||
options: { | ||
port: 9001, | ||
base: '.', | ||
keepalive: true | ||
} | ||
} | ||
}, | ||
jshint: { | ||
@@ -23,2 +48,16 @@ files: [ | ||
}, | ||
mocha: { | ||
browser: { | ||
src: ['test/test-browser.html'], | ||
options: { | ||
run: true | ||
} | ||
}, | ||
amd: { | ||
src: ['test/test-amd.html'], | ||
options: { | ||
run: false | ||
} | ||
} | ||
}, | ||
mochaTest: { | ||
@@ -29,3 +68,12 @@ unit: { | ||
}, | ||
src: ['test/**/*.js'] | ||
src: ['test/**/*_test.js'] | ||
}, | ||
coverage: { | ||
options: { | ||
reporter: 'mocha-lcov-reporter', | ||
require: 'coverage/blanket', | ||
quiet: true, | ||
captureFile: 'coverage.lcov' | ||
}, | ||
src: ['test/**/*_test.js'] | ||
} | ||
@@ -36,3 +84,3 @@ }, | ||
files: ['test/**/*.js', 'lib/**/*.js'], | ||
tasks: ['test'] | ||
tasks: ['unit'] | ||
} | ||
@@ -42,3 +90,5 @@ } | ||
grunt.registerTask('test', ['jshint', 'mochaTest:unit']); | ||
grunt.registerTask('unit', ['jshint', 'mochaTest:unit']); | ||
grunt.registerTask('test', ['jshint', 'mochaTest:unit', 'mocha:browser', 'mocha:amd']); | ||
grunt.registerTask('coverage', ['mochaTest:coverage']); | ||
}; |
@@ -10,9 +10,4 @@ /** | ||
* | ||
* A part of traverse function is: | ||
* Copyright (C) 2012, 2011 Ariya Hidayat <ariya.hidayat@gmail.com> and other contributors. | ||
* Released under the BSD license. | ||
* https://github.com/ariya/esprima/raw/master/LICENSE.BSD | ||
* | ||
* A part of deepCopy function is: | ||
* Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com> and other contributors. | ||
* Copyright (C) 2012 Yusuke Suzuki (twitter: @Constellation) and other contributors. | ||
* Released under the BSD license. | ||
@@ -31,13 +26,14 @@ * https://github.com/Constellation/esmangle/raw/master/LICENSE.BSD | ||
if (typeof define === 'function' && define.amd) { | ||
define(factory); | ||
define(['estraverse'], factory); | ||
} else if (typeof exports === 'object') { | ||
module.exports = factory(); | ||
module.exports = factory(require('estraverse')); | ||
} else { | ||
root.espower = factory(); | ||
root.espower = factory(root.estraverse); | ||
} | ||
}(this, function () { | ||
}(this, function (estraverse) { | ||
'use strict'; | ||
var deepCopy, | ||
var syntax = estraverse.Syntax, | ||
deepCopy, | ||
handlers = { | ||
@@ -61,3 +57,3 @@ Identifier: function (instrumentor, node) { | ||
}); | ||
if (node.callee.type === 'MemberExpression') { | ||
if (node.callee.type === syntax.MemberExpression) { | ||
node.callee.object = instrumentor.captureRecursively(node.callee.object); | ||
@@ -71,3 +67,3 @@ return instrumentor.captureNode('funcall', node, instrumentor.propertyLocationOf(node.callee)); | ||
UnaryExpression: function (instrumentor, node) { | ||
if ((node.operator === 'typeof' || node.operator === 'delete') && node.argument.type === 'Identifier') { | ||
if ((node.operator === 'typeof' || node.operator === 'delete') && node.argument.type === syntax.Identifier) { | ||
// 'typeof Identifier' or 'delete Identifier' is not instrumented | ||
@@ -94,3 +90,3 @@ } else { | ||
node.properties.forEach(function (prop) { | ||
if (prop.type === 'Property' && prop.kind === 'init') { | ||
if (prop.type === syntax.Property && prop.kind === 'init') { | ||
prop.value = instrumentor.captureRecursively(prop.value); | ||
@@ -179,25 +175,24 @@ } | ||
result = (this.options.destructive) ? ast : deepCopy(ast); | ||
traverse(result, function (node) { | ||
var expression, i, numTargetArgs; | ||
if (typeof node.type === 'undefined') { | ||
return; | ||
estraverse.replace(result, { | ||
enter: function (currentNode, parentNode) { | ||
var numTargetArgs, indexOfCurrentArg; | ||
if (!parentNode || parentNode.type !== syntax.CallExpression) { | ||
return undefined; | ||
} | ||
if (parentNode.callee === currentNode) { | ||
return undefined; | ||
} | ||
if (!isSupportedNodeType(currentNode)) { | ||
return undefined; | ||
} | ||
numTargetArgs = numberOfTargetArguments(parentNode.callee, that.options); | ||
if (numTargetArgs === 0) { | ||
return undefined; | ||
} | ||
indexOfCurrentArg = parentNode.arguments.indexOf(currentNode); | ||
if (indexOfCurrentArg < numTargetArgs) { | ||
return that.instrumentArgument(parentNode, currentNode); | ||
} | ||
return undefined; | ||
} | ||
if (node.type === 'ExpressionStatement') { | ||
expression = node.expression; | ||
} else if (node.type === 'ReturnStatement') { | ||
expression = node.argument; | ||
} else { | ||
return; | ||
} | ||
if (expression.type !== 'CallExpression') { | ||
return; | ||
} | ||
numTargetArgs = numberOfTargetArguments(expression.callee, that.options); | ||
if (numTargetArgs === 0) { | ||
return; | ||
} | ||
for (i = 0; i < numTargetArgs; i += 1) { | ||
that.instrumentArgument(i, expression); | ||
} | ||
return; | ||
}); | ||
@@ -207,9 +202,5 @@ return result; | ||
SourceInstrumentor.prototype.instrumentArgument = function (index, callExpression) { | ||
var instrumentor = new LineInstrumentor(this.retrieveLineFor(callExpression), this.options), | ||
targetNode = callExpression.arguments[index]; | ||
if (!isSupportedNodeType(targetNode)) { | ||
return; | ||
} | ||
callExpression.arguments[index] = instrumentor.instrument(targetNode); | ||
SourceInstrumentor.prototype.instrumentArgument = function (callExpression, argumentNode) { | ||
var instrumentor = new LineInstrumentor(this.retrieveLineFor(callExpression), this.options); | ||
return instrumentor.instrument(argumentNode); | ||
}; | ||
@@ -325,3 +316,3 @@ | ||
exprArgs.push(n({ | ||
type: 'Literal', | ||
type: syntax.Literal, | ||
value: this.line | ||
@@ -332,9 +323,9 @@ })); | ||
location.properties.push(n({ | ||
type: 'Property', | ||
type: syntax.Property, | ||
key: n({ | ||
type: 'Identifier', | ||
type: syntax.Identifier, | ||
name: 'path' | ||
}), | ||
value: n({ | ||
type: 'Literal', | ||
type: syntax.Literal, | ||
value: this.options.path | ||
@@ -346,12 +337,12 @@ }), | ||
return n({ | ||
type: 'CallExpression', | ||
type: syntax.CallExpression, | ||
callee: n({ | ||
type: 'MemberExpression', | ||
type: syntax.MemberExpression, | ||
computed: false, | ||
object: n({ | ||
type: 'Identifier', | ||
type: syntax.Identifier, | ||
name: this.options.powerAssertVariableName | ||
}), | ||
property: n({ | ||
type: 'Identifier', | ||
type: syntax.Identifier, | ||
name: '_expr' | ||
@@ -367,12 +358,12 @@ }) | ||
return n({ | ||
type: 'CallExpression', | ||
type: syntax.CallExpression, | ||
callee: n({ | ||
type: 'MemberExpression', | ||
type: syntax.MemberExpression, | ||
computed: false, | ||
object: n({ | ||
type: 'Identifier', | ||
type: syntax.Identifier, | ||
name: this.options.powerAssertVariableName | ||
}), | ||
property: n({ | ||
type: 'Identifier', | ||
type: syntax.Identifier, | ||
name: '_capt' | ||
@@ -384,3 +375,3 @@ }) | ||
n({ | ||
type: 'Literal', | ||
type: syntax.Literal, | ||
value: kind | ||
@@ -396,21 +387,21 @@ }), | ||
return n({ | ||
type: 'ObjectExpression', | ||
type: syntax.ObjectExpression, | ||
properties: [ | ||
n({ | ||
type: 'Property', | ||
type: syntax.Property, | ||
key: n({ | ||
type: 'Identifier', | ||
type: syntax.Identifier, | ||
name: 'start' | ||
}), | ||
value: n({ | ||
type: 'ObjectExpression', | ||
type: syntax.ObjectExpression, | ||
properties: [ | ||
n({ | ||
type: 'Property', | ||
type: syntax.Property, | ||
key: n({ | ||
type: 'Identifier', | ||
type: syntax.Identifier, | ||
name: 'line' | ||
}), | ||
value: n({ | ||
type: 'Literal', | ||
type: syntax.Literal, | ||
value: node.loc.start.line | ||
@@ -421,9 +412,9 @@ }), | ||
n({ | ||
type: 'Property', | ||
type: syntax.Property, | ||
key: n({ | ||
type: 'Identifier', | ||
type: syntax.Identifier, | ||
name: 'column' | ||
}), | ||
value: n({ | ||
type: 'Literal', | ||
type: syntax.Literal, | ||
value: node.loc.start.column | ||
@@ -455,3 +446,3 @@ }), | ||
function detectTargetMemberExpression (callee, objName, propName) { | ||
if (callee.type !== 'MemberExpression' || callee.computed !== false) { | ||
if (callee.type !== syntax.MemberExpression || callee.computed !== false) { | ||
return false; | ||
@@ -461,3 +452,3 @@ } | ||
prop = callee.property; | ||
return ((obj.type === 'Identifier' && obj.name === objName) && (prop.type === 'Identifier' && prop.name === propName)); | ||
return ((obj.type === syntax.Identifier && obj.name === objName) && (prop.type === syntax.Identifier && prop.name === propName)); | ||
} | ||
@@ -492,3 +483,3 @@ | ||
function isAssertFunctionCall (callee, options) { | ||
return (callee.type === 'Identifier' && callee.name === options.powerAssertVariableName); | ||
return (callee.type === syntax.Identifier && callee.name === options.powerAssertVariableName); | ||
} | ||
@@ -543,21 +534,2 @@ | ||
// borrowed from esprima example | ||
// Executes visitor on the object and its children (recursively). | ||
function traverse(object, visitor) { | ||
var key, child; | ||
if (visitor.call(null, object) === false) { | ||
return; | ||
} | ||
for (key in object) { | ||
if (object.hasOwnProperty(key)) { | ||
child = object[key]; | ||
if (typeof child === 'object' && child !== null) { | ||
traverse(child, visitor); | ||
} | ||
} | ||
} | ||
} | ||
// borrowed from esmangle | ||
@@ -617,5 +589,4 @@ deepCopy = (function () { | ||
espower.deepCopy = deepCopy; | ||
espower.traverse = traverse; | ||
espower.defaultOptions = defaultOptions; | ||
return espower; | ||
})); |
{ | ||
"name": "espower", | ||
"description": "Power Assert feature instrumentor based on the Mozilla JavaScript AST", | ||
"version": "0.2.1", | ||
"version": "0.3.0", | ||
"keywords": [ | ||
@@ -27,12 +27,26 @@ "test", | ||
"scripts": { | ||
"test": "grunt test" | ||
"bower": "./node_modules/bower/bin/bower install", | ||
"test": "grunt test", | ||
"coveralls": "grunt coverage && cat ./coverage.lcov | ./node_modules/coveralls/bin/coveralls.js" | ||
}, | ||
"dependencies": { | ||
"estraverse": "~1.5.0" | ||
}, | ||
"devDependencies": { | ||
"esprima": "1.0.4", | ||
"escodegen": "~0.0.28", | ||
"esprima": "~1.0.4", | ||
"escodegen": "~1.0.1", | ||
"coffee-script-redux": "2.0.0-beta7", | ||
"grunt": "~0.4.2", | ||
"grunt-mocha-test": "~0.8.0", | ||
"grunt-mocha-test": "~0.8.1", | ||
"grunt-contrib-jshint": "~0.7.1", | ||
"grunt-contrib-watch": "~0.5.3" | ||
"grunt-contrib-watch": "~0.5.3", | ||
"grunt-bump": "~0.0.13", | ||
"mocha-lcov-reporter": "0.0.1", | ||
"blanket": "~1.1.5", | ||
"coveralls": "~2.6.0", | ||
"load-grunt-tasks": "~0.2.1", | ||
"bower": "~1.2.8", | ||
"grunt-bower-requirejs": "~0.8.0", | ||
"grunt-mocha": "~0.4.7", | ||
"grunt-contrib-connect": "~0.5.0" | ||
}, | ||
@@ -39,0 +53,0 @@ "licenses": [ |
@@ -7,2 +7,3 @@ espower | ||
[![Dependency Status](https://gemnasium.com/twada/espower.png)](https://gemnasium.com/twada/espower) | ||
[![Coverage Status](https://coveralls.io/repos/twada/espower/badge.png?branch=master)](https://coveralls.io/r/twada/espower?branch=master) | ||
@@ -9,0 +10,0 @@ |
@@ -1,7 +0,36 @@ | ||
var espower = require('../lib/espower'), | ||
esprima = require('esprima'), | ||
escodegen = require('escodegen'), | ||
assert = require('assert'); | ||
(function (root, factory) { | ||
'use strict'; | ||
var dependencies = [ | ||
'../lib/espower', | ||
'esprima', | ||
'escodegen', | ||
'estraverse', | ||
'assert' | ||
]; | ||
if (typeof define === 'function' && define.amd) { | ||
define(dependencies, factory); | ||
} else if (typeof exports === 'object') { | ||
factory.apply(root, dependencies.map(function (path) { return require(path); })); | ||
} else { | ||
factory.apply(root, dependencies.map(function (path) { | ||
var tokens = path.split('/'); | ||
return root[tokens[tokens.length - 1]]; | ||
})); | ||
} | ||
}(this, function ( | ||
espower, | ||
esprima, | ||
escodegen, | ||
estraverse, | ||
assert | ||
) { | ||
// see: https://github.com/Constellation/escodegen/issues/115 | ||
if (typeof define === 'function' && define.amd) { | ||
escodegen = window.escodegen; | ||
} | ||
describe('espower.defaultOptions()', function () { | ||
@@ -211,3 +240,3 @@ beforeEach(function () { | ||
result = espower(tree, {destructive: false, source: jsCode, path: '/path/to/baz_test.js'}); | ||
espower.traverse(result, function (node) { | ||
estraverse.traverse(result, function (node) { | ||
if (typeof node.type === 'undefined') return; | ||
@@ -219,1 +248,3 @@ assert.ok(node.loc !== 'undefined', 'type: ' + node.type); | ||
}); | ||
})); |
@@ -1,6 +0,33 @@ | ||
var espower = require('../lib/espower'), | ||
esprima = require('esprima'), | ||
escodegen = require('escodegen'), | ||
assert = require('assert'); | ||
(function (root, factory) { | ||
'use strict'; | ||
var dependencies = [ | ||
'../lib/espower', | ||
'esprima', | ||
'escodegen', | ||
'assert' | ||
]; | ||
if (typeof define === 'function' && define.amd) { | ||
define(dependencies, factory); | ||
} else if (typeof exports === 'object') { | ||
factory.apply(root, dependencies.map(function (path) { return require(path); })); | ||
} else { | ||
factory.apply(root, dependencies.map(function (path) { | ||
var tokens = path.split('/'); | ||
return root[tokens[tokens.length - 1]]; | ||
})); | ||
} | ||
}(this, function ( | ||
espower, | ||
esprima, | ||
escodegen, | ||
assert | ||
) { | ||
// see: https://github.com/Constellation/escodegen/issues/115 | ||
if (typeof define === 'function' && define.amd) { | ||
escodegen = window.escodegen; | ||
} | ||
describe('instrumentation spec', function () { | ||
@@ -26,2 +53,8 @@ function inst (jsCode, expected, options) { | ||
"assert.equal(1,0);"); | ||
inst("assert(false, 'message');", | ||
"assert(false,'message');"); | ||
inst("assert(false, messageStr);", | ||
"assert(false,messageStr);"); | ||
}); | ||
@@ -34,2 +67,5 @@ | ||
inst("assert(falsyStr, messageStr);", | ||
"assert(assert._expr(assert._capt(falsyStr,'ident',{start:{line:1,column:7}}),{start:{line:1,column:7}},'assert(falsyStr, messageStr);'),messageStr);"); | ||
inst("return assert(falsyStr);", | ||
@@ -40,2 +76,5 @@ "return assert(assert._expr(assert._capt(falsyStr,'ident',{start:{line:1,column:14}}),{start:{line:1,column:14}},'return assert(falsyStr);'));"); | ||
"assert.equal(assert._expr(assert._capt(str,'ident',{start:{line:1,column:13}}),{start:{line:1,column:13}},'assert.equal(str, anotherStr);'),assert._expr(assert._capt(anotherStr,'ident',{start:{line:1,column:18}}),{start:{line:1,column:18}},'assert.equal(str, anotherStr);'));"); | ||
inst("assert.equal(str, anotherStr, messageStr);", | ||
"assert.equal(assert._expr(assert._capt(str,'ident',{start:{line:1,column:13}}),{start:{line:1,column:13}},'assert.equal(str, anotherStr, messageStr);'),assert._expr(assert._capt(anotherStr,'ident',{start:{line:1,column:18}}),{start:{line:1,column:18}},'assert.equal(str, anotherStr, messageStr);'),messageStr);"); | ||
}); | ||
@@ -250,1 +289,3 @@ | ||
}); | ||
})); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
69487
15
1120
32
1
16
2
+ Addedestraverse@~1.5.0
+ Addedestraverse@1.5.1(transitive)