Socket
Socket
Sign inDemoInstall

asset-resolver

Package Overview
Dependencies
Maintainers
1
Versions
37
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

asset-resolver - npm Package Compare versions

Comparing version 1.0.3 to 2.0.0

48

cli.js

@@ -6,23 +6,29 @@ #!/usr/bin/env node

const cli = meow({
help: [
'Usage',
'asset-resolver [input]',
'',
'Options',
' -b --base List of directories/urls where we should start looking for assets. [Default: process.cwd()]',
'',
'Examples',
'$ asset-resolver \'my.svg\' -b \'some/directory\' -b \'http://some.domain/assets\'',
'<?xml version="1.0" encoding="UTF-8" standalone="no"?>',
'<svg>',
'...',
'</svg>'
]
}, {alias: {b: 'base'}});
const cli = meow(
{
help: [
'Usage',
'asset-resolver [input]',
'',
'Options',
' -b --base List of directories/urls where we should start looking for assets. [Default: process.cwd()]',
'',
'Examples',
"$ asset-resolver 'my.svg' -b 'some/directory' -b 'http://some.domain/assets'",
'<?xml version="1.0" encoding="UTF-8" standalone="no"?>',
'<svg>',
'...',
'</svg>'
]
},
{alias: {b: 'base'}}
);
resolver.getResource(cli.input[0], cli.flags).then(resource => {
console.log(resource.contents);
}).catch(err => {
console.error(err.message || err);
});
resolver
.getResource(cli.input[0], cli.flags)
.then(resource => {
console.log(resource.contents);
})
.catch(err => {
console.error(err.message || err);
});

@@ -10,23 +10,28 @@ 'use strict';

module.exports.getResource = function (file, opts) {
opts = defaults(opts || {}, {
base: [process.cwd()],
filter() {
return true;
}
});
module.exports.getResource = function(file, opts) {
opts = defaults(opts || {}, {
base: [process.cwd()],
filter() {
return true;
}
});
if (typeof opts.base === 'string') {
opts.base = [opts.base];
}
if (typeof opts.base === 'string') {
opts.base = [opts.base];
}
opts.base = resolver.glob(toarray(opts.base));
opts.base = resolver.glob(toarray(opts.base));
return Bluebird.any(map(opts.base, base => { // eslint-disable-line promise/valid-params
return resolver.getResource(base, file, opts);
})).catch(Bluebird.AggregateError, errs => {
const msg = ['The file "' + file + '" could not be resolved because of:'].concat(map(errs, 'message'));
debug(msg);
return Bluebird.reject(new Error(msg.join(os.EOL)));
});
return Bluebird.any(
map(opts.base, base => {
// eslint-disable-line promise/valid-params
return resolver.getResource(base, file, opts);
})
).catch(Bluebird.AggregateError, errs => {
const msg = [
'The file "' + file + '" could not be resolved because of:'
].concat(map(errs, 'message'));
debug(msg);
return Bluebird.reject(new Error(msg.join(os.EOL)));
});
};

@@ -16,19 +16,21 @@ 'use strict';

function isUrl(resource) {
return /(^\/\/)|(:\/\/)/.test(resource);
return /(^\/\/)|(:\/\/)/.test(resource);
}
function handle(filter) {
return function (resource) {
debug('handle request', resource.path);
return Bluebird.resolve(resource)
.then(filter)
.then(result => {
if (!result) {
debug('FAILED');
return Bluebird.reject(new Error(resource.path + ' rejected by filter'));
}
debug('Passed filter:', resource.path);
return resource;
});
};
return function(resource) {
debug('handle request', resource.path);
return Bluebird.resolve(resource)
.then(filter)
.then(result => {
if (!result) {
debug('FAILED');
return Bluebird.reject(
new Error(resource.path + ' rejected by filter')
);
}
debug('Passed filter:', resource.path);
return resource;
});
};
}

@@ -42,3 +44,4 @@

*/
const token = (user, pass) => Buffer.from([user, pass].join(':')).toString('base64');
const token = (user, pass) =>
Buffer.from([user, pass].join(':')).toString('base64');

@@ -52,36 +55,37 @@ /**

function requestAsync(resource, opts = {}) {
const settings = {
followRedirect: true,
encoding: null,
rejectUnauthorized: false
};
const settings = {
followRedirect: true,
encoding: null,
rejectUnauthorized: false
};
if (opts.user && opts.pass) {
settings.headers = {Authorization: 'Basic ' + token(opts.user, opts.pass)};
}
if (opts.user && opts.pass) {
settings.headers = {Authorization: 'Basic ' + token(opts.user, opts.pass)};
}
return new Bluebird((resolve, reject) => {
// Handle protocol-relative urls
resource = url.resolve('http://te.st', resource);
request(resource, settings, (err, resp, body) => {
let msg;
if (err) {
debug('Url failed:', err.message || err);
return reject(err);
}
if (resp.statusCode !== 200) {
msg = 'Wrong status code ' + resp.statusCode + ' for ' + resource;
debug(msg);
return reject(new Error(msg));
}
return new Bluebird((resolve, reject) => {
// Handle protocol-relative urls
resource = url.resolve('http://te.st', resource);
request(resource, settings, (err, resp, body) => {
let msg;
if (err) {
debug('Url failed:', err.message || err);
return reject(err);
}
if (resp.statusCode !== 200) {
msg = 'Wrong status code ' + resp.statusCode + ' for ' + resource;
debug(msg);
return reject(new Error(msg));
}
const mimeType = result(resp, 'headers.content-type') || mime.getType(resource);
const mimeType =
result(resp, 'headers.content-type') || mime.getType(resource);
resolve({
contents: body,
path: resource,
mime: mimeType
});
});
});
resolve({
contents: body,
path: resource,
mime: mimeType
});
});
});
}

@@ -95,64 +99,72 @@

function readAsync(resource) {
return fs.readFile(resource).then(body => {
const mimeType = mime.getType(resource);
return fs.readFile(resource).then(body => {
const mimeType = mime.getType(resource);
debug('Fetched:', resource);
debug('Fetched:', resource);
return Bluebird.resolve({
contents: body,
path: resource,
mime: mimeType
});
});
return Bluebird.resolve({
contents: body,
path: resource,
mime: mimeType
});
});
}
function join(base, file) {
if (isUrl(file)) {
return file;
}
if (isUrl(base)) {
if (!/\/$/.test(base)) {
base += '/';
}
return url.resolve(base, file);
}
if (isUrl(file)) {
return file;
}
if (isUrl(base)) {
if (!/\/$/.test(base)) {
base += '/';
}
return url.resolve(base, file);
}
return path.join(base, file);
return path.join(base, file);
}
function glob(base) {
return reduce(base, (res, val) => {
if (isUrl(val)) {
res.push(val);
return res;
}
return reduce(
base,
(res, val) => {
if (isUrl(val)) {
res.push(val);
return res;
}
if (fs.existsSync(val) && fs.lstatSync(val).isDirectory()) {
res.push(val);
return res;
}
if (fs.existsSync(val) && fs.lstatSync(val).isDirectory()) {
res.push(val);
return res;
}
let files = [];
try {
files = globby.sync([val], {nodir: false, onlyDirectories: true});
} catch (err) {
console.error(err.message);
}
let files = [];
try {
files = globby.sync([val], {
nodir: false,
onlyDirectories: true,
cwd: process.cwd()
});
} catch (err) {
console.error(err.message);
}
return res.concat(files);
}, []);
return res.concat(files);
},
[]
);
}
function getResource(base, file, opts) {
const resource = join(base, file);
if (cache[resource]) {
return cache[resource].then(handle(opts.filter));
}
const resource = join(base, file);
if (cache[resource]) {
return cache[resource].then(handle(opts.filter));
}
if (isUrl(resource)) {
cache[resource] = requestAsync(resource, opts);
} else {
cache[resource] = readAsync(resource, opts);
}
return cache[resource].then(handle(opts.filter));
if (isUrl(resource)) {
cache[resource] = requestAsync(resource, opts);
} else {
cache[resource] = readAsync(resource, opts);
}
return cache[resource].then(handle(opts.filter));
}

@@ -159,0 +171,0 @@

{
"name": "asset-resolver",
"version": "1.0.3",
"version": "2.0.0",
"description": "Find an asset in a set of locations",

@@ -14,3 +14,3 @@ "license": "MIT",

"engines": {
"node": ">= 6"
"node": ">= 8.6"
},

@@ -31,23 +31,23 @@ "scripts": {

"dependencies": {
"bluebird": "^3.5.1",
"debug": "3.1.0",
"filesize": "^3.5.11",
"fs-extra": "^6.0.1",
"globby": "8.0.1",
"got": "^8.3.1",
"hash": "0.2.0",
"lodash": "4.17.10",
"bluebird": "^3.5.3",
"debug": "^4.1.1",
"filesize": "^4.0.0",
"fs-extra": "^7.0.1",
"globby": "^9.0.0",
"got": "^9.6.0",
"hash": "^0.2.1",
"lodash": "^4.17.11",
"meow": "5.0.0",
"mime": "2.3.1",
"mime": "^2.4.0",
"object": "0.1.1",
"request": "2.87.0"
"request": "^2.88.0"
},
"devDependencies": {
"ava": "0.25.0",
"coveralls": "^3.0.0",
"es6-promise": "^4.1.1",
"finalhandler": "^1.1.0",
"coveralls": "^3.0.2",
"es6-promise": "^4.2.5",
"finalhandler": "^1.1.1",
"get-port": "^3.2.0",
"nyc": "12.0.2",
"serve-static": "^1.13.1",
"nyc": "^13.1.0",
"serve-static": "^1.13.2",
"xo": "0.21.1"

@@ -58,4 +58,11 @@ },

"node"
]
],
"space": 2,
"prettier": true,
"rules": {
"promise/valid-params": "off",
"promise/prefer-await-to-then": "off",
"capitalized-comments": "off"
}
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc