opts.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. 'use strict';
  2. // This is so you can have options aliasing and defaults in one place.
  3. const defaults = require('./defaults.json');
  4. const aliases = require('./aliases.json');
  5. module.exports = (opts) => {
  6. let autoIndex = defaults.autoIndex;
  7. let showDir = defaults.showDir;
  8. let showDotfiles = defaults.showDotfiles;
  9. let humanReadable = defaults.humanReadable;
  10. let hidePermissions = defaults.hidePermissions;
  11. let si = defaults.si;
  12. let cache = defaults.cache;
  13. let gzip = defaults.gzip;
  14. let brotli = defaults.brotli;
  15. let defaultExt = defaults.defaultExt;
  16. let handleError = defaults.handleError;
  17. const headers = {};
  18. let contentType = defaults.contentType;
  19. let mimeTypes;
  20. let weakEtags = defaults.weakEtags;
  21. let weakCompare = defaults.weakCompare;
  22. let handleOptionsMethod = defaults.handleOptionsMethod;
  23. function isDeclared(k) {
  24. return typeof opts[k] !== 'undefined' && opts[k] !== null;
  25. }
  26. function setHeader(str) {
  27. const m = /^(.+?)\s*:\s*(.*)$/.exec(str);
  28. if (!m) {
  29. headers[str] = true;
  30. } else {
  31. headers[m[1]] = m[2];
  32. }
  33. }
  34. if (opts) {
  35. aliases.autoIndex.some((k) => {
  36. if (isDeclared(k)) {
  37. autoIndex = opts[k];
  38. return true;
  39. }
  40. return false;
  41. });
  42. aliases.showDir.some((k) => {
  43. if (isDeclared(k)) {
  44. showDir = opts[k];
  45. return true;
  46. }
  47. return false;
  48. });
  49. aliases.showDotfiles.some((k) => {
  50. if (isDeclared(k)) {
  51. showDotfiles = opts[k];
  52. return true;
  53. }
  54. return false;
  55. });
  56. aliases.humanReadable.some((k) => {
  57. if (isDeclared(k)) {
  58. humanReadable = opts[k];
  59. return true;
  60. }
  61. return false;
  62. });
  63. aliases.hidePermissions.some((k) => {
  64. if (isDeclared(k)) {
  65. hidePermissions = opts[k];
  66. return true;
  67. }
  68. return false;
  69. });
  70. aliases.si.some((k) => {
  71. if (isDeclared(k)) {
  72. si = opts[k];
  73. return true;
  74. }
  75. return false;
  76. });
  77. if (opts.defaultExt && typeof opts.defaultExt === 'string') {
  78. defaultExt = opts.defaultExt;
  79. }
  80. if (typeof opts.cache !== 'undefined' && opts.cache !== null) {
  81. if (typeof opts.cache === 'string') {
  82. cache = opts.cache;
  83. } else if (typeof opts.cache === 'number') {
  84. cache = `max-age=${opts.cache}`;
  85. } else if (typeof opts.cache === 'function') {
  86. cache = opts.cache;
  87. }
  88. }
  89. if (typeof opts.gzip !== 'undefined' && opts.gzip !== null) {
  90. gzip = opts.gzip;
  91. }
  92. if (typeof opts.brotli !== 'undefined' && opts.brotli !== null) {
  93. brotli = opts.brotli;
  94. }
  95. aliases.handleError.some((k) => {
  96. if (isDeclared(k)) {
  97. handleError = opts[k];
  98. return true;
  99. }
  100. return false;
  101. });
  102. aliases.cors.forEach((k) => {
  103. if (isDeclared(k) && opts[k]) {
  104. handleOptionsMethod = true;
  105. headers['Access-Control-Allow-Origin'] = '*';
  106. headers['Access-Control-Allow-Headers'] = 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since';
  107. }
  108. });
  109. aliases.headers.forEach((k) => {
  110. if (isDeclared(k)) {
  111. if (Array.isArray(opts[k])) {
  112. opts[k].forEach(setHeader);
  113. } else if (opts[k] && typeof opts[k] === 'object') {
  114. Object.keys(opts[k]).forEach((key) => {
  115. headers[key] = opts[k][key];
  116. });
  117. } else {
  118. setHeader(opts[k]);
  119. }
  120. }
  121. });
  122. aliases.contentType.some((k) => {
  123. if (isDeclared(k)) {
  124. contentType = opts[k];
  125. return true;
  126. }
  127. return false;
  128. });
  129. aliases.mimeType.some((k) => {
  130. if (isDeclared(k)) {
  131. mimeTypes = opts[k];
  132. return true;
  133. }
  134. return false;
  135. });
  136. aliases.weakEtags.some((k) => {
  137. if (isDeclared(k)) {
  138. weakEtags = opts[k];
  139. return true;
  140. }
  141. return false;
  142. });
  143. aliases.weakCompare.some((k) => {
  144. if (isDeclared(k)) {
  145. weakCompare = opts[k];
  146. return true;
  147. }
  148. return false;
  149. });
  150. aliases.handleOptionsMethod.some((k) => {
  151. if (isDeclared(k)) {
  152. handleOptionsMethod = handleOptionsMethod || opts[k];
  153. return true;
  154. }
  155. return false;
  156. });
  157. }
  158. return {
  159. cache,
  160. autoIndex,
  161. showDir,
  162. showDotfiles,
  163. humanReadable,
  164. hidePermissions,
  165. si,
  166. defaultExt,
  167. baseDir: (opts && opts.baseDir) || '/',
  168. gzip,
  169. brotli,
  170. handleError,
  171. headers,
  172. contentType,
  173. mimeTypes,
  174. weakEtags,
  175. weakCompare,
  176. handleOptionsMethod,
  177. };
  178. };