{"_id":"themis-ts","_rev":"27-8f0f0a46add1a1468bccf2d420f1b376","name":"themis-ts","dist-tags":{"latest":"3.1.2","beta":"3.1.3-beta.1"},"versions":{"0.1.0":{"name":"themis-ts","version":"0.1.0","description":"entity component system in typescript","main":"index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint . --ext .ts,.tsx","build":"tsc"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"ISC","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@types/jest":"^26.0.23","@typescript-eslint/eslint-plugin":"^4.28.1","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","jest":"^27.0.6","prettier":"^2.3.2","ts-jest":"^27.0.3","tslib":"^2.3.0","typescript":"^4.3.5"},"gitHead":"353a3c8991492e5df78b8ad8fcd44f8e3d34f359","_id":"themis-ts@0.1.0","_nodeVersion":"15.13.0","_npmVersion":"7.11.1","dist":{"integrity":"sha512-XSINdDZ+040zmOPiK/RWcCtNlIP6bSjBMXRyMOFNEy1bRh55SyvtGBYFQnDN2uoYVPv+AC3t5ElzGraPa4LC+A==","shasum":"d1314e40b12e68b6bfe29770d601542215959f4b","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-0.1.0.tgz","fileCount":65,"unpackedSize":57424,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg6BlHCRA9TVsSAnZWagAAz3cP/R71OK44dbSW2hRF3Txy\nzJoFuufTxfzHXFfY0Tr6cNsL0aoRUABcdYVi8f2k7AUxQarbd0CmCKb+xfr/\n5SDPI/25hjWh82OXRcmPzyxuI4XFmwkqUuATU/onRB5Y7Sh0NBv2BTQw84r1\nDWNYU0vb8NuGmQs+YUvDCVonleBVo1vIwPtcWuvSCsPXzI1y62enQzO+/A9K\ncdV+XAMyxVktITqA3df8IKgdwOiz0U2e5eIOWFbJNMBDb3JJO68csW5HSU//\nrR+qmkjPIU0Ktz6KBv08tKaPWVK4ZCqQ+dDBh9oTx95vJYiD9JBwalY41rDN\ngODFNyMpo83G5CbRJj9P9uyF4h90pQx0e9sWNbtQJnJwvI63Cf37SWSTjA8V\nkeZKx2z1HVFZvrTGhh3qf4+wW3Ow4PJJNN5cNkIYlmR322Nw4PamTWKPAMLo\nHG153RMllz4nXCowQxGMGfaMu3YClX7UNUCJXSQLU0kJ7S/Q+dwsyrKbqI+C\nakVc7vEpd7Ic/IS1d3NNfE++lA5qPzyKqLTCHhMrGZUg1/jv8IohXhiFBypJ\nH02oSkVV6pnQHQkvHEz4YV/aY9YMOE1VeO0g9YWPO28APgkI3XA2tS0ibQ/6\nVGAJF/Xoa88PMRyGCf+Q8ciWhxyPae+wjPW1whPDMRdaAfcxHwhHv08RL3kP\n0XO2\r\n=vNBg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYR4sldfxV98MZ2+Ju9hNDWRcDJ76kXKcQYjoumZutHwIgeS6sbCQlFFiiSCTOD60yM2LtyRG7rBhvfQuwI1TS//I="}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_0.1.0_1625823559322_0.7745973561771784"},"_hasShrinkwrap":false},"0.1.1":{"name":"themis-ts","version":"0.1.1","description":"entity component system in typescript","main":"index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint . --ext .ts,.tsx","build":"tsc"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"ISC","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@types/jest":"^26.0.23","@typescript-eslint/eslint-plugin":"^4.28.1","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","jest":"^27.0.6","prettier":"^2.3.2","ts-jest":"^27.0.3","tslib":"^2.3.0","typescript":"^4.3.5"},"gitHead":"246e999e23f1c2640506d309face2cd2f5600ff1","_id":"themis-ts@0.1.1","_nodeVersion":"15.13.0","_npmVersion":"7.11.1","dist":{"integrity":"sha512-RP1ZHG7024gxnEFUEZpLcUi7DbBrpCy8c0w8s7fZ7zw9NGpo7kdURnzBKhOU6Nz9bi/64DEYxk8jtXeIk2tvLg==","shasum":"2f5bfdd5ca5e3fdd6fe4a0ad771e7bdce4402752","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-0.1.1.tgz","fileCount":65,"unpackedSize":57360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg6B+lCRA9TVsSAnZWagAACWcP+gNnyu1Wtp8v+3y9CIYA\naUkVFxt2DuqM976MIyQ/QpC6H9JqTPzGUQN5MpUaiOZ/fsI3yh2RBcjBjmZM\n72FlV6sgV8p+dPzC3lMO24h2h3ErrFF0bwEEjU+VdX1AAau8e/UAfJ3fyrPM\n9BCq00xvRRFigPLeir7jCUO3kRii+7qXStbh1GjY/+w5ikd5Zi/luzXWVEiq\nblvXzwkQ420a7fSPRF9ECcUy0z0Fp4ZwaGjTpoEEOBpQkfdyk8LhjCL8C/MB\nhSMREEVwZhWq7pdLKoxEtJogNSUlC4+vuAwOkm+f/LOFeM7xy0k3okdM4ZJ4\neeu6uSunql9pozB2KBqSMrUGQkkF9t2d5bsKQl4S5WUInEAiDzEiAGvuxs4a\nYcMNeLtUJbPmHD1VqGCep38OsWWBaVzCY5/dibNxLKXMP1aUElWt19RIazVW\nl6AaxSClDnsyWAjALYlk2RS77qX/GhP7jZZqiuWPT9mevntnoYgbt68+DQPq\na0f8PUmycfzfScrhcfbO+xZgncBC0562JCwy/Ng6CHax1M+WKw4cl8s8Tgth\n98GzqxC0aaRIk6YTbIb/w2ErfJZObDhnXRpTD8ICLInECnfOR1DKBOo0p6UH\nFeA8wuCTGXvq885TkNc6npzs5RUPuu6v1TMmEc4P6Qxm8U3JHRrrTiUUaU5x\nOV/v\r\n=PLUM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF3KZWH43gm79AMWBgQm+z8vFNGsw79J/Fg+SeY0ENuSAiEAuydGOuw83t0X4xEc5ASbvbCpeGeDDkEVCr8YDT+1LcI="}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_0.1.1_1625825188656_0.828317187704652"},"_hasShrinkwrap":false},"0.1.2":{"name":"themis-ts","version":"0.1.2","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint . --ext .ts,.tsx","build":"tsc"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@types/jest":"^26.0.23","@typescript-eslint/eslint-plugin":"^4.28.1","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","jest":"^27.0.6","prettier":"^2.3.2","ts-jest":"^27.0.3","tslib":"^2.3.0","typescript":"^4.3.5"},"gitHead":"a93bf693d16cb8b32a8590aefeabc21f08721fe0","_id":"themis-ts@0.1.2","_nodeVersion":"15.13.0","_npmVersion":"7.11.1","dist":{"integrity":"sha512-pq/lmnQuiFG/1wEQGaizfzh2BuBVHuqwPc/ArOY9P+eiPd/INaaOtSJM/KWbLOqfCtP9gUX+ogHCdQQa6tFaLA==","shasum":"a83d9c0126971aea1c9992a30529a00f8a489f06","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-0.1.2.tgz","fileCount":65,"unpackedSize":57365,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg6CIGCRA9TVsSAnZWagAAU2AP/jNOnjE+ONImJ6umPWFu\nlwO5vuFCvu4AgZoKG/VwyF89a7o450GxaFVxl851t3jezgbM90oFPQMXIhVE\nu4do+hV9KnSlGIreuRu3BIzQTXkzgxfnVQny90bZ7+GH8ooo/m4YUv7W4KSa\nnhZlk4Awg0mJBYRNPfpmYN9F/mkE2rJiWUUK6i982ZEYfaqDKNNgsQLbWw2m\n6Zjj5Ieyk5bKJ21OwHiCY0fU/kaDGBzoa31vxnVoB61jOwKUzQJzZYCQEFUi\ng5PPsXes/gT8o7vj6mHU45u5S4cApoBzsd76pIUUj/G7IFkmMGfsm5e4Pd+R\nrRQBbM2X3wzDhO5fRMA0Wb9MvgvBMXTZw7bOEg7cQg4Bhyur2WBUQYSr50I6\nxcfKeDlMcpPe2I20FtNwq8j2rX3uYPDmKRZmWNmA1KhWEEQG7Sg/AMOqkC/4\nPbvLI4Gt8kQqjXmJgUmtl9jjlsPA6eZiD79C+CZGHc7g83vZO1452VvdA7jE\nJRLB8jK8whUKvHVApCbjYD7WXBVD+cBoIiJUUOUMSGG+0KiMsTJfRI/891SS\naXFyTlxqUix+ybYZygx9Fg5tZft6+bsZNc1pYKFQi1Eb9d7UhH2PV4H9oFgD\n5KrmSn2d59EbarkKzjulZ5jRucQi06eaoA6xzlYX5ydzjiIUksIKqECvfZL1\ny26I\r\n=cA5v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNQOBofkbADkbzuZBNGOBZKLT4k/TL71ooS7AyiiIGSgIhAN5rIL4I3C5j5rOzL7O3qhtrxZldUSortZxZ7Z5+rPMA"}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_0.1.2_1625825798367_0.03881021080879443"},"_hasShrinkwrap":false},"0.3.0":{"name":"themis-ts","version":"0.3.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint . --ext .ts,.tsx","build":"tsc","ci":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/npm":"^7.1.3","@semantic-release/release-notes-generator":"^9.0.3","@types/jest":"^26.0.23","@typescript-eslint/eslint-plugin":"^4.28.1","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","jest":"^27.0.6","prettier":"^2.3.2","semantic-release":"^17.4.7","ts-jest":"^27.0.3","tslib":"^2.3.0","typescript":"^4.3.5"},"gitHead":"ddead6d196f6d0a686ed0e9036f024b4a227f397","_id":"themis-ts@0.3.0","_nodeVersion":"16.8.0","_npmVersion":"7.21.1","dist":{"integrity":"sha512-VKdL/kg34IPaPNl5d8HFpp879I06UT8zeC/P/xegEV3SH2nitpfEHFYHBKdTpvdfyvpkKRwM4L4dHDZnCoBTjw==","shasum":"8937620a1faf15b75dcc717d51646090dc8a681c","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-0.3.0.tgz","fileCount":2,"unpackedSize":1193,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhKNCRCRA9TVsSAnZWagAA3p4QAIGhZO7pPC1XoXbEdaTZ\nSNiKQiBc9kBU/oEp9T9ujUpI/ntGZUtK/B3a5E8Kx8QVa/LzkgeA0vdfhs9W\noXyvhCsmKWpB8d+3VJTZAzczL8NscAg/KTz6wBHSN0Hwp9P71s2/lFp32vH8\n88oZcBqpw3x7cJXBJfQywRQfdqcem4JHv1O4eYNxCdSO0cESvhIhxL48kRit\neFBctgVGdRXd43UTcUgGGp8/lcqS4ead+uIV41XlTFOmlUn1gCUGbsIAA0H8\nZBYiwrkTD1ni2X/YexftF84imvDEqZPlN4jv8l6OEeKNlrlSVm+g7ImV8wyo\npvExze0Atud8iRk0IS6bc5zuByKdL5MubOP7rZ3hyp0LR4WgofW9Jx21MKkx\niWso0kAaFKBJIk5z4MZifJGZpSReQAgG99iA9LSwUU0AxgEiCJdefQ5uy3vF\n/5tUKiZWxux7p38veJq84MIQQhlFw/sK0gN0kBYb8TsTvfPHbAtoJi+7FzZz\ndvP4o6PYOSjShRCGk6ExP3/+wAT1/U7VjsUfdV7dYYHHAoF3mYDi1e30hOLS\nccBYHJChsNVcF/QMz8w+uuBFEfDmNx9Yicca0zrgI2ra/j4UNVydURMMjvxp\n48ov2rZ7S4nsPhxGcJSiPayHJ93fiXK8IFo6o9Xcoyl1w8gjvIM3qFcG2GMM\n2MtI\r\n=1279\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEq6MUfet/VMnmPCPhSGiEnnWtiPW+R+TJ4lOrlXPpkJAiA+Gu8JcYheYUVc+JT00J+7nSMwz87qHhk+6ed8Chw3Lg=="}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_0.3.0_1630064785223_0.6189289656653187"},"_hasShrinkwrap":false},"0.3.1":{"name":"themis-ts","version":"0.3.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint . --ext .ts,.tsx","build":"tsc","ci":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^7.2.3","@semantic-release/npm":"^7.1.3","@semantic-release/release-notes-generator":"^9.0.3","@types/jest":"^26.0.23","@typescript-eslint/eslint-plugin":"^4.28.1","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","jest":"^27.0.6","prettier":"^2.3.2","semantic-release":"^17.4.7","ts-jest":"^27.0.3","tslib":"^2.3.0","typescript":"^4.3.5"},"gitHead":"e836b730478c1c9c6be8e51d87e45d0a11525c29","_id":"themis-ts@0.3.1","_nodeVersion":"16.8.0","_npmVersion":"7.21.1","dist":{"integrity":"sha512-h46jq0+Ub0xlfYO7PeHKVarX0EzpodihJrZKz5maI2OD62+gtSwEw+VVB08cs4hS3RqQuJrJq6tfof7jRQH/Dg==","shasum":"c1ee906235319f2c44617de6f447932bd4b4dfd2","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-0.3.1.tgz","fileCount":2,"unpackedSize":1235,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhKNdXCRA9TVsSAnZWagAAizIQAJ5OGVQGOfh8OY/vGhWJ\naDqOOoTzj/+FXvKpfP+1ShvNpvqoIB/1RbOE0iHaGm8hh3bkceWVpkLk/0Nq\n7KnQkIixJowLvPI9c9sY0uR1rpS06tcL+ZNlejGru6WpaWmUfbecYu+8CcAQ\noWLZOAu8h5KIAkcM2jz/xrRH+XHdKnB49qzH/oa36wScYIEwHsm7+7B+Z095\nZdn/5T0JSJmrO57XkzM5UoVpkjg583F07DPkwSIQGm3mbHUemxS4sJaxJ45t\nY78zqVf1hV4bR6/Tgh53feMmxHPMlErJhB5AvDwg4EQonVp8EKETAjbXXaOF\njmBUWM3Lap9v13B/ry96yySolXgHQgqM65fdzal25tWL4VKjO9ZPLxMe0it6\nuQYhOy4q0rqej8bj70Us0VPP0XbPJl6jdfFx+yrPcrPGv6RTfM2EmAB0Rk7F\nvV4XrtbDDESLYmDakzXuK8X5YhTCv5aBwhpv6v7YDSoBM6gWICbVxzEd68a0\nr3XqKpBN3i0stYtNBVQX30qW6KjzgQ84BB71SOt+Xh4jzCPun9anrR/hysF+\n5EBpL2giJjxCVUrHtl4TEyKfIMsrVwjk93zcYJT1yl/rt0zWtsmU2NOSrg33\n/8GdD6Zsn6+V7hIfBffG8sqyyRAVJ+S5iVbXek6SKuQp5MXhUmC/d/5Msb1C\nMv9y\r\n=Hsbj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0Wr0Ktw/rere0dTk9KMOQpRkZ0rBaejfJth3xhV1bagIgWLmF+RbZeFQ8Kg3yMIy8ADhmZ+xFaw8jKiylOfCuXjg="}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_0.3.1_1630066519768_0.4334187141884214"},"_hasShrinkwrap":false},"0.4.0":{"name":"themis-ts","version":"0.4.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^7.2.3","@semantic-release/npm":"^7.1.3","@semantic-release/release-notes-generator":"^9.0.3","@types/jest":"^26.0.23","@typescript-eslint/eslint-plugin":"^4.28.1","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","jest":"^27.0.6","prettier":"^2.3.2","semantic-release":"^17.4.7","ts-jest":"^27.0.3","tslib":"^2.3.0","typescript":"^4.4.2"},"gitHead":"7cd468a95aad1b92a0fbc33fe4c4ff490764d415","_id":"themis-ts@0.4.0","_nodeVersion":"16.8.0","_npmVersion":"7.21.1","dist":{"integrity":"sha512-naG2ozsUbVYKE79ccTsdjJLo6LgCU2Vty5zOezCClL1nWutHPQChnZ4jJuHZMngt4jsSlQ/PbSc0T8e9O9agfQ==","shasum":"192fbd88e619081e7a53c899c08177bbdf085998","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-0.4.0.tgz","fileCount":74,"unpackedSize":86790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhLn75CRA9TVsSAnZWagAA9GoP/jDnTGIWela59wmKB/N6\nls19LGDlRxhGJ+wH4OIXdlIeQpWTpKU+/IJq5wCyZTcPWFnqdH5aDTP444C2\nBPtI4Garl72gNXLOWbynLsGRFV25iw9nedkXFXggyFZzOk8PfMcPbh9ie9/f\n4A7+c9SqIPodehwuFWNs+KcKEU+K8QgPz4Ma96OA087fsg2aJaGRtxkQZuoL\nBaQFsTJMIFvKwGTkVboYOR+lRelmd3D2O+562N5Knjve/tOniDqvKdwCK+8k\nDfW62NqVZW5XTqognDK1NhAkT+uBifLBfJzFf/APQbrmPpu+ZypwSH+oUJZu\nWYxyJpd+icrp5jHgBrzqa5Lig7yvXwPl8lMi2CFKmpvp04JEw4ZHbCm+5kpS\ndec8AQHpVhZrujXSJHLwF7aNHe8faX/jSifVazgKt/nKr1HzTkLOI4y9JpSo\nWAii6DtombEzj05TPl5TxXU5aJMrEqEF70/nktW2reMYgzH8iBY+p9rZctq8\nQWuHTn8lmm4mjZQv3MisTLnQbb/+wBkLyfb+by3WWf/YMFD6+Tyikw/6JupY\naDPTsjX75TL3PAanoHtFRqCJFMpRv0RSziO2lga2+86hWdaWN/+a46xQ9eW+\nL9DkbDlg7DfQJxUOkrEbo8lMAYOiH0r0zIVz+/p9ZfDJulEHnoX9WaVkqXPw\nq4oI\r\n=ppLW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFdAC0sSekEk7KM3EHZYHWjgWPTDryWEfoeOw/L80wEAIhAObO0IILaMZ3aOqjUI0FJ2v+Utj7qEH9LO0tagxtmNCd"}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_0.4.0_1630437113122_0.9968427229267967"},"_hasShrinkwrap":false},"1.0.0":{"name":"themis-ts","version":"1.0.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^7.2.3","@semantic-release/npm":"^7.1.3","@semantic-release/release-notes-generator":"^9.0.3","@types/jest":"^26.0.23","@typescript-eslint/eslint-plugin":"^4.28.1","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^3.4.0","jest":"^27.0.6","prettier":"^2.3.2","semantic-release":"^17.4.7","ts-jest":"^27.0.3","tslib":"^2.3.0","typescript":"^4.4.2"},"gitHead":"312dd0fed69707e9dab9a1348a171eb3e829d8f0","_id":"themis-ts@1.0.0","_nodeVersion":"16.10.0","_npmVersion":"7.21.1","dist":{"integrity":"sha512-hsEq6wtgdgXRKSs0KJNNoWn5r626ppRTbSKsusX5aVgACS519ynv4vfTiK4jict/LO4KkaQ/7HlHaZD2MnewHQ==","shasum":"e4189efe48b23cd432a545af4afc12a8538812c2","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-1.0.0.tgz","fileCount":84,"unpackedSize":88096,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh29vOCRA9TVsSAnZWagAAseIP/jN1PEW+C8xT0SkRIEZn\ngcba+HtN+MEpEapzXFguGLoY6eqgqQTrgR8DjWLPWUf1qc1B3itUaMUDVTeP\nkjCFhVdg6HXOf4ParGd/QPAbdvRERM9rI5aLfXrMAY3BdsbAVqqLGR8qWI3t\ncEnu/S3pLBsOLta7LtMSiMX+IuFDk1TWJpq2uA+i/SoNdRDHRsKbVGMDy2zk\n51Uhw4V8S5xwke2eev0W2+TKkpGkBfTLNUh9d0OV99rNX3eqVof7f3ETPz0C\n0rnUNetxwGErJ7p6kORSp5gtocFsGB8t1Dqsl3ZIB5kxlMrWpmmLTofUoyGI\nCNlKV471pbu/1k7JLkIVJjBWgFUu4TDck2wr+2cbmHuoUn3s1fcHNPimvfHT\nyv2JC3FINPTT37BnQ2mSPtrLaEzn0DsZV3E7NLTyYWZbwiYMxErlVwLOH8pU\n0jIEnAjr6V12OgyAmmP2F+IoiA/f54yo8mFouTdnjGxxDmm5icd9Gn3mtaSB\njynQv5vj4guvZ9Tgf/qJP0W5v+w51ZUQptjcz8iGF9PotpgyjxAFFPe2SLeY\nLfrF31gmU7qP05JTGSmeK0xCzzW9+bsomOUCQeKm0822XGecy3D2KkhpRNur\nprG4fkh/j1hE9P2T7KCKvEfblLz+VXzMKwg2/+HR5Ly1qrpDHwcxiECP0INv\n0Q1l\r\n=BuqU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEIz9u77ak4LAp7gtwWRXbFyZMSmYk6eiYNApheWnsayAiEAnU/BT7Hah76SFVVA1Sex/OlTEpAJdekN3NmqyJht8oc="}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_1.0.0_1632649990192_0.11300957327228267"},"_hasShrinkwrap":false},"1.1.0-beta.1":{"name":"themis-ts","version":"1.1.0-beta.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.2","@semantic-release/npm":"^8.0.3","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.0","@typescript-eslint/eslint-plugin":"^5.9.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.4.7","prettier":"^2.5.1","reflect-metadata":"^0.1.13","semantic-release":"^18.0.1","ts-jest":"^27.1.2","tslib":"^2.3.1","typescript":"^4.5.4"},"readme":"# Themis Entity Component System\n\n![GitHub Workflow Status](https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main)\n![npm](https://img.shields.io/npm/dw/themis-ts)\n![GitHub](https://img.shields.io/github/license/themis-ecs/themis-ts)\n![GitHub last commit](https://img.shields.io/github/last-commit/themis-ecs/themis-ts)\n![npm](https://img.shields.io/npm/v/themis-ts)\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\nIf you're new here, we highly recommend you to read\nthe [Getting Started](https://github.com/themis-ecs/themis-ts/wiki/Getting-Started)\npage, as it will show you the fundamentals of **Themis ECS**.\n","readmeFilename":"README.md","gitHead":"2e6310f9e6b1170168cc86b8a464012812a84d4a","_id":"themis-ts@1.1.0-beta.1","_nodeVersion":"16.13.2","_npmVersion":"7.24.2","dist":{"integrity":"sha512-/17u8K5F5q8dFE7RVicxhpmIdwuodZAtI3hoEIuF0NNyjxaXoVryzcpy10phPrriwd6S2dYzbb0ixHk2PFS9VQ==","shasum":"66416a6ff0fbe86e273dd44be3fd4d242f331b08","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-1.1.0-beta.1.tgz","fileCount":90,"unpackedSize":104791,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh8+hSCRA9TVsSAnZWagAASAoP/0nN4Pk14/pv8mP2rlFr\n1RYAeyYZ1ont/0OJVQVJgPM1Fvu2jiHZjYtycopYbEMe0jnydU5uJKlaHMSu\ntTRR42W135YeUjVI1se+Zhj8dBHXoZs54rUD5ecQLVRAZ3QmXcz9n1zJRdjl\nYQkBpAttoLlOAD9dKHLjnIH8qQXB5MY4JNb3U8jvJzDenvPfHw3ecexrJij0\npquvSt/6lfPjT1TTjFAt6rNM9NuH3fsxettzlSDyl0fRkMX+dJUdSJ0lT7rm\n7Vw3Cev7e976jg1qDqbGYhlLr3cHUYyBYx9asaHfhjDRf8hrK/lAOxmQnad5\nbVAg0y+YbE93d8tfBzRYoE4lPYXTSbHadPHA5dSmhZszaJ6ssaKVbvHR1Puf\np9jloYB7bbty3RSaghHqcJjadKqldj9UBnPoRA0D7VNnM4B+gy1lVaoKY007\nv28uO88CsCguR/lEZ28N+oCo6Tz/oka4r8WloRDgEsJQsbx5xzuC7Ube6U5V\nJDeRQbrpmr4WByV+W0A5eIO7tUMpnRBZfmbMlDasKYGQOXuTSXMM74nPE5mP\nfG4GyQ34MfD2AMPaVYKS3e7l8aYjRYLFbLUkzOGqwxwD4s145M984wiHkIxn\nfhckvp4Moaj61tJ1wpSVAVB7l7nfbklET3kkqFcHvf3jruYOrIIGBAiEa/zY\nSlfa\r\n=5JB9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYBaGb7dpfrV18lrSMeYG8cz/eATWKA3oP2Cis9OT6tQIgJ/XH1wNs5ksm0YMIVims2L80HVk25zct8yOiS7l7HJk="}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_1.1.0-beta.1_1643374674752_0.2749132982279221"},"_hasShrinkwrap":false},"1.1.0":{"name":"themis-ts","version":"1.1.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.2","@semantic-release/npm":"^8.0.3","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.0","@typescript-eslint/eslint-plugin":"^5.9.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.4.7","prettier":"^2.5.1","reflect-metadata":"^0.1.13","semantic-release":"^18.0.1","ts-jest":"^27.1.2","tslib":"^2.3.1","typescript":"^4.5.4"},"gitHead":"dd489fd595de8da3c0c963529024a163f9af7bdd","_id":"themis-ts@1.1.0","_nodeVersion":"16.14.0","_npmVersion":"7.24.2","dist":{"integrity":"sha512-sQ38rnJbfA3OjzsBs5VxuTeOoFCFFEO3GgJWMeeJKzOcLNikIMMgH10E7nJ9yIUWQJvGFEEbkyTMeIFORijY0w==","shasum":"45114f6dc01a1644066e37994fa65797adb9507c","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-1.1.0.tgz","fileCount":87,"unpackedSize":94249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiLJhRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmobUQ/+Lqw6ExZ1CXYjIbAFpqH7xq6CV5wz25cesazncSxC6GNlWnWK\r\nD8US1HBfIQgwuXpa6m3X1yPk19UnfO3XCohvCXt93bR0Rb3Nq/295QksZDgv\r\ng0jlpeDVMAPehrx4B8IJ/Gz32YVT9IPUMMR7DIHwJuihzY8Zbo49sWGTKKEL\r\nuu9T52c5KPTvCxgz3uwqhUqermsfIPojojtdFRdAIwNgbFjnq8QgcKHApRSk\r\noh5xP4pL805wLV7bI/yCfFgwDobqZZ4qoXuYOVuuYzpDBOXD+ytt1Zt187l7\r\nmGxl7nd3koIFwWulTen2R//PCqanBamvG+YIRFyOOe4OsC2xI7PTiWha4sS3\r\ngB4OIHcyn9P79AcaPx7Kx0GIs2Q/XAu8brDf7XXZIn14MsAfi+s224Djmm6M\r\nOVYmSisB3fvx3DnHi26NvCma9dGSD7xeql1iAyyn5XUjXLmGuN5VVcCMz3Q+\r\nlkVO8vvU0Fa2NCAFj6eycmFDFiN1y2lBWlGgHpAxx5l28gYPHsPE6Zrb+lLz\r\naAbGQAx57pkauJCbAt7y4fHtinVCXz0DoYPeQMfFzwo/Hvg7QurjyZJlKrgU\r\nNjyOKZ+LaBx6vX/Uznh7ahv7QhmS86krqouBXGMElmHddkoM1oSOFQ/1EUoV\r\nMUtZCMetYT9ZC0NUtv+A+X6qOfgtT8RVy4k=\r\n=88RG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICtvXkdbxnlO6rUloHj4o+pXHM+cuXhqZi0TFXQW+fDOAiEA/zWa/vnuVToH+7kR0gIBV9jvGwyGuLUlad+aJ7fJ/Q0="}]},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_1.1.0_1647089745753_0.05799518691485517"},"_hasShrinkwrap":false},"1.2.0-beta.1":{"name":"themis-ts","version":"1.2.0-beta.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","reflect-metadata":"^0.1.13","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"readme":"# Themis Entity Component System\n\n![GitHub Workflow Status](https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main)\n![npm](https://img.shields.io/npm/dw/themis-ts)\n![GitHub](https://img.shields.io/github/license/themis-ecs/themis-ts)\n![GitHub last commit](https://img.shields.io/github/last-commit/themis-ecs/themis-ts)\n![npm](https://img.shields.io/npm/v/themis-ts)\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\nIf you're new here, we highly recommend you to read\nthe [Getting Started](https://github.com/themis-ecs/themis-ts/wiki/Getting-Started)\npage, as it will show you the fundamentals of **Themis ECS**.\n","readmeFilename":"README.md","gitHead":"4a62a75bab41d44163a62334baa694a52fbd1275","_id":"themis-ts@1.2.0-beta.1","_nodeVersion":"16.14.2","_npmVersion":"8.6.0","dist":{"integrity":"sha512-CKjp63ZrQHAWi7oF9DhTwPc2pCtiwulRRCqppbz9/LglUPruec6lArPv+5COjbjG1KQvn/MCh6mznssg3es27A==","shasum":"c9c99560fc8dc13674efbf771b478d3ef403095e","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-1.2.0-beta.1.tgz","fileCount":93,"unpackedSize":101689,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFPilc44y66KZq0Tu3yQMThKQVV+RKH2++f8OvsS7uYMAiBrmLDoDrxsSBhaebbmgUqMRkjuJN/Zh/+mETxMx/C4Qw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUAMBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoOvA//YzJ2t1U+ePJvyIEnrXvzXWN2clqg78gBcF457jMTc4DfnS6a\r\naz/M1p4WvMT+G392HvPXjqLuDVnBjDSbEznislhckFb5LoIfWdjIpfcv9azw\r\n+VSsulX6v/WTOK55PA4m9ABEx7mq4A6wqqpK9ekW99cX+o1Fw5VtNZxXM3iu\r\nMZ2EVzQasbUw/I54oZC03mRv88uQrSCaKTWYEy+3rw8gCnr6033VNg2mPunp\r\nW6iLPvjUn273XsEsY5NU+hoIVG04hpd9uq47AlAF5Fw2vQkHB20EELUKVmOK\r\n+CLB4cb9q/SZzjfYkYamAG4ajnOP2QovWDt48fKI0NfxqS+zdV6Eaa55TXmR\r\nVMBiIj8GumWbSihosgXsiSB7wdAYa3rwov1hSOUQ3LIlfBkvgBGWOR5cYiNI\r\nRQrFrVHKhMUYBXCr7sSCfTpl6RHEX6KS7tMRLDSENQxi3QwEKXXmXUpJfR1f\r\nkLtx+vhLOthRq65p34nEKbe1U4NWWGatAksX1TGM2BQ0wZDbB7k1jrBVbtOq\r\nE3yBLjjRiWHeL826ZNLPBs6yB/1ORQUdTJ18rUDmg0JYAxYx6xg6WR6TySKA\r\noBKnGxirobdP+C19GQc0o41a9Jok4KjaZXCF7p31KC8qiksObdJRd4W2GCR4\r\nU46mOywJKt5z2Odtd57iqEmcER6WOenozb4=\r\n=prvN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_1.2.0-beta.1_1649410817297_0.4821722402943933"},"_hasShrinkwrap":false},"1.2.0":{"name":"themis-ts","version":"1.2.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","reflect-metadata":"^0.1.13","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"gitHead":"626e15ffbc02021595a1be080fa0c2a483bd12ec","_id":"themis-ts@1.2.0","_nodeVersion":"16.14.2","_npmVersion":"8.6.0","dist":{"integrity":"sha512-kPTFYjiSdHzChS8GaPvFmXJ8kON9rcrqipQY+B5lK28ssvexwTVYUNhcTKscl4neVjX8gl8U5zYGNXOLyvTtZA==","shasum":"0fbbbc06c723e3d79980254c38c9896c1ecbabfa","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-1.2.0.tgz","fileCount":93,"unpackedSize":101682,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCw/k2brgSnLNH+M3ocbcO96j/Pvvz3rVCMRHLUMb4G4gIgPXL9bOGOEOs6Q3fYmArMs+6Xsw7Sktc1btxg+zTr728="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUAOMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoVzA//TWLePbRDuEhUixS+JbBboUmrDLB9Odi7u6iVq89yNo6EqsjP\r\ndN8koLNZBWMCtUKhQK7wwbGYLP1NrXhaOnAyBo6+ugZr4SshdMQKtpGtZgfh\r\nJUZs3VCmdOE/uv0lXxgml42SHriwbn5L6UrvQY1e7ec0TIRvtTgfdAbPle1O\r\nAQO4j5TAdKsLpy6zEJnkC++ksURsufAsOduv66hZFx41VF19WAY7kVFxSDLe\r\nNqgvsdSO6ojZaJ3zmLN6qvZ28lmoRZUNPKttNlDWlZm3QmlVnPe1pWtI07bQ\r\nnXU4e2qrNLNFOXc51Y+A8TrOkhyTmoe63C2bO98Y45/7j4l4M/sTPs3FLTJh\r\nPMuuqMAdfbKg0Ts1KU8M2vAg+1GFySevVvv7E4fR0a3wfIl4InzI2vIleATs\r\nznWZfHTFIwGUlk4SwX5mDd9T0HbrKbMv4G0npCO5OtBixxex2y9VytuvH4ZH\r\nId9NOYn11JLwTYM8TGMPXSwInOXz6X036uQQIQ+/Jq4TSweoL08mH0PEVzvh\r\nY7PGnbUePKKCQX23bvtWHD+3CIhV0xdDxRDjWiYBabI6ICfu1AAMaJPnjls0\r\n2BC1L8Fbx4N6Iwl4OiKAMBGaswiyz5IEESWKynM05uenL4Mb2dOofgcGHKm4\r\n/TUVX+wN0Yb7+5xQR4xWgRJuQcgTFDZfP6U=\r\n=mUoJ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_1.2.0_1649410956307_0.2633687664215314"},"_hasShrinkwrap":false},"1.2.0-beta.2":{"name":"themis-ts","version":"1.2.0-beta.2","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","reflect-metadata":"^0.1.13","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts``` and add the following to your ```tsconfig.json``` file\n```json\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules. There are two types of modules, top level modules and submodules. \nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework. In a top level module, Themis automatically creates\na pipeline which contains all the systems you have registered in the top level module and all of its submodules.\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\nclass MySystem implements System {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(pipeline: Pipeline): void {\n        console.log('hello from MyModule');\n        setInterval(() => pipeline.update(42), 1000);\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis World using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule```\n\n```typescript\nnew WorldBuilder().module(MyModule).build();\n```\n\nAs you can see in the example above, the class ```MyModule``` uses ```Pipeline``` in its update method. As stated before,\na pipeline is automatically setup by Themis for you and contains all the systems you have defined in the top level module\nand all its nested submodules. You can use the pipeline object for periodic updates to your systems, which will result\nin calling all defined update methods in your systems.\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the ```Inject``` decorator. We can then use this interface to create \nan entity and add components to the entity. \n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\nclass MySystem implements System {\n    \n    @Inject()\n    private world!: World;\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(new MyComponentA());\n        entity.addComponent(new MyComponentB());\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\nclass MyComponentQuerySystem implements System {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n\n  init(): void {}\n\n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(pipeline: Pipeline): void {\n    console.log('hello from MyModule');\n    setInterval(() => pipeline.update(42), 1000);\n  }\n}\n```\n\nNotice how the submodule does not have the pipeline parameter? As stated before, this is only available in top level\nmodules. But do not worry, your systems, which were defined in the submodule, are still present in the pipeline of\nthe top level module. Themis merges them. How they are merged and in which order are they performed you ask? Well that\nis easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(pipeline: Pipeline): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\nIf you try to resolve a class with zero dependencies, no providers are needed and Themis will just use the type you have\ndefined:\n\n```typescript\n@Inject()\nprivate myClass: MyClass;\n```\n\nTo perform this injection, Themis will try to resolve MyClass. \n\nIf the constructor of MyClass has dependencies, Themis will try to resolve them and inject them into the constructor\ncall. Be sure to have the ```Injectable``` decorator present on MyClass for Themis to be able to detect the dependencies.\n\n```typescript\n// No Injectable decorator needed, as the constructor has no dependencies\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // service will be resolved by Themis\n    }\n}\n```\n\nTo change the strategy Themis uses when resolving dependencies, you can use one of the providers listed above in your modules.\n\n❗ **Beware**: Providers are not limited to their modules, if you register a provider in an arbitrary module, these will\nalso be used in every other module. Be sure to not register two providers for the same identifier, as this will override\npreviously defined providers for that identifier. ❗\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: []\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: []\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n    @Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: []\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a>Entities</a></li>\n    <li><a>Aliases</a></li>\n    <li><a>Blueprints</a></li>\n    <li><a>Events</a></li>\n    <li><a>Component Queries</a></li>\n    <li><a>Providers</a></li>\n    <li><a>Systems</a></li>\n    <li><a>Modules</a></li>\n    <li><a>Pipelines</a></li>\n    <li><a>Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"238cf42cf2fb00a1538886974860274f6223257b","_id":"themis-ts@1.2.0-beta.2","_nodeVersion":"16.14.2","_npmVersion":"8.6.0","dist":{"integrity":"sha512-UA24ZdaofLwEoMQDOG8zy5ChtYa5IUfFVAx4WejgZCPLnCU0V0vt5QjCu4Dj87bJtolAVmflDwP/EZQKQj2wyA==","shasum":"825a83d4864fa15a2ecab279ef9a5a6e6030868f","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-1.2.0-beta.2.tgz","fileCount":93,"unpackedSize":113651,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIiZoxpQIyAD2zByXPDqtCBQyDGQGNuEVVYtKbliGc6QIgJE1rbCJdfIorp8daAu9nufffo2fexlFWo5nlb/7LWi8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVvcdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo4exAAjBaojmE5ym0diN2nztzmuO1/wuHa244rl2fAqN3vK9ki1b3c\r\nHRQZy0VGdMvy8N6ivgCYujkwampvR+d+mQZKdA3RikwCcEZCGnJQnxQUS+Re\r\nG8p60MIBrM5Z05Vb/H9hCA8DsnhYh72qCUnTIg2YLcSQm3NIESQH4OBuTskF\r\nJrOsCBbQx8msK2YNX8O0lqX6InEPXuF7u4xdbh1wC0qWkL1NTcWgKpxPoWON\r\n84yVBYi5PbmsksLLSDTv9kT7QzGYzuLa1gAV+ODlY+6wrruHc2ihADj3y7/Q\r\nA7H9f0F1VkkO31hwROEhU8cGQ6B048alAei7/SR2y7E5EzyBylOg2Jr+iCEy\r\nrXwl2eo5aEfZgWNIwkrLcCg/x6Ac3wyPQtWPDm6k26C7ohhCgjbs7ykP+6Mg\r\nS1iBBEg0ym4AgObARlnY7K0QFVZBsSUUSYABlHGH7+DOTRxRopBmKJ6kz/eO\r\nlcD8Svuf+DxxIBa0wK931OvH5yZzpCrepn1+i+wCDedyjZFEWJo2Ylc9tVcc\r\nxuFOj+5yYyT5q+PkPQdy7s4Q1tYoviS52vZPB9DXw+53U6lX9vsQCI19eFA+\r\ndeRmRb+F0BE1diUk/lRcNWd+CfI3dYost7gwBBSh7yoDh03RQQWQno8FfLjW\r\ntawG4Dlzno4NIDI/6Tx7Nf9HrXm4xEkxtIY=\r\n=7rzU\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_1.2.0-beta.2_1649866525342_0.8082525468003472"},"_hasShrinkwrap":false},"1.3.0":{"name":"themis-ts","version":"1.3.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","reflect-metadata":"^0.1.13","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"gitHead":"77d0ee764619bcb8d6bfaa289fd3a4a6f2c30f33","_id":"themis-ts@1.3.0","_nodeVersion":"16.14.2","_npmVersion":"8.6.0","dist":{"integrity":"sha512-WRI2ULQ160T8SXod9UrkB5xigpzMmXaFuH1Iz8i/i/qEYlMvwaqp3MApE+8UQ+K4ziBQsliRhJtQCkSdGzmhAw==","shasum":"dd825e1abf029f5ad30b04a3503fb3299cc58fee","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-1.3.0.tgz","fileCount":93,"unpackedSize":113644,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDr3tXLWL1ewYJIgf815DU3tiofsSn2up3DZA7c+xFDcQIhANvyY9KFZ/+cA+1ymm2yZW7TyseUtqyEy7May/CFXXgM"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVvg9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqwOQ/9FlBg2ooPInNSttHbCxwZPqgS8m0LJBR7n8FfmItGl+AS8QzN\r\nklhM9Erp5cGnqLJTTSu6QIVd4IC8kDBn75YPEjLWApTLsggBiUfqJppZr2Lh\r\nqL87C6Q9aj3BJJPAll5vk9+HRAC24tvnvVIfuBuqRC6y6hXWgXcE2jfbVBIl\r\n08wpWQsxYCrkllYduW46m8rY2kVFXeBy0s849ByqPO6P6BhBonkNjSSZMMGd\r\nOdnGXZbc+/mLd6gLDWuBfQ3R1fC9Qw2wVJFLTgXL95su3bli8c520qSLy5Ga\r\nfpO4MQBBfZVPlN8cI7TihKgbvUscNeslaYq2R8MDIDd49yC7CPdmHPH8ZXsU\r\nR/NL9DOyZdJOlf/nTHWFiUzLSpxDtwXGFMI5pTnZ7GQhWFOYaFoAZhiAU38V\r\nx4cLZLggEBQ4UzQenMfB73zmxN8K3Sx+uEwtfmMSjDvh0KWt36ptDN4aUrI2\r\nSR8714FZiugSJ4x/cVgwEj600tIT68eFc+CnvgCBHXVJqdEUevujowr12FxZ\r\nnfI6AZZhX3Z02++QBNSJUIrkH0Y5ijmyI0pmnHI9Se4PRZdLIUtgPlicgFfG\r\nBfStR8+bPeRAvtubOFEKSZZ/PFsNsG7ki/LoMmDVwxG7rBkhFy2INSY1Q0W/\r\nZFeXv89TKBiYKYx2BV1irnm6bmn1xLYjt5Y=\r\n=zvLI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_1.3.0_1649866813084_0.49405571428955275"},"_hasShrinkwrap":false},"2.0.0-beta.1":{"name":"themis-ts","version":"2.0.0-beta.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","reflect-metadata":"^0.1.13","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts``` and add the following to your ```tsconfig.json``` file\n```json\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules. There are two types of modules, top level modules and submodules. \nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework. In a top level module, Themis automatically creates\na pipeline which contains all the systems you have registered in the top level module and all of its submodules.\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\n@System()\nclass MySystem implements OnInit, OnUpdate {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(pipeline: Pipeline): void {\n        console.log('hello from MyModule');\n        setInterval(() => pipeline.update(42), 1000);\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis World using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule```\n\n```typescript\nnew WorldBuilder().module(MyModule).build();\n```\n\nAs you can see in the example above, the class ```MyModule``` uses ```Pipeline``` in its update method. As stated before,\na pipeline is automatically setup by Themis for you and contains all the systems you have defined in the top level module\nand all its nested submodules. You can use the pipeline object for periodic updates to your systems, which will result\nin calling all defined update methods in your systems.\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the constructor. We can then use this interface to create \nan entity and add components to the entity.\n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\n@System()\nclass MySystem implements OnInit, OnUpdate {\n\n    constructor(private world: World) {}\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(MyComponentA);\n        entity.addComponent(MyComponentB);\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\n@System()\nclass MyComponentQuerySystem implements OnUpdate {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n  \n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(pipeline: Pipeline): void {\n    console.log('hello from MyModule');\n    setInterval(() => pipeline.update(42), 1000);\n  }\n}\n```\n\nNotice how the submodule does not have the pipeline parameter? As stated before, this is only available in top level\nmodules. But do not worry, your systems, which were defined in the submodule, are still present in the pipeline of\nthe top level module. Themis merges them. How they are merged and in which order are they performed you ask? Well that\nis easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(pipeline: Pipeline): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\nIf you try to resolve a class with zero dependencies, no providers are needed and Themis will just use the type you have\ndefined:\n\n```typescript\n@Inject()\nprivate myClass: MyClass;\n```\n\nTo perform this injection, Themis will try to resolve MyClass. \n\nIf the constructor of MyClass has dependencies, Themis will try to resolve them and inject them into the constructor\ncall. Be sure to have the ```Injectable``` decorator present on MyClass for Themis to be able to detect the dependencies.\n\n```typescript\n// No Injectable decorator needed, as the constructor has no dependencies\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // service will be resolved by Themis\n    }\n}\n```\n\nTo change the strategy Themis uses when resolving dependencies, you can use one of the providers listed above in your modules.\n\n❗ **Beware**: Providers are not limited to their modules, if you register a provider in an arbitrary module, these will\nalso be used in every other module. Be sure to not register two providers for the same identifier, as this will override\npreviously defined providers for that identifier. ❗\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: []\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: []\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n    @Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: []\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Entities-and-Components\">Entities and Components</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Aliases\">Aliases</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Blueprints\">Blueprints</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Events\">Events</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Component-Queries\">Component Queries</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Providers\">Providers</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Systems\">Systems</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Modules\">Modules</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Logging\">Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"3abb5c66913aa6ce4969c278dbb889a7f652934f","_id":"themis-ts@2.0.0-beta.1","_nodeVersion":"16.14.2","_npmVersion":"8.6.0","dist":{"integrity":"sha512-0joLK/OZNePvMQsqb+OtqqV3obWUnRTPkizrDZGbYYM9KiovDuRa/mD6ICxEQr6L9qnEDoiZjgiYF2n4Kk/3jg==","shasum":"c71338253fb4c8228aa0dba5805db5ed8a9c0a00","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-2.0.0-beta.1.tgz","fileCount":93,"unpackedSize":116439,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBsX/ckOcgFreRUuKW0nzlt2p9nYDPQH5l3CgXV08E6lAiEAtHkWMG0fTxxyku2exYB3QLAp0OdoyDnubPIMXuv/jgo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYN6XACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmomBA/8DyR/OFJPGez9k6SckVtG/UO9FvMiIhYn6bxGmJgVuCDG9cf/\r\nvvndn7pV2wabDgFCZ8tx9lqugGwb69sp8Ut7YorD/OmkN2De/rFlUBgnph94\r\njojXv+XJzHjzRCE4vyDZAmPQsRAjGpbcIFltLhtzM2ToA9ghbV/mJba/sdcc\r\nAbYg3e9L0+M7/fFs/XO7XHzWWetuzcpC6jiSFsF8CKF0VGWuqQfVSScOKTP0\r\nTOMfzBPQP6UKFmF3NDhH7FN9G0b0M5rJFy4eLvw4NvIvYJIj/oW6POI9jz3f\r\nDril2k1sU8p/THCGSrOA2AE0jPY75NGsPBJXxtfEnVHRZ3W5G8HI82RmaCjx\r\nrURk9BHxDWdavUHmvgQYVb47MJ6C6bR0OOchGSAXezNKBeNfi9MF8K8BsvBK\r\nHbdRMZZwvamYMfDbri4LjwRwl55GVAUIqgDy7quf3H8sIs+1hqbmMSjB7vHz\r\nXpOGVNg8lGNlFSK668jwtfBPJ1fuZkM3qMHSAd5ybAE0NhA6n2cxXyC2sZKD\r\n/hjt9s0y4cZsHSLnQSd4cgj9LzSJ+jaxHZfCKOmw7MXp/qwEScWgHwXZnsxw\r\njZSMy37SEIYhsVwdmiu4oK5AOI5EekSHDiWcMidgHix9bgmOy7Bni137BYK5\r\nwuPYgIiowNE2/eUsMOk+bijUUUOVCemlpg8=\r\n=1kxN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_2.0.0-beta.1_1650515606829_0.20328629817604416"},"_hasShrinkwrap":false},"2.0.0":{"name":"themis-ts","version":"2.0.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","reflect-metadata":"^0.1.13","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"gitHead":"4f5451aeb2c7f35aa06d7471872fadcd6a263ebe","_id":"themis-ts@2.0.0","_nodeVersion":"16.14.2","_npmVersion":"8.6.0","dist":{"integrity":"sha512-yXM3VRFG/vj3hkVVr3kkLA6wdyog9tTV5E/n7WZ0RrAkzWTvZysrqoZSnpYreZuemPb7my1OsJHiJ6C1Lwv1dg==","shasum":"befc3846959e1344b1809e8c607a2e0b6137b2ae","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-2.0.0.tgz","fileCount":93,"unpackedSize":116432,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICB81rvud4n+XJNSaOEmPr6CQ4sKojXjI9eAc1OQKqt5AiEA8Myob43TUsaL7Y82Y/j/dWGcRxNJewEhlP0dIRFiVG4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiYN8NACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoO/Q/9FvpV6+jpW03AV1uTzNKuJXKGNZ6A+3eXWL9AIwwFzZokea4U\r\noiaVp/LQW7KOo6dOACTRxtQM3VzN7/9VS+V9DglemCkCamh9en+shAQWXXvN\r\nDFTBYZDZeZROqJFuXMr64rqOujNIokcGrxQgAWfUA9OJyREwH2v89rxLHbv1\r\n/pdwJN/z2+0H+OkqsgZQYUHuYpQYDHkFo36vMxb28Mx7yikFM/ECKK9UtY/P\r\ncscNcwJi/hjEpgLbcFc9FlsDnjOhmtCZ5E98LHwvMTgPWPUP5VgFftNgfcZM\r\noeK3VMds3S1werIeTKVcv8g/wFhI9WIRwU4vbRkgA6uCOyoE6/rYHwISCljH\r\n/QNECJ+iTRahduxpL/LKtwGLO6M5l88Yhi2qu+Zx9xeMqKEvmDULziSn1AI5\r\nCuZMsvx9TM/iR1TUhsZBYyJFL4HaMdfcphO6nQPBwFeuxIJ7z3waNbXf0lbo\r\nv7QVNVkZgHMtBpFUeoV3/wOHKb1n9CH37Z78lTxVhBo4zMUCujLgt52zSNNA\r\noBUG0zxQijSAF/sy4p43cRA3Fulp9Ama5n/+NatVMhc9qGMtG8zeP/etuFIf\r\ntTPRy7Yg6YwHm2N2U3k7P/S8uik6kHvteV1iVD/Pks84uYe0dsFalRbCd/Ca\r\n230NbQ+xDVYtOMWcexbnyz3K5Md5t2Zz78o=\r\n=b370\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_2.0.0_1650515725844_0.711176459678321"},"_hasShrinkwrap":false},"2.0.0-beta.2":{"name":"themis-ts","version":"2.0.0-beta.2","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","reflect-metadata":"^0.1.13","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts reflect-metadata``` and add the following to your ```tsconfig.json``` file\n```json\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules. There are two types of modules, top level modules and submodules. \nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework. In a top level module, Themis automatically creates\na pipeline which contains all the systems you have registered in the top level module and all of its submodules.\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\n@System()\nclass MySystem implements OnInit, OnUpdate {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(pipeline: Pipeline): void {\n        console.log('hello from MyModule');\n        setInterval(() => pipeline.update(42), 1000);\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis World using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule```\n\n```typescript\nnew WorldBuilder().module(MyModule).build();\n```\n\nAs you can see in the example above, the class ```MyModule``` uses ```Pipeline``` in its update method. As stated before,\na pipeline is automatically setup by Themis for you and contains all the systems you have defined in the top level module\nand all its nested submodules. You can use the pipeline object for periodic updates to your systems, which will result\nin calling all defined update methods in your systems.\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the constructor. We can then use this interface to create \nan entity and add components to the entity.\n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\n@System()\nclass MySystem implements OnInit, OnUpdate {\n\n    constructor(private world: World) {}\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(MyComponentA);\n        entity.addComponent(MyComponentB);\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\n@System()\nclass MyComponentQuerySystem implements OnUpdate {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n  \n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(pipeline: Pipeline): void {\n    console.log('hello from MyModule');\n    setInterval(() => pipeline.update(42), 1000);\n  }\n}\n```\n\nNotice how the submodule does not have the pipeline parameter? As stated before, this is only available in top level\nmodules. But do not worry, your systems, which were defined in the submodule, are still present in the pipeline of\nthe top level module. Themis merges them. How they are merged and in which order are they performed you ask? Well that\nis easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(pipeline: Pipeline): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\nIf you try to resolve a class with zero dependencies, no providers are needed and Themis will just use the type you have\ndefined:\n\n```typescript\n@Inject()\nprivate myClass: MyClass;\n```\n\nTo perform this injection, Themis will try to resolve MyClass. \n\nIf the constructor of MyClass has dependencies, Themis will try to resolve them and inject them into the constructor\ncall. Be sure to have the ```Injectable``` decorator present on MyClass for Themis to be able to detect the dependencies.\n\n```typescript\n// No Injectable decorator needed, as the constructor has no dependencies\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // service will be resolved by Themis\n    }\n}\n```\n\nTo change the strategy Themis uses when resolving dependencies, you can use one of the providers listed above in your modules.\n\n❗ **Beware**: Providers are not limited to their modules, if you register a provider in an arbitrary module, these will\nalso be used in every other module. Be sure to not register two providers for the same identifier, as this will override\npreviously defined providers for that identifier. ❗\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: []\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: []\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n    @Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: []\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Entities-and-Components\">Entities and Components</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Aliases\">Aliases</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Blueprints\">Blueprints</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Events\">Events</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Component-Queries\">Component Queries</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Providers\">Providers</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Systems\">Systems</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Modules\">Modules</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Logging\">Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"02afa01be8642312829c50ed38e839984e188508","_id":"themis-ts@2.0.0-beta.2","_nodeVersion":"16.14.2","_npmVersion":"8.6.0","dist":{"integrity":"sha512-2kpgBIAAlCbwVz8bKPj62Rl7nStG/p292pW4bkzbr1W+G8IHEuH449rVd9FhKjV1HHSx7cpxh0glUvN3PWkbgw==","shasum":"32ebf6f7621da71adc435aebd7e5fdf7e472965b","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-2.0.0-beta.2.tgz","fileCount":93,"unpackedSize":117694,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDIGX/dm1jpum9B3W+tSlp1MIpgTTq8etzO1o9e2nvjTAiEA1xtj6qugMGZXmIHRmMXcYT70dz6sHYg/J2e6yW6cu2A="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiaEvOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpqiw/+PDB5RjOwFNC1v0SeXwI6gIui2+a5i+b8VAM7JSOpBTcMiCJD\r\n/Ux4ALO+ibcgbh6SIrCMVnEk13Kp1bns5pmtNDxD7nJFHB2hLSdUhRkjQ1Hl\r\nQnawr/ILasJE0DNq9zs780l2Sw/fZyfRwpn5kyx3OYop+8r3X7z/qT9bGbV4\r\njOc7Afd5iUG6BObqHp35hD2LqoCGnekmFfO63P0E2LAAPBwA6t7CeoqrJmWF\r\nNqW+hXLn+64tEcCaCJ3/UHgNK0nodw+6IFyadisfMJOJfp+WD39nILiKG3tc\r\ncmx0kCAgnjj5fsBD3mp0L1LaID50iigamCMZ9f88Uz/7XADMEsG6X2uUu3Rq\r\nhUH150wimoESpO+aVCXXC+VAdn5jtMQpu2FUHDnrzmQHPR+I3wfxAjix5NG8\r\nQIRzY9V1xnRsYu5qZXcaQY7M2rx/WREirxOXzOMGW85IFEkdZijK9upYfYru\r\nol+RKkbuR+UXvz9g2sU2jp6ljTmsexpZYRlRgTs9yVkKPoC8EVX0VnaX1jBb\r\n04PvZ3Z7QWkCDF/Aw/N5i+xxEmUBF7XFsQOlAF8uALeHh0ylK6/EvpkahnG4\r\nbC2JlaMoivO1rzxcM8loy1Vvfn92PSe5IrJFUO/RQLeIuK6sp44K8BUdcuCf\r\nZsO2Q663A/uCh4weg3MU5yO5mgZvdgnwQ30=\r\n=KAix\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_2.0.0-beta.2_1651002318325_0.24460747405868588"},"_hasShrinkwrap":false},"3.0.0-beta.1":{"name":"themis-ts","version":"3.0.0-beta.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts reflect-metadata``` and add the following to your ```tsconfig.json``` file\n```json\n    \"experimentalDecorators\": true,\n    \"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules. There are two types of modules, top level modules and submodules. \nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework. In a top level module, Themis automatically creates\na pipeline which contains all the systems you have registered in the top level module and all of its submodules.\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\n@System()\nclass MySystem implements OnInit, OnUpdate {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(pipeline: Pipeline): void {\n        console.log('hello from MyModule');\n        setInterval(() => pipeline.update(42), 1000);\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis World using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule```\n\n```typescript\nnew WorldBuilder().module(MyModule).build();\n```\n\nAs you can see in the example above, the class ```MyModule``` uses ```Pipeline``` in its update method. As stated before,\na pipeline is automatically setup by Themis for you and contains all the systems you have defined in the top level module\nand all its nested submodules. You can use the pipeline object for periodic updates to your systems, which will result\nin calling all defined update methods in your systems.\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the constructor. We can then use this interface to create \nan entity and add components to the entity.\n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\n@System()\nclass MySystem implements OnInit, OnUpdate {\n\n    constructor(private world: World) {}\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(MyComponentA);\n        entity.addComponent(MyComponentB);\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\n@System()\nclass MyComponentQuerySystem implements OnUpdate {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n  \n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(pipeline: Pipeline): void {\n    console.log('hello from MyModule');\n    setInterval(() => pipeline.update(42), 1000);\n  }\n}\n```\n\nNotice how the submodule does not have the pipeline parameter? As stated before, this is only available in top level\nmodules. But do not worry, your systems, which were defined in the submodule, are still present in the pipeline of\nthe top level module. Themis merges them. How they are merged and in which order are they performed you ask? Well that\nis easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(pipeline: Pipeline): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\nIf you try to resolve a class with zero dependencies, no providers are needed and Themis will just use the type you have\ndefined:\n\n```typescript\n@Inject()\nprivate myClass: MyClass;\n```\n\nTo perform this injection, Themis will try to resolve MyClass. \n\nIf the constructor of MyClass has dependencies, Themis will try to resolve them and inject them into the constructor\ncall. Be sure to have the ```Injectable``` decorator present on MyClass for Themis to be able to detect the dependencies.\n\n```typescript\n// No Injectable decorator needed, as the constructor has no dependencies\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // service will be resolved by Themis\n    }\n}\n```\n\nTo change the strategy Themis uses when resolving dependencies, you can use one of the providers listed above in your modules.\n\n❗ **Beware**: Providers are not limited to their modules, if you register a provider in an arbitrary module, these will\nalso be used in every other module. Be sure to not register two providers for the same identifier, as this will override\npreviously defined providers for that identifier. ❗\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: []\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: []\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n    @Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: []\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Entities-and-Components\">Entities and Components</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Aliases\">Aliases</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Blueprints\">Blueprints</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Events\">Events</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Component-Queries\">Component Queries</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Providers\">Providers</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Systems\">Systems</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Modules\">Modules</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Logging\">Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"21aadb381f0362ee9a5b353bd0d2df59404c8efd","_id":"themis-ts@3.0.0-beta.1","_nodeVersion":"16.15.0","_npmVersion":"8.12.0","dist":{"integrity":"sha512-bnKczCelFph09vMX+4g4Tlb/t4AJT2RYTg7OoxTbium8tH2QAWTFEz8KCqxTbPFYrmvMmv/E2qr+PLGNXfWE/w==","shasum":"3cbef19f85cf9e767646a84ad7cb543a70b8f356","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.0.0-beta.1.tgz","fileCount":114,"unpackedSize":129159,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG0BdKFVltf7NKAVRDgI1wH46Uy8mV9qwlq7l0UvUdrdAiEAigDoO9Rh9tsaOCyuLq2BccbWrVxqb76xzgPCfYMAQqs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimaVTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqeKA/+O9KTTveozJwyqCZIP29AllacNJMUvVKDcRExq4e4QmkTL+3T\r\n2IxqhtoiHQ35918rtL2dGf4Gyt7Yh6yKonh745745halAwQ0UTOuQ1WkfbB2\r\ntWqLE9Ep63OrMlF3gR+WXxGGAdQwi9CRUufd5pBnYVZksgJl82BixsipbduI\r\nl240QspDmYoEdkS5snMP2OTaODFt+D4fvwFz4TtCYO4d8W2MmQgonVUbVXzb\r\nzDyr7FFvzya2qLiIGlqfeNbdTZsuS/EQob9hkB1GsLdOEumKxUs+c86JvRYP\r\n/YgfOlu68yfQVezQhqXOT2kQ3PFweWgcZiFGe+IEOO93rKqURU9gSYVPsMUd\r\nyDLUeMYAjLz3Ls7bJSyP2qMeaJNos+8LdcapJnRF3aCz2yPzFRQFh61VUmPo\r\ntIdcfGjaWSGr5tycC3Uwv4ZpqDyIQdAr4g0Y2hOxdBbuBRBYaxWGZ+CygQaW\r\nT8eRXozUGA+kdUHJxlEEaFuarZn3Fte3F8JAihScOPpeJ5TumPc+8Abh4zGn\r\n4P34W58TUGY6ECtJdWCcFjQc3F01w/jn2VggUxSrpPQAjE4pVhMKcl4f1hTc\r\nl0KbycvEqjN4nFdI0mBUxT4P3x8Z6BPTqKGIDhchP64ztDcKXaA5NmG/th89\r\no08LPaW07FqQzRHOZgGvauiyXHzkrjV3RhQ=\r\n=D7Xm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.0.0-beta.1_1654236498998_0.20712310392709377"},"_hasShrinkwrap":false},"3.0.0":{"name":"themis-ts","version":"3.0.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"gitHead":"a7875143b991a9ba7c736d4240634dd6ee52d05c","_id":"themis-ts@3.0.0","_nodeVersion":"16.15.1","_npmVersion":"8.12.0","dist":{"integrity":"sha512-SWlVsulBa/r3nGiY054mekv6SPcqmPHl1BD+02XRPpZclFq0pgYCnTTNHD6Bvvl+hlNthYK6zPmEQLDZ7u2ZGw==","shasum":"f231c306110fcc1c402930d6380c5aac3c8ca53b","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.0.0.tgz","fileCount":114,"unpackedSize":129761,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAKsYptTnNNeNWCYjtIqNd6v2SJ4QNCa4SJ9W8bGa0fIAiA7A2l4YePsyd6n6JJew6Jsu7vGufAzzEYZQFVIL8KeVw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJipzDYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrV/Q/9Ffe+kioXAhR/ab6x0INljWYtpDELTAydVn2OPgOp0jelj3uu\r\n/OTsVO5wnBvjzONSROU6vJ14iaG+qJYUNb+LHKxdLC2yhZ93IGpYAOAXINw5\r\nAVFF7If60AmVczyKvTXdEiqHz66k2LZ22/j2G27i7UxcRP48gNTPjSYrP6kj\r\nSNVyb6q16fFfuXC6QPOGYm2vdVeDbXIzjAJFeXlDAwUtVnt3SUn09jlvEiHy\r\nt3fH+h70F5WR4PRdWxnOmYtHs9n3dR95ShLcrPt/G7dtTUBiTGqn6gP4AsK0\r\naYXRXa05GcgkXWMtIZw1C8yx8S8z1I2/hIZJw4QE4dVnlf60vV+jJkLZLxYH\r\nqOF4DjbvIMsC7+wODZ+sBgZVFqcDJE+LnM13yObY/3iBgEkhMUZWunylG2Bu\r\nTPMFD+i5FTpeFM3sbT+UZ/FFTvbr+aW+FFKNNCG4xiYIPjrbkgeYfF2lzgTn\r\n4W0a8NYw3kafmgmlqOYfgIduoY851HxzDw7SQ5W0MlV9fpNGx/+clvPqUHFH\r\nAk0XJappsG7b94Ho3QXe+nHezXSrUiL38ZMXZ6fio//4ZtaIg8z32Zh69r8W\r\nTQWCuFT5lvJ1iyJ6T0ihXZQFcrRcYOdqACvIutwF9rtZpYfksRN2WRW/BfyN\r\ncIRzBrggjYl68C5WNFDC7G14otkiSxOiyCE=\r\n=EZ5E\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.0.0_1655124184292_0.3397636998745266"},"_hasShrinkwrap":false},"3.0.0-beta.2":{"name":"themis-ts","version":"3.0.0-beta.2","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts reflect-metadata``` and add the following to your ```tsconfig.json``` file\n```json\n\"experimentalDecorators\": true,\n\"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules. There are two types of modules, top level modules and submodules. \nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework. In a top level module, Themis automatically creates\na pipeline which contains all the systems you have registered in the top level module and all of its submodules.\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\n@System()\nclass MySystem implements OnInit, OnUpdate {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(pipeline: Pipeline): void {\n        console.log('hello from MyModule');\n        setInterval(() => pipeline.update(42), 1000);\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis World using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule```\n\n```typescript\nnew WorldBuilder().module(MyModule).build();\n```\n\nAs you can see in the example above, the class ```MyModule``` uses ```Pipeline``` in its update method. As stated before,\na pipeline is automatically setup by Themis for you and contains all the systems you have defined in the top level module\nand all its nested submodules. You can use the pipeline object for periodic updates to your systems, which will result\nin calling all defined update methods in your systems.\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the constructor. We can then use this interface to create \nan entity and add components to the entity.\n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\n@System()\nclass MySystem implements OnInit, OnUpdate {\n\n    constructor(private world: World) {}\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(MyComponentA);\n        entity.addComponent(MyComponentB);\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\n@System()\nclass MyComponentQuerySystem implements OnUpdate {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n  \n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(pipeline: Pipeline): void {\n    console.log('hello from MyModule');\n    setInterval(() => pipeline.update(42), 1000);\n  }\n}\n```\n\nNotice how the submodule does not have the pipeline parameter? As stated before, this is only available in top level\nmodules. But do not worry, your systems, which were defined in the submodule, are still present in the pipeline of\nthe top level module. Themis merges them. How they are merged and in which order are they performed you ask? Well that\nis easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(pipeline: Pipeline): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\n```typescript\n@Injectable()\nexport class SomeClass {\n    \n    // property injection\n    @Inject()\n    private myClass: MyClass;\n\n    // constructor injection\n    constructor(private myService: MyService) {}\n    \n}\n```\n\nBe sure to have the ```Injectable``` decorator present on your classes and make sure you have a provider registered \nin your module for Themis to be able to detect the dependencies.\n\n\n```typescript\n@Injectable()\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // ...\n    }\n}\n\n@Module({\n    systems: [],\n    providers: [MyService, MyClass],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {}\n```\n\n\n```typescript\nproviders: [MyClass]\n``` \nis a shorthand notation for a class provider (see below) which is the same as\n```typescript\nproviders: [{ provide: MyClass, useClass: MyClass }]\n```\n\nProviders are limited to their module scope. If you want them to become available in modules that import your module,\nyou will need to export them using the ```exports``` array of your module. Exporting your providers is totally optional,\nin fact, it is best practice to only export what is really needed to have good encapsulation and modularization of\nyour dependencies.\n\nTo change the strategy Themis uses when resolving dependencies, you can use the following provider types in your\nmodules:\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: [],\n    exports: ['MyValue'] // this will make the defined provider available to modules that import this module\n\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n@Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: [], \n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Entities-and-Components\">Entities and Components</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Aliases\">Aliases</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Blueprints\">Blueprints</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Events\">Events</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Component-Queries\">Component Queries</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Providers\">Providers</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Systems\">Systems</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Modules\">Modules</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Logging\">Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"eed1ac03442bda6160a505ffddeaf97bb673e86c","_id":"themis-ts@3.0.0-beta.2","_nodeVersion":"16.15.1","_npmVersion":"8.12.0","dist":{"integrity":"sha512-S3fx7XYIQPcchTOqN3PH9W/mHhmBIYE8YaHcAs/7kS4h0daGk8qW+nNd4dKuYzvbziYlesEfyi7XtvV0PMdEdg==","shasum":"4945cf8eabe994c22031801f7fbca7b6f50aa74a","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.0.0-beta.2.tgz","fileCount":123,"unpackedSize":138070,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHAtUKJz9iYv1zGN8AqbddhkwFhTBG+Qf8nETIPc8iAPAiBRLTVWPBbqLnGVcUCOgBDb69mNmzGytsfeKfMIl7lE4w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiuzxWACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqS5BAAg9emZ3/EGaYrKkBjWR6cf8o3H9acC8WE8ikBYmYaJxQ9Me4S\r\n94zaIFiyPxQrom/sDpkV/o58IGMZGHOR9UysUwb+XjPcRyvvwtinClrqS/k/\r\niXaNmhoA976vKOBp6cGCahgNrvymXl+fGojlmrA+wamBGPI5UxtPuUtjPi8s\r\n6wyuGb1+Y61S7C7I7QQUfRS6j1YRxlmp5RpOVd7d7Had409gXgq3xCNOl629\r\nTPE9w0Ce67R+JUZ/xN/m817N1CC/APq5zLbJUIpUvRk6Tsfg9PNwAC+tY2KM\r\neM+vbBtGPvxJS0tnDcHpRyX2rzet1otJSHSecYAq9cixGXbq9VnUsJoHopNZ\r\nMC6Py1ySPTLadciheyGJ+0b9l2KE97xVsZaznflUxdHzcJfLARRYBnELkapN\r\ncH1vP0BFpAhhISjSw1uwSEGOGTNw7Z8biGW0vBEKhIilYUNyxudShACmfl+L\r\nG5ucuMBsZZLm02O/ZDDJfHJJXsc0U27X/5BA8AWTkR6F4trpc90OiEL0ZwD1\r\nE71T+/PfY6gjlDn5SJhqurw6puvHoy/CJlpM6nG8Jj5vNAgrIHXMCQVZnC/G\r\nZdPFWPN+Av025FX5dkln95oyDgzdbB8iVjIGaNllJC+mHqw1QsyBtdyvklq/\r\n8vXWtnzgNRUvNyizVveZUr2ZuKiMSux2YPo=\r\n=JwxC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.0.0-beta.2_1656437846429_0.6451755489067947"},"_hasShrinkwrap":false},"3.1.0-beta.1":{"name":"themis-ts","version":"3.1.0-beta.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^27.4.1","@typescript-eslint/eslint-plugin":"^5.18.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2","semantic-release":"^19.0.2","ts-jest":"^27.1.4","tslib":"^2.3.1","typescript":"^4.6.3"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts reflect-metadata``` and add the following to your ```tsconfig.json``` file\n```json\n\"experimentalDecorators\": true,\n\"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules. There are two types of modules, top level modules and submodules. \nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework. In a top level module, Themis automatically creates\na pipeline which contains all the systems you have registered in the top level module and all of its submodules.\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\n@System()\nclass MySystem implements OnInit, OnUpdate {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(pipeline: Pipeline): void {\n        console.log('hello from MyModule');\n        setInterval(() => pipeline.update(42), 1000);\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis World using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule```\n\n```typescript\nnew WorldBuilder().module(MyModule).build();\n```\n\nAs you can see in the example above, the class ```MyModule``` uses ```Pipeline``` in its update method. As stated before,\na pipeline is automatically setup by Themis for you and contains all the systems you have defined in the top level module\nand all its nested submodules. You can use the pipeline object for periodic updates to your systems, which will result\nin calling all defined update methods in your systems.\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the constructor. We can then use this interface to create \nan entity and add components to the entity.\n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\n@System()\nclass MySystem implements OnInit, OnUpdate {\n\n    constructor(private world: World) {}\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(MyComponentA);\n        entity.addComponent(MyComponentB);\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\n@System()\nclass MyComponentQuerySystem implements OnUpdate {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n  \n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(pipeline: Pipeline): void {\n    console.log('hello from MyModule');\n    setInterval(() => pipeline.update(42), 1000);\n  }\n}\n```\n\nNotice how the submodule does not have the pipeline parameter? As stated before, this is only available in top level\nmodules. But do not worry, your systems, which were defined in the submodule, are still present in the pipeline of\nthe top level module. Themis merges them. How they are merged and in which order are they performed you ask? Well that\nis easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(pipeline: Pipeline): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\n```typescript\n@Injectable()\nexport class SomeClass {\n    \n    // property injection\n    @Inject()\n    private myClass: MyClass;\n\n    // constructor injection\n    constructor(private myService: MyService) {}\n    \n}\n```\n\nBe sure to have the ```Injectable``` decorator present on your classes and make sure you have a provider registered \nin your module for Themis to be able to detect the dependencies.\n\n\n```typescript\n@Injectable()\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // ...\n    }\n}\n\n@Module({\n    systems: [],\n    providers: [MyService, MyClass],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {}\n```\n\n\n```typescript\nproviders: [MyClass]\n``` \nis a shorthand notation for a class provider (see below) which is the same as\n```typescript\nproviders: [{ provide: MyClass, useClass: MyClass }]\n```\n\nProviders are limited to their module scope. If you want them to become available in modules that import your module,\nyou will need to export them using the ```exports``` array of your module. Exporting your providers is totally optional,\nin fact, it is best practice to only export what is really needed to have good encapsulation and modularization of\nyour dependencies.\n\nTo change the strategy Themis uses when resolving dependencies, you can use the following provider types in your\nmodules:\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: [],\n    exports: ['MyValue'] // this will make the defined provider available to modules that import this module\n\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n@Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: [], \n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Entities-and-Components\">Entities and Components</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Aliases\">Aliases</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Blueprints\">Blueprints</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Events\">Events</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Component-Queries\">Component Queries</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Providers\">Providers</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Systems\">Systems</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Modules\">Modules</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Logging\">Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"aeb09944e7cb55b7ec65e913d7e5a730da003f30","_id":"themis-ts@3.1.0-beta.1","_nodeVersion":"16.15.1","_npmVersion":"8.12.0","dist":{"integrity":"sha512-j03zS3C6Q4Z12HOVGa4PRIH1eblsFa9voAdZSGAIK5+bYTXhqGLbbfFj0jEO+OSpFCmjAlx9jQrBIE7T5VQ00Q==","shasum":"853700d3aa6f1b613cc68cd1dd2941dfd0a5814d","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.1.0-beta.1.tgz","fileCount":123,"unpackedSize":138070,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA6y7pWheCtEOx7uAd8jiloTydGhepBKrPhKNm/PqUhNAiB5toANd48JAxSIcA38IOzSE2/p9BcMCq8zqGjlA6JPAg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiuz8bACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmroXg//dxVKWZuv5GOBys3esbyVjrW/HgCyGYrmz9faIvhCnu0/kDQP\r\nJBTHLms6SKCuL5FMy2iIi/8e461nfOTqmyPg0m/jp3oZJzdfy7W7Ceix+mVx\r\nrrT4FZsBMagjGRDklqrBM2qMHV82UQZ5xhb8Mcp9yUpJ8cuNqkY78H/ssF8m\r\nq8vwk/yPqUkWC3a0n5bQgwp67WLrd+5aci6qgfVeqfDH94SNwZZAKfxU9ouo\r\nht08aGZeai0BMAQ48Q731q8QxXmxd1S1ppm/BguMZqRCEpifYJoBTlGlKDh4\r\nqOoWZgJwG9T1224Fna5XytbZ78kjKT9CQyr3vi0XgUvl7uUS6d1bnPo7nTQv\r\nRiZ6BCoRZqlJ7dZqU5LJk+V5SiNxQCGW2MGptMoxNmJmovbyrYOxfK6RVzNr\r\ntO4bbQVVKwBZIh3j16ZGuLzIYzc3aH+tGqwBZhiTEz/zyEeC6wOk6qfragKd\r\nIS03FWR7KtmJ2OZo+ecTHckHaC10gBtImxy4ysSbXlDxxcVGTgrM/6cWAedy\r\n4AdEUuhHDfOLxAiBp5r9yK+bhdsPPbk3Osqmmu4TUKqzzVHdM9LGCpGJg7Jb\r\n6UgYvEoQBZLZYz6ifEn2zsY3r/5NIzCprdEeuOnmBegSudIPDH+BBk0rkI0b\r\nAJ2tTG/4HUgOVKMdWwzGA08G5CEJS6Weayw=\r\n=dTId\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.1.0-beta.1_1656438555067_0.9361824623715505"},"_hasShrinkwrap":false},"3.1.0":{"name":"themis-ts","version":"3.1.0","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^28.1.4","@typescript-eslint/eslint-plugin":"^5.30.3","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","jest":"^28.1.2","prettier":"^2.7.1","semantic-release":"^19.0.3","ts-jest":"^28.0.5","tslib":"^2.4.0","typescript":"^4.7.4"},"gitHead":"abafc9bfa455548a2bab6b3bca03690bb9c9d6ec","_id":"themis-ts@3.1.0","_nodeVersion":"16.15.1","_npmVersion":"8.12.0","dist":{"integrity":"sha512-I4BTTyTjp6BUgXQEHsLU45MOEC7Wt4JPiZXxjtU5AhQq5j8Vt2gSy8KLsc0tu8CNjkFQtYngSxkqq2Gk0sUN4A==","shasum":"dfd9e048e807e8e60f0c843df58a60a07bf1ac4c","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.1.0.tgz","fileCount":123,"unpackedSize":138155,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGVuoh9aD266r5fTlUT/2WUs0PdGa5kwMGQ6n1WVJD5AIhAJ/zuNGZVWvMuuLGTHS9VKVdDJww1VTvaHxQ5M+pBP6W"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiwVNQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmom5w/9HQ7+TkyiwmoaBiY1h7sjCPwPFZFaAvl7rysllDsHGXt3tn7O\r\n9qM9o46zKxOcPNq6W3/DjP8OHBPRK4WZpTRi5icrZryayGQ3s+SCj/thdgAz\r\n3AiAyUt7G8pKE3cJ74L/688ss7zkhC21RC7Ig6X8QNi7PM9VEdLtZtxImjqw\r\n5WW51M3PtxppI6egWmerXit+rfxXTkTqR3jwbduF/ZUXR0LJeMGSZLj+3XsY\r\n9LOIJX/jQFfqPgDLEgRN3lYjPHXzK0g9rT/MZ+1cbRXahyAnT/V5hueRzOf3\r\nu0LlyULyb673El5Fs5Ao0Lo6mtu1yuIJ1FPUcGOOVnf5fDjezgryQXoN+1GG\r\nlJwwcIbdwF8dflcefuo5+6UmBd4L0nisJkIUY9NV0/c0GUeTnh0zOjVd+0zs\r\n6A8TgduWGv/697EnFEWMM5rkrjDXpzjkfB0d5A+ge4oOBnJxEJGYwTV+drIi\r\nsbh6ZCX1+qKUCB+/eAlA3Vf4jlwFEKa8MmlmWVk2nMCEfVMahQhlBlIPXrQH\r\nkxDducz6HR1hFsA0dNu5XHcR7K3N0wXpVcZ1IOTzmvIbHzoOLNc7708pIg5u\r\nUtSKLxmUT362bHtbwKodhjLoWs9tJ1qnNdnyR8dFhz0qAflkJ/FkDRonDZbo\r\n+SibBMrcghMiugsI76x3oFGi2HqTWDYAVHg=\r\n=ZNjd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.1.0_1656836944445_0.2556467123904007"},"_hasShrinkwrap":false},"3.1.1-beta.1":{"name":"themis-ts","version":"3.1.1-beta.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^28.1.4","@typescript-eslint/eslint-plugin":"^5.30.3","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","jest":"^28.1.2","prettier":"^2.7.1","semantic-release":"^19.0.3","ts-jest":"^28.0.5","tslib":"^2.4.0","typescript":"^4.7.4"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts reflect-metadata``` and add the following to your ```tsconfig.json``` file\n```json\n\"experimentalDecorators\": true,\n\"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules. There are two types of modules, top level modules and submodules. \nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework. In a top level module, Themis automatically creates\na pipeline which contains all the systems you have registered in the top level module and all of its submodules.\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\n@System()\nclass MySystem implements OnInit, OnUpdate {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(pipeline: Pipeline): void {\n        console.log('hello from MyModule');\n        setInterval(() => pipeline.update(42), 1000);\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis World using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule```\n\n```typescript\nnew WorldBuilder().module(MyModule).build();\n```\n\nAs you can see in the example above, the class ```MyModule``` uses ```Pipeline``` in its update method. As stated before,\na pipeline is automatically setup by Themis for you and contains all the systems you have defined in the top level module\nand all its nested submodules. You can use the pipeline object for periodic updates to your systems, which will result\nin calling all defined update methods in your systems.\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the constructor. We can then use this interface to create \nan entity and add components to the entity.\n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\n@System()\nclass MySystem implements OnInit, OnUpdate {\n\n    constructor(private world: World) {}\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(MyComponentA);\n        entity.addComponent(MyComponentB);\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\n@System()\nclass MyComponentQuerySystem implements OnUpdate {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n  \n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(pipeline: Pipeline): void {\n    console.log('hello from MyModule');\n    setInterval(() => pipeline.update(42), 1000);\n  }\n}\n```\n\nNotice how the submodule does not have the pipeline parameter? As stated before, this is only available in top level\nmodules. But do not worry, your systems, which were defined in the submodule, are still present in the pipeline of\nthe top level module. Themis merges them. How they are merged and in which order are they performed you ask? Well that\nis easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(pipeline: Pipeline): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\n```typescript\n@Injectable()\nexport class SomeClass {\n    \n    // property injection\n    @Inject()\n    private myClass: MyClass;\n\n    // constructor injection\n    constructor(private myService: MyService) {}\n    \n}\n```\n\nBe sure to have the ```Injectable``` decorator present on your classes and make sure you have a provider registered \nin your module for Themis to be able to detect the dependencies.\n\n\n```typescript\n@Injectable()\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // ...\n    }\n}\n\n@Module({\n    systems: [],\n    providers: [MyService, MyClass],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {}\n```\n\n\n```typescript\nproviders: [MyClass]\n``` \nis a shorthand notation for a class provider (see below) which is the same as\n```typescript\nproviders: [{ provide: MyClass, useClass: MyClass }]\n```\n\nProviders are limited to their module scope. If you want them to become available in modules that import your module,\nyou will need to export them using the ```exports``` array of your module. Exporting your providers is totally optional,\nin fact, it is best practice to only export what is really needed to have good encapsulation and modularization of\nyour dependencies.\n\nTo change the strategy Themis uses when resolving dependencies, you can use the following provider types in your\nmodules:\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: [],\n    exports: ['MyValue'] // this will make the defined provider available to modules that import this module\n\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n@Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: [], \n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Entities-and-Components\">Entities and Components</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Aliases\">Aliases</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Blueprints\">Blueprints</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Events\">Events</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Component-Queries\">Component Queries</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Providers\">Providers</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Injection\">Injection</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Systems\">Systems</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Modules\">Modules</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Logging\">Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"fa956cd1d6247366f41d9086aae457161f7c9865","_id":"themis-ts@3.1.1-beta.1","_nodeVersion":"16.16.0","_npmVersion":"8.12.0","dist":{"integrity":"sha512-kJ5wS6q93xUGDbs/5XdrG963Gc8LkCKKSwjbsv2i6X61WghI6Y8Jp0ELJhkJIhy97oaIybvzFfGyhuskbCamdg==","shasum":"1eea6b892e7f700fd2a911ffd3d0899e079ef05c","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.1.1-beta.1.tgz","fileCount":123,"unpackedSize":138794,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBRQ9Rz8jeLoWSWgZ0lOjeyWLdWuZA7c+ZZL6JfAgnYaAiA03SOFXYudGa98ywwr/3AZfASJnIA2b2GnBFipbbBN9g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2ldkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqC8xAAlFzAjnVdOqHjPnhsAb/rWMfWMzeriNxjAd/Jgwl6nB8F7KsX\r\n/vPimBLzhIb2csJzB9N8vl8VgF6EzLaxmOMwMiMYJ6VLs5c9xY6y39LCnjMa\r\nZV3fK/KI3+MW3AaKWSEsXDv3wJQU5XMV8PbvlYRg0Ka3JOg8useTf3gMHPDm\r\nQp11Ohr5Z/vERobF+Wg4gZBkohk2Yau9SxP5PEmW2u5HbOHQzHHXzEFzjGc+\r\nQfCuPb9tPGbiL/SApL/+YH5IOSEdUy3w736PqjfV/Zg9Aiz1mN1VSQrj02ux\r\nG5m2CXNt5+0tgsWbkh40Sil7XAVB1IOcOJzD3fLDSHCKt36yNAjt3tbnxWrd\r\nz1tLlverbCU9/8y+T+3BW26j/Xnc7qWCQf2N4N/ZPJBybPgI4bqOzqhvyKsL\r\nMmlLFZ4C2KKboCOIi3pdtMWo2XxAjqJkZDa0AH/1r/ftp7haHm4YzzvFmMWo\r\nwEhXCuMoW8EELa0P80aiGa1f04eW7ygpZC2VKOeoX/dJGZ3qjYSPwQRFYW2B\r\nxaEuwX/Y4CGLmhXzAFW9vBbQwByovg7PoQdNBJP1m5zICoai/jwjEdrky3Gg\r\nvSRZxSo5A+Vvrbh6/VMpvMw7WjuPx/1V5RutnitWadR6E+jHr0xRp3gfv3QM\r\nXJ3OpbW1wWJznAnOAUjulY7zYETh6MUaAXc=\r\n=U0aG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.1.1-beta.1_1658476388338_0.16645431273405564"},"_hasShrinkwrap":false},"3.1.1":{"name":"themis-ts","version":"3.1.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^28.1.4","@typescript-eslint/eslint-plugin":"^5.30.3","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","jest":"^28.1.2","prettier":"^2.7.1","semantic-release":"^19.0.3","ts-jest":"^28.0.5","tslib":"^2.4.0","typescript":"^4.7.4"},"gitHead":"8e6723a3e10b966019a07655ca1f2aa8ef076e77","_id":"themis-ts@3.1.1","_nodeVersion":"16.16.0","_npmVersion":"8.12.0","dist":{"integrity":"sha512-AAOriNQaDm+TP89dJkNELtcG7FCgp/umnqQlXBO9I5lsZL7UD375/zzDyzfX5qshp7izx5G62CmtN+AqFi8Dbw==","shasum":"53dd0a7fbc73e2bc8661a7bef265f4ef6b0ac46f","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.1.1.tgz","fileCount":123,"unpackedSize":138787,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDLOol5NsORZbB6jSkVNpOFFysNkMgotImCQ8IYJDrAkwIhAKirQqUGM4zpmzKh45TTPdTIA/1iz9ji5vDCg1lB0FTc"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2p5HACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5/w//SKG9ZhPczysspv3Q9ZugUGJ8HhQMWXgArWegvO+QYBtM5jI9\r\n9KHIXQIGvsFAZtEsoCaEymdT33Rl2WBYrD16VCHa/yc417RSyhuNCSBiEP+Z\r\nsf51oOnRD6u+GCrXEIkB55ayvdetKpdnSGj497YtmgFgo3VlKfXhdBFLKeg/\r\nOkSLaJJDzY5ga0vfzDHWBTqlk+NsPoSM3vgScjv0Y1SOZHQvJSNBvma+i9Tm\r\no+EAPkNkr+RXJTOc+veCGGtsV9b1ZsY8rmxX8seZ2thdDAsF/JNPxvf6BSAK\r\n4REhUcF/8D2tIUDUmAOAy3bc/tTzjZmUG0olQhqdzWu/yTR2BBzVr+KEGT3l\r\n8Gl5j2IJE6DwN5NPMQdtA5zwC3+S1mTTe2KqiOEperr4Nr8dH/jnhQ5tRbZS\r\n928hFEwqxnqQRNW2qRNKt2HboiTDtwcIIaPTpybAjM2u7NvzLw2wKYSg+LR8\r\nAHtBOPTQtrdF+sLe2PkAaTZoY9E4sxb1WuKBpYRUx5WTfQ4RZOk6Adk3/3wf\r\nKcFO+PIAxLNNTX/uxg0FaEhirlUaIUKzFmL8MJfG7CHdouHuS2p7enXQd2V+\r\nDj6Af3eO4X/cUeHbvNUeRlnip4LwLIHXYhydvzgV24nLrUzihwb8NkZ/35uK\r\ntyRIjhjfk7S4qzE5GnjqteG7euHFWEM6mG4=\r\n=aPlj\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.1.1_1658494535375_0.24971397178588983"},"_hasShrinkwrap":false},"3.1.1-beta.2":{"name":"themis-ts","version":"3.1.1-beta.2","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^28.1.4","@typescript-eslint/eslint-plugin":"^5.30.3","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","jest":"^28.1.2","prettier":"^2.7.1","semantic-release":"^19.0.3","ts-jest":"^28.0.5","tslib":"^2.4.0","typescript":"^4.7.4"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts reflect-metadata``` and add the following to your ```tsconfig.json``` file\n```json\n\"experimentalDecorators\": true,\n\"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules. There are two types of modules, top level modules and submodules. \nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework. In a top level module, Themis automatically creates\na pipeline which contains all the systems you have registered in the top level module and all of its submodules.\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\n@System()\nclass MySystem implements OnInit, OnUpdate {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(pipeline: Pipeline): void {\n        console.log('hello from MyModule');\n        setInterval(() => pipeline.update(42), 1000);\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis World using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule```\n\n```typescript\nnew WorldBuilder().module(MyModule).build();\n```\n\nAs you can see in the example above, the class ```MyModule``` uses ```Pipeline``` in its update method. As stated before,\na pipeline is automatically setup by Themis for you and contains all the systems you have defined in the top level module\nand all its nested submodules. You can use the pipeline object for periodic updates to your systems, which will result\nin calling all defined update methods in your systems.\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the constructor. We can then use this interface to create \nan entity and add components to the entity.\n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\n@System()\nclass MySystem implements OnInit, OnUpdate {\n\n    constructor(private world: World) {}\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(MyComponentA);\n        entity.addComponent(MyComponentB);\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\n@System()\nclass MyComponentQuerySystem implements OnUpdate {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n  \n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(pipeline: Pipeline): void {\n    console.log('hello from MyModule');\n    setInterval(() => pipeline.update(42), 1000);\n  }\n}\n```\n\nNotice how the submodule does not have the pipeline parameter? As stated before, this is only available in top level\nmodules. But do not worry, your systems, which were defined in the submodule, are still present in the pipeline of\nthe top level module. Themis merges them. How they are merged and in which order are they performed you ask? Well that\nis easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(pipeline: Pipeline): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\n```typescript\n@Injectable()\nexport class SomeClass {\n    \n    // property injection\n    @Inject()\n    private myClass: MyClass;\n\n    // constructor injection\n    constructor(private myService: MyService) {}\n    \n}\n```\n\nBe sure to have the ```Injectable``` decorator present on your classes and make sure you have a provider registered \nin your module for Themis to be able to detect the dependencies.\n\n\n```typescript\n@Injectable()\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // ...\n    }\n}\n\n@Module({\n    systems: [],\n    providers: [MyService, MyClass],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {}\n```\n\n\n```typescript\nproviders: [MyClass]\n``` \nis a shorthand notation for a class provider (see below) which is the same as\n```typescript\nproviders: [{ provide: MyClass, useClass: MyClass }]\n```\n\nProviders are limited to their module scope. If you want them to become available in modules that import your module,\nyou will need to export them using the ```exports``` array of your module. Exporting your providers is totally optional,\nin fact, it is best practice to only export what is really needed to have good encapsulation and modularization of\nyour dependencies.\n\nTo change the strategy Themis uses when resolving dependencies, you can use the following provider types in your\nmodules:\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: [],\n    exports: ['MyValue'] // this will make the defined provider available to modules that import this module\n\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n@Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: [], \n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Entities-and-Components\">Entities and Components</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Aliases\">Aliases</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Blueprints\">Blueprints</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Events\">Events</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Component-Queries\">Component Queries</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Providers\">Providers</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Injection\">Injection</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Systems\">Systems</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Modules\">Modules</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Logging\">Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"2df91cc9a3c93e93477bc7cdf90d4115cfb4a68f","_id":"themis-ts@3.1.1-beta.2","_nodeVersion":"16.16.0","_npmVersion":"8.12.0","dist":{"integrity":"sha512-wJ/6avWaxVPyqaEDyUTqnVa7wFAX0yJxBYnsU/fC/d64Yk2EAASo/ESk5dIm6Zwsh//vYh6hU+5V0TVFmjUQOQ==","shasum":"ef625f8c245eccccaec64b2c44896d15b442689c","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.1.1-beta.2.tgz","fileCount":120,"unpackedSize":138055,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCv/+ckQZqYp3axGG+hLtGchhGtB3qdp/bkYI9dI1Q/AQIhAPrFHOa4B5X/bTdxSOLRR8e73CTIDwmH/be6IY56oYKe"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi45hbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmok5w/5ATqG9Y7KT0eLHmhCclasjG5wBYu5/cWd5DxwzX6WcHzdLoh+\r\nrd8XCLcDCMGwm1Ryy1i4I/wMr59OcaUhGLLnOLe2cEBRtVb2FHaf/rdkrzKH\r\nfQrX4h6CyuBi7rFBE/DyDvA2ZZkhIjQekwr+xJQh0XgGLflTRUDiM3lH70q2\r\nLl8zrgMwd58YLGtKJmWaAka50oIVpGoFhnx4h3piZ0J0MDeFtYcXGUZtLLcR\r\n8MKTDlHniPFG/V9reRNu0+4Ozgf88IOOytb9XEaa4Suw6kuJ5D6xTmY7QumR\r\nkzGwABEuHrGezmDNvp9IEnEb+iSlqQXYvMZAqq5Dmak38ZJM49iLhZ5tuTLQ\r\nkz02PspaLu4kv5PW3si7HiBNSPSfn2Ipdr2W/CwGLMm5qKzSrZ1mLweySJu+\r\n04W55Y6IFpHRbcmomhSZ5Ow3HRjjumWUq/lrdlsIIMZPiwfMiVUH/Qbd0jxm\r\nHtWfTB9MAwRdN+bmZiZsnbDmNgxkZcsSAhanzPCiNDOmMDlvmj7Sv7MCTDux\r\nxqc258PqOBFynqbglv4cH0tRQ5v4dt0Gj69bv9PTyk68pHX8dxgIf2gziJoE\r\nTSFqJ3+ZL3OBmsqUQ8nKLPOiVK38P3DXtgagayW/Ij6k3TdvAevhTm8Fmjry\r\njNn/gTJhYKl7iezbjIYTXKXwFov8aiqw5G8=\r\n=/ha1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.1.1-beta.2_1659082843405_0.005477061440210651"},"_hasShrinkwrap":false},"3.1.2":{"name":"themis-ts","version":"3.1.2","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^28.1.4","@typescript-eslint/eslint-plugin":"^5.30.3","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","jest":"^28.1.2","prettier":"^2.7.1","semantic-release":"^19.0.3","ts-jest":"^28.0.5","tslib":"^2.4.0","typescript":"^4.7.4"},"gitHead":"afdf38c7dae0c2fd45b6901d893a711f60e3a162","_id":"themis-ts@3.1.2","_nodeVersion":"16.16.0","_npmVersion":"8.12.0","dist":{"integrity":"sha512-GxXbVVkc57wXjbFi0Sote5RkbuLKfhiz8aq8pae02Ku3/u7SZtYty4hkYznENfCOVEg0Zu9v60cLiABMUnm8Pg==","shasum":"8104124fcbe9d64309bb73b6a14a4a017a7db0d5","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.1.2.tgz","fileCount":120,"unpackedSize":138048,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCHpOzBvAHUK4tM4gPfImqYyr3XHw2d6lXXusmpzAyhLwIhAIhSMohAdETZg4tDX7hTd7lxzYPci6k4huUqYIf7gySw"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi45iPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp8pg//U5SQAySkMJwGiaPFfIPNzD11KqAOGAHcgjD4BE5/O9NMq62E\r\nKV6uohjji0nQzoVBvQW6lgNd6vZGhzkA8icn2As428ZIvr0C5pYOli8tydxW\r\n/a1OYVOkJfKY5NH0TFkxuX25gEbRDfboB4as9ZlAPWTa1bOWhaJuWcRqFoRc\r\nSpiteviSQig2G/K55eGZLe/oGJtyznp/PJSza5xgWkIPJZbIvA338LmzWiGx\r\nzVZgd+AhlB/JoFf2jOPRp2KCYVsJZz4PXbvkkD3K01YXfv5UafCXK9Jp+HoI\r\nqGwN9e+FXyJnOucjOGDOgfrnLDBJuWu9oqlBGelcNq5JhtVXVprHdXY7NGNk\r\nnkOXS/BbdAsaKnO3tDKrxt2kwpTIMsLoG2C9pZmJ5FtOO7Sx66yK+Xl1RBz5\r\nolpL/21/HqRlUyJaiZCYlW0ZLoz2MocxVzjgKKiX0ExRhEY8uw84wZQHo9st\r\nijMByCfP1UUHTBC03otGUzyfPlm6A2XdTz5GXawcGFK0alKuPmx4oRpy48L9\r\n/oYMfYnBjzJU/qwWeSX8gd8kmG1a7aVW7uzNgLAHdpHwHBMxynBdNsr7C3bc\r\nZ7YOTUsyoh+auui4l/L8PRXDZN/jXt7yMnHzeaeWdOxGAXL8Nnz9MkdlIfpk\r\nGFVIV3wXC+pqcmmFg3mAbG/puBTFEvKxo+w=\r\n=iSIB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.1.2_1659082895023_0.8519716759964779"},"_hasShrinkwrap":false},"3.1.3-beta.1":{"name":"themis-ts","version":"3.1.3-beta.1","description":"entity component system in typescript","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"test":"npx jest","lint":"npx eslint src/** --ext .ts,.tsx","build":"tsc","semantic-release":"semantic-release"},"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"keywords":["ecs"],"author":{"name":"Christopher Bartel"},"license":"MIT","bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"homepage":"https://github.com/themis-ecs/themis-ts#readme","peerDependencies":{"reflect-metadata":"^0.1.13"},"devDependencies":{"@semantic-release/github":"^8.0.4","@semantic-release/npm":"^9.0.1","@semantic-release/release-notes-generator":"^10.0.3","@types/jest":"^28.1.4","@typescript-eslint/eslint-plugin":"^5.30.3","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","jest":"^28.1.2","prettier":"^2.7.1","semantic-release":"^19.0.3","ts-jest":"^28.0.5","tslib":"^2.4.0","typescript":"^4.7.4"},"readme":"<p align=\"center\" style=\"font-size: 36px\">\n  Themis Entity Component System\n</p>\n<p align=\"center\">A modern, lightweight and easy to use ECS for Typescript</p>\n<p align=\"center\">\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/workflow/status/themis-ecs/themis-ts/Main\" alt=\"Build\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dw/themis-ts\" alt=\"Downloads\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/license/themis-ecs/themis-ts\" alt=\"License\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/github/last-commit/themis-ecs/themis-ts\" alt=\"Last Commit\" /></a>\n<a href=\"\" target=\"_blank\"><img src=\"https://img.shields.io/npm/v/themis-ts\" alt=\"NPM\" /></a>\n\n</p>\n\n## 📝 Description\n\n**Themis ECS** aims to be a modern, performant, lightweight, zero-dependencies and easy to use **Entity Component\nSystem** with a clean and intuitive API written in **TypeScript**.\n\n## 🚀 Getting Started\n\nTo get started with Themis there is little to do:\n\n### Project Setup\n\nInstall Themis ECS in your TypeScript project using ```npm install themis-ts reflect-metadata``` and add the following to your ```tsconfig.json``` file\n```json\n\"experimentalDecorators\": true,\n\"emitDecoratorMetadata\": true,\n```\n\n### Basics\n\nIn Themis ECS you define your world in modules.\nA module is used to organize your code, it contains your systems, providers and submodules. Systems are an ECS specific\nfeature, whereas providers are used for dependency injection. Did you know? Themis helps you write better code by\nproviding you with a lightweight dependency injection framework.\n\nA bit confused? Well, let's hop into some code to see everything in action and work on the details later:\n\nLet's create a simple system:\n```typescript\n@System()\nclass MySystem implements OnInit, OnUpdate {\n    \n    init(): void {\n        console.log('hello from MySystem');\n    }\n    \n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\nNow let's create our first module:\n```typescript\n@Module({\n    systems: [MySystem],\n    providers: [],\n    imports: []\n})\nclass MyModule {\n    \n    init(): void {\n        console.log('hello from MyModule');\n    }\n}\n```\n\nThe last thing we need to do now, is to create our Themis `World` using the ```WorldBuilder``` class. We will register\nour newly created module ```MyModule``` and then we will call the `update` method of our newly created ```World``` \nperiodically.\n\n```typescript\nconst world = new WorldBuilder().module(MyModule).build();\nsetInterval(() => world.update(42), 1000);\n```\n\n\n\n### Create Entities and add Components\n\nLet us head back to our system MySystem and inject the ```World``` interface using the constructor. We can then use this interface to create \nan entity and add components to the entity.\n\n```typescript\nclass MyComponentA {\n    value: number = 13;\n}\n\nclass MyComponentB {\n    value: string = 'the brown fox is not quick today';\n}\n\n@System()\nclass MySystem implements OnInit, OnUpdate {\n\n    constructor(private world: World) {}\n\n    init(): void {\n        console.log('hello from MySystem');\n        const entity = this.world.createEntity();\n        entity.addComponent(MyComponentA);\n        entity.addComponent(MyComponentB);\n    }\n\n    update(dt: number): void {\n        console.log('hello from update, dt is ', dt);\n    }\n}\n```\n\n### Query for Entities\n\nMost of the time, when using an ECS, we are interested in entities, which match a specific query described by the\ncomponents present or absent on these entities. In Themis, you can define a query using the ```ComponentQuery```\ndecorator. Let us create a new system which queries for all entities, which contain ```MyComponentA``` and \n```MyComponentB```:\n\n```typescript\n@System()\nclass MyComponentQuerySystem implements OnUpdate {\n    \n  @ComponentQuery(all(MyComponentA, MyComponentB))\n  private query!: Query;\n  \n  update(): void {\n    this.query.entities.forEach((entity) => {\n        console.log(entity.getComponent(MyComponentA).value); // 13\n        console.log(entity.getComponent(MyComponentB).value); // 'the brown fox is not quick today'\n    });\n  }\n}\n```\n\nHere we use the ```all``` function, which means, that all components have to be present on the entity to match the query.\nThere are two more predefined functions ```any``` and ```none```, which means that only one or none of the components.\n\nTo use the System, simply add it to the systems array of ```MyModule```.\n\n### Submodules\n\nIn the example above, we have added all of our systems directly to the top level module. It is more convenient to\ncreate one or multiple submodules for your systems and add those submodules to the import array of your top level module.\nEspecially if your codebase grows, this will help you to keep everything modular and well organized.\n\n```typescript\n@Module({\n  systems: [MySystem, MyComponentQuerySystem],\n  providers: [],\n  imports: []\n})\nclass MySubModule {\n    \n  init(): void {\n    console.log('hello from MySubModule');\n  }\n}\n\n@Module({\n  systems: [],\n  providers: [],\n  imports: [MySubModule]\n})\nclass MyModule {\n    \n  init(): void {\n    console.log('hello from MyModule');\n  }\n}\n```\n\nWondering how Themis will handle the order of your systems?\nWell that is easy to answer:\n\nSay we have a top level module named A, and submodules named a, b and c. Module A defines systems A1 and A2,\nthe submodule a defines systems a1, a2 and submodules b and c define systems b1, b2, b3 and c1.\n\nThey are registered in the following order:\n```typescript\n@Module({\n  systems: [a1, a2]\n})\nclass a {}\n\n@Module({\n  systems: [b1, b2, b3]\n})\nclass b {}\n\n@Module({\n  systems: [c1]\n})\nclass c {}\n\n\n@Module({\n  systems: [A1, A2],\n  imports: [a, b, c]\n})\nclass A {\n  init(): void {\n    // ...\n  }\n}\n```\n\nThe order of execution will then be:\n```a1``` ```a2``` ```b1``` ```b2``` ```b3``` ```c1``` ```A1``` ```A2```\n\nThis order also applies for nested submodules. In fact, you traverse the tree by depth-first post-order.\n\n### Dependency Injection and Providers\n\nThemis will automatically inject modules and systems.\n\nYou can register custom dependencies to Themis by using the ```Provider``` interface. There are 3 types of providers:\n* Class Provider\n* Value Provider\n* Factory Provider\n\n```typescript\n@Injectable()\nexport class SomeClass {\n    \n    // property injection\n    @Inject()\n    private myClass: MyClass;\n\n    // constructor injection\n    constructor(private myService: MyService) {}\n    \n}\n```\n\nBe sure to have the ```Injectable``` decorator present on your classes and make sure you have a provider registered \nin your module for Themis to be able to detect the dependencies.\n\n\n```typescript\n@Injectable()\nclass MyService {\n    constructor() {\n        // ...\n    }\n}\n\n@Injectable()\nclass MyClass {\n    constructor(service: MyService) {\n        // ...\n    }\n}\n\n@Module({\n    systems: [],\n    providers: [MyService, MyClass],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {}\n```\n\n\n```typescript\nproviders: [MyClass]\n``` \nis a shorthand notation for a class provider (see below) which is the same as\n```typescript\nproviders: [{ provide: MyClass, useClass: MyClass }]\n```\n\nProviders are limited to their module scope. If you want them to become available in modules that import your module,\nyou will need to export them using the ```exports``` array of your module. Exporting your providers is totally optional,\nin fact, it is best practice to only export what is really needed to have good encapsulation and modularization of\nyour dependencies.\n\nTo change the strategy Themis uses when resolving dependencies, you can use the following provider types in your\nmodules:\n\n\n#### Class Provider\n```typescript\n\nconst classProvider = { provide: MyClass, useClass: MyClassImpl };\n\n@Module({\n    systems: [],\n    providers: [classProvider],\n    imports: [],\n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n   @Inject()\n   private myClass!: MyClass; // Themis will resolve MyClassImpl and inject the instance\n}\n```\n\n#### Value Provider\n```typescript\n\nconst valueProvider = { provide: 'MyValue', useValue: 42 };\n\n@Module({\n    systems: [],\n    providers: [valueProvider],\n    imports: [],\n    exports: ['MyValue'] // this will make the defined provider available to modules that import this module\n\n})\nclass MyModule {\n    \n    @Inject('MyValue')\n    private myValue!: number; // Themis will inject 42\n}\n```\n\n#### Factory Provider\n```typescript\n\nconst factoryProvider = { provide: MyClass, useFactory: () => new MyClassImpl() }\n\n@Module({\n    systems: [],\n    providers: [factoryProvider],\n    imports: [], \n    exports: [MyClass] // this will make the defined provider available to modules that import this module\n})\nclass MyModule {\n    \n    @Inject()\n    private myClass!: MyClass; // Themis will call the factory and inject the returned value\n}\n```\n\n## 📚 Further Reading\n\nThemis offers a variety of features to help you write better code.\n\n<ul>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Entities-and-Components\">Entities and Components</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Aliases\">Aliases</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Blueprints\">Blueprints</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Events\">Events</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Component-Queries\">Component Queries</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Providers\">Providers</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Injection\">Injection</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Systems\">Systems</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Modules\">Modules</a></li>\n    <li><a href=\"https://github.com/themis-ecs/themis-ts/wiki/Logging\">Logging</a></li>\n</ul>\n","readmeFilename":"README.md","gitHead":"d48980eebf1559cc19f08dbe7510746361130988","_id":"themis-ts@3.1.3-beta.1","_nodeVersion":"16.16.0","_npmVersion":"8.12.0","dist":{"integrity":"sha512-GdSHwR7uWbz7/D2NWdpWcddQmah1XIOpVNVF+aPZmSO9xVA/3AocF4dBWZXVkLNGLZEzManei+1VHGVm86qpTA==","shasum":"e0339857bccb253fc960b0a88068ad4a92338767","tarball":"https://registry.npmjs.org/themis-ts/-/themis-ts-3.1.3-beta.1.tgz","fileCount":120,"unpackedSize":135956,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICBMNABezFBi9w7vSrHUI033prYzJygfG1qpsAMXfgKyAiEAiFEdQJ4OU9cgK8KouUYdg231j85BFhz20fVmgZQHuP8="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjCyugACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpjLw/9FBp34Ig5kXDo+9Exk9X9gePfGP83Xk5DmLuAx0+XlnNaH3oC\r\n/cTbjOz1sc4QFtXFqwTxm03UjkoGcHFZChmjgjKhSFQnoY/gmkWbF6y8iLx4\r\nKuXHTBxFIgPAQ5j4RAsiM9P1h/ZLtVgLBNClGeiDlXKm4znbAwRX7hth1e5U\r\nfH4mqWIW4++BBnEJyXY15dxha0bSffsUTSf7ZV/neweHgunYhTyGdbDDZe3l\r\nSBcaIr3Bh079sympjLB2C2P8E4ShmQy2V2BrwbPgWKm4UDnQVUGqbjHBLSKu\r\n0gqhuGLvK+gF0oxiCZUwPr9KN3XnJ3hTF+ylzoBEezYTwpKpa0Sf8z0LfP6U\r\ny7oi6x7DpHGq2QG/hvxonj9JFHucgWJXnm5RChRyD6J8Mq1t5+ytdltYC5wR\r\n47WevVgIZ5J2aGeLX2smGXYS03Cr6sZ9h5JdA+Dw2zEc70Y2I5EL6cPkKHIj\r\ngYsvlZ8ib0B21gN4oJrLTF+CrCZuPASPzrMmIE0G+NhhNma76A06fyp0x7wL\r\n1bBYHYr9Fmnbl0L7a6g0F6dUcK5h2ZnbJb7jBjABKgNi/CIUUOWfQVvCb4g+\r\nN1Vg7EHX5w8JdB/CRUvXi/aYWnZQfjihUtYg9Qbdb2x2Zocm/OTFB+WVS9eQ\r\n5TYMZnmiMT9mZcHENbQ5mAQl+l01uI7MQjA=\r\n=3B3r\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"themis-ecs","email":"themis.ecs@gmail.com"},"directories":{},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/themis-ts_3.1.3-beta.1_1661676448478_0.014449455470094463"},"_hasShrinkwrap":false}},"time":{"created":"2021-07-09T09:39:19.321Z","0.1.0":"2021-07-09T09:39:19.444Z","modified":"2022-08-28T08:47:28.775Z","0.1.1":"2021-07-09T10:06:28.859Z","0.1.2":"2021-07-09T10:16:38.578Z","0.3.0":"2021-08-27T11:46:25.387Z","0.3.1":"2021-08-27T12:15:19.913Z","0.4.0":"2021-08-31T19:11:53.255Z","1.0.0":"2021-09-26T09:53:10.362Z","1.1.0-beta.1":"2022-01-28T12:57:54.887Z","1.1.0":"2022-03-12T12:55:45.957Z","1.2.0-beta.1":"2022-04-08T09:40:17.437Z","1.2.0":"2022-04-08T09:42:36.435Z","1.2.0-beta.2":"2022-04-13T16:15:25.531Z","1.3.0":"2022-04-13T16:20:13.268Z","2.0.0-beta.1":"2022-04-21T04:33:26.989Z","2.0.0":"2022-04-21T04:35:25.952Z","2.0.0-beta.2":"2022-04-26T19:45:18.530Z","3.0.0-beta.1":"2022-06-03T06:08:19.176Z","3.0.0":"2022-06-13T12:43:04.461Z","3.0.0-beta.2":"2022-06-28T17:37:26.666Z","3.1.0-beta.1":"2022-06-28T17:49:15.208Z","3.1.0":"2022-07-03T08:29:04.613Z","3.1.1-beta.1":"2022-07-22T07:53:08.533Z","3.1.1":"2022-07-22T12:55:35.575Z","3.1.1-beta.2":"2022-07-29T08:20:43.639Z","3.1.2":"2022-07-29T08:21:35.276Z","3.1.3-beta.1":"2022-08-28T08:47:28.715Z"},"maintainers":[{"name":"themis-ecs","email":"themis.ecs@gmail.com"}],"description":"entity component system in typescript","homepage":"https://github.com/themis-ecs/themis-ts#readme","keywords":["ecs"],"repository":{"type":"git","url":"git+https://github.com/themis-ecs/themis-ts.git"},"author":{"name":"Christopher Bartel"},"bugs":{"url":"https://github.com/themis-ecs/themis-ts/issues"},"license":"MIT","readme":"","readmeFilename":""}