es6-crawler-detect 3.1.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +2 -1
- package/.eslintignore +6 -0
- package/.eslintrc.json +30 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +11 -8
- package/.github/ISSUE_TEMPLATE/feature_request.md +1 -1
- package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +29 -0
- package/.prettierrc.json +5 -0
- package/README.md +27 -17
- package/dist/main.bundle.js +1 -1
- package/example/node/dist/crawler.min.js +1 -1
- package/example/node/node_modules/.bin/mime +15 -0
- package/example/node/node_modules/.bin/mime.cmd +7 -0
- package/example/node/node_modules/.yarn-integrity +67 -0
- package/example/node/node_modules/accepts/HISTORY.md +236 -0
- package/example/node/node_modules/accepts/LICENSE +23 -0
- package/example/node/node_modules/accepts/README.md +142 -0
- package/example/node/node_modules/accepts/index.js +238 -0
- package/example/node/node_modules/accepts/package.json +47 -0
- package/example/node/node_modules/array-flatten/LICENSE +21 -0
- package/example/node/node_modules/array-flatten/README.md +43 -0
- package/example/node/node_modules/array-flatten/array-flatten.js +64 -0
- package/example/node/node_modules/array-flatten/package.json +39 -0
- package/example/node/node_modules/body-parser/HISTORY.md +624 -0
- package/example/node/node_modules/body-parser/LICENSE +23 -0
- package/example/node/node_modules/body-parser/README.md +456 -0
- package/example/node/node_modules/body-parser/index.js +157 -0
- package/example/node/node_modules/body-parser/lib/read.js +181 -0
- package/example/node/node_modules/body-parser/lib/types/json.js +230 -0
- package/example/node/node_modules/body-parser/lib/types/raw.js +101 -0
- package/example/node/node_modules/body-parser/lib/types/text.js +121 -0
- package/example/node/node_modules/body-parser/lib/types/urlencoded.js +284 -0
- package/example/node/node_modules/body-parser/package.json +52 -0
- package/example/node/node_modules/bytes/History.md +92 -0
- package/example/node/node_modules/bytes/LICENSE +23 -0
- package/example/node/node_modules/bytes/Readme.md +152 -0
- package/example/node/node_modules/bytes/index.js +166 -0
- package/example/node/node_modules/bytes/package.json +42 -0
- package/example/node/node_modules/content-disposition/HISTORY.md +60 -0
- package/example/node/node_modules/content-disposition/LICENSE +22 -0
- package/example/node/node_modules/content-disposition/README.md +142 -0
- package/example/node/node_modules/content-disposition/index.js +458 -0
- package/example/node/node_modules/content-disposition/package.json +44 -0
- package/example/node/node_modules/content-type/HISTORY.md +24 -0
- package/example/node/node_modules/content-type/LICENSE +22 -0
- package/example/node/node_modules/content-type/README.md +92 -0
- package/example/node/node_modules/content-type/index.js +222 -0
- package/example/node/node_modules/content-type/package.json +40 -0
- package/example/node/node_modules/cookie/HISTORY.md +128 -0
- package/example/node/node_modules/cookie/LICENSE +24 -0
- package/example/node/node_modules/cookie/README.md +257 -0
- package/example/node/node_modules/cookie/index.js +202 -0
- package/example/node/node_modules/cookie/package.json +40 -0
- package/example/node/node_modules/cookie-signature/History.md +38 -0
- package/example/node/node_modules/cookie-signature/Readme.md +42 -0
- package/example/node/node_modules/cookie-signature/index.js +51 -0
- package/example/node/node_modules/cookie-signature/package.json +18 -0
- package/example/node/node_modules/debug/.coveralls.yml +1 -0
- package/example/node/node_modules/debug/.eslintrc +11 -0
- package/example/node/node_modules/debug/.travis.yml +14 -0
- package/example/node/node_modules/debug/CHANGELOG.md +362 -0
- package/example/node/node_modules/debug/LICENSE +19 -0
- package/example/node/node_modules/debug/Makefile +50 -0
- package/example/node/node_modules/debug/README.md +312 -0
- package/example/node/node_modules/debug/component.json +19 -0
- package/example/node/node_modules/debug/karma.conf.js +70 -0
- package/example/node/node_modules/debug/node.js +1 -0
- package/example/node/node_modules/debug/package.json +49 -0
- package/example/node/node_modules/debug/src/browser.js +185 -0
- package/example/node/node_modules/debug/src/debug.js +202 -0
- package/example/node/node_modules/debug/src/index.js +10 -0
- package/example/node/node_modules/debug/src/inspector-log.js +15 -0
- package/example/node/node_modules/debug/src/node.js +248 -0
- package/example/node/node_modules/depd/History.md +96 -0
- package/example/node/node_modules/depd/LICENSE +22 -0
- package/example/node/node_modules/depd/Readme.md +280 -0
- package/example/node/node_modules/depd/index.js +522 -0
- package/example/node/node_modules/depd/lib/browser/index.js +77 -0
- package/example/node/node_modules/depd/lib/compat/callsite-tostring.js +103 -0
- package/example/node/node_modules/depd/lib/compat/event-listener-count.js +22 -0
- package/example/node/node_modules/depd/lib/compat/index.js +79 -0
- package/example/node/node_modules/depd/package.json +41 -0
- package/example/node/node_modules/destroy/LICENSE +22 -0
- package/example/node/node_modules/destroy/README.md +60 -0
- package/example/node/node_modules/destroy/index.js +75 -0
- package/example/node/node_modules/destroy/package.json +37 -0
- package/example/node/node_modules/ee-first/LICENSE +22 -0
- package/example/node/node_modules/ee-first/README.md +80 -0
- package/example/node/node_modules/ee-first/index.js +95 -0
- package/example/node/node_modules/ee-first/package.json +29 -0
- package/example/node/node_modules/encodeurl/HISTORY.md +14 -0
- package/example/node/node_modules/encodeurl/LICENSE +22 -0
- package/example/node/node_modules/encodeurl/README.md +128 -0
- package/example/node/node_modules/encodeurl/index.js +60 -0
- package/example/node/node_modules/encodeurl/package.json +40 -0
- package/example/node/node_modules/escape-html/LICENSE +24 -0
- package/example/node/node_modules/escape-html/Readme.md +43 -0
- package/example/node/node_modules/escape-html/index.js +78 -0
- package/example/node/node_modules/escape-html/package.json +24 -0
- package/example/node/node_modules/etag/HISTORY.md +83 -0
- package/example/node/node_modules/etag/LICENSE +22 -0
- package/example/node/node_modules/etag/README.md +159 -0
- package/example/node/node_modules/etag/index.js +131 -0
- package/example/node/node_modules/etag/package.json +47 -0
- package/example/node/node_modules/express/History.md +3510 -0
- package/example/node/node_modules/express/LICENSE +24 -0
- package/example/node/node_modules/express/Readme.md +158 -0
- package/example/node/node_modules/express/index.js +11 -0
- package/example/node/node_modules/express/lib/application.js +644 -0
- package/example/node/node_modules/express/lib/express.js +116 -0
- package/example/node/node_modules/express/lib/middleware/init.js +43 -0
- package/example/node/node_modules/express/lib/middleware/query.js +47 -0
- package/example/node/node_modules/express/lib/request.js +525 -0
- package/example/node/node_modules/express/lib/response.js +1147 -0
- package/example/node/node_modules/express/lib/router/index.js +668 -0
- package/example/node/node_modules/express/lib/router/layer.js +181 -0
- package/example/node/node_modules/express/lib/router/route.js +216 -0
- package/example/node/node_modules/express/lib/utils.js +302 -0
- package/example/node/node_modules/express/lib/view.js +182 -0
- package/example/node/node_modules/express/package.json +99 -0
- package/example/node/node_modules/finalhandler/HISTORY.md +187 -0
- package/example/node/node_modules/finalhandler/LICENSE +22 -0
- package/example/node/node_modules/finalhandler/README.md +148 -0
- package/example/node/node_modules/finalhandler/index.js +331 -0
- package/example/node/node_modules/finalhandler/package.json +45 -0
- package/example/node/node_modules/forwarded/HISTORY.md +21 -0
- package/example/node/node_modules/forwarded/LICENSE +22 -0
- package/example/node/node_modules/forwarded/README.md +57 -0
- package/example/node/node_modules/forwarded/index.js +90 -0
- package/example/node/node_modules/forwarded/package.json +45 -0
- package/example/node/node_modules/fresh/HISTORY.md +70 -0
- package/example/node/node_modules/fresh/LICENSE +23 -0
- package/example/node/node_modules/fresh/README.md +119 -0
- package/example/node/node_modules/fresh/index.js +137 -0
- package/example/node/node_modules/fresh/package.json +46 -0
- package/example/node/node_modules/http-errors/HISTORY.md +165 -0
- package/example/node/node_modules/http-errors/LICENSE +23 -0
- package/example/node/node_modules/http-errors/README.md +169 -0
- package/example/node/node_modules/http-errors/index.js +299 -0
- package/example/node/node_modules/http-errors/package.json +49 -0
- package/example/node/node_modules/iconv-lite/Changelog.md +162 -0
- package/example/node/node_modules/iconv-lite/LICENSE +21 -0
- package/example/node/node_modules/iconv-lite/README.md +156 -0
- package/example/node/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
- package/example/node/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
- package/example/node/node_modules/iconv-lite/encodings/index.js +22 -0
- package/example/node/node_modules/iconv-lite/encodings/internal.js +188 -0
- package/example/node/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
- package/example/node/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
- package/example/node/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
- package/example/node/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
- package/example/node/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
- package/example/node/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
- package/example/node/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
- package/example/node/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
- package/example/node/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
- package/example/node/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
- package/example/node/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
- package/example/node/node_modules/iconv-lite/encodings/utf16.js +177 -0
- package/example/node/node_modules/iconv-lite/encodings/utf7.js +290 -0
- package/example/node/node_modules/iconv-lite/lib/bom-handling.js +52 -0
- package/example/node/node_modules/iconv-lite/lib/extend-node.js +217 -0
- package/example/node/node_modules/iconv-lite/lib/index.d.ts +24 -0
- package/example/node/node_modules/iconv-lite/lib/index.js +153 -0
- package/example/node/node_modules/iconv-lite/lib/streams.js +121 -0
- package/example/node/node_modules/iconv-lite/package.json +46 -0
- package/example/node/node_modules/inherits/LICENSE +16 -0
- package/example/node/node_modules/inherits/README.md +42 -0
- package/example/node/node_modules/inherits/inherits.js +9 -0
- package/example/node/node_modules/inherits/inherits_browser.js +27 -0
- package/example/node/node_modules/inherits/package.json +29 -0
- package/example/node/node_modules/ipaddr.js/LICENSE +19 -0
- package/example/node/node_modules/ipaddr.js/README.md +233 -0
- package/example/node/node_modules/ipaddr.js/ipaddr.min.js +1 -0
- package/example/node/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
- package/example/node/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
- package/example/node/node_modules/ipaddr.js/package.json +35 -0
- package/example/node/node_modules/media-typer/HISTORY.md +22 -0
- package/example/node/node_modules/media-typer/LICENSE +22 -0
- package/example/node/node_modules/media-typer/README.md +81 -0
- package/example/node/node_modules/media-typer/index.js +270 -0
- package/example/node/node_modules/media-typer/package.json +26 -0
- package/example/node/node_modules/merge-descriptors/HISTORY.md +21 -0
- package/example/node/node_modules/merge-descriptors/LICENSE +23 -0
- package/example/node/node_modules/merge-descriptors/README.md +48 -0
- package/example/node/node_modules/merge-descriptors/index.js +60 -0
- package/example/node/node_modules/merge-descriptors/package.json +32 -0
- package/example/node/node_modules/methods/HISTORY.md +29 -0
- package/example/node/node_modules/methods/LICENSE +24 -0
- package/example/node/node_modules/methods/README.md +51 -0
- package/example/node/node_modules/methods/index.js +69 -0
- package/example/node/node_modules/methods/package.json +36 -0
- package/example/node/node_modules/mime/CHANGELOG.md +164 -0
- package/example/node/node_modules/mime/LICENSE +21 -0
- package/example/node/node_modules/mime/README.md +90 -0
- package/example/node/node_modules/mime/cli.js +8 -0
- package/example/node/node_modules/mime/mime.js +108 -0
- package/example/node/node_modules/mime/package.json +44 -0
- package/example/node/node_modules/mime/src/build.js +53 -0
- package/example/node/node_modules/mime/src/test.js +60 -0
- package/example/node/node_modules/mime/types.json +1 -0
- package/example/node/node_modules/mime-db/HISTORY.md +499 -0
- package/example/node/node_modules/mime-db/LICENSE +22 -0
- package/example/node/node_modules/mime-db/README.md +100 -0
- package/example/node/node_modules/mime-db/db.json +8471 -0
- package/example/node/node_modules/mime-db/index.js +11 -0
- package/example/node/node_modules/mime-db/package.json +59 -0
- package/example/node/node_modules/mime-types/HISTORY.md +388 -0
- package/example/node/node_modules/mime-types/LICENSE +23 -0
- package/example/node/node_modules/mime-types/README.md +113 -0
- package/example/node/node_modules/mime-types/index.js +188 -0
- package/example/node/node_modules/mime-types/package.json +44 -0
- package/example/node/node_modules/ms/index.js +152 -0
- package/example/node/node_modules/ms/license.md +21 -0
- package/example/node/node_modules/ms/package.json +37 -0
- package/example/node/node_modules/ms/readme.md +51 -0
- package/example/node/node_modules/negotiator/HISTORY.md +103 -0
- package/example/node/node_modules/negotiator/LICENSE +24 -0
- package/example/node/node_modules/negotiator/README.md +203 -0
- package/example/node/node_modules/negotiator/index.js +124 -0
- package/example/node/node_modules/negotiator/lib/charset.js +169 -0
- package/example/node/node_modules/negotiator/lib/encoding.js +184 -0
- package/example/node/node_modules/negotiator/lib/language.js +179 -0
- package/example/node/node_modules/negotiator/lib/mediaType.js +294 -0
- package/example/node/node_modules/negotiator/package.json +42 -0
- package/example/node/node_modules/on-finished/HISTORY.md +88 -0
- package/example/node/node_modules/on-finished/LICENSE +23 -0
- package/example/node/node_modules/on-finished/README.md +154 -0
- package/example/node/node_modules/on-finished/index.js +196 -0
- package/example/node/node_modules/on-finished/package.json +31 -0
- package/example/node/node_modules/parseurl/HISTORY.md +58 -0
- package/example/node/node_modules/parseurl/LICENSE +24 -0
- package/example/node/node_modules/parseurl/README.md +133 -0
- package/example/node/node_modules/parseurl/index.js +158 -0
- package/example/node/node_modules/parseurl/package.json +40 -0
- package/example/node/node_modules/path-to-regexp/History.md +36 -0
- package/example/node/node_modules/path-to-regexp/LICENSE +21 -0
- package/example/node/node_modules/path-to-regexp/Readme.md +35 -0
- package/example/node/node_modules/path-to-regexp/index.js +129 -0
- package/example/node/node_modules/path-to-regexp/package.json +30 -0
- package/example/node/node_modules/proxy-addr/HISTORY.md +161 -0
- package/example/node/node_modules/proxy-addr/LICENSE +22 -0
- package/example/node/node_modules/proxy-addr/README.md +139 -0
- package/example/node/node_modules/proxy-addr/index.js +327 -0
- package/example/node/node_modules/proxy-addr/package.json +47 -0
- package/example/node/node_modules/qs/.editorconfig +39 -0
- package/example/node/node_modules/qs/.eslintignore +2 -0
- package/example/node/node_modules/qs/.eslintrc +35 -0
- package/example/node/node_modules/qs/.github/FUNDING.yml +12 -0
- package/example/node/node_modules/qs/.nycrc +13 -0
- package/example/node/node_modules/qs/CHANGELOG.md +359 -0
- package/example/node/node_modules/qs/LICENSE.md +29 -0
- package/example/node/node_modules/qs/README.md +604 -0
- package/example/node/node_modules/qs/dist/qs.js +832 -0
- package/example/node/node_modules/qs/lib/formats.js +23 -0
- package/example/node/node_modules/qs/lib/index.js +11 -0
- package/example/node/node_modules/qs/lib/parse.js +257 -0
- package/example/node/node_modules/qs/lib/stringify.js +278 -0
- package/example/node/node_modules/qs/lib/utils.js +251 -0
- package/example/node/node_modules/qs/package.json +69 -0
- package/example/node/node_modules/qs/test/parse.js +772 -0
- package/example/node/node_modules/qs/test/stringify.js +793 -0
- package/example/node/node_modules/qs/test/utils.js +136 -0
- package/example/node/node_modules/range-parser/HISTORY.md +56 -0
- package/example/node/node_modules/range-parser/LICENSE +23 -0
- package/example/node/node_modules/range-parser/README.md +84 -0
- package/example/node/node_modules/range-parser/index.js +162 -0
- package/example/node/node_modules/range-parser/package.json +44 -0
- package/example/node/node_modules/raw-body/HISTORY.md +284 -0
- package/example/node/node_modules/raw-body/LICENSE +22 -0
- package/example/node/node_modules/raw-body/README.md +217 -0
- package/example/node/node_modules/raw-body/index.d.ts +87 -0
- package/example/node/node_modules/raw-body/index.js +286 -0
- package/example/node/node_modules/raw-body/package.json +48 -0
- package/example/node/node_modules/safe-buffer/LICENSE +21 -0
- package/example/node/node_modules/safe-buffer/README.md +584 -0
- package/example/node/node_modules/safe-buffer/index.d.ts +187 -0
- package/example/node/node_modules/safe-buffer/index.js +65 -0
- package/example/node/node_modules/safe-buffer/package.json +51 -0
- package/example/node/node_modules/safer-buffer/LICENSE +21 -0
- package/example/node/node_modules/safer-buffer/Porting-Buffer.md +268 -0
- package/example/node/node_modules/safer-buffer/Readme.md +156 -0
- package/example/node/node_modules/safer-buffer/dangerous.js +58 -0
- package/example/node/node_modules/safer-buffer/package.json +34 -0
- package/example/node/node_modules/safer-buffer/safer.js +77 -0
- package/example/node/node_modules/safer-buffer/tests.js +406 -0
- package/example/node/node_modules/send/HISTORY.md +506 -0
- package/example/node/node_modules/send/LICENSE +23 -0
- package/example/node/node_modules/send/README.md +327 -0
- package/example/node/node_modules/send/index.js +1133 -0
- package/example/node/node_modules/send/node_modules/.bin/mime +15 -0
- package/example/node/node_modules/send/node_modules/.bin/mime.cmd +7 -0
- package/example/node/node_modules/send/node_modules/ms/index.js +162 -0
- package/example/node/node_modules/send/node_modules/ms/license.md +21 -0
- package/example/node/node_modules/send/node_modules/ms/package.json +38 -0
- package/example/node/node_modules/send/node_modules/ms/readme.md +59 -0
- package/example/node/node_modules/send/package.json +61 -0
- package/example/node/node_modules/serve-static/HISTORY.md +459 -0
- package/example/node/node_modules/serve-static/LICENSE +25 -0
- package/example/node/node_modules/serve-static/README.md +257 -0
- package/example/node/node_modules/serve-static/index.js +210 -0
- package/example/node/node_modules/serve-static/package.json +42 -0
- package/example/node/node_modules/setprototypeof/LICENSE +13 -0
- package/example/node/node_modules/setprototypeof/README.md +31 -0
- package/example/node/node_modules/setprototypeof/index.d.ts +2 -0
- package/example/node/node_modules/setprototypeof/index.js +17 -0
- package/example/node/node_modules/setprototypeof/package.json +38 -0
- package/example/node/node_modules/setprototypeof/test/index.js +24 -0
- package/example/node/node_modules/statuses/HISTORY.md +65 -0
- package/example/node/node_modules/statuses/LICENSE +23 -0
- package/example/node/node_modules/statuses/README.md +127 -0
- package/example/node/node_modules/statuses/codes.json +66 -0
- package/example/node/node_modules/statuses/index.js +113 -0
- package/example/node/node_modules/statuses/package.json +48 -0
- package/example/node/node_modules/toidentifier/HISTORY.md +9 -0
- package/example/node/node_modules/toidentifier/LICENSE +21 -0
- package/example/node/node_modules/toidentifier/README.md +61 -0
- package/example/node/node_modules/toidentifier/index.js +32 -0
- package/example/node/node_modules/toidentifier/package.json +38 -0
- package/example/node/node_modules/type-is/HISTORY.md +259 -0
- package/example/node/node_modules/type-is/LICENSE +23 -0
- package/example/node/node_modules/type-is/README.md +170 -0
- package/example/node/node_modules/type-is/index.js +266 -0
- package/example/node/node_modules/type-is/package.json +45 -0
- package/example/node/node_modules/unpipe/HISTORY.md +4 -0
- package/example/node/node_modules/unpipe/LICENSE +22 -0
- package/example/node/node_modules/unpipe/README.md +43 -0
- package/example/node/node_modules/unpipe/index.js +69 -0
- package/example/node/node_modules/unpipe/package.json +27 -0
- package/example/node/node_modules/utils-merge/LICENSE +20 -0
- package/example/node/node_modules/utils-merge/README.md +34 -0
- package/example/node/node_modules/utils-merge/index.js +23 -0
- package/example/node/node_modules/utils-merge/package.json +40 -0
- package/example/node/node_modules/vary/HISTORY.md +39 -0
- package/example/node/node_modules/vary/LICENSE +22 -0
- package/example/node/node_modules/vary/README.md +101 -0
- package/example/node/node_modules/vary/index.js +149 -0
- package/example/node/node_modules/vary/package.json +43 -0
- package/example/node/package.json +11 -0
- package/example/node/server.js +27 -15
- package/example/node/yarn.lock +352 -0
- package/package.json +29 -18
- package/src/index.js +16 -10
- package/src/lib/crawler/crawlers.js +1399 -11
- package/src/lib/crawler/exclusions.js +56 -9
- package/src/lib/crawler/headers.js +24 -15
- package/src/lib/crawler/provider.js +11 -13
- package/src/lib/crawler.js +123 -132
- package/test/lib/crawler.test.js +83 -24
- package/test/lib/database/crawlers.txt +3651 -0
- package/test/lib/database/devices.txt +165636 -0
- package/webpack.common.js +20 -20
- package/webpack.dev.js +7 -7
- package/webpack.prod.js +14 -15
@@ -0,0 +1,327 @@
|
|
1
|
+
# send
|
2
|
+
|
3
|
+
[![NPM Version][npm-version-image]][npm-url]
|
4
|
+
[![NPM Downloads][npm-downloads-image]][npm-url]
|
5
|
+
[![Linux Build][github-actions-ci-image]][github-actions-ci-url]
|
6
|
+
[![Windows Build][appveyor-image]][appveyor-url]
|
7
|
+
[![Test Coverage][coveralls-image]][coveralls-url]
|
8
|
+
|
9
|
+
Send is a library for streaming files from the file system as a http response
|
10
|
+
supporting partial responses (Ranges), conditional-GET negotiation (If-Match,
|
11
|
+
If-Unmodified-Since, If-None-Match, If-Modified-Since), high test coverage,
|
12
|
+
and granular events which may be leveraged to take appropriate actions in your
|
13
|
+
application or framework.
|
14
|
+
|
15
|
+
Looking to serve up entire folders mapped to URLs? Try [serve-static](https://www.npmjs.org/package/serve-static).
|
16
|
+
|
17
|
+
## Installation
|
18
|
+
|
19
|
+
This is a [Node.js](https://nodejs.org/en/) module available through the
|
20
|
+
[npm registry](https://www.npmjs.com/). Installation is done using the
|
21
|
+
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
|
22
|
+
|
23
|
+
```bash
|
24
|
+
$ npm install send
|
25
|
+
```
|
26
|
+
|
27
|
+
## API
|
28
|
+
|
29
|
+
```js
|
30
|
+
var send = require('send')
|
31
|
+
```
|
32
|
+
|
33
|
+
### send(req, path, [options])
|
34
|
+
|
35
|
+
Create a new `SendStream` for the given path to send to a `res`. The `req` is
|
36
|
+
the Node.js HTTP request and the `path` is a urlencoded path to send (urlencoded,
|
37
|
+
not the actual file-system path).
|
38
|
+
|
39
|
+
#### Options
|
40
|
+
|
41
|
+
##### acceptRanges
|
42
|
+
|
43
|
+
Enable or disable accepting ranged requests, defaults to true.
|
44
|
+
Disabling this will not send `Accept-Ranges` and ignore the contents
|
45
|
+
of the `Range` request header.
|
46
|
+
|
47
|
+
##### cacheControl
|
48
|
+
|
49
|
+
Enable or disable setting `Cache-Control` response header, defaults to
|
50
|
+
true. Disabling this will ignore the `immutable` and `maxAge` options.
|
51
|
+
|
52
|
+
##### dotfiles
|
53
|
+
|
54
|
+
Set how "dotfiles" are treated when encountered. A dotfile is a file
|
55
|
+
or directory that begins with a dot ("."). Note this check is done on
|
56
|
+
the path itself without checking if the path actually exists on the
|
57
|
+
disk. If `root` is specified, only the dotfiles above the root are
|
58
|
+
checked (i.e. the root itself can be within a dotfile when when set
|
59
|
+
to "deny").
|
60
|
+
|
61
|
+
- `'allow'` No special treatment for dotfiles.
|
62
|
+
- `'deny'` Send a 403 for any request for a dotfile.
|
63
|
+
- `'ignore'` Pretend like the dotfile does not exist and 404.
|
64
|
+
|
65
|
+
The default value is _similar_ to `'ignore'`, with the exception that
|
66
|
+
this default will not ignore the files within a directory that begins
|
67
|
+
with a dot, for backward-compatibility.
|
68
|
+
|
69
|
+
##### end
|
70
|
+
|
71
|
+
Byte offset at which the stream ends, defaults to the length of the file
|
72
|
+
minus 1. The end is inclusive in the stream, meaning `end: 3` will include
|
73
|
+
the 4th byte in the stream.
|
74
|
+
|
75
|
+
##### etag
|
76
|
+
|
77
|
+
Enable or disable etag generation, defaults to true.
|
78
|
+
|
79
|
+
##### extensions
|
80
|
+
|
81
|
+
If a given file doesn't exist, try appending one of the given extensions,
|
82
|
+
in the given order. By default, this is disabled (set to `false`). An
|
83
|
+
example value that will serve extension-less HTML files: `['html', 'htm']`.
|
84
|
+
This is skipped if the requested file already has an extension.
|
85
|
+
|
86
|
+
##### immutable
|
87
|
+
|
88
|
+
Enable or disable the `immutable` directive in the `Cache-Control` response
|
89
|
+
header, defaults to `false`. If set to `true`, the `maxAge` option should
|
90
|
+
also be specified to enable caching. The `immutable` directive will prevent
|
91
|
+
supported clients from making conditional requests during the life of the
|
92
|
+
`maxAge` option to check if the file has changed.
|
93
|
+
|
94
|
+
##### index
|
95
|
+
|
96
|
+
By default send supports "index.html" files, to disable this
|
97
|
+
set `false` or to supply a new index pass a string or an array
|
98
|
+
in preferred order.
|
99
|
+
|
100
|
+
##### lastModified
|
101
|
+
|
102
|
+
Enable or disable `Last-Modified` header, defaults to true. Uses the file
|
103
|
+
system's last modified value.
|
104
|
+
|
105
|
+
##### maxAge
|
106
|
+
|
107
|
+
Provide a max-age in milliseconds for http caching, defaults to 0.
|
108
|
+
This can also be a string accepted by the
|
109
|
+
[ms](https://www.npmjs.org/package/ms#readme) module.
|
110
|
+
|
111
|
+
##### root
|
112
|
+
|
113
|
+
Serve files relative to `path`.
|
114
|
+
|
115
|
+
##### start
|
116
|
+
|
117
|
+
Byte offset at which the stream starts, defaults to 0. The start is inclusive,
|
118
|
+
meaning `start: 2` will include the 3rd byte in the stream.
|
119
|
+
|
120
|
+
#### Events
|
121
|
+
|
122
|
+
The `SendStream` is an event emitter and will emit the following events:
|
123
|
+
|
124
|
+
- `error` an error occurred `(err)`
|
125
|
+
- `directory` a directory was requested `(res, path)`
|
126
|
+
- `file` a file was requested `(path, stat)`
|
127
|
+
- `headers` the headers are about to be set on a file `(res, path, stat)`
|
128
|
+
- `stream` file streaming has started `(stream)`
|
129
|
+
- `end` streaming has completed
|
130
|
+
|
131
|
+
#### .pipe
|
132
|
+
|
133
|
+
The `pipe` method is used to pipe the response into the Node.js HTTP response
|
134
|
+
object, typically `send(req, path, options).pipe(res)`.
|
135
|
+
|
136
|
+
### .mime
|
137
|
+
|
138
|
+
The `mime` export is the global instance of of the
|
139
|
+
[`mime` npm module](https://www.npmjs.com/package/mime).
|
140
|
+
|
141
|
+
This is used to configure the MIME types that are associated with file extensions
|
142
|
+
as well as other options for how to resolve the MIME type of a file (like the
|
143
|
+
default type to use for an unknown file extension).
|
144
|
+
|
145
|
+
## Error-handling
|
146
|
+
|
147
|
+
By default when no `error` listeners are present an automatic response will be
|
148
|
+
made, otherwise you have full control over the response, aka you may show a 5xx
|
149
|
+
page etc.
|
150
|
+
|
151
|
+
## Caching
|
152
|
+
|
153
|
+
It does _not_ perform internal caching, you should use a reverse proxy cache
|
154
|
+
such as Varnish for this, or those fancy things called CDNs. If your
|
155
|
+
application is small enough that it would benefit from single-node memory
|
156
|
+
caching, it's small enough that it does not need caching at all ;).
|
157
|
+
|
158
|
+
## Debugging
|
159
|
+
|
160
|
+
To enable `debug()` instrumentation output export __DEBUG__:
|
161
|
+
|
162
|
+
```
|
163
|
+
$ DEBUG=send node app
|
164
|
+
```
|
165
|
+
|
166
|
+
## Running tests
|
167
|
+
|
168
|
+
```
|
169
|
+
$ npm install
|
170
|
+
$ npm test
|
171
|
+
```
|
172
|
+
|
173
|
+
## Examples
|
174
|
+
|
175
|
+
### Serve a specific file
|
176
|
+
|
177
|
+
This simple example will send a specific file to all requests.
|
178
|
+
|
179
|
+
```js
|
180
|
+
var http = require('http')
|
181
|
+
var send = require('send')
|
182
|
+
|
183
|
+
var server = http.createServer(function onRequest (req, res) {
|
184
|
+
send(req, '/path/to/index.html')
|
185
|
+
.pipe(res)
|
186
|
+
})
|
187
|
+
|
188
|
+
server.listen(3000)
|
189
|
+
```
|
190
|
+
|
191
|
+
### Serve all files from a directory
|
192
|
+
|
193
|
+
This simple example will just serve up all the files in a
|
194
|
+
given directory as the top-level. For example, a request
|
195
|
+
`GET /foo.txt` will send back `/www/public/foo.txt`.
|
196
|
+
|
197
|
+
```js
|
198
|
+
var http = require('http')
|
199
|
+
var parseUrl = require('parseurl')
|
200
|
+
var send = require('send')
|
201
|
+
|
202
|
+
var server = http.createServer(function onRequest (req, res) {
|
203
|
+
send(req, parseUrl(req).pathname, { root: '/www/public' })
|
204
|
+
.pipe(res)
|
205
|
+
})
|
206
|
+
|
207
|
+
server.listen(3000)
|
208
|
+
```
|
209
|
+
|
210
|
+
### Custom file types
|
211
|
+
|
212
|
+
```js
|
213
|
+
var http = require('http')
|
214
|
+
var parseUrl = require('parseurl')
|
215
|
+
var send = require('send')
|
216
|
+
|
217
|
+
// Default unknown types to text/plain
|
218
|
+
send.mime.default_type = 'text/plain'
|
219
|
+
|
220
|
+
// Add a custom type
|
221
|
+
send.mime.define({
|
222
|
+
'application/x-my-type': ['x-mt', 'x-mtt']
|
223
|
+
})
|
224
|
+
|
225
|
+
var server = http.createServer(function onRequest (req, res) {
|
226
|
+
send(req, parseUrl(req).pathname, { root: '/www/public' })
|
227
|
+
.pipe(res)
|
228
|
+
})
|
229
|
+
|
230
|
+
server.listen(3000)
|
231
|
+
```
|
232
|
+
|
233
|
+
### Custom directory index view
|
234
|
+
|
235
|
+
This is a example of serving up a structure of directories with a
|
236
|
+
custom function to render a listing of a directory.
|
237
|
+
|
238
|
+
```js
|
239
|
+
var http = require('http')
|
240
|
+
var fs = require('fs')
|
241
|
+
var parseUrl = require('parseurl')
|
242
|
+
var send = require('send')
|
243
|
+
|
244
|
+
// Transfer arbitrary files from within /www/example.com/public/*
|
245
|
+
// with a custom handler for directory listing
|
246
|
+
var server = http.createServer(function onRequest (req, res) {
|
247
|
+
send(req, parseUrl(req).pathname, { index: false, root: '/www/public' })
|
248
|
+
.once('directory', directory)
|
249
|
+
.pipe(res)
|
250
|
+
})
|
251
|
+
|
252
|
+
server.listen(3000)
|
253
|
+
|
254
|
+
// Custom directory handler
|
255
|
+
function directory (res, path) {
|
256
|
+
var stream = this
|
257
|
+
|
258
|
+
// redirect to trailing slash for consistent url
|
259
|
+
if (!stream.hasTrailingSlash()) {
|
260
|
+
return stream.redirect(path)
|
261
|
+
}
|
262
|
+
|
263
|
+
// get directory list
|
264
|
+
fs.readdir(path, function onReaddir (err, list) {
|
265
|
+
if (err) return stream.error(err)
|
266
|
+
|
267
|
+
// render an index for the directory
|
268
|
+
res.setHeader('Content-Type', 'text/plain; charset=UTF-8')
|
269
|
+
res.end(list.join('\n') + '\n')
|
270
|
+
})
|
271
|
+
}
|
272
|
+
```
|
273
|
+
|
274
|
+
### Serving from a root directory with custom error-handling
|
275
|
+
|
276
|
+
```js
|
277
|
+
var http = require('http')
|
278
|
+
var parseUrl = require('parseurl')
|
279
|
+
var send = require('send')
|
280
|
+
|
281
|
+
var server = http.createServer(function onRequest (req, res) {
|
282
|
+
// your custom error-handling logic:
|
283
|
+
function error (err) {
|
284
|
+
res.statusCode = err.status || 500
|
285
|
+
res.end(err.message)
|
286
|
+
}
|
287
|
+
|
288
|
+
// your custom headers
|
289
|
+
function headers (res, path, stat) {
|
290
|
+
// serve all files for download
|
291
|
+
res.setHeader('Content-Disposition', 'attachment')
|
292
|
+
}
|
293
|
+
|
294
|
+
// your custom directory handling logic:
|
295
|
+
function redirect () {
|
296
|
+
res.statusCode = 301
|
297
|
+
res.setHeader('Location', req.url + '/')
|
298
|
+
res.end('Redirecting to ' + req.url + '/')
|
299
|
+
}
|
300
|
+
|
301
|
+
// transfer arbitrary files from within
|
302
|
+
// /www/example.com/public/*
|
303
|
+
send(req, parseUrl(req).pathname, { root: '/www/public' })
|
304
|
+
.on('error', error)
|
305
|
+
.on('directory', redirect)
|
306
|
+
.on('headers', headers)
|
307
|
+
.pipe(res)
|
308
|
+
})
|
309
|
+
|
310
|
+
server.listen(3000)
|
311
|
+
```
|
312
|
+
|
313
|
+
## License
|
314
|
+
|
315
|
+
[MIT](LICENSE)
|
316
|
+
|
317
|
+
[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/send/master?label=windows
|
318
|
+
[appveyor-url]: https://ci.appveyor.com/project/dougwilson/send
|
319
|
+
[coveralls-image]: https://badgen.net/coveralls/c/github/pillarjs/send/master
|
320
|
+
[coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master
|
321
|
+
[github-actions-ci-image]: https://badgen.net/github/checks/pillarjs/send/master?label=ci
|
322
|
+
[github-actions-ci-url]: https://github.com/pillarjs/send/actions?query=workflow%3Aci
|
323
|
+
[node-image]: https://badgen.net/npm/node/send
|
324
|
+
[node-url]: https://nodejs.org/en/download/
|
325
|
+
[npm-downloads-image]: https://badgen.net/npm/dm/send
|
326
|
+
[npm-url]: https://npmjs.org/package/send
|
327
|
+
[npm-version-image]: https://badgen.net/npm/v/send
|