{"_id":"@duyquangnvx/spindle","_rev":"29-760e2363cc5f35f36cba651b98afa066","name":"@duyquangnvx/spindle","dist-tags":{"latest":"2.0.0-beta.13"},"versions":{"1.0.0-beta.1":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.1","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.1","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"7659611f12a6898adb8587cb79a5d3b6ce5faed4","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.1.tgz","fileCount":34,"integrity":"sha512-zbL9g7RwJyvOFexlKLcSDT4LE6ezBJsYoOO0Z6l30OEOh0HY1RKTreqCq7rjxsw3ssrfzgREhUh+d7Jnm6DK2Q==","signatures":[{"sig":"MEUCIEyyVgswdz17d+/4yLH5MCmEwnHz9hsw+N/Gz0MmkbveAiEA9fFsViViW9aALhYIebUX3Yis7GIU7iW5GCrH+oPRLYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":447240},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}},"./renderer":{"import":{"types":"./dist/renderer/index.d.mts","default":"./dist/renderer/index.mjs"},"require":{"types":"./dist/renderer/index.d.cts","default":"./dist/renderer/index.cjs"}}},"gitHead":"84b95c10e908f0631e2dbbaa0038f4533138e868","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.1_1771767107715_0.7595204531110502","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.2":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.2","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.2","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"11a19e8689c049acfdd9fe95409ff730c3a89198","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.2.tgz","fileCount":26,"integrity":"sha512-hSTZLYWYGC5rlaFdyAZ7Nhe0NLrYF1uyqUKfzMT/FNHe2D4fUepjfJZ9ddJKsfjqz5gCIJCRF5NEEHhOPpmYlQ==","signatures":[{"sig":"MEQCIEYNaueVi0FvQLjA3M973nN20bimNP3+gzipWRJVIheIAiAvwvdgvilXUgBnBXMEa5YaOGelfXoE0p0CuBPybM5KOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281679},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"e3688e5bccdebdfa9b3dc791569ea313e93567f4","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.2_1771781441135_0.4601234643028471","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.3":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.3","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.3","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"d99cd60c399a6ad56aa86ffb8a87354c9a3b3194","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.3.tgz","fileCount":38,"integrity":"sha512-su/piN92pV3NkoEUH+XsIu11bk71Hoor3ruYDE0iBSDstOgNzFLAmhT+Bt2jUMkQeIspIJoOOMYonpkq4wEZIA==","signatures":[{"sig":"MEQCIG5+9yn3eOixnTRlthpkChJCdXo0plTIc1WvesmfIjo0AiBcZjfiTTSkMI73cTQO/pYa6xBEVVZWE4Kfu80uBpOfCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":455072},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"c09fe5094b0e2a61215efe824ae28b97f98b6c77","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.3_1771824482676_0.5684636903743516","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.4":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.4","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.4","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"0d752ba95b38306cc4adae8dba9aae812cab6be4","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.4.tgz","fileCount":38,"integrity":"sha512-pldn9xJq/HSXzih37hZ+DNXAAF7iRrqs5/zjPMCZWjL3niwgmAikjjwDRtZZGY70qvYI/wVTr+sLLCMiIX8a5w==","signatures":[{"sig":"MEQCIBoEUA00IpXT+0cEMpT/jG+c0Kexh3REuSGooX4JaWskAiA8uMaagUlKgdgLs2Jc2fnHqaIpisQV+5kMi/k/mwIEWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":456072},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"b49f576f682574141930ffe5215ef5cea9ed39a3","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.4_1771828985488_0.9267694725962561","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.5":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.5","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.5","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"c017039051a4925dfd76ee43c40799fb66957757","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.5.tgz","fileCount":38,"integrity":"sha512-SlNquKlRllw1xkhn+F62ePRMuPo7xGkMupGvgmNnJd5ZlKyIkuNlZ5ICCj239ixWdclvkjF67pVwgZkyBRVwZQ==","signatures":[{"sig":"MEUCIFLQTTsMy4+a/kzYJn5p1VzdidHJVTP70MzKgkMwkTySAiEA5t1AKJw/SL3blQRiyH7lRzi6gDo533dpTXe0TMSgN6g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459844},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"2903afed400c17732e93b3a7acbd35b33291f0fd","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.5_1771830089531_0.13328776017443955","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.6":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.6","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.6","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"271d225c7c0266075b46b42708a2582000778806","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.6.tgz","fileCount":38,"integrity":"sha512-8mMEtZj+6V5kBgNVStwF79YluNxwRznCN2GkIrlTxiM13wf6XzukpdIwRBfH8qRlglM7rmSb5N/lkm5cyOK9ZQ==","signatures":[{"sig":"MEQCIFql1lg5cFi5ghhZWvFy1Nz2fNzSNHE9h5t10M9Sh0hvAiAPprlZZAJA3cQEXIYPB/gV8Uwm6GvCNuyYBxwNtHkQuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459560},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"2903afed400c17732e93b3a7acbd35b33291f0fd","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.6_1771831520060_0.15497081951472302","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.7":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.7","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.7","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"769510754b3a5cea14d82538d3d1871ac4313a9d","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.7.tgz","fileCount":38,"integrity":"sha512-IKumw4FgTJ/X1EbuIE1+LbDaqspUVtv2znvhJPcj8oi8WagnvmCt17pE/kwNxIZ5Fls1VlYa4MsfmMrxoAD7JQ==","signatures":[{"sig":"MEYCIQDP5gtw+uP8cBXNgdYklrmGtWQPlFxpPS+g4gw1djVZMQIhAJ2BCvqZxYJQoMq7g/AkiB9FGj3scrLeGcAF2Q40AtCk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":469246},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"44629f9d73a792d61f6fe196e37bee650df4a776","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.7_1771848920198_0.6901137594929196","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.8":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.8","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.8","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"da041624995b95cf1b1e0fab99ee67ca8ed144ff","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.8.tgz","fileCount":38,"integrity":"sha512-I18dIzCwWZDXSY1QATrCkEtjud8xg88h3B38qQkI6zNHu7HqS9+hpVFx4f7oCR5UMVB+ByWGfPnHFcSPTQxtPg==","signatures":[{"sig":"MEYCIQDY+5fSPbfin4fkkKw+ZiOTAFeP2xDUVXOzcCZl/Z26/QIhAIJUjYitQIowNRsBj1EHQpaK1iTmFDrxNOsaK0IPSwCU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":472248},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"6443b4403b29073714297cb7dd3dd2a66b136877","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.8_1771853148177_0.9324016773069099","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.9":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.9","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.9","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"ed9f4aa58d50f40805a469a9da766474e074c546","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.9.tgz","fileCount":38,"integrity":"sha512-prs/DPvZy7cvUN6Z5Ge6+ciVcxC0SGjyDwKOY72iWn9QurutTwKEXrxmXR+ZCNz0aQbPwoUNvpMHs4d12p7riQ==","signatures":[{"sig":"MEUCIQDxAl5ZRQQagK3H8v3J8IFHRWtigaob+ILYxYeXCy40qAIgMeZHunIdkkn2OgQBdnTGIvV7wnBb7Nm6iZWBcFNQoXg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":473198},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"c996dccc33c66d478a7325af51aa00ca93fd5a4e","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.9_1771854576920_0.25261901141542675","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.10":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.10","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.10","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"37f3b7697544707d64d7351fc60b49912bed317f","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.10.tgz","fileCount":38,"integrity":"sha512-ev2Hvm9p3htizqoI6BERZnDoEqV814KFSKheRwcI2kyEUSJRPNdWTAl6Zo1CUFknTB1FsE+YMmUaLE+QMI/haw==","signatures":[{"sig":"MEQCICqSbCEDEfV9UJeqPVX6mArSlSAR1o/X0USOB40zjZiJAiBV1LJ26Vm0wpwaapkSIunXtriraQDNtQR4pYGqTS72qg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":475189},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"524ef7cadf4f0bc803e0fc4cec4183c739989966","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.10_1771898413640_0.0892291305267714","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.11":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.11","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.11","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"0394647d289d304c29755420c24531c17a64845f","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.11.tgz","fileCount":38,"integrity":"sha512-lCW0iBSDUeQ/pciyNqMEl37YbepPtM4MVCUfrNmju6298r+d7oK6iBB6GZILabderga1K3qu1tjOcstG3LRKFg==","signatures":[{"sig":"MEUCIBNzWAhPFNTLvJNfbndlhhEkvuK8SSmSrXAwlfPkYS/mAiEA4meYRnXvGCLOGUSO7TdY9guPEglEWaEvZvEEH32C5qc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":477943},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"524ef7cadf4f0bc803e0fc4cec4183c739989966","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.11_1771918167477_0.31310545613180674","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.12":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.12","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.12","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"857afa2c9f02f9aaffc0407d416590e7826046a1","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.12.tgz","fileCount":38,"integrity":"sha512-YZzIfyaJmrZQ3BgA9gUAiqKrRZZM8uP/d1RiJdxwne3dMAY8Ea1xyiUwgDaRUtXzZgV5OHIrS2AQDPA5cOozdg==","signatures":[{"sig":"MEYCIQDVaJEx6yH6KfK6tUDaDlQNAN6MBRacobI48HYU+h6YBwIhAJSkTOJ+Jrjtu/CStrhh/N0vPtOwXc83GCrMfWjIoWhX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":479419},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"524ef7cadf4f0bc803e0fc4cec4183c739989966","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.12_1771918638684_0.2523856577754764","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.13":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.13","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.13","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"ddcc5e8ccc93774b8536d50e48604c844fafbc23","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.13.tgz","fileCount":38,"integrity":"sha512-8CzopWzbtYL3trrPN3sIaimcsmnoL/oJJTFnnAyJMZoGn0TqznAA9iDn2dL852sMs9nfJRcH1CVd1ZRfn962QQ==","signatures":[{"sig":"MEUCIC/On+68TlUqzWbzGNQD0g65jLY8u8K/FVI3cK7xC7cvAiEA/WVn/hj4B1QU9tFGTWeuRvBD2s/dxJj5xgwqemZNQmU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":479437},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"615df8430052b543217d7da61685d047adc15cae","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.13_1771933560484_0.672686223153451","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.14":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.14","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.14","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"21520f714b98a34fe5e24bef3fe603e3862aa231","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.14.tgz","fileCount":38,"integrity":"sha512-7mfkRAwXZjcRXH+ce4ODOSJC9mNLuF8jOAlDp2AZykVlM49XIqB225rndl3HhuIDI69Uz/IrqR8/r6Yp1IFLsw==","signatures":[{"sig":"MEYCIQDfPwP/nOcLvl1A94mfSe8ot5ZosuRrpVyQWHCakR4N6wIhALG8owH5bi5CRSk8UtJHzpgDkUUScht+wIjztpJSaC6A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":482417},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"615df8430052b543217d7da61685d047adc15cae","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.14_1771936084338_0.4942887358796295","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.15":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.15","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.15","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"0124d23223218af11946ba8003b78672a2fb6a41","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.15.tgz","fileCount":38,"integrity":"sha512-X5dyvL9d3gBQz4T74DboesXQVRAqntvgz6y+C/nZMAT9hlow+16M0H6Yn9W7YHIjbd6LAG7QWfI7wCiUy+RYUg==","signatures":[{"sig":"MEUCIQDlaTnUXpWb+rtHd0dFMBQkSYGgG4YAG9uys9VzQjBo4wIgWaNzKqXims8F+6uBpzlK5gpNlEWBkYBSwrrx09ktzRk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":480329},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"a0a22ccf92a2943106b0f46f2699b80052254995","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.15_1771939206316_0.10871831986045599","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-beta.16":{"name":"@duyquangnvx/spindle","version":"1.0.0-beta.16","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@1.0.0-beta.16","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"5d2ec0bf77a3fff94be998017493b673ec263c01","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-1.0.0-beta.16.tgz","fileCount":38,"integrity":"sha512-UVGHbbkFxzDzTxO5gBhvV3YBIfZNgBUPdMfG4lZcdY+Dyf6dly7p+Qqa3smbd1t59xSig9OHumTXWyb9iIhYCw==","signatures":[{"sig":"MEUCIGl6e5y0/8lt4/cCKMSr40NuYDJvhl7mJfkrwvqt3HgjAiEAnw+nCWsiR27W4AcjmPKkuwSc9sE7h5rfk6xXeVLddC8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":481093},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./views":{"import":{"types":"./dist/views/index.d.mts","default":"./dist/views/index.mjs"},"require":{"types":"./dist/views/index.d.cts","default":"./dist/views/index.cjs"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.cts","default":"./dist/testing/index.cjs"}}},"gitHead":"659d7ca9700acaf715fcce47c9820dcd01617fd0","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.2","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_1.0.0-beta.16_1771940450986_0.02931874820449898","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.0":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.0","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.0","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"5a24ad73088d440b1d1b3816ab3d4180cb00efb9","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.0.tgz","fileCount":22,"integrity":"sha512-IDoWHdz/QIppCrfeRAuNfGV/SbGjAIugvxocOMDiWi36nG6Yyjw+VUkJZeIs1Bs2hMfJpr+XNnPufjMvP6/8Uw==","signatures":[{"sig":"MEUCIC5YqwFXuGlSGfwaUQgXRtlCh4xClwVRrCsFWyzE7BOzAiEAjQyW5S7K8yKWpiXYwtg+O0X80uU/WLrX/EuqhEl87TI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":320207},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"e2bfd2318175363e25af22a00cf256569052df3f","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.0_1772215720013_0.5314154441921619","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.1":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.1","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.1","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"67df11b3ac2b19f08d13298f7f53f24c4fc76865","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.1.tgz","fileCount":22,"integrity":"sha512-OVmk5X8FdFUSFfLyn7ACju+vhj0kwANcYgnrtSFJKE2WjpWp8Qex083XxoSdfMD5+fECi+up19yntJfmx/oU2A==","signatures":[{"sig":"MEUCIQD5i5s4SuxHF214qkPkmnrohQjvVeX4RO6PrudUPDvpeAIgKvVBosfw97sbIlfy6f544iYtxr+aB5xF/4YHnrl+07c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":320579},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"2ddade8cf981392d210adbc7559e7d54c0b714fd","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.1_1772269130763_0.1601324922954488","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.2":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.2","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.2","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"75ce0f99f18c88695d4bc2880727521934f21f58","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.2.tgz","fileCount":22,"integrity":"sha512-ri2YT0Ilb7+Z/4DYgUiasCbfQJ8hIAnjcz2KrATrQa4DzYT03RZvvY315lFHk4SnyP9sO765y5822XRb69Tfsg==","signatures":[{"sig":"MEUCICCLWH14s806X0NhQWnQId0sDzp1IxROBx9EaWiqLNC1AiEA+gjKsYyRCVFpfmxYeytSHMW+jpUsIMwl9jnitLNnHrE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":321039},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"2ddade8cf981392d210adbc7559e7d54c0b714fd","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.2_1772270711365_0.7454178886124367","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.3":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.3","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.3","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"4a53fc8f218c624c59b19daaf43dffe96c7c3c49","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.3.tgz","fileCount":22,"integrity":"sha512-xcLhcSRHlSKISBTxfTqEI37CFR0oEcukDSwfekGtDp1AwuEa9wGgbBCRXVNfmGqiSvP8/dcrHUW4ys68LWuR4g==","signatures":[{"sig":"MEYCIQDukaprHSr48XO0x6Am3I3RFix1sG7lBLgSbxj0bGZw7gIhANsBRKbvtM91CnjFteyto+Y5M8NdRoKeD6WMBS0iMkzg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":321457},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"2ddade8cf981392d210adbc7559e7d54c0b714fd","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.3_1772270879016_0.11827569750522327","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.4":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.4","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.4","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"4363634310670c563c455c18e30e1b21ba7b250e","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.4.tgz","fileCount":22,"integrity":"sha512-Mq9BLgm5LsKzFFd5G8tMUyIhcy1t1noEod2Kr+CXuWK5KVtwkwHQ2MCL/Z4UjCgqoJE1FGv32o3KEtWoqH3PpA==","signatures":[{"sig":"MEQCICNkN9lI12RII6jlvEJMbJZPWAfcQ1hwn8SHn1VcIAZjAiBPkIKdN1xma22Q0kBNlJZ8ldgcRfdCypOAwBnk/nV53Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":321457},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"2ddade8cf981392d210adbc7559e7d54c0b714fd","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.4_1772271430904_0.8531881342598939","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.6":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.6","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.6","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"251d52fc669fb1f368ab0b775f6d89aaa6e695da","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.6.tgz","fileCount":22,"integrity":"sha512-WOek7udbFBIBzPobo/JKcbNw7q4t6d/XhY/Zd0IgKv8yaa747E+1QoWh1liAJ7K3a/PfPvQjdIJjblnWo4fYcg==","signatures":[{"sig":"MEUCIDKshFM+xAsHA5Io0EL0xdFeclQ9YuEth3t2VLcYXp8UAiEAk9ARy0k/f3uTUs+FhQsZ7+NulDGACePujnRREwIsmDo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":369745},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"8bcd29b456c17556b3afaee21a41d4e2edbe9675","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.6_1772274232751_0.4793217895906441","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.7":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.7","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.7","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"d6e2806499e7667ba498deb672dd6702f837b165","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.7.tgz","fileCount":22,"integrity":"sha512-aiRFFkGpJuTqaua/fYiTPczGYfC79utF5QdagYZ9KUKaHA0GgJ2D1zEIi0sLEBC+qY+grZVDWmFMOiXgTlaM1w==","signatures":[{"sig":"MEUCIQCXyo68EXyou4mmXB8H5X6F/Gy0BPfpeuZ6vwj6Ig0w8AIgCJ8HMua7DEo5iIbaDWJsXBXY6yUljm2eYUtySPen37w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371717},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"760f9e4f8eee42e9a8aa075aeef029f378f599d5","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.7_1772276624553_0.28542799248741124","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.8":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.8","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.8","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"7aef96925f284df8e56490bd4ca19fa451a99035","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.8.tgz","fileCount":22,"integrity":"sha512-nCpQLkOntYTqAybPjHhKYi/tqDJyNZIQJjWrmQnTas2y1nNDxreOphEx8CuNw9adFIKSyUMfQjumwWpbDVpELg==","signatures":[{"sig":"MEUCIB6gdHJT34vjqgpogWJH37ee0tNa+5bMm+SQTDX3VPMQAiEAk4574XVICTZ3kxEMM83wAtaziMrohinQwiDhMP62XCU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371781},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"a29442fae07d34fe2607d98b2b48a3d1662fbf55","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.8_1772283757961_0.4523063559579148","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.9":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.9","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.9","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"a78fe4f19b71970701327f4f480a80496341f8b8","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.9.tgz","fileCount":22,"integrity":"sha512-1yV1YH2d41ZhXZyL3jBTsnerEbfOStTDcvKlgK1H5w0J46CuiWsQF56FBHyCaImDVKaukJyiqkIgdyTUhEbOqg==","signatures":[{"sig":"MEUCIA1jVoUx+RXbT/6+1y+BaTeDoKkNVKS8rPARWVFSPOKpAiEAzKLAenFcwB3Udsb7n0yVBKto5yxstXEt9UkZ+f8ZsSo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371811},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"194446e476b78d27eaeb15d37ffb7a8027df23b5","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.9_1772355432531_0.48366453578918756","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.10":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.10","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.10","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"b47c37084c12c6d931ac357493c1123f2eb3f915","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.10.tgz","fileCount":22,"integrity":"sha512-0a4h4ANAHOPdcHPK1QtHSyZnZFrfCChY93AKVVDuECnXR3UqbGp/ims09QkWa5pVzFDsORJGWYbR1dIeK8M7Zw==","signatures":[{"sig":"MEUCIGTDD9S8J1QngRBICxmUz58JhsDIwW7B+nW2SS5Hy8M6AiEAzOkvYpPlam+aVyxnhNfWQF8a/Itlc+mdQNUNp1pb2Z4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":374482},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"afd46e23000eb9902eea196e633e82ae981d2990","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.10_1772357150100_0.734088094266893","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.11":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.11","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.11","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"e9151977c9b2c08dd12c93e542ad8e6aa4b97d07","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.11.tgz","fileCount":22,"integrity":"sha512-ipEpCiVgAxNKN5XLbKCf1MklkIT5mq7GuPqzLK19Wc5wwDB0g0DMFDYXgCmD4csGC0iHD3wpvPUgeWLhByyikQ==","signatures":[{"sig":"MEUCIB8G2HdH5J0IJ978cibWuC0ZeqEimbNpro+KbVO/4+RIAiEA99LSAFCXu+A43M8WzL7F5Uf+XRmRGhPSrH0nxgTNVYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":374482},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"afd46e23000eb9902eea196e633e82ae981d2990","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.11_1772357406972_0.3654650075424586","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.12":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.12","keywords":["slot","game","engine"],"license":"UNLICENSED","_id":"@duyquangnvx/spindle@2.0.0-beta.12","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"dist":{"shasum":"8c7500188549fbe1b6c240383a0e130b8e707da2","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.12.tgz","fileCount":22,"integrity":"sha512-RKjyMhpAqrJPtDbInqrPJpmnJm0UOdxCHGeCK4FYOZ73+P3YUq0pmgAO1lKJdbQAxf0VOnxexyxY3S/ohstlOA==","signatures":[{"sig":"MEUCIQDCFrDNRfmt5+XK3Xp0Nd8cOZZO3SpJ/n4JR1AGDHkYaQIgIQHRZvN+MACm0q/HKSM5JnE5us49lIeoax/SG/mcong=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":374623},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"gitHead":"afd46e23000eb9902eea196e633e82ae981d2990","scripts":{"dev":"tsdown --watch","lint":"biome check .","test":"vitest run","build":"tsdown","clean":"rm -rf dist","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"_npmVersion":"10.9.4","description":"Headless TypeScript slot engine","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.20.3","vitest":"^4.0.18","typescript":"^5.7.0","@biomejs/biome":"^1.9.0"},"_npmOperationalInternal":{"tmp":"tmp/spindle_2.0.0-beta.12_1772357654934_0.8370185371140542","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.13":{"name":"@duyquangnvx/spindle","version":"2.0.0-beta.13","description":"Headless TypeScript slot engine","type":"module","main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.mts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./presenter":{"import":{"types":"./dist/presenter/index.d.mts","default":"./dist/presenter/index.mjs"},"require":{"types":"./dist/presenter/index.d.cts","default":"./dist/presenter/index.cjs"}}},"scripts":{"build":"tsdown","dev":"tsdown --watch","lint":"biome check .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","clean":"rm -rf dist","prepublishOnly":"npm run build"},"keywords":["slot","game","engine"],"license":"UNLICENSED","devDependencies":{"@biomejs/biome":"^1.9.0","tsdown":"^0.20.3","typescript":"^5.7.0","vitest":"^4.0.18"},"_id":"@duyquangnvx/spindle@2.0.0-beta.13","gitHead":"9d9dd3dbc1108de1206a238108f7cad7642b287c","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-5xewT30Pn311u0mBNtHngADi39a0J8S2CtUzrisE6/vBj/UgiObOrc2FZWIsq/VWJMzifbVaUsk9lw2e8N6Ukw==","shasum":"4f175a878fb534dfd0f1b07f1afbf184dc0b2497","tarball":"https://registry.npmjs.org/@duyquangnvx/spindle/-/spindle-2.0.0-beta.13.tgz","fileCount":22,"unpackedSize":375169,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDxlomKGlJAjfN+kx18Qq61FNEdZ6k2IDxPD7WfCRJs0wIhAL6tZdN7vFtt91afwvVNcvkLHf325/0PJjx8tnj+mdF9"}]},"_npmUser":{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"},"directories":{},"maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spindle_2.0.0-beta.13_1772362256618_0.2475891843841791"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-22T13:31:47.603Z","modified":"2026-03-01T10:50:56.866Z","1.0.0-beta.1":"2026-02-22T13:31:47.873Z","1.0.0-beta.2":"2026-02-22T17:30:41.292Z","1.0.0-beta.3":"2026-02-23T05:28:02.835Z","1.0.0-beta.4":"2026-02-23T06:43:05.645Z","1.0.0-beta.5":"2026-02-23T07:01:29.765Z","1.0.0-beta.6":"2026-02-23T07:25:20.220Z","1.0.0-beta.7":"2026-02-23T12:15:20.368Z","1.0.0-beta.8":"2026-02-23T13:25:48.324Z","1.0.0-beta.9":"2026-02-23T13:49:37.069Z","1.0.0-beta.10":"2026-02-24T02:00:13.807Z","1.0.0-beta.11":"2026-02-24T07:29:27.709Z","1.0.0-beta.12":"2026-02-24T07:37:18.870Z","1.0.0-beta.13":"2026-02-24T11:46:00.649Z","1.0.0-beta.14":"2026-02-24T12:28:04.494Z","1.0.0-beta.15":"2026-02-24T13:20:06.467Z","1.0.0-beta.16":"2026-02-24T13:40:51.133Z","2.0.0-beta.0":"2026-02-27T18:08:40.172Z","2.0.0-beta.1":"2026-02-28T08:58:50.927Z","2.0.0-beta.2":"2026-02-28T09:25:11.571Z","2.0.0-beta.3":"2026-02-28T09:27:59.187Z","2.0.0-beta.4":"2026-02-28T09:37:11.076Z","2.0.0-beta.6":"2026-02-28T10:23:52.907Z","2.0.0-beta.7":"2026-02-28T11:03:44.692Z","2.0.0-beta.8":"2026-02-28T13:02:38.107Z","2.0.0-beta.9":"2026-03-01T08:57:12.700Z","2.0.0-beta.10":"2026-03-01T09:25:50.260Z","2.0.0-beta.11":"2026-03-01T09:30:07.101Z","2.0.0-beta.12":"2026-03-01T09:34:15.091Z","2.0.0-beta.13":"2026-03-01T10:50:56.763Z"},"license":"UNLICENSED","keywords":["slot","game","engine"],"description":"Headless TypeScript slot engine","maintainers":[{"name":"duyquangnvx","email":"duyquangnvx@gmail.com"}],"readme":"# Spindle\r\n\r\nHeadless TypeScript slot game engine. Zero runtime dependencies.\r\n\r\nSpindle orchestrates the entire spin lifecycle of a slot game — reels, modifiers, wins, cascades, features — without rendering anything. You implement async delegate callbacks; Spindle calls them in the right order and waits for your animations to finish.\r\n\r\n## Install\r\n\r\n```sh\r\nnpm install @duyquangnvx/spindle\r\n```\r\n\r\nSubpath exports:\r\n\r\n```ts\r\nimport { createSpindle } from \"@duyquangnvx/spindle\";             // orchestrator\r\nimport { SlotPresenter } from \"@duyquangnvx/spindle/presenter\";   // presenter\r\n```\r\n\r\n## Quick Start\r\n\r\n```ts\r\nimport { createSpindle } from \"@duyquangnvx/spindle\";\r\nimport type { SpindleDelegate, SpinResult } from \"@duyquangnvx/spindle\";\r\n\r\nconst delegate: SpindleDelegate = {\r\n  // Required — pull spin data from your server\r\n  async requestSpinResult({ context }) {\r\n    const res = await fetch(\"/api/spin\", { method: \"POST\", body: JSON.stringify(context) });\r\n    return res.json() as Promise<SpinResult>;\r\n  },\r\n\r\n  // Required — lifecycle hooks\r\n  async onSpinStart({ mode }) { /* disable buttons, dim UI */ },\r\n  async onSpinEnd({ totalWin, mode }) { /* show total, re-enable UI */ },\r\n\r\n  // Optional — implement what your game needs\r\n  async onReelStop({ col, symbols }) { /* animate reel stopping */ },\r\n  async presentWin({ win, winIndex, runningSpinWin }) { /* highlight win, update counter */ },\r\n  async onModifierApply({ modifier }) { /* animate wild expansion, symbol transform, etc. */ },\r\n  async onBigWin({ tier, amount }) { /* big win celebration */ },\r\n};\r\n\r\nconst spindle = createSpindle(delegate);\r\nconst outcome = await spindle.spin();\r\n// → { totalWin, spinWin, featureWin, mechanicWin }\r\n```\r\n\r\n## How It Works\r\n\r\nSpindle is a **presentation orchestrator**. Your server computes the result; Spindle drives the visual flow:\r\n\r\n```\r\nspindle.spin()\r\n  │\r\n  ├── onSpinStart()\r\n  ├── requestSpinResult()              ← you call your server here\r\n  ├── Pipeline (per phase):\r\n  │     ├── onReelStop() × N           ← one per column\r\n  │     ├── onModifierApply() × N      ← expanding wilds, symbol transforms, etc.\r\n  │     ├── presentWin() × N          ← one per win, with running totals\r\n  │     └── Cascade loop:\r\n  │           ├── onCascadeDestroy()\r\n  │           └── onCascadeDrop()\r\n  ├── onBigWin()                       ← if bigWinTier present\r\n  ├── onJackpotTrigger()               ← if jackpot present\r\n  ├── Feature transition:              ← if transition present\r\n  │     ├── onFeatureStart()\r\n  │     ├── mode.run() (free spins / hold & spin loop)\r\n  │     └── onFeatureEnd()\r\n  ├── Side mechanic:                   ← if sideMechanic present\r\n  │     └── gamble / pick bonus / wheel bonus\r\n  └── onSpinEnd({ totalWin, spinWin, featureWin, mechanicWin })\r\n```\r\n\r\nEvery delegate method returns `Promise<void>`. Spindle `await`s each one — you control timing completely.\r\n\r\n## Architecture\r\n\r\n### Data-Driven Design\r\n\r\n`SpinResult` is the single runtime input. **Delegate method presence** enables features:\r\n\r\n| Data in SpinResult | Delegate method | What happens |\r\n|---|---|---|\r\n| `phases[].wins` | `presentWin` | Per-win highlight + running total |\r\n| `phases[].modifiers` | `onModifierApply` | Modifier animation |\r\n| `phases[].cascade` | `onCascadeDestroy` + `onCascadeDrop` | Cascade sequence |\r\n| `bigWinTier` | `onBigWin` | Big win celebration |\r\n| `jackpot` | `onJackpotTrigger` | Jackpot celebration |\r\n| `transition` (to: `\"free\"`) | `onFreeGameEnter` + `FreeGameDelegate` | Free spins loop |\r\n| `transition` (to: `\"holdAndSpin\"`) | `onHoldAndSpinEnter` + `HoldAndSpinDelegate` | Hold & Spin loop |\r\n| `sideMechanic` (type: `\"gamble\"`) | `GambleDelegate` | Gamble loop |\r\n| `sideMechanic` (type: `\"pick\"`) | `PickBonusDelegate` | Pick bonus |\r\n| `sideMechanic` (type: `\"wheel\"`) | `WheelBonusDelegate` | Wheel bonus |\r\n\r\nIf data is present but the delegate method is missing, the step is **silently skipped**.\r\n\r\n### Delegate Conventions\r\n\r\n| Prefix | Direction | Purpose | Returns |\r\n|---|---|---|---|\r\n| `request*` | Engine ← Consumer | Pull data (server call, player choice) | `Promise<T>` |\r\n| `on*` | Engine → Consumer | Lifecycle / event notification | `Promise<void>` |\r\n| `present*` | Engine → Consumer | Present a single visual element | `Promise<void>` |\r\n\r\nAll callbacks take **1 data object argument** — extensible without breaking consumers.\r\n\r\n### SpinResult\r\n\r\nThe server contract — everything Spindle needs to drive presentation:\r\n\r\n```ts\r\ninterface SpinResult {\r\n  phases: Phase[];                // grid states (cascade = multiple phases)\r\n  transition?: ModeTransition;    // feature trigger (free spins, hold & spin)\r\n  sideMechanic?: SideMechanicTrigger; // gamble, pick bonus, wheel bonus\r\n  jackpot?: JackpotResult;\r\n  bigWinTier?: string;\r\n  retrigger?: { addedSpins: number };\r\n  gambleAvailable?: boolean;\r\n  totalWin: number;\r\n}\r\n```\r\n\r\nEach `Phase` contains:\r\n\r\n```ts\r\ninterface Phase {\r\n  grid: SymbolGrid;            // reel × row symbol array\r\n  modifiers?: GridModifier[];  // randomWild, expandingWild, symbolTransform, stickyWild, walkingWild\r\n  wins: WinResult[];           // payline, ways, cluster, scatter\r\n  phaseWin: number;\r\n  multiplier?: number;\r\n  cascade?: CascadeInfo;       // destroy positions + drops\r\n}\r\n```\r\n\r\n### SpinOutcome\r\n\r\nReturned by `spin()`, `buyFeature()`, and `resumeFeature()`:\r\n\r\n```ts\r\ninterface SpinOutcome {\r\n  totalWin: number;     // spinWin + featureWin + mechanicWin\r\n  spinWin: number;      // from pipeline phases\r\n  featureWin: number;   // from feature mode (free spins / hold & spin)\r\n  mechanicWin: number;  // delta from side mechanic (gamble/pick/wheel)\r\n}\r\n```\r\n\r\n## API\r\n\r\n### `createSpindle(delegate): Spindle`\r\n\r\nFactory function. Validates delegate has required methods. No config needed — behavior is driven entirely by `SpinResult` data + delegate method presence.\r\n\r\n### `spindle.spin(): Promise<SpinOutcome>`\r\n\r\nRun a full base spin cycle.\r\n\r\n### `spindle.buyFeature(featureType): Promise<SpinOutcome>`\r\n\r\nBuy direct entry into a feature mode. The returned `SpinResult` must contain a `transition`.\r\n\r\n### `spindle.resumeFeature(transition): Promise<SpinOutcome>`\r\n\r\nResume a previously interrupted feature (e.g., after app reload).\r\n\r\n### `spindle.isSpinning: boolean`\r\n\r\nConcurrent spin protection. `spin()`, `buyFeature()`, and `resumeFeature()` share the same lock.\r\n\r\n### `spindle.mode: ModeManager`\r\n\r\n```ts\r\ninterface ModeManager {\r\n  current: ModeType;          // \"base\" | \"free\" | \"holdAndSpin\"\r\n  activeMode: GameMode | null;\r\n}\r\n```\r\n\r\n## Features\r\n\r\n### Game Modes\r\n\r\n| Mode | Description |\r\n|---|---|\r\n| Free Spins | Bonus spin loop with retrigger and nested transition support |\r\n| Hold & Spin | Lock symbols, respin remaining positions, counter reset on new locks |\r\n\r\n### Side Mechanics\r\n\r\n| Mechanic | Description |\r\n|---|---|\r\n| Gamble | Post-spin double-or-nothing with configurable rounds |\r\n| Pick Bonus | Interactive pick-and-reveal (prize, multiplier, freeSpins, collect) |\r\n| Wheel Bonus | Spinning wheel with multi-tier nested wheels |\r\n\r\n### Grid Modifiers\r\n\r\n`randomWild` | `expandingWild` | `symbolTransform` | `stickyWild` | `walkingWild`\r\n\r\n### Win Types\r\n\r\n`payline` | `ways` | `cluster` | `scatter`\r\n\r\n### Other\r\n\r\n| Capability | Description |\r\n|---|---|\r\n| Cascade | Tumbling reels — destroy wins, drop new symbols, re-evaluate |\r\n| Big Win | Tiered celebration (server-defined tier string) |\r\n| Jackpot | Progressive jackpot trigger and award |\r\n| Anticipation | Suspense animation before specific reel stops |\r\n\r\n## Presenter\r\n\r\nThe `@duyquangnvx/spindle/presenter` subpath provides `SlotPresenter` — a reference implementation for reel spin animation timing and symbol view management. It's optional; you can drive all presentation purely through delegate callbacks.\r\n\r\n```ts\r\nimport { SlotPresenter } from \"@duyquangnvx/spindle/presenter\";\r\nimport type { SlotPresenterConfig, PresenterDelegate } from \"@duyquangnvx/spindle/presenter\";\r\n```\r\n\r\n## Development\r\n\r\n```sh\r\nnpm test            # vitest — run all tests\r\nnpm run lint        # biome check\r\nnpm run typecheck   # tsc --noEmit\r\nnpm run build       # ESM + CJS dual output via tsdown\r\n```\r\n\r\n## License\r\n\r\nUNLICENSED\r\n","readmeFilename":"README.md"}