NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/less/lib/less-node/url-file-manager.js
2023-09-14 14:47:11 +08:00

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;