{"_id":"@aws/durable-execution-sdk-js-eslint-plugin","_rev":"5-f6e3a0925161989f4cf8a231bcdba55e","name":"@aws/durable-execution-sdk-js-eslint-plugin","dist-tags":{"latest":"1.1.1"},"versions":{"0.0.1":{"name":"@aws/durable-execution-sdk-js-eslint-plugin","version":"0.0.1","_id":"@aws/durable-execution-sdk-js-eslint-plugin@0.0.1","maintainers":[{"name":"durable-execution-dev","email":"durable-execution-dev@amazon.com"}],"dist":{"shasum":"52f19c7a00a10d4da2bdaeb4bc41bb9afc0c28f8","tarball":"https://registry.npmjs.org/@aws/durable-execution-sdk-js-eslint-plugin/-/durable-execution-sdk-js-eslint-plugin-0.0.1.tgz","fileCount":1,"integrity":"sha512-bVkLOltjkGibi4XzEBUFyIaxUaa1pzF/a1Fdnt8emGSNHQcun6tPiewThqaEbq4IsRxsGHaTRHlsvZURTw1UYw==","signatures":[{"sig":"MEUCIH1wuHa0MkE8W9wn/Zx9sDwivwnRFocbMd2aY4yFSPqVAiEA8O9TAUtglXQEuTwq/qixpANLxaWOu63FkH8aESquGGQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160},"gitHead":"093f3788d163d3280aabd02f12e430ec84930313","scripts":{"test":"echo \"Error: no test specified\" && exit 0"},"_npmUser":{"name":"durable-execution-dev","email":"durable-execution-dev@amazon.com"},"_npmVersion":"10.9.4","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/durable-execution-sdk-js-eslint-plugin_0.0.1_1764261739086_0.18718773589004623","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@aws/durable-execution-sdk-js-eslint-plugin","version":"1.0.0","keywords":["eslint","eslint-plugin","durable-functions","aws-lambda"],"_id":"@aws/durable-execution-sdk-js-eslint-plugin@1.0.0","maintainers":[{"name":"durable-execution-dev","email":"durable-execution-dev@amazon.com"}],"dist":{"shasum":"5589c12e0e34e8b05f385d1b0c811e60934ee6c1","tarball":"https://registry.npmjs.org/@aws/durable-execution-sdk-js-eslint-plugin/-/durable-execution-sdk-js-eslint-plugin-1.0.0.tgz","fileCount":18,"integrity":"sha512-k/U8jzWmOWL1CwqxMp257BDYGa5PfsO5EpmVF2xT7WroybduM1vGN67HSMWDhslAVY892mQkCC5V+UPvFZG6Gw==","signatures":[{"sig":"MEUCIA/mQ64VcpW5PayLGIxht2Pki618mxM0e/UauPZsntWeAiEA7UApeJsZmD45X1HUB8qsbxSGP7FOFkc+bhpVURVnHU4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49248},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"bafbe2ac89f9ccd662f46df0c2ba4b37051cd2e0","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist node_modules .tsbuildinfo"},"_npmUser":{"name":"durable-execution-dev","email":"durable-execution-dev@amazon.com"},"_npmVersion":"10.9.4","description":"ESLint plugin for AWS Lambda durable functions best practices","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.2.6","typescript":"^5.8.2","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/eslint":"^8.56.0"},"peerDependencies":{"eslint":">=8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/durable-execution-sdk-js-eslint-plugin_1.0.0_1764685469462_0.4697471143216936","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aws/durable-execution-sdk-js-eslint-plugin","version":"1.0.1","keywords":["eslint","eslint-plugin","durable-functions","aws-lambda"],"_id":"@aws/durable-execution-sdk-js-eslint-plugin@1.0.1","maintainers":[{"name":"durable-execution-dev","email":"durable-execution-dev@amazon.com"}],"homepage":"https://github.com/aws/aws-durable-execution-sdk-js/tree/main/packages/aws-durable-execution-sdk-js-eslint-plugin","bugs":{"url":"https://github.com/aws/aws-durable-execution-sdk-js/issues"},"dist":{"shasum":"5739e8ca63dc6ecf760a76e6b628efd501c54378","tarball":"https://registry.npmjs.org/@aws/durable-execution-sdk-js-eslint-plugin/-/durable-execution-sdk-js-eslint-plugin-1.0.1.tgz","fileCount":18,"integrity":"sha512-Wcqamdqmnve02eI1vekp+YdJqYj5VmuZZdARYmUWVN+ytN3d3bcx81/21whHzGZRp8cEFWHH8ZSYxf26HriHaQ==","signatures":[{"sig":"MEYCIQDrjhe47Xaw9lBwpVzENxqkUe54k0HJdCfatEYpF5d8pwIhAKuclWaEbkMGBVxdlG2Ff2s9sRmRC3OQs+6LtwmE8phy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aws%2fdurable-execution-sdk-js-eslint-plugin@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":49394},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"eb252ca0c58ef0f45efbfb030c56b04878b0229e","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist node_modules .tsbuildinfo"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80799582-c8c1-4fa3-b37f-59bc4cd68284"}},"repository":{"url":"git+ssh://git@github.com/aws/aws-durable-execution-sdk-js.git","type":"git","directory":"packages/aws-durable-execution-sdk-js-eslint-plugin"},"_npmVersion":"11.16.0","description":"ESLint plugin for AWS Lambda durable functions best practices","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.2.6","typescript":"^5.8.2","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/eslint":"^8.56.0"},"peerDependencies":{"eslint":">=8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/durable-execution-sdk-js-eslint-plugin_1.0.1_1786403880630_0.6571337684431511","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aws/durable-execution-sdk-js-eslint-plugin","version":"1.1.0","keywords":["eslint","eslint-plugin","durable-functions","aws-lambda"],"_id":"@aws/durable-execution-sdk-js-eslint-plugin@1.1.0","maintainers":[{"name":"durable-execution-dev","email":"durable-execution-dev@amazon.com"}],"homepage":"https://github.com/aws/aws-durable-execution-sdk-js/tree/main/packages/aws-durable-execution-sdk-js-eslint-plugin","bugs":{"url":"https://github.com/aws/aws-durable-execution-sdk-js/issues"},"dist":{"shasum":"f826ae4e0ca50bf8dd446be31c5b6591a7087da8","tarball":"https://registry.npmjs.org/@aws/durable-execution-sdk-js-eslint-plugin/-/durable-execution-sdk-js-eslint-plugin-1.1.0.tgz","fileCount":18,"integrity":"sha512-1Ra2T0ItKp6YgIyl5SHgOho1+n/M53fqkzR/mluQi0bbB4n7C0FyCN2NmoFenK0YiHG7b3icq0zm2umpj2VmxA==","signatures":[{"sig":"MEYCIQDqEtV+6YLMc5EX1uT+6f22aTdB0XO4mvMKvkpoG7mUpQIhALroGHJUc53w7+IognfB7mlTs0VyiiPUoRlbUzt9kTXJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aws%2fdurable-execution-sdk-js-eslint-plugin@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":47517},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"c29ffc26d4faffe1f2fc01c3e9d18e7f23da7c68","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist node_modules .tsbuildinfo"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80799582-c8c1-4fa3-b37f-59bc4cd68284"}},"repository":{"url":"git+ssh://git@github.com/aws/aws-durable-execution-sdk-js.git","type":"git","directory":"packages/aws-durable-execution-sdk-js-eslint-plugin"},"_npmVersion":"11.16.0","description":"ESLint plugin for AWS Lambda durable functions best practices","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.2.6","typescript":"^5.8.2","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/eslint":"^8.56.0"},"peerDependencies":{"eslint":">=8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/durable-execution-sdk-js-eslint-plugin_1.1.0_1786654598829_0.01754200554143459","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@aws/durable-execution-sdk-js-eslint-plugin","version":"1.1.1","description":"ESLint plugin for AWS Lambda durable functions best practices","license":"Apache-2.0","repository":{"type":"git","url":"git+ssh://git@github.com/aws/aws-durable-execution-sdk-js.git","directory":"packages/aws-durable-execution-sdk-js-eslint-plugin"},"homepage":"https://github.com/aws/aws-durable-execution-sdk-js/tree/main/packages/aws-durable-execution-sdk-js-eslint-plugin","main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=22"},"scripts":{"build":"tsc","test":"jest","clean":"rm -rf dist node_modules .tsbuildinfo"},"keywords":["eslint","eslint-plugin","durable-functions","aws-lambda"],"peerDependencies":{"eslint":">=8.0.0"},"devDependencies":{"@types/eslint":"^8.56.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","eslint":"^8.57.0","jest":"^29.7.0","ts-jest":"^29.2.6","typescript":"^5.8.2"},"private":false,"gitHead":"d7bbfc3b9c350e2194d9b7dcbfe1218cf8127a51","_id":"@aws/durable-execution-sdk-js-eslint-plugin@1.1.1","bugs":{"url":"https://github.com/aws/aws-durable-execution-sdk-js/issues"},"_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-cqxxrShNdJIhcCndIyBwhxU5mGPMi2XlZllAmGtZAkgr8Ge0zz7X2bbNbrQbSFuwCD24bw3VaJ46Ek/Y2STOtQ==","shasum":"d3ed6e0db1a4e071defeaa22e4dd2847db9e05d8","tarball":"https://registry.npmjs.org/@aws/durable-execution-sdk-js-eslint-plugin/-/durable-execution-sdk-js-eslint-plugin-1.1.1.tgz","fileCount":18,"unpackedSize":47543,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aws%2fdurable-execution-sdk-js-eslint-plugin@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCfL6KLkkevrbMy57MfIs0EcKJpiFpJufZFom8iAgSpXAIhAPxskF4xGq0jckZPfFl4lL9lPT9sHx28AiN22XdskbUA"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80799582-c8c1-4fa3-b37f-59bc4cd68284"}},"directories":{},"maintainers":[{"name":"durable-execution-dev","email":"durable-execution-dev@amazon.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/durable-execution-sdk-js-eslint-plugin_1.1.1_1786735302351_0.5946368154908088"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-27T16:42:19.022Z","modified":"2026-08-14T19:21:44.073Z","0.0.1":"2025-11-27T16:42:19.281Z","1.0.0":"2025-12-02T14:24:29.641Z","1.0.1":"2026-08-10T23:18:00.774Z","1.1.0":"2026-08-13T20:56:39.041Z","1.1.1":"2026-08-14T19:21:42.508Z"},"bugs":{"url":"https://github.com/aws/aws-durable-execution-sdk-js/issues"},"homepage":"https://github.com/aws/aws-durable-execution-sdk-js/tree/main/packages/aws-durable-execution-sdk-js-eslint-plugin","keywords":["eslint","eslint-plugin","durable-functions","aws-lambda"],"repository":{"type":"git","url":"git+ssh://git@github.com/aws/aws-durable-execution-sdk-js.git","directory":"packages/aws-durable-execution-sdk-js-eslint-plugin"},"description":"ESLint plugin for AWS Lambda durable functions best practices","maintainers":[{"name":"durable-execution-dev","email":"durable-execution-dev@amazon.com"}],"readme":"# AWS Durable Execution ESLint Plugin\n\nESLint plugin for AWS Durable Execution SDK best practices.\n\n## Installation\n\n```bash\nnpm install --save-dev @aws/durable-execution-sdk-js-eslint-plugin\n```\n\n## Usage\n\nAdd the plugin to your ESLint configuration:\n\n```json\n{\n  \"plugins\": [\"@aws/durable-execution-sdk-js-eslint-plugin\"],\n  \"rules\": {\n    \"@aws/durable-execution-sdk-js-eslint-plugin/no-nested-durable-operations\": \"error\",\n    \"@aws/durable-execution-sdk-js-eslint-plugin/no-closure-in-durable-operations\": \"error\"\n  }\n}\n```\n\nOr use the recommended configuration:\n\n```json\n{\n  \"extends\": [\"plugin:@aws/durable-execution-sdk-js-eslint-plugin/recommended\"]\n}\n```\n\n## Rules\n\n### `no-nested-durable-operations`\n\nPrevents using the same context object inside its own durable operation.\n\n#### ❌ Incorrect\n\n```javascript\ncontext.step(\"step1\", async () => {\n  // Error: Cannot use the same context object inside its own operation\n  await context.wait(1000);\n\n  const result = await context.step(\"step2\", async () => {\n    return \"nested step\";\n  });\n\n  return result;\n});\n```\n\n#### ✅ Correct\n\n```javascript\n// Use runInChildContext for nested operations\nconst result = await context.runInChildContext(\"block1\", async (childCtx) => {\n  await childCtx.wait(1000);\n\n  const result = await childCtx.step(\"step2\", async () => {\n    return \"nested step\";\n  });\n\n  return result;\n});\n```\n\n### `no-closure-in-durable-operations`\n\nPrevents modifying closure variables inside durable operations. Reading closure variables is allowed.\n\n#### ❌ Incorrect\n\n```javascript\nconst handler = withDurableExecution(\n  async (event: any, context: DurableContext) => {\n    let a = 2;\n    const result = await context.runInChildContext(\n      async (childContext: DurableContext) => {\n        const stepResult = await childContext.step(async () => {\n          // Error: Modifying 'a' from outer scope causes replay inconsistency\n          a = a + 1;\n          return \"child step completed\";\n        });\n        return stepResult;\n      },\n    );\n    return result;\n  },\n);\n```\n\n#### ✅ Correct\n\n```javascript\nconst handler = withDurableExecution(\n  async (event: any, context: DurableContext) => {\n    let a = 2;\n    const result = await context.runInChildContext(\n      async (childContext: DurableContext) => {\n        const stepResult = await childContext.step(async () => {\n          // Reading 'a' is OK\n          const value = a + 1;\n          return value;\n        });\n        return stepResult;\n      },\n    );\n    return result;\n  },\n);\n\n// Or use local variables\nconst handler = withDurableExecution(\n  async (event: any, context: DurableContext) => {\n    const result = await context.runInChildContext(\n      async (childContext: DurableContext) => {\n        const stepResult = await childContext.step(async () => {\n          let a = 2;\n          a = a + 1;\n          return \"child step completed\";\n        });\n        return stepResult;\n      },\n    );\n    return result;\n  },\n);\n```\n\n## Supported Durable Operations\n\nThe plugin detects these durable operations:\n\n- `step`\n- `runInChildContext`\n- `waitForCondition`\n- `waitForCallback`\n- `wait`\n- `parallel`\n- `map`\n\n## Why These Rules?\n\n### No Nested Durable Operations\n\nNesting durable operations with the same context object can cause runtime errors and unexpected behavior in AWS Lambda durable functions. This rule helps catch these issues at development time.\n\n### No Closure in Durable Operations\n\nDuring replay, durable functions skip already-executed steps. If a closure variable is modified inside a step, the modification won't occur during replay, causing different outcomes between initial execution and replay. This leads to non-deterministic behavior and potential bugs.\n\nReading closure variables is safe because it doesn't change state. Only mutations (assignments, increments, decrements) are problematic.\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md","license":"Apache-2.0"}