asset-resolver
Advanced tools
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); | ||
}); |
41
index.js
@@ -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" | ||
} | ||
} | ||
} |
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
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
12285
211
+ Added@sindresorhus/is@0.14.0(transitive)
+ Added@szmarczak/http-timer@1.1.2(transitive)
+ Added@types/glob@7.2.0(transitive)
+ Added@types/minimatch@5.1.2(transitive)
+ Added@types/node@22.7.4(transitive)
+ Addedajv@6.12.6(transitive)
+ Addedcacheable-request@6.1.0(transitive)
+ Addedclone-response@1.0.3(transitive)
+ Addeddebug@4.3.7(transitive)
+ Addeddefer-to-connect@1.1.3(transitive)
+ Addedend-of-stream@1.4.4(transitive)
+ Addedfast-deep-equal@3.1.3(transitive)
+ Addedfilesize@4.2.1(transitive)
+ Addedfs-extra@7.0.1(transitive)
+ Addedget-stream@4.1.05.2.0(transitive)
+ Addedglobby@9.2.0(transitive)
+ Addedgot@9.6.0(transitive)
+ Addedhar-validator@5.1.5(transitive)
+ Addedhash@0.2.1(transitive)
+ Addedhttp-cache-semantics@4.1.1(transitive)
+ Addedignore@4.0.6(transitive)
+ Addedjson-schema-traverse@0.4.1(transitive)
+ Addedkeyv@3.1.0(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedlowercase-keys@2.0.0(transitive)
+ Addedmime@2.6.0(transitive)
+ Addedms@2.1.3(transitive)
+ Addednormalize-url@4.5.1(transitive)
+ Addedoauth-sign@0.9.0(transitive)
+ Addedp-cancelable@1.1.0(transitive)
+ Addedpify@4.0.1(transitive)
+ Addedpsl@1.9.0(transitive)
+ Addedpump@3.0.2(transitive)
+ Addedpunycode@2.3.1(transitive)
+ Addedrequest@2.88.2(transitive)
+ Addedslash@2.0.0(transitive)
+ Addedto-readable-stream@1.0.0(transitive)
+ Addedtough-cookie@2.5.0(transitive)
+ Addedundici-types@6.19.8(transitive)
+ Addeduri-js@4.4.1(transitive)
- Removed@sindresorhus/is@0.7.0(transitive)
- Removedajv@5.5.2(transitive)
- Removedcacheable-request@2.1.4(transitive)
- Removedclone-response@1.0.2(transitive)
- Removedco@4.6.0(transitive)
- Removedcore-util-is@1.0.3(transitive)
- Removeddebug@3.1.0(transitive)
- Removedfast-deep-equal@1.1.0(transitive)
- Removedfilesize@3.6.1(transitive)
- Removedfrom2@2.3.0(transitive)
- Removedfs-extra@6.0.1(transitive)
- Removedget-stream@3.0.0(transitive)
- Removedglobby@8.0.1(transitive)
- Removedgot@8.3.2(transitive)
- Removedhar-validator@5.0.3(transitive)
- Removedhas-symbol-support-x@1.4.2(transitive)
- Removedhas-to-string-tag-x@1.4.1(transitive)
- Removedhash@0.2.0(transitive)
- Removedhttp-cache-semantics@3.8.1(transitive)
- Removedignore@3.3.10(transitive)
- Removedinto-stream@3.1.0(transitive)
- Removedis-object@1.0.2(transitive)
- Removedis-retry-allowed@1.2.0(transitive)
- Removedisurl@1.0.0(transitive)
- Removedjson-schema-traverse@0.3.1(transitive)
- Removedkeyv@3.0.0(transitive)
- Removedlodash@4.17.10(transitive)
- Removedlowercase-keys@1.0.0(transitive)
- Removedmime@2.3.1(transitive)
- Removednormalize-url@2.0.1(transitive)
- Removedoauth-sign@0.8.2(transitive)
- Removedobject-assign@4.1.1(transitive)
- Removedp-cancelable@0.4.1(transitive)
- Removedp-finally@1.0.0(transitive)
- Removedp-is-promise@1.1.0(transitive)
- Removedp-timeout@2.0.1(transitive)
- Removedprocess-nextick-args@2.0.1(transitive)
- Removedpunycode@1.4.1(transitive)
- Removedquery-string@5.1.1(transitive)
- Removedreadable-stream@2.3.8(transitive)
- Removedrequest@2.87.0(transitive)
- Removedsafe-buffer@5.1.2(transitive)
- Removedslash@1.0.0(transitive)
- Removedsort-keys@2.0.0(transitive)
- Removedstrict-uri-encode@1.1.0(transitive)
- Removedstring_decoder@1.1.1(transitive)
- Removedtimed-out@4.0.1(transitive)
- Removedtough-cookie@2.3.4(transitive)
- Removedurl-to-options@1.0.1(transitive)
- Removedutil-deprecate@1.0.2(transitive)
Updatedbluebird@^3.5.3
Updateddebug@^4.1.1
Updatedfilesize@^4.0.0
Updatedfs-extra@^7.0.1
Updatedglobby@^9.0.0
Updatedgot@^9.6.0
Updatedhash@^0.2.1
Updatedlodash@^4.17.11
Updatedmime@^2.4.0
Updatedrequest@^2.88.0