{"_id":"@state-street/state-street","_rev":"42-c53b4ea9097374aaed1c3d72e5bfc0f0","name":"@state-street/state-street","dist-tags":{"latest":"3.0.0"},"versions":{"0.0.1":{"name":"@state-street/state-street","version":"0.0.1","author":"","license":"ISC","_id":"@state-street/state-street@0.0.1","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"20f25b356b7d9112bfc8d5a7680399a1feb14d93","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.0.1.tgz","fileCount":2859,"integrity":"sha512-gGC3TVuK4i5mkAexeQX8yTqI+QmoRIerm5Tp7MPPKr3De1pmxqe1lmBVg5PpdDVln4cEXjoR7ZJKODtzhx94yA==","signatures":[{"sig":"MEQCIEiPcHqzcfT6DmCBGiqlg7kXyCnJ+yCmizCVeYye9UTJAiBRVeBrho/+Lovu9KI+oaW3lhoqc+HqjyltT8TcHAUQSA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":16566823},"main":"build/index.js","type":"module","gitHead":"98fca6b7923ef4d10676cba62544dba6504c996e","scripts":{"build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.3","description":"light weight single page framework","directories":{},"_nodeVersion":"18.19.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.7"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.0.1_1709158977190_0.25797208646339587","host":"s3://npm-registry-packages"}},"0.0.2":{"name":"@state-street/state-street","version":"0.0.2","author":"","license":"ISC","_id":"@state-street/state-street@0.0.2","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"91511703baad7aa293a49085230d2787be72ca86","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.0.2.tgz","fileCount":2859,"integrity":"sha512-CvMebmedaVtOQ97MIQzWIMpDQqPKPBmms5SNtan4pCX17Q+dvrAmLXBjF26cliTjB8ImVrTE6TwptgrPc9j3vQ==","signatures":[{"sig":"MEUCIEV9QEBteAnIJCTIgRVs3BMEeiBqBgyBNud8doXyS4g4AiEA5dD/64lcnXAyBlaUS0K8rhuHu9UyCVJ4mqn98LaIU0s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":16566886},"main":"build/index.js","type":"module","gitHead":"d2e48b3d26bac0f72573f9fca8ab474b180938a4","scripts":{"build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.3","description":"light weight single page framework","directories":{},"_nodeVersion":"18.19.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.7"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.0.2_1709159248233_0.21937675523241817","host":"s3://npm-registry-packages"}},"0.0.4":{"name":"@state-street/state-street","version":"0.0.4","author":"","license":"ISC","_id":"@state-street/state-street@0.0.4","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"55ab9e5dd66e11ccabd8bd80c4a0c1b47ca835b6","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.0.4.tgz","fileCount":5703,"integrity":"sha512-oGu4AFwAF4I1txOl84UHy+P92ckWXYWReFfFnn674Pw3xFbWjyMkM1oA48gQ3so+vwrBNYf9DPcq2X7JNSb04Q==","signatures":[{"sig":"MEYCIQCphiDsJmZcXnicm2HvUTVMUCpxCjBX342j63lCAcpm+gIhAJkHdX31+fB24ZkRr+1thn/XRtyWli3qU7wy4xQx5WOh","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33105752},"main":"build/index.js","type":"module","gitHead":"9b6cb010e5f548da740460ab29ff54e063a47035","scripts":{"build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.3","description":"light weight single page framework","directories":{},"_nodeVersion":"18.19.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3","@types/node":"^20.10.7"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.0.4_1709165176908_0.3857323300175617","host":"s3://npm-registry-packages"}},"0.0.5":{"name":"@state-street/state-street","version":"0.0.5","author":"","license":"ISC","_id":"@state-street/state-street@0.0.5","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"f2dd4ea3576c62b15e4088e7604e36a2df1fd3db","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.0.5.tgz","fileCount":20,"integrity":"sha512-s9dzT2nyETx8V+WeUjniGsKTzNf/Z4/hy6K9X7wBvcgQhCKv5zCPKUIowxrL6VQoTdPkxyDYY6mOZUUMlL8idA==","signatures":[{"sig":"MEQCIHKPn0x/DEvOqG+QIa9rZR63P7/mAGRQyC3++oOUofs1AiB2WeROpy304keXPid9d4kmVeg4vyw8kWJMrQc2g9JOlQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":170856},"main":"build/index.js","gitHead":"6c086625a8390d4102208e599c35725baa2612d9","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.0.5_1709191899924_0.635383279902284","host":"s3://npm-registry-packages"}},"0.0.6":{"name":"@state-street/state-street","version":"0.0.6","author":"","license":"ISC","_id":"@state-street/state-street@0.0.6","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"38607ae56c334ccafe19456badc5f1128377d7f0","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.0.6.tgz","fileCount":20,"integrity":"sha512-wlBEog0aFDk5DLA1o5ufuggqAzpqG5psgWkx47Ugozu8HKU3yTU/vDqNgJkPnlC/VrNUxxT3aVYnhgKrJ+hFLQ==","signatures":[{"sig":"MEUCIBjK8p7nl/tIwj8uc95IFO+wAYyvnqeiOQVP1nNJ06OLAiEA+6u9yO1wpxN86HBuuHH1sT3JM38OJp3YIFsSOGjbcl4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":170989},"main":"build/index.js","gitHead":"a5067a2e1b1c869ea61e2508e0ef1e3f58699822","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.0.6_1709234725080_0.5114483833857566","host":"s3://npm-registry-packages"}},"0.0.7":{"name":"@state-street/state-street","version":"0.0.7","author":"","license":"ISC","_id":"@state-street/state-street@0.0.7","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"12930b9e378f1303b5b7b5a7b15f0d65f39ea680","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.0.7.tgz","fileCount":34,"integrity":"sha512-kzippLxzX/vQpnZktHw62EJGUV7LsXVvwnLhir9DX/SgBuvZLiKYrXw6WP45RBDI+zD+0B0U5HnoM12Nn9nSsQ==","signatures":[{"sig":"MEQCID5nwdB42KUHIuu1R7KO6BY5vkxG/TGg7t6Q0bPiFZVjAiAtyk9QAI02Ai11c3ZsN2iw98fV4xytye/Fmv1qyiwxiw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":196563},"main":"build/index.js","gitHead":"468650d212eb514fb6df55e301ac969e7371501f","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.0.7_1709248235465_0.17530305169676086","host":"s3://npm-registry-packages"}},"0.0.8":{"name":"@state-street/state-street","version":"0.0.8","author":"","license":"ISC","_id":"@state-street/state-street@0.0.8","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"3354a050eb9a51fdf1110f1074db107abefb832e","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.0.8.tgz","fileCount":34,"integrity":"sha512-GQo8F5521roy7i1hkq8yF+ZeecVim7NbtkO0EUOeIhOeRcr5WGefmWKQ4KCCGcMhryOMjf6QC6b+EYcyDXEUQA==","signatures":[{"sig":"MEUCIDq10c5wz2bmY4R6UUhsWLG2aIQsI9ZlDa8tlUV2yoKeAiEA68PDpZa+b/POpT+pN1w8UbjUwRGal8jBMDWwFmFnJ6M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":196577},"main":"build/index.js","gitHead":"276ef81463b9cfd31a1cbfa01408e8b4f064f32f","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.0.8_1709251955959_0.26733775922896963","host":"s3://npm-registry-packages"}},"0.1.0":{"name":"@state-street/state-street","version":"0.1.0","author":"","license":"ISC","_id":"@state-street/state-street@0.1.0","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"9c89481635533d4e9d138f2cc171215bf97b49be","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.1.0.tgz","fileCount":34,"integrity":"sha512-sA7kdzMIg6hxz0+JGA63zzTc3+/8PzCvHd3hFVLhyYePgv+xtIBDt3RjknHihHfIHP/DGYdLecuU5cak1hWWLA==","signatures":[{"sig":"MEQCICCoKxwwaWWzPYtS8dxOasQ457xi/KJnANASuIQWxgm2AiAdXZegBYKXo1o6r7GjMyMrF4o9RYCcH1b7PU/2cgegIQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":196170},"main":"build/index.js","gitHead":"1e56fba3bd2fdd70d8b2b5c97700b799404071f3","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.1.0_1709947722770_0.061335727087582725","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"@state-street/state-street","version":"0.1.1","author":"","license":"ISC","_id":"@state-street/state-street@0.1.1","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"3780426f090d4967685595ba3e50c2114764864f","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.1.1.tgz","fileCount":34,"integrity":"sha512-ktJMJnLgATr12HY+Z0W+NXgTxItSyutSGok0NWOk6vdO/xbLzxI8wEvLiENEZla/VMJIMNU3ZZWSX4fAh93+pw==","signatures":[{"sig":"MEUCIQDI+nSzZXj4fQS5OWjkkrs09bMa/LbM+qn8fpRSZkonfgIgWzZS0EWl/Oqs2vDxu2x1LQ7Pay32++yKAWOWHRpKvks=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":196161},"main":"build/index.js","gitHead":"bb14176f5770812558ae5e3993bfeb0f8e4abdb8","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.1.1_1709948167605_0.05149292545041373","host":"s3://npm-registry-packages"}},"0.1.2":{"name":"@state-street/state-street","version":"0.1.2","author":"","license":"ISC","_id":"@state-street/state-street@0.1.2","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"eed7119462528fca0ed9efdcb8e25dcfbc8af774","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.1.2.tgz","fileCount":34,"integrity":"sha512-6GyTORGB0XZ/I7fFEiCPcikcrC97+FsW2dy0DJx/BRpjMhWfHn/OBHAJYrNVIZ3UD1hTsRBjanHSAi6THJIHaw==","signatures":[{"sig":"MEUCICnVFlwTzGytieYfApTTd30x6XlZr+mYNs9np0I+81WJAiEAitthgcnduE+ImcnB9SAWtrHbO80ip29cJdO3o9Hs57o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":196978},"main":"build/index.js","gitHead":"433890d899ffcdb364e76a1efaed50683a5f9638","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.1.2_1709967998900_0.9339275527418098","host":"s3://npm-registry-packages"}},"0.1.3":{"name":"@state-street/state-street","version":"0.1.3","author":"","license":"ISC","_id":"@state-street/state-street@0.1.3","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"3d67fa0e9484224d0f154f259ad32bdf0332cfee","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.1.3.tgz","fileCount":34,"integrity":"sha512-fvyEmOf48MujPX7tUdIH8hf4V+ikMbQYh2L/sZbL/QonF1T5TYYjhiLyPyPDVGOBMa3dtr+AJPVvOvpUkxdCdQ==","signatures":[{"sig":"MEUCIAT9PiH+DckIfJmVB+JP6dUAEo14qfbRhAB7DNsQkXTYAiEArYejnSZ8jqgRllH59pPqLQ0Jdb5KKtYIBWHySf9Df40=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":199083},"main":"build/index.js","gitHead":"18aff27676546636cd3123bd74637563c6a9e227","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.1.3_1710119244501_0.6871766673836264","host":"s3://npm-registry-packages"}},"0.1.4":{"name":"@state-street/state-street","version":"0.1.4","author":"","license":"ISC","_id":"@state-street/state-street@0.1.4","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"044d963321c0f48ac1726ec83822b8ea771ecbb7","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.1.4.tgz","fileCount":34,"integrity":"sha512-3jkCjS+1cmNTrmLL6ndzsEf25dw9UWBLkcKJDZSlB2v2A7ueGa8yDOVKnAcuCKbOsX3i0VL2HiHlXOaZqTsoMg==","signatures":[{"sig":"MEQCIFCJFOGbhERqozvVOHKzQa5PWE/YVnF/SPQTH1yKmJakAiBYarJHMVzaFSGLOI0ID9NI5omOymUr0wtBvi+susbzRw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":199204},"main":"build/index.js","gitHead":"b3bea970343d71c1eedf3afef0bdb8dccc8a774e","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.1.4_1710220495876_0.7621715771158064","host":"s3://npm-registry-packages"}},"0.2.0":{"name":"@state-street/state-street","version":"0.2.0","author":"","license":"ISC","_id":"@state-street/state-street@0.2.0","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"ac84048790ce35315d352d15a033a71ef390e6fc","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.2.0.tgz","fileCount":34,"integrity":"sha512-kSkjiYmbTJ02qjQ4//e8/NS/6twKglEAMJKWhnPqrSEoxo8YF0qOBP440HB9wDczQTjF3v8rRqVmIMK18Kw8Ng==","signatures":[{"sig":"MEUCIQCIEHGMMuebPe1kwurrkOYkaxmuhP2OMR+kIMeFeWCBygIgLWOx5QE0RzlnQy33ybTCo7a+QlZcRPpQyhpxtoBcKU8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":201683},"main":"build/index.js","gitHead":"fe7792e34d26e6a31cf45f17cfaccf41313c3114","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.2.0_1710223080022_0.1602916861879018","host":"s3://npm-registry-packages"}},"0.2.1":{"name":"@state-street/state-street","version":"0.2.1","author":"","license":"ISC","_id":"@state-street/state-street@0.2.1","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"d00eec9e9798a5dc89b5bd3dd4dece3c85b748a4","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.2.1.tgz","fileCount":34,"integrity":"sha512-CVbcXN8ZkxqgSG6EJWK1S/CBOEU5Jmchhn9zL19NmU3Bz5+jEIRxKiwgMC/bwBZKB5ii+8MGAulocMBqQHYSvg==","signatures":[{"sig":"MEQCICC+mAD3zjDsYmbkYzd+DgI8HsXQZPll634Cpk++MwklAiAo3IYAGkccsGhRoYMfPCPgcmwn06Fw4MJdXB8mKm0Wow==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":201357},"main":"build/index.js","gitHead":"926969b94a3fcf7e9dd91b4357feeacc9edeb5b1","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.2.1_1710363540227_0.6383689777731769","host":"s3://npm-registry-packages"}},"0.2.2":{"name":"@state-street/state-street","version":"0.2.2","author":"","license":"ISC","_id":"@state-street/state-street@0.2.2","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"a379833a19abfcfc404480d27505b247b3230128","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.2.2.tgz","fileCount":34,"integrity":"sha512-ik99+j6ZxSA+OUPae4IaRTqagQoen1JNaGF8wJSZhe0NOOj0hpxoswJJJEY+DylXEh8Rz00Ni4nH8G2SoxjDDQ==","signatures":[{"sig":"MEUCIG6AkSyNU19z9PvQnzteNbPzB6P04AxYB2Bo6bOdmYO7AiEA9gQp1QOPdpsp8uGCpXbOZ89nimgJjSBH1iCCsk20ldg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":201809},"main":"build/index.js","gitHead":"83a395d9ced934839be52ed14e16a2bbd9ef4e03","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.2.2_1710482086858_0.22818284337395012","host":"s3://npm-registry-packages"}},"0.2.3":{"name":"@state-street/state-street","version":"0.2.3","author":"","license":"ISC","_id":"@state-street/state-street@0.2.3","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"ba9b67ed06fe713fd0d09f2fc2bc3274b51c1b9d","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.2.3.tgz","fileCount":34,"integrity":"sha512-DvTxvJDhNHew9LYWLkFEpctZnbYwpT1J+WlYFUbBZgYZmUmCIlFMdT4yb6ukWLFqV7ItfNHPwNNhwvhe6d5L6w==","signatures":[{"sig":"MEQCIH0imDtGIKDWyc/MfiVArY4fel2ep//sjFBzey43QuwfAiABHI6QcjIJ2M5mGwNH2uy4u6w82l5hiLac4EIfVceHgA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":202091},"main":"build/index.js","gitHead":"5293d4b943fe14ee5d177acf432f8d5c94e8f2c1","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.2.3_1710489513266_0.6397366291803537","host":"s3://npm-registry-packages"}},"0.2.4":{"name":"@state-street/state-street","version":"0.2.4","author":"","license":"ISC","_id":"@state-street/state-street@0.2.4","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"1602d6e12f9c582e51eb9af227acc7e1a5d72840","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-0.2.4.tgz","fileCount":34,"integrity":"sha512-d4nozz4g85157QoPOWyXcR2PGOCe3cW8lasqyxfWkEgDXYKwJVp6bEIWbigzS62OVTw8Ba+94grlXJL2i1zLNA==","signatures":[{"sig":"MEUCIQCdKvzHQhAPh3/4Yt5akKtXqwyKuW6YaylJBwoRFJEIogIgHEa/LsRI2ON5cmaKE/ah7xSYsBB2sEvyTDGejHjhLYY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":202105},"main":"build/index.js","gitHead":"b48e31fadf8715bbee235272ac5ac34783648583","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_0.2.4_1710628455222_0.6705862168889334","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@state-street/state-street","version":"1.0.0","author":"","license":"ISC","_id":"@state-street/state-street@1.0.0","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"e4071ea14f31e905ccb4464abbaf07cd3e028300","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.0.0.tgz","fileCount":34,"integrity":"sha512-zK67bw7Mej89U66VEXXj9x5sApGYyQIweoV6Z20/HwgLy0zCTR9Erb/XZsp4wvxE+kyVZemhFOsVpQiWZoWrUw==","signatures":[{"sig":"MEYCIQCOeKoYI25A9Jw9fFSjFRrf9SYkrAPIAOnygGoyq2YQlQIhAIN09QP25j23a0/ozclMGOEvNOuYhy8yEjhRmxjL40Fw","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":203639},"main":"build/index.js","gitHead":"ccf131c1b48c6f38b4bfcafd8f444024d6cbb89b","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.0.0_1710830179452_0.2506134206866242","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@state-street/state-street","version":"1.0.1","author":"","license":"ISC","_id":"@state-street/state-street@1.0.1","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"7bbbad8d0911d507cac14300266a8060109c19e1","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.0.1.tgz","fileCount":34,"integrity":"sha512-9aBMGqfhMomA1g3Gf7cRCrKCeOWZp3yAKTTx2ehxidYjVTZQcXaXANE4DxinpvAog2U0w0WlCQzRLJCqx2uMhQ==","signatures":[{"sig":"MEUCIDnrldX/CcbcMqUKo6PIZAY+XVpSLB93lZ//Il0K7gfCAiEAw3JYflx5xJkc8RM6Gll971mtXbBpjMfXv2L8hMs7a8w=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":205780},"main":"build/index.js","gitHead":"c1859fa81243f5367b47c3502ab35b32bb3077bc","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.2","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.0.1_1710880617743_0.9334768225645849","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"@state-street/state-street","version":"1.0.2","author":"","license":"ISC","_id":"@state-street/state-street@1.0.2","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"85853a091f644e9effad64e8bb7dff874dcebbc4","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.0.2.tgz","fileCount":34,"integrity":"sha512-HQ0Pi3Lu5iRw4Lok93HcyNBZiSCs0muweCtupaX56pT0NnyUJLQJZrtLTI3b/CglgIxKUid/M+ufw8nNG4wFEQ==","signatures":[{"sig":"MEYCIQDXN6mWwOj6Qo8J2JG8w/ctfa8B0XyHdmtIOn2GdOxmbAIhAOOwF4Bse3TCCDgsq5rUssW5pX+QOWkQacVuOkyl5xxS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":206520},"main":"build/index.js","gitHead":"0b05f3e012bd9f96654afe495ad0a1de258b2be0","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.0.2_1711165375931_0.2146413163442955","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"@state-street/state-street","version":"1.0.3","author":"","license":"ISC","_id":"@state-street/state-street@1.0.3","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"a0c89233f82b1731deb49b4e19f9768b6b96b307","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.0.3.tgz","fileCount":34,"integrity":"sha512-99uy+Fj0rNYFtoRX7ZHPeUQd7p48IUVfquC+anZ34zX6uMVhh4P6ILnlkaxwJCh94bOrm4A9hBN9ELPhb9Ad0A==","signatures":[{"sig":"MEUCIFmoRB1hkr1ySL2zUmk6meKnGfthoJdVI1JvEWxfdjWjAiEAkKj+Z/LXP9XFzs6hQJj4sAviyvAEY14DJQbbr+aX3iM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":206569},"main":"build/index.js","gitHead":"1a416ceeef37da5e1c881dd849b3bb1869bf8672","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.2.4","description":"light weight single page framework","directories":{},"_nodeVersion":"20.11.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.0.3_1711227395842_0.11565171328071422","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"@state-street/state-street","version":"1.0.4","author":"","license":"ISC","_id":"@state-street/state-street@1.0.4","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"1dc6d3336486793d9dacef8b9948d19a253ae9f9","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.0.4.tgz","fileCount":34,"integrity":"sha512-SVh1eNJQb4DzDB3UNlDyviosl+eC7ZNHU1+b6lTmCQ7cqwWhYCD81xzkcFxJj7BgqCWp/HEKA2GHddlxU9i+iQ==","signatures":[{"sig":"MEQCIGdYhLBVDlVF+WWnyhCXSExTKHos/6Dl3rrGLsSqa9q3AiAaVRE5mCkmabMRMaJHWsz8mjVCyg3vIPUWxMOplyfFVA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":206575},"main":"build/index.js","gitHead":"3cf311106b2ea5705fa9001b3ef6208c984c2816","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.5.0","description":"light weight single page framework","directories":{},"_nodeVersion":"20.12.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.0.4_1711580849531_0.286370104793249","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@state-street/state-street","version":"1.1.0","author":"","license":"ISC","_id":"@state-street/state-street@1.1.0","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"56b0833f1692a732f8fc59ca5966ab9ad479c5da","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.0.tgz","fileCount":34,"integrity":"sha512-LoAMZKEaFk3j1z4ghAMVEtP7L45+gzns4P1eMH9o7t24fx73zt2LQHVpsRbkB8AUsmyJ9JWs2MyIONI0jKE2kQ==","signatures":[{"sig":"MEUCIQC4wEhsUPkKTkLm1HMEH62x3s/vDAw2uvpEcuCRY1dRWgIgP+Xeb0yAl3XBzYz9Q2D/Yz+pgdDR7wF3QcbvaQ3+fNE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":206795},"main":"build/index.js","gitHead":"bad6cc7f643cd99a7bbd06cea41cfa6897d0aea5","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.5.0","description":"light weight single page framework","directories":{},"_nodeVersion":"20.12.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.4.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.0_1711857037033_0.05308094056858881","host":"s3://npm-registry-packages"}},"1.1.2":{"name":"@state-street/state-street","version":"1.1.2","author":"","license":"ISC","_id":"@state-street/state-street@1.1.2","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"5253f33cb653d2fbc4c0b9e665786329f2c07bd0","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.2.tgz","fileCount":34,"integrity":"sha512-VjWaGEoUeZ15TMuTECQhdIDFEXNX5r8BfVIvUTSvVYN0swfaCWwAT4pbgplz4yyfUo2EFHEo55xFuidNgQ7WvQ==","signatures":[{"sig":"MEUCIQC1gxrGGdLJY/90jALXygLKDMo5PTP/NwPOG/KMrSbbVwIgOGk2NaCH5LVoSw6eYYtSgY588+FPPUs00c6/COBV7vs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":206712},"main":"build/index.js","gitHead":"c921b01715611039efdc8c6a731e874145ad067e","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"10.9.2","description":"light weight single page framework","directories":{},"_nodeVersion":"22.17.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.8.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.2_1752555944340_0.004640728445839182","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@state-street/state-street","version":"1.1.4","author":"","license":"ISC","_id":"@state-street/state-street@1.1.4","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"707204385997f3361e71214fc6a184c22a5d7147","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.4.tgz","fileCount":48,"integrity":"sha512-sLgIurjDYIPe4Cmp/vqDinDnUcoQRRbfCvZOPuZBiSLrcQw4G9n3o2wD+29YG4KivZYvvK2sw4o9oBZpdReytA==","signatures":[{"sig":"MEUCIA8JoR6kQDLXS8HBoWoct5Jaui2rdxQD4SWfSKisRIxTAiEAnLMhtkkMGFDYDwNrnekuX14wHZVtgv6EyPT686tFHjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9164566},"main":"build/index.js","gitHead":"b16507be7591dde9bdbd2e6c28727a4e7702b54a","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.12.1","description":"light weight single page framework","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.4_1778884440818_0.23092593701953357","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@state-street/state-street","version":"1.1.5","author":"","license":"ISC","_id":"@state-street/state-street@1.1.5","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"50a288a450d8aaaba74a800c9410717af391f1b1","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.5.tgz","fileCount":48,"integrity":"sha512-h1Daw9TaYmg7rAv7ww7AB0af1A+wbOMU8Nr04Ofugv85+Qb3RMP5Pu2LmeZmojm0v08Hwfyzgd09o1kZhwBqCA==","signatures":[{"sig":"MEQCIHZ3V33h3Ie7C9uSirNfF6sz3EV904S8x1/qaEeE1jKbAiBErq9oJtA/3yBqa/RsAGiptZX/75STZOGnpS4S9xKVYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9164598},"main":"build/index.js","gitHead":"e1e14a03a14ed6f5109ee78c8c39a5aca4370d88","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.12.1","description":"light weight single page framework","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.5_1778903552826_0.38734265194516593","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@state-street/state-street","version":"1.1.6","author":"","license":"ISC","_id":"@state-street/state-street@1.1.6","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"614c1cd63a1e6134b69395d1b5e64d0b3bd41179","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.6.tgz","fileCount":48,"integrity":"sha512-ARM9s6PUogkq3o64LLveQUdis1uGiQxthacic8jwwAJdpZ/ba6Ih8BhI3dOZiNMyNvu95woH4mtQ4kSRq7HelQ==","signatures":[{"sig":"MEYCIQDA7/rjQynsOV12lrHYgPJVB89sOEHA79m32GtaXjwkWgIhANPAq8cqcyUoduTLCep4s2o+aUahQ6fvOorUbcNob8jp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9163576},"main":"build/index.js","gitHead":"3d564f1002e3d4b9a14c50aed0189c3cca8ea1bf","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.12.1","description":"light weight single page framework","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.6_1778952817552_0.29018037455606316","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@state-street/state-street","version":"1.1.7","author":"","license":"ISC","_id":"@state-street/state-street@1.1.7","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"db580d90084f70c95cd741736a8d3bb8effe7b2a","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.7.tgz","fileCount":48,"integrity":"sha512-mnhpbHHvIjaon+MYdFoHGuhncirRPalh7zEvAaudAsGOA5xU97oaNkKE4kbVveeKB1tNGSwt+svrd0gk/UYNfA==","signatures":[{"sig":"MEYCIQCc6SQ8q07AFldki9GbhahKhIvdHmYcfwspOKqdyDNN8QIhAI8RVjM7LF7CRjbTv0ZNdHoE4bftMuRauKzKXlaULzuE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9164169},"main":"build/index.js","gitHead":"8d3f5c921b4a6851c97ea54b32c1802690891c3f","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.12.1","description":"light weight single page framework","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.7_1778982234247_0.6449664461358364","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"@state-street/state-street","version":"1.1.8","author":"","license":"ISC","_id":"@state-street/state-street@1.1.8","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"6ac3f25c2e30877005faf1399a6e03bd5fa521bf","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.8.tgz","fileCount":48,"integrity":"sha512-RMptuwY2fsYGJZGCNbvJVkvFAkKN6SMrHCToD14Wjf8chmNh2j7TvmJWwVSiXmrKwBU1rX/HgvafuE71BAJ7JQ==","signatures":[{"sig":"MEYCIQD/Jd/Fo5T3UqEQ5wzfdKJAYRJ+3HxpXIBHDAdPNAO24AIhAP6GJ0p9vptXldV+Dwf7ILbLf1TG7JmkgofjVFi65Xv1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9168718},"main":"build/index.js","gitHead":"b1d1c578b83891e1324607c3397ac0d26ff9b311","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.12.1","description":"light weight single page framework","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.8_1779039359289_0.3363720425788359","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"@state-street/state-street","version":"1.1.9","author":"","license":"ISC","_id":"@state-street/state-street@1.1.9","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"b3b05b8a456484fcde4426a570d95d7222c65863","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.9.tgz","fileCount":48,"integrity":"sha512-WEuv1btb+lqGsa+4x6+Hhr/phJeUpdtTTIHLnE0UcoKsqNrRzQaeO/n4W+iAoN94GzM1Nxe6AjZgdNsfMQv8aw==","signatures":[{"sig":"MEYCIQDsB2vzhjOmyX0ZANBJEi/flAuzyolqkAdwkzKMl/bpBwIhAPUjvLVkASQi8baRwOv2BjNsYDLMdCtQzyr1bP8n+wUv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9174133},"main":"build/index.js","gitHead":"8c5a6813145b249277d4d4eaa3c1d3cb0b0a8203","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.12.1","description":"light weight single page framework","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.9_1779126371214_0.7333276498384891","host":"s3://npm-registry-packages-npm-production"}},"1.1.12":{"name":"@state-street/state-street","version":"1.1.12","author":"","license":"ISC","_id":"@state-street/state-street@1.1.12","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"d751836e3e5d16cf519e09527a9579effb86295a","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.12.tgz","fileCount":48,"integrity":"sha512-rV36TbZ56jwqRsZ3kOIRIs+sUtO8CcMtQl4untFMlNjzBzKYMzFTpp/uq9TBWUx0QuEfWkqvDorp2QBZToLQOw==","signatures":[{"sig":"MEUCIQDoqdrPNPigXJRPp+WzTPqxUluXRcDe+lH0IdTdN7XM4QIgFcO8mKSy9ZvF/LthXGOS93/PmaZkx4BqdAKQ2Klekp0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9178864},"main":"build/index.js","gitHead":"284d5d8dedbde7e4ff99788fa553981c2be8b062","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.12.1","description":"light weight single page framework","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.12_1779340832443_0.47788818516805276","host":"s3://npm-registry-packages-npm-production"}},"1.1.13":{"name":"@state-street/state-street","version":"1.1.13","author":"","license":"ISC","_id":"@state-street/state-street@1.1.13","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"b1464779147545c5e27366d64e189d36ce9d3a1a","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.13.tgz","fileCount":51,"integrity":"sha512-CbM9E87mW6O246moE+NsH0eEp8iOdPUMnD1czmmI0mmXQxA17rbZ+eg5TqScFBqyxm0iagKxTPsD3JeZ5yzxBg==","signatures":[{"sig":"MEUCIAKB4cqsmK7dwX3jpP9s9qKf1fcYv8IXy5J4Wy9qVFb4AiEA7UUqOadfcOlG8cQKoCBwoN83aPHNAzqq1LS7xvc1PT0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9196014},"main":"build/index.js","gitHead":"2a4de0a694d879483294689e9ffcc84812d1e84c","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.13.0","description":"light weight single page framework","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.13_1779468194675_0.1698612255410501","host":"s3://npm-registry-packages-npm-production"}},"1.1.14":{"name":"@state-street/state-street","version":"1.1.14","author":"","license":"ISC","_id":"@state-street/state-street@1.1.14","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"3380bec4ae8b6dc3a97108ec3d323da0f4398a27","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.1.14.tgz","fileCount":51,"integrity":"sha512-1lblMNw+m5lTUbty+V7S1k8Nrml8arH3ULD47qDRPfcDIb2K7Q3EkWrRQNuSJfdXHaX0Y8nM9mWu1DPvIt5ctw==","signatures":[{"sig":"MEUCIGUJMWk9naPZy6Wme2JQXj7F50aMpILtVkrkZCCwgLdfAiEA49Yj4enXk8jgmN93zVgHh/VZ54E/KSRDv1Cqtur/3xo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9200490},"main":"build/index.js","gitHead":"dcf9e616ccb8b12ebeb8259e14eff3a4789e87e5","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.13.0","description":"light weight single page framework","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.1.14_1779472816589_0.0187043695981004","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@state-street/state-street","version":"1.2.0","author":"","license":"ISC","_id":"@state-street/state-street@1.2.0","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"a4b873cc836fc3d6c777993e8cb4c39ce4516099","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.2.0.tgz","fileCount":54,"integrity":"sha512-wXKvi8LtwCiFC++Hrq0FwE26B02Gy8Rymo3J892XLAjC9ka/RfY94mf6FNEJCBeL5LGS1GbwuFJoTavj0lOCLQ==","signatures":[{"sig":"MEYCIQDbX415nIprArPzWFFTcZJIySfN5AbxC3BGm7ZA6lFBsgIhAMC2odEoRxlaSxqWriFm/eS79M95xJSmdAjbLqze2/Io","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9216184},"main":"build/index.js","gitHead":"fc7eca752d3d910b4a1e4efcdd96bf6c4821a9ed","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.13.0","description":"light weight single page framework","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.2.0_1779487557637_0.19998687215364286","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@state-street/state-street","version":"1.2.1","author":"","license":"ISC","_id":"@state-street/state-street@1.2.1","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"a581df3a527ed7bceb8f540bd4c3fb7e252d9237","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.2.1.tgz","fileCount":54,"integrity":"sha512-BW/y/SfNARKqjhO9eeIiYB7lm6mc1eWjbXFX/BKpqzLfi2dYAnFkw2SiMShRosowKfCAKIztMlFeNfocnVZjkQ==","signatures":[{"sig":"MEYCIQCLUNo9HwDxk1Oz/GplpoF5Pdzr/dnHrceJg6FawuWpUgIhAMysLu12O8bLm7FY9+QSMzS42i2Ujc6VouuXLl+gqlZw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9216318},"main":"build/index.js","gitHead":"58ca755567d37ead9308143fbd6d5eab708a243d","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.13.0","description":"light weight single page framework","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.2.1_1779489003650_0.07787511187961749","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@state-street/state-street","version":"1.3.0","author":"","license":"ISC","_id":"@state-street/state-street@1.3.0","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"dist":{"shasum":"be241e55241ecd7cf8f74cbc72560b6a3510664d","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.3.0.tgz","fileCount":54,"integrity":"sha512-RgJhSUNv9FrN6Cf1PQFc0Ejiu5AwVYNaU0Qbls8l0rfH0EKg4Q7X5WGz7q3+ziMjLPBatcgmz+qg5Bpz5tdC4A==","signatures":[{"sig":"MEUCIQCqawDD5gziPnH7CbFTjJQXuuAx7wDpY9+TiTvWnQCUxgIgDKoQixnjx8fUfbOhV790uu0q7RYCnooeDC4E6O15ImQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9218317},"main":"build/index.js","gitHead":"1a2be677e490633db49528951da3f88b13c825d9","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:watch":"tsc -w"},"_npmUser":{"name":"joswei","email":"joshabracks@gmail.com"},"_npmVersion":"11.13.0","description":"light weight single page framework","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","typescript":"^5.9.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","eslint-config-prettier":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.3.0_1779492797010_0.5447683284486675","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@state-street/state-street","version":"1.4.1","author":"","license":"ISC","_id":"@state-street/state-street@1.4.1","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"homepage":"https://github.com/Joshabracks/State-Street#readme","bugs":{"url":"https://github.com/Joshabracks/State-Street/issues"},"dist":{"shasum":"93c73311a8d301967e03acc2791e27fdb1a9113d","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-1.4.1.tgz","fileCount":27,"integrity":"sha512-8/q+e+KxDzIAAyp5mw5vkXs2fhMfSUdM20jaY2vgOuhKevTtn2sYUQr2UDmyz5CYCCiZV2aDzGoahLkwyGoDVg==","signatures":[{"sig":"MEUCIQDlup5EZEEYaWaTNkbLGDh2MyzNMA+sN7MHr5BvFtFpsAIgTaM7zJV1QryODfJhAvmybDQcxLSIkS3GxWKBt0TqGY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@state-street%2fstate-street@1.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":230504},"main":"build/index.js","gitHead":"bded0b2bb66a8336dbd24ca513067d9509d0d91c","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:umd":"rollup -c rollup.config.mjs","build:watch":"tsc -w"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff9dea91-6c45-4082-afd3-11bf383a2257"}},"repository":{"url":"git+https://github.com/Joshabracks/State-Street.git","type":"git"},"_npmVersion":"11.16.0","description":"light weight single page framework","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rollup":"^4.24.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^9.1.0","@rollup/plugin-commonjs":"^28.0.1","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_1.4.1_1780520755452_0.3887147238937576","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@state-street/state-street","version":"2.1.0","author":"","license":"ISC","_id":"@state-street/state-street@2.1.0","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"homepage":"https://github.com/Joshabracks/State-Street#readme","bugs":{"url":"https://github.com/Joshabracks/State-Street/issues"},"dist":{"shasum":"7ae5989ce20faf641734ac68e985a47508ed7777","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-2.1.0.tgz","fileCount":29,"integrity":"sha512-+6rmMnQXjsKidnE8c79pDiKg20wzIUi5XCNfSLCIwt5j7tFq4j8pwpxwMol+8TnNL4f/nS4HYyrlwP83sNcFyw==","signatures":[{"sig":"MEUCIDpkRFuJ0hv4jkjWkwdysGEPZLhuNNUDHi4ze6noj7qCAiEA0GaPgKUSnP94ZNY0+dW9LUpzh2HHUk0XSo/u8a6sXPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@state-street%2fstate-street@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":300283},"main":"build/index.js","gitHead":"99dc8814d4f34e48368378da5b11b2dd8b1e76fb","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:umd":"rollup -c rollup.config.mjs","build:watch":"tsc -w"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff9dea91-6c45-4082-afd3-11bf383a2257"}},"repository":{"url":"git+https://github.com/Joshabracks/State-Street.git","type":"git"},"_npmVersion":"11.17.0","description":"light weight single page framework","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rollup":"^4.24.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^9.1.0","@rollup/plugin-commonjs":"^28.0.1","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_2.1.0_1781546002770_0.7633502602323026","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@state-street/state-street","version":"2.3.0","author":"","license":"ISC","_id":"@state-street/state-street@2.3.0","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"homepage":"https://github.com/Joshabracks/State-Street#readme","bugs":{"url":"https://github.com/Joshabracks/State-Street/issues"},"dist":{"shasum":"1648f0c55b8b98f3e55085036ff098edaa17db8c","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-2.3.0.tgz","fileCount":42,"integrity":"sha512-0maQHe0Ce9N72jUk52nJJ2buP7THA7ycvnnWI/7i3+a+D/bsVP0VDL6NR2e1Ux6oqFRrnqJX0LJteKloJ6t8Ag==","signatures":[{"sig":"MEYCIQCWB385kWnqe6xLV+2/1NJX7gkD1sv9ze/TErGXXXXlfgIhAIwnpA7FECzWXVFSS29bRJh9iJtfZIfmb0cM7IPRBYwz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@state-street%2fstate-street@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":318449},"main":"build/index.js","types":"build/index.d.ts","gitHead":"d97cb82d91527c891ad616cce95de56d7abcf156","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:umd":"rollup -c rollup.config.mjs","build:watch":"tsc -w"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff9dea91-6c45-4082-afd3-11bf383a2257"}},"repository":{"url":"git+https://github.com/Joshabracks/State-Street.git","type":"git"},"_npmVersion":"11.17.0","description":"light weight single page framework","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rollup":"^4.24.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^9.1.0","@rollup/plugin-commonjs":"^28.0.1","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_2.3.0_1781563009925_0.7772116380429872","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"@state-street/state-street","version":"2.3.1","author":"","license":"ISC","_id":"@state-street/state-street@2.3.1","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"homepage":"https://github.com/Joshabracks/State-Street#readme","bugs":{"url":"https://github.com/Joshabracks/State-Street/issues"},"dist":{"shasum":"faab2c1f4f1ac5a25c5ed0eb60a45fcc310a1db0","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-2.3.1.tgz","fileCount":42,"integrity":"sha512-B91K9zEw/ulGI2cGrkjwbZ9V33cuy+8xIa3tCXExTeg5NVkiuKjwIiD2Bb8SB+tnSqmcby/gy35v/XjqRBWUOA==","signatures":[{"sig":"MEQCIENakDHR19ulsTu4lhzTqmc7Eny211wc560Jbo/B1W5ZAiBBihbGcTHnbk27IOapEaSiT3hy60wLvCJOV+V958IfHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@state-street%2fstate-street@2.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":324369},"main":"build/index.js","types":"build/index.d.ts","gitHead":"d818bf4c50c20d883aa72c638a22458d639d34b1","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:umd":"rollup -c rollup.config.mjs","build:watch":"tsc -w"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff9dea91-6c45-4082-afd3-11bf383a2257"}},"repository":{"url":"git+https://github.com/Joshabracks/State-Street.git","type":"git"},"_npmVersion":"11.17.0","description":"light weight single page framework","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rollup":"^4.24.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^9.1.0","@rollup/plugin-commonjs":"^28.0.1","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_2.3.1_1781629832927_0.11626113044579034","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@state-street/state-street","version":"2.4.1","author":"","license":"ISC","_id":"@state-street/state-street@2.4.1","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"homepage":"https://github.com/Joshabracks/State-Street#readme","bugs":{"url":"https://github.com/Joshabracks/State-Street/issues"},"dist":{"shasum":"c72ba899b47bd2ea722190e80a0040ccfc59f279","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-2.4.1.tgz","fileCount":42,"integrity":"sha512-CtL3wFVdkt1MWnGZtzRwvEMgtSFiEsS1Hlfm9UVsMNTxqYovzHQ9PYgzMfy9T/aX32VjvdoY8Wysd2tkD9Wdxw==","signatures":[{"sig":"MEUCIQD+r2fr70SHE0F+U6Gsq+hK2hIV4Fy0pvR/H2Vpxt3bDAIgBNN0vXonE3CiJ0DpwbjdBSPBsumJqAZvtoI9dgh6Bx4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@state-street%2fstate-street@2.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":341919},"main":"build/index.js","types":"build/index.d.ts","gitHead":"026a1c938b3b63ffacf90d3701e5f3188fba6364","scripts":{"lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\"","build":"tsc","build:umd":"rollup -c rollup.config.mjs","build:watch":"tsc -w"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff9dea91-6c45-4082-afd3-11bf383a2257"}},"repository":{"url":"git+https://github.com/Joshabracks/State-Street.git","type":"git"},"_npmVersion":"12.0.2","description":"light weight single page framework","directories":{},"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.57.0","rollup":"^4.24.0","typescript":"^5.3.3","@types/node":"^20.10.7","typescript-eslint":"^7.1.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^9.1.0","@rollup/plugin-commonjs":"^28.0.1","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/state-street_2.4.1_1785471328268_0.3445500552466412","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@state-street/state-street","version":"3.0.0","description":"light weight single page framework","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+https://github.com/Joshabracks/State-Street.git"},"homepage":"https://github.com/Joshabracks/State-Street#readme","bugs":{"url":"https://github.com/Joshabracks/State-Street/issues"},"scripts":{"build":"tsc","build:watch":"tsc -w","build:umd":"rollup -c rollup.config.mjs","lint":"eslint src --ext .ts","test":"echo \"no test specified. \nCarry on?\""},"author":"","license":"ISC","devDependencies":{"@rollup/plugin-commonjs":"^28.0.1","@rollup/plugin-node-resolve":"^15.3.0","@rollup/plugin-terser":"^0.4.4","@types/node":"^20.10.7","eslint":"^8.57.0","eslint-config-prettier":"^9.1.0","rollup":"^4.24.0","typescript":"^5.3.3","typescript-eslint":"^7.1.0"},"gitHead":"8c70e36f5a69fe7324b69c7b725754cf8bcbe4ec","_id":"@state-street/state-street@3.0.0","_nodeVersion":"22.23.2","_npmVersion":"12.0.2","dist":{"integrity":"sha512-sk1NINOPI6iQ+1FAnuR7oPfhwBu1VOvixHcgggKSiAB3q1ZFOHcS8/v6Cj8Ta9TDbbCcg7wSf9kpinwCO1NmmA==","shasum":"1541b75fd1698f0a6ef5976eb70cf9679ef70b81","tarball":"https://registry.npmjs.org/@state-street/state-street/-/state-street-3.0.0.tgz","fileCount":45,"unpackedSize":359344,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@state-street%2fstate-street@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDtmCgP4g3Mi70Cxc/+hOrWDON77qBlCq79YZI6F6sIJAiBv0CoqpWeTQEacKxbxOK/8J3WbFoFk/ic0NT0V+mqhNg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ff9dea91-6c45-4082-afd3-11bf383a2257"}},"directories":{},"maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/state-street_3.0.0_1787541238894_0.5574864355472482"},"_hasShrinkwrap":false}},"time":{"created":"2024-02-28T22:22:57.124Z","modified":"2026-08-24T03:13:59.399Z","0.0.1":"2024-02-28T22:22:57.500Z","0.0.2":"2024-02-28T22:27:28.735Z","0.0.4":"2024-02-29T00:06:17.275Z","0.0.5":"2024-02-29T07:31:40.110Z","0.0.6":"2024-02-29T19:25:25.321Z","0.0.7":"2024-02-29T23:10:35.684Z","0.0.8":"2024-03-01T00:12:36.165Z","0.1.0":"2024-03-09T01:28:42.925Z","0.1.1":"2024-03-09T01:36:07.781Z","0.1.2":"2024-03-09T07:06:39.069Z","0.1.3":"2024-03-11T01:07:24.706Z","0.1.4":"2024-03-12T05:14:56.126Z","0.2.0":"2024-03-12T05:58:00.196Z","0.2.1":"2024-03-13T20:59:00.454Z","0.2.2":"2024-03-15T05:54:47.054Z","0.2.3":"2024-03-15T07:58:33.434Z","0.2.4":"2024-03-16T22:34:15.392Z","1.0.0":"2024-03-19T06:36:19.615Z","1.0.1":"2024-03-19T20:36:58.093Z","1.0.2":"2024-03-23T03:42:56.122Z","1.0.3":"2024-03-23T20:56:36.043Z","1.0.4":"2024-03-27T23:07:29.725Z","1.1.0":"2024-03-31T03:50:37.181Z","1.1.2":"2025-07-15T05:05:44.541Z","1.1.4":"2026-05-15T22:34:01.261Z","1.1.5":"2026-05-16T03:52:33.175Z","1.1.6":"2026-05-16T17:33:37.992Z","1.1.7":"2026-05-17T01:43:54.680Z","1.1.8":"2026-05-17T17:35:59.672Z","1.1.9":"2026-05-18T17:46:11.707Z","1.1.12":"2026-05-21T05:20:33.139Z","1.1.13":"2026-05-22T16:43:14.957Z","1.1.14":"2026-05-22T18:00:16.844Z","1.2.0":"2026-05-22T22:05:57.981Z","1.2.1":"2026-05-22T22:30:03.959Z","1.3.0":"2026-05-22T23:33:17.447Z","1.4.1":"2026-06-03T21:05:55.626Z","2.1.0":"2026-06-15T17:53:22.913Z","2.3.0":"2026-06-15T22:36:50.075Z","2.3.1":"2026-06-16T17:10:33.118Z","2.4.1":"2026-07-31T04:15:28.408Z","3.0.0":"2026-08-24T03:13:59.059Z"},"bugs":{"url":"https://github.com/Joshabracks/State-Street/issues"},"license":"ISC","homepage":"https://github.com/Joshabracks/State-Street#readme","repository":{"type":"git","url":"git+https://github.com/Joshabracks/State-Street.git"},"description":"light weight single page framework","maintainers":[{"name":"joswei","email":"joshabracks@gmail.com"}],"readme":"# ![State Street](https://github.com/Joshabracks/State-Street/blob/main/sstlogo.png?raw=true)\n\n[![CI](https://github.com/Joshabracks/State-Street/actions/workflows/ci.yml/badge.svg)](https://github.com/Joshabracks/State-Street/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/@state-street/state-street.svg)](https://www.npmjs.com/package/@state-street/state-street)\n[![license: ISC](https://img.shields.io/badge/license-ISC-blue.svg)](#license)\n[![zero deps](https://img.shields.io/badge/dependencies-0-success)](https://www.npmjs.com/package/@state-street/state-street)\n\nA no-build reactive UI layer that fits in a single global script. Plain JS template strings, dep-gated re-renders, no JSX, no compile step.\n\nWant to contribute or need help? [Join the State Street Discord!](https://discord.gg/a7AycPG2)\n\n---\n\n## Table of contents\n\n- [Why State Street](#why-state-street)\n- [Using with AI coding agents](#using-state-street-with-ai-coding-agents)\n- [Install](#install)\n- [Quick start — direct style](#quick-start--direct-style)\n- [Quick start — registry style](#quick-start--registry-style)\n- [Core concepts](#core-concepts)\n- [Template syntax](#template-syntax)\n- [The `State` class — API reference](#the-state-class--api-reference)\n- [Components](#components)\n- [Methods](#methods)\n- [Reactivity model](#reactivity-model)\n- [Render scheduling + component marker ranges](#render-scheduling--component-marker-ranges)\n- [Image cache](#image-cache)\n- [Patterns from production](#patterns-from-production)\n- [The registry pattern — full reference](#the-registry-pattern--full-reference)\n- [Gotchas](#gotchas)\n- [Tooling](#tooling)\n- [FAQ](#faq)\n- [License](#license)\n\n### Sites and applications powered by State Street\n\n- [joshuabracks.com](https://www.joshuabracks.com)\n- [omosuen-editor](https://github.com/joshabracks/omosuen-editor)\n\n---\n\n## Why State Street\n\n- **Plain template strings.** No JSX and no required compile step. Your views are template literals that return strings of HTML. Your editor highlights them as HTML. Your tests can read them.\n- **Mutate state directly.** `state.data.foo = bar` triggers a dep-gated re-render on the next animation frame. No setters, no actions, no reducers.\n- **One file, one class.** The entire library is `new State(template, data, components, methods)`. Read the source in an afternoon.\n- **First-class tooling.** Written in TypeScript and happy to be consumed as TS or plain JS, with any bundler or none at all. The official [State Street SST](https://marketplace.visualstudio.com/items?itemName=beetnick82.vscode-sst) VS Code extension gives you HTML highlighting + completion inside `.sst.js` / `.sst.ts` template literals.\n- **Tiny.** Small enough to disappear into whatever you ship, with zero runtime dependencies.\n\n### Is this for me?\n\nState Street fits apps where you own the HTML and want reactive, HTML-shaped templates — tools, internal dashboards, Tauri/Electron apps, browser-extension UIs, single-page games, and production SPAs. It works with plain JavaScript or TypeScript, with or without a bundler, and can also run straight from a single global script with no build at all. The [VS Code extension](#tooling) gives you template highlighting either way.\n\nIt stays small on purpose: there's no virtual DOM, and conditionals and loops are plain JavaScript inside your component functions rather than template directives. If that trade sounds good, State Street is for you.\n\n---\n\n## Using State Street with AI coding agents\n\nState Street isn't React/Vue, so coding assistants often misapply patterns from those frameworks (JSX, hooks, `className`, a router). Give your agent the correct mental model up front:\n\n- **Drop [`AGENTS.md`](./AGENTS.md) into your project.** It lives at this repo's root and ships inside the npm package (`node_modules/@state-street/state-street/AGENTS.md`). Copy it to your project root as `AGENTS.md` (read by most agents) or `CLAUDE.md` (Claude Code), or paste it into your assistant's rules/context.\n- **Or point your agent at the hosted guide:** [`/llms-full.txt`](https://joshabracks.github.io/State-Street/llms-full.txt) (the full guide) — discoverable via [`/llms.txt`](https://joshabracks.github.io/State-Street/llms.txt).\n\nIt's a distilled cheat-sheet — what State Street is *not*, the reactivity model, the directive syntax, and the gotchas that trip up agents — so they write idiomatic State Street instead of guessing from other frameworks. The package also ships TypeScript declarations (`build/*.d.ts`), so editors and agents get real type signatures.\n\n---\n\n## Install\n\n**Scaffold a new app** (a starter landing page, agent-ready):\n\n```bash\nnpm create @state-street@latest my-app          # asks: JavaScript or TypeScript?\n```\n\nPass `--typescript` (or `--js`) to skip the prompt. The default JS template has no build step;\nTypeScript adds a webpack toolchain.\n\n**Add to an existing project (npm / module bundler):**\n\n```bash\nnpm i @state-street/state-street\n```\n\n```js\nimport { State } from \"@state-street/state-street\";\n```\n\n**Global script tag (no build step):**\n\nEvery release ships a minified UMD build, `state-street.global.js`, that defines the global `State` (`window.State`). You can get it from any of these:\n\n- **GitHub Releases** — attached as a downloadable asset on each [release](https://github.com/Joshabracks/State-Street/releases) (e.g. the latest at [releases/latest](https://github.com/Joshabracks/State-Street/releases/latest)). Download it and host it yourself.\n- **jsDelivr CDN** — `https://cdn.jsdelivr.net/npm/@state-street/state-street/build/state-street.global.js`\n- **unpkg CDN** — `https://unpkg.com/@state-street/state-street/build/state-street.global.js`\n\n```html\n<!-- self-hosted, next to your HTML -->\n<script src=\"state-street.global.js\"></script>\n\n<!-- or via CDN (jsDelivr) -->\n<script src=\"https://cdn.jsdelivr.net/npm/@state-street/state-street/build/state-street.global.js\"></script>\n\n<script>\n  // the script defines the global `State` (window.State)\n  const app = new State(template, data, components, methods);\n</script>\n```\n\n> **Pin a version in production.** The CDN URLs above always resolve to the latest published version. To lock to a specific release, add `@<version>` after the package name, e.g.\n> `https://cdn.jsdelivr.net/npm/@state-street/state-street@1.4.1/build/state-street.global.js`.\n\nIf you use a bundler (webpack, esbuild, vite, rollup, …), the named export is `State`. The library has zero runtime dependencies, so the build is trivial.\n\n---\n\n## Quick start — direct style\n\nA counter app in one file:\n\n```html\n<!doctype html>\n<html>\n<body>\n  <script src=\"state-street.global.js\"></script>\n  <script>\n    const template = `\n      <main>\n        <h1>{{title}}</h1>\n        <Counter/>\n      </main>\n    `;\n\n    const data = {\n      title: \"Hello State Street\",\n      count: 0,\n    };\n\n    const components = {\n      Counter: ({ state }) => `\n        <p>Count: ${state.data.count}</p>\n        <button :click=increment()>+1</button>\n        <button :click=reset()>Reset</button>\n      `,\n    };\n\n    const methods = {\n      increment: ({ state }) => { state.data.count += 1; },\n      reset:     ({ state }) => { state.data.count = 0; },\n    };\n\n    new State(template, data, components, methods);\n  </script>\n</body>\n</html>\n```\n\nThat's the whole pattern. The constructor mounts to `document.body` automatically. `state.data.count += 1` marks the top-level `count` key dirty; on the next animation frame, the `<Counter/>` component re-runs and its rendered nodes are swapped in place. The component adds no wrapper element to the DOM, so no special CSS is needed — `<Counter/>`'s `<p>` and `<button>`s are direct children of `<main>`.\n\n> **Heads up:** `:click=increment()` requires the parentheses, even with no arguments. `:click=increment` without parens is silently treated as a regular HTML attribute and the click does nothing.\n\n---\n\n## Quick start — registry style\n\nThe same app, written with a registration boilerplate. Useful when your app grows past one file or when you want to support runtime extension (mods, themes, plugins). The boilerplate itself is ~100 lines you copy in once; see [the registry pattern reference](#the-registry-pattern--full-reference) below.\n\n**index.html:**\n\n```html\n<script src=\"state-street.global.js\"></script>\n<script src=\"my-app/core.js\"></script>              <!-- the registry boilerplate -->\n<script src=\"my-app/base_data.js\"></script>         <!-- setBaseData(...) -->\n<script src=\"my-app/components/counter.js\"></script>\n<script src=\"my-app/methods/counter.js\"></script>\n<script>MY_APP.boot();</script>\n```\n\n**base_data.js:**\n\n```js\nMY_APP.setBaseData(() => ({\n  title: \"Hello State Street\",\n  count: 0,\n}));\n```\n\n**components/counter.js:**\n\n```js\n(function () {\n  function Counter({ state }) {\n    return `\n      <p>Count: ${state.data.count}</p>\n      <button :click=increment()>+1</button>\n      <button :click=reset()>Reset</button>\n    `;\n  }\n  MY_APP.registerComponents({ Counter });\n})();\n```\n\n**methods/counter.js:**\n\n```js\n(function () {\n  MY_APP.registerMethods({\n    increment: ({ state }) => { state.data.count += 1; },\n    reset:     ({ state }) => { state.data.count = 0; },\n  });\n})();\n```\n\n`MY_APP.boot()` assembles the accumulated registries, calls `new State(...)`, and you're live. Both styles converge on the same `State` class — only the wiring differs.\n\n---\n\n## Core concepts\n\nState Street has four ideas. That's the whole API surface to internalize.\n\n### 1. Reactive state\n\n`state.data` is a `Proxy` with two traps. Writing `state.data.foo = bar` triggers the **`set` trap**, which marks the top-level key `foo` as dirty for the next render frame. Reading `state.data.foo` triggers the **`get` trap**, which records `foo` as a dependency of the component currently running — see dep gating below.\n\n```js\nstate.data.count = state.data.count + 1;        // marks \"count\" dirty\nstate.data.user  = { name: \"Marie\", age: 21 };  // marks \"user\" dirty\nstate.data.user.name = \"Jasmine\";               // marks \"user\" dirty (top-level)\n```\n\n### 2. Top-level-key dep gating\n\nEach component instance has its own dep-tracking proxy. While the component function runs, every `state.data.<key>` it reads (via the `get` trap) is recorded into that instance's `deps: Set<string>`. On the next frame, the render scheduler only re-runs components whose tracked keys intersect with the set of dirty keys.\n\n> **The read is the subscription.** Any `state.data.<key>` you touch *anywhere in the body* subscribes the component to that key — in a conditional, a computed local, an existence check, or inside a `${}` — **even if the value never appears in the output**. Read only what you need.\n\n> **Gating is top-level-key granular.** `state.data.user.name` marks `user` dirty, not `user.name`. Components reading any part of `user` will re-run. If you need finer reactivity, split your state into more top-level keys.\n\n### 3. Components return strings\n\nA component is a plain function that returns a string of HTML. There is no virtual DOM and no per-element diff. When a component's tracked state goes dirty, the function re-runs; if its output is byte-identical to the previous frame the DOM is left untouched, otherwise its rendered nodes are rebuilt and swapped in place (within a pair of invisible comment markers that bound the component — no wrapper element). (Plain reusable elements are reused and patched in place rather than recreated.)\n\n```js\nfunction Greeting({ state, name }) {\n  return `<h1>Hello, ${state.data.user.name || name}!</h1>`;\n}\n```\n\n### 4. `<Tag/>` vs `${Tag()}`\n\nRender components with the tag syntax `<Counter/>` so they get their own dep-tracked range. **Don't** interpolate component output directly — `${Counter()}` inlines the string into the parent, which means the parent inherits the child's deps and re-runs whenever the child's state changes.\n\n```js\n// ✅ Good — Counter is its own dep-tracked subtree.\nfunction App() {\n  return `<main><Counter/></main>`;\n}\n\n// ❌ Bad — App now re-runs whenever Counter's state changes.\nfunction App({ state }) {\n  return `<main>${Counter({ state })}</main>`;\n}\n```\n\nReal example from a Tauri narrative game's world-view screen:\n\n```js\nfunction WorldView() {\n  return `\n    <div class=\"page wv-page\">\n      <WvTopbar/>\n      <div class=\"wv-body\">\n        <aside class=\"wv-sidebar\">\n          <WvSidebarTabs/>\n          <WvSidebarBody/>\n        </aside>\n        <section class=\"wv-main\"><WvMain/></section>\n      </div>\n    </div>\n  `;\n}\n```\n\nEach `<Wv…/>` is independently gated. Changing the selected sidebar tab marks `worldView` dirty, which re-runs `<WvSidebarTabs/>` and `<WvMain/>` but leaves `<WvTopbar/>` untouched (it only reads `game`).\n\n---\n\n## Template syntax\n\n### State Bindings: `{{path}}`\n\nA **State Binding** — `{{path}}` — is a reactive reference to a `state.data` value. State Street keeps it as a standalone text or attribute node and updates that node **in place** when the bound key changes, **without re-running the component**. It replaces with the value at `path` in the local scope (the props you passed to the component plus the values in its scope) and resolves dotted paths.\n\n```js\nfunction Card({ state, npc }) {\n  return `<h2>{{npc.name}} — age {{npc.age}}</h2>`;\n}\n```\n\nIf you'd rather inline JavaScript, template literals work too: `${npc.name}`. Both produce the same string, but they behave differently on change: a `{{ }}` State Binding patches just its own node, while `${state.data.x}` is evaluated **once** when the function runs and its read subscribes the whole component, so a change to `x` re-runs and rebuilds it.\n\n> **Prefer State Bindings over `${}` for reactive values.** `{{count}}` updates just that node in place; `${state.data.count}` re-runs the whole component whenever `count` changes. Reserve `${}` for control flow (loops, conditionals), derived/computed strings, and composition — things a binding can't express.\n\n### Component tags: `<Component prop=\"value\"/>`\n\nSelf-closing tags whose name matches a registered component invoke that component. Attributes are passed as props.\n\n```js\nconst components = {\n  Avatar: ({ state, src, size }) =>\n    `<img class=\"avatar avatar--${size}\" src=\"${src}\"/>`,\n};\n\n// In a parent template:\n`<Avatar src=\"${user.portrait}\" size=\"lg\"/>`\n```\n\n### Event directives: `:event=method(arg=value, ...)`\n\nWire any standard DOM event to a registered method. The handler receives `{ state, event, ...args }`.\n\n```js\n`<button :click=submit()>Save</button>`\n`<button :click=removeItem(id=\"${item.id}\")>Delete</button>`\n`<input :input=updateField(field=\"email\")/>`\n```\n\n**Required:** the parentheses. `:click=submit` without `()` is silently parsed as a regular HTML attribute and the click does nothing.\n\nArgs are name=value pairs separated by commas. Values can be string literals, numbers, or `${interpolated}` expressions:\n\n```js\n`<button :click=jumpTo(scene=\"${state.data.targetScene}\", from=\"${currentScene}\")>Go</button>`\n```\n\nSupported events: anything DOM (`:click`, `:input`, `:change`, `:submit`, `:mouseenter`, `:keydown`, `:focus`, `:blur`, `:mouseleave`, …). State Street doesn't sniff the list — it just registers an event listener for whatever event name follows the `:`.\n\n### Attribute & argument coercion\n\nComponent props and event-directive args are **coerced to a type** before they reach your function — they are not always strings. The same rules apply to both component attributes and `:event=method(arg=value)` arguments:\n\n| In the template | Arrives as |\n|---|---|\n| `\"text\"`, `'text'`, `` `text` `` (quoted) | the string `text` (quotes stripped) |\n| `{{path}}` | the value at `path` in state (any type) |\n| `true` / `false` (unquoted) | boolean `true` / `false` |\n| `478` (unquoted, numeric) | number `478` |\n| a bare attribute with no value | boolean `true` |\n| anything else (unquoted) | string |\n\n```js\n`<PropTest numberVal=478 booleanVal=true stringVal=\"this is a string\" varVal={{total}}/>`\n// component receives:\n//   { state, numberVal: 478 (number), booleanVal: true (boolean),\n//     stringVal: \"this is a string\" (string), varVal: <state.total> }\n```\n\n```js\n`<button :click=setCount(n=5, reset=false)>Set</button>`\n// method receives: { state, event, n: 5 (number), reset: false (boolean) }\n```\n\n> **Heads up:** to keep something that *looks* like a number or boolean as a string, quote it: `code=\"0420\"` arrives as the string `\"0420\"`, while `code=0420` arrives as the number `420`.\n\n### No `:if` / `:for` / `:bind`\n\nState Street has no built-in conditional or loop directives. Conditionals and loops are plain JavaScript inside the component body. Return different strings.\n\n```js\nfunction CartSummary({ state }) {\n  const items = state.data.cart.items;\n  if (items.length === 0) {\n    return `<p class=\"empty\">Your cart is empty.</p>`;\n  }\n  const rows = items.map((it) =>\n    `<li>${it.name} — $${it.price.toFixed(2)}</li>`\n  ).join(\"\");\n  return `<ul class=\"cart\">${rows}</ul>`;\n}\n```\n\nThis is the design: the template syntax is small because JavaScript already does the work.\n\n### Raw content: `<code>`, `:raw`, and formatters\n\nSome elements opt out of template parsing so you can show literal markup (code samples, user text) or post-process content:\n\n- **RAWTEXT** — `<script>`, `<style>`, `<code>`: contents are verbatim text — no child-tag parsing, no `{{ }}` interpolation.\n- **RCDATA** — `<textarea>`, `<title>`: child tags aren't parsed (a literal `<` is safe), but `{{ }}` interpolation and entity decoding are kept.\n- **`:raw`** — makes any element's content verbatim text.\n\n```js\n// shown literally — not parsed, not interpolated\n`<code><button :click=inc()>{{count}}</button></code>`\n\n// :raw on any element\n`<div :raw>literal {{x}} and <b>not bold</b></div>`\n```\n\n`:raw=formatterName` feeds the raw text to a method (resolved from `methods`, called as `fn({ text, state })`) and sets the returned string as the element's `innerHTML` — the hook for syntax highlighting, Markdown, etc.\n\n```js\nconst methods = {\n  shout: ({ text }) => `<strong>${text.toUpperCase()}!</strong>`,\n};\n// `<div :raw=shout>hello</div>` renders <strong>HELLO!</strong>\n```\n\n> **Heads up:** `<pre>` is intentionally **not** RAWTEXT, so the common `<pre><code>…</code></pre>` idiom keeps working. RAWTEXT content can't contain the element's own closing tag (a literal `</code>` inside a `<code>` ends it early). Formatter output is set via `innerHTML` — the formatter owns escaping.\n\n### Inline SVG & namespaced elements\n\nInline `<svg>` (and `<math>`) render as real namespaced elements — State Street builds them with `createElementNS` and threads the namespace through the subtree, across component boundaries and independent re-renders. Attribute interpolation and events work as usual.\n\n```js\nfunction Chart({ state }) {\n  return `\n    <svg viewBox=\"0 0 100 100\" width=\"120\">\n      <circle cx=\"50\" cy=\"50\" r=\"{{radius}}\" fill=\"tomato\"/>\n    </svg>\n  `;\n}\n```\n\nLegacy `xlink:` / `xml:` namespaced attributes are supported via `setAttributeNS`; prefer the modern SVG2 plain `href` where you can.\n\n### Preserving elements: `:preserve`\n\n`:preserve` makes State **reuse** an element in place across re-renders and never rebuild its children — for hosting DOM State doesn't own (a chart, a map, a rich-text editor):\n\n```js\n`<div :preserve id=\"chart\"></div>`\n```\n\nOn first render the element is built (empty); after that it's moved, not recreated, so whatever drew into it survives. For composing two States you usually don't need `:preserve` — see [Mounting & lifecycle](#mounting--lifecycle), where a child mounted into a parent's element registers itself automatically.\n\n`:preserve` keeps an element alive when it stays at the **same** place in the template. If your app needs to relocate that element to a **different** place — e.g. dragging a panel between docks — a `:preserve`d element's live DOM node gets a `moveTo`/`resetLocation` pair for exactly that:\n\n```js\nconst el = document.getElementById(\"chart\");\nel.moveTo(otherContainer);   // real DOM move, not a rebuild; content/state survives\nel.resetLocation();          // returns it to its original template position\n```\n\nState Street keeps treating the element as though it never left its template position — content bindings, attribute diffing, and children continue to update normally regardless of where it physically lives. If the element you moved it into is later removed from the document, it automatically snaps back to its original position. Calling `moveTo`/`resetLocation` on an element that isn't `:preserve`d logs a warning and does nothing (a non-preserved element is rebuilt from scratch on its own next render anyway, so moving it wouldn't stick).\n\n---\n\n## The `State` class — API reference\n\n```ts\nnew State(template, data, components, methods, options?)\n```\n\n### Constructor parameters\n\n| Parameter | Type | Purpose |\n|---|---|---|\n| `template` | `string` | Root template. Any `<Component/>` tag references a key in `components`. |\n| `data` | `object` | Initial state. Becomes reactive on construction. If it has a `title` property, that value becomes `document.title` when mounted to `<body>`. |\n| `components` | `{ [name]: (props) => string }` | Component registry. |\n| `methods` | `{ [name]: (args) => void }` | Method registry. Bound to `:event=name()` directives. |\n| `options` | `object` | See below. |\n\n### Options\n\n| Option | Default | Purpose |\n|---|---|---|\n| `autoRender` | `true` | When `true`, mutations are rendered automatically (batched, throttled to `targetFPS`). When `false`, nothing renders implicitly — call `state.forceUpdate()` yourself after mutations. Useful in apps with a lot of state where you want manual control. |\n| `targetFPS` | `60` | When `autoRender` is on, throttle to roughly this many updates per second. |\n| `imgMemoryBudget` | `256 MB` | Max bytes of cached image blobs from base64 → blob URL conversion. LRU eviction over this budget; blobs still in the DOM are never evicted. |\n| `imgWarmPerFrame` | `4` | When `warmImages()` queues data URIs, how many to decode per idle frame. |\n| `mountTarget` | `document.body` | Where to mount: an `Element`, or a CSS-selector string (re-resolved over time). State **owns** the target (clears it on mount); `document.title` is set from `data.title` only when the target is `<body>`. |\n| `mountOnAvailable` | `true` | For non-body targets: while `autoRender` is on, auto-mount when the target appears, dismount if it's removed, re-mount when it returns. When `false`, mounting is manual (see `mountCheck()`). |\n\n### Instance properties + methods\n\n| Member | Type | Purpose |\n|---|---|---|\n| `.data` | getter / setter | Reactive proxy. Reads + writes go through it. The setter replaces the whole tree and marks every top-level key dirty. |\n| `.forceUpdate()` | `() => void` | Immediately mount-check, then re-render every dirty component and clear the dirty set. Bypasses the FPS throttle — the manual render call when `autoRender` is off. |\n| `.sameState()` | `() => boolean` | `true` if nothing is dirty. |\n| `.warmImages(uris)` | `(string[]) => void` | Queue base64 data URIs for off-screen decode. See [Image cache](#image-cache). |\n| `.mountCheck()` | `() => void` | Reconcile mount state with the DOM: dismount if the target is gone, mount if available. Call it yourself when `autoRender` is off. |\n| `.setMountTarget(t)` | `(Element \\| string) => void` | Dismount, set a new target, re-mount if found. |\n| `.togglePreserve(ssid, on?)` | `(string, boolean?) => void` | Preserve/release the element at `ssid` across re-renders (used automatically by nested States). |\n| `element.moveTo(target)` / `element.resetLocation()` | stamped on `:preserve`d elements | Relocate a preserved element to a different DOM parent without rebuilding it, or return it to its natural template position. See [`:preserve`](#preserving-elements-preserve). |\n| `.setAutoRender(b)` / `.setTargetFPS(n)` / `.setImgMemoryBudget(n)` / `.setImgWarmPerFrame(n)` | setters | Adjust the matching option at runtime. |\n| `.destroy()` | `() => void` | Dismount and unregister from the global state registry. Call it for transient States to avoid leaks. |\n\n### Mounting & lifecycle\n\nBy default the constructor mounts to `document.body` (it owns the target: clears it, appends the render, sets `document.title` from `data.title`). Pass `mountTarget` to mount elsewhere — an `Element` or a CSS-selector string:\n\n```js\nnew State(template, data, components, methods, { mountTarget: \"#app\" });\n```\n\nFor non-body targets, `mountOnAvailable` (default `true`) makes mounting a **lifecycle**: while `autoRender` is on, State waits for the target, mounts when it appears, dismounts if it's removed, and re-mounts when it returns. `state.data` survives a dismount — only the DOM is rebuilt, so a panel can come and go and keep its state. With `autoRender: false` nothing renders or mounts implicitly, so you drive it yourself:\n\n```js\nconst s = new State(tpl, data, comps, methods, { mountTarget: \"#panel\", autoRender: false });\ns.forceUpdate();             // mount/dismount as needed, then render\ns.setMountTarget(\"#other\"); // dismount, move, re-mount\n```\n\nA string `mountTarget` is a live selector — if it stops matching the mounted element (e.g. you toggle a class), State dismounts and waits. That lets you drive mounting from markup.\n\n### Nested States\n\nYou can mount a State into an element owned by another State. Every element is branded with its owner State's id (a `stid` attribute, alongside `ssid`), so a child mounting into a parent's element looks the parent up and registers itself; the parent then **preserves** that element across its own re-renders — reusing it in place (moved, not rebuilt), so the child's DOM and state are never clobbered. On dismount the child un-registers.\n\n```js\nnew State(`<main><div id=\"widget\"></div></main>`, parentData, comps, methods);\n// The child auto-registers with the parent; #widget survives the parent's re-renders.\nnew State(widgetTpl, widgetData, {}, widgetMethods, { mountTarget: \"#widget\" });\n```\n\nFor non-State DOM (third-party widgets), mark the host element with [`:preserve`](#preserving-elements-preserve) instead, or call `togglePreserve(ssid)` directly.\n\n---\n\n## Components\n\nA component is a function:\n\n```js\nfunction Name({ state, ...props }) {\n  // ... returns an HTML string\n}\n```\n\nReal example, trimmed for clarity (a game's loading screen):\n\n```js\nfunction LoadingScreen({ state }) {\n  const game = state.data.game;\n  const time = game?.in_game_time || { day: 1, phase: \"early_morning\" };\n  const phaseLabel = String(time.phase).replace(/_/g, \"-\");\n  const entry = pickNarrativeEntry(state);\n  const body = entry ? renderNarrative(entry) : renderShimmer();\n  return `\n    <div class=\"page ls-page\">\n      <section class=\"ls-frame\">\n        <h1 class=\"ls-title\">Day ${time.day}, ${phaseLabel}</h1>\n        ${body}\n      </section>\n    </div>\n  `;\n}\n```\n\n### Rules of thumb\n\n- **Components are pure functions of state.** Side-effects belong in methods (event handlers) or in external code (listeners, network callbacks).\n- **Use `<Tag/>` for any non-trivial subtree.** Inline interpolation `${tag()}` defeats dep gating — the parent inherits all the child's deps.\n- **Read what you need, no more.** Each `state.data.<key>` you touch becomes a dependency — the read *is* the subscription. Touching `state.data.game` even just to check if it exists subscribes the component to every change under `game`, whether or not the value reaches the output.\n- **Prefer State Bindings over `${}` for reactive values.** `{{count}}` patches just that node in place; `${state.data.count}` re-runs the whole component on every change to `count`. Reserve `${}` for control flow, derived strings, and composition.\n- **Props are typed values from the tag.** `<Avatar size=\"lg\"/>` arrives as `{ state, size: \"lg\" }`. Unquoted `true`/`false` and numbers are coerced to booleans/numbers, `{{path}}` resolves from state, and a bare attribute with no value is `true`. See [Attribute & argument coercion](#attribute--argument-coercion).\n\n---\n\n## Methods\n\nA method is a function called by an event directive:\n\n```js\nfunction methodName({ state, event, ...args }) {\n  // mutate state.data; the event object is the DOM event.\n}\n```\n\nReal examples:\n\n```js\n// View dispatcher used by every nav button.\nfunction go({ view, state }) {\n  state.data.view = view;\n}\n\n// Continue button on a loading screen — mutates two pieces of state and\n// kicks off an external (Tauri) command.\nfunction lsContinueToWorldView({ state }) {\n  state.data.loadingProgress = { current: 0, total: 0, label: \"\" };\n  state.data.view = \"WorldView\";\n  invoke(\"world_view_bake_phase_art\")\n    .catch((err) => console.error(err));\n}\n```\n\nWiring in a template:\n\n```js\n`<button :click=go(view=\"Settings\")>Settings</button>`\n`<button :click=lsContinueToWorldView()>Continue →</button>`\n```\n\n### Rules of thumb\n\n- **Mutate state directly.** `state.data.foo = bar`. The proxy marks `foo` dirty; no extra step.\n- **Args arrive coerced to their type.** Unquoted numbers and `true`/`false` become numbers/booleans, quoted values stay strings, and `{{path}}` resolves from state. See [Attribute & argument coercion](#attribute--argument-coercion).\n- **Async work is fine.** Methods can `await` and dispatch more mutations later. State Street picks them up on the next frame.\n\n---\n\n## Reactivity model\n\nThe hot loop, end to end:\n\n1. **Mutation.** Your code (a method, a listener, anywhere) does `state.data.foo = bar`.\n2. **Proxy set trap fires.** The set handler stores the new value AND calls the constructor-provided `onMutate(\"foo\")` callback.\n3. **`onMutate` flips dirty.** `state.dirty = true; state.dirtyKeys.add(\"foo\")`.\n4. **Render loop ticks.** On the next `requestAnimationFrame`, if enough time has elapsed for the target FPS, `updateDom(state)` runs.\n5. **Dep gating.** For each tracked component (outer → inner, including nested ones), the scheduler checks whether the component's recorded deps intersect with `dirtyKeys`. If not, skip.\n6. **Re-render the survivors.** Each surviving component function runs against a fresh dep-tracking proxy — every `state.data` key it reads fires the **`get` trap** and is recorded as next frame's deps. If its output matches last frame, nothing changes; otherwise its rendered nodes are rebuilt and swapped in place between the component's comment markers.\n7. **State Bindings.** Any `{{path}}` State Binding is updated in place if its source key is dirty — this happens independently of step 6, so a binding refreshes without re-running its component.\n8. **Dirty cleared.** Until the next mutation.\n\n### Nested mutations\n\nNested objects are wrapped on read and cached via `WeakMap`. So:\n\n```js\nstate.data.scene.beatCount = 3;\n```\n\nwalks: get `scene` (returns a cached wrapper proxy) → set `beatCount = 3` → calls `onMutate(\"scene\")` (the root key, not `scene.beatCount`). Every component reading `scene` re-runs.\n\n---\n\n## Render scheduling + component marker ranges\n\nA component adds **no wrapper element** to the DOM. Its rendered nodes become direct children of the parent, bracketed by a pair of invisible HTML comment markers:\n\n```html\n<!--ss:012:Counter-->\n<p>Count: 3</p>\n<button>+1</button>\n<!--/ss:012-->\n```\n\n- The markers encode the component's hierarchical instance path (`ssid`) — the parent's path plus this child's index (e.g. `\"0\"`, `\"01\"`, `\"012\"`), used internally for dep tracking, node reuse, and as a stable re-render anchor.\n- Comment nodes are **not elements**, so they never affect CSS layout (grid/flex tracks, `min-height: 0` propagation, percentage heights) or structural selectors (`:nth-child`, `>`, `:first-child`). A component's real root element(s) sit exactly where you wrote `<Component/>`.\n\n### No CSS rule needed\n\nEarlier versions wrapped each component in a `<div>` and required you to add `[ssct] { display: contents; }` to undo its layout effect. That wrapper is gone — your CSS Grid / flexbox / percentage-height layouts and structural selectors apply directly to component output with no extra rule.\n\n### Update loop pseudocode\n\n```\non each requestAnimationFrame:\n  drain image warm queue\n  if !state.dirty or not yet time for next update: return\n  for each component in componentMap (outer → inner, by ssid):\n    if start marker not connected: continue    // already removed by an ancestor this tick\n    if already rebuilt this tick: continue      // an ancestor recreated it\n    if rec.deps ∩ state.dirtyKeys is non-empty:\n      capture scroll + focus inside this range\n      run rec.fn under a fresh proxy\n      if body differs from last frame:          // identical output short-circuits\n        replace the nodes between the markers in place\n        restore scroll + focus\n  update standalone {{interpolation}} text + attr nodes\n  prune component records whose range was removed\n  clear dirty\n```\n\nThe actual code lives in `src/State/updateDom.ts` — under 200 lines.\n\n---\n\n## Image cache\n\nState Street ships with an automatic base64 → blob URL converter for `<img>` elements. Base64 data URIs decode slowly and are heavy on memory; blob URLs are fast.\n\n### Automatic behavior\n\nWhenever you render an `<img src=\"data:image/png;base64,…\">`, State Street swaps the `src` with a cached blob URL. Subsequent renders of the same data URI reuse the cached blob. The cache is bounded by `imgMemoryBudget` (default 256 MB); LRU eviction kicks in over that, skipping any blob still in the DOM.\n\n### Opt out per image\n\nIf you need the raw data URI (e.g. you're going to download it), add `nocache`:\n\n```js\n`<img src=\"${b64}\" nocache/>`\n```\n\n### Pre-warming\n\nIf you know which images will appear soon, call `state.warmImages([dataUri1, dataUri2, …])`. State Street queues them and decodes a few per idle frame (controlled by `imgWarmPerFrame`, default 4).\n\n```js\n// In a route change or pagination handler:\nstate.warmImages(nextPage.thumbnails);\n```\n\n---\n\n## Patterns from production\n\nPatterns this library's users converged on after substantial real-world use.\n\n### 1. Spread to update a top-level key\n\nThis is the canonical mutation pattern — produces a fresh top-level reference, marks the key dirty, no surprises:\n\n```js\nconst wv = state.data.worldView || {};\nstate.data.worldView = {\n  ...wv,\n  selectedCastId: id,\n};\n```\n\nThe set handler unwraps the top-level value (it stores the plain object you provided). The proxy doesn't deepen on this idiom.\n\n### 2. Direct mutation for high-frequency updates\n\nFor events that fire many times per second — token streams, animation frames, polling — the spread idiom can compound proxy depth on nested keys and eventually overflow the JS call stack. Mutate the target field directly:\n\n```js\n// 50–300 events per second from an LLM token stream.\nfunction onToken(event) {\n  const p = event.payload || {};\n  const sc = state.data.scene;\n  if (!sc) return;\n  const streamingLines = { ...(sc.streamingLines || {}) };\n  streamingLines[p.seq] = (streamingLines[p.seq] || \"\") + p.delta;\n  sc.streamingLines = streamingLines;   // direct mutation; no full-scene spread\n}\n```\n\n**Why:** `state.data.scene = { ...sc, streamingLines }` reads every key of `sc` through the proxy. Each nested object value comes back as a fresh wrapper. The state setter stores the new plain object — but the wrappers it contains accumulate one extra layer per call. After enough events, any nested read overflows the stack.\n\nDirect field mutation (`sc.streamingLines = newMap`) reuses the existing top-level proxy and never spreads it, so no chain grows.\n\n### 3. Helpers are just functions\n\nState Street has no built-in \"helpers\" concept. A helper is a plain function in scope:\n\n```js\nfunction padTilesOnce(rawTiles, count) {\n  const out = (rawTiles || []).slice();\n  while (out.length < count) {\n    out.push({ kind: \"color\", color: randomTileColor() });\n  }\n  return out;\n}\n\nfunction HomeTiles({ state }) {\n  const padded = padTilesOnce(state.data.sceneTilesRaw, 12);\n  return `<div class=\"tiles\">${padded.map(renderTile).join(\"\")}</div>`;\n}\n```\n\nIf you want a shared namespace across many components (typical in a registry-style app), expose helpers on your registry object (see [the registry pattern](#the-registry-pattern--full-reference)).\n\n### 4. The IIFE wrapper\n\nIn multi-file registry-style apps, every file is typically wrapped in an immediately-invoked function expression:\n\n```js\n(function () {\n  function MyComponent({ state }) { /* ... */ }\n  MY_APP.registerComponents({ MyComponent });\n})();\n```\n\nThe IIFE keeps each file's private helpers and constants out of the global scope. Registrations still happen at file-load time via the closures over `MY_APP`. Order matters within a load order, but State Street resolves components / methods live at render / event time, so you can override registrations from later files.\n\n---\n\n## The registry pattern — full reference\n\nThe registry style isn't part of State Street's core; it's a ~100-line boilerplate you copy into your project. It gives you:\n\n- **Late binding** — register components and methods after the page boots.\n- **Override semantics** — later registrations replace earlier ones (mods, themes, plugins).\n- **Multi-file structure** — each file owns its own slice of the app.\n\n### The boilerplate\n\n```js\n// my-app/core.js — load FIRST (after the State Street global), before anything else.\n(function () {\n  \"use strict\";\n\n  function deepMerge(target, src) {\n    for (const k in src) {\n      const sv = src[k];\n      const tv = target[k];\n      if (sv && typeof sv === \"object\" && !Array.isArray(sv)\n          && tv && typeof tv === \"object\" && !Array.isArray(tv)) {\n        deepMerge(tv, sv);\n      } else {\n        target[k] = sv;\n      }\n    }\n    return target;\n  }\n\n  const MY_APP = {\n    // ----- live registries (passed to `new State`) -----\n    State: window.State,\n    components: {},\n    methods: {},\n    helpers: {},\n    listeners: {},\n    startup: [],\n    dataExtensions: [],\n    baseDataFactory: null,\n    template: \"<AppRoot/>\",\n    app: null,\n\n    // ----- registration hooks -----\n    registerComponent(name, fn) {\n      if (this.components[name]) console.info(`[MY_APP] overriding component \"${name}\"`);\n      this.components[name] = fn;\n    },\n    registerComponents(obj) {\n      for (const k in obj) this.registerComponent(k, obj[k]);\n    },\n    registerMethod(name, fn) {\n      if (this.methods[name]) console.info(`[MY_APP] overriding method \"${name}\"`);\n      this.methods[name] = fn;\n    },\n    registerMethods(obj) {\n      for (const k in obj) this.registerMethod(k, obj[k]);\n    },\n    registerHelper(name, val) { this.helpers[name] = val; },\n    registerHelpers(obj) { for (const k in obj) this.helpers[k] = obj[k]; },\n\n    // External events (e.g. Tauri, WebSocket, EventTarget). Override-friendly.\n    registerListener(eventName, fn) {\n      if (this.listeners[eventName]) console.info(`[MY_APP] overriding listener \"${eventName}\"`);\n      this.listeners[eventName] = fn;\n    },\n\n    // Fire-once init run after boot() builds the app.\n    registerStartup(fn) { if (typeof fn === \"function\") this.startup.push(fn); },\n\n    // Initial state factory (lazy so it can read previously-registered helpers).\n    setBaseData(factory) { this.baseDataFactory = factory; },\n\n    // Mods append top-level state slices. Deep-merged into the factory's output.\n    extendData(ext) { this.dataExtensions.push(ext); },\n\n    // ----- boot: assemble + start State -----\n    boot() {\n      if (!this.State) {\n        throw new Error(\"[MY_APP] window.State missing — load state-street.global.js first\");\n      }\n      const data = this.baseDataFactory ? this.baseDataFactory() : {};\n      for (const ext of this.dataExtensions) {\n        const patch = typeof ext === \"function\" ? ext(data) : ext;\n        if (patch && typeof patch === \"object\") deepMerge(data, patch);\n      }\n      this.app = new this.State(this.template, data, this.components, this.methods);\n      // Wire your external event source here. Example for Tauri:\n      // for (const key in this.listeners) tauri.event.listen(key, this.listeners[key]);\n      for (const fn of this.startup) {\n        try { fn(); } catch (e) { console.error(\"[MY_APP] startup hook threw:\", e); }\n      }\n      return this.app;\n    },\n  };\n\n  window.MY_APP = MY_APP;\n})();\n```\n\n### Hook reference\n\n| Hook | Purpose |\n|---|---|\n| `setBaseData(factory)` | Register the initial state factory. Lazy — runs at `boot()` so it can read previously-registered helpers. |\n| `registerComponent(name, fn)` / `registerComponents(obj)` | Add to the components registry. Subsequent registrations of the same name override (with a console.info). |\n| `registerMethod(name, fn)` / `registerMethods(obj)` | Same shape for methods. |\n| `registerHelper(name, val)` / `registerHelpers(obj)` | Shared utility namespace any component or method can read off `MY_APP.helpers`. |\n| `registerListener(eventName, fn)` | Bind a non-DOM event handler (Tauri events, WebSocket messages, EventTarget…). Override-friendly. |\n| `registerStartup(fn)` | Fire-once init hook run after `boot()` builds the app and listeners are wired. |\n| `extendData(patch \\| (data) => patch)` | Mods append extra top-level state slices. Deep-merged into the factory's output. |\n| `boot()` | Assemble: run the data factory, apply data extensions, `new State(template, data, components, methods)`, wire listeners, run startup hooks. Returns the live `State` instance. |\n\n### Usage\n\n```js\n// base_data.js\nMY_APP.setBaseData(() => ({\n  title: \"My App\",\n  view: \"Home\",\n  user: null,\n}));\n\n// components/home.js\n(function () {\n  function Home({ state }) {\n    return `<h1>Hello, ${state.data.user?.name || \"stranger\"}!</h1>`;\n  }\n  MY_APP.registerComponents({ Home });\n})();\n\n// methods/auth.js\n(function () {\n  MY_APP.registerMethods({\n    logIn:  ({ state, name }) => { state.data.user = { name }; },\n    logOut: ({ state }) => { state.data.user = null; },\n  });\n})();\n\n// boot.js (last)\nMY_APP.boot();\n```\n\n### Mod / plugin override example\n\nOnce `MY_APP.boot()` has run, any subsequent `registerComponent` / `registerMethod` call replaces the previous registration. Because State Street resolves `state.components[name]` and `state.methods[name]` at render and event time, the override takes effect immediately:\n\n```js\n// mods/dark-theme.js — loaded after boot\nMY_APP.registerComponents({\n  Home: ({ state }) =>\n    `<h1 class=\"dark\">Hello, ${state.data.user?.name || \"stranger\"}!</h1>`,\n});\n```\n\nThe next state mutation triggers an update, the update loop re-resolves `state.components.Home`, and the new version runs. No reload required.\n\n---\n\n## Gotchas\n\nA short list of things this library's users have hit. Read once, save yourself an evening.\n\n### Top-level-key gating is the gating\n\n`state.data.user.age = 22` marks `user` dirty. Every component reading any part of `user` re-runs. There is no `user.age` granularity. If you want finer reactivity, split: `state.data.userName`, `state.data.userAge`. Most apps don't need to.\n\n### `:click=method()` requires parentheses\n\n`:click=method` is silently parsed as a regular HTML attribute. Always include the parens, even when there are no arguments.\n\n```js\n// ❌ Does nothing.\n`<button :click=submit>Save</button>`\n\n// ✅\n`<button :click=submit()>Save</button>`\n```\n\n### Don't spread the proxy in high-frequency listeners\n\nThe convenient `state.data.scene = { ...state.data.scene, x }` pattern can compound proxy layers on nested keys when called dozens or hundreds of times per second. Use [direct mutation](#2-direct-mutation-for-high-frequency-updates) for streams, animation frames, and per-token handlers. The spread pattern is fine for one-shot events (clicks, form submits, route changes).\n\n### Components may return multiple root elements\n\nA component can return any number of top-level nodes — `\"<p>hi</p><p>bye</p>\"` is fine. All of them become direct children of the parent, bracketed by the component's comment markers, and are re-rendered together as a range. Each top-level element must still be well-formed (its own children form a single tree).\n\n### State setter replaces the whole tree\n\n`state.data = newObject` is supported but marks **every** top-level key in `newObject` dirty and re-renders the whole app. Use it for resets / hot reloads, not for normal updates.\n\n### Methods always need `()` even with `state`-only args\n\nState Street injects `state` and `event` into every method call automatically — but only when the directive uses the call syntax. `:click=method` is not a call.\n\n---\n\n## Tooling\n\n### VSCode syntax highlighting\n\nThere's an official VSCode plugin for State Street templates:\n\n- [**State Street SST**](https://marketplace.visualstudio.com/items?itemName=beetnick82.vscode-sst)\n\nAfter installing, any TypeScript or JavaScript files with the sub-extension `.sst` (e.g. `counter.sst.js`, `home.sst.ts`) have their template-literal strings treated as State Street templates, which gives you HTML highlighting + completion inside the templates.\n\n### Recommended file structure (registry style)\n\n```\nsrc/\n  core.js              ← registry boilerplate\n  base_data.js         ← setBaseData(...)\n  views/               ← *.sst.js, one component (or component group) per file\n  methods/             ← registerMethods(...)\n  listeners/           ← registerListener(...) for external events\n  helpers/             ← registerHelpers(...)\n  boot.js              ← MY_APP.boot()\n```\n\nIn one Tauri narrative game running State Street, this layout currently runs ~21 view files, ~6 methods/listeners/helpers files, and ~37 JS files total — bootstrapping happens in under 50 ms.\n\n---\n\n## FAQ\n\n**Why no JSX?** Plain template strings work in any editor, in any test runner, with no build step. JSX needs a transpiler. This is a tradeoff State Street picks.\n\n**Why no virtual DOM?** A virtual DOM is *overhead* other frameworks adopt to make coarse \"re-render the whole tree on any change\" tolerable — diffing a cheap in-memory tree beats blindly re-touching the real DOM. State Street is fine-grained instead of coarse, so it doesn't need one:\n\n- A `{{ }}` **State Binding** updates its text/attribute node **in place** — no component re-run, no tree, no diff (the same approach as Solid/Svelte, and less work than a vDOM diff).\n- A component re-runs **only** when a top-level key it read goes dirty (dep gating), and if its new output is byte-identical the DOM is left untouched.\n\nThe one honest tradeoff: when a component *does* re-render, its whole rendered range is rebuilt and swapped in place rather than diffed element-by-element — so keep components small and put frequently-changing values in State Bindings, and there's nothing a diff engine would have saved. (Reusable elements — inputs, canvas, media — are transplanted across a re-render, not recreated.)\n\n**Can I use TypeScript?** Yes — the source is TypeScript. The reactive proxy types as `any` (a proxy fundamentally can't be type-checked at compile time without significant ceremony). Wrap your own typed accessors if you want stricter types in your app.\n\n**How big is it?** Small enough that it's never the reason your bundle is big. Zero runtime dependencies.\n\n**Does it work in Node?** Not directly — it touches `document.body` and `requestAnimationFrame`. For testing components in Node, use jsdom or run in a browser. The reactive proxy logic itself is environment-agnostic.\n\n**Can I render to a specific container instead of `document.body`?** Yes — `document.body` is just the default. Pass the `mountTarget` option (an `Element` or a CSS-selector string) to mount anywhere, run **multiple States** on one page, or mount one State into an element owned by another (nested States, auto-preserved). See [Mounting & lifecycle](#mounting--lifecycle) and [Nested States](#nested-states).\n\n**What if I want server-side rendering?** State Street is a runtime reactivity layer — not currently aimed at SSR. Component functions return strings, so you could call them server-side to get HTML, but you'd lose reactivity at runtime.\n\n---\n\n## License\n\nISC.\n\n---\n\n*Found a bug? Have a use case the docs don't cover? Open an issue on the [GitHub repo](https://github.com/Joshabracks/State-Street) or [join the Discord](https://discord.gg/a7AycPG2).*\n","readmeFilename":"README.md"}