{"id":20908699,"url":"https://github.com/serverless-appsync/serverless-appsync-simulator","last_synced_at":"2025-04-04T14:09:59.456Z","repository":{"id":37982215,"uuid":"226353573","full_name":"serverless-appsync/serverless-appsync-simulator","owner":"serverless-appsync","description":"A simple wrapper around Amplify AppSync Simulator to test serverless AppSync Apis","archived":false,"fork":false,"pushed_at":"2024-04-23T21:45:15.000Z","size":1933,"stargazers_count":126,"open_issues_count":26,"forks_count":70,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-05-08T07:45:04.423Z","etag":null,"topics":["appsync","aws-appsync","graphql","serverless","serverless-plugin"],"latest_commit_sha":null,"homepage":null,"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/serverless-appsync.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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},"funding":{"github":["bboure"]}},"created_at":"2019-12-06T15:05:16.000Z","updated_at":"2024-08-19T17:23:12.065Z","dependencies_parsed_at":"2024-01-20T09:29:22.191Z","dependency_job_id":"5f8fe708-05fc-422e-a201-578b0eb3349b","html_url":"https://github.com/serverless-appsync/serverless-appsync-simulator","commit_stats":{"total_commits":127,"total_committers":32,"mean_commits":3.96875,"dds":0.5511811023622047,"last_synced_commit":"1337fb424ec583a4001848e0a3a3b4b1989feeeb"},"previous_names":["bboure/serverless-appsync-simulator"],"tags_count":38,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverless-appsync%2Fserverless-appsync-simulator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverless-appsync%2Fserverless-appsync-simulator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverless-appsync%2Fserverless-appsync-simulator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serverless-appsync%2Fserverless-appsync-simulator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/serverless-appsync","download_url":"https://codeload.github.com/serverless-appsync/serverless-appsync-simulator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247190229,"owners_count":20898700,"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":["appsync","aws-appsync","graphql","serverless","serverless-plugin"],"created_at":"2024-11-18T14:08:31.447Z","updated_at":"2025-04-04T14:09:59.431Z","avatar_url":"https://github.com/serverless-appsync.png","language":"JavaScript","funding_links":["https://github.com/sponsors/bboure"],"categories":[],"sub_categories":[],"readme":"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) ![Release](https://serverless-appsync/serverless-appsync-simulator/workflows/Release/badge.svg) \u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-20-orange.svg?style=flat-square)](#contributors-)\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\nThis serverless plugin is a wrapper for [amplify-appsync-simulator](https://github.com/aws-amplify/amplify-cli/tree/master/packages/amplify-appsync-simulator) made for testing AppSync APIs built with [serverless-appsync-plugin](https://github.com/sid88in/serverless-appsync-plugin).\n\n# Requires\n\n- [serverless framework](https://github.com/serverless/serverless)\n- [serverless-appsync-plugin](https://github.com/sid88in/serverless-appsync-plugin)\n- [serverless-offline](https://github.com/dherault/serverless-offline)\n- [serverless-dynamodb-local](https://github.com/99xt/serverless-dynamodb-local) (when using dynamodb resolvers only)\n- [watchman](https://facebook.github.io/watchman/docs/install.html) (if Hot-reloading is desactivated it is not required)\n\n# Install\n\n```bash\nnpm install serverless-appsync-simulator\n# or\nyarn add serverless-appsync-simulator\n```\n\n# Usage\n\nThis plugin relies on your serverless yml file and on the `serverless-offline` plugin.\n\n```yml\nplugins:\n  - serverless-dynamodb-local # only if you need dynamodb resolvers and you don't have an external dynamodb\n  - serverless-appsync-simulator\n  - serverless-offline\n```\n\n**Note:** Order is important `serverless-appsync-simulator` must go **before** `serverless-offline`\n\nTo start the simulator, run the following command:\n\n```bash\nsls offline start\n```\n\nYou should see in the logs something like:\n\n```bash\n...\nServerless: AppSync endpoint: http://localhost:20002/graphql\nServerless: GraphiQl: http://localhost:20002\n...\n```\n\n# Configuration\n\nPut options under `custom.appsync-simulator` in your `serverless.yml` file\n\n| option                   | default                    | description                                                                                                                                                                                          |\n| -------------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| apiKey                     | `0123456789`               | When using `API_KEY` as authentication type, the key to authenticate to the endpoint.                                                                                                                |\n| port                       | 20002                      | AppSync operations port; if using multiple APIs, the value of this option will be used as a starting point, and each other API will have a port of lastPort + 10 (e.g. 20002, 20012, 20022, etc.)    |\n| wsPort                     | 20003                      | AppSync subscriptions port; if using multiple APIs, the value of this option will be used as a starting point, and each other API will have a port of lastPort + 10 (e.g. 20003, 20013, 20023, etc.) |\n| location                   | . (base directory)         | Location of the lambda functions handlers.                                                                                                                                                           |\n| refMap                     | {}                         | A mapping of [resource resolutions](#resource-cloudformation-functions-resolution) for the `Ref` function                                                                                            |\n| getAttMap                  | {}                         | A mapping of [resource resolutions](#resource-cloudformation-functions-resolution) for the `GetAtt` function                                                                                         |\n| importValueMap             | {}                         | A mapping of [resource resolutions](#resource-cloudformation-functions-resolution) for the `ImportValue` function                                                                                    |\n| functions                  | {}                         | A mapping of [external functions](#functions) for providing invoke url for external fucntions                                                                                                        |\n| dynamoDb.endpoint          | http://localhost:8000      | Dynamodb endpoint. Specify it if you're not using serverless-dynamodb-local. Otherwise, port is taken from dynamodb-local conf                                                                       |\n| dynamoDb.region            | localhost                  | Dynamodb region. Specify it if you're connecting to a remote Dynamodb intance.                                                                                                                       |\n| dynamoDb.accessKeyId       | DEFAULT_ACCESS_KEY         | AWS Access Key ID to access DynamoDB                                                                                                                                                                 |\n| dynamoDb.secretAccessKey   | DEFAULT_SECRET             | AWS Secret Key to access DynamoDB                                                                                                                                                                    |\n| dynamoDb.sessionToken      | DEFAULT_ACCESS_TOKEEN      | AWS Session Token to access DynamoDB, only if you have temporary security credentials configured on AWS                                                                                              |\n| dynamoDb.\\*                |                            | You can add every configuration accepted by [DynamoDB SDK](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#constructor-property)                                               |\n| rds.dbName                 |                            | Name of the database                                                                                                                                                                                 |\n| rds.dbHost                 |                            | Database host                                                                                                                                                                                        |\n| rds.dbDialect              |                            | Database dialect. Possible values (mysql/postgres)                                                                                                                                                   |\n| rds.dbUsername             |                            | Database username                                                                                                                                                                                    |\n| rds.dbPassword             |                            | Database password                                                                                                                                                                                    |\n| rds.dbPort                 |                            | Database port                                                                                                                                                                                        |\n| openSearch.useSignature    | false                      | Enable signing requests to OpenSearch. The preference for credentials is config \u003e environment variables \u003e local credential file.                                                                     |\n| openSearch.region          |                            | OpenSearch region. Specify it if you're connecting to a remote OpenSearch intance.                                                                                                                   |\n| openSearch.accessKeyId     |                            | AWS Access Key ID to access OpenSearch                                                                                                                                                               |\n| openSearch.secretAccessKey |                            | AWS Secret Key to access OpenSearch                                                                                                                                                                  |\n| watch                      | - \\*.graphql\u003cbr/\u003e - \\*.vtl | Array of glob patterns to watch for hot-reloading.                                                                                                                                                   |\n\nExample:\n\n```yml\ncustom:\n  appsync-simulator:\n    location: '.webpack/service' # use webpack build directory\n    dynamoDb:\n      endpoint: 'http://my-custom-dynamo:8000'\n```\n\n# Hot-reloading\n\nBy default, the simulator will hot-relad when changes to `*.graphql` or `*.vtl` files are detected.\nChanges to `*.yml` files are not supported (yet? - this is a Serverless Framework limitation). You will need to restart the simulator each time you change yml files.\n\nHot-reloading relies on [watchman](https://facebook.github.io/watchman). Make sure it is [installed](https://facebook.github.io/watchman/docs/install.html) on your system.\n\nYou can change the files being watched with the `watch` option, which is then passed to watchman as [the match expression](https://facebook.github.io/watchman/docs/expr/match.html).\n\ne.g.\n\n```\ncustom:\n  appsync-simulator:\n    watch:\n      - [\"match\", \"handlers/**/*.vtl\", \"wholename\"] # =\u003e array is interpreted as the literal match expression\n      - \"*.graphql\"                                 # =\u003e string like this is equivalent to `[\"match\", \"*.graphql\"]`\n```\n\nOr you can opt-out by leaving an empty array or set the option to `false`\n\nNote: Functions should not require hot-reloading, unless you are using a transpiler or a bundler (such as webpack, babel or typescript), un which case you should delegate hot-reloading to that instead.\n\n# Resource CloudFormation functions resolution\n\nThis plugin supports _some_ resources resolution from the `Ref`, `Fn::GetAtt` and `Fn::ImportValue` functions\nin your yaml file. It also supports _some_ other Cfn functions such as `Fn::Join`, `Fb::Sub`, etc.\n\n**Note:** Under the hood, this features relies on the [cfn-resolver-lib](https://github.com/robessog/cfn-resolver-lib) package. For more info on supported cfn functions, refer to [the documentation](https://github.com/robessog/cfn-resolver-lib/blob/master/README.md)\n\n## Basic usage\n\nYou can reference resources in your functions' environment variables (that will be accessible from your lambda functions) or datasource definitions.\nThe plugin will automatically resolve them for you.\n\n```yaml\nprovider:\n  environment:\n    BUCKET_NAME:\n      Ref: MyBucket # resolves to `my-bucket-name`\n\nresources:\n  Resources:\n    MyDbTable:\n      Type: AWS::DynamoDB::Table\n      Properties:\n        TableName: myTable\n      ...\n    MyBucket:\n      Type: AWS::S3::Bucket\n      Properties:\n        BucketName: my-bucket-name\n    ...\n\n# in your appsync config\ndataSources:\n  - type: AMAZON_DYNAMODB\n    name: dynamosource\n    config:\n      tableName:\n        Ref: MyDbTable # resolves to `myTable`\n```\n\n## Override (or mock) values\n\nSometimes, some references **cannot** be resolved, as they come from an _Output_ from Cloudformation; or you might want to use mocked values in your local environment.\n\nIn those cases, you can define (or override) those values using the `refMap`, `getAttMap` and `importValueMap` options.\n\n- `refMap` takes a mapping of _resource name_ to _value_ pairs\n- `getAttMap` takes a mapping of _resource name_ to _attribute/values_ pairs\n- `importValueMap` takes a mapping of _import name_ to _values_ pairs\n\nExample:\n\n```yaml\ncustom:\n  appsync-simulator:\n    refMap:\n      # Override `MyDbTable` resolution from the previous example.\n      MyDbTable: 'mock-myTable'\n    getAttMap:\n      # define ElasticSearchInstance DomainName\n      ElasticSearchInstance:\n        DomainEndpoint: 'localhost:9200'\n    importValueMap:\n      other-service-api-url: 'https://other.api.url.com/graphql'\n\n# in your appsync config\ndataSources:\n  - type: AMAZON_ELASTICSEARCH\n    name: elasticsource\n    config:\n      # endpoint resolves as 'http://localhost:9200'\n      endpoint:\n        Fn::Join:\n          - ''\n          - - https://\n            - Fn::GetAtt:\n                - ElasticSearchInstance\n                - DomainEndpoint\n```\n\n### Key-value mock notation\n\nIn some special cases you will need to use key-value mock nottation.\nGood example can be case when you need to include serverless stage value (`${self:provider.stage}`) in the import name.\n\n_This notation can be used with all mocks - `refMap`, `getAttMap` and `importValueMap`_\n\n```yaml\nprovider:\n  environment:\n    FINISH_ACTIVITY_FUNCTION_ARN:\n      Fn::ImportValue: other-service-api-${self:provider.stage}-url\n\ncustom:\n  serverless-appsync-simulator:\n    importValueMap:\n      - key: other-service-api-${self:provider.stage}-url\n        value: 'https://other.api.url.com/graphql'\n```\n\n## Limitations\n\nThis plugin only tries to resolve the following parts of the yml tree:\n\n- `provider.environment`\n- `functions[*].environment`\n- `custom.appSync`\n\nIf you have the need of resolving others, feel free to open an issue and explain your use case.\n\nFor now, the supported resources to be automatically resovled by `Ref:` are:\n\n- DynamoDb tables\n- S3 Buckets\n\nFeel free to open a PR or an issue to extend them as well.\n\n# External functions\n\nWhen a function is not defined withing the current serverless file you can still call it by providing an invoke url which should point to a REST method. Make sure you specify \"get\" or \"post\" for the method. Default is \"get\", but you probably want \"post\".\n\n```yaml\ncustom:\n  appsync-simulator:\n    functions:\n      addUser:\n        url: http://localhost:3016/2015-03-31/functions/addUser/invocations\n        method: post\n      addPost:\n        url: https://jsonplaceholder.typicode.com/posts\n        method: post\n```\n\n# Supported Resolver types\n\nThis plugin supports resolvers implemented by `amplify-appsync-simulator`, as well as custom resolvers.\n\n**From Aws Amplify:**\n\n- NONE\n- AWS_LAMBDA\n- AMAZON_DYNAMODB\n- PIPELINE\n\n**Implemented by this plugin**\n\n- AMAZON_ELASTICSEARCH\n- HTTP\n- RELATIONAL_DATABASE\n\n## Relational Database\n\n### Sample VTL for a create mutation\n\n```\n#set( $cols = [] )\n#set( $vals = [] )\n#foreach( $entry in $ctx.args.input.keySet() )\n  #set( $regex = \"([a-z])([A-Z]+)\")\n  #set( $replacement = \"$1_$2\")\n  #set( $toSnake = $entry.replaceAll($regex, $replacement).toLowerCase() )\n  #set( $discard = $cols.add(\"$toSnake\") )\n  #if( $util.isBoolean($ctx.args.input[$entry]) )\n      #if( $ctx.args.input[$entry] )\n        #set( $discard = $vals.add(\"1\") )\n      #else\n        #set( $discard = $vals.add(\"0\") )\n      #end\n  #else\n      #set( $discard = $vals.add(\"'$ctx.args.input[$entry]'\") )\n  #end\n#end\n#set( $valStr = $vals.toString().replace(\"[\",\"(\").replace(\"]\",\")\") )\n#set( $colStr = $cols.toString().replace(\"[\",\"(\").replace(\"]\",\")\") )\n#if ( $valStr.substring(0, 1) != '(' )\n  #set( $valStr = \"($valStr)\" )\n#end\n#if ( $colStr.substring(0, 1) != '(' )\n  #set( $colStr = \"($colStr)\" )\n#end\n{\n  \"version\": \"2018-05-29\",\n  \"statements\":   [\"INSERT INTO \u003cname-of-table\u003e $colStr VALUES $valStr\", \"SELECT * FROM    \u003cname-of-table\u003e ORDER BY id DESC LIMIT 1\"]\n}\n```\n\n### Sample VTL for an update mutation\n\n```\n#set( $update = \"\" )\n#set( $equals = \"=\" )\n#foreach( $entry in $ctx.args.input.keySet() )\n  #set( $cur = $ctx.args.input[$entry] )\n  #set( $regex = \"([a-z])([A-Z]+)\")\n  #set( $replacement = \"$1_$2\")\n  #set( $toSnake = $entry.replaceAll($regex, $replacement).toLowerCase() )\n  #if( $util.isBoolean($cur) )\n      #if( $cur )\n        #set ( $cur = \"1\" )\n      #else\n        #set ( $cur = \"0\" )\n      #end\n  #end\n  #if ( $util.isNullOrEmpty($update) )\n      #set($update = \"$toSnake$equals'$cur'\" )\n  #else\n      #set($update = \"$update,$toSnake$equals'$cur'\" )\n  #end\n#end\n{\n  \"version\": \"2018-05-29\",\n  \"statements\":   [\"UPDATE \u003cname-of-table\u003e SET $update WHERE id=$ctx.args.input.id\", \"SELECT * FROM \u003cname-of-table\u003e WHERE id=$ctx.args.input.id\"]\n}\n```\n\n### Sample resolver for delete mutation\n\n```\n{\n  \"version\": \"2018-05-29\",\n  \"statements\":   [\"UPDATE \u003cname-of-table\u003e set deleted_at=NOW() WHERE id=$ctx.args.id\", \"SELECT * FROM \u003cname-of-table\u003e WHERE id=$ctx.args.id\"]\n}\n```\n\n### Sample mutation response VTL with support for handling AWSDateTime\n\n```\n#set ( $index = -1)\n#set ( $result = $util.parseJson($ctx.result) )\n#set ( $meta = $result.sqlStatementResults[1].columnMetadata)\n#foreach ($column in $meta)\n    #set ($index = $index + 1)\n    #if ( $column[\"typeName\"] == \"timestamptz\" )\n        #set ($time = $result[\"sqlStatementResults\"][1][\"records\"][0][$index][\"stringValue\"] )\n        #set ( $nowEpochMillis = $util.time.parseFormattedToEpochMilliSeconds(\"$time.substring(0,19)+0000\", \"yyyy-MM-dd HH:mm:ssZ\") )\n        #set ( $isoDateTime = $util.time.epochMilliSecondsToISO8601($nowEpochMillis) )\n        $util.qr( $result[\"sqlStatementResults\"][1][\"records\"][0][$index].put(\"stringValue\", \"$isoDateTime\") )\n    #end\n#end\n#set ( $res = $util.parseJson($util.rds.toJsonString($util.toJson($result)))[1][0] )\n#set ( $response = {} )\n#foreach($mapKey in $res.keySet())\n    #set ( $s = $mapKey.split(\"_\") )\n    #set ( $camelCase=\"\" )\n    #set ( $isFirst=true )\n    #foreach($entry in $s)\n        #if ( $isFirst )\n          #set ( $first = $entry.substring(0,1) )\n        #else\n          #set ( $first = $entry.substring(0,1).toUpperCase() )\n        #end\n        #set ( $isFirst=false )\n        #set ( $stringLength = $entry.length() )\n        #set ( $remaining = $entry.substring(1, $stringLength) )\n        #set ( $camelCase = \"$camelCase$first$remaining\" )\n    #end\n    $util.qr( $response.put(\"$camelCase\", $res[$mapKey]) )\n#end\n$utils.toJson($response)\n```\n\n### Using Variable Map\n\nVariable map support is limited and does not differentiate numbers and strings data types, please inject them directly if needed.\n\nWill be escaped properly: `null`, `true`, and `false` values.\n\n```\n{\n  \"version\": \"2018-05-29\",\n  \"statements\":   [\n    \"UPDATE \u003cname-of-table\u003e set deleted_at=NOW() WHERE id=:ID\",\n    \"SELECT * FROM \u003cname-of-table\u003e WHERE id=:ID and unix_timestamp \u003e $ctx.args.newerThan\"\n  ],\n  variableMap: {\n    \":ID\": $ctx.args.id,\n##    \":TIMESTAMP\": $ctx.args.newerThan -- This will be handled as a string!!!\n  }\n}\n```\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://twitter.com/Benoit_Boure\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/7089997?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBenoît Bouré\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=bboure\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://filip.pyrek.cz/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/6282843?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFilip Pýrek\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=FilipPyrek\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/marcoreni\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/2797489?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMarco Reni\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=marcoreni\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://egordmitriev.net/\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/4254771?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEgor Dmitriev\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=EgorDm\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/stschwark\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/900253?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSteffen Schwark\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=stschwark\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/moelholm\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/8393156?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNicky Moelholm\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=moelholm\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/daisuke-awaji\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/20736455?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eg-awa\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=daisuke-awaji\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/LMulveyCM\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/39565663?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLee Mulvey\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=LMulveyCM\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/JimmyHurrah\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/6367753?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJimmy Hurrah\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=JimmyHurrah\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://abda.la/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/219340?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAbdala\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-abdala\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/alexandrusavin\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/1612455?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAlexandru Savin\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=alexandrusavin\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/Scale93\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/36473880?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eScale93\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=Scale93\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=Scale93\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/Liooo\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1630378?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRyo Yamada\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=Liooo\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=Liooo\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/h-kishi\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/8940568?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eh-kishi\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=h-kishi\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/louislatreille\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/8052355?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003elouislatreille\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=louislatreille\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://aleksac.me\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/25728391?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAleksa Cukovic\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=AleksaC\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://vanmulligen.ca\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/16951595?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSean van Mulligen\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=seanvm\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/katesclau\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/5067149?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDiego Rodrigues Ferreira\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=katesclau\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.wednesday.is/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/4958010?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMohammed Ali Chherawalla\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=alichherawalla\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://adriantodt.net/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/6955035?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAdrianTodt\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://serverless-appsync/serverless-appsync-simulator/commits?author=adriantodt\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserverless-appsync%2Fserverless-appsync-simulator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fserverless-appsync%2Fserverless-appsync-simulator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserverless-appsync%2Fserverless-appsync-simulator/lists"}