50 lines
1.8 KiB
JavaScript
50 lines
1.8 KiB
JavaScript
|
const isUrlRe = /^(?:https?:)?\/\//i;
|
||
|
import url from 'url';
|
||
|
let request;
|
||
|
import AbstractFileManager from '../less/environment/abstract-file-manager.js';
|
||
|
import logger from '../less/logger';
|
||
|
|
||
|
class UrlFileManager extends AbstractFileManager {
|
||
|
supports(filename, currentDirectory, options, environment) {
|
||
|
return isUrlRe.test( filename ) || isUrlRe.test(currentDirectory);
|
||
|
}
|
||
|
|
||
|
loadFile(filename, currentDirectory, options, environment) {
|
||
|
return new Promise((fulfill, reject) => {
|
||
|
if (request === undefined) {
|
||
|
try { request = require('request'); }
|
||
|
catch (e) { request = null; }
|
||
|
}
|
||
|
if (!request) {
|
||
|
reject({ type: 'File', message: 'optional dependency \'request\' required to import over http(s)\n' });
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let urlStr = isUrlRe.test( filename ) ? filename : url.resolve(currentDirectory, filename);
|
||
|
const urlObj = url.parse(urlStr);
|
||
|
|
||
|
if (!urlObj.protocol) {
|
||
|
urlObj.protocol = 'http';
|
||
|
urlStr = urlObj.format();
|
||
|
}
|
||
|
|
||
|
request.get({uri: urlStr, strictSSL: !options.insecure }, (error, res, body) => {
|
||
|
if (error) {
|
||
|
reject({ type: 'File', message: `resource '${urlStr}' gave this Error:\n ${error}\n` });
|
||
|
return;
|
||
|
}
|
||
|
if (res && res.statusCode === 404) {
|
||
|
reject({ type: 'File', message: `resource '${urlStr}' was not found\n` });
|
||
|
return;
|
||
|
}
|
||
|
if (!body) {
|
||
|
logger.warn(`Warning: Empty body (HTTP ${res.statusCode}) returned by "${urlStr}"`);
|
||
|
}
|
||
|
fulfill({ contents: body, filename: urlStr });
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default UrlFileManager;
|