204 lines
4.5 KiB
JavaScript
204 lines
4.5 KiB
JavaScript
'use strict';
|
|
|
|
// This is so you can have options aliasing and defaults in one place.
|
|
|
|
const defaults = require('./defaults.json');
|
|
const aliases = require('./aliases.json');
|
|
|
|
module.exports = (opts) => {
|
|
let autoIndex = defaults.autoIndex;
|
|
let showDir = defaults.showDir;
|
|
let showDotfiles = defaults.showDotfiles;
|
|
let humanReadable = defaults.humanReadable;
|
|
let hidePermissions = defaults.hidePermissions;
|
|
let si = defaults.si;
|
|
let cache = defaults.cache;
|
|
let gzip = defaults.gzip;
|
|
let brotli = defaults.brotli;
|
|
let defaultExt = defaults.defaultExt;
|
|
let handleError = defaults.handleError;
|
|
const headers = {};
|
|
let contentType = defaults.contentType;
|
|
let mimeTypes;
|
|
let weakEtags = defaults.weakEtags;
|
|
let weakCompare = defaults.weakCompare;
|
|
let handleOptionsMethod = defaults.handleOptionsMethod;
|
|
|
|
function isDeclared(k) {
|
|
return typeof opts[k] !== 'undefined' && opts[k] !== null;
|
|
}
|
|
|
|
function setHeader(str) {
|
|
const m = /^(.+?)\s*:\s*(.*)$/.exec(str);
|
|
if (!m) {
|
|
headers[str] = true;
|
|
} else {
|
|
headers[m[1]] = m[2];
|
|
}
|
|
}
|
|
|
|
|
|
if (opts) {
|
|
aliases.autoIndex.some((k) => {
|
|
if (isDeclared(k)) {
|
|
autoIndex = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.showDir.some((k) => {
|
|
if (isDeclared(k)) {
|
|
showDir = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.showDotfiles.some((k) => {
|
|
if (isDeclared(k)) {
|
|
showDotfiles = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.humanReadable.some((k) => {
|
|
if (isDeclared(k)) {
|
|
humanReadable = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.hidePermissions.some((k) => {
|
|
if (isDeclared(k)) {
|
|
hidePermissions = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.si.some((k) => {
|
|
if (isDeclared(k)) {
|
|
si = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
if (opts.defaultExt && typeof opts.defaultExt === 'string') {
|
|
defaultExt = opts.defaultExt;
|
|
}
|
|
|
|
if (typeof opts.cache !== 'undefined' && opts.cache !== null) {
|
|
if (typeof opts.cache === 'string') {
|
|
cache = opts.cache;
|
|
} else if (typeof opts.cache === 'number') {
|
|
cache = `max-age=${opts.cache}`;
|
|
} else if (typeof opts.cache === 'function') {
|
|
cache = opts.cache;
|
|
}
|
|
}
|
|
|
|
if (typeof opts.gzip !== 'undefined' && opts.gzip !== null) {
|
|
gzip = opts.gzip;
|
|
}
|
|
|
|
if (typeof opts.brotli !== 'undefined' && opts.brotli !== null) {
|
|
brotli = opts.brotli;
|
|
}
|
|
|
|
aliases.handleError.some((k) => {
|
|
if (isDeclared(k)) {
|
|
handleError = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.cors.forEach((k) => {
|
|
if (isDeclared(k) && opts[k]) {
|
|
handleOptionsMethod = true;
|
|
headers['Access-Control-Allow-Origin'] = '*';
|
|
headers['Access-Control-Allow-Headers'] = 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since';
|
|
}
|
|
});
|
|
|
|
aliases.headers.forEach((k) => {
|
|
if (isDeclared(k)) {
|
|
if (Array.isArray(opts[k])) {
|
|
opts[k].forEach(setHeader);
|
|
} else if (opts[k] && typeof opts[k] === 'object') {
|
|
Object.keys(opts[k]).forEach((key) => {
|
|
headers[key] = opts[k][key];
|
|
});
|
|
} else {
|
|
setHeader(opts[k]);
|
|
}
|
|
}
|
|
});
|
|
|
|
aliases.contentType.some((k) => {
|
|
if (isDeclared(k)) {
|
|
contentType = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.mimeType.some((k) => {
|
|
if (isDeclared(k)) {
|
|
mimeTypes = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.weakEtags.some((k) => {
|
|
if (isDeclared(k)) {
|
|
weakEtags = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.weakCompare.some((k) => {
|
|
if (isDeclared(k)) {
|
|
weakCompare = opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
aliases.handleOptionsMethod.some((k) => {
|
|
if (isDeclared(k)) {
|
|
handleOptionsMethod = handleOptionsMethod || opts[k];
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
return {
|
|
cache,
|
|
autoIndex,
|
|
showDir,
|
|
showDotfiles,
|
|
humanReadable,
|
|
hidePermissions,
|
|
si,
|
|
defaultExt,
|
|
baseDir: (opts && opts.baseDir) || '/',
|
|
gzip,
|
|
brotli,
|
|
handleError,
|
|
headers,
|
|
contentType,
|
|
mimeTypes,
|
|
weakEtags,
|
|
weakCompare,
|
|
handleOptionsMethod,
|
|
};
|
|
};
|