123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- '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,
- };
- };
|