{"id":13426179,"url":"https://github.com/dherault/serverless-offline","last_synced_at":"2025-09-09T21:05:33.381Z","repository":{"id":37642413,"uuid":"51905436","full_name":"dherault/serverless-offline","owner":"dherault","description":"Emulate AWS λ and API Gateway locally when developing your Serverless project","archived":false,"fork":false,"pushed_at":"2025-04-08T10:00:48.000Z","size":55995,"stargazers_count":5229,"open_issues_count":122,"forks_count":799,"subscribers_count":63,"default_branch":"master","last_synced_at":"2025-05-05T20:45:46.270Z","etag":null,"topics":["aws-apigateway","aws-lambda","serverless"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dherault.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["dherault","dnalborczyk","DorianMazur"]}},"created_at":"2016-02-17T08:01:47.000Z","updated_at":"2025-05-02T19:24:04.000Z","dependencies_parsed_at":"2024-05-21T18:03:47.150Z","dependency_job_id":"5749941c-ab01-4725-b828-946b4002c49d","html_url":"https://github.com/dherault/serverless-offline","commit_stats":{"total_commits":3447,"total_committers":323,"mean_commits":"10.671826625386997","dds":0.4061502756019727,"last_synced_commit":"710bfaa31def48f94c9875c4d5d615ccdd985be0"},"previous_names":[],"tags_count":337,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dherault%2Fserverless-offline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dherault%2Fserverless-offline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dherault%2Fserverless-offline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dherault%2Fserverless-offline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dherault","download_url":"https://codeload.github.com/dherault/serverless-offline/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253929327,"owners_count":21985801,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws-apigateway","aws-lambda","serverless"],"created_at":"2024-07-31T00:01:28.243Z","updated_at":"2025-09-09T21:05:33.365Z","avatar_url":"https://github.com/dherault.png","language":"JavaScript","readme":"# Serverless Offline\n\n\u003cdiv align=\"center\"\u003e\n  We are looking for maintainers! \n  \u003cbr /\u003e\n  Please contact \u003ca href=\"https://github.com/dherault\"\u003edherault\u003c/a\u003e if you feel you are a good match.\n\u003c/div\u003e \n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003csup\u003e\n    Serverless-offline is supported by the community.\n  \u003c/sup\u003e\n  \u003cbr /\u003e\n  \u003csup\u003e\n    Special thanks to:\n  \u003c/sup\u003e\n  \u003cbr /\u003e\n  \u003ca href=\"https://symmetrics.app?ref=so\"\u003e\n    \u003cdiv\u003e\n      \u003cimg src=\"https://symmetrics.app/images/logo/logotype.png\" height=\"64\" alt=\"Symmetrics\"\u003e\n    \u003c/div\u003e\n    \u003cb\u003e\n      Become a data-driven product builder\n    \u003c/b\u003e\n    \u003cdiv\u003e\n      Metrics, community and resources for lead developers and engineering managers.\n    \u003c/div\u003e\n  \u003c/a\u003e\n  \u003cbr /\u003e\n  \u003ca href=\"https://arccode.dev?ref=so\"\u003e\n    \u003cdiv\u003e\n      \u003cimg src=\"https://arccode.dev/images/logotype.png\" height=\"64\" alt=\"Arccode\"\u003e\n    \u003c/div\u003e\n    \u003cb\u003e\n      The first role-playing game for developers\n    \u003c/b\u003e\n    \u003cdiv\u003e\n      XP, level ups and guilds. All while you work.\n    \u003c/div\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\u0026nbsp;\n\u003cp\u003e\n  \u003ca href=\"https://www.npmjs.com/package/serverless-offline\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/v/serverless-offline.svg?style=flat-square\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/dherault/serverless-offline/actions/workflows/integrate.yml\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/workflow/status/dherault/serverless-offline/Integrate\"\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/node/v/serverless-offline.svg?style=flat-square\"\u003e\n  \u003ca href=\"https://github.com/serverless/serverless\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/dependency-version/serverless-offline/peer/serverless.svg?style=flat-square\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/prettier/prettier\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square\"\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/npm/l/serverless-offline.svg?style=flat-square\"\u003e\n  \u003ca href=\"#contributing\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://gitter.im/serverless-offline/community\"\u003e\n    \u003cimg src=\"https://badges.gitter.im/serverless-offline.png\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nThis [Serverless](https://github.com/serverless/serverless) plugin emulates [AWS λ](https://aws.amazon.com/lambda) and [API Gateway](https://aws.amazon.com/api-gateway) on your local machine to speed up your development cycles.\nTo do so, it starts an HTTP server that handles the request's lifecycle like APIG does and invokes your handlers.\n\n**Features**\n\n- [Node.js](https://nodejs.org), [Python](https://www.python.org), [Ruby](https://www.ruby-lang.org), [Go](https://golang.org), [Java](https://www.java.com) (incl. [Kotlin](https://kotlinlang.org), [Groovy](https://groovy-lang.org), [Scala](https://www.scala-lang.org)) λ runtimes.\n- Velocity templates support.\n- Lazy loading of your handler files.\n- And more: integrations, authorizers, proxies, timeouts, responseParameters, HTTPS, CORS, etc...\n\nThis plugin is updated by its users, I just do maintenance and ensure that PRs are relevant to the community. In other words, if you [find a bug or want a new feature](https://github.com/dherault/serverless-offline/issues), please help us by becoming one of the [contributors](https://github.com/dherault/serverless-offline/graphs/contributors) :v: ! See the [contributing section](#contributing).\n\n## Documentation\n\n- [Installation](#installation)\n- [Usage and command line options](#usage-and-command-line-options)\n- [Run modes](#run-modes)\n- [Invoke Lambda](#invoke-lambda)\n- [The `process.env.IS_OFFLINE` variable](#the-processenvis_offline-variable)\n- [Docker and Layers](#docker-and-layers)\n- [Authorizers](#authorizers)\n  - [Token authorizers](#token-authorizers)\n  - [Custom authorizers](#custom-authorizers)\n  - [Remote authorizers](#remote-authorizers)\n  - [JWT authorizers](#jwt-authorizers)\n  - [Serverless plugin authorizers](#serverless-plugin-authorizers)\n- [Custom headers](#custom-headers)\n- [Environment variables](#environment-variables)\n- [AWS API Gateway Features](#aws-api-gateway-features)\n  - [Velocity Templates](#velocity-templates)\n    - [Velocity nuances](#velocity-nuances)\n  - [CORS](#cors)\n  - [Catch-all Path Variables](#catch-all-path-variables)\n  - [ANY method](#any-method)\n  - [Lambda and Lambda Proxy Integrations](#lambda-and-lambda-proxy-integrations)\n  - [HTTP Proxy](#http-proxy)\n  - [Response parameters](#response-parameters)\n- [WebSocket](#websocket)\n- [Debug process](#debug-process)\n- [Resource permissions and AWS profile](#resource-permissions-and-aws-profile)\n- [Simulation quality](#simulation-quality)\n- [Usage with other plugins](#usage-with-other-plugins)\n- [Credits and inspiration](#credits-and-inspiration)\n- [License](#license)\n- [Contributing](#contributing)\n- [Contributors](#contributors)\n\n## Installation\n\nFirst, add Serverless Offline to your project:\n\n`npm install serverless-offline --save-dev`\n\nThen inside your project's `serverless.yml` file add following entry to the plugins section: `serverless-offline`. If there is no plugin section you will need to add it to the file.\n\n**Note that the \"plugin\" section for serverless-offline must be at root level on serverless.yml.**\n\nIt should look something like this:\n\n```yml\nplugins:\n  - serverless-offline\n```\n\nYou can check whether you have successfully installed the plugin by running the serverless command line:\n\n`serverless --verbose`\n\nthe console should display _Offline_ as one of the plugins now available in your Serverless project.\n\n## Usage and command line options\n\nIn your project root run:\n\n`serverless offline` or `sls offline`.\n\nto list all the options for the plugin run:\n\n`sls offline --help`\n\nAll CLI options are optional:\n\n#### corsAllowHeaders\n\nUsed as default Access-Control-Allow-Headers header value for responses. Delimit multiple values with commas.\u003cbr /\u003e\nDefault: 'accept,content-type,x-api-key'\n\n#### corsAllowOrigin\n\nUsed as default Access-Control-Allow-Origin header value for responses. Delimit multiple values with commas.\u003cbr /\u003e\nDefault: '\\*'\n\n#### corsDisallowCredentials\n\nWhen provided, the default Access-Control-Allow-Credentials header value will be passed as 'false'.\\\nDefault: true\n\n#### corsExposedHeaders\n\nUsed as additional Access-Control-Exposed-Headers header value for responses. Delimit multiple values with commas.\u003cbr /\u003e\nDefault: 'WWW-Authenticate,Server-Authorization'\n\n#### disableCookieValidation\n\nUsed to disable cookie-validation on hapi.js-server.\n\n#### dockerHost\n\nThe host name of Docker.\u003cbr /\u003e\nDefault: localhost\n\n#### dockerHostServicePath\n\nDefines service path which is used by SLS running inside Docker container.\n\n#### dockerNetwork\n\nThe network that the Docker container will connect to.\n\n#### dockerReadOnly\n\nMarks if the docker code layer should be read only.\u003cbr /\u003e\nDefault: true\n\n#### enforceSecureCookies\n\nEnforce secure cookies\n\n#### host\n\n-o Host name to listen on.\u003cbr /\u003e\nDefault: localhost\n\n#### httpPort\n\nHttp port to listen on.\u003cbr /\u003e\nDefault: 3000\n\n#### httpsProtocol\n\n-H To enable HTTPS, specify directory (relative to your cwd, typically your project dir) for both cert.pem and key.pem files.\n\n#### ignoreJWTSignature\n\nWhen using HttpApi with a JWT authorizer, don't check the signature of the JWT token.\n\n#### lambdaPort\n\nLambda http port to listen on.\u003cbr /\u003e\nDefault: 3002\n\n#### layersDir\n\nThe directory layers should be stored in.\u003cbr /\u003e\nDefault: ${codeDir}/.serverless-offline/layers'\n\n#### localEnvironment\n\nCopy local environment variables.\u003cbr /\u003e\nDefault: false\n\n#### noAuth\n\nTurns off all authorizers.\n\n#### noPrependStageInUrl\n\nDon't prepend http routes with the stage.\n\n#### noSponsor\n\nRemove sponsor message from the output.\n\n#### noTimeout\n\n-t Disables the timeout feature.\n\n#### prefix\n\n-p Adds a prefix to every path, to send your requests to http://localhost:3000/[prefix]/[your_path] instead.\u003cbr /\u003e\nDefault: ''\n\n#### reloadHandler\n\nReloads handler with each request.\n\n#### resourceRoutes\n\nTurns on loading of your HTTP proxy settings from serverless.yml.\n\n#### terminateIdleLambdaTime\n\nNumber of seconds until an idle function is eligible for termination.\n\n#### useDocker\n\nRun handlers in a docker container.\n\n#### useInProcess\n\nRun handlers in the same process as 'serverless-offline'.\n\n#### webSocketHardTimeout\n\nSet WebSocket hard timeout in seconds to reproduce AWS limits (https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#apigateway-execution-service-websocket-limits-table).\u003cbr /\u003e\nDefault: 7200 (2 hours)\n\n#### webSocketIdleTimeout\n\nSet WebSocket idle timeout in seconds to reproduce AWS limits (https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#apigateway-execution-service-websocket-limits-table).\u003cbr /\u003e\nDefault: 600 (10 minutes)\n\n#### websocketPort\n\nWebSocket port to listen on.\u003cbr /\u003e\nDefault: 3001\n\n#### preLoadModules\n\nPre-load specified modules in the main thread to avoid crashes when importing in worker threads. Provide module names as a comma-separated list (e.g., \"sharp,canvas\").\u003cbr /\u003e\nDefault: ''\n\nAny of the CLI options can be added to your `serverless.yml`. For example:\n\n```yml\ncustom:\n  serverless-offline:\n    httpsProtocol: 'dev-certs'\n    httpPort: 4000\n      foo: 'bar'\n```\n\nOptions passed on the command line override YAML options.\n\nBy default you can send your requests to `http://localhost:3000/`. Please note that:\n\n- You'll need to restart the plugin if you modify your `serverless.yml` or any of the default velocity template files.\n- When no Content-Type header is set on a request, API Gateway defaults to `application/json`, and so does the plugin.\n  But if you send an `application/x-www-form-urlencoded` or a `multipart/form-data` body with an `application/json` (or no) Content-Type, API Gateway won't parse your data (you'll get the ugly raw as input), whereas the plugin will answer 400 (malformed JSON).\n  Please consider explicitly setting your requests' Content-Type and using separate templates.\n\n## Run modes\n\n### node.js\n\nLambda handlers with `serverless-offline` for the `node.js` runtime can run in different execution modes and have some differences with a variety of pros and cons. they are currently mutually exclusive and it's not possible to use a combination, e.g. use `in-process` for one Lambda, and `worker-threads` for another. It is planned to combine the flags into one single flag in the future and also add support for combining run modes.\n\n#### worker-threads (default)\n\n- handlers run in their own context\n- memory is not being shared between handlers, memory consumption is therefore higher\n- memory is being released when handlers reload or after usage\n- environment (process.env) is not being shared across handlers\n- global state is not being shared across handlers\n- easy debugging\n\nNOTE:\n\n- native modules need to be a Node-API addon or be declared as context-aware using NODE_MODULE_INIT(): https://nodejs.org/docs/latest/api/addons.html#worker-support\n\n#### in-process\n\n- handlers run in the same context (instance) as `serverless` and `serverless-offline`\n- memory is being shared across lambda handlers as well as with `serverless` and `serverless-offline`\n- no reloading capabilities as it is [currently] not possible to implement for commonjs handlers (without memory leaks) and for esm handlers\n- environment (process.env) is being shared across handlers as well as with `serverless` and `serverless-offline`\n- global state is being shared across lambda handlers as well as with `serverless` and `serverless-offline`\n- easy debugging\n\n#### docker\n\n- handlers run in a docker container\n- memory is not being shared between handlers, memory consumption is therefore higher\n- memory is being released when handlers reload or after usage\n- environment (process.env) is not being shared across handlers\n- global state is not being shared across handlers\n- debugging more complicated\n\n### Python, Ruby, Go, Java (incl. Kotlin, Groovy, Scala)\n\nthe Lambda handler process is running in a child process.\n\n## Invoke Lambda\n\nTo use `Lambda.invoke` you need to set the lambda endpoint to the `serverless-offline` endpoint:\n\n```js\nimport { env } from \"node:process\"\nimport aws from \"aws-sdk\"\n\nconst lambda = new aws.Lambda({\n  apiVersion: \"2015-03-31\",\n  // endpoint needs to be set only if it deviates from the default\n  endpoint: env.IS_OFFLINE\n    ? \"http://localhost:3002\"\n    : \"https://lambda.us-east-1.amazonaws.com\",\n})\n```\n\nAll your lambdas can then be invoked in a handler using\n\n```js\nimport { Buffer } from \"node:buffer\"\nimport aws from \"aws-sdk\"\n\nconst { stringify } = JSON\n\nconst lambda = new aws.Lambda({\n  apiVersion: \"2015-03-31\",\n  endpoint: \"http://localhost:3002\",\n})\n\nexport async function handler() {\n  const clientContextData = stringify({\n    foo: \"foo\",\n  })\n\n  const payload = stringify({\n    data: \"foo\",\n  })\n\n  const params = {\n    ClientContext: Buffer.from(clientContextData).toString(\"base64\"),\n    // FunctionName is composed of: service name - stage - function name, e.g.\n    FunctionName: \"myServiceName-dev-invokedHandler\",\n    InvocationType: \"RequestResponse\",\n    Payload: payload,\n  }\n\n  const response = await lambda.invoke(params).promise()\n\n  return {\n    body: stringify(response),\n    statusCode: 200,\n  }\n}\n```\n\nYou can also invoke using the aws cli by specifying `--endpoint-url`\n\n```\naws lambda invoke /dev/null \\\n  --endpoint-url http://localhost:3002 \\\n  --function-name myServiceName-dev-invokedHandler\n```\n\nList of available function names and their corresponding serverless.yml function keys\nare listed after the server starts. This is important if you use a custom naming\nscheme for your functions as `serverless-offline` will use your custom name.\nThe left side is the function's key in your `serverless.yml`\n(`invokedHandler` in the example below) and the right side is the function name\nthat is used to call the function externally such as `aws-sdk`\n(`myServiceName-dev-invokedHandler` in the example below):\n\n```\nserverless offline\n...\noffline: Starting Offline: local/us-east-1.\noffline: Offline [http for lambda] listening on http://localhost:3002\noffline: Function names exposed for local invocation by aws-sdk:\n           * invokedHandler: myServiceName-dev-invokedHandler\n```\n\nTo list the available manual invocation paths exposed for targeting\nby `aws-sdk` and `aws-cli`, use `SLS_DEBUG=*` with `serverless offline`. After the invoke server starts up, full list of endpoints will be displayed:\n\n```\nSLS_DEBUG=* serverless offline\n...\noffline: Starting Offline: local/us-east-1.\n...\noffline: Offline [http for lambda] listening on http://localhost:3002\noffline: Function names exposed for local invocation by aws-sdk:\n           * invokedHandler: myServiceName-dev-invokedHandler\n[offline] Lambda Invocation Routes (for AWS SDK or AWS CLI):\n           * POST http://localhost:3002/2015-03-31/functions/myServiceName-dev-invokedHandler/invocations\n[offline] Lambda Async Invocation Routes (for AWS SDK or AWS CLI):\n           * POST http://localhost:3002/2014-11-13/functions/myServiceName-dev-invokedHandler/invoke-async/\n```\n\nYou can manually target these endpoints with a REST client to debug your lambda\nfunction if you want to. Your `POST` JSON body will be the `Payload` passed to your function if you were\nto calling it via `aws-sdk`.\n\n## The `process.env.IS_OFFLINE` variable\n\nWill be `\"true\"` in your handlers when using `serverless-offline`.\n\n## Docker and Layers\n\nTo use layers with serverless-offline, you need to have the `useDocker` option set to true. This can either be by using the `--useDocker` command, or in your serverless.yml like this:\n\n```yml\ncustom:\n  serverless-offline:\n    useDocker: true\n```\n\nThis will allow the docker container to look up any information about layers, download and use them. For this to work, you must be using:\n\n- AWS as a provider, it won't work with other provider types.\n- Layers that are compatible with your runtime.\n- ARNs for layers. Local layers aren't supported as yet.\n- A local AWS account set-up that can query and download layers.\n\nIf you're using least-privilege principals for your AWS roles, this policy should get you by:\n\n```json\n{\n  \"Statement\": [\n    {\n      \"Action\": \"lambda:GetLayerVersion\",\n      \"Effect\": \"Allow\",\n      \"Resource\": \"arn:aws:lambda:*:*:layer:*:*\"\n    }\n  ],\n  \"Version\": \"2012-10-17\"\n}\n```\n\nOnce you run a function that boots up the Docker container, it'll look through the layers for that function, download them in order to your layers folder, and save a hash of your layers so it can be re-used in future. You'll only need to re-download your layers if they change in the future. If you want your layers to re-download, simply remove your layers folder.\n\nYou should then be able to invoke functions as normal, and they're executed against the layers in your docker container.\n\n### Additional Options\n\nThere are 5 additional options available for Docker and Layer usage.\n\n- dockerHost\n- dockerHostServicePath\n- dockerNetwork\n- dockerReadOnly\n- layersDir\n\n#### dockerHost\n\nWhen running Docker Lambda inside another Docker container, you may need to configure the host name for the host machine to resolve networking issues between Docker Lambda and the host. Typically in such cases you would set this to `host.docker.internal`.\n\n#### dockerHostServicePath\n\nWhen running Docker Lambda inside another Docker container, you may need to override the code path that gets mounted to the Docker Lambda container relative to the host machine. Typically in such cases you would set this to `${PWD}`.\n\n#### dockerNetwork\n\nWhen running Docker Lambda inside another Docker container, you may need to override network that Docker Lambda connects to in order to communicate with other containers.\n\n#### dockerReadOnly\n\nFor certain programming languages and frameworks, it's desirable to be able to write to the filesystem for things like testing with local SQLite databases, or other testing-only modifications. For this, you can set `dockerReadOnly: false`, and this will allow local filesystem modifications. This does not strictly mimic AWS Lambda, as Lambda has a Read-Only filesystem, so this should be used as a last resort.\n\n#### layersDir\n\nBy default layers are downloaded on a per-project basis, however, if you want to share them across projects, you can download them to a common place. For example, `layersDir: /tmp/layers` would allow them to be shared across projects. Make sure when using this setting that the directory you are writing layers to can be shared by docker.\n\n## Authorizers\n\n### Token authorizers\n\nAs defined in the [Serverless Documentation](https://serverless.com/framework/docs/providers/aws/events/apigateway/#setting-api-keys-for-your-rest-api) you can use API Keys as a simple authentication method.\n\nServerless-offline will emulate the behaviour of APIG and create a random token that's printed on the screen. With this token you can access your private methods adding `x-api-key: generatedToken` to your request header. All api keys will share the same token.\n\n### Custom authorizers\n\nOnly [custom authorizers](https://aws.amazon.com/blogs/compute/introducing-custom-authorizers-in-amazon-api-gateway/) are supported. Custom authorizers are executed before a Lambda function is executed and return an Error or a Policy document.\n\nThe Custom authorizer is passed an `event` object as below:\n\n```js\n{\n  \"authorizationToken\": \"\u003cIncoming bearer token\u003e\",\n  \"methodArn\": \"arn:aws:execute-api:\u003cRegion id\u003e:\u003cAccount id\u003e:\u003cAPI id\u003e/\u003cStage\u003e/\u003cMethod\u003e/\u003cResource path\u003e\",\n  \"type\": \"TOKEN\"\n}\n```\n\nThe `methodArn` does not include the Account id or API id.\n\nThe plugin only supports retrieving Tokens from headers. You can configure the header as below:\n\n```js\n\"authorizer\": {\n  \"authorizerResultTtlInSeconds\": \"0\",\n  \"identitySource\": \"method.request.header.Authorization\", // or method.request.header.SomeOtherHeader\n  \"type\": \"TOKEN\"\n}\n```\n\n### Remote authorizers\n\nYou are able to mock the response from remote authorizers by setting the environmental variable `AUTHORIZER` before running `sls offline start`\n\nExample:\n\n\u003e Unix: `export AUTHORIZER='{\"principalId\": \"123\"}'`\n\n\u003e Windows: `SET AUTHORIZER='{\"principalId\": \"123\"}'`\n\n### JWT authorizers\n\nFor HTTP APIs, [JWT authorizers](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-jwt-authorizer.html)\ndefined in the `serverless.yml` can be used to validate the token and scopes in the token. However at this time,\nthe signature of the JWT is not validated with the defined issuer. Since this is a security risk, this feature is\nonly enabled with the `--ignoreJWTSignature` flag. Make sure to only set this flag for local development work.\n\n### Serverless plugin authorizers\n\nIf your authentication needs are custom and not satisfied by the existing capabilities of the Serverless offline project, you can inject your own authentication strategy. To inject a custom strategy for Lambda invocation, you define a custom variable under `offline` called `customAuthenticationProvider` in the serverless.yml file. The value of the custom variable will be used to `require(your customAuthenticationProvider value)` where the location is expected to return a function with the following signature.\n\n```yaml\noffline:\n  customAuthenticationProvider: ./path/to/custom-authentication-provider\n```\n\n```js\n// ./path/to/customer-authentication-provider.js\n\nmodule.exports = function (endpoint, functionKey, method, path) {\n  return {\n    getAuthenticateFunction() {\n      return {\n        async authenticate(request, h) {\n          // your implementation\n        },\n      }\n    },\n\n    name: \"your strategy name\",\n    scheme: \"your scheme name\",\n  }\n}\n```\n\nA working example of injecting a custom authorization provider can be found in the projects integration tests under the folder [`custom-authentication`](./tests/integration/custom-authentication).\n\n## Custom headers\n\nYou are able to use some custom headers in your request to gain more control over the requestContext object.\n\n| Header                          | Event key                                                   | Example                                                                           |\n| ------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------------- |\n| cognito-identity-id             | event.requestContext.identity.cognitoIdentityId             |                                                                                   |\n| cognito-authentication-provider | event.requestContext.identity.cognitoAuthenticationProvider |                                                                                   |\n| sls-offline-authorizer-override | event.requestContext.authorizer                             | { \"iam\": {\"cognitoUser\": { \"amr\": [\"unauthenticated\"], \"identityId\": \"abc123\" }}} |\n\nBy doing this you are now able to change those values using a custom header. This can help you with easier authentication or retrieving the userId from a `cognitoAuthenticationProvider` value.\n\n## Environment variables\n\nYou are able to use environment variables to customize identity params in event context.\n\n| Environment Variable                | Event key                                                   |\n| ----------------------------------- | ----------------------------------------------------------- |\n| SLS_COGNITO_IDENTITY_POOL_ID        | event.requestContext.identity.cognitoIdentityPoolId         |\n| SLS_ACCOUNT_ID                      | event.requestContext.identity.accountId                     |\n| SLS_COGNITO_IDENTITY_ID             | event.requestContext.identity.cognitoIdentityId             |\n| SLS_CALLER                          | event.requestContext.identity.caller                        |\n| SLS_API_KEY                         | event.requestContext.identity.apiKey                        |\n| SLS_API_KEY_ID                      | event.requestContext.identity.apiKeyId                      |\n| SLS_COGNITO_AUTHENTICATION_TYPE     | event.requestContext.identity.cognitoAuthenticationType     |\n| SLS_COGNITO_AUTHENTICATION_PROVIDER | event.requestContext.identity.cognitoAuthenticationProvider |\n\nYou can use [serverless-dotenv-plugin](https://github.com/colynb/serverless-dotenv-plugin) to load environment variables from your `.env` file.\n\n## AWS API Gateway Features\n\n### Velocity Templates\n\n[Serverless doc](https://serverless.com/framework/docs/providers/aws/events/apigateway#request-templates)\n~ [AWS doc](http://docs.aws.amazon.com/apigateway/latest/developerguide/models-mappings.html#models-mappings-mappings)\n\nYou can supply response and request templates for each function. This is optional. To do so you will have to place function specific template files in the same directory as your function file and add the .req.vm extension to the template filename.\nFor example,\nif your function is in code-file: `helloworld.js`,\nyour response template should be in file: `helloworld.res.vm` and your request template in file `helloworld.req.vm`.\n\n#### Velocity nuances\n\nConsider this requestTemplate for a POST endpoint:\n\n```json\n\"application/json\": {\n  \"payload\": \"$input.json('$')\",\n  \"id_json\": \"$input.json('$.id')\",\n  \"id_path\": \"$input.path('$').id\"\n}\n```\n\nNow let's make a request with this body: `{ \"id\": 1 }`\n\nAWS parses the event as such:\n\n```js\n{\n  \"payload\": {\n    \"id\": 1\n  },\n  \"id_json\": 1,\n  \"id_path\": \"1\" // Notice the string\n}\n```\n\nWhereas Offline parses:\n\n```js\n{\n  \"payload\": {\n    \"id\": 1\n  },\n  \"id_json\": 1,\n  \"id_path\": 1 // Notice the number\n}\n```\n\nAccessing an attribute after using `$input.path` will return a string on AWS (expect strings like `\"1\"` or `\"true\"`) but not with Offline (`1` or `true`).\nYou may find other differences.\n\n### CORS\n\n[Serverless doc](https://serverless.com/framework/docs/providers/aws/events/apigateway#enabling-cors)\n\nFor HTTP APIs, the CORS configuration will work out of the box. Any CLI arguments\npassed in will be ignored.\n\nFor REST APIs, if the endpoint config has CORS set to true, the plugin will use the CLI CORS options for the associated route.\nOtherwise, no CORS headers will be added.\n\n### Catch-all Path Variables\n\n[AWS doc](https://aws.amazon.com/blogs/aws/api-gateway-update-new-features-simplify-api-development/)\n\nSet greedy paths like `/store/{proxy+}` that will intercept requests made to `/store/list-products`, `/store/add-product`, etc...\n\n### ANY method\n\n[AWS doc](https://aws.amazon.com/blogs/aws/api-gateway-update-new-features-simplify-api-development/)\n\nWorks out of the box.\n\n### Lambda and Lambda Proxy Integrations\n\n[Serverless doc](https://serverless.com/framework/docs/providers/aws/events/apigateway#lambda-proxy-integration)\n~ [AWS doc](http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html)\n\nWorks out of the box. See examples in the manual_test directory.\n\n### HTTP Proxy\n\n[Serverless doc](https://serverless.com/framework/docs/providers/aws/events/apigateway#setting-an-http-proxy-on-api-gateway)\n~\n[AWS doc - AWS::ApiGateway::Method](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-method.html)\n~\n[AWS doc - AWS::ApiGateway::Resource](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-resource.html)\n\nExample of enabling proxy:\n\n```yml\ncustom:\n  serverless-offline:\n    resourceRoutes: true\n```\n\nor\n\n```yml\n    YourCloudFormationMethodId:\n      Properties:\n        ......\n        Integration:\n          Type: HTTP_PROXY\n          Uri: 'https://s3-${self:custom.region}.amazonaws.com/${self:custom.yourBucketName}/{proxy}'\n          ......\n      Type: AWS::ApiGateway::Method\n```\n\n```yml\ncustom:\n  serverless-offline:\n    resourceRoutes:\n      YourCloudFormationMethodId:\n        Uri: \"http://localhost:3001/assets/{proxy}\"\n```\n\n### Response parameters\n\n[AWS doc](http://docs.aws.amazon.com/apigateway/latest/developerguide/request-response-data-mappings.html#mapping-response-parameters)\n\nYou can set your response's headers using ResponseParameters.\n\nMay not work properly. Please PR. (Difficulty: hard?)\n\nExample response velocity template:\n\n```js\n\"responseParameters\": {\n  \"method.response.header.X-Powered-By\": \"Serverless\", // a string\n  \"method.response.header.Warning\": \"integration.response.body\", // the whole response\n  \"method.response.header.Location\": \"integration.response.body.some.key\" // a pseudo JSON-path\n},\n```\n\n## WebSocket\n\nUsage in order to send messages back to clients:\n\n`POST http://localhost:3001/@connections/{connectionId}`\n\nOr,\n\n```js\nimport aws from 'aws-sdk'\n\nconst apiGatewayManagementApi = new aws.ApiGatewayManagementApi({\n  apiVersion: '2018-11-29',\n  endpoint: 'http://localhost:3001',\n});\n\napiGatewayManagementApi.postToConnection({\n  ConnectionId: ...,\n  Data: ...,\n});\n```\n\nWhere the `event` is received in the lambda handler function.\n\nThere's support for [websocketsApiRouteSelectionExpression](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-selection-expressions.html) in it's basic form: `$request.body.x.y.z`, where the default value is `$request.body.action`.\n\n## Debug process\n\nServerless offline plugin will respond to the overall framework settings and output additional information to the console in debug mode. In order to do this you will have to set the `SLS_DEBUG` environmental variable. You can run the following in the command line to switch to debug mode execution.\n\n\u003e Unix: `export SLS_DEBUG=*`\n\n\u003e Windows: `SET SLS_DEBUG=*`\n\nInteractive debugging is also possible for your project if you have installed the node-inspector module and chrome browser. You can then run the following command line inside your project's root.\n\nInitial installation:\n`npm install -g node-inspector`\n\nFor each debug run:\n`node-debug sls offline`\n\nThe system will start in wait status. This will also automatically start the chrome browser and wait for you to set breakpoints for inspection. Set the breakpoints as needed and, then, click the play button for the debugging to continue.\n\nDepending on the breakpoint, you may need to call the URL path for your function in separate browser window for your serverless function to be run and made available for debugging.\n\n### Interactive Debugging with Visual Studio Code (VSC)\n\nWith newer versions of node (6.3+) the node inspector is already part of your node environment and you can take advantage of debugging inside your IDE with source-map support. Here is the example configuration to debug interactively with VSC. It has two steps.\n\n#### Step 1 : Adding a launch configuration in IDE\n\nAdd a new [launch configuration](https://code.visualstudio.com/docs/editor/debugging) to VSC like this:\n\n```json\n{\n  \"cwd\": \"${workspaceFolder}\",\n  \"name\": \"Debug Serverless Offline\",\n  \"request\": \"launch\",\n  \"runtimeArgs\": [\"run\", \"debug\"],\n  \"runtimeExecutable\": \"npm\",\n  \"sourceMaps\": true,\n  \"type\": \"node\"\n}\n```\n\n#### Step2 : Adding a debug script\n\nYou will also need to add a `debug` script reference in your `package.json file`\n\nAdd this to the `scripts` section:\n\n\u003e Unix/Mac: `\"debug\" : \"export SLS_DEBUG=* \u0026\u0026 node --inspect /usr/local/bin/serverless offline\"`\n\n\u003e Windows: `\"debug\": \"SET SLS_DEBUG=* \u0026\u0026 node --inspect node_modules\\\\serverless\\\\bin\\\\serverless offline\"`\n\nExample:\n\n```json\n....\n\"scripts\": {\n  \"debug\" : \"SET SLS_DEBUG=* \u0026\u0026 node --inspect node_modules\\\\serverless\\\\bin\\\\serverless offline\"\n}\n```\n\nIn VSC, you can, then, add breakpoints to your code. To start a debug sessions you can either start your script in `package.json` by clicking the hovering debug intellisense icon or by going to your debug pane and selecting the Debug Serverless Offline configuration.\n\n## Resource permissions and AWS profile\n\nLambda functions assume an IAM role during execution: the framework creates this role and set all the permission provided in the `iamRoleStatements` section of `serverless.yml`.\n\nHowever, serverless offline makes use of your local AWS profile credentials to run the lambda functions and that might result in a different set of permissions. By default, the aws-sdk would load credentials for you default AWS profile specified in your configuration file.\n\nYou can change this profile directly in the code or by setting proper environment variables. Setting the `AWS_PROFILE` environment variable before calling `serverless` offline to a different profile would effectively change the credentials, e.g.\n\n`AWS_PROFILE=\u003cprofile\u003e serverless offline`\n\n## Simulation quality\n\nThis plugin simulates API Gateway for many practical purposes, good enough for development - but is not a perfect simulator.\nSpecifically, Lambda currently runs on Node.js v12.x, v14.x and v16.x ([AWS Docs](https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)), whereas _Offline_ runs on your own runtime where no memory limits are enforced.\n\n## Usage with other plugins\n\nWhen combining this plugin with other plugins there are a few things that you need to keep in mind.\n\nYou should run `serverless offline start` instead of `serverless offline`. The `start` command fires the `offline:start:init` and `offline:start:end` lifecycle hooks which can be used by other plugins to process your code, add resources, perform cleanups, etc.\n\nThe order in which plugins are added to `serverless.yml` is relevant.\nPlugins are executed in order, so plugins that process your code or add resources should be added first so they are ready when this plugin starts.\n\nFor example:\n\n```yml\nplugins:\n  - serverless-middleware # modifies some of your handler based on configuration\n  - serverless-webpack # package your javascript handlers using webpack\n  - serverless-dynamodb # adds a local dynamo db\n  - serverless-offline # runs last so your code has been pre-processed and dynamo is ready\n```\n\nThat works because all those plugins listen to the `offline:start:init` to do their processing.\nSimilarly they listen to `offline:start:end` to perform cleanup (stop dynamo db, remove temporary files, etc).\n\n## Credits and inspiration\n\nThis plugin was initially a fork of [Nopik](https://github.com/Nopik/)'s [Serverless-serve](https://github.com/Nopik/serverless-serve).\n\n## License\n\nMIT\n\n## Contributing\n\nYes, thank you!\nThis plugin is community-driven, most of its features are from different authors.\nPlease update the docs and tests and add your name to the package.json file.\nWe try to follow [Airbnb's JavaScript Style Guide](https://github.com/airbnb/javascript).\n\n## Contributors\n\n[\u003cimg alt=\"dnalborczyk\" src=\"https://avatars.githubusercontent.com/u/2903325?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dnalborczyk)[\u003cimg alt=\"dherault\" src=\"https://avatars.githubusercontent.com/u/4154003?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dherault)[\u003cimg alt=\"computerpunc\" src=\"https://avatars.githubusercontent.com/u/721008?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/computerpunc)[\u003cimg alt=\"frozenbonito\" src=\"https://avatars.githubusercontent.com/u/26363256?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/frozenbonito)[\u003cimg alt=\"leonardoalifraco\" src=\"https://avatars.githubusercontent.com/u/2942943?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/leonardoalifraco)[\u003cimg alt=\"medikoo\" src=\"https://avatars.githubusercontent.com/u/122434?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/medikoo)\n\n[\u003cimg alt=\"apancutt\" src=\"https://avatars.githubusercontent.com/u/1040525?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/apancutt)[\u003cimg alt=\"chardos\" src=\"https://avatars.githubusercontent.com/u/4082442?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/chardos)[\u003cimg alt=\"daniel-cottone\" src=\"https://avatars.githubusercontent.com/u/26556340?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/daniel-cottone)[\u003cimg alt=\"DorianMazur\" src=\"https://avatars.githubusercontent.com/u/46839236?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/DorianMazur)[\u003cimg alt=\"bryantbiggs\" src=\"https://avatars.githubusercontent.com/u/10913471?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/bryantbiggs)[\u003cimg alt=\"pgrzesik\" src=\"https://avatars.githubusercontent.com/u/17499590?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/pgrzesik)\n\n[\u003cimg alt=\"mikestaub\" src=\"https://avatars.githubusercontent.com/u/1254558?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/mikestaub)[\u003cimg alt=\"Bilal-S\" src=\"https://avatars.githubusercontent.com/u/668901?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Bilal-S)[\u003cimg alt=\"juanjoDiaz\" src=\"https://avatars.githubusercontent.com/u/3322485?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/juanjoDiaz)[\u003cimg alt=\"zoellner\" src=\"https://avatars.githubusercontent.com/u/2665319?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/zoellner)[\u003cimg alt=\"frsechet\" src=\"https://avatars.githubusercontent.com/u/7351940?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/frsechet)[\u003cimg alt=\"johncmckim\" src=\"https://avatars.githubusercontent.com/u/1297227?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/johncmckim)\n\n[\u003cimg alt=\"dl748\" src=\"https://avatars.githubusercontent.com/u/4815868?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dl748)[\u003cimg alt=\"ThisIsNoZaku\" src=\"https://avatars.githubusercontent.com/u/4680766?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ThisIsNoZaku)[\u003cimg alt=\"darthtrevino\" src=\"https://avatars.githubusercontent.com/u/113544?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/darthtrevino)[\u003cimg alt=\"NicolasSeiler\" src=\"https://avatars.githubusercontent.com/u/31805224?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/NicolasSeiler)[\u003cimg alt=\"miltador\" src=\"https://avatars.githubusercontent.com/u/17062283?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/miltador)[\u003cimg alt=\"moroine\" src=\"https://avatars.githubusercontent.com/u/4658821?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/moroine)\n\n[\u003cimg alt=\"gertjvr\" src=\"https://avatars.githubusercontent.com/u/1691062?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/gertjvr)[\u003cimg alt=\"bytekast\" src=\"https://avatars.githubusercontent.com/u/241901?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/bytekast)[\u003cimg alt=\"jormaechea\" src=\"https://avatars.githubusercontent.com/u/5612500?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jormaechea)[\u003cimg alt=\"thomaschaaf\" src=\"https://avatars.githubusercontent.com/u/893393?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/thomaschaaf)[\u003cimg alt=\"dortega3000\" src=\"https://avatars.githubusercontent.com/u/6676525?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dortega3000)[\u003cimg alt=\"tom-marsh\" src=\"https://avatars.githubusercontent.com/u/18220186?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/tom-marsh)\n\n[\u003cimg alt=\"rwynn\" src=\"https://avatars.githubusercontent.com/u/260672?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/rwynn)[\u003cimg alt=\"robbtraister\" src=\"https://avatars.githubusercontent.com/u/5815296?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/robbtraister)[\u003cimg alt=\"joubertredrat\" src=\"https://avatars.githubusercontent.com/u/1520407?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/joubertredrat)[\u003cimg alt=\"jack-seek\" src=\"https://avatars.githubusercontent.com/u/19676584?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jack-seek)[\u003cimg alt=\"perkyguy\" src=\"https://avatars.githubusercontent.com/u/4624648?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/perkyguy)[\u003cimg alt=\"ansraliant\" src=\"https://avatars.githubusercontent.com/u/7121475?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ansraliant)\n\n[\u003cimg alt=\"hueniverse\" src=\"https://avatars.githubusercontent.com/u/56631?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/hueniverse)[\u003cimg alt=\"james-relyea\" src=\"https://avatars.githubusercontent.com/u/1944491?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/james-relyea)[\u003cimg alt=\"sulaysumaria\" src=\"https://avatars.githubusercontent.com/u/174357920?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/sulaysumaria)[\u003cimg alt=\"ondrowan\" src=\"https://avatars.githubusercontent.com/u/423776?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ondrowan)[\u003cimg alt=\"franciscocpg\" src=\"https://avatars.githubusercontent.com/u/3680556?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/franciscocpg)[\u003cimg alt=\"AyushG3112\" src=\"https://avatars.githubusercontent.com/u/21307931?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/AyushG3112)\n\n[\u003cimg alt=\"Andorbal\" src=\"https://avatars.githubusercontent.com/u/579839?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Andorbal)[\u003cimg alt=\"AlexHayton\" src=\"https://avatars.githubusercontent.com/u/63102?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/AlexHayton)[\u003cimg alt=\"andreipopovici\" src=\"https://avatars.githubusercontent.com/u/1143417?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/andreipopovici)[\u003cimg alt=\"awwong1\" src=\"https://avatars.githubusercontent.com/u/2760111?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/awwong1)[\u003cimg alt=\"emmoistner\" src=\"https://avatars.githubusercontent.com/u/5419727?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/emmoistner)[\u003cimg alt=\"coyoteecd\" src=\"https://avatars.githubusercontent.com/u/47973420?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/coyoteecd)\n\n[\u003cimg alt=\"OrKoN\" src=\"https://avatars.githubusercontent.com/u/399150?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/OrKoN)[\u003cimg alt=\"trevor-leach\" src=\"https://avatars.githubusercontent.com/u/39206334?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/trevor-leach)[\u003cimg alt=\"bebbi\" src=\"https://avatars.githubusercontent.com/u/2752391?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/bebbi)[\u003cimg alt=\"paulhbarker\" src=\"https://avatars.githubusercontent.com/u/7366567?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/paulhbarker)[\u003cimg alt=\"njriordan\" src=\"https://avatars.githubusercontent.com/u/11200170?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/njriordan)[\u003cimg alt=\"adieuadieu\" src=\"https://avatars.githubusercontent.com/u/438848?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/adieuadieu)\n\n[\u003cimg alt=\"encounter\" src=\"https://avatars.githubusercontent.com/u/549122?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/encounter)[\u003cimg alt=\"leemhenson\" src=\"https://avatars.githubusercontent.com/u/515?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/leemhenson)[\u003cimg alt=\"ALOHACREPES345\" src=\"https://avatars.githubusercontent.com/u/51868219?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ALOHACREPES345)[\u003cimg alt=\"Bob-Thomas\" src=\"https://avatars.githubusercontent.com/u/2785213?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Bob-Thomas)[\u003cimg alt=\"c24w\" src=\"https://avatars.githubusercontent.com/u/710406?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/c24w)[\u003cimg alt=\"cnuss\" src=\"https://avatars.githubusercontent.com/u/819991?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/cnuss)\n\n[\u003cimg alt=\"raySavignone\" src=\"https://avatars.githubusercontent.com/u/10362370?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/raySavignone)[\u003cimg alt=\"pierreis\" src=\"https://avatars.githubusercontent.com/u/203973?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/pierreis)[\u003cimg alt=\"pmuens\" src=\"https://avatars.githubusercontent.com/u/1606004?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/pmuens)[\u003cimg alt=\"mzmiric5\" src=\"https://avatars.githubusercontent.com/u/1480072?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/mzmiric5)[\u003cimg alt=\"purefan\" src=\"https://avatars.githubusercontent.com/u/315880?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/purefan)[\u003cimg alt=\"matt-peck\" src=\"https://avatars.githubusercontent.com/u/18297252?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/matt-peck)\n\n[\u003cimg alt=\"marccampbell\" src=\"https://avatars.githubusercontent.com/u/173451?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/marccampbell)[\u003cimg alt=\"djcrabhat\" src=\"https://avatars.githubusercontent.com/u/803042?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/djcrabhat)[\u003cimg alt=\"ablythe\" src=\"https://avatars.githubusercontent.com/u/6164745?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ablythe)[\u003cimg alt=\"Rawne\" src=\"https://avatars.githubusercontent.com/u/1477918?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Rawne)[\u003cimg alt=\"selcukcihan\" src=\"https://avatars.githubusercontent.com/u/7043904?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/selcukcihan)[\u003cimg alt=\"shalvah\" src=\"https://avatars.githubusercontent.com/u/14361073?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/shalvah)\n\n[\u003cimg alt=\"footballencarta\" src=\"https://avatars.githubusercontent.com/u/1312258?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/footballencarta)[\u003cimg alt=\"francisu\" src=\"https://avatars.githubusercontent.com/u/944949?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/francisu)[\u003cimg alt=\"patrickheeney\" src=\"https://avatars.githubusercontent.com/u/1407228?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/patrickheeney)[\u003cimg alt=\"re1ro\" src=\"https://avatars.githubusercontent.com/u/470292?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/re1ro)[\u003cimg alt=\"andidev\" src=\"https://avatars.githubusercontent.com/u/571389?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/andidev)[\u003cimg alt=\"arnas\" src=\"https://avatars.githubusercontent.com/u/13507001?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/arnas)\n\n[\u003cimg alt=\"clschnei\" src=\"https://avatars.githubusercontent.com/u/1232625?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/clschnei)[\u003cimg alt=\"d10-cc\" src=\"https://avatars.githubusercontent.com/u/94011455?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/d10-cc)[\u003cimg alt=\"pettyalex\" src=\"https://avatars.githubusercontent.com/u/3219141?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/pettyalex)[\u003cimg alt=\"domdomegg\" src=\"https://avatars.githubusercontent.com/u/4953590?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/domdomegg)[\u003cimg alt=\"apalumbo\" src=\"https://avatars.githubusercontent.com/u/1729784?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/apalumbo)[\u003cimg alt=\"rion18\" src=\"https://avatars.githubusercontent.com/u/5338637?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/rion18)\n\n[\u003cimg alt=\"anishkny\" src=\"https://avatars.githubusercontent.com/u/357499?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/anishkny)[\u003cimg alt=\"cameroncooper\" src=\"https://avatars.githubusercontent.com/u/898689?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/cameroncooper)[\u003cimg alt=\"cmuto09\" src=\"https://avatars.githubusercontent.com/u/4679612?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/cmuto09)[\u003cimg alt=\"dschep\" src=\"https://avatars.githubusercontent.com/u/667763?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dschep)[\u003cimg alt=\"dimadk24\" src=\"https://avatars.githubusercontent.com/u/25607790?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dimadk24)[\u003cimg alt=\"dwbelliston\" src=\"https://avatars.githubusercontent.com/u/11450118?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dwbelliston)\n\n[\u003cimg alt=\"LoganArnett\" src=\"https://avatars.githubusercontent.com/u/8780547?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/LoganArnett)[\u003cimg alt=\"DocLM\" src=\"https://avatars.githubusercontent.com/u/2318483?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/DocLM)[\u003cimg alt=\"njyjn\" src=\"https://avatars.githubusercontent.com/u/10694375?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/njyjn)[\u003cimg alt=\"perrin4869\" src=\"https://avatars.githubusercontent.com/u/5774716?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/perrin4869)[\u003cimg alt=\"joewestcott\" src=\"https://avatars.githubusercontent.com/u/11187741?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/joewestcott)[\u003cimg alt=\"jeroenvollenbrock\" src=\"https://avatars.githubusercontent.com/u/4551130?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jeroenvollenbrock)\n\n[\u003cimg alt=\"garunski\" src=\"https://avatars.githubusercontent.com/u/1002770?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/garunski)[\u003cimg alt=\"G-Rath\" src=\"https://avatars.githubusercontent.com/u/3151613?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/G-Rath)[\u003cimg alt=\"tqfipe\" src=\"https://avatars.githubusercontent.com/u/19840740?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/tqfipe)[\u003cimg alt=\"eabadjiev\" src=\"https://avatars.githubusercontent.com/u/934059?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/eabadjiev)[\u003cimg alt=\"efrain17\" src=\"https://avatars.githubusercontent.com/u/21026552?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/efrain17)[\u003cimg alt=\"thepont\" src=\"https://avatars.githubusercontent.com/u/2901992?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/thepont)\n\n[\u003cimg alt=\"petetnt\" src=\"https://avatars.githubusercontent.com/u/7641760?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/petetnt)[\u003cimg alt=\"PsychicCat\" src=\"https://avatars.githubusercontent.com/u/4073856?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/PsychicCat)[\u003cimg alt=\"randytarampi\" src=\"https://avatars.githubusercontent.com/u/592216?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/randytarampi)[\u003cimg alt=\"Raph22\" src=\"https://avatars.githubusercontent.com/u/18127594?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Raph22)[\u003cimg alt=\"juarezjaramillo\" src=\"https://avatars.githubusercontent.com/u/4152822?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/juarezjaramillo)[\u003cimg alt=\"uh-zz\" src=\"https://avatars.githubusercontent.com/u/47747828?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/uh-zz)\n\n[\u003cimg alt=\"rfranco\" src=\"https://avatars.githubusercontent.com/u/399203?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/rfranco)[\u003cimg alt=\"Trott\" src=\"https://avatars.githubusercontent.com/u/718899?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Trott)[\u003cimg alt=\"RichiCoder1\" src=\"https://avatars.githubusercontent.com/u/2391878?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/RichiCoder1)[\u003cimg alt=\"rishi8094\" src=\"https://avatars.githubusercontent.com/u/20362222?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/rishi8094)[\u003cimg alt=\"rloomans\" src=\"https://avatars.githubusercontent.com/u/92133?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/rloomans)[\u003cimg alt=\"roberttaylor426\" src=\"https://avatars.githubusercontent.com/u/535032?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/roberttaylor426)\n\n[\u003cimg alt=\"wwsno\" src=\"https://avatars.githubusercontent.com/u/6328924?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/wwsno)[\u003cimg alt=\"gribnoysup\" src=\"https://avatars.githubusercontent.com/u/5036933?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/gribnoysup)[\u003cimg alt=\"sergiodurand\" src=\"https://avatars.githubusercontent.com/u/19421918?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/sergiodurand)[\u003cimg alt=\"sethetter\" src=\"https://avatars.githubusercontent.com/u/655500?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/sethetter)[\u003cimg alt=\"shineli-not-used-anymore\" src=\"https://avatars.githubusercontent.com/u/1043331?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/shineli-not-used-anymore)[\u003cimg alt=\"ericctsf\" src=\"https://avatars.githubusercontent.com/u/42775388?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ericctsf)\n\n[\u003cimg alt=\"BorjaMacedo\" src=\"https://avatars.githubusercontent.com/u/16381759?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/BorjaMacedo)[\u003cimg alt=\"kdybicz\" src=\"https://avatars.githubusercontent.com/u/13134892?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/kdybicz)[\u003cimg alt=\"kenleytomlin\" src=\"https://avatars.githubusercontent.com/u/3004590?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/kenleytomlin)[\u003cimg alt=\"kevinhankens\" src=\"https://avatars.githubusercontent.com/u/679364?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/kevinhankens)[\u003cimg alt=\"kerueter\" src=\"https://avatars.githubusercontent.com/u/16644743?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/kerueter)[\u003cimg alt=\"ktwbc\" src=\"https://avatars.githubusercontent.com/u/624611?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ktwbc)\n\n[\u003cimg alt=\"kohanian\" src=\"https://avatars.githubusercontent.com/u/8570821?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/kohanian)[\u003cimg alt=\"kyusungpark\" src=\"https://avatars.githubusercontent.com/u/58890841?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/kyusungpark)[\u003cimg alt=\"lalifraco-devspark\" src=\"https://avatars.githubusercontent.com/u/13339324?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/lalifraco-devspark)[\u003cimg alt=\"DynamicSTOP\" src=\"https://avatars.githubusercontent.com/u/9434504?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/DynamicSTOP)[\u003cimg alt=\"brazilianbytes\" src=\"https://avatars.githubusercontent.com/u/1900570?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/brazilianbytes)[\u003cimg alt=\"Marcel-G\" src=\"https://avatars.githubusercontent.com/u/2770666?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Marcel-G)\n\n[\u003cimg alt=\"neverendingqs\" src=\"https://avatars.githubusercontent.com/u/8854618?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/neverendingqs)[\u003cimg alt=\"msjonker\" src=\"https://avatars.githubusercontent.com/u/781683?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/msjonker)[\u003cimg alt=\"Takeno\" src=\"https://avatars.githubusercontent.com/u/1499063?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Takeno)[\u003cimg alt=\"kelchm\" src=\"https://avatars.githubusercontent.com/u/172301?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/kelchm)[\u003cimg alt=\"mjmac\" src=\"https://avatars.githubusercontent.com/u/83737?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/mjmac)[\u003cimg alt=\"mohokh67\" src=\"https://avatars.githubusercontent.com/u/10816168?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/mohokh67)\n\n[\u003cimg alt=\"AlexHladin\" src=\"https://avatars.githubusercontent.com/u/7945837?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/AlexHladin)[\u003cimg alt=\"ojongerius\" src=\"https://avatars.githubusercontent.com/u/1726055?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ojongerius)[\u003cimg alt=\"parasgera\" src=\"https://avatars.githubusercontent.com/u/4932306?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/parasgera)[\u003cimg alt=\"furipon308\" src=\"https://avatars.githubusercontent.com/u/12597185?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/furipon308)[\u003cimg alt=\"hsz\" src=\"https://avatars.githubusercontent.com/u/108333?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/hsz)[\u003cimg alt=\"jeffhall4\" src=\"https://avatars.githubusercontent.com/u/14976795?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jeffhall4)\n\n[\u003cimg alt=\"jgilbert01\" src=\"https://avatars.githubusercontent.com/u/1082126?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jgilbert01)[\u003cimg alt=\"polaris340\" src=\"https://avatars.githubusercontent.com/u/2861192?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/polaris340)[\u003cimg alt=\"khanguyen88\" src=\"https://avatars.githubusercontent.com/u/26890183?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/khanguyen88)[\u003cimg alt=\"kobanyan\" src=\"https://avatars.githubusercontent.com/u/14950314?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/kobanyan)[\u003cimg alt=\"livingmine\" src=\"https://avatars.githubusercontent.com/u/7286614?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/livingmine)[\u003cimg alt=\"lteacher\" src=\"https://avatars.githubusercontent.com/u/6103860?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/lteacher)\n\n[\u003cimg alt=\"martinmicunda\" src=\"https://avatars.githubusercontent.com/u/1643606?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/martinmicunda)[\u003cimg alt=\"nick-w-nick\" src=\"https://avatars.githubusercontent.com/u/43578531?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/nick-w-nick)[\u003cimg alt=\"nori3tsu\" src=\"https://avatars.githubusercontent.com/u/379587?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/nori3tsu)[\u003cimg alt=\"ppasmanik\" src=\"https://avatars.githubusercontent.com/u/3534835?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ppasmanik)[\u003cimg alt=\"ryanzyy\" src=\"https://avatars.githubusercontent.com/u/2299226?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ryanzyy)[\u003cimg alt=\"skhrapko-amplify\" src=\"https://avatars.githubusercontent.com/u/103408480?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/skhrapko-amplify)\n\n[\u003cimg alt=\"adikari\" src=\"https://avatars.githubusercontent.com/u/1757714?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/adikari)[\u003cimg alt=\"tom-stclair\" src=\"https://avatars.githubusercontent.com/u/96192789?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/tom-stclair)[\u003cimg alt=\"tveal\" src=\"https://avatars.githubusercontent.com/u/42526035?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/tveal)[\u003cimg alt=\"constb\" src=\"https://avatars.githubusercontent.com/u/1006766?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/constb)[\u003cimg alt=\"stesie\" src=\"https://avatars.githubusercontent.com/u/113068?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/stesie)[\u003cimg alt=\"stevemao\" src=\"https://avatars.githubusercontent.com/u/6316590?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/stevemao)\n\n[\u003cimg alt=\"trsrm\" src=\"https://avatars.githubusercontent.com/u/1160872?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/trsrm)[\u003cimg alt=\"ittus\" src=\"https://avatars.githubusercontent.com/u/5120965?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ittus)[\u003cimg alt=\"Ankcorn\" src=\"https://avatars.githubusercontent.com/u/7361428?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Ankcorn)[\u003cimg alt=\"expoe-codebuild\" src=\"https://avatars.githubusercontent.com/u/38527465?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/expoe-codebuild)[\u003cimg alt=\"tiagogoncalves89\" src=\"https://avatars.githubusercontent.com/u/55122?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/tiagogoncalves89)[\u003cimg alt=\"czubocha\" src=\"https://avatars.githubusercontent.com/u/23511767?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/czubocha)\n\n[\u003cimg alt=\"tuanmh\" src=\"https://avatars.githubusercontent.com/u/3193353?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/tuanmh)[\u003cimg alt=\"Gregoirevda\" src=\"https://avatars.githubusercontent.com/u/12223738?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Gregoirevda)[\u003cimg alt=\"vivganes\" src=\"https://avatars.githubusercontent.com/u/2035886?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/vivganes)[\u003cimg alt=\"gcphost\" src=\"https://avatars.githubusercontent.com/u/1173636?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/gcphost)[\u003cimg alt=\"YaroslavApatiev\" src=\"https://avatars.githubusercontent.com/u/24372409?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/YaroslavApatiev)[\u003cimg alt=\"zacacollier\" src=\"https://avatars.githubusercontent.com/u/18710669?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/zacacollier)\n\n[\u003cimg alt=\"akinboboye\" src=\"https://avatars.githubusercontent.com/u/60622084?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/akinboboye)[\u003cimg alt=\"allenhartwig\" src=\"https://avatars.githubusercontent.com/u/1261521?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/allenhartwig)[\u003cimg alt=\"ctbaird\" src=\"https://avatars.githubusercontent.com/u/37962844?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ctbaird)[\u003cimg alt=\"demetriusnunes\" src=\"https://avatars.githubusercontent.com/u/4699?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/demetriusnunes)[\u003cimg alt=\"dependabot[bot]\" src=\"https://avatars.githubusercontent.com/in/29110?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/apps/dependabot)[\u003cimg alt=\"drace-rgare\" src=\"https://avatars.githubusercontent.com/u/96196419?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/drace-rgare)\n\n[\u003cimg alt=\"BrandonE\" src=\"https://avatars.githubusercontent.com/u/542245?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/BrandonE)[\u003cimg alt=\"guerrerocarlos\" src=\"https://avatars.githubusercontent.com/u/82532?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/guerrerocarlos)[\u003cimg alt=\"chrismcleod\" src=\"https://avatars.githubusercontent.com/u/1134683?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/chrismcleod)[\u003cimg alt=\"icarus-sullivan\" src=\"https://avatars.githubusercontent.com/u/17626168?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/icarus-sullivan)[\u003cimg alt=\"christophgysin\" src=\"https://avatars.githubusercontent.com/u/527924?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/christophgysin)[\u003cimg alt=\"cdubz\" src=\"https://avatars.githubusercontent.com/u/10456740?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/cdubz)\n\n[\u003cimg alt=\"corwinm\" src=\"https://avatars.githubusercontent.com/u/7642548?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/corwinm)[\u003cimg alt=\"danmactough\" src=\"https://avatars.githubusercontent.com/u/357481?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/danmactough)[\u003cimg alt=\"GeneralistDev\" src=\"https://avatars.githubusercontent.com/u/1705096?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/GeneralistDev)[\u003cimg alt=\"designfrontier\" src=\"https://avatars.githubusercontent.com/u/422540?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/designfrontier)[\u003cimg alt=\"daniel0707\" src=\"https://avatars.githubusercontent.com/u/22343156?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/daniel0707)[\u003cimg alt=\"dnicolson\" src=\"https://avatars.githubusercontent.com/u/2276355?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dnicolson)\n\n[\u003cimg alt=\"dbunker\" src=\"https://avatars.githubusercontent.com/u/751580?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dbunker)[\u003cimg alt=\"dobrynin\" src=\"https://avatars.githubusercontent.com/u/12061016?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/dobrynin)[\u003cimg alt=\"DavideSegullo\" src=\"https://avatars.githubusercontent.com/u/17269969?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/DavideSegullo)[\u003cimg alt=\"domaslasauskas\" src=\"https://avatars.githubusercontent.com/u/2464675?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/domaslasauskas)[\u003cimg alt=\"enolan\" src=\"https://avatars.githubusercontent.com/u/61517?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/enolan)[\u003cimg alt=\"EduardMcfly\" src=\"https://avatars.githubusercontent.com/u/16842163?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/EduardMcfly)\n\n[\u003cimg alt=\"gdinn\" src=\"https://avatars.githubusercontent.com/u/19908659?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/gdinn)[\u003cimg alt=\"adamldoyle\" src=\"https://avatars.githubusercontent.com/u/86401?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/adamldoyle)[\u003cimg alt=\"thejuan\" src=\"https://avatars.githubusercontent.com/u/329807?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/thejuan)[\u003cimg alt=\"adam-nielsen\" src=\"https://avatars.githubusercontent.com/u/278772?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/adam-nielsen)[\u003cimg alt=\"againer\" src=\"https://avatars.githubusercontent.com/u/509709?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/againer)[\u003cimg alt=\"AlbertXingZhang\" src=\"https://avatars.githubusercontent.com/u/12808025?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/AlbertXingZhang)\n\n[\u003cimg alt=\"aldenquimby\" src=\"https://avatars.githubusercontent.com/u/2145098?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/aldenquimby)[\u003cimg alt=\"alebianco-doxee\" src=\"https://avatars.githubusercontent.com/u/56639478?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/alebianco-doxee)[\u003cimg alt=\"koterpillar\" src=\"https://avatars.githubusercontent.com/u/140276?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/koterpillar)[\u003cimg alt=\"aliclark\" src=\"https://avatars.githubusercontent.com/u/85300?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/aliclark)[\u003cimg alt=\"andersem\" src=\"https://avatars.githubusercontent.com/u/509817?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/andersem)[\u003cimg alt=\"triptec\" src=\"https://avatars.githubusercontent.com/u/240159?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/triptec)\n\n[\u003cimg alt=\"m0ppers\" src=\"https://avatars.githubusercontent.com/u/819421?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/m0ppers)[\u003cimg alt=\"cspotcode\" src=\"https://avatars.githubusercontent.com/u/376504?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/cspotcode)[\u003cimg alt=\"AndrewCEmil\" src=\"https://avatars.githubusercontent.com/u/2167475?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/AndrewCEmil)[\u003cimg alt=\"mapsi\" src=\"https://avatars.githubusercontent.com/u/516735?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/mapsi)[\u003cimg alt=\"aliatsis\" src=\"https://avatars.githubusercontent.com/u/4140524?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/aliatsis)[\u003cimg alt=\"akaila\" src=\"https://avatars.githubusercontent.com/u/484181?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/akaila)\n\n[\u003cimg alt=\"austencollins\" src=\"https://avatars.githubusercontent.com/u/2752551?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/austencollins)[\u003cimg alt=\"austin-payne\" src=\"https://avatars.githubusercontent.com/u/29075091?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/austin-payne)[\u003cimg alt=\"BenjaminBergerM\" src=\"https://avatars.githubusercontent.com/u/50329833?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/BenjaminBergerM)[\u003cimg alt=\"MEGApixel23\" src=\"https://avatars.githubusercontent.com/u/4102786?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/MEGApixel23)[\u003cimg alt=\"idmontie\" src=\"https://avatars.githubusercontent.com/u/412382?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/idmontie)[\u003cimg alt=\"ihendriks\" src=\"https://avatars.githubusercontent.com/u/7311659?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ihendriks)\n\n[\u003cimg alt=\"jacintoArias\" src=\"https://avatars.githubusercontent.com/u/7511199?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jacintoArias)[\u003cimg alt=\"JacekDuszenko\" src=\"https://avatars.githubusercontent.com/u/24210015?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/JacekDuszenko)[\u003cimg alt=\"jgrigg\" src=\"https://avatars.githubusercontent.com/u/12800024?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jgrigg)[\u003cimg alt=\"jankdc\" src=\"https://avatars.githubusercontent.com/u/8384002?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jankdc)[\u003cimg alt=\"janicduplessis\" src=\"https://avatars.githubusercontent.com/u/2677334?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/janicduplessis)[\u003cimg alt=\"jsnajdr\" src=\"https://avatars.githubusercontent.com/u/664258?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jsnajdr)\n\n[\u003cimg alt=\"horyd\" src=\"https://avatars.githubusercontent.com/u/916414?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/horyd)[\u003cimg alt=\"jasonfungsing\" src=\"https://avatars.githubusercontent.com/u/1302364?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jasonfungsing)[\u003cimg alt=\"jaydp17\" src=\"https://avatars.githubusercontent.com/u/1743425?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jaydp17)[\u003cimg alt=\"jeremygiberson\" src=\"https://avatars.githubusercontent.com/u/487411?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jeremygiberson)[\u003cimg alt=\"josephwarrick\" src=\"https://avatars.githubusercontent.com/u/5392984?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/josephwarrick)[\u003cimg alt=\"jlsjonas\" src=\"https://avatars.githubusercontent.com/u/932193?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jlsjonas)\n\n[\u003cimg alt=\"jonathonadams\" src=\"https://avatars.githubusercontent.com/u/24870903?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jonathonadams)[\u003cimg alt=\"joostfarla\" src=\"https://avatars.githubusercontent.com/u/851863?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/joostfarla)[\u003cimg alt=\"TheTeaCat\" src=\"https://avatars.githubusercontent.com/u/20339741?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/TheTeaCat)[\u003cimg alt=\"jeromemacias\" src=\"https://avatars.githubusercontent.com/u/582446?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/jeromemacias)[\u003cimg alt=\"eeroniemi\" src=\"https://avatars.githubusercontent.com/u/1384231?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/eeroniemi)[\u003cimg alt=\"minibikini\" src=\"https://avatars.githubusercontent.com/u/439309?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/minibikini)\n\n[\u003cimg alt=\"em0ney\" src=\"https://avatars.githubusercontent.com/u/5679658?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/em0ney)[\u003cimg alt=\"webdeveric\" src=\"https://avatars.githubusercontent.com/u/1823514?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/webdeveric)[\u003cimg alt=\"fernyettheplant\" src=\"https://avatars.githubusercontent.com/u/3887243?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/fernyettheplant)[\u003cimg alt=\"fernandomoraes\" src=\"https://avatars.githubusercontent.com/u/2366763?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/fernandomoraes)[\u003cimg alt=\"panva\" src=\"https://avatars.githubusercontent.com/u/241506?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/panva)[\u003cimg alt=\"Edweis\" src=\"https://avatars.githubusercontent.com/u/18052624?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/Edweis)\n\n[\u003cimg alt=\"frodeaa\" src=\"https://avatars.githubusercontent.com/u/45172?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/frodeaa)[\u003cimg alt=\"gbroques\" src=\"https://avatars.githubusercontent.com/u/12969835?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/gbroques)[\u003cimg alt=\"ganey\" src=\"https://avatars.githubusercontent.com/u/1401832?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/ganey)[\u003cimg alt=\"geoffmanningcleartrace\" src=\"https://avatars.githubusercontent.com/u/101125585?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/geoffmanningcleartrace)[\u003cimg alt=\"grakic-glopal\" src=\"https://avatars.githubusercontent.com/u/118749735?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/grakic-glopal)[\u003cimg alt=\"guillaume\" src=\"https://avatars.githubusercontent.com/u/368?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/guillaume)\n\n[\u003cimg alt=\"mebibou\" src=\"https://avatars.githubusercontent.com/u/305342?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/mebibou)[\u003cimg alt=\"balassy\" src=\"https://avatars.githubusercontent.com/u/1872777?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/balassy)[\u003cimg alt=\"bayoudhi\" src=\"https://avatars.githubusercontent.com/u/3085156?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/bayoudhi)[\u003cimg alt=\"enapupe\" src=\"https://avatars.githubusercontent.com/u/291082?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/enapupe)[\u003cimg alt=\"aardvarkk\" src=\"https://avatars.githubusercontent.com/u/1251092?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/aardvarkk)[\u003cimg alt=\"iansu\" src=\"https://avatars.githubusercontent.com/u/433725?v=4\u0026s=117\" width=\"117\"\u003e](https://github.com/iansu)\n","funding_links":["https://github.com/sponsors/dherault","https://github.com/sponsors/dnalborczyk","https://github.com/sponsors/DorianMazur"],"categories":["JavaScript","Usage"],"sub_categories":["Local development"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdherault%2Fserverless-offline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdherault%2Fserverless-offline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdherault%2Fserverless-offline/lists"}