Socket
Socket
Sign inDemoInstall

sirv

Package Overview
Dependencies
3
Maintainers
1
Versions
47
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.0.0 to 2.0.2

7

package.json
{
"name": "sirv",
"version": "2.0.0",
"version": "2.0.2",
"description": "The optimized & lightweight middleware for serving requests to static assets",

@@ -25,4 +25,5 @@ "repository": "lukeed/sirv",

"mrmime": "^1.0.0",
"totalist": "^2.0.0"
}
"totalist": "^3.0.0"
},
"readme": "# sirv ![CI](https://github.com/lukeed/sirv/workflows/CI/badge.svg)\n\n> The optimized and lightweight middleware for serving requests to static assets\n\nYou may use `sirv` as a *very* fast and lightweight alternative to [`serve-static`](https://www.npmjs.com/package/serve-static).\n\nThe massive performance advantage over `serve-static` is explained by **not** relying on the file system for existence checks on every request. These are expensive interactions and must be avoided whenever possible! Instead, when not in \"dev\" mode, `sirv` performs all its file-system operations upfront and then relies on its cache for future operations.\n\nThis middleware will work out of the box for [Polka](https://github.com/lukeed/polka), Express, and other Express-like frameworks. It will also work with the native `http`, `https` and `http2` modules. It requires _very_ little effort to modify/wrap it for servers that don't accept the `(req, res, next)` signature.\n\n:bulb: For a feature-complete CLI application, check out the sibling [`sirv-cli`](https://github.com/lukeed/sirv/tree/master/packages/sirv-cli) package as an alternative to [`zeit/serve`](https://github.com/zeit/serve)~!\n\n## Install\n\n```\n$ npm install --save sirv\n```\n\n\n## Usage\n\n```js\nconst sirv = require('sirv');\nconst polka = require('polka');\nconst compress = require('compression')();\n\n// Init `sirv` handler\nconst assets = sirv('public', {\n maxAge: 31536000, // 1Y\n immutable: true\n});\n\npolka()\n .use(compress, assets)\n .use('/api', require('./api'))\n .listen(3000, err => {\n if (err) throw err;\n console.log('> Ready on localhost:3000~!');\n });\n```\n\n\n## API\n\n### sirv(dir, opts={})\n\nReturns: `Function`\n\nThe returned function is a middleware in the standard Express-like signature: `(req, res, next)`, where `req` is the [`http.IncomingMessage`](https://nodejs.org/api/http.html#http_class_http_incomingmessage), `res` is the [`http.ServerResponse`](https://nodejs.org/dist/latest-v9.x/docs/api/http.html#http_class_http_serverresponse), and `next` (in this case) is the function to call if no file was found for the given path.\n\nWhen defined, a `next()` callback is always called _instead of_ the [`opts.onNoMatch`](#optsonnomatch) callback. However, unlike `onNoMatch`, your `next()` is given no arguments.\n\n#### dir\nType: `String`<br>\nDefault: `.`\n\nThe directory from which to read and serve assets. It is resolved to an absolute path &mdash; you must provide an absolute path yourself if `process.cwd()` is not the correct assumption.\n\n#### opts.dev\nType: `Boolean`<br>\nDefault: `false`\n\nEnable \"dev\" mode, which disables/skips caching. Instead, `sirv` will traverse the file system ***on every request***.\n\nAdditionally, `dev` mode will ignore `maxAge` and `immutable` as these options generate a production-oriented `Cache-Control` header value.\n\n> **Important:** Do not use `dev` mode in production!\n\n#### opts.etag\nType: `Boolean`<br>\nDefault: `false`\n\nGenerate and attach an `ETag` header to responses.\n\n> **Note:** If an incoming request's [`If-None-Match` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match) matches the `ETag` value, a `304` response is given.\n\n#### opts.dotfiles\nType: `Boolean`<br>\nDefault: `false`\n\nAllow requests to dotfiles (files or directories beginning with a `.`).\n\n> **Note:** Requests to [`/.well-known/*`](https://tools.ietf.org/html/rfc8615) are always allowed.\n\n#### opts.extensions\nType: `Array<String>`<br>\nDefault: `['html', 'htm']`\n\nThe file extension fallbacks to check for if a pathame is not initially found. For example, if a `/login` request cannot find a `login` filename, it will then look for `login.html` and `login.htm` before giving up~!\n\n> **Important:** Actually, `sirv` will **also** look for `login/index.html` and `login/index.htm` before giving up.\n\n#### opts.gzip\nType: `Boolean`<br>\nDefault: `false`\n\nDetermine if `sirv` look for **precompiled** `*.gz` files.<br>\nMust be enabled _and_ the incoming request's [`Accept Encoding`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding) must include \"gzip\" in order for `sirv` to search for the gzip'd alternative.\n\n> **Note:** The `.gz` assumption also applies to the `opts.extensions` list.\n\n```js\n// NOTE: PSEUDO CODE\n// Showing lookup logic\n\n// Request: [Accept-Encoding: gzip] \"/foobar.jpg\"\nlookup([\n '/foobar.jpg.gz', '/foobar.jpg',\n '/foobar.jpg.html.gz', '/foobar.jpg/index.html.gz',\n '/foobar.jpg.htm.gz', '/foobar.jpg/index.htm.gz',\n '/foobar.jpg.html', '/foobar.jpg/index.html',\n '/foobar.jpg.htm', '/foobar.jpg/index.htm',\n]);\n\n// Request: [Accept-Encoding: gzip] \"/\"\nlookup([\n '/index.html.gz',\n '/index.htm.gz',\n '/index.html',\n '/index.htm',\n]);\n```\n\n\n#### opts.brotli\nType: `Boolean`<br>\nDefault: `false`\n\nDetermine if `sirv` look for **precompiled** `*.br` files.<br>\nMust be enabled _and_ the incoming request's [`Accept Encoding`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding) must include either \"br\" or \"brotli\" in order for `sirv` to search for the brotli-compressed alternative.\n\n> **Note:** The `.br` assumption also applies to the `opts.extensions` list.\n\nWhen both `opts.broli` and `opts.gzip` are enabled &mdash; and all conditions are equal &mdash; then the brotli variant always takes priority.\n\n```js\n// NOTE: PSEUDO CODE\n// Showing lookup logic\n\n// Request: [Accept-Encoding: br] \"/foobar.jpg\"\nlookup([\n '/foobar.jpg.br', '/foobar.jpg',\n '/foobar.jpg.html.br', '/foobar.jpg/index.html.br',\n '/foobar.jpg.htm.br', '/foobar.jpg/index.htm.br',\n '/foobar.jpg.html', '/foobar.jpg/index.html',\n '/foobar.jpg.htm', '/foobar.jpg/index.htm',\n]);\n\n// Request: [Accept-Encoding: br,gz] \"/\"\nlookup([\n '/index.html.br'\n '/index.htm.br'\n '/index.html.gz'\n '/index.htm.gz'\n '/index.html'\n '/index.htm'\n]);\n```\n\n#### opts.maxAge\nType: `Number`<br>\nDefault: `undefined`\n\nEnables the `Cache-Control` header on responses and sets the `max-age` value (in seconds).<br>\nFor example, `maxAge: 31536000` is equivalent to one year.\n\n#### opts.immutable\nType: `Boolean`<br>\nDefault: `false`\n\nAppends the [`immutable` directive](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#Revalidation_and_reloading) on your `Cache-Control` header, used for uniquely-named assets that will not change!\n\n> **Important:** Will only work if `opts.maxAge` has a value defined!\n\n#### opts.single\nType: `Boolean` or `String`<br>\nDefault: `false`\n\nTreat the directory as a single-page application.\n\nWhen `true`, the directory's index page (default `index.html`) will be sent if the request asset does not exist.<br>\nYou may pass a `string` value to use a file _instead of_ `index.html` as your fallback.\n\nFor example, if \"/about\" is requested but no variants of that file exist, then the response for \"/\" is sent instead:\n\n```js\n// Note: This is psuedo code to illustrate what's happening\n\n// Request: \"/about\"\nlet file = find(['/about', '/about.html', '/about.htm', '/about/index.html', '/about.htm']);\nif (file) {\n send(file);\n} else if (opts.single === true) {\n file = find(['/', '/index.html', '/index.htm']);\n send(file);\n} else if (typeof opts.single === 'string') {\n file = find([opts.single]);\n send(file);\n} else {\n // next() or 404\n}\n```\n\n#### opts.ignores\nType: `false` or `Array<String | RegExp>`\n\nSpecify paths/patterns that should ignore the fallback behavior that `opts.single` provides.\n\nBy default, any asset-like path (URLs that end with an extension) will be ignored. This means that, for example, if `/foobar.jpg` is not found, a `404` response is sent instead of the `index.html` fallback.\n\nAdditionally, any `/.well-known/*` pathname ignores the fallback – as do all other dotfile requests when `opts.dotfiles` is enabled.\n\nAny string value(s) will be passed through `new RegExp(value, 'i')` directly.\n\nFinally, you may set `ignores: false` to disable ***all*** ignores, including the defaults. Put differently, this will fallback ***all*** unknown pathnames to your `index.html` (or custom `opts.single` value).\n\n> **Important:** Only has an effect if `opts.single` is enabled.\n\n#### opts.onNoMatch\nType: `Function`\n\nA custom function to run if a file cannot be found for a given request. <br>By default, `sirv` will send a basic `(404) Not found` response.\n\nThe function receives the current `req <IncomingMessage>, res <ServerResponse>` pair for as its two arguments.\n\n> **Note:** This won't run if a `next` callback has been provided to the middleware; see [`sirv`](#sirvdir-opts) description.\n\n#### opts.setHeaders\nType: `Function`\n\nA custom function to append or change any headers on the outgoing response. There is no default.\n\nIts signature is `(res, pathname, stats)`, where `res` is the `ServerResponse`, `pathname` is incoming request path (stripped of queries), and `stats` is the file's result from [`fs.statSync`](https://nodejs.org/api/fs.html#fs_fs_statsync_path).\n\n\n## License\n\nMIT © [Luke Edwards](https://lukeed.com)\n"
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc