{"_id":"@2davi/rest-domain-state-manager","_rev":"15-b233f09d2ced48624ae3a36931cd1cd2","name":"@2davi/rest-domain-state-manager","dist-tags":{"latest":"1.2.4"},"versions":{"0.9.1":{"name":"@2davi/rest-domain-state-manager","version":"0.9.1","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@0.9.1","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"adfb12a012e2ae588f9d8373296ade7350bfc557","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-0.9.1.tgz","fileCount":27,"integrity":"sha512-rzlMmeqom8LIYGVUdury1S1NQzDQDXQc/b6rXYg69E1lKLM+UHyvAuQ1adkrKpDph+ZpyehHf/xNIfowoxvtoA==","signatures":[{"sig":"MEYCIQDKSbSecjcXETP8p7++r3xh5+nweqhc85+86WkHm1BghQIhAPv7mYWq1LSu7dkLKBEz/9oQ3rVsr9X86O34OlYNksaQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":836787},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"a7155276f87ef5edd491071587890917a3b8e42f","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","vitepress":"^1.6.4","typescript":"^5.7.0","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_0.9.1_1774255408229_0.46819411857366466","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@2davi/rest-domain-state-manager","version":"0.9.2","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@0.9.2","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"0b6e5c4f7749fd4b0f4db95bd6ea5133428485d0","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-0.9.2.tgz","fileCount":28,"integrity":"sha512-Vp8WHoif2n2pLtgpefBBvTk6dXYqKBP6aCiNDg4RprATrinW6E1Aavnt679O24O3oCg1F6/jSdn+sZAN47ZrKg==","signatures":[{"sig":"MEUCIHloPWihzjhGGJ/niUV4l+dtlHK704pm2h+ux4AixmzfAiEAuHz5JIktqMy1q71CMU5Vw4rRTptQ2os9Nma1hhJncKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":841562},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"3cffade8b5568553b1e1a1e63eb21b88e23641e8","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"vite build && tsc --emitDeclarationOnly","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","vitepress":"^1.6.4","typescript":"^5.7.0","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_0.9.2_1774255690267_0.9540136759048199","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@2davi/rest-domain-state-manager","version":"0.10.0","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@0.10.0","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"af8850df02f5c9350297c2d0fcae901090e96a0f","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-0.10.0.tgz","fileCount":157,"integrity":"sha512-1Zk9tXqvy73d6+fUpjDyrkGQoXP+fFWEjUL8lDJBGyyLHwqFftYXxj+rwZxR231lyrZqKorjFFI22EtENOIQmQ==","signatures":[{"sig":"MEQCIB88zRD+78OQ05Av5LA05+V9buwGeSUo4qBAV34U8gjSAiBqO4v2OpXUll8yJ08dUfYpflRLw9T+hU4FxgOnvfxIPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1573303},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"aebdb6d92ac41d7a0afbc6e17ac6177f7a16b2f5","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_0.10.0_1774854194159_0.866367624530803","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@2davi/rest-domain-state-manager","version":"0.10.1","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@0.10.1","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"2b82ac75b09c515274aa0439b1727652bcaa91c3","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-0.10.1.tgz","fileCount":157,"integrity":"sha512-DqTUawg9P+tKkVedg3PK7vR75KJtE9xjaEyqkVN+bGOXE0rbdPfVl43wx8ULjo7bhRGAWOFGWUkBBGocmxAP1w==","signatures":[{"sig":"MEUCIEKpQfo6Zaz9LDl/c8MBIdhaMZ3jCE6Kypv3s0XGBhcVAiEA14ha5eZ+8pjO3jlMKiLZAvJmj0haRXUrhyD0f2HKrSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1573473},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"d4b47173c208d6f7f77b9f3bb122da74e082febe","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_0.10.1_1774854509506_0.6251933218918515","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"@2davi/rest-domain-state-manager","version":"0.10.2","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@0.10.2","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"21db593df089f4cd80cbf74c4d0aac76ff23168e","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-0.10.2.tgz","fileCount":157,"integrity":"sha512-I9TpDrvS35fY12GNZX/OyuMBuY8apDxWzJvrpQo7f8SeV0ZAIbSx7WUFvrjn4VQhixnRMFOCsZMMacGKn3LQ1g==","signatures":[{"sig":"MEUCIE50hiCCrfFRrJtcOuBOZdXY1MRRhYySk5ntanyzL2uOAiEA5YrGvdSxZ8giIF9LR4yDEhoPNUXj40zxLbYltaNkEGg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1577058},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"70228804548843d783f7bfe2d1b27c20f0336dd4","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_0.10.2_1774855540644_0.9552749398800753","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@2davi/rest-domain-state-manager","version":"0.11.0","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@0.11.0","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"6d7ca3fabc2c8163110e52ce25057b7173b78e0a","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-0.11.0.tgz","fileCount":157,"integrity":"sha512-b9uXTmPvuRyt7ASO7KhmpKsVkF7z9RutLxxZsCEUWZAT9lIc7aZNml7c8ddQwFFM0wZUGO5IuHUL8g27PYUVNw==","signatures":[{"sig":"MEUCIQDRSZr4zvYM7LJEmUJTl1GPjYHNf79A+Unp5LoZgaKnzAIgNkdjodgCQRvG6IvBzkMjs6k24MPQuaPzL7lpI8HY30k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1583988},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"411a8dec707c7a4116bdcd5fedd679b5fdcff968","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_0.11.0_1774923146144_0.17825525271493659","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@2davi/rest-domain-state-manager","version":"1.0.0","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@1.0.0","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"d21a36dc685ae38ed99b46cd5fd3178ad568154f","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.0.0.tgz","fileCount":157,"integrity":"sha512-4he2BxfUnQeBuIMo4vkYd+qmuXSjUUbXMZFvVbpJ33krEN66enOImn5vlJw4j1BuQMP+oUfDboKOB4oS4y1ONQ==","signatures":[{"sig":"MEQCIGgQBb5Gtf8jjdl7lgPoAJpnfUPq5bXkhgMkLP2lXx2xAiASBk/LEqJnScjZQA1Co3/14nx6t66igjSdNbRzBJ+MTw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1583863},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"2ab3fb72128d77247d5231d3d21f1a03acdd0611","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_1.0.0_1774923555740_0.9557170103219996","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@2davi/rest-domain-state-manager","version":"1.0.1","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@1.0.1","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"8eb9ccf05ac020ab0308d6db03ef23e104a1f5d1","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.0.1.tgz","fileCount":157,"integrity":"sha512-QAhcbD+QrF5KLPM6gmQK3VaTtOXze1OtvoJrU7hBl+Pi3hi4qamEKL7RKB8wnghMRAo89T6KqCqsg+3gOlWFAQ==","signatures":[{"sig":"MEUCIGCEv/rvLD5c2UpblBTlIs3VOM7Ld5mKNYi1ED0E2a/BAiEAj+EjJvYF50mztV42yBmohmbN/nA4wYXE7PosWCJN3Nw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1589531},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"3f1798dba125919f28d4b59459c94c43dbebc9a6","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_1.0.1_1774931655220_0.6305611421438719","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@2davi/rest-domain-state-manager","version":"1.0.2","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@1.0.2","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"a25097b5753290a7cd2263a5f2ae6f2128ba8553","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.0.2.tgz","fileCount":157,"integrity":"sha512-6muv/Ok7ugfhKVs2Rwo/pnnc9dFhpP7zcUL5pqexIpntSfbvY7EiIIQ3sZWWNzbQW/RQtt0lR/mEGWSREww/hg==","signatures":[{"sig":"MEYCIQC6Of7iWcYn+LSIO2rr6CeLRfsvfbgkO6+4KEfZTmbAEAIhAMjbd67nQUZxLahGvfGRoGQnb+H1xXF0+1YPwWNB+fH8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1589485},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"593e6ec24c36730266eade40c2e4510b231151d2","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run format && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_1.0.2_1774931880314_0.5577260449419492","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@2davi/rest-domain-state-manager","version":"1.1.0","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@1.1.0","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"50d28a6099f8d038f160b1015da41d2116012064","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.1.0.tgz","fileCount":157,"integrity":"sha512-CzwItrkb/0D2bYaKTQ8ro+3O3FhDrW5uKG8o/1wfvLFR8zSFpMkshx+6XhVcDOl5KnfKguBZ6EYBWOOvgfN8xg==","signatures":[{"sig":"MEUCIQC+vKpR4q9woYB12AUHPIbNI4MAko7f9Hcs/NO/yB39uwIgFrxLX9cM/Ny4ADCwdWbsFosISN/qJMyGSKJcbSQSNuM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1641007},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"d8d9aa95e69f54e528fc6e14cbbfd0eed1951fb2","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run format && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_1.1.0_1775005146817_0.11901497101950298","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@2davi/rest-domain-state-manager","version":"1.2.0","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@1.2.0","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"836fd3c101463d82bfc25f43c23946c226b3a38b","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.2.0.tgz","fileCount":195,"integrity":"sha512-kPN+03mHWWIzHGhB35ckAeXEXHQWKdeYX3Ssfo/rTbGW/xL4jiP6wtreT3Vjb2lG9h14akIAsHW0vI7vNGnNnA==","signatures":[{"sig":"MEUCIQD6IwUVhwW0i0RaJMtaIJujjdye+jChbOCSOnuXWZunswIgQyqyN5N2gxXIiWo4EyROoVWEjTvBq9MMCOSifScAB40=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2240103},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"ef31d83dd7a531a1068300879accf19cd268e3fa","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run format && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^3.2.4","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_1.2.0_1775031791192_0.985736797301539","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@2davi/rest-domain-state-manager","version":"1.2.1","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@1.2.1","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"e116d592dbe4321b1386c8fab963603aa8b006f4","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.2.1.tgz","fileCount":195,"integrity":"sha512-HZTO5nPr6X4ro5w8OBXMGRucWW5Rp9dZRGC3FQiZ/7m5tkalPPJNfp1LEDoNHdA90zaon5ZnTD3HWevEEyOOIA==","signatures":[{"sig":"MEUCIQDG/5h4I1X+u1w9XaFUPu79oa+g3RBibqNNa/4Pe7ZziwIgDPpNSNsWm3lJizzwTqpzcgsRhIJ/dxlfstW1iLHhyi0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2244368},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"b31f261f0423f4fa48329f9202ae24247877967e","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","coverage":"npm run test -- --coverage","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","preDeploy":"npm run types && npm run prepublishOnly && npm run docs:build","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run format && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^3.2.4","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_1.2.1_1775093864757_0.2400167797349848","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@2davi/rest-domain-state-manager","version":"1.2.2","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@1.2.2","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"69a7dcd83e0ce31ac0f8ecf2f4e47a6d6543059a","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.2.2.tgz","fileCount":195,"integrity":"sha512-6foq9YRqxL5D77slFpdbRd5rCIW/IF2GV1jvsM7jxdpZiG3nmZCddkG8siv1SXOwdZB5djFrr2yvaOqnMYRzmQ==","signatures":[{"sig":"MEUCIEuk3uq/uboHHKMcBSnfLnSh8CM/nggWrPqQ7hox7xyoAiEAjg2Vzmz7lWz84NMGQzmls7YTLiESJ6XcG5V9W2bYY3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2244368},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"bb0631ee43433429d0fbba7c0249ec499371a57a","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","coverage":"npm run test -- --coverage","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","preDeploy":"npm run types && npm run prepublishOnly && npm run docs:build","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run format && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^3.2.4","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_1.2.2_1775094283503_0.7923209879187361","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@2davi/rest-domain-state-manager","version":"1.2.3","keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","_id":"@2davi/rest-domain-state-manager@1.2.3","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"dist":{"shasum":"3a7c25d2935ec33036898d1fcc497d50353ecf72","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.2.3.tgz","fileCount":195,"integrity":"sha512-fo8oN56knHI4o21J2k9SIjYgAENd6QXRxBrAEvtMiajG96ny4BFfcaKfo7W4YjVb0nunetm2s4toH1hvD3kZ/Q==","signatures":[{"sig":"MEQCIDxOuK3Z3IE4wqGKV0DItTxRHQcpHUpgXu02f8DTfCgwAiA3d+FVclFxwrMTqndfNP8Bg1UOP2XC8vuEImECrdcaqw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2244368},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"gitHead":"0f17d5af43af5ccf7ee31f8b87a95770792336ec","scripts":{"dev":"vite","lint":"eslint src index.js","test":"vitest run","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","coverage":"npm run test -- --coverage","docs:api":"typedoc","docs:dev":"vitepress dev docs","lint:fix":"eslint src index.js --fix","preDeploy":"npm run types && npm run prepublishOnly && npm run docs:build","docs:build":"npm run docs:api && vitepress build docs","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","prepublishOnly":"npm run lint && npm run format && npm run test && npm run build"},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"_npmVersion":"11.12.0","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","jsdom":"^29.0.1","eslint":"^9.0.0","rollup":"^4.60.0","terser":"^5.46.1","vitest":"^3.0.0","globals":"^17.4.0","typedoc":"^0.28.17","prettier":"^3.5.0","happy-dom":"^20.8.9","vitepress":"^1.6.4","typescript":"^5.7.0","@types/react":"^18.3.28","@commitlint/cli":"^20.5.0","semantic-release":"^25.0.3","@vitest/coverage-v8":"^3.2.4","eslint-plugin-jsdoc":"^62.8.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","typedoc-plugin-markdown":"^4.11.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^20.5.0","conventional-changelog-conventionalcommits":"^9.3.0"},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rest-domain-state-manager_1.2.3_1775095096503_0.40450022466404634","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@2davi/rest-domain-state-manager","version":"1.2.4","description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","publishConfig":{"access":"public"},"type":"module","main":"./dist/cjs/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.ts","engines":{"node":">=20.0.0"},"sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/cjs/index.cjs"},"./adapters/react":{"types":"./dist/src/adapters/react.d.ts","import":"./dist/src/adapters/react.mjs","require":"./dist/cjs/src/adapters/react.cjs"}},"peerDependencies":{"react":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"scripts":{"dev":"vite","build":"rollup -c && tsc -p tsconfig.build.json","types":"tsc -p tsconfig.build.json","lint":"eslint src index.js","lint:fix":"eslint src index.js --fix","format":"prettier --write \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","format:check":"prettier --check \"src/**/*.js\" \"index.js\" \"test/**/*.js\"","test":"vitest run","coverage":"npm run test -- --coverage","prepublishOnly":"npm run lint && npm run format && npm run test && npm run build","docs:dev":"vitepress dev docs","docs:build":"npm run docs:api && vitepress build docs","docs:api":"typedoc","preDeploy":"npm run types && npm run prepublishOnly && npm run docs:build"},"keywords":["rest","proxy","state-management","json-patch","esm"],"author":{"name":"2davi"},"license":"ISC","devDependencies":{"@commitlint/cli":"^20.5.0","@commitlint/config-conventional":"^20.5.0","@rollup/plugin-node-resolve":"^16.0.3","@semantic-release/changelog":"^6.0.3","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","@types/react":"^18.3.28","@vitest/coverage-v8":"^3.2.4","conventional-changelog-conventionalcommits":"^9.3.0","eslint":"^9.0.0","eslint-plugin-import":"^2.32.0","eslint-plugin-jsdoc":"^62.8.0","globals":"^17.4.0","happy-dom":"^20.8.9","jsdom":"^29.0.1","prettier":"^3.5.0","rollup":"^4.60.0","semantic-release":"^25.0.3","terser":"^5.46.1","typedoc":"^0.28.17","typedoc-plugin-markdown":"^4.11.0","typescript":"^5.7.0","vite":"^6.0.0","vitepress":"^1.6.4","vitest":"^3.0.0"},"gitHead":"f8a867143596a5c98c7f70ba9981f8ab9958c70e","_id":"@2davi/rest-domain-state-manager@1.2.4","_nodeVersion":"22.22.2","_npmVersion":"11.12.0","dist":{"integrity":"sha512-6DcWgtnYmrJnDLUcbRREvdsi5jsL0pVq6CfzboyW3YIwTfmCbUjAx4DqY+Q1BWH6mZaFqGD3gjj89yKczzDEWw==","shasum":"34c7806331956bd82ce5f01f0ebebb5266f22ab7","tarball":"https://registry.npmjs.org/@2davi/rest-domain-state-manager/-/rest-domain-state-manager-1.2.4.tgz","fileCount":195,"unpackedSize":2260093,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBQqbO1RVxpEJfxZOQ0cjLKQsJiXXNT4czQyEyj9lD1+AiARXzn/HjYJtkLq7GIX8yQVvxbPPUIpxwuC3IHPT0A0LQ=="}]},"_npmUser":{"name":"2davi","email":"2davijean@gmail.com"},"directories":{},"maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rest-domain-state-manager_1.2.4_1775117004422_0.03626735167324613"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-23T08:43:28.152Z","modified":"2026-04-02T08:03:24.719Z","0.9.1":"2026-03-23T08:43:28.397Z","0.9.2":"2026-03-23T08:48:10.477Z","0.10.0":"2026-03-30T07:03:14.322Z","0.10.1":"2026-03-30T07:08:29.652Z","0.10.2":"2026-03-30T07:25:40.841Z","0.11.0":"2026-03-31T02:12:26.363Z","1.0.0":"2026-03-31T02:19:15.948Z","1.0.1":"2026-03-31T04:34:15.413Z","1.0.2":"2026-03-31T04:38:00.536Z","1.1.0":"2026-04-01T00:59:07.076Z","1.2.0":"2026-04-01T08:23:11.354Z","1.2.1":"2026-04-02T01:37:45.061Z","1.2.2":"2026-04-02T01:44:43.719Z","1.2.3":"2026-04-02T01:58:16.698Z","1.2.4":"2026-04-02T08:03:24.614Z"},"author":{"name":"2davi"},"license":"ISC","keywords":["rest","proxy","state-management","json-patch","esm"],"description":"Proxy-based REST Domain State Manager for smart change tracking and auto-branching HTTP methods.","maintainers":[{"name":"2davi","email":"2davijean@gmail.com"}],"readme":"# @2davi/rest-domain-state-manager\n\n[![npm version](https://img.shields.io/npm/v/@2davi/rest-domain-state-manager)](https://www.npmjs.com/package/@2davi/rest-domain-state-manager)\n[![CI](https://github.com/2davi/rest-domain-state-manager/actions/workflows/ci.yml/badge.svg)](https://github.com/2davi/rest-domain-state-manager/actions/workflows/ci.yml)\n[![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC)\n\nREST API 리소스를 Proxy로 감싸, **필드 변경을 자동으로 추적**하고,\n**POST / PATCH / PUT을 스마트하게 분기**하는 zero-dependency 상태 관리 라이브러리.\n\n저장 실패 시 클라이언트 상태를 자동 복원하는 **보상 트랜잭션**까지 내장.\n\n---\n\n## 어떤 환경에서 쓰시나요?\n\n### JSP / 레거시 환경 → [SI 빠른 시작](#그리드-ui-바인딩--uicomposer--uilayout)\n\nSpring Boot + JSP + jQuery 환경에서 1:N 폼 그리드를 10줄로 만드세요.  \n`fnAddRow()`, `fnRemoveRow()`, `fnReindexRows()` — 전부 사라집니다.\n\n### React / Vue → [프레임워크 연동 빠른 시작](#react-연동--usedomainstate)\n\n`useDomainState()` 한 줄로 GET → 수정 → PATCH 사이클을 자동화하세요.  \n`fetch`, `useState`, `useEffect`, 롤백 로직 — 전부 사라집니다.\n\n---\n\n## 이 라이브러리가 해결하는 것\n\nREST API 프론트엔드 개발에서 반복되는 세 가지 문제를 해결합니다.\n\n### 1. \"어떤 필드가 바뀌었는지 모르겠다\"\n\n```javascript\n// ❌ Before — 모든 필드를 수동으로 모아야 한다\nconst payload = {\n    name:  document.getElementById('name').value,\n    email: document.getElementById('email').value,\n    phone: document.getElementById('phone').value,\n    // ...필드가 30개면 30줄\n};\nawait fetch('/api/users/1', { method: 'PUT', body: JSON.stringify(payload) });\n```\n\n```javascript\n// ✅ After — 변경한 필드만 자동으로 추적되고, 적절한 HTTP 메서드가 선택된다\nconst user = await api.get('/api/users/1');\nuser.data.name = 'Davi';                // ← 이 변경이 자동으로 기록된다\nawait user.save('/api/users/1');         // → PATCH [{ \"op\": \"replace\", \"path\": \"/name\", \"value\": \"Davi\" }]\n```\n\n### 2. \"저장 실패하면 화면이 꼬인다\"\n\n```javascript\n// ❌ Before — 실패 시 수동 복원 코드를 매번 작성\ntry {\n    await fetch('/api/users/1', { method: 'PATCH', body: ... });\n} catch {\n    // 이전 상태로 어떻게 되돌리지? UI에 반영된 값은?\n}\n```\n\n```javascript\n// ✅ After — 실패 시 save() 이전 상태로 자동 복원\ntry {\n    await user.save('/api/users/1');\n} catch (err) {\n    // user.data는 이미 save() 호출 이전 상태로 되돌아가 있다.\n    console.log(user.data.name); // → 변경 전 값\n}\n```\n\n### 3. \"1:N 그리드의 fnAddRow()가 끝없이 복사된다\"\n\n```javascript\n// ❌ Before — 화면마다 복사되는 보일러플레이트\nfunction fnAddRow() { /* N0 줄 */ }\nfunction fnRemoveRow() { /* 인덱스 밀림 버그 */ }\nfunction fnReindexRows() { /* N0 줄 */ }\nfunction fnSelectAll() { /* N0 줄 */ }\n```\n\n```javascript\n// ✅ After — HTML template 선언 + 컨트롤 함수 한 줄\nconst { addEmpty, removeChecked, validate } =\n    certs.bind('#certGrid', { layout: CertLayout });\n// addEmpty()      — 빈 행 추가\n// removeChecked() — 체크된 행 역순 제거 (인덱스 밀림 자동 방지)\n// validate()      — required 필드 검증\n```\n\n---\n\n## 설치\n\n```bash\nnpm install @2davi/rest-domain-state-manager\n```\n\nNode.js ≥ 20. 브라우저: Chrome 94+, Firefox 93+, Safari 15.4+.\n\n---\n\n## 빠른 시작 — 3분 안에 동작하는 코드\n\n### STEP 1. API 핸들러 생성\n\n```javascript\nimport { ApiHandler } from '@2davi/rest-domain-state-manager';\n\nconst api = new ApiHandler({ host: 'localhost:8080', debug: true });\n```\n\n### STEP 2. GET → 폼 바인딩 → 저장\n\n```javascript\nimport { DomainState, UIComposer, UILayout } from '@2davi/rest-domain-state-manager';\n\nDomainState.use(UIComposer); // 플러그인 설치 (앱 진입점에서 1회)\n\n// ── UI 계약 선언: 어떤 필드가 어떤 DOM 요소에 연결되는지 ──\nclass UserFormLayout extends UILayout {\n    static templateSelector = '#userFormTemplate';\n    static columns = {\n        name:  { selector: '[data-field=\"name\"]',  required: true },\n        email: { selector: '[data-field=\"email\"]' },\n        city:  { selector: '[data-field=\"city\"]' },\n    };\n}\n```\n\n```javascript\n// GET 응답이 자동으로 DomainState로 변환된다\nconst user = await api.get('/api/users/1');\n\n// 폼에 바인딩하면, 사용자가 입력하는 동안 Proxy를 통해 상태가 자동으로 변경된다.\n// 개발자가 user.data.name = '...' 같은 코드를 직접 작성할 필요가 없다.\nconst { unbind } = user.bindSingle('#userForm', { layout: UserFormLayout });\n\n// 사용자가 name 필드에 'Davi'를 입력하고, city 필드에 'Seoul'을 입력한 뒤 저장 버튼을 클릭하면:\nawait user.save('/api/users/1');\n// → PATCH [{ \"op\": \"replace\", \"path\": \"/name\", \"value\": \"Davi\" },\n//          { \"op\": \"replace\", \"path\": \"/city\", \"value\": \"Seoul\" }]\n// 사용자가 건드리지 않은 필드는 페이로드에 포함되지 않는다.\n```\n\n스크립트에서 직접 값을 넣는 것도 동일하게 동작합니다:\n\n```javascript\nuser.data.name = 'Davi';            // → changeLog에 replace 기록\nuser.data.address.city = 'Seoul';   // → 중첩 경로도 자동 추적\n```\n\n폼 바인딩이든 스크립트 대입이든, **Proxy의 `set` 트랩을 통과하는 모든 변경이 자동 기록**됩니다.\n\n### STEP 3. 신규 생성 (POST)\n\n```javascript\nimport { DomainState, DomainVO } from '@2davi/rest-domain-state-manager';\n\nclass UserVO extends DomainVO {\n    static fields = {\n        name:  { default: '', validate: v => v.trim().length > 0 },\n        email: { default: '' },\n        age:   { default: 0, transform: Number },\n    };\n}\n\nconst newUser = DomainState.fromVO(new UserVO(), api);\nnewUser.data.name  = 'Davi';\nnewUser.data.email = 'davi@example.com';\nawait newUser.save('/api/users');  // → POST (isNew === true)\n```\n\n`DomainVO`는 선택적 레이어입니다. `DomainState.fromJSON()`은 VO 없이도 완전히 동작합니다.\n\n---\n\n## HTTP 메서드 자동 분기\n\n`save()`는 두 가지 내부 상태를 분석하여 HTTP 메서드를 자동 결정합니다.\n\n| 조건                                 | 메서드    | 근거                                   |\n| ------------------------------------ | --------- | -------------------------------------- |\n| `isNew === true`                     | **POST**  | 서버에 아직 존재하지 않는 신규 리소스  |\n| 변경 없음 (`dirtyFields.size === 0`) | **no-op** | save() 조기 종료                       |\n| 변경 비율 ≥ 70%                      | **PUT**   | 전체 교체가 JSON Patch 배열보다 효율적 |\n| 변경 비율 < 70%                      | **PATCH** | RFC 6902 JSON Patch — 변경 부분만 전송 |\n\nPOST 성공 후 `isNew`가 `false`로 전환되어, 이후 저장은 PATCH 또는 PUT으로 분기합니다.\n\n---\n\n## 보상 트랜잭션 — 실패 시 자동 복원\n\n`save()` 진입 시 `structuredClone()`으로 현재 상태 4종(데이터, 변경이력, dirty 필드, isNew 플래그)을\n깊은 복사합니다. HTTP 요청이 실패하면 4종을 모두 save() 이전 시점으로 원자적 복원합니다.\n\n```javascript\nuser.data.name = 'Davi';           // 변경 기록됨\nawait user.save('/api/users/1');    // 서버 500 에러 발생!\n// → user.data.name은 자동으로 이전 값으로 복원됨\n// → changeLog, dirtyFields도 save() 진입 이전 상태로 복원됨\n// → 즉시 재시도 가능\n```\n\n`DomainPipeline`의 보상 트랜잭션과도 연계됩니다.\n`strict: false` 모드에서 후속 `save()` 실패를 감지한 뒤,\n이미 성공한 인스턴스에 `restore()`를 호출하여 전체 파이프라인의 일관성을 복구할 수 있습니다.\n\n---\n\n## 1:N 배열 관리 — DomainCollection\n\n```javascript\nimport { DomainCollection } from '@2davi/rest-domain-state-manager';\n\n// GET 응답 배열 → DomainCollection 변환\nconst certs = DomainCollection.fromJSONArray(\n    await fetch('/api/certificates').then(r => r.text()),\n    api\n);\n\ncerts.add({ certName: '정보처리기사', certType: 'IT' });  // 항목 추가\ncerts.remove(0);                                          // 인덱스로 제거\n\nawait certs.saveAll({\n    strategy: 'batch',           // 배열 전체를 단일 HTTP 요청으로 전송\n    path: '/api/certificates',\n});\n// → PUT (기존 배열 전체 교체) 또는 POST (신규 생성)\n```\n\n---\n\n## 그리드 UI 바인딩 — UIComposer + UILayout\n\nHTML `<template>` 기반으로 DOM 구조를 선언하고, 라이브러리가 데이터를 채웁니다.\nJS에서 DOM 구조를 생성하지 않으므로, CSS 프레임워크(Bootstrap, Tailwind)와 충돌 없이 사용할 수 있습니다.\n\n### 1. HTML — `<template>` 선언\n\n```html\n<template id=\"certRowTemplate\">\n  <tr>\n    <td><input type=\"checkbox\" class=\"dsm-checkbox\"></td>\n    <td><span class=\"dsm-row-number\"></span></td>\n    <td><input type=\"text\" data-field=\"certName\" placeholder=\"자격증명\"></td>\n    <td>\n      <select data-field=\"certType\">\n        <option value=\"IT\">IT</option>\n        <option value=\"LANG\">어학</option>\n      </select>\n    </td>\n  </tr>\n</template>\n\n<table>\n  <tbody id=\"certGrid\"></tbody>\n</table>\n\n<button id=\"btnAdd\">행 추가</button>\n<button id=\"btnRemove\">선택 삭제</button>\n<button id=\"btnSave\">저장</button>\n```\n\n### 2. JS — UILayout 선언 + 바인딩\n\n```javascript\nimport {\n    ApiHandler, DomainState, DomainCollection,\n    UIComposer, UILayout\n} from '@2davi/rest-domain-state-manager';\n\n// 플러그인 설치 (앱 진입점에서 1회)\nDomainState.use(UIComposer);\n\n// 화면별 UI 계약 선언\nclass CertLayout extends UILayout {\n    static templateSelector = '#certRowTemplate';\n    static itemKey          = 'certId';\n    static columns = {\n        certName: { selector: '[data-field=\"certName\"]', required: true },\n        certType: { selector: '[data-field=\"certType\"]' },\n    };\n}\n\nconst api   = new ApiHandler({ host: 'localhost:8080' });\nconst certs = DomainCollection.fromJSONArray(\n    // NOTE: 현재 ApiHandler.get() 메서드는 단일 객체 응답 중심으로 설계되어 있습니다 ^0^\n    // TODO: 빠른 업데이트를 통해 fetch 병행 없이 불러오도록 개선하겠습니다 ^~^;\n    await fetch('/api/certificates').then(r => r.text()),\n    api\n);\n\n// 바인딩 → 컨트롤 함수 반환\nconst { addEmpty, removeChecked, validate } =\n    certs.bind('#certGrid', { layout: CertLayout });\n\ndocument.getElementById('btnAdd').onclick    = addEmpty;\ndocument.getElementById('btnRemove').onclick = removeChecked;\ndocument.getElementById('btnSave').onclick   = async () => {\n    if (!validate()) return;\n    await certs.saveAll({ strategy: 'batch', path: '/api/certificates' });\n};\n```\n\n### 반환되는 컨트롤 함수\n\n| 함수                 | 역할                                                      |\n| -------------------- | --------------------------------------------------------- |\n| `addEmpty()`         | 빈 행 추가 (template 복제 + input 리스너 자동 등록)       |\n| `removeChecked()`    | 체크된 행 역순(LIFO) 제거 — 인덱스 밀림 자동 방지         |\n| `removeAll()`        | 전체 행 제거                                              |\n| `selectAll(checked)` | 전체 체크박스 일괄 설정                                   |\n| `invertSelection()`  | 체크 상태 반전                                            |\n| `validate()`         | `required: true` 필드 검증 + `is-invalid` CSS 클래스 토글 |\n| `getCheckedItems()`  | 체크된 DomainState 배열 반환                              |\n| `getItems()`         | 전체 DomainState 배열 반환                                |\n| `getCount()`         | 총 행 수 반환                                             |\n| `destroy()`          | 이벤트 리스너 정리                                        |\n\n---\n\n## React 연동 — useDomainState\n\n서브패스 import로 React 어댑터를 사용합니다. React 18+ `useSyncExternalStore` 기반입니다.\nReact가 `peerDependencies(optional)`로 선언되어 있어, React 없이 설치해도 경고가 뜨지 않습니다.\n\n```javascript\nimport { useDomainState } from '@2davi/rest-domain-state-manager/adapters/react';\n\nfunction UserProfile({ userState }) {\n    const data = useDomainState(userState);\n\n    return (\n        <div>\n            <input\n                value={data.name}\n                onChange={e => { userState.data.name = e.target.value; }}\n            />\n            <button onClick={() => userState.save('/api/users/1')}>\n                저장\n            </button>\n        </div>\n    );\n}\n```\n\n혹은,\n\n```javascript\nimport { ApiHandler, DomainState } from '@2davi/rest-domain-state-manager';\nimport { useDomainState } from '@2davi/rest-domain-state-manager/adapters/react';\n\nconst api = new ApiHandler({ host: 'localhost:8080' });\n\nfunction UserProfile({ userId }) {\n    const [state, setUserState] = useState(null);\n\n    useEffect(() => {\n        api.get(`/api/users/${userId}`).then(setUserState);\n    }, [userId]);\n\n    const data = useDomainState(state); // Shadow State — 변경 시 자동 리렌더링\n\n    if (!data) return <div>로딩 중...</div>;\n\n    return (\n        <form>\n            <input\n                value={data.name}\n                onChange={e => { state.data.name = e.target.value; }}\n            />\n            <button onClick={() => state.save(`/api/users/${userId}`)}>\n                저장 (PATCH 자동 분기)\n            </button>\n        </form>\n    );\n}\n```\n\n`userState.data.name = '...'`로 Proxy를 변이하면:\n\n1. Microtask 배칭 완료 → Structural Sharing 기반 불변 스냅샷 재빌드\n2. 변경된 키만 새 참조, 나머지 키는 이전 참조 재사용\n3. React가 `getSnapshot()` 재호출 → `Object.is()` 비교 → 리렌더링\n\n변경이 없으면 동일 참조를 반환하여 **무한 리렌더링 루프가 발생하지 않습니다.**\n저장 실패 시 모든 상태가 `save()` 이전으로 자동 복원됩니다. `useState`로 에러 상태를 따로 관리할 필요가 없습니다.\n\n---\n\n## 병렬 fetch + 후처리 — DomainPipeline\n\n여러 API를 병렬로 요청하고, 응답 순서와 무관하게 후처리를 체이닝합니다.\n\n```javascript\nconst result = await DomainState.all({\n    roles: api.get('/api/roles'),\n    user:  api.get('/api/users/1'),\n}, { strict: false })\n.after('roles', async roles => {\n    // roles 응답으로 셀렉트박스 옵션 채우기\n})\n.after('user', async user => {\n    // user 응답으로 폼 데이터 채우기\n})\n.run();\n\n// 개별 실패는 result._errors에 기록 (strict: false)\nif (result._errors?.length) console.warn(result._errors);\n```\n\n---\n\n## Idempotency-Key — 네트워크 재시도 안전\n\n[IETF Idempotency-Key 표준 초안](https://datatracker.ietf.org/doc/draft-ietf-httpapi-idempotency-key-header/)에 기반합니다.\n\n```javascript\nconst api = new ApiHandler({ host: 'api.example.com', idempotent: true });\n\ntry {\n    await user.save('/api/users/1');\n} catch {\n    // 네트워크 타임아웃 후 재시도 — 동일 UUID가 자동 재사용됨\n    await user.save('/api/users/1');\n    // 서버는 동일 Idempotency-Key를 감지하여 중복 처리 방지\n}\n```\n\n`save()` 성공 시 UUID 즉시 초기화. 실패 시 유지되어 재시도 안전.\n\n---\n\n## CSRF 보안\n\n[OWASP CSRF Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html) 준수.\n`POST`, `PUT`, `PATCH`, `DELETE` 요청에만 `X-CSRF-Token` 헤더를 삽입합니다.\n\n```javascript\nconst api = new ApiHandler({ host: 'localhost:8080' });\n\n// DOM이 준비된 시점에 1회 호출\napi.init();\n// → <meta name=\"csrf-token\" content=\"...\"> 파싱\n// → 이후 모든 뮤테이션 요청에 X-CSRF-Token 헤더 자동 주입\n\n// 또는 쿠키에서 파싱\napi.init({ csrfCookieName: 'XSRF-TOKEN' });\n```\n\n`init()` 미호출 시 CSRF 기능은 비활성 상태이며, 뮤테이션 요청에 토큰이 삽입되지 않습니다.\n\n---\n\n## Lazy Tracking Mode — 최소 페이로드\n\n```javascript\nconst user = await api.get('/api/users/1', { trackingMode: 'lazy' });\n\nuser.data.name = 'A';\nuser.data.name = 'B';\nuser.data.name = 'C';  // 같은 필드를 3번 변경\n\nawait user.save('/api/users/1');\n// realtime 모드: PATCH에 3개 항목 (A, B, C 각각 기록)\n// lazy 모드:    PATCH에 1개 항목 (최종 결과 C만 전송)\n```\n\n`lazy` 모드에서는 Proxy `set` 트랩이 changeLog 기록을 건너뛰고,\n`save()` 호출 시 초기 스냅샷과 현재 상태를 LCS 알고리즘으로 deep diff하여\n**최종 변경 결과만** PATCH 페이로드에 포함합니다.\n\ndiff 연산은 브라우저 환경에서 Web Worker로 오프로딩되어 메인 스레드를 차단하지 않습니다.\n\n---\n\n## 디버거 — 멀티탭 실시간 상태 시각화\n\n```javascript\nconst api = new ApiHandler({ host: 'localhost:8080', debug: true });\nconst user = await api.get('/api/users/1');\n\nuser.openDebugger();  // 디버그 팝업 열기\n```\n\n`BroadcastChannel` 기반으로 동일 출처의 모든 탭에서 `DomainState`의 상태를 실시간으로 확인할 수 있습니다.\n탭이 닫히거나 응답이 없으면 Heartbeat GC가 자동으로 정리합니다.\n\n---\n\n## 주요 기능 요약\n\n| 기능                | 설명                                                                  |\n| ------------------- | --------------------------------------------------------------------- |\n| Proxy 자동 추적     | `set`, `delete`, 배열 변이(`push`, `splice`, `sort` 등) 전체 인터셉트 |\n| RFC 6902 JSON Patch | changeLog를 표준 JSON Patch 배열로 직렬화                             |\n| HTTP 메서드 분기    | `isNew` + `dirtyRatio` 기반 POST / PATCH / PUT 자동 결정              |\n| 보상 트랜잭션       | `structuredClone` 기반 4종 상태 원자적 롤백                           |\n| DomainCollection    | 1:N 배열 상태 + `saveAll({ strategy: 'batch' })`                      |\n| UIComposer          | HTML `<template>` 기반 그리드/폼 바인딩 + 컨트롤 함수 반환            |\n| React 어댑터        | `useSyncExternalStore` 기반 `useDomainState()` 훅                     |\n| Idempotency-Key     | IETF Draft 기반 UUID 자동 발급/재사용                                 |\n| CSRF 인터셉터       | 3-상태 설계. `<meta>` + 쿠키 파싱                                     |\n| Lazy Tracking       | LCS deep diff + Worker 오프로딩. 최종 변경만 전송                     |\n| Microtask 배칭      | `queueMicrotask` 스케줄러. 동기 블록 내 다중 변경 → 단일 flush        |\n| V8 최적화           | WeakMap Lazy Proxying + Reflect API + DomainVO Shape 고정             |\n| 플러그인 시스템     | `DomainState.use(plugin)` — 선택적 DOM 의존 기능 분리                 |\n| 멀티탭 디버거       | BroadcastChannel + Heartbeat GC + Worker 직렬화                       |\n| DomainPipeline      | 병렬 fetch + 순차 after() 체이닝 + 보상 트랜잭션 연계                 |\n| Zero Dependency     | 런타임 의존성 0. `sideEffects: false` Tree-shaking 허용               |\n\n---\n\n## API 구성\n\n```javascript\nimport {\n    ApiHandler,         // HTTP 전송 레이어 (인스턴스 생성은 소비자가 담당)\n    DomainState,        // 팩토리 3종 + save/remove + Shadow State + 플러그인\n    DomainVO,           // 선택적 — 신규 INSERT 스키마 선언 시\n    DomainCollection,   // 1:N 배열 상태 컨테이너 + saveAll\n    DomainPipeline,     // 병렬 fetch + 순차 after() 체이닝\n    UIComposer,         // HTML <template> 기반 그리드/폼 바인딩 플러그인\n    UILayout,           // 화면별 UI 계약 선언 베이스 클래스\n    closeDebugChannel,  // 디버그 채널 명시적 종료 (SPA 전환 시)\n} from '@2davi/rest-domain-state-manager';\n\n// React 어댑터 (별도 서브패스)\nimport { useDomainState } from '@2davi/rest-domain-state-manager/adapters/react';\n```\n\n---\n\n## 문서\n\n전체 가이드, 아키텍처 심층 분석, 인터랙티브 플레이그라운드:\n**[lab.the2davi.dev/rest-domain-state-manager](https://lab.the2davi.dev/rest-domain-state-manager)**\n\n| 카테고리          | 페이지                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Quick Start**   | [SI 빠른 시작](https://lab.the2davi.dev/rest-domain-state-manager/guide/si-quickstart) · [모던 빠른 시작](https://lab.the2davi.dev/rest-domain-state-manager/guide/modern-quickstart)                                                                                                                                                                                                                                                                                         |\n| **Guide**         | [DomainCollection](https://lab.the2davi.dev/rest-domain-state-manager/guide/domain-collection) · [UIComposer & UILayout](https://lab.the2davi.dev/rest-domain-state-manager/guide/ui-composer) · [Tracking Modes](https://lab.the2davi.dev/rest-domain-state-manager/guide/tracking-modes) · [Idempotency](https://lab.the2davi.dev/rest-domain-state-manager/guide/idempotency) · [save() 분기 전략](https://lab.the2davi.dev/rest-domain-state-manager/guide/save-strategy) |\n| **Architecture**  | [Proxy 엔진](https://lab.the2davi.dev/rest-domain-state-manager/architecture/proxy-engine) · [HTTP 라우팅](https://lab.the2davi.dev/rest-domain-state-manager/architecture/http-routing) · [V8 최적화](https://lab.the2davi.dev/rest-domain-state-manager/architecture/v8-optimization)                                                                                                                                                                                       |\n| **Playground**    | [인터랙티브 데모 11종](https://lab.the2davi.dev/rest-domain-state-manager/playground/)                                                                                                                                                                                                                                                                                                                                                                                        |\n| **API Reference** | [TypeDoc 자동 생성](https://lab.the2davi.dev/rest-domain-state-manager/api/rest-domain-state-manager)                                                                                                                                                                                                                                                                                                                                                                         |\n| **Decision Log**  | [ARD 4편 + IMPL 5편](https://lab.the2davi.dev/rest-domain-state-manager/decision-log/)                                                                                                                                                                                                                                                                                                                                                                                        |\n\n---\n\n## License\n\nISC © 2026 [2davi](https://github.com/2davi)\n","readmeFilename":"README.md"}