Spaces:
Sleeping
Sleeping
; | |
// 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, | |
}; | |
}; | |