{"_id":"@alasano/serverless-offline-localstack-sqs","_rev":"7-b8d4ab6ea70ae3db7c514fb73960bb74","name":"@alasano/serverless-offline-localstack-sqs","dist-tags":{"latest":"1.2.1"},"versions":{"1.0.0":{"name":"@alasano/serverless-offline-localstack-sqs","version":"1.0.0","keywords":["serverless","serverless-framework","localstack","sqs","offline","lambda","aws","plugin"],"author":{"name":"Aljosa Asanovic"},"license":"MIT","_id":"@alasano/serverless-offline-localstack-sqs@1.0.0","maintainers":[{"name":"alasano","email":"aljosa.a@gmail.com"}],"homepage":"https://github.com/alasano/serverless-offline-localstack-sqs#readme","bugs":{"url":"https://github.com/alasano/serverless-offline-localstack-sqs/issues"},"dist":{"shasum":"07c9f7a1d16278798d7cbcfaa53c21fdd7f967e0","tarball":"https://registry.npmjs.org/@alasano/serverless-offline-localstack-sqs/-/serverless-offline-localstack-sqs-1.0.0.tgz","fileCount":43,"integrity":"sha512-x1NvlNE9mciCn7ZIrVOh/jpYxs699/U2TcC0R60Ry0hFBgGPs/bSakXAO9S6nLufuLjaSPnSpVGoVBZ2O7tT4g==","signatures":[{"sig":"MEUCIByxAVtHcAS82njJYp4OdrvXMeCwJgC20gkJKSfSP1CkAiEAnE//YXfO9WaGeP/jKjVPv0S3meeVGCMXSVJct62mVQQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142193},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"e3edc63f70fd0c2436f132f6149a11cd3a162e1c","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","test:watch":"jest --watch","build:watch":"tsc -w"},"_npmUser":{"name":"alasano","email":"aljosa.a@gmail.com"},"repository":{"url":"git+https://github.com/alasano/serverless-offline-localstack-sqs.git","type":"git"},"_npmVersion":"10.2.3","description":"Serverless Framework plugin for offline LocalStack SQS integration with local Lambda handlers","directories":{},"lint-staged":{"*.{ts,js}":["eslint --fix"],"*.{ts,js,mjs,json,md}":["prettier --write"]},"_nodeVersion":"22.22.0","dependencies":{"joi":"^18.0.2","dockerode":"^4.0.9","@aws-sdk/client-sqs":"^3.984.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","eslint":"^9.39.2","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@types/dockerode":"^4.0.1","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"serverless":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/serverless-offline-localstack-sqs_1.0.0_1770403312804_0.9765938623794117","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@alasano/serverless-offline-localstack-sqs","version":"1.1.0","keywords":["serverless","serverless-framework","localstack","sqs","offline","lambda","aws","plugin"],"author":{"name":"Aljosa Asanovic"},"license":"MIT","_id":"@alasano/serverless-offline-localstack-sqs@1.1.0","maintainers":[{"name":"alasano","email":"aljosa.a@gmail.com"}],"homepage":"https://github.com/alasano/serverless-offline-localstack-sqs#readme","bugs":{"url":"https://github.com/alasano/serverless-offline-localstack-sqs/issues"},"dist":{"shasum":"877386be4223b8bd012064c49b3685f47a081618","tarball":"https://registry.npmjs.org/@alasano/serverless-offline-localstack-sqs/-/serverless-offline-localstack-sqs-1.1.0.tgz","fileCount":43,"integrity":"sha512-Ob8XTFQdcM2Ql+NBUJC7e8Y/qB3BxjOL8RZ1p/wv00xTlYiZuBAqP3UfAK02Syd4A+5qffGyve7Wjs+OF0AVmA==","signatures":[{"sig":"MEQCIDEblpxl+g47ZkY5/23ZW7k8NcVd/gcZobgDny4HiMr1AiB2dXCzWGGKbsZ6pI4sunVb59A2AJQGQBlx4lo59yz0WQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152426},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"f3f6ca4f489c4b62a951d59bb1fcb1872622eb9e","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","test:watch":"jest --watch","build:watch":"tsc -w"},"_npmUser":{"name":"alasano","email":"aljosa.a@gmail.com"},"repository":{"url":"git+https://github.com/alasano/serverless-offline-localstack-sqs.git","type":"git"},"_npmVersion":"10.2.3","description":"Serverless Framework plugin for offline LocalStack SQS integration with local Lambda handlers","directories":{},"lint-staged":{"*.{ts,js}":["eslint --fix"],"*.{ts,js,mjs,json,md}":["prettier --write"]},"_nodeVersion":"22.22.0","dependencies":{"joi":"^18.0.2","dockerode":"^4.0.9","@aws-sdk/client-sqs":"^3.984.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","eslint":"^9.39.2","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@types/dockerode":"^4.0.1","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"serverless":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/serverless-offline-localstack-sqs_1.1.0_1770407350440_0.08128249770433826","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@alasano/serverless-offline-localstack-sqs","version":"1.1.1","keywords":["serverless","serverless-framework","localstack","sqs","offline","lambda","aws","plugin"],"author":{"name":"Aljosa Asanovic"},"license":"MIT","_id":"@alasano/serverless-offline-localstack-sqs@1.1.1","maintainers":[{"name":"alasano","email":"aljosa.a@gmail.com"}],"homepage":"https://github.com/alasano/serverless-offline-localstack-sqs#readme","bugs":{"url":"https://github.com/alasano/serverless-offline-localstack-sqs/issues"},"dist":{"shasum":"a43848a91318f62832c09264794e0b12770e25cb","tarball":"https://registry.npmjs.org/@alasano/serverless-offline-localstack-sqs/-/serverless-offline-localstack-sqs-1.1.1.tgz","fileCount":43,"integrity":"sha512-zp5sUxMQcydQi+5PZrOMQUXyeeUhq8dhgjiekXU34Nb37Lbq11q8Fbejf7t5UYhibaqc11RbbWwKh0J2MuXUwg==","signatures":[{"sig":"MEYCIQDl5JerBjS1aBsVXp0557HWFVwokVoif7N7edXBda5UJwIhAJFdKBRvsg544IWQWpDDkbkFnHt9qAZ0usv8ylMtivEJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152934},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"9bc553b51e795f000802ea77c80cf230c09f93f5","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","test:watch":"jest --watch","build:watch":"tsc -w"},"_npmUser":{"name":"alasano","email":"aljosa.a@gmail.com"},"repository":{"url":"git+https://github.com/alasano/serverless-offline-localstack-sqs.git","type":"git"},"_npmVersion":"10.2.3","description":"Serverless Framework plugin for offline LocalStack SQS integration with local Lambda handlers","directories":{},"lint-staged":{"*.{ts,js}":["eslint --fix"],"*.{ts,js,mjs,json,md}":["prettier --write"]},"_nodeVersion":"22.22.0","dependencies":{"joi":"^18.0.2","dockerode":"^4.0.9","@aws-sdk/client-sqs":"^3.984.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","eslint":"^9.39.2","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@types/dockerode":"^4.0.1","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"serverless":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/serverless-offline-localstack-sqs_1.1.1_1770409169156_0.7746314486837407","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@alasano/serverless-offline-localstack-sqs","version":"1.1.2","keywords":["serverless","serverless-framework","localstack","sqs","offline","lambda","aws","plugin"],"author":{"name":"Aljosa Asanovic"},"license":"MIT","_id":"@alasano/serverless-offline-localstack-sqs@1.1.2","maintainers":[{"name":"alasano","email":"aljosa.a@gmail.com"}],"homepage":"https://github.com/alasano/serverless-offline-localstack-sqs#readme","bugs":{"url":"https://github.com/alasano/serverless-offline-localstack-sqs/issues"},"dist":{"shasum":"73a0ded4c1ca7b72fd438e974bae41d4b88f6b62","tarball":"https://registry.npmjs.org/@alasano/serverless-offline-localstack-sqs/-/serverless-offline-localstack-sqs-1.1.2.tgz","fileCount":43,"integrity":"sha512-03YfqhBNpTzVl3zbi8HqgbxCjN+l3+hpFVSCv0y5qluo0ATYRVpjQf7HJbtRzVATqY6mrpBMmN4cnPSpKZ0vZw==","signatures":[{"sig":"MEQCIF9pz7Rvf7ZKuZgLmPeOfP/dUbY1IGepEJ7tcRGREm6RAiAzKDMJQu+7ZNQzz2zBur/Brx5yLKKtYdSiPF4x0PEmGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152941},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"3d82c073ce6571127a1dcb705d9469b6a1bcf3c7","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","test:watch":"jest --watch","build:watch":"tsc -w"},"_npmUser":{"name":"alasano","email":"aljosa.a@gmail.com"},"repository":{"url":"git+https://github.com/alasano/serverless-offline-localstack-sqs.git","type":"git"},"_npmVersion":"10.2.3","description":"Serverless Framework plugin for offline LocalStack SQS integration with local Lambda handlers","directories":{},"lint-staged":{"*.{ts,js}":["eslint --fix"],"*.{ts,js,mjs,json,md}":["prettier --write"]},"_nodeVersion":"22.22.0","dependencies":{"joi":"^18.0.2","dockerode":"^4.0.9","@aws-sdk/client-sqs":"^3.984.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","eslint":"^9.39.2","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@types/dockerode":"^4.0.1","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"serverless":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/serverless-offline-localstack-sqs_1.1.2_1770409779907_0.0835625495273169","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@alasano/serverless-offline-localstack-sqs","version":"1.1.3","keywords":["serverless","serverless-framework","localstack","sqs","offline","lambda","aws","plugin"],"author":{"name":"Aljosa Asanovic"},"license":"MIT","_id":"@alasano/serverless-offline-localstack-sqs@1.1.3","maintainers":[{"name":"alasano","email":"aljosa.a@gmail.com"}],"homepage":"https://github.com/alasano/serverless-offline-localstack-sqs#readme","bugs":{"url":"https://github.com/alasano/serverless-offline-localstack-sqs/issues"},"dist":{"shasum":"74ed2d870ff1ef23db501dbf45ce6b34ac054780","tarball":"https://registry.npmjs.org/@alasano/serverless-offline-localstack-sqs/-/serverless-offline-localstack-sqs-1.1.3.tgz","fileCount":43,"integrity":"sha512-+7zi0L1G+vzjePjyzr/n11z7hlG9mZ6xrP2xv3bfY0CYXy1VOIX0lHTsOOEeHu+BR4L5siGUgaYHKvOxeVee5g==","signatures":[{"sig":"MEYCIQC4WJ/fkVLhNdF+mCEOLdePcD5vg1oV/NT5rR3YnDe76wIhANWdbXuOYr1TBx+8fUeG44JZybAJDfQh5NUi/g8aIe8G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154941},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"937aa783b9b693c6871225321ac03950e37047af","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","test:watch":"jest --watch","build:watch":"tsc -w"},"_npmUser":{"name":"alasano","email":"aljosa.a@gmail.com"},"repository":{"url":"git+https://github.com/alasano/serverless-offline-localstack-sqs.git","type":"git"},"_npmVersion":"10.2.3","description":"Serverless Framework plugin for offline LocalStack SQS integration with local Lambda handlers","directories":{},"lint-staged":{"*.{ts,js}":["eslint --fix"],"*.{ts,js,mjs,json,md}":["prettier --write"]},"_nodeVersion":"22.22.0","dependencies":{"joi":"^18.0.2","dockerode":"^4.0.9","@aws-sdk/client-sqs":"^3.984.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","eslint":"^9.39.2","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@types/dockerode":"^4.0.1","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"serverless":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/serverless-offline-localstack-sqs_1.1.3_1770410904821_0.7883406600411054","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@alasano/serverless-offline-localstack-sqs","version":"1.2.0","keywords":["serverless","serverless-framework","localstack","sqs","offline","lambda","aws","plugin"],"author":{"name":"Aljosa Asanovic"},"license":"MIT","_id":"@alasano/serverless-offline-localstack-sqs@1.2.0","maintainers":[{"name":"alasano","email":"aljosa.a@gmail.com"}],"homepage":"https://github.com/alasano/serverless-offline-localstack-sqs#readme","bugs":{"url":"https://github.com/alasano/serverless-offline-localstack-sqs/issues"},"dist":{"shasum":"fcad416f52ebf99f77cf4edce71f34f696014510","tarball":"https://registry.npmjs.org/@alasano/serverless-offline-localstack-sqs/-/serverless-offline-localstack-sqs-1.2.0.tgz","fileCount":43,"integrity":"sha512-rCTexkwNxXCIeVwLL3Wpqlxxfa7Rlpb2TCM4V4Srot0kRqBW6CCxOwu/7UWQHst+nMPqf5Janb/HWZbr3l0viQ==","signatures":[{"sig":"MEUCIDH7MLwif3V+/bVFqvhMyYQBweML9wn/xP6p1fX2LyDJAiEA362u9y3LoI4I2phzTgBUAfjbXZENH/aWTy+hYnstJ0A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156704},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"1fdea900035685bd2445f9b1e7b0f6759e46d0e8","scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","test:watch":"jest --watch","build:watch":"tsc -w"},"_npmUser":{"name":"alasano","email":"aljosa.a@gmail.com"},"repository":{"url":"git+https://github.com/alasano/serverless-offline-localstack-sqs.git","type":"git"},"_npmVersion":"10.2.3","description":"Serverless Framework plugin for offline LocalStack SQS integration with local Lambda handlers","directories":{},"lint-staged":{"*.{ts,js}":["eslint --fix"],"*.{ts,js,mjs,json,md}":["prettier --write"]},"_nodeVersion":"22.22.0","dependencies":{"joi":"^18.0.2","dockerode":"^4.0.9","@aws-sdk/client-sqs":"^3.984.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","eslint":"^9.39.2","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@types/dockerode":"^4.0.1","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8"},"peerDependencies":{"tsx":">=4.0.0","serverless":">=3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/serverless-offline-localstack-sqs_1.2.0_1770413217575_0.05639284568046743","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@alasano/serverless-offline-localstack-sqs","version":"1.2.1","description":"Serverless Framework plugin for offline LocalStack SQS integration with local Lambda handlers","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","build:watch":"tsc -w","test":"jest","test:watch":"jest --watch","lint":"eslint src/**/*.ts","lint:fix":"eslint src/**/*.ts --fix","prepare":"husky"},"keywords":["serverless","serverless-framework","localstack","sqs","offline","lambda","aws","plugin"],"author":{"name":"Aljosa Asanovic"},"license":"MIT","engines":{"node":">=20.0.0"},"peerDependencies":{"serverless":">=3.0.0","tsx":">=4.0.0"},"dependencies":{"@aws-sdk/client-sqs":"^3.984.0","dockerode":"^4.0.9","joi":"^18.0.2"},"devDependencies":{"@types/dockerode":"^4.0.1","@types/jest":"^30.0.0","@types/node":"^25.2.1","eslint":"^9.39.2","eslint-config-prettier":"^10.1.8","husky":"^9.1.7","jest":"^30.2.0","lint-staged":"^16.2.7","prettier":"^3.8.1","ts-jest":"^29.4.6","typescript":"^5.9.3","typescript-eslint":"^8.54.0"},"repository":{"type":"git","url":"git+https://github.com/alasano/serverless-offline-localstack-sqs.git"},"bugs":{"url":"https://github.com/alasano/serverless-offline-localstack-sqs/issues"},"homepage":"https://github.com/alasano/serverless-offline-localstack-sqs#readme","lint-staged":{"*.{ts,js,mjs,json,md}":["prettier --write"],"*.{ts,js}":["eslint --fix"]},"_id":"@alasano/serverless-offline-localstack-sqs@1.2.1","gitHead":"3672e18c07da266b229fba0fe43abe622c0ce71b","_nodeVersion":"22.22.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-ANzXmnWCo8W5QCf864bV/zBWTObj3aBSUOEPFWtWKgwjjTOSwmMYTqkZFPd8O7RgcGxAzxbET7p2+usE2HMnWw==","shasum":"8c4b58c076424463af7d07d0ca09ef09ed95d72f","tarball":"https://registry.npmjs.org/@alasano/serverless-offline-localstack-sqs/-/serverless-offline-localstack-sqs-1.2.1.tgz","fileCount":43,"unpackedSize":156704,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDIR+XxFXFaESfnsLv2WXerRCLgBF87EsH2T0nlfzTCRwIgUCHLTg7cAqQdAd9KCu2P/L8dw2TySpaONgFBvamfHRs="}]},"_npmUser":{"name":"alasano","email":"aljosa.a@gmail.com"},"directories":{},"maintainers":[{"name":"alasano","email":"aljosa.a@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/serverless-offline-localstack-sqs_1.2.1_1773446583305_0.9583914312650148"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-06T18:41:52.673Z","modified":"2026-03-14T00:03:03.648Z","1.0.0":"2026-02-06T18:41:52.970Z","1.1.0":"2026-02-06T19:49:10.588Z","1.1.1":"2026-02-06T20:19:29.320Z","1.1.2":"2026-02-06T20:29:40.054Z","1.1.3":"2026-02-06T20:48:24.970Z","1.2.0":"2026-02-06T21:26:57.744Z","1.2.1":"2026-03-14T00:03:03.520Z"},"bugs":{"url":"https://github.com/alasano/serverless-offline-localstack-sqs/issues"},"author":{"name":"Aljosa Asanovic"},"license":"MIT","homepage":"https://github.com/alasano/serverless-offline-localstack-sqs#readme","keywords":["serverless","serverless-framework","localstack","sqs","offline","lambda","aws","plugin"],"repository":{"type":"git","url":"git+https://github.com/alasano/serverless-offline-localstack-sqs.git"},"description":"Serverless Framework plugin for offline LocalStack SQS integration with local Lambda handlers","maintainers":[{"name":"alasano","email":"aljosa.a@gmail.com"}],"readme":"# Serverless Offline LocalStack SQS\n\n[![CI](https://github.com/alasano/serverless-offline-localstack-sqs/workflows/CI/badge.svg)](https://github.com/alasano/serverless-offline-localstack-sqs/actions/workflows/ci.yml)\n[![npm version](https://badge.fury.io/js/@alasano%2Fserverless-offline-localstack-sqs.svg)](https://badge.fury.io/js/@alasano%2Fserverless-offline-localstack-sqs)\n[![downloads](https://img.shields.io/npm/dm/@alasano/serverless-offline-localstack-sqs.svg)](https://www.npmjs.com/package/@alasano/serverless-offline-localstack-sqs)\n[![license](https://img.shields.io/npm/l/@alasano/serverless-offline-localstack-sqs.svg)](https://github.com/alasano/serverless-offline-localstack-sqs/blob/main/LICENSE)\n[![node](https://img.shields.io/node/v/@alasano/serverless-offline-localstack-sqs.svg)](https://www.npmjs.com/package/@alasano/serverless-offline-localstack-sqs)\n\nA Serverless Framework plugin that enables local SQS integration with LocalStack for development and testing. This plugin automatically polls SQS queues and invokes your Lambda handlers locally, providing a seamless offline development experience.\n\n## Features\n\n- ✅ **Serverless Framework v3 & v4 Support** - Compatible with both major versions\n- ✅ **LocalStack Integration** - Works seamlessly with LocalStack SQS service\n- ✅ **Docker Auto-Detection** - Automatically detects Docker environment and LocalStack endpoint\n- ✅ **Auto-Queue Creation** - Creates queues from CloudFormation resources and function events\n- ✅ **Message Polling** - Configurable polling intervals and concurrent processing\n- ✅ **Dead Letter Queue (DLQ) Support** - Automatic retry and DLQ handling\n- ✅ **Batch Processing** - Support for SQS batch message processing\n- ✅ **Hot Reloading** - Automatic handler cache invalidation for development\n- ✅ **TypeScript Support** - Written in TypeScript with full type definitions\n- ✅ **Comprehensive Logging** - Debug-friendly logging with configurable levels\n\n## Installation\n\n```bash\nnpm install --save-dev @alasano/serverless-offline-localstack-sqs\n```\n\n## Quick Start\n\n1. **Add the plugin to your `serverless.yml`**:\n\n```yaml\nplugins:\n  - serverless-offline\n  - serverless-offline-localstack-sqs\n\ncustom:\n  serverless-offline-localstack-sqs:\n    enabled: true\n    endpoint: http://localhost:4566 # LocalStack endpoint\n    autoCreate: true\n    debug: true\n```\n\n2. **Start LocalStack**:\n\n```bash\ndocker run --rm -p 4566:4566 localstack/localstack\n```\n\n3. **Start your serverless application**:\n\n```bash\nserverless offline start\n```\n\nThe plugin will automatically:\n\n- Detect SQS events in your function definitions\n- Create queues in LocalStack\n- Start polling for messages\n- Invoke your handlers when messages arrive\n\n## Configuration\n\n### Basic Configuration\n\n```yaml\ncustom:\n  serverless-offline-localstack-sqs:\n    enabled: true # Enable/disable the plugin\n    endpoint: http://localhost:4566 # LocalStack endpoint (auto-detected if omitted)\n    region: us-east-1 # AWS region\n    accessKeyId: test # LocalStack access key\n    secretAccessKey: test # LocalStack secret key\n    autoCreate: true # Auto-create queues from CloudFormation\n    pollInterval: 1000 # Polling interval in milliseconds\n    maxConcurrentPolls: 3 # Max concurrent polling operations\n    visibilityTimeout: 30 # Default visibility timeout\n    waitTimeSeconds: 20 # Long polling wait time\n    maxReceiveCount: 3 # Max retries before DLQ\n    deadLetterQueueSuffix: \"-dlq\" # DLQ naming suffix\n    debug: false # Enable debug logging\n    skipCacheInvalidation: false # Skip handler cache clearing\n    lambdaTimeout: 30000 # Handler timeout in milliseconds\n```\n\n### Queue Configuration\n\nYou can manually configure queues or let the plugin auto-detect them from your function events:\n\n```yaml\ncustom:\n  serverless-offline-localstack-sqs:\n    queues:\n      - queueName: my-queue\n        handler: handlers/processor.main\n        enabled: true\n        batchSize: 10\n        maxConcurrentPolls: 2\n        visibilityTimeout: 60\n        waitTimeSeconds: 20\n        timeout: 30 # Optional: Lambda timeout in seconds (overrides lambdaTimeout)\n        functionResponseTypes: # Optional: Enable partial batch responses\n          - ReportBatchItemFailures\n        dlq:\n          enabled: true\n          maxReceiveCount: 5\n          queueName: my-queue-dlq # Optional: custom DLQ name\n```\n\n### Function Events (Auto-Detection)\n\nThe plugin automatically detects SQS events from your function definitions:\n\n```yaml\nfunctions:\n  processMessages:\n    handler: handlers/processor.main\n    events:\n      - sqs:\n          arn: arn:aws:sqs:us-east-1:000000000000:my-queue\n          batchSize: 10\n          functionResponseType: ReportBatchItemFailures # Enable partial batch responses\n      - sqs:\n          queueName: another-queue\n          batchSize: 1\n```\n\n### CloudFormation Resources\n\nQueues defined in CloudFormation resources are automatically created:\n\n```yaml\nresources:\n  Resources:\n    MyQueue:\n      Type: AWS::SQS::Queue\n      Properties:\n        QueueName: my-queue\n        VisibilityTimeout: 30\n        RedrivePolicy:\n          deadLetterTargetArn: !GetAtt MyDLQ.Arn\n          maxReceiveCount: 3\n\n    MyDLQ:\n      Type: AWS::SQS::Queue\n      Properties:\n        QueueName: my-queue-dlq\n```\n\n## Usage Examples\n\n### Basic Handler\n\n```javascript\n// handlers/processor.js\nexports.main = async (event, context) => {\n  for (const record of event.Records) {\n    const messageBody = JSON.parse(record.body);\n    console.log(\"Processing message:\", messageBody);\n\n    // Your processing logic here\n    await processMessage(messageBody);\n  }\n\n  return { statusCode: 200 };\n};\n```\n\n### Error Handling with DLQ\n\n```javascript\n// handlers/processor.js\nexports.main = async (event, context) => {\n  for (const record of event.Records) {\n    try {\n      const messageBody = JSON.parse(record.body);\n      await processMessage(messageBody);\n    } catch (error) {\n      console.error(\"Processing failed:\", error);\n      // Throw error to trigger retry/DLQ logic\n      throw error;\n    }\n  }\n};\n```\n\n### Partial Batch Responses (ReportBatchItemFailures)\n\nWhen `functionResponseType: ReportBatchItemFailures` is enabled, your handler can report which specific messages failed instead of failing the entire batch:\n\n```javascript\n// handlers/processor.js\nexports.main = async (event, context) => {\n  const batchItemFailures = [];\n\n  for (const record of event.Records) {\n    try {\n      const messageBody = JSON.parse(record.body);\n      await processMessage(messageBody);\n      // Message succeeded - no action needed\n    } catch (error) {\n      console.error(`Message ${record.messageId} failed:`, error);\n      // Mark this specific message as failed\n      batchItemFailures.push({ itemIdentifier: record.messageId });\n    }\n  }\n\n  // Return partial batch response\n  // Only failed messages will be retried; successful ones are deleted\n  return { batchItemFailures };\n};\n```\n\n**Note:** When `batchItemFailures` is empty or not returned, all messages are treated as successful.\n\n### Sending Test Messages\n\n```javascript\nconst { SQSClient, SendMessageCommand } = require(\"@aws-sdk/client-sqs\");\n\nconst client = new SQSClient({\n  region: \"us-east-1\",\n  endpoint: \"http://localhost:4566\",\n  credentials: { accessKeyId: \"test\", secretAccessKey: \"test\" },\n});\n\nawait client.send(\n  new SendMessageCommand({\n    QueueUrl: \"http://localhost:4566/000000000000/my-queue\",\n    MessageBody: JSON.stringify({ id: 1, message: \"Hello World!\" }),\n  }),\n);\n```\n\n## Commands\n\nThe plugin provides custom Serverless commands:\n\n```bash\n# Start SQS polling only\nserverless sqs-offline start\n\n# Stop SQS polling\nserverless sqs-offline stop\n```\n\n## Docker Integration\n\nThe plugin automatically detects your Docker environment:\n\n- **Docker Desktop**: Uses `localhost:4566`\n- **Running in Container**: Uses `localstack:4566` or `host.docker.internal:4566`\n- **Custom Networks**: Set `LOCALSTACK_HOST` environment variable\n\n### Docker Compose Example\n\n```yaml\nversion: \"3.8\"\nservices:\n  localstack:\n    image: localstack/localstack\n    ports:\n      - \"4566:4566\"\n    environment:\n      - SERVICES=sqs\n      - DEBUG=1\n    volumes:\n      - \"/var/run/docker.sock:/var/run/docker.sock\"\n```\n\n## Troubleshooting\n\n### Plugin Not Starting\n\n- Ensure LocalStack is running: `docker ps | grep localstack`\n- Check plugin configuration in `serverless.yml`\n- Enable debug logging: `debug: true`\n\n### Messages Not Processing\n\n- Verify queue names match between configuration and message sending\n- Check handler paths are correct relative to service root\n- Ensure LocalStack SQS is accessible on the configured endpoint\n\n### Handler Errors\n\n- Check handler function exports match configuration\n- Verify handler file extensions (`.js`, `.ts`, `.mjs`)\n- Enable debug logging to see detailed error messages\n\n### Docker Connectivity\n\n- Ensure port 4566 is not blocked by firewall\n- For Docker Desktop on Windows/Mac, try `host.docker.internal` instead of `localhost`\n- Set `LOCALSTACK_HOST` environment variable if using custom networking\n\n## Development\n\n### Local Development\n\n```bash\n# Clone the repository\ngit clone https://github.com/alasano/serverless-offline-localstack-sqs.git\ncd serverless-offline-localstack-sqs\n\n# Install dependencies\nnpm install\n\n# Build TypeScript\nnpm run build\n\n# Run tests\nnpm test\n\n# Run linter\nnpm run lint\n```\n\n### Testing with Examples\n\n```bash\n# Test with the simple test app\ncd test-app\nnpm install\nnpm run dev\n\n# Test with the examples\ncd examples\nnpm install\nnpm run dev\n```\n\n### Git Hooks\n\nThis project uses Husky for Git hooks to maintain code quality:\n\n- **Pre-commit hook**: Runs `lint-staged` on staged files\n  - Formats code with Prettier\n  - Automatically fixes ESLint issues where possible\n  - Prevents commits with linting errors\n  - Ensures consistent code style and formatting\n\n```bash\n# The pre-commit hook will run automatically, but you can also run manually:\nnpx lint-staged\n\n# To bypass the hook (not recommended):\ngit commit --no-verify -m \"message\"\n```\n\n### CI/CD Pipeline\n\nThis project uses GitHub Actions for continuous integration and deployment:\n\n- **CI Workflow** (`ci.yml`): Runs on every push and PR\n  - Tests across Node.js 20 and 22\n  - Runs linting and unit tests\n  - Integration testing with LocalStack\n  - Code coverage reporting to Codecov\n\n- **Release Workflow** (`release.yml`): Automated releases\n  - Automatic version bumping based on commit messages\n  - GitHub release creation with changelog\n  - NPM publishing with proper permissions\n  - Manual release triggers with version selection\n\n- **CodeQL Workflow** (`codeql.yml`): Security analysis\n  - Weekly security scans\n  - Code quality and vulnerability detection\n\n### Release Process\n\nThe plugin supports both automatic and manual releases:\n\n**Automatic Releases:**\n\n- Push to `main` branch triggers automatic patch releases\n- Commit messages determine version bump:\n  - `feat:` or `feature:` → minor version\n  - `BREAKING:` or `major:` → major version\n  - Default → patch version\n\n**Manual Releases:**\n\n- Go to Actions → Release workflow → Run workflow\n- Select release type: patch, minor, major, or prerelease\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/my-feature`\n3. Make your changes\n4. Add tests for new functionality\n5. Run the full test suite: `npm test`\n6. Run linting: `npm run lint`\n7. Commit with conventional commit messages\n8. Submit a pull request\n\n## License\n\nMIT\n","readmeFilename":"README.md"}