{"_id":"jotai-transaction","_rev":"4-18a3c7e271f61810164528e0e5f48c83","name":"jotai-transaction","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.0":{"name":"jotai-transaction","version":"0.0.0","_id":"jotai-transaction@0.0.0","maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"dist":{"shasum":"b6f65a94c5f756664b80d2b4e7fa10c979b27fa4","tarball":"https://registry.npmjs.org/jotai-transaction/-/jotai-transaction-0.0.0.tgz","fileCount":1,"integrity":"sha512-DkNjf73iEyrutunCfKWHjMShC96YcioK7BU90rywho04BfI33GeULvO+Axw4d1bCt0d7CBiwcgDtA4BafMv/8Q==","signatures":[{"sig":"MEUCIG92gtdFti7RYSNAKUJo2iMfbWPyH333sR98fUop3t32AiEAxfHP8KQKZmbUdvda1C5ecTYiKvsKIwgj3F0+pvXymCM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56},"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"_npmVersion":"9.6.7","directories":{},"_nodeVersion":"18.17.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/jotai-transaction_0.0.0_1743030650602_0.9692419497218556","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"jotai-transaction","version":"0.1.0","keywords":["jotai","react","state","transaction","atom"],"author":{"name":"Hamza Hassan"},"license":"MIT","_id":"jotai-transaction@0.1.0","maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"contributors":[],"homepage":"https://github.com/jotaijs/jotai-transaction#readme","bugs":{"url":"https://github.com/jotaijs/jotai-transaction/issues"},"dist":{"shasum":"761c47726ae865081c7c17c383e7627c860907d3","tarball":"https://registry.npmjs.org/jotai-transaction/-/jotai-transaction-0.1.0.tgz","fileCount":20,"integrity":"sha512-FIquvYeC7tAxs76Sna2xWT8tlP7dLQ+FDrlYxAKR460AQHQsuQi922pDz8vPLRKyM3Mm6MNlKNLWqviAx+w1QA==","signatures":[{"sig":"MEUCIGzFA8gYyoiD7LAGVgeuGXDGznaqRXb7qb+dMFxfetDvAiEA/Dm7lHaJ+d74ex+ZPMf1yBx2gbrFuf7jbNrj5xpwkfI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62826},"main":"dist/index.js","_from":"file:jotai-transaction-0.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.esm.js","scripts":{"dev":"vite","test":"vitest run","build":"tsdx build","format":"prettier --write \"src/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" \"examples/**/*.{ts,tsx}\"","test:ui":"vitest --ui","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:lint":"eslint .","test:types":"tsc --noEmit","test:watch":"vitest","test:format":"prettier . --list-different","format:check":"prettier --check \"src/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" \"examples/**/*.{ts,tsx}\""},"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"_resolved":"/tmp/ecdcd14c42ed8f379c2fcb76a8992db8/jotai-transaction-0.1.0.tgz","_integrity":"sha512-FIquvYeC7tAxs76Sna2xWT8tlP7dLQ+FDrlYxAKR460AQHQsuQi922pDz8vPLRKyM3Mm6MNlKNLWqviAx+w1QA==","repository":{"url":"git+https://github.com/jotaijs/jotai-transaction.git","type":"git"},"_npmVersion":"10.8.2","description":"👻 Transaction support for Jotai atom updates","directories":{},"_nodeVersion":"20.19.0","dependencies":{"jiti":"^2.4.2"},"_hasShrinkwrap":false,"packageManager":"pnpm@8.6.0","devDependencies":{"jest":"^29.5.0","tsdx":"^0.14.1","vite":"^6.2.5","jotai":"^2.0.0","react":"^18.0.0","eslint":"^9.18.0","vitest":"^3.1.1","prettier":"^3.0.0","happy-dom":"^17.4.4","react-dom":"^18.0.0","@eslint/js":"^9.18.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@types/react-dom":"^19.0.2","typescript-eslint":"^8.21.0","eslint-plugin-react":"^7.37.4","@testing-library/dom":"10.0.0","@vitejs/plugin-react":"^4.3.4","eslint-plugin-import":"2.31.0","@testing-library/react":"^16.2.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.3","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.18.1","eslint-plugin-react-hooks":"^5.2.0","@types/minimalistic-assert":"^1.0.3","@testing-library/user-event":"^14.6.1","@types/testing-library__jest-dom":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.18.1","eslint-import-resolver-typescript":"^3.7.0"},"peerDependencies":{"jotai":">=2.9.0","react":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/jotai-transaction_0.1.0_1744118624122_0.6202622904742792","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"jotai-transaction","version":"0.1.1","keywords":["jotai","react","state","transaction","atom"],"author":{"name":"Hamza Hassan"},"license":"MIT","_id":"jotai-transaction@0.1.1","maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"contributors":[],"homepage":"https://github.com/jotaijs/jotai-transaction#readme","bugs":{"url":"https://github.com/jotaijs/jotai-transaction/issues"},"dist":{"shasum":"c068ebd53ae1d3529444357e2617bff77d398002","tarball":"https://registry.npmjs.org/jotai-transaction/-/jotai-transaction-0.1.1.tgz","fileCount":19,"integrity":"sha512-wi9xuWoY0XBFkQkXX/JGJy6tUFBkqNcX6n9Sd514rMLkVciLYILvNZDOYdgHFg8MrKW0TOqaceQvLMv3mD6Y5g==","signatures":[{"sig":"MEYCIQCu7EFscOQLQVvH9jsCNZ3j4HFQr1lhYQ9iofVpgfomrwIhALg/jbHBvSy8Yq5SBmHfl72ANbi6cmp5zXtWqYq406Q/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62789},"main":"dist/index.js","_from":"file:jotai-transaction-0.1.1.tgz","types":"dist/index.d.ts","module":"dist/index.esm.js","scripts":{"dev":"vite","test":"vitest run","build":"tsdx build","format":"prettier --write \"src/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" \"examples/**/*.{ts,tsx}\"","test:ui":"vitest --ui","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:lint":"eslint .","test:types":"tsc --noEmit","test:watch":"vitest","test:format":"prettier . --list-different","format:check":"prettier --check \"src/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" \"examples/**/*.{ts,tsx}\""},"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"_resolved":"/tmp/9c022b4444e51b039bd1a8443f6761e7/jotai-transaction-0.1.1.tgz","_integrity":"sha512-wi9xuWoY0XBFkQkXX/JGJy6tUFBkqNcX6n9Sd514rMLkVciLYILvNZDOYdgHFg8MrKW0TOqaceQvLMv3mD6Y5g==","repository":{"url":"git+https://github.com/jotaijs/jotai-transaction.git","type":"git"},"_npmVersion":"10.8.2","description":"👻 Transaction support for Jotai atom updates","directories":{},"_nodeVersion":"20.19.0","dependencies":{"jiti":"^2.4.2"},"_hasShrinkwrap":false,"packageManager":"pnpm@8.6.0","devDependencies":{"jest":"^29.5.0","tsdx":"^0.14.1","vite":"^6.2.5","jotai":"^2.0.0","react":"^18.0.0","eslint":"^9.18.0","vitest":"^3.1.1","prettier":"^3.0.0","happy-dom":"^17.4.4","react-dom":"^18.0.0","@eslint/js":"^9.18.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^22.10.2","@types/react":"^19.0.2","@types/react-dom":"^19.0.2","typescript-eslint":"^8.21.0","eslint-plugin-react":"^7.37.4","@testing-library/dom":"10.0.0","@vitejs/plugin-react":"^4.3.4","eslint-plugin-import":"2.31.0","@testing-library/react":"^16.2.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.3","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^8.18.1","eslint-plugin-react-hooks":"^5.2.0","@types/minimalistic-assert":"^1.0.3","@testing-library/user-event":"^14.6.1","@types/testing-library__jest-dom":"^6.0.0","@typescript-eslint/eslint-plugin":"^8.18.1","eslint-import-resolver-typescript":"^3.7.0"},"peerDependencies":{"jotai":">=2.9.0","react":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/jotai-transaction_0.1.1_1744119070869_0.02240165798851468","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"jotai-transaction","version":"0.2.0","description":"👻 Transaction support for Jotai atom updates","repository":{"type":"git","url":"git+https://github.com/jotaijs/jotai-transaction.git"},"bugs":{"url":"https://github.com/jotaijs/jotai-transaction/issues"},"author":{"name":"Hamza Hassan"},"contributors":[{"name":"Daishi Kato","url":"https://github.com/dai-shi"},{"name":"David Maskasky","url":"https://github.com/dmaskasky"}],"license":"MIT","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","packageManager":"pnpm@8.6.0","peerDependencies":{"jotai":">=2.9.0","react":">=17.0.0"},"devDependencies":{"@eslint/js":"^9.24.0","@testing-library/dom":"10.0.0","@testing-library/jest-dom":"^6.6.3","@testing-library/react":"^16.3.0","@testing-library/user-event":"^14.6.1","@types/jest":"^29.5.14","@types/minimalistic-assert":"^1.0.3","@types/node":"^22.14.0","@types/react":"^19.1.0","@types/react-dom":"^19.1.1","@typescript-eslint/eslint-plugin":"^8.29.1","@vitejs/plugin-react":"^4.3.4","eslint":"^9.24.0","eslint-config-prettier":"^9.1.0","eslint-import-resolver-typescript":"^3.10.0","eslint-plugin-import":"2.31.0","eslint-plugin-prettier":"^5.2.6","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^5.2.0","happy-dom":"^17.4.4","jest":"^29.7.0","jotai":"^2.12.2","prettier":"^3.5.3","react":"^18.3.1","react-dom":"^18.3.1","tsdx":"^0.14.1","typescript":"^5.8.3","typescript-eslint":"^8.29.1","vite":"^6.2.5","vitest":"^3.1.1"},"keywords":["jotai","react","state","transaction","atom"],"dependencies":{"jiti":"^2.4.2"},"scripts":{"dev":"vite","build":"tsdx build","test":"vitest run","test:watch":"vitest","test:types":"tsc --noEmit","test:lint":"eslint .","test:ui":"vitest --ui","test:format":"prettier . --list-different","coverage":"vitest run --coverage","format":"prettier --write \"src/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" \"examples/**/*.{ts,tsx}\"","format:check":"prettier --check \"src/**/*.{ts,tsx}\" \"tests/**/*.{ts,tsx}\" \"examples/**/*.{ts,tsx}\"","lint:fix":"eslint . --fix"},"_id":"jotai-transaction@0.2.0","homepage":"https://github.com/jotaijs/jotai-transaction#readme","_integrity":"sha512-wrXetca1P6Mw9AVLTfmNApfSr9RRkBRf5rA+GwE9krnJEHSLHtCXorZh4zELtSdQ5harVdcKDBirSKLIQWLkTw==","_resolved":"/tmp/99585a8a251f914ab261c045d05054e3/jotai-transaction-0.2.0.tgz","_from":"file:jotai-transaction-0.2.0.tgz","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-wrXetca1P6Mw9AVLTfmNApfSr9RRkBRf5rA+GwE9krnJEHSLHtCXorZh4zELtSdQ5harVdcKDBirSKLIQWLkTw==","shasum":"a08b75592b0330e5d5643a20a9e797875322f42c","tarball":"https://registry.npmjs.org/jotai-transaction/-/jotai-transaction-0.2.0.tgz","fileCount":20,"unpackedSize":63902,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA4vH43qaFh1WUbCo4rpOtMVkXCjL+gy7F5ZGRVUzNIgAiEAwx7X51hveL+PoElG9OwlhTM/1Fp4HwuH7Vf8lEX7fpM="}]},"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jotai-transaction_0.2.0_1744152872024_0.38681128186019875"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-26T23:10:50.601Z","modified":"2025-04-08T22:54:32.519Z","0.0.0":"2025-03-26T23:10:50.761Z","0.1.0":"2025-04-08T13:23:44.352Z","0.1.1":"2025-04-08T13:31:11.082Z","0.2.0":"2025-04-08T22:54:32.295Z"},"bugs":{"url":"https://github.com/jotaijs/jotai-transaction/issues"},"author":{"name":"Hamza Hassan"},"license":"MIT","homepage":"https://github.com/jotaijs/jotai-transaction#readme","keywords":["jotai","react","state","transaction","atom"],"repository":{"type":"git","url":"git+https://github.com/jotaijs/jotai-transaction.git"},"description":"👻 Transaction support for Jotai atom updates","contributors":[{"name":"Daishi Kato","url":"https://github.com/dai-shi"},{"name":"David Maskasky","url":"https://github.com/dmaskasky"}],"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"readme":"# jotai-transaction\n\nAtomic transaction support for Jotai state updates.\n\n## Overview\n\n`jotai-transaction` extends [Jotai](https://github.com/pmndrs/jotai)'s capabilities to support transactional updates across multiple atoms. This allows you to:\n\n- Group multiple atom updates into a single atomic operation\n- Stage changes without affecting the UI until explicitly committed\n- Roll back changes if an error occurs or conditions aren't met\n- Handle complex state transitions where partial updates would leave an inconsistent state\n\n## Installation\n\n```bash\n# npm\nnpm install jotai-transaction\n\n# yarn\nyarn add jotai-transaction\n```\n\n## Basic Usage\n\n```jsx\nimport { atom, useAtom } from 'jotai';\nimport { beginTransaction, commitTransaction, rollbackTransaction } from 'jotai-transaction';\n\nconst countAtom = atom(0);\nconst messageAtom = atom('hello');\n\nfunction MyComponent() {\n  const [count, setCount] = useAtom(countAtom);\n  const [message, setMessage] = useAtom(messageAtom);\n\n  const handleSubmit = () => {\n    const transaction = beginTransaction();\n    \n    // Stage changes (these won't update the UI yet)\n    transaction.set(countAtom, count + 1);\n    transaction.set(messageAtom, `Updated ${count + 1} times`);\n    \n    commitTransaction(transaction);\n  };\n}\n```\n\n## React Hook Support\n\n```jsx\nimport { atom, useAtom } from 'jotai';\nimport { useTransaction } from 'jotai-transaction';\n\nconst formAtom = atom({ name: '', email: '', age: 0 });\nconst formStatusAtom = atom('idle');\n\nfunction FormComponent() {\n  const [form, setForm] = useAtom(formAtom);\n  const [status, setStatus] = useAtom(formStatusAtom);\n  \n  const transaction = useTransaction({\n    onCommit: () => console.log('Transaction committed successfully'),\n    onRollback: () => console.log('Transaction rolled back')\n  });\n  \n  const handleSubmit = async (e) => {\n    e.preventDefault();\n    \n    transaction.set(formStatusAtom, 'submitting');\n    transaction.set(formAtom, { ...form, name: form.name.trim() });\n    \n    try {\n      commitTransaction(transaction);\n      \n      await submitToApi(transaction.get(formAtom));\n      \n      const successTransaction = beginTransaction();\n      successTransaction.set(formStatusAtom, 'success');\n      commitTransaction(successTransaction);\n    } catch (error) {\n      rollbackTransaction(transaction);\n    }\n  };\n  \n  // ...\n}\n```\n\n## API Reference\n\n### `beginTransaction(options?)`\n\nCreates a new transaction for staging atom updates.\n\n**Options:**\n- `store?`: Custom Jotai store (uses default store if not provided)\n- `onCommit?`: Callback function to run when transaction is committed\n- `onRollback?`: Callback function to run when transaction is rolled back\n- `label?`: Optional label for the transaction (useful for debugging)\n\n**Returns:** A Transaction object with the following properties:\n- `id`: Unique identifier for the transaction\n- `status`: Current status ('pending', 'committed', or 'rolled-back')\n- `set(atom, value)`: Method to stage an update to an atom\n- `get(atom)`: Method to get the current or staged value of an atom\n\n### `commitTransaction(transaction)`\n\nApplies all staged changes in the transaction to the store.\n\n### `rollbackTransaction(transaction)`\n\nDiscards all staged changes in the transaction.\n\n### `useTransaction(options?)`\n\nReact hook for creating transactions. Takes the same options as `beginTransaction`.\n\n### `useTransactionStatus()`\n\nReact hook for monitoring transaction status.\n\n**Returns:**\n- `activeTransactions`: Array of IDs for active transactions\n- `isTransactionActive`: Boolean indicating if any transactions are active\n- `registerTransaction(id)`: Method to register a transaction\n- `unregisterTransaction(id)`: Method to unregister a transaction\n\n## Advanced Usage\n\n### Working with Derived Atoms\n\nTransactions correctly handle derived atoms by recalculating their values based on staged primitive atom updates:\n\n```jsx\nimport { atom } from 'jotai';\nimport { beginTransaction, commitTransaction } from 'jotai-transaction';\n\nconst countAtom = atom(0);\nconst doubleAtom = atom((get) => get(countAtom) * 2);\n\nconst transaction = beginTransaction();\ntransaction.set(countAtom, 5);\n\n// The derived value is calculated correctly within the transaction\nconsole.log(transaction.get(doubleAtom)); // Output: 10\n\n// But the UI won't update until committed\ncommitTransaction(transaction);\n```\n\n### Custom Stores\n\nTransactions work with custom Jotai stores:\n\n```jsx\nimport { createStore } from 'jotai';\nimport { beginTransaction, commitTransaction } from 'jotai-transaction';\n\nconst myStore = createStore();\nconst transaction = beginTransaction({ store: myStore });\n```\n","readmeFilename":"README.md"}