ender-builder
Advanced tools
Comparing version 0.2.0-dev to 0.3.0-dev
#!/usr/bin/env node | ||
var argsParser = require('ender-args-parser') | ||
, DependencyGraph = require('ender-dependency-graph') | ||
, enderPackage = require('ender-package') | ||
, repository = require('ender-repository') | ||
, builder = require('../') | ||
, options = argsParser.parseClean(['build'].concat(process.argv.slice(2))) | ||
@@ -13,11 +15,8 @@ | ||
DependencyGraph(options, options.packages, function (err, dependencyGraph) { | ||
enderPackage.walkDependencies(options.packages, true, true, function (err, packages) { | ||
if (err) throw err | ||
if (!options.silent) | ||
console.log(DependencyGraph.archyTree(options.packages, dependencyGraph, true)) | ||
builder(options, options.packages, dependencyGraph, function (err, filename) { | ||
builder(options, packages, function (err, filename) { | ||
if (err) throw err | ||
}) | ||
}) | ||
}) |
@@ -36,2 +36,3 @@ /*! | ||
, mu = require('mu2') | ||
, TemplateError = require('./errors').TemplateError | ||
@@ -42,18 +43,23 @@ , indent = function (str, spaces) { | ||
, packageTemplateData = function (srcPackage) { | ||
, packageTemplateData = function (options, pkg) { | ||
var templateData = { | ||
isBare: srcPackage.isBare | ||
, isExposed: srcPackage.isExposed | ||
, id: JSON.stringify(srcPackage.descriptor.name) | ||
isBare: !!pkg.bare | ||
, isExposed: (!options || | ||
!options.sandbox || | ||
(Array.isArray(options.sandbox) && | ||
options.sandbox.indexOf(pkg.name) == -1)) | ||
, name: JSON.stringify(pkg.name) | ||
, main: JSON.stringify(pkg.main) | ||
, bridge: JSON.stringify(pkg.bridge) | ||
} | ||
, main: JSON.stringify(srcPackage.main) | ||
, bridge: JSON.stringify(srcPackage.bridge) | ||
} | ||
, sourceNames = Object.keys(pkg.sources).sort() | ||
templateData.sources = srcPackage.sources.map(function (source, i) { | ||
var indentedContents = indent(source.contents, (srcPackage.isBare ? 2 : 6)) | ||
templateData.sources = sourceNames.map(function (name, i) { | ||
var indentedContents = indent(pkg.sources[name], (pkg.bare ? 2 : 6)) | ||
if (source.name == srcPackage.main) { | ||
if (name == pkg.main) { | ||
templateData.mainSource = indentedContents | ||
} else if (source.name == srcPackage.bridge) { | ||
} else if (name == pkg.bridge) { | ||
templateData.bridgeSource = indentedContents | ||
@@ -63,4 +69,4 @@ } | ||
return { | ||
comma: (i < srcPackage.sources.length - 1), | ||
name: JSON.stringify(source.name), | ||
comma: (i < sourceNames.length - 1), | ||
name: JSON.stringify(name), | ||
contents: indentedContents | ||
@@ -77,4 +83,5 @@ } | ||
context: argsParser.toContextString(options) | ||
, packageList: packages.map(function (p) { return p.identifier }).join(' ') | ||
, packages: packages.filter(function (p) { return p.sources.length }).map(packageTemplateData) | ||
, packageList: packages.map(function (pkg) { return pkg.id }).join(' ') | ||
, packages: packages.filter(function (pkg) { return Object.keys(pkg.sources).length }) | ||
.map(packageTemplateData.bind(null, options)) | ||
, sandbox: !!options.sandbox | ||
@@ -81,0 +88,0 @@ } |
@@ -30,2 +30,3 @@ /*! | ||
, MinifyError : errno.custom.createError('MinifyError') | ||
, TemplateError : errno.custom.createError('TemplateError') | ||
} |
@@ -28,18 +28,6 @@ /*! | ||
, SourceBuild = require('./source-build') | ||
, SourcePackage = require('./source-package') | ||
, build = function (options, packages, dependencyGraph, callback) { | ||
// new SourceBuild object to store each package in | ||
var srcBuild = SourceBuild.create(options) | ||
// sanitise and localise the names from relative paths | ||
, localizedPackages = dependencyGraph.localizePackageList(packages) | ||
// DependencyGraph does all the hard work of collecting and ordering dependencies for us | ||
dependencyGraph.forEachUniqueOrderedDependency(localizedPackages, function (packageName, parents, data) { | ||
// each package that we need, add it to SourceBuild as a SourcePackage object | ||
srcBuild.addPackage(SourcePackage.create(packageName, parents, data.packageJSON, options)) | ||
}) | ||
, build = function (options, packages, callback) { | ||
// write the output files! | ||
write.write(options, srcBuild, callback) | ||
write.write(options, SourceBuild.create(options, packages), callback) | ||
} | ||
@@ -49,2 +37,1 @@ | ||
module.exports.minify = require('./minify').minify | ||
extend(module.exports, require('./errors')) |
@@ -34,24 +34,13 @@ /*! | ||
var async = require('async') | ||
, argsParser = require('ender-args-parser') | ||
, extend = require('util')._extend | ||
, assemble = require('./assemble') | ||
, extend = require('util')._extend | ||
, minify = require('./minify') | ||
, SourceBuild = { | ||
init: function (options) { | ||
init: function (options, packages) { | ||
this.options = options | ||
this.packages = [] | ||
this.packages = packages | ||
return this | ||
} | ||
, addPackage: function (srcPackage) { // add a SourcePackage object for each srcPackage | ||
// insert the package at the end, unless the package is bare | ||
var i = this.packages.length | ||
if (srcPackage.isBare) | ||
for (i = 0; i < this.packages.length; i++) | ||
if (!this.packages[i].isBare) break; | ||
this.packages.splice(i, 0, srcPackage) | ||
} | ||
, asString: function (options, callback) { | ||
@@ -65,11 +54,11 @@ //options.type == plain||minified | ||
, assembleBuild = function (err) { | ||
if (err) return callback(err) // wrapped in source-package.js | ||
, assembleBuild = function (err, callback) { | ||
if (err) return callback(err) // wrapped in ender-package | ||
assemble.assemble(this.options, this.packages, finish) | ||
}.bind(this) | ||
, loadSources = function (srcPackage, callback) { | ||
srcPackage.loadSources(callback) | ||
, loadSources = function (pkg, callback) { | ||
pkg.loadSources(callback) | ||
} | ||
async.each(this.packages, loadSources, assembleBuild) | ||
@@ -87,4 +76,4 @@ } | ||
, create = function (options) { | ||
return Object.create(SourceBuild).init(options) | ||
, create = function (options, packages) { | ||
return Object.create(SourceBuild).init(options, packages) | ||
} | ||
@@ -91,0 +80,0 @@ |
{ | ||
"name" : "ender-builder" | ||
, "description" : "Build assembler for the Ender CLI" | ||
, "version" : "0.2.0-dev" | ||
, "version" : "0.3.0-dev" | ||
, "authors" : [ | ||
@@ -9,2 +9,3 @@ "Rod Vagg @rvagg <rod@vagg.org> (https://github.com/rvagg)" | ||
, "Jacob Thornton @fat <jacob@twitter.com> (https://github.com/fat)" | ||
, "Andrew McCollum (https://github.com/amccollum)" | ||
] | ||
@@ -16,6 +17,3 @@ , "keywords" : [] | ||
"ender-package-util" : "0.0.2-dev" | ||
, "ender-minify" : "~0.1.1" | ||
, "ender-args-parser" : "0.0.3-dev" | ||
, "ender-dependency-graph" : "0.0.3-dev" | ||
"ender-minify" : "~0.1.1" | ||
@@ -22,0 +20,0 @@ , "errno" : "~0.0.3" |
@@ -25,15 +25,13 @@ /*! | ||
var buster = require('bustermove') | ||
var async = require('async') | ||
, buster = require('bustermove') | ||
, assert = require('referee').assert | ||
, refute = require('referee').refute | ||
, argsParser = require('ender-args-parser') | ||
, async = require('async') | ||
, events = require('events') | ||
, mu = require('mu2') | ||
, assemble = require('../lib/assemble') | ||
, SourcePackage = require('../lib/source-package') | ||
, SourceBuild = require('../lib/source-build') | ||
, minify = require('../lib/minify') | ||
require('./common') | ||
@@ -59,7 +57,7 @@ var indent = function (str, spaces) { | ||
result += pkg.sources.map(function (source, i) { | ||
result += Object.keys(pkg.sources).sort().map(function (name, i) { | ||
return ( | ||
" " + JSON.stringify(source.name) | ||
" " + JSON.stringify(name) | ||
+ ": function (module, exports, require) {\n\n" | ||
+ indent(source.contents, 6) | ||
+ indent(pkg.sources[name], 6) | ||
+ "\n }" | ||
@@ -69,3 +67,3 @@ ) | ||
result += "\n }, " + pkg.isExposed | ||
result += "\n }, " + pkg._exposed | ||
result += ", " + JSON.stringify(pkg.main) | ||
@@ -82,5 +80,4 @@ | ||
var result = '' | ||
pkg.sources.forEach(function (source) { | ||
if (source.name == pkg.main) | ||
result = indent(source.contents, 2) | ||
Object.keys(pkg.sources).sort().forEach(function (name, i) { | ||
if (name == pkg.main) result = indent(pkg.sources[name], 2) | ||
}) | ||
@@ -92,5 +89,4 @@ return result | ||
var result = '' | ||
pkg.sources.forEach(function (source) { | ||
if (source.name == pkg.bridge) | ||
result = indent(source.contents, 2) | ||
Object.keys(pkg.sources).sort().forEach(function (name, i) { | ||
if (name == pkg.bridge) result = indent(pkg.sources[name], 2) | ||
}) | ||
@@ -103,23 +99,21 @@ return result | ||
this.createPackageMock = function (name, parents, descriptor, options) { | ||
var pkg = SourcePackage.create(name, parents, descriptor, options) | ||
this.createPackageMock = function (descriptor) { | ||
var pkg = Object.create(descriptor) | ||
pkg.loaders = {} | ||
// Normally this is an async method, but not here | ||
this.stub(pkg, 'loadSources', function (callback) { | ||
var files = descriptor.files || [] | ||
pkg.loadSources = function (callback) { | ||
var files = pkg.files || [] | ||
if (pkg.main) files.push(pkg.main) | ||
if (pkg.bridge) files.push(pkg.bridge) | ||
this.sources = files.map(function (file) { | ||
return { | ||
file: file, | ||
contents: "// " + name + "/" + file + " contents\n", | ||
name: file.replace(/\.js?$/, '') | ||
} | ||
pkg.sources = {} | ||
files.forEach(function (file) { | ||
pkg.sources[file.replace(/\.js?$/, '')] = "// " + pkg.name + "/" + file + " contents\n" | ||
}) | ||
if (callback) callback() | ||
}) | ||
} | ||
// sinon can't mock getters | ||
pkg.__defineGetter__('root', function () { | ||
@@ -129,2 +123,6 @@ return path.resolve(path.join('.', 'node_modules', name)) | ||
pkg.__defineGetter__('id', function () { | ||
return pkg.name + '@' + pkg.version | ||
}) | ||
return pkg | ||
@@ -139,8 +137,16 @@ } | ||
// This is so we can simplify the createExpectedPackage function | ||
options.packages.forEach(function (pkg) { | ||
pkg._exposed = (!options.options || | ||
!options.options.sandbox || | ||
(Array.isArray(options.options.sandbox) && | ||
options.options.sandbox.indexOf(pkg.name) == -1)) | ||
}) | ||
async.map( | ||
options.packages | ||
, function (p, cb) { p.loadSources(cb) } | ||
, function (pkg, cb) { pkg.loadSources(cb) } | ||
, function (err) { | ||
var barePackages = options.packages.filter(function (p) { return p.isBare }) | ||
, regularPackages = options.packages.filter(function (p) { return !p.isBare }) | ||
var barePackages = options.packages.filter(function (pkg) { return pkg.bare }) | ||
, regularPackages = options.packages.filter(function (pkg) { return !pkg.bare }) | ||
, expectedResult = | ||
@@ -171,18 +177,9 @@ createExpectedHeader(options.contextString, options.packageList) | ||
this.createPackageMock( | ||
'pkg1' | ||
, [] | ||
, { name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg2' | ||
, [] | ||
, { name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg3' | ||
, [] | ||
, { name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
@@ -203,18 +200,9 @@ ] | ||
this.createPackageMock( | ||
'pkg1' | ||
, [] | ||
, { name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg2' | ||
, [] | ||
, { name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg3' | ||
, [] | ||
, { name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
@@ -235,18 +223,9 @@ ] | ||
this.createPackageMock( | ||
'pkg1' | ||
, [] | ||
, { name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg2' | ||
, [] | ||
, { name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg3' | ||
, [] | ||
, { name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
@@ -267,24 +246,12 @@ ] | ||
this.createPackageMock( | ||
'pkg1' | ||
, [] | ||
, { bare: true, name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ bare: true, name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg2' | ||
, [] | ||
, { bare: true, name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ bare: true, name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg3' | ||
, [] | ||
, { name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg4' | ||
, [] | ||
, { name: 'pkg4', version: '2.3.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg4', version: '2.3.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
@@ -305,18 +272,9 @@ ] | ||
this.createPackageMock( | ||
'pkg1' | ||
, [] | ||
, { bare: true, name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ bare: true, name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg2' | ||
, [] | ||
, { name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg3' | ||
, [] | ||
, { name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
@@ -337,18 +295,9 @@ ] | ||
this.createPackageMock( | ||
'pkg1' | ||
, [] | ||
, { bare: true, name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ bare: true, name: 'pkg1', version: '0.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg2' | ||
, [] | ||
, { name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg2', version: '1.1.1', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
, this.createPackageMock( | ||
'pkg3' | ||
, [] | ||
, { name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
, options | ||
{ name: 'pkg3', version: '1.2.3', main: 'lib/main', bridge: 'lib/bridge' } | ||
) | ||
@@ -355,0 +304,0 @@ ] |
@@ -31,3 +31,2 @@ /*! | ||
require('./common') | ||
@@ -34,0 +33,0 @@ buster.testCase('Minify', { |
@@ -29,34 +29,17 @@ /*! | ||
, refute = require('referee').refute | ||
, path = require('path') | ||
, argsParser = require('ender-args-parser') | ||
, LocalPackage = require('ender-package').LocalPackage | ||
, assemble = require('../lib/assemble') | ||
, SourcePackage = require('../lib/source-package') | ||
, SourceBuild = require('../lib/source-build') | ||
, minify = require('../lib/minify') | ||
, path = require('path') | ||
require('./common') | ||
var createExpectedHeader = function (context, packageList) { | ||
return [ | ||
"/*!" | ||
, " * =============================================================" | ||
, " * Ender: open module JavaScript framework (https://ender.no.de)" | ||
, " * Build: ender " + context | ||
, " * Packages: " + packageList | ||
, " * =============================================================" | ||
, " */" | ||
].join('\n') + '\n\n' | ||
} | ||
buster.testCase('Source build', { | ||
'setUp': function () { | ||
this.createPackageMock = function (name, parents, descriptor, options) { | ||
var pkg = SourcePackage.create(name, parents, descriptor, options) | ||
this.mock(pkg).expects('loadSources').once().callsArgWith(0, null) | ||
// sinon can't mock getters | ||
pkg.__defineGetter__('root', function () { | ||
return path.resolve(path.join('.', 'node_modules', name)) | ||
}) | ||
this.createPackageMock = function (name) { | ||
var pkg = LocalPackage.create(path.resolve(path.join('node_modules', name))) | ||
this.stub(pkg, 'loadSources').callsArgWith(0, null) | ||
return pkg | ||
@@ -68,14 +51,12 @@ } | ||
'plain': function (done) { | ||
var pkg1 = this.createPackageMock('pkg1') | ||
, pkg2 = this.createPackageMock('pkg2') | ||
, pkg3 = this.createPackageMock('pkg3') | ||
var packagesArg = [ | ||
this.createPackageMock('pkg1') | ||
, this.createPackageMock('pkg2') | ||
, this.createPackageMock('pkg3') | ||
] | ||
, optionsArg = { options: 1 } | ||
, srcBuild = SourceBuild.create(optionsArg) | ||
, srcBuild = SourceBuild.create(optionsArg, packagesArg) | ||
, mockMinify = this.mock(minify) | ||
, mockAssemble = this.mock(assemble) | ||
srcBuild.addPackage(pkg1) | ||
srcBuild.addPackage(pkg2) | ||
srcBuild.addPackage(pkg3) | ||
mockAssemble.expects('assemble').once().withArgs(optionsArg, srcBuild.packages).callsArgWith(2, null, 'unminified') | ||
@@ -92,14 +73,12 @@ mockMinify.expects('minify').never() | ||
, 'minify': function (done) { | ||
var pkg1 = this.createPackageMock('pkg1') | ||
, pkg2 = this.createPackageMock('pkg2') | ||
, pkg3 = this.createPackageMock('pkg3') | ||
var packagesArg = [ | ||
this.createPackageMock('pkg1') | ||
, this.createPackageMock('pkg2') | ||
, this.createPackageMock('pkg3') | ||
] | ||
, optionsArg = { options: 1 } | ||
, srcBuild = SourceBuild.create(optionsArg) | ||
, srcBuild = SourceBuild.create(optionsArg, packagesArg) | ||
, mockMinify = this.mock(minify) | ||
, mockAssemble = this.mock(assemble) | ||
srcBuild.addPackage(pkg1) | ||
srcBuild.addPackage(pkg2) | ||
srcBuild.addPackage(pkg3) | ||
mockAssemble.expects('assemble').once().withArgs(optionsArg, srcBuild.packages).callsArgWith(2, null, 'unminified') | ||
@@ -119,21 +98,19 @@ mockMinify.expects('minify').once().withArgs(optionsArg, 'unminified').callsArgWith(2, null, 'minified') | ||
, 'minify extends options for each package (externs)': function (done) { | ||
var pkg1 = this.createPackageMock('pkg1') | ||
, pkg2 = this.createPackageMock('pkg2') | ||
, pkg3 = this.createPackageMock('pkg3') | ||
var packagesArg = [ | ||
this.createPackageMock('pkg1') | ||
, this.createPackageMock('pkg2') | ||
, this.createPackageMock('pkg3') | ||
] | ||
, optionsArg = { options: 1, externs: [ 'extern0' ] } | ||
, expectedOptionsArg | ||
, srcBuild = SourceBuild.create(optionsArg) | ||
, srcBuild = SourceBuild.create(optionsArg, packagesArg) | ||
, mockMinify = this.mock(minify) | ||
, mockAssemble = this.mock(assemble) | ||
srcBuild.addPackage(pkg1) | ||
srcBuild.addPackage(pkg2) | ||
srcBuild.addPackage(pkg3) | ||
// sort of mock out the extendOptions() function | ||
pkg2.extendOptions = function (options) { | ||
packagesArg[1].extendOptions = function (options) { | ||
options.externs.push('extern1') | ||
options.externs.push('extern2') | ||
} | ||
pkg3.extendOptions = function (options) { | ||
packagesArg[2].extendOptions = function (options) { | ||
options.externs.push('extern3') | ||
@@ -153,19 +130,2 @@ } | ||
} | ||
, 'addPackage': { | ||
'bare package ordering': function (done) { | ||
var pkg1 = this.createPackageMock('pkg1') | ||
, pkg2 = this.createPackageMock('pkg2', null, { bare: true }) | ||
, pkg3 = this.createPackageMock('pkg3', null, { bare: true }) | ||
, optionsArg = { options: 1 } | ||
, srcBuild = SourceBuild.create(optionsArg) | ||
srcBuild.addPackage(pkg1) | ||
srcBuild.addPackage(pkg2) | ||
srcBuild.addPackage(pkg3) | ||
assert.equals(srcBuild.packages, [ pkg2, pkg3, pkg1 ]) | ||
done() | ||
} | ||
} | ||
}) |
@@ -34,2 +34,3 @@ /*! | ||
buster.testCase('Write', { | ||
@@ -36,0 +37,0 @@ 'test standard write': function (done) { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
5
3
0
49782
20
888
- Removedender-args-parser@0.0.3-dev
- Removedender-dependency-graph@0.0.3-dev
- Removedender-package-util@0.0.2-dev
- Removedarchy@0.0.2(transitive)
- Removedasync@0.1.22(transitive)
- Removedcolors@0.6.2(transitive)
- Removedender-dependency-graph@0.0.3-dev(transitive)
- Removedender-package-util@0.0.2-dev(transitive)
- Removedmkdirp@0.3.5(transitive)