{"_id":"@okikio/native","_rev":"30-c7f4ace70cb08ae7c2235535c9c8f0a7","name":"@okikio/native","dist-tags":{"latest":"3.0.1","pnpm-temp":"0.0.7","v$npm_package_version":"1.0.0","beta":"3.1.0"},"versions":{"0.0.3":{"name":"@okikio/native","version":"0.0.3","description":"A framework who's goal is to make it easier to create complex, performant, light-weight, web applications using native js apis.","publishConfig":{"access":"public"},"main":"lib/api.js","umd:main":"lib/api.umd.js","browser":"lib/api.umd.js","unpkg":"lib/api.umd.js","module":"lib/api.es.js","source":"src/api.ts","types":"lib/api.d.ts","scripts":{"build":"microbundle build --name native --external natives","watch":"microbundle watch --name native --external natives","release":"npm run build && npm publish --tag latest","patch":"npm version patch && npm run release","minor":"npm version minor && npm run release","major":"npm version major && npm run release","docs":"gulp build","test":"gulp"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","js","native","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native#readme","devDependencies":{"@okikio/animate":"^0.0.3","@rollup/plugin-node-resolve":"^8.1.0","browser-sync":"^2.26.7","eslint":"^7.3.1","gulp":"^4.0.2","gulp-sass":"^4.1.0","gulp-swig":"^0.9.1","microbundle":"^0.12.2","rollup":"^2.18.0","rollup-plugin-typescript2":"^0.27.1","tslib":"^2.0.0","typescript":"^3.9.5"},"dependencies":{"@okikio/emitter":"^0.0.3","@okikio/manager":"^0.0.3"},"gitHead":"bf264b406d5493642c518e18702b76a1fab0c88a","_id":"@okikio/native@0.0.3","_nodeVersion":"14.3.0","_npmVersion":"lerna/3.22.1/node@v14.3.0+x64 (win32)","dist":{"integrity":"sha512-Gql2PPBdOhA7ZK5zovvZBhgzqen69gHGNfv0iTDmYf77LYR2ze4EGX6OV3o7ZdD6RyxxXSZh6rTcj2YjDR/aRA==","shasum":"bbad03a973374c95eb10695739af323d900e236f","tarball":"https://registry.npmjs.org/@okikio/native/-/native-0.0.3.tgz","fileCount":35,"unpackedSize":662020,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe9vZSCRA9TVsSAnZWagAASyMP/RskcfKkZlrrbMtt+Hv8\neELAaftrGx/7U4CydOEXN8GVEcw9kWKKwZL1p6E+mTnw1G/WTKTbB21d42WP\nO4KVV6DxkD5hZzdmD2ZkEuYQYpXj5PM0q94+rTXrcbmbw26eZ3hXECV/QzFb\nlZnsLd+6zOnkCt6majQsYPCcjbLFZUPADXKv+PEyJS1et1moyrLt97Tl3Kro\nsUiiZIorVF6+NYYTtXTrzlVLcUyaViGXfTNDmVJDTuAvPtWq/deX7DWWVbSX\neCTJqREefsU8tlNVwrlAE2lCIxh/IMRdcAnZ6lEW3T+g06lT/zx7ynUmhDG/\nn0x/e8R+tHg+b7lglPreW8AHz4hfvajyH4gC6xC+7ZfS/VoCJSRv1zLVinma\njgPWIstKBKbIKeAOcXWs2pULsZvFn/Ctk2bDLg7kIrin6Dzf6YuYdAmoXATa\nZlodNfyJMgotzE/2MGnnEhdMr9V+ff/16kV5upRmd2vACZlLFfLMArJnSClg\nPeuHLWgSCK0gP+DM0X1K5Q5Kd3n7VGF7La0TOwyfBkkZszOsqWNWl1DrBaKE\nb3vlj03DS2zXztFof8KsKz78hd3XeJ7a3RSd8npXlYwwvMmpkUI3TZ5ezqFI\nWum5tA96oDe/VSmsaOIjwkOWUX1xT0/56VicRYcQmBxCggthscqYUcf3mYMA\naqrw\r\n=TaIh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/q/JrMteZTgFthRDcHpxzdk1emyqsv1WHAqRXZFmwXgIhAMKP8fppw2GKBsJmBSIZE17nnrK+qz/wlZhHiak83J5G"}]},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_0.0.3_1593243218260_0.42956801869418704"},"_hasShrinkwrap":false},"0.0.4":{"name":"@okikio/native","version":"0.0.4","description":"A framework who's goal is to make it easier to create complex, performant, light-weight, web applications using native js apis.","publishConfig":{"access":"public","main":"lib/api.js","types":"lib/api.d.ts","umd:main":"lib/api.umd.js","browser":"lib/api.umd.js","unpkg":"lib/api.umd.js","module":"lib/api.mjs"},"umd:name":"native","main":"lib/api.js","source":"src/api.ts","output":[{"file":"lib/api.mjs","format":"es"},{"file":"lib/api.umd.js","format":"umd"},{"file":"lib/api.js","format":"iife"}],"scripts":{"build":"rollup --config","watch":"rollup --config --watch","test":"jest --maxWorkers=1 --coverage","test:watch":"jest --maxWorkers=1 --watch","pre-release":"npm run build && npm run test","docs:build":"gulp build","docs:watch":"gulp"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","js","native","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native#readme","devDependencies":{"@okikio/animate":"^0.0.4","@rollup/plugin-node-resolve":"^8.1.0","@types/jest":"^26.0.3","browser-sync":"^2.26.7","eslint":"^7.3.1","gulp":"^4.0.2","gulp-sass":"^4.1.0","gulp-swig":"^0.9.1","jest":"^26.1.0","jest-chain":"^1.1.5","jest-environment-jsdom-global":"^2.0.4","jest-watch-lerna-packages":"^1.1.0","pnpm":"^5.2.6","rollup":"^2.18.1","rollup-plugin-esbuild":"^2.1.0","rollup-plugin-typescript2":"^0.27.1","ts-jest":"^26.1.1","tslib":"^2.0.0","typescript":"^3.9.5"},"dependencies":{"@okikio/emitter":"^0.0.4","@okikio/manager":"^0.0.4"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"lib/api.d.ts","umd:main":"lib/api.umd.js","browser":"lib/api.umd.js","unpkg":"lib/api.umd.js","module":"lib/api.mjs","readme":"# nativejs\r\n\r\n[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/okikio/nativejs)\r\n\r\nA framework who's goal is to make it easier to create complex, performant, light-weight, web applications using native js apis. It was inspired by Rezo Zero's Starting Blocks project, and Barba.js. Both libraries had a major impact on the development of this project. Barba.js is easy to use and elevates the experience of a site with the use of PJAX, while Starting Blocks used native apis to create light-weight but complex web experiences. This project exists as a more flexible alternative to Starting Blocks, but with the same intuitive design and experience (UX/DX) Barba.js provides. It also, allows for web apps to be created without the need of PJAX, and safely switches back to normal HTML controls if JS is disabled.\r\n\r\nThis project is called a framework but it is more like a guideline, if all you want is a simple starter project that has PJAX built in then you install the project from `npm` once it becomes available, but otherwise you download the project into you workspace and tweak it to match your projects needs and remove all the extra fluff you don't want (By the way, this project works best with treeshaking, so, for the sake of speed, performance, and weight use Rollup or Webpack; Rollup is preferred).\r\n","readmeFilename":"README.md","_id":"@okikio/native@0.0.4","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-A5WmVQdwKB56MMmR1QmBgzl2Cb6Nis25Zs7JjIlIjOHOpjqY4HU4wE6QFOkiMOeZzdzfszAhoOnSoD14G/WUCA==","shasum":"1708aaff8d1675ac112d966e218c5b4318de69e5","tarball":"https://registry.npmjs.org/@okikio/native/-/native-0.0.4.tgz","fileCount":49,"unpackedSize":541318,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+WFFCRA9TVsSAnZWagAAOa8P/jjBwwlzvBOa6C9kdOHR\noafr79U81LBhF/9he5ku1fL568M1AQqgSwVVPhGyH8JTeN0nqit81OT6/w3h\nI2L63WRdMdxYImVXhfQ5raq9les/OH2Tsaii9ArwWFBsaGXn3Zv3nFq5mvj+\n3tfnF7N+M3z2AHgBPXljmTLCYiKkbITFYaTax95sI2O9+MCkIyKQvhf80h62\nP3M/LAFX6709E0GAHpQE5xLUlF9MFdThsf3hOeyK4WLHGGIYiyl2QBg80uRz\nzBuQhbentZnI8ul1L9XYqmGkn+4x3e310tZqYBwwcSqRdiikaldyzzuEhpT5\nze0WhvbNlhgHoiD0g+647H8kaLncipvspPE3/2E4DcuJQDAfai6IcRZVpnaO\n45HEty3LxGVsC0fvnJ18IWqzBIx7vjgFwg/m14kcRpilkKYARqfK0UBxWw5g\n7dJUrKMdshXTyy7E1MbZ56o0OdLy3KJ2DHC+UHK1t+t7bAxNBCj/NC2EmWIZ\n8fCaoD9rRrozk59qH633eGa8qFTydxJB7PxokDI6TAIxgQ5bylKOf1BY1wtO\n+LAjEU3347U0IpH7BXQsoitkukkM0cijuHAksX7nxz++hvNmFBH1YDOK60Aw\nOo+zOkQzYIwcbpWZ6KmD0A5UYlLkx3E4ZI7kiMGY7qhsfXEWcb3KmSEidIrr\n2ww0\r\n=NmZV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAol5MU1jhtZm2wO1ysPjDuCebmzVEtiKG97UiQL1UAIAiBSbR/IRZwjow9RRA3SVAmvYaxAKO3hqr4bjEK+BTQIrw=="}]},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_0.0.4_1593401669157_0.23674257611148586"},"_hasShrinkwrap":false},"0.0.5":{"name":"@okikio/native","version":"0.0.5","description":"A framework who's goal is to make it easier to create complex, performant, light-weight, web applications using native js apis.","publishConfig":{"access":"public","main":"lib/api.js","types":"lib/api.d.ts","umd:main":"lib/api.umd.js","browser":"lib/api.umd.js","unpkg":"lib/api.umd.js","module":"lib/api.mjs"},"umd:name":"native","main":"src/api.ts","source":"src/api.ts","output":[{"file":"lib/api.mjs","format":"es"},{"file":"lib/api.umd.js","format":"umd"},{"file":"lib/api.js","format":"iife"}],"scripts":{"build":"rollup --config","watch":"rollup --config --watch","test":"jest --maxWorkers=1 --coverage","test:watch":"jest --maxWorkers=1 --watch","pre-release":"npm run build && npm run test","docs:build":"gulp build","docs:watch":"gulp"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","js","native","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native#readme","devDependencies":{"@okikio/animate":"^0.0.5","@rollup/plugin-node-resolve":"^8.1.0","@types/jest":"^26.0.3","browser-sync":"^2.26.7","eslint":"^7.3.1","gulp":"^4.0.2","gulp-sass":"^4.1.0","gulp-swig":"^0.9.1","jest":"^26.1.0","jest-chain":"^1.1.5","jest-environment-jsdom-global":"^2.0.4","jest-watch-lerna-packages":"^1.1.0","pnpm":"^5.2.6","rollup":"^2.18.1","rollup-plugin-esbuild":"^2.1.0","rollup-plugin-typescript2":"^0.27.1","ts-jest":"^26.1.1","tslib":"^2.0.0","typescript":"^3.9.5"},"dependencies":{"@okikio/emitter":"^0.0.5","@okikio/manager":"^0.0.5"},"gitHead":"3d7675e5fa289d445a5c75d74108f80f0d7f5c69","_id":"@okikio/native@0.0.5","_nodeVersion":"14.3.0","_npmVersion":"lerna/3.22.1/node@v14.3.0+x64 (win32)","dist":{"integrity":"sha512-VUMt7ed2O+DhaY58SoRWetn8xWlcscSr0ZZqWtVUzyUpPl2JOB+wjnN41IOnct7KX77PD3oJ31hjM9070uRbEg==","shasum":"cb0d7fce79e9c74aaf2a134ea62c946505d3bea2","tarball":"https://registry.npmjs.org/@okikio/native/-/native-0.0.5.tgz","fileCount":49,"unpackedSize":541849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+WpmCRA9TVsSAnZWagAAb9gP/338Cx7pcqvZayNairtp\nnxVJ6oJ/9EwRJaB9D1d4XDk2te+eKSVmwJgEGiM/elkf4eSPNLPwAac6WR7f\ne1aUydF4Dx0uGpQDC0sqAKih2xKfrKdAUZcj2hsD6G3MZwW+UR56UZ8ZDdwD\nkZproPvtogDLh5V2H++DQXi3OmmPpQrrpJARlg3o7KkEXJ/BektF+wRNfTcZ\n1HDHsOXwfJIdQX3hckzVN75ULm97MLtWcl+XHmYVoxCi3Hc195oosM6FT1Ns\nP/u2eW7VH1AafHrP8C4D1PM7TQwFb+lR/TYhen0VmhitsFEVmE3kW9DTLSlG\nRVcI4uJV8TaSs5nuFN6FMVrgxvfPVZr7/MTwzd0XQRGPZ4Dfbwv47QVcTrLz\naKxtK5hA0G83hD0xx34rWx+E+nvtlObdiBtiJRc5XIXTTE9nVyJEox91EsQ1\ncVL62LvEM7Vjs5wBlP/eu474UW92K7UF6U//3RQun0TsmoM5hYC9KMi8BDMH\n4CbKmJOp2EYQYI4DZdXpIeD0SloBdGpgAn4L6eUZ/BRyx5e+Q5d4LZZ9ceDt\nG9os/4Ee11VvyIxcdMBb6u5M+c5HYzQBaFuBDW3Rd+jOYBc7Wz2jgRZYxPhL\nhe1RgsebQTt5MkBRi4Z9kXBMHAMe709g9JU5JuvVJZXr3FAnCTf1Bj8QZbRb\nOzur\r\n=SHHk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDaaV1ea1YOpUgp6vBQn5Gn+5FxhBNHdppYmjIqdfOUPwIgV2gbfLC3asDkWPVxErwhGo67y8opJRBTRiuDnq5Q1/c="}]},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_0.0.5_1593404006373_0.35971925330247223"},"_hasShrinkwrap":false},"0.0.6":{"name":"@okikio/native","version":"0.0.6","description":"A framework who's goal is to make it easier to create complex, performant, light-weight, web applications using native js apis.","publishConfig":{"access":"public","main":"lib/api.js","types":"lib/api.d.ts","umd:main":"lib/api.umd.js","browser":"lib/api.umd.js","unpkg":"lib/api.umd.js","module":"lib/api.mjs"},"umd:name":"native","main":"lib/api.js","source":"src/api.ts","output":[{"file":"lib/api.mjs","format":"es"},{"file":"lib/api.umd.js","format":"umd"},{"file":"lib/api.js","format":"iife"}],"scripts":{"build":"rollup --config","watch":"rollup --config --watch","test":"jest --maxWorkers=1 --coverage","test:watch":"jest --maxWorkers=1 --watch","pre-release":"npm run build && npm run test","docs:build":"gulp build","docs:watch":"gulp"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","js","native","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native#readme","devDependencies":{"@okikio/animate":"^0.0.6","@rollup/plugin-node-resolve":"^8.1.0","@types/jest":"^26.0.3","browser-sync":"^2.26.7","eslint":"^7.3.1","gulp":"^4.0.2","gulp-sass":"^4.1.0","gulp-swig":"^0.9.1","jest":"^26.1.0","jest-chain":"^1.1.5","jest-environment-jsdom-global":"^2.0.4","jest-watch-lerna-packages":"^1.1.0","pnpm":"^5.2.6","rollup":"^2.18.1","rollup-plugin-esbuild":"^2.1.0","rollup-plugin-typescript2":"^0.27.1","ts-jest":"^26.1.1","tslib":"^2.0.0","typescript":"^3.9.5"},"dependencies":{"@okikio/emitter":"^0.0.6","@okikio/manager":"^0.0.6"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"lib/api.d.ts","umd:main":"lib/api.umd.js","browser":"lib/api.umd.js","unpkg":"lib/api.umd.js","module":"lib/api.mjs","_id":"@okikio/native@0.0.6","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-rS4gQwIFk9xM/0iF+zBnooM5EcNysJ2vNgsiwptW8RmQSwGUJWGeXCUgpOB0GPOJCxxUTPfUJlvBnep2ma0R8w==","shasum":"3c64e2b56dc7b55e3c311e94836055896c4fd039","tarball":"https://registry.npmjs.org/@okikio/native/-/native-0.0.6.tgz","fileCount":49,"unpackedSize":541519,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+W2cCRA9TVsSAnZWagAAdgAP/3Knt6NB5ZvM50/tl6nU\n9eLArqL3jNc80MtWyJfy6SeAmN72w1V8R0XAS/O7jEJb+65CICGOvfYQuwKi\noVohhTM2K4SuD0BiF4GeRPdUG98TrrvoAf2nxcbxjbVbnf1vwJTpR4SrxMZa\nOKbVE63Hq99VmWWa5EpcrCxOI2DI6E3bRuhoBM04bk6itqkDJ73PKVwEhtPj\nEBx/rCSfz28vPDfucpBXYKAIeSypcL6s6+ZlwiAm1hBUQDbbqVHqs2hXOhQO\nf6wkfW+omRcTK1d7QUNRnL6AbQNVjnpbGTVkrFPw8YS+b0LflWZY4D40wylj\nKvkp77z9+n8/c9k3vAuDO4XZM2aIoWgHCMYBm5EUweC2c0JCtyEaga9fScmV\nxzheJ6ac2S8YJYFYCd0fJ9kIFsDNFV9CDHwr2Rbzn/mJ5qtB0J+qTrEMMEt1\n0xESMNbzUnk/ck59/Kk7NrSOmx4qVrCdyS867GVLEtGerfBMl2nLEOz04pHR\n9RxKyv2Avl8XA69WqtXYWFJQ/HXOwhbp0F4ma09Cr5TF+tu1ygxG0vWZiukH\nfqWlg5j1ISrAhjLl3hFEC8kP56bMfFilDZheuH9aJUIsreJmTGO6uRCJIEIH\nsIDrY7hBf47B8gtxRMQsqwGrfVX+qYbWUmSJYZzoWzmEaQ1xXDlubH2jomXf\nxrXD\r\n=2UaH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFmAA2pAH6Yd4ZFZP5jtZYKliY09at1jAnPvmUUOWE42AiEAmCgazxPzDHWd7yKZIyky5eUxcSwJPXnnfp/wfawPDeg="}]},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_0.0.6_1593404828209_0.7274262722636928"},"_hasShrinkwrap":false},"0.0.7":{"name":"@okikio/native","version":"0.0.7","description":"A framework who's goal is to make it easier to create complex, performant, light-weight, web applications using native js apis.","publishConfig":{"access":"public","main":"lib/api.js","types":"lib/api.d.ts","umd:main":"lib/api.umd.js","browser":"lib/api.umd.js","unpkg":"lib/api.umd.js","module":"lib/api.mjs"},"umd:name":"native","main":"lib/api.js","source":"src/api.ts","output":[{"file":"lib/api.mjs","format":"es"},{"file":"lib/api.umd.js","format":"umd"},{"file":"lib/api.js","format":"iife"}],"scripts":{"build":"rollup --config","watch":"rollup --config --watch","test":"jest --maxWorkers=3 --coverage","test:watch":"jest --maxWorkers=3 --watch --verbose false","pre-release":"ultra build && ultra docs:build && ultra test","docs:build":"gulp build","docs:watch":"gulp"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","js","native","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native#readme","devDependencies":{"@okikio/animate":"^0.0.7","@rollup/plugin-node-resolve":"^8.1.0","@types/jest":"^26.0.3","browser-sync":"^2.26.7","connect-logger":"^0.0.1","eslint":"^7.3.1","gulp":"^4.0.2","gulp-sass":"^4.1.0","gulp-swig":"^0.9.1","jest":"^26.1.0","jest-chain":"^1.1.5","jest-environment-jsdom-global":"^2.0.4","jest-watch-lerna-packages":"^1.1.0","rollup":"^2.18.1","rollup-plugin-esbuild":"^2.1.0","rollup-plugin-typescript2":"^0.27.1","ts-jest":"^26.1.1","tslib":"^2.0.0","typescript":"^3.9.5","ultra":"^0.7.2"},"dependencies":{"@okikio/emitter":"^0.0.7","@okikio/manager":"^0.0.7"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"lib/api.d.ts","umd:main":"lib/api.umd.js","browser":"lib/api.umd.js","unpkg":"lib/api.umd.js","module":"lib/api.mjs","_id":"@okikio/native@0.0.7","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-UpCiqPg15W2jpLdPOnSqZJGTMbaSBbpX1InuiJ2bfPsEyFqkP6btIc2E7gtcqITikZNtD5PXpiXdNEXmgIrfrA==","shasum":"2b0a40b8b6b86022d1d1d3f929f7cd24b2a0ba92","tarball":"https://registry.npmjs.org/@okikio/native/-/native-0.0.7.tgz","fileCount":36,"unpackedSize":496561,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe/ZRpCRA9TVsSAnZWagAAifAP/i3Wr3oLRoDKwBZfTNPh\nhS1nqrcN9i+3esoHw1atilZ+mq3n2wc1zf+F7yMLIgDTRKVxMb+oNvaJpiiX\nzdbKxt8MprOJw2B885P9VobmtEXCqWhEmUUSu4dARdT+sp0BL9ztqQ9VRuza\n3+CESRDNmZinJxqDMSKgbsR+rToKbFhIxp2KVFOnhowAJ3aODwXl+cdrcCxB\nZKD+Z/RqyW4UOtyedrj20+T3wiu2vZLmfIKu9FJz4ku5OSQ337YlUghNVJ0V\nSVvMbihD6WnQKxLbYYURzvqvjEEQrVN9tJg9w7POzNGPULGLb3CjJIkfpJXx\nSui5csPnNhMppVUqtzAWHGExdBBzHDQcmAj5bw0Pv5gUmDP9OQfTctB6EiWS\nP/MKbZ2eNeKTq5hx3ZSIYdFp2V5e0WIn7i1vEa1F4lP9ZSoXO7EEXnRoPLTF\nkXXlqfLKgkzKR4qtUnPJxhtCQGktq+AbqRX4JFuUYdLhJA8nzCUges37tBko\nXdmpMLzJ/O3XqjbKEZ3d1C6zz/mtfHc69w2bJ3W9nHuX3CwQmKY2qC2odlbE\njbZ1rrEVdbIJrGs2xoXUEOvpoq33jfSWwg2gU5Qzaxknd2EdupFHwP/UJj7K\nTxcmQ2KXBiLI39pUdXnyUh/LqyInnK9k3NsLM/g0kPrKnT7kbpodbKYlWWtt\nT0MJ\r\n=dqbT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtb0LhgrerVxkUThPU4QbZo/RgTykMdDzwCnfdYiAjqQIgMO3vij2WznOd7x62OnYL1ikBhSVkNyQtwmxI4XnPv7c="}]},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_0.0.7_1593676904791_0.004292520631086649"},"_hasShrinkwrap":false},"1.0.0":{"name":"@okikio/native","version":"1.0.0","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.js","types":"lib/types/api.d.ts","browser":"lib/api.js","node":"lib/api.node.js","unpkg":"lib/api.js","module":"lib/api.modern.js","exports":"lib/api.modern.js"},"main":"lib/api.js","source":"src/api.ts","directories":{"lib":"lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts && npm run demo:build","demo:build":"gulp build","demo:watch":"gulp default --watch"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.0.0","@okikio/emitter":"1.0.0","@okikio/manager":"1.0.0","esbuild":"^0.8.26","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","typescript":"^4.1.3"},"devDependencies":{"browser-sync":"^2.26.13","chokidar":"^3.4.3","eslint":"^7.16.0","gulp":"^4.0.2","gulp-esbuild":"^0.3.9","gulp-pug":"^4.0.1","gulp-sass":"^4.1.0","merge-stream":"^2.0.0","standard-changelog":"^2.0.27","ultra-runner":"^3.8.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"lib/types/api.d.ts","browser":"lib/api.js","unpkg":"lib/api.js","module":"lib/api.modern.js","exports":"lib/api.modern.js","readme":"# @okikio/native\r\n\r\n`Native` is the initiative that encourages performance, modern technologies, and great user experiences. The idea behind `@okikio/native` is that it acts as the core framework to the `native` initiative, it combines all the other package into it a core package that is ~7 KB (minified & compressed).\r\n\r\n`@okikio/native` is a guideline on how to create great web experiences that integrate into the system in a way that feels like a cohesive and native experience.\r\n\r\nThe idea behind it is that, when an app feels native, it means that it integrates well into the systems and `just works`, for example, a dark mode that follows the entire system. The `just works` aspect is key to the framework, it should work without the user skipping a beat. On the web this boils down to being performant, efficient, and smooth.\r\n\r\nThe `@okikio/native` package achieves performance, high efficiency, and a smooth experience by being heavily modern (relying on passive polyfills that only run on browsers that don't support certain features) and being well optimized.\r\n\r\nCurrently many websites rely on older code to make sure they reach as wide an audience as possible, hurting performance with large amounts of overhead.\r\n\r\n`@okikio/native` uses modern browser api's like the Web Animation API, Maps, pushState, etc.... to achieve high efficiency and performance. The browser API's can be difficult to work with, so, I developed `@okikio/manager`, `@okikio/emitter`, and `@okiko/animate` libraries to make them more managable. I developed these libraries to ensure the framework is well optimized and to avoid large ammounts of npm dependencies.\r\n\r\n\r\n\r\n\r\nYou can play with `@okikio/native` using Gitpod:\r\n\r\n\r\n[![Edit with Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/okikio/native)\r\n\r\n_Start the dev script by typing into the terminal_\r\n\r\n```bash\r\nultra pnpm demo:watch --filter *native\r\n```\r\n\r\nOnce Gitpod has booted up, go to the `./packages/native/build folder` and start tweaking and testing to your hearts content.\r\n\r\n\r\n## Table of Contents\r\n- [@okikio/native](#okikionative)\r\n  - [Table of Contents](#table-of-contents)\r\n  - [Getting Started](#getting-started)\r\n  - [Installation](#installation)\r\n  - [Demo](#demo)\r\n  - [API](#api)\r\n    - [*Types*](#types)\r\n    - [**ManagerItem**](#manageritem)\r\n      - [MangerItem#manager: IAdvancedManager;](#mangeritemmanager-iadvancedmanager)\r\n      - [MangerItem#app: IApp;](#mangeritemapp-iapp)\r\n      - [MangerItem#config: ICONFIG;](#mangeritemconfig-iconfig)\r\n      - [MangerItem#emitter: EventEmitter;](#mangeritememitter-eventemitter)\r\n      - [MangerItem#key: any;](#mangeritemkey-any)\r\n      - [MangerItem#install(): any;](#mangeriteminstall-any)\r\n      - [MangerItem#register(manager: IAdvancedManager, key: any): ManagerItem;](#mangeritemregistermanager-iadvancedmanager-key-any-manageritem)\r\n      - [MangerItem#uninstall(): any;](#mangeritemuninstall-any)\r\n      - [MangerItem#unregister(manager: IAdvancedManager, key: any): any;](#mangeritemunregistermanager-iadvancedmanager-key-any-any)\r\n      - [Example](#example)\r\n    - [**AdvanncedManager**](#advanncedmanager)\r\n      - [Example](#example-1)\r\n      - [AdvancedManager#....Manager](#advancedmanagermanager)\r\n      - [AdvancedManager#app: IApp;](#advancedmanagerapp-iapp)\r\n      - [AdvancedManager#config: ICONFIG;](#advancedmanagerconfig-iconfig)\r\n      - [AdvancedManager#emitter: EventEmitter;](#advancedmanageremitter-eventemitter)\r\n      - [AdvancedManager#constructor(app: IApp): AdvancedManager<K, V extends ManagerItem>](#advancedmanagerconstructorapp-iapp-advancedmanagerk-v-extends-manageritem)\r\n      - [AdvancedManager#set(key: K, value: V): AdvancedManager<K, V extends ManagerItem>](#advancedmanagersetkey-k-value-v-advancedmanagerk-v-extends-manageritem)\r\n    - [**Service**](#service)\r\n      - [Service#init(...args: any): any](#serviceinitargs-any-any)\r\n      - [Service#boot(...args: any): any](#servicebootargs-any-any)\r\n      - [Service#initEvents(): void](#serviceinitevents-void)\r\n      - [Service#stopEvents(): void](#servicestopevents-void)\r\n      - [Service#stop(): void](#servicestop-void)\r\n      - [Example](#example-2)\r\n    - [**ServiceManager**](#servicemanager)\r\n      - [ServiceManager/#stop()/#boot()/#init(): ServiceManager](#servicemanagerstopbootinit-servicemanager)\r\n    - [**App**](#app)\r\n      - [App#config: ICONFIG;](#appconfig-iconfig)\r\n      - [App#emitter: EventEmitter;](#appemitter-eventemitter)\r\n      - [App#services: ServiceManager;](#appservices-servicemanager)\r\n      - [App#constructor(config: object = {}): App](#appconstructorconfig-object---app)\r\n      - [App#register(config: ICONFIG = {}): App](#appregisterconfig-iconfig---app)\r\n      - [App/#get(key: string): Service/#set(key: string, value: Service): App/#add(value: Service): App](#appgetkey-string-servicesetkey-string-value-service-appaddvalue-service-app)\r\n      - [App#boot(): App](#appboot-app)\r\n      - [App#stop(): App](#appstop-app)\r\n      - [App#on/off(events: EventInput, callback?: ListenerCallback): App](#apponoffevents-eventinput-callback-listenercallback-app)\r\n      - [App#emit(events: string | any[], ...args: any): App](#appemitevents-string--any-args-any-app)\r\n      - [Example](#example-3)\r\n    - [**HistoryManager**](#historymanager)\r\n      - [HistoryManager#states: IState[]](#historymanagerstates-istate)\r\n      - [HistoryManager#pointer: number](#historymanagerpointer-number)\r\n      - [HistoryManager#init(): void](#historymanagerinit-void)\r\n      - [HistoryManager#get(index: number): IState](#historymanagergetindex-number-istate)\r\n      - [HistoryManager#add(value?: IState, historyAction: \"replace\" | \"push\" = \"push\"): HistoryManager](#historymanageraddvalue-istate-historyaction-replace--push--push-historymanager)\r\n      - [HistoryManager#remove(index?: number): HistoryManager](#historymanagerremoveindex-number-historymanager)\r\n      - [HistoryManager#replace(newStates: IState[]): HistoryManager](#historymanagerreplacenewstates-istate-historymanager)\r\n      - [HistoryManager#set(i: number, state: IState): IState](#historymanagerseti-number-state-istate-istate)\r\n      - [HistoryManager#current: IState](#historymanagercurrent-istate)\r\n      - [HistoryManager#last: IState](#historymanagerlast-istate)\r\n      - [HistoryManager#previous: IState | null](#historymanagerprevious-istate--null)\r\n      - [HistoryManager#length: number](#historymanagerlength-number)\r\n      - [#newCoords(x: number = window.scrollX, y: number = window.scrollY): ICoords](#newcoordsx-number--windowscrollx-y-number--windowscrolly-icoords)\r\n      - [#newState(state: IState): IState](#newstatestate-istate-istate)\r\n      - [#changeState(action: \"push\" | \"replace\", state: IState, item: object): void](#changestateaction-push--replace-state-istate-item-object-void)\r\n      - [Example](#example-4)\r\n    - [**TransitionManager**](#transitionmanager)\r\n    - [**PageManager/Page**](#pagemanagerpage)\r\n    - [**PJAX**](#pjax)\r\n    - [**Router**](#router)\r\n  - [Contributing](#contributing)\r\n  - [Licence](#licence)\r\n\r\n## Getting Started\r\n\r\n`@okikio/native` was inspired by Rezo Zero's Starting Blocks project, and barbajs. Both libraries had a major impact on the development of this project. barbajs is easy to use and elevates the experience of a site with the use of PJAX, while Starting Blocks uses modern apis to create performant but complex web experiences. This project exists as a more flexible alternative to Starting Blocks, but with the same intuitive design and experience (UX/DX) barbajs provides. The framework doesn't need PJAX to function, and best of all if PJAX is enabled it can safely switch back to normal browser controls if something goes wrong.\r\n\r\nThis project is called a framework but it is more like a guideline, if all you want is a simple starter project that has PJAX built in then you install the project from `npm`, but otherwise you download the project into you workspace and tweak it to match your projects needs and remove all the extra fluff you don't want (this project works best with treeshaking, you can use rollup, webpack, or esbuild for this; esbuild is preferred).\r\n\r\nThis package is built for ES2020, it expects the user to use a build tool to support older versions of browsers, the idea being most people are using evergreen browsers, so, why are web developers piling on polyfill code that most users don't need.\r\n\r\n## Installation\r\nYou can install `@okikio/native` from `npm` via `npm i @okikio/native` or `yarn add @okikio/native`. You can use `@okikio/native` on the web via:\r\n* [https://unpkg.com/@okikio/native@latest/lib/api.modern.js](https://unpkg.com/@okikio/native@latest/lib/api.modern.js),\r\n* [https://cdn.skypack.dev/@okikio/native](https://cdn.skypack.dev/@okikio/native) or\r\n* [https://cdn.jsdelivr.net/npm/@okikio/native@latest/lib/api.modern.js](https://cdn.jsdelivr.net/npm/@okikio/native@latest/lib/api.modern.js).\r\n\r\nOnce installed it can be used like this:\r\n```javascript\r\nimport { App, PJAX } from \"@okikio/native\";\r\nimport { App, PJAX } from \"https://unpkg.com/@okikio/native@latest/lib/api.modern.js\";\r\nimport { App, PJAX } from \"https://cdn.jsdelivr.net/npm/@okikio/native@latest/lib/api.modern.js\";\r\n// Or\r\nimport { App, PJAX } from \"https://cdn.skypack.dev/@okikio/native\";\r\n\r\n// Via script tag\r\n<script src=\"https://unpkg.com/@okikio/native@latest/lib/api.js\"></script>\r\n// Do note, on the web you need to do this, if you installed it via the script tag:\r\nconst { App, PJAX } = window.native;\r\n```\r\n\r\n## Demo\r\n\r\nLocated in [./build](https://github.com/okikio/native/tree/master/packages/native/build), you will find multiple build files that can help you create your setup. The [./pug folder](https://github.com/okikio/native/tree/master/packages/native/build/pug) contains [pug](https://pugjs.org/api/getting-started.html) files that format my html in a clean and clear way. The [./sass folder](https://github.com/okikio/native/tree/master/packages/native/build/sass) contains [scss](https://sass-lang.com/guide) files that allow for modern css without the need of polyfills. The [./ts folder](https://github.com/okikio/native/tree/master/packages/native/build/ts) contains [typescript](https://www.typescriptlang.org/) files that the framework runs on; typescript is used, because Intellisense is better with typescript. Outside the build folder, the [gulpfile.js](https://github.com/okikio/native/tree/master/packages/native/gulpfile.js) file, is part of my [gulp](https://gulpjs.com/) config, and is the tool I use to build the demo, for your project other tools should also work, with some amoount of work. Explore the files stated above to learn how to get started.\r\n\r\n\r\n> [View the Demo  &#8594;](https://okikio.github.io/native/packages/native/demo/)\r\n\r\n\r\n## API\r\n`@okikio/native` has `5` base classes and `5` project classes, the base classes are:\r\n* `ManagerItem`\r\n* `AdvanncedManager`\r\n* `Service`\r\n* `ServiceManager`\r\n* `App`\r\n\r\nWhile the `5` project classes are:\r\n* `HistoryManager`\r\n* `TransitionManager`\r\n* `PageManager/Page`\r\n* `PJAX`\r\n* `Router`\r\n\r\nProject classes are optional and are based on the type of project you are creating, if they are not used, tree shaking using `rollup`, `webpack`, or `esbuild` should get rid of them.\r\n\r\nThe `5 base classes` are mandatory classes that are built into the framework (tree shaking won't be able to get rid of them).\r\n\r\n*Note: all classes that aren't base classes are `Service`'s, or they extend the `Service` class in some way.*\r\n### *Types*\r\n\r\nMany typescript types are used in the docs, for more info about these types go to [./lib/types](https://github.com/okikio/native/tree/master/packages/native/lib/types).\r\n\r\n### **ManagerItem**\r\n\r\n`MangerItem` is a class that can only be stored in the `AdvancedManager` class, it is self aware of it's envrioment, so the `ManagerItem` is aware of the `AdvancedManager` it's stored in, and the `App` instance that the `AdvancedManager` is attached to. It can also access data from other `ManagerItem`'s via the `AdvancedManager` and `App`. Be very careful with `ManagerItem` as it references, so, many other classes that if you don't properly dispose of a reference you might create a mermory leak unknowingly.\r\n\r\n`ManagerItem` only gains self awareness after it has been registered with an `AdvancedManager` that has also been instantiated in an `App` (rather non-dynamic isn't it). I didn't use Promises or other dependency injection methods because it adds complexity and bulk in a way most project don't need. If your project requires such a dynamic and complex setup you should use WebWorkers and a custom dependency injection setup, but that is far out of the scope of this framework for now, unfortunately a custom solution will be require for each project. If in the future `@okikio/native` needs dependency injection I would be willing to build it in.\r\n\r\n*Note: when working with WebWorkers don't use more than one or 2 at a time, I have found that two is the maximum that lower end hardware can safely use with max performance.*\r\n\r\n#### MangerItem#manager: IAdvancedManager;\r\n```ts\r\nMangerItem.prototype.manager: IAdvancedManager;\r\n\r\n/**\r\n * The AdvancedManager the ManagerItem is attached to;\r\n * It only gains self awareness after it has been registered to a `AdvancedManager` that has also been instantiated in an `App`\r\n *\r\n * @type IAdvancedManager\r\n */\r\n```\r\n\r\n#### MangerItem#app: IApp;\r\n```ts\r\nMangerItem.prototype.app: IApp;\r\n\r\n/**\r\n * The App the ManagerItem is attached to\r\n *\r\n * @type IApp\r\n */\r\n```\r\n\r\n#### MangerItem#config: ICONFIG;\r\n```ts\r\nMangerItem.prototype.config: ICONFIG;\r\n\r\n/**\r\n * The Config of the App the ManagerItem is attached to\r\n *\r\n * @type ICONFIG\r\n */\r\n```\r\n\r\n#### MangerItem#emitter: EventEmitter;\r\n```ts\r\nMangerItem.prototype.emitter: EventEmitter;\r\n\r\n/**\r\n * The EventEmitter of the App the ManagerItem is attached to\r\n *\r\n * @type EventEmitter\r\n */\r\n```\r\n\r\n#### MangerItem#key: any;\r\n```ts\r\nMangerItem.prototype.key: any;\r\n\r\n/**\r\n * The key of ManagerItem when set in a AdvancedManager;\r\n *\r\n * @type any\r\n */\r\n```\r\n\r\n#### MangerItem#install(): any;\r\n```ts\r\nMangerItem.prototype.install(): any;\r\n\r\n/**\r\n * Runs after the ManagerItem has been registered. By default it does nothing, but if ManagerItem is extended it can be fairly useful for completing tasks right after it a ManagerItem is added to an AdvancedManager\r\n *\r\n * @returns any\r\n */\r\n```\r\n\r\n#### MangerItem#register(manager: IAdvancedManager, key: any): ManagerItem;\r\n```ts\r\nMangerItem.prototype.register(manager: IAdvancedManager, key: any): ManagerItem;\r\n\r\n/**\r\n * Registers the ManagerItem and makes it self aware\r\n *\r\n * @param {IAdvancedManager} manager\r\n * @param {any} key\r\n * @returns ManagerItem\r\n */\r\n```\r\n\r\n#### MangerItem#uninstall(): any;\r\n```ts\r\nMangerItem.prototype.uninstall(): any;\r\n\r\n/**\r\n * Runs before the ManagerItem has been unregistered. By default it does nothing, but if ManagerItem is extended it can be fairly useful, for disposing of references, etc...\r\n *\r\n * @returns any\r\n */\r\n```\r\n\r\n#### MangerItem#unregister(manager: IAdvancedManager, key: any): any;\r\n```ts\r\nMangerItem.prototype.unregister(): any;\r\n\r\n/**\r\n * Unregisters the ManagerItem, removes its self awareness, and removes the ManagerItem from the AdvancedManager. Use this onces you are done with a ManagerItem and want to dispose of it's access to other base classes\r\n *\r\n * @returns any\r\n */\r\n```\r\n\r\n#### Example\r\n```ts\r\nimport { App, AdvancedManager, ManagerItem } from \"@okikio/native\";\r\n\r\nconst app = new App();\r\nconst manager = new AdvancedManager(app);\r\nconst item = new ManagerItem(); // Not yet self aware\r\nconst item2 = new ManagerItem(); // Not yet self aware\r\n\r\n// Now ManagerItem is self aware\r\nmanager.add(item);\r\nmanager.set(\"item2\", item2);\r\n\r\n// ManagerItem now has access to App, Config, Manager, Emitter, etc...\r\nconsole.log(item.app); // => App { ... }\r\nconsole.log(item.config); // => { ... }\r\nconsole.log(item.emitter); // => EventEmitter { ... }\r\nconsole.log(item.manager); // => AdvancedManager { ... }\r\nconsole.log(item.manager.get(\"item2\")); // => ManagerItem { ... }\r\nconsole.log(item2.key); // => \"item2\"\r\nconsole.log(item); // => ManagerItem { ... }\r\n\r\nitem2.unregister();\r\n\r\n// ManagerItem now has access to App, Config, Manager, Emitter, etc...\r\nconsole.log(item2.app); // => undefined\r\nconsole.log(item2.config); // =>undefined\r\nconsole.log(item2.emitter); // => undefined\r\nconsole.log(item2.manager); // => undefined\r\nconsole.log(item2); // => ManagerItem { ... }\r\n\r\n// Note: it unregisters the key, and removes the ManagerItem from the AdvancedManager\r\nconsole.log(item2.key); // => undefined\r\nconsole.log(item.manager.get(\"item2\")); // => undefined\r\n```\r\n\r\n*Note: `Service` extends `ManagerItem`, so, everything that holds for `ManagerItem` also holds for `Service`.*\r\n\r\n### **AdvanncedManager**\r\n\r\nThe `AdvancedManager` class is an extention of the `Manager` class (`AdvancedManager` extends `Manager`). `AdvancedManager` has the ability to share details about the `App` class it's attached to -- to the `ManagerItem`'s it stores.\r\n\r\nFor example, `AdvancedManager` can give access to the `App` classes `ServiceManager` to a `ManagerItem` from another `AdvancedManager`, allowing a `ManagerItem` to access `Service`'s running on the `App` inside `ServiceManager` (say that 5 time fast, 😂).\r\n\r\n#### Example\r\n```ts\r\nimport { AdvancedManager, ManagerItem, Service } from \"@okikio/native\";\r\nconst app = new App();\r\nconst manager = new AdvancedManager(app);\r\nconst item = new ManagerItem(); // Not yet self aware\r\napp.test_manager = manager;\r\n\r\n// Now ManagerItem is self aware\r\nmanager.set(\"item\", item);\r\n\r\n// Not yet self aware; Service extends ManagerItem\r\nconst service = new Service();\r\napp.set(\"service\", service); // Now Service is self aware\r\n\r\nconsole.log(item.app.get(\"service\")); // => Service { ... }\r\nconsole.log(service.app.test_manager); // => AdvancedManager { ... }\r\n\r\nlet _item = service.app.test_manager.get(\"item\");\r\nconsole.log(_item); // => ManagerItem { ... }\r\nconsole.log(_item.key); // => \"item\"\r\nconsole.log(item.key); // => \"item\"\r\n```\r\n#### AdvancedManager#....Manager#\r\nAll the properties and methods of the `Manager` class, read [@okikio/manager's README](../manager/README.md) to learn more.\r\n\r\n#### AdvancedManager#app: IApp;\r\n```ts\r\nAdvancedManager.prototype.app: IApp;\r\n\r\n/**\r\n * The App the AdvancedManager is attached to\r\n *\r\n * @type IApp\r\n */\r\n```\r\n\r\n#### AdvancedManager#config: ICONFIG;\r\n```ts\r\nAdvancedManager.prototype.config: ICONFIG;\r\n\r\n/**\r\n * The Config of the App the AdvancedManager is attached to\r\n *\r\n * @type ICONFIG\r\n */\r\n```\r\n\r\n#### AdvancedManager#emitter: EventEmitter;\r\n```ts\r\nAdvancedManager.prototype.emitter: EventEmitter;\r\n\r\n/**\r\n * The EventEmitter of the App the AdvancedManager is attached to\r\n *\r\n * @type EventEmitter\r\n */\r\n```\r\n\r\n#### AdvancedManager#constructor(app: IApp): AdvancedManager<K, V extends ManagerItem>\r\n```ts\r\nAdvancedManager.prototype.constructor(app: IApp): AdvancedManager<K, V extends ManagerItem>;\r\nnew AdvancedManager(app: IApp): AdvancedManager<K, V extends ManagerItem>;\r\n\r\n/**\r\n * @param {IApp} app - The instance of the App class, the Manager is instantiated in\r\n */\r\n```\r\n\r\n#### AdvancedManager#set(key: K, value: V): AdvancedManager<K, V extends ManagerItem>\r\n```ts\r\nAdvancedManager.prototype.set(key: K, value: V): AdvancedManager<V extends ManagerItem>;\r\n\r\n/**\r\n * Set a value (V extends ManagerItem) in the Manager and register the ManagerItem\r\n *\r\n * @param  {K} key - The key where the ManagerItem will be stored\r\n * @param  {V extends ManagerItem} value - The ManagerItem to store\r\n * @returns AdvancedManager<K, V extends ManagerItem>\r\n */\r\n```\r\n\r\nThe example above should also work to explain how to use the `AdvancedManager` API's.\r\n\r\n*Note: `ServiceManager` extends `AdvancedManager`, so all the properties and methods present, will also work on `ServiceManager`.*\r\n\r\n\r\n### **Service**\r\n`Service` does everything, it is what enables, `PJAX`, `HistoryManager`, `Router`, `PageManager`, and `TransitionManager` to function, even though they are seperate from the `App` class.\r\n\r\n`Service` is an extention of `ManagerItem`, that adds extra life-cycle methods for controlling specific kinds of actions that require js.\r\n\r\nThe life-cycle methods of a `Service` are register(), install(), init(), boot(), initEvents(), stop(), stopEvents(), uninstall(), and unregister().\r\n\r\nHere is a diagram that may aid in your understanding.\r\n[![Life Cycle Diagram](./assets/lifecycle.png)](./assets/lifecycle.png)\r\n\r\nThe life-cycle is controlled by the `ServiceManager`, the `Service`'s themselves have the life-cycle methods, but only the `ServiceManager` can decide when to call the life-cycle methods of all `Service`'s.\r\n\r\nThe `ServiceManager` recieves instruction from the `App` via a method call, to which the `ServiceManager` then initializes all `Service`'s via the `init()` method, and after all `Service`'s have been initialized the `ServiceManager` then boots all `Service`'s via the `boot()` method, the `boot()` method then initializes any events the `Service` may have via `initEvents()`, that's the life-cycle for starting a `Service`.\r\n\r\nTo stop the `Service`'s the `SeviceManager` calls the `stop()` method for all `Service`'s, which calls the `stopEvents()` and `unregister()` methods, completely reseting the `Service` to just before it was added to the `ServiceManager`.\r\n\r\n*Note: there also exists an `install()` & `register()` method (inherited from `ManagerItem`) that installs and makes a `Service` self aware on addition to the `ServiceManager`. The `stop()` method removes a `Service`'s self awareness, to make a `Service` self aware again, the Service has to be re-added to `ServiceManger`.*\r\n\r\n*Note: all classes that aren't base classes are `Service`'s, or they extend the `Service` class in some way.*\r\n\r\n#### Service#init(...args: any): any\r\n```ts\r\nService.prototype.init(...args: any): any;\r\n\r\n/**\r\n * Called before the start of a Service, represents a constructor of sorts\r\n *\r\n * @param  {any} [...args]\r\n * @returns any\r\n */\r\n```\r\n\r\n#### Service#boot(...args: any): any\r\n```ts\r\nService.prototype.boot(...args: any): any;\r\n\r\n/**\r\n * Called on start of Service.\r\n * Calls initEvents() method\r\n *\r\n * @param  {any} [...args]\r\n * @returns any\r\n */\r\n```\r\n\r\n#### Service#initEvents(): void\r\n```ts\r\nService.prototype.initEvents(): void;\r\n\r\n/**\r\n * Initialize events\r\n */\r\n```\r\n\r\n#### Service#stopEvents(): void\r\n```ts\r\nService.prototype.stopEvents(): void;\r\n\r\n/**\r\n * Stop events\r\n */\r\n```\r\n\r\n#### Service#stop(): void\r\n```ts\r\nService.prototype.stop(): void;\r\n\r\n/**\r\n * Stop Service events, and unregister Service\r\n * Note: A Service can also dispose of itself earlier if need be, but it can only dispose of itself, it can't dispose of other Services without the ServiceManager\r\n */\r\n```\r\n\r\n\r\n\r\n#### Example\r\nTo create a new `Service` you have to extend the `Service` class, like, so,\r\n```ts\r\nimport { Service, App, animate } from \"@okikio/native\";\r\n\r\n// Imagine a DIV element with the class name of \".div\" exists in the DOM\r\n// This Service animates the motion of a moving DIV\r\nclass Move extends Service {\r\n    init() {\r\n        this.div = document.querySelector(\".div\");\r\n\r\n        console.log(this.manager); //= ServiceManager { ... }\r\n        console.log(this.div); //= DIV Element { ... }\r\n        console.log(this); // Service { ... }\r\n    }\r\n\r\n    initEvents() {\r\n        // On document load event\r\n        this.emitter.on(\"ready\", this.ready, this);\r\n    }\r\n\r\n    async ready() {\r\n        await animate({\r\n            target: this.div,\r\n            transform: [\"translateY(0)\", `translateY(20px)`],\r\n            onfinish(el) {\r\n                el.style.transform = `translateY(20px)`;\r\n            }\r\n        });\r\n\r\n        // Dispose of the Move Service once the animation is over\r\n        // A Service can also dispose of itself earlier if need be\r\n        // Remeber that the stop() method, also calls the stopEvents() method\r\n        this.stop();\r\n\r\n        console.log(this.manager); //= undefined\r\n        console.log(this.div); //= undefined\r\n        console.log(this); // Service { ... }\r\n    }\r\n\r\n    stopEvents() {\r\n        // Remove document load event listener\r\n        this.emitter.off(\"ready\", this.ready, this);\r\n    }\r\n\r\n    uninstall() {\r\n        this.div = undefined;\r\n    }\r\n}\r\n\r\nconst app = new App();\r\napp.add(new Move());\r\n\r\n // Indicates to the ServiceManager to start initialize and start the Service's\r\napp.boot();\r\n```\r\n\r\n\r\n### **ServiceManager**\r\nThe `ServiceManager` controls the life-cycle of all `Service`'s in an `App`. It extends the `AdvancedManager`, so it gains all the abilities, methods, and properties of the `AdvancedManager`, and extends them with some new methods namely `init()`, `boot()`, and `stop()`, they are basically glorified for loops that call the corresponding methods with the same name for all `Service`'s (since all `Services` have these methods).\r\n\r\n#### ServiceManager/#stop()/#boot()/#init(): ServiceManager\r\n```ts\r\n// I didn't bother creating multiple different sections, since they are really simple\r\nService.prototype.stop(): ServiceManager;\r\nService.prototype.boot(): ServiceManager;\r\nService.prototype.init(): ServiceManager;\r\n\r\n/**\r\n * Stop, Boot, & Initialize all Services\r\n * Note: A Service can call the ServiceManager methods since it's self aware and has access to the ServiceManager, but best not to do that as it may create hard to find bugs\r\n */\r\n```\r\n\r\n### **App**\r\nThe `App` class starts the entire process, it controls all managers and services, nothing will and can happen without the `App` class (it's pretty important).\r\n\r\nThe `App` is where most/all of the configuration for a project will occur. To change the config for a `Service` use the same name for the property you are trying to change,\r\ne.g. If you are trying to change the `PageManager`'s max number of pages, use the property `maxPages: 6`.\r\n\r\n*On a side note: on `App` boot, the `App` starts listenining for the document DOMContentLoaded event, if it is emitted, the `App` \"READY\" and \"ready\" events are emitted as well.*\r\n\r\n#### App#config: ICONFIG;\r\n```ts\r\nApp.prototype.config: ICONFIG;\r\n\r\n/**\r\n * The current Configuration's for the App, acts like settings for the app. The Config is an object with some preset values set, for all self aware classes within an App to access. The default values for Config are:\r\n * {\r\n      wrapperAttr: \"wrapper\",\r\n      noAjaxLinkAttr: \"no-ajax-link\",\r\n      noPrefetchAttr: \"no-prefetch\",\r\n      headers: [\r\n          [\"x-partial\", \"true\"]\r\n      ],\r\n      preventSelfAttr: `prevent=\"self\"`,\r\n      preventAllAttr: `prevent=\"all\"`,\r\n      transitionAttr: \"transition\",\r\n      blockAttr: `block`,\r\n      timeout: 30000\r\n * }\r\n\r\n * To change the Config for another Service use the same name as the property you are trying to change,\r\n * e.g. If you are trying to change the PageMAnager's max number of pages, use the property `maxPages: 6`\r\n *\r\n * @type ICONFIG\r\n */\r\n```\r\n\r\n#### App#emitter: EventEmitter;\r\n```ts\r\nApp.prototype.emitter: EventEmitter;\r\n\r\n/**\r\n * An instance of the EventEmitter\r\n *\r\n * @type EventEmitter\r\n */\r\n```\r\n\r\n#### App#services: ServiceManager;\r\n```ts\r\nApp.prototype.services: ServiceManager;\r\n\r\n/**\r\n * An instance of the ServiceManager\r\n *\r\n * @type ServiceManager\r\n */\r\n```\r\n\r\n#### App#constructor(config: object = {}): App\r\n```ts\r\nApp.prototype.constructor(config: object = {}): App;\r\nnew App(config: object = {}): App;\r\n\r\n/**\r\n * Registers the Config, as well as creates new instances of the ServiceManager, and the EventEmitter\r\n *\r\n * @param {object} [config = {}] - The configurations for the App\r\n */\r\n```\r\n\r\n#### App#register(config: ICONFIG = {}): App\r\n```ts\r\nApp.prototype.register(config: ICONFIG = {}): App;\r\n\r\n/**\r\n * Creates new instances of the ServiceManager, EventEmitter and the configurations\r\n * Emit \"ready\" event on DOMContentLoaded and/or Window load\r\n *\r\n * @param {ICONFIG} [config = {}] - The configurations for the App\r\n * @return App\r\n */\r\n```\r\n\r\n#### App/#get(key: string): Service/#set(key: string, value: Service): App/#add(value: Service): App\r\n```ts\r\n// Aliases to the ServiceManager methods of the same name\r\n// The act on the App's ServiceManager instance\r\nApp.prototype.get(key: string): Service;\r\nApp.prototype.set(key: string, value: Service): App;\r\nApp.prototype.add(value: Service): App;\r\n\r\n/**\r\n * Shortcuts to adding, setting, and getting Services\r\n *\r\n * @param  {string} key - The key where the Service will be stored\r\n * @param  {Service} value - The Service to store\r\n * @return {get(): Service / set(): App / add(): App}\r\n */\r\n```\r\n\r\n#### App#boot(): App\r\n```ts\r\nApp.prototype.boot(): App;\r\n\r\n/**\r\n * Initialize and the boots all Services,\r\n * Warning: do NOT, and I repeat do NOT, call the boot() method multiple times, you will run into more bugs than there are in the Safari if you do\r\n *\r\n *\r\n * @return App\r\n */\r\n```\r\n\r\n#### App#stop(): App\r\n```ts\r\nApp.prototype.stop(): App;\r\n\r\n/**\r\n * Stops all Services and clears the even emitter of all events and listeners\r\n *\r\n * @return App\r\n */\r\n```\r\n\r\n#### App#on/off(events: EventInput, callback?: ListenerCallback): App\r\n```ts\r\nApp.prototype.on(events: EventInput, callback?: ListenerCallback): App;\r\nApp.prototype.off(events: EventInput, callback?: ListenerCallback): App;\r\n\r\n/**\r\n * Shortcuts to the App EventEmitter on and off methods, they create and remove events and event listeners, read more about @okikio/emitter in [../emitter/README.md](https://github.com/okikio/native/tree/master/packages/emitter/README.md).\r\n * Note: the scope of the events are automatically set to the App\r\n *\r\n * @param  {EventInput} events - Takes event name, and supports all the different ways to represent events that @okikio/amitter offers\r\n * @param  {ListenerCallback} [callback?] - Event Listener\r\n * @return App\r\n */\r\n```\r\n\r\n#### App#emit(events: string | any[], ...args: any): App\r\n```ts\r\nApp.prototype.emit(events: string | any[], ...args: any): App;\r\n\r\n/**\r\n * Shortcuts to the App EventEmitter emit method, emits (triggers) events and event listeners, read more about @okikio/emitter in [../emitter/README.md](https://github.com/okikio/native/tree/master/packages/emitter/README.md)\r\n *\r\n * @param  {string | any[]} events - Takes event names, and supports all the different ways to represent events that @okikio/amitter offers\r\n * @param  {any} [...args] - Arguments to pass to the events\r\n * @return App\r\n */\r\n```\r\n\r\n#### Example\r\n```ts\r\nimport { Service, App, animate } from \"@okikio/native\";\r\n\r\nlet el = document.querySelector(\".div\");\r\n\r\n// Imagine a DIV element with the class name of \".div\" exists in the DOM\r\n// This Service animates the motion of a moving DIV\r\nclass Move extends Service {\r\n    init() {\r\n        this.div = el;\r\n    }\r\n\r\n    initEvents() {\r\n        // On document load event\r\n        this.emitter.on(\"ready\", this.ready, this);\r\n    }\r\n\r\n    async ready() {\r\n        await animate({\r\n            target: this.div,\r\n            transform: [\"translateY(0)\", `translateY(20px)`],\r\n            onfinish(el) {\r\n                el.style.transform = `translateY(20px)`;\r\n            }\r\n        });\r\n\r\n        // Fire all event listerners for \"move-animation-done\", with the argument \"this.div\"\r\n        this.emitter.emit(\"move-animation-done\", this.div);\r\n    }\r\n\r\n    uninstall() {\r\n        this.div = undefined;\r\n    }\r\n}\r\n\r\n// Imagine a DIV element with the class name of \".div\" exists in the DOM\r\n// This Service animates the opacity of the DIV\r\nclass Fade extends Service {\r\n    init() {\r\n        this.div = el;\r\n    }\r\n\r\n    initEvents() {\r\n        // On document \"move-animation-done\" event\r\n        this.emitter.on(\"move-animation-done\", this.run, this);\r\n    }\r\n\r\n    async run() {\r\n        await animate({\r\n            target: this.div,\r\n            opacity: [\"1\", `0.25`, `1`],\r\n            onfinish(el) {\r\n                el.style.opacity = `1`;\r\n            }\r\n        });\r\n\r\n        // Remeber the stop() method removes access to the EventEmitter, App, ServiceManager, etc...\r\n        let { emitter } = this;\r\n        this.stop();\r\n\r\n        // Fire \"app-stop\" event\r\n        emitter.emit(\"app-stop\");\r\n\r\n        // Be carefull here, it's possibile to have a memory leak if you don't dispose of emitter\r\n        emitter = undefined;\r\n    }\r\n\r\n    stopEvents() {\r\n        // Remove \"move-animation-done\" event listener\r\n        this.emitter.off(\"move-animation-done\", this.run, this);\r\n    }\r\n\r\n    uninstall() {\r\n        this.div = undefined;\r\n    }\r\n}\r\n\r\nconst app = new App();\r\napp.add(new Move());\r\napp.set(\"fade\", new Fade()); // Sets the Fade Service in ServiceManager under the key \"fade\"\r\n\r\nconsole.log(app.get(\"fade\")); //= Service { ... }\r\n\r\nlet listener = (div) => {\r\n    console.log(\"Move Animation is Done\", div); //= Move Animation is Done, DIV Element { ... }\r\n    app.off(\"move-animation-done\", listener); // Only run this listener for \"move-animation-done\" once, remove the listener after the first run\r\n};\r\n\r\n// Listen for the \"move-animation-done\" event\r\napp.on(\"move-animation-done\", listener);\r\n\r\n // Indicates to the ServiceManager to initialize and start Service's\r\napp.boot(); // Only call this once, it will cause bugs if you call it multiple times\r\n\r\nlet finish = () => {\r\n    // Stops and clears ServiceManager and EventEmitter\r\n    app.stop();\r\n\r\n    console.log(app.emitter.size); //= 0\r\n    console.log(app.services.size); //= 0\r\n    console.log(el); //= DIV Element { ... }\r\n    el = undefined; // Release reference\r\n};\r\n\r\n// This is different from the on() method of the App class, its has direct access to the EventEmitter\r\napp.emitter.on(\"app-stop\", finish);\r\n```\r\n\r\n---\r\n\r\nThese are the the `5` base classes as stated above, but there are also `5` project based classes, namely:\r\n* `HistoryManager`\r\n* `TransitionManager`\r\n* `PageManager/Page`\r\n* `PJAX`\r\n* `Router`\r\n\r\nThese classes are all `Services`, but they have very specific names, so when using them make sure to use the names specified above as their keys in `app.set(\"...\", ...)`.\r\n\r\nE.g.\r\n```ts\r\n// ...\r\napp.set(\"TransitionManager\", new TransitionManager(/* ... */));\r\napp.set(\"HistoryManager\", new HistoryManager());\r\napp.set(\"PageManager\", new PageManager());\r\n\r\n// PJAX relies on HistoryManager, PageManager, and TransitionManager, so, to ensure that nothing breaks, all these classes need to be present with the name stated in the forms they've been stated\r\n\r\n// Note: PJAX doesn't need Router to function, Router adds extra functionality that is often needed but not crucial. Router is often used for highlight navbar links to pages that have changed via PJAX, but a custom solution can also be made that is smaller and lighter, so, its not absolutely necessary\r\napp.set(\"PJAX\", new PJAX());\r\n// ...\r\n```\r\n\r\n### **HistoryManager**\r\n`HistoryManager` is a `Service` that keeps a record of the history of the `App`; it stores only the states of pages. A state represents the current status of a page, consisting of properties like: url, transition, and data. `HistoryManager` is an extention of the `Service` class.\r\n\r\n#### HistoryManager#states: IState[]\r\n```ts\r\nHistoryManager.prototype.states: IState[];\r\n\r\n/**\r\n * An array of states\r\n *\r\n * @type IState[]\r\n */\r\n```\r\n\r\n#### HistoryManager#pointer: number\r\n```ts\r\nHistoryManager.prototype.pointer: number;\r\n\r\n/**\r\n * Current position of a state in the states array\r\n *\r\n * @type number\r\n */\r\n```\r\n\r\n#### HistoryManager#init(): void\r\n```ts\r\nHistoryManager.prototype.init(): void;\r\n\r\n/**\r\n * Initializes the states array, and replace the history pushState data with the states array\r\n */\r\n```\r\n\r\n#### HistoryManager#get(index: number): IState\r\n```ts\r\nHistoryManager.prototype.get(index: number): IState;\r\n\r\n/**\r\n * Get a state based on it's index\r\n *\r\n * @param {number} index - Index of state\r\n * @return IState\r\n */\r\n```\r\n\r\n#### HistoryManager#add(value?: IState, historyAction: \"replace\" | \"push\" = \"push\"): HistoryManager\r\n```ts\r\nHistoryManager.prototype.add(value?: IState, historyAction: \"replace\" | \"push\" = \"push\"): HistoryManager;\r\n\r\n/**\r\n * Add a state to HistoryManager and change the history pushState data based on the historyAction specified\r\n *\r\n * @param {IState} [value?] - State to add\r\n * @param {\"replace\" | \"push\"} [historyAction = \"push\"] - Which pushState method to use to update the page history\r\n * @return HistoryManager\r\n */\r\n```\r\n\r\n#### HistoryManager#remove(index?: number): HistoryManager\r\n```ts\r\nHistoryManager.prototype.remove(index?: number): HistoryManager;\r\n\r\n/**\r\n * Remove state by the index, or by removing the last state in the states array and decrease the pointer by 1, if an index isn't specified\r\n *\r\n * @param {number} [index?] - Index of state to remove\r\n * @return HistoryManager\r\n */\r\n```\r\n\r\n#### HistoryManager#replace(newStates: IState[]): HistoryManager\r\n```ts\r\nHistoryManager.prototype.replace(newStates: IState[]): HistoryManager;\r\n\r\n/**\r\n * Replaces the states array with another states array, this is later used when going back and forward in page history\r\n *\r\n * @param {IState[]} newStates - Array of states to replace with current array of states\r\n * @return HistoryManager\r\n */\r\n```\r\n\r\n#### HistoryManager#set(i: number, state: IState): IState\r\n```ts\r\nHistoryManager.prototype.set(i: number, state: IState): IState;\r\n\r\n/**\r\n * Set state by index\r\n *\r\n * @param {number} i - Index to place state in states array\r\n * @param {IState} state - State to set\r\n * @return IState\r\n */\r\n```\r\n\r\n#### HistoryManager#current: IState\r\n```ts\r\nHistoryManager.prototype.current: IState;\r\n\r\n/**\r\n * Get the current state by the pointer\r\n *\r\n * @type IState\r\n */\r\n```\r\n\r\n#### HistoryManager#last: IState\r\n```ts\r\nHistoryManager.prototype.last: IState;\r\n\r\n/**\r\n * Get the last state (top of the history stack)\r\n *\r\n * @type IState\r\n */\r\n```\r\n\r\n#### HistoryManager#previous: IState | null\r\n```ts\r\nHistoryManager.prototype.previous: IState | null;\r\n\r\n/**\r\n * Get the previous state or return null if there is not a previous number\r\n *\r\n * @type IState | null\r\n */\r\n```\r\n\r\n#### HistoryManager#length: number\r\n```ts\r\nHistoryManager.prototype.length: number;\r\n\r\n/**\r\n * The length of the states array\r\n *\r\n * @type number\r\n */\r\n```\r\n\r\n#### #newCoords(x: number = window.scrollX, y: number = window.scrollY): ICoords\r\n```ts\r\nnewCoords(x: number = window.scrollX, y: number = window.scrollY): ICoords;\r\n\r\n/**\r\n * A quick snapshot of a pages scroll coordinates\r\n *\r\n * @param {number} [x = window.scrollX] - Scroll coordinates in the x axis\r\n * @param {number} [y = window.scrollY] - Scroll coordinates in the y axis\r\n * @return ICoords\r\n */\r\n```\r\n\r\n#### #newState(state: IState): IState\r\n```ts\r\nnewState(state: IState = {\r\n\turl: getHashedPath(newURL()),\r\n\tindex: 0,\r\n\ttransition: \"default\",\r\n\tdata: {\r\n\t\tscroll: newCoords(),\r\n\t\ttrigger: \"HistoryManager\"\r\n\t}\r\n}): IState;\r\n\r\n/**\r\n * Creates a new state; Remember a state represents the current status of the page consisting of properties like: url, transition, and data\r\n *\r\n * @param {IState} [state = {\r\n    url: getHashedPath(newURL()),\r\n    index: 0,\r\n    transition: \"default\",\r\n    data: {\r\n      scroll: newCoords(),\r\n      trigger: \"HistoryManager\"\r\n    }\r\n  }]\r\n * @return IState\r\n */\r\n```\r\n\r\n#### #changeState(action: \"push\" | \"replace\", state: IState, item: object): void\r\n```ts\r\nchangeState(action: \"push\" | \"replace\", state: IState, item: object): void;\r\n\r\n/**\r\n * Either push or replace history state using pushState\r\n *\r\n * @param {\"push\" | \"replace\"} action - push or replace history state\r\n * @param {IState} state - new state\r\n * @param {object} item - an history item containing the current states array from the HistoryManager\r\n */\r\n```\r\n\r\n#### Example\r\nThe `HistoryManager` methods aren't really meant to be used, you are just supposed to create a new instance of the `HistoryManager` and attach it to the app.\r\n\r\n```ts\r\n// ...\r\napp.set(\"HistoryManager\", new HistoryManager());\r\n// ...\r\n```\r\n\r\n*Note: the `HistoryManager` needs to be present in an `App` for the `PJAX` service to function.*\r\n\r\nThis example is the go() method for the `PJAX` service.\r\n\r\n```ts\r\n// ...\r\ngo({\r\n    href,\r\n    trigger = \"HistoryManager\",\r\n    event,\r\n}) {\r\n    // If transition is already running and the go() method is called again, force load page\r\n    if (this.isTransitioning && this.stopOnTransitioning ||\r\n\r\n        // The PJAX service will only work if the HistoryManager is set as a Service in the App's ServiceManager\r\n        !this.manager.has(\"TransitionManager\") ||\r\n        !this.manager.has(\"HistoryManager\") ||\r\n        !this.manager.has(\"PageManager\")) {\r\n        this.force(href);\r\n        return;\r\n    }\r\n\r\n    // Get HistoryManager Service if it exists\r\n    const history = this.manager.get(\"HistoryManager\") as IHistoryManager;\r\n    let scroll = { x: 0, y: 0 };\r\n    let currentState = history.current;\r\n    let currentURL = currentState.url;\r\n    if (equal(currentURL, href)) {\r\n        return;\r\n    }\r\n\r\n    let transitionName: string;\r\n    if (event && (event as PopStateEvent).state) {\r\n        this.emitter.emit(\"POPSTATE\", event);\r\n\r\n        // If popstate, get back/forward direction.\r\n        let { state }: { state: IHistoryItem } = event as PopStateEvent;\r\n        let { index } = state;\r\n        let currentIndex = currentState.index;\r\n        let difference = currentIndex - index;\r\n\r\n        // Get the current state from the history pointer\r\n        let _state = history.get(history.pointer);\r\n        transitionName = _state.transition;\r\n        scroll = _state.data.scroll;\r\n\r\n        // Replace the states array with a popstate event (forward or backward page) states array\r\n        history.replace(state.states);\r\n        history.pointer = index;\r\n\r\n        trigger = this.getDirection(difference);\r\n\r\n        // Based on the direction of the state change either remove or add a state\r\n        this.emitter.emit(trigger === \"back\" ? `POPSTATE_BACK` : `POPSTATE_FORWARD`, event);\r\n\r\n    } else {\r\n        // Add new state\r\n        transitionName = this.getTransitionName(trigger as HTMLAnchorElement) ||\r\n            \"default\";\r\n\r\n        scroll = newCoords();\r\n\r\n        let state = newState({\r\n            url: href,\r\n            transition: transitionName,\r\n            data: { scroll },\r\n        });\r\n\r\n        // Add the new state to the HistoryManager\r\n        history.add(state);\r\n        this.emitter.emit(\"HISTORY_NEW_ITEM\", event);\r\n    }\r\n\r\n    if (event) {\r\n        event.stopPropagation();\r\n        event.preventDefault();\r\n    }\r\n\r\n    this.emitter.emit(\"GO\", event);\r\n    return this.load({\r\n        oldHref: currentURL,\r\n        href,\r\n        trigger,\r\n        transitionName,\r\n        scroll,\r\n    });\r\n}\r\n// ...\r\n```\r\n\r\n---\r\n\r\n*Note: thus far I have given you a detailed overview of the API's that make up the base classes as well as the `HistoryManager` (as an example of a complex project based class), but from this point onward the difficulty will drastically increaase, but because the next classes are project based classes they will only need to be instantiated into an `App`'s `ServiceManager` using a specific name to be used, with little to no config required on you part. PS. this is getting really tiring to document, so, for the next classes I will skimp out on aspects I feel aren't useful for the type of projects you want or need, if you would like more detail just look through the code for the framework, as well as the [./build/ts folder](https://github.com/okikio/native/tree/master/packages/native/build/ts/). Also, **all classes that aren't base classes are `Service`'s, or they extend the `Service` class in some way.***\r\n\r\n---\r\n\r\n### **TransitionManager**\r\nAs the name implies it controls the transitions between pages (there can be many differing transition animations). By default the `TransitionManager` has a simple replace transition with no animation and that supports hashes. To understand the `TransitionManager` you have to first understand how to instantiate it. To instantiate the `TransitionManager`,\r\n```ts\r\n// ...\r\n// If no parameters are present the TransitionManager will just use the default transition (the default transition can be overridden)\r\nconst transitionManager = new TransitionManager();\r\n\r\n// or\r\n\r\n// You can declare transitions as an Array of [key, value] arrays in the parameter (similar to Maps), if you set the key to \"default\", it will replace the default transition\r\n\r\n// A transition object\r\nconst Fade = {\r\n    name: \"default\", // This isn't nesscary but it can be nice when debugging transitions, you can use it to identify which transition is occuring\r\n    duration: 500,\r\n    scrollable: true,\r\n\r\n    out({ from }: ITransitionData) {\r\n        let { duration } = this;\r\n        let fromWrapper = from.wrapper;\r\n        return animate({\r\n            target: fromWrapper,\r\n            opacity: [1, 0],\r\n            duration,\r\n            onfinish(el: { style: { opacity: string } }) {\r\n                requestAnimationFrame(() => {\r\n                    el.style.opacity = \"0\";\r\n                });\r\n            }\r\n        }).on(\"finish\", function () {\r\n            this.stop();\r\n        });\r\n    },\r\n\r\n    in({ to, scroll }: ITransitionData) {\r\n        let { duration } = this;\r\n        let toWrapper = to.wrapper;\r\n        requestAnimationFrame(() => {\r\n            toWrapper.style.transform = \"translateX(0%)\";\r\n        });\r\n\r\n        // Support for hashes are built in\r\n        window.scroll(scroll.x, scroll.y);\r\n        return animate({\r\n            target: toWrapper,\r\n            opacity: [0, 1],\r\n            duration,\r\n            onfinish(el: { style: { opacity?: string } }) {\r\n                requestAnimationFrame(() => {\r\n                    el.style.opacity = \"1\";\r\n                    el.style = {};\r\n                });\r\n            }\r\n        }).then(function () {\r\n            this.stop();\r\n        });\r\n    }\r\n};\r\n\r\nconst transitionManager = new TransitionManager([\r\n    [\"default\", Fade] // The new default transition is Fade\r\n    [\"fade\", Fade] // A Fade transition named \"fade\"\r\n]);\r\n// ...\r\n```\r\n\r\nThe `TransitionManager` accepts transitions from both the `App` config as well as the arguments it was instantiated with, but by default it will prefer the arguments it was instantiated with (do note the config proerty is `transitions: [....]`).\r\n\r\nFor example,\r\n```ts\r\n// ...\r\n// You can declare transitions as an Array of [key, value] arrays in the parameter (similar to Maps), if you set the key to \"default\", it will replace the default transition\r\n\r\n// A transition object\r\nconst Fade = {\r\n    name: \"default\", // This isn't nesscary but it can be nice when debugging transitions, you can use it to identify which transition is occuring\r\n    duration: 500,\r\n    scrollable: true,\r\n\r\n    out({ from }) {\r\n        let { duration } = this;\r\n        let fromWrapper = from.wrapper;\r\n        return animate({\r\n            target: fromWrapper,\r\n            opacity: [1, 0],\r\n            duration,\r\n            onfinish(el: { style: { opacity: string } }) {\r\n                requestAnimationFrame(() => {\r\n                    el.style.opacity = \"0\";\r\n                });\r\n            }\r\n        }).on(\"finish\", function () {\r\n            this.stop();\r\n        });\r\n    },\r\n\r\n    in({ to, scroll }) {\r\n        let { duration } = this;\r\n        let toWrapper = to.wrapper;\r\n        requestAnimationFrame(() => {\r\n            toWrapper.style.transform = \"translateX(0%)\";\r\n        });\r\n\r\n        // Support for hashes are built in\r\n        window.scroll(scroll.x, scroll.y);\r\n        return animate({\r\n            target: toWrapper,\r\n            opacity: [0, 1],\r\n            duration,\r\n            onfinish(el: { style: { opacity?: string } }) {\r\n                requestAnimationFrame(() => {\r\n                    el.style.opacity = \"1\";\r\n                    el.style = {};\r\n                });\r\n            }\r\n        }).then(function () {\r\n            this.stop();\r\n        });\r\n    }\r\n};\r\n\r\nconst transitionManager = new TransitionManager([\r\n    [\"default\", Fade] // The new default transition is Fade\r\n    [\"fade\", Fade] // A Fade transition named \"fade\"\r\n]);\r\n\r\nconst app = new App({\r\n    // The TransitionManager will completely ignore this, because it has been instantiated with the transitions, and those are usually the one that is intended for use\r\n    transitions: [\r\n        [\"default\", {}]\r\n        [\"fade\", {}]\r\n    ]\r\n});\r\napp.set(\"TransitionManager\", TransitionManager);\r\n// ...\r\n```\r\n\r\nA transition is an object with some methods and properties pre-defined to control page transition animation.\r\n\r\nIt looks like this:\r\n```ts\r\n// ...\r\nconst Fade = {\r\n    // This is required to let PJAX, know that this transition can also handle scrolling automatically, but if your transition doesn't need to handle scroll then it's not needed\r\n    scrollable: true,\r\n\r\n    // Initialize some data that the transition may needs, it's not necessary. It is called before the transition in() or out() methods\r\n    /**\r\n        The init(data: object) methods have a data object paremter\r\n\r\n        data is an object with 4 properties\r\n        * newPage: Page - The new page you are transitioning to\r\n        * oldPage: Page - The old page you are transitioning from\r\n        * trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\" - The trigger for the transition, popstate, HistoryManager, or an anchor element.\r\n        * scroll: { x: number, y: number } - Stores the scroll position of the page required after transition (except the scroll doesn't take into account hashes)\r\n        *\r\n        * E.g.\r\n        * init(data: {\r\n            oldPage: Page,\r\n            newPage: Page,\r\n            trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\",\r\n            scroll: { x: number, y: number },\r\n        }) {}\r\n     */\r\n    init({ oldPage, newPage, trigger, scroll }) {\r\n        // ...\r\n        this.mainElement = document.getElementById('big-transition');\r\n        this.spinnerElement = this.mainElement.querySelector('.spinner');\r\n        this.horizontalElements = [...this.mainElement.querySelector('#big-transition-horizontal').querySelectorAll('div')];\r\n        this.maxLength = this.horizontalElements.length;\r\n        // ...\r\n    }\r\n\r\n    /**\r\n        The out(data: ITransitionData) & in(data: ITransitionData) methods have a ITransitionData parameter\r\n\r\n        ITransitionData is an object with 3 properties and 1 method\r\n        * to: Page - The Page you are transitioning to\r\n        * from: Page - The Page you are transitioning from\r\n        * trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\" - The trigger for the transition, popstate, HistoryManager, or an anchor element.\r\n        * scroll: { x: number, y: number } - Stores the scroll position of the page required after transition (so, if a hash is required or going back to previous pages scroll position, etc...),\r\n        * done(): void - The callback method that has to be called once the animation is done. It doesn't return anything\r\n    */\r\n\r\n    // The out() method dictates what to do when the old page transitions out\r\n    out({ from, to, scroll, trigger, done }) {\r\n        let fromWrapper = from.wrapper;\r\n\r\n        // done() indicates that the out() transition is done, it can now remove the old page and start the in() transition\r\n        done();\r\n    },\r\n\r\n    // The in() method dictates what to do when the new page transitions in\r\n\r\n    // hashes can only affect the in() scroll ITransitionData. The new page only gets added to the DOM after the out() transition, so to find the scroll position of the element the hash is supposed to represent can only happen in the in() method\r\n\r\n    // Try your best to only apply scroll to the in() method\r\n    in({ to, from, scroll, trigger, done }) {\r\n        let toWrapper = to.wrapper;\r\n\r\n        // Support for hashes are built in\r\n        window.scroll(scroll.x, scroll.y);\r\n\r\n        // done() indicates that the in() transition is done, it can now stop the transition\r\n        done();\r\n    }\r\n};\r\n\r\n// or\r\n// you can also do this\r\n\r\nconst Fade = {\r\n    // This is required to let PJAX, know that this transition can also handle scrolling automatically, but if your transition doesn't need to handle scroll then it's not needed\r\n    scrollable: true,\r\n\r\n    // Initialize some data that the transition may needs, it's not necessary. It is called before the transition in() or out() methods\r\n    /**\r\n        The init(data: object) methods have a data object paremter\r\n\r\n        data is an object with 4 properties\r\n        * newPage: Page - The new page you are transitioning to\r\n        * oldPage: Page - The old page you are transitioning from\r\n        * trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\" - The trigger for the transition, popstate, HistoryManager, or an anchor element.\r\n        * scroll: { x: number, y: number } - Stores the scroll position of the page required after transition (except the scroll doesn't take into account hashes)\r\n        *\r\n        * E.g.\r\n        * init(data: {\r\n            oldPage: Page,\r\n            newPage: Page,\r\n            trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\",\r\n            scroll: { x: number, y: number },\r\n        }) {}\r\n     */\r\n    init({ oldPage, newPage, trigger, scroll }) {\r\n        // ...\r\n        this.mainElement = document.getElementById('big-transition');\r\n        this.spinnerElement = this.mainElement.querySelector('.spinner');\r\n        this.horizontalElements = [...this.mainElement.querySelector('#big-transition-horizontal').querySelectorAll('div')];\r\n        this.maxLength = this.horizontalElements.length;\r\n        // ...\r\n    }\r\n\r\n    /**\r\n        The out(data: ITransitionData) & in(data: ITransitionData) methods have a ITransitionData parameter\r\n\r\n        ITransitionData is an object with 3 properties and 1 method\r\n        * to: Page - The Page you are transitioning to\r\n        * from: Page - The Page you are transitioning from\r\n        * trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\" - The trigger for the transition, popstate, HistoryManager, or an anchor element.\r\n        * scroll: { x: number, y: number } - Stores the scroll position of the page required after transition (so, if a hash is required or going back to previous pages scroll position, etc...),\r\n        * done(): void - The callback method that has to be called once the animation is done. It doesn't return anything\r\n    */\r\n\r\n    // The out() method dictates what to do when the old page transitions out\r\n    out({ from, to, scroll, trigger, done }) {\r\n        return new Promise(resolve => {\r\n            // Once the promise has resolved, the transition moves on to the in() transition method\r\n            resolve();\r\n        });\r\n    },\r\n\r\n    // The in() method dictates what to do when the new page transitions in\r\n\r\n    // hashes can only affect the in() scroll ITransitionData. The new page only gets added to the DOM after the out() transition, so to find the scroll position of the element the hash is supposed to represent can only happen in the in() method\r\n\r\n    // Try your best to only apply scroll to the in() method\r\n    in({ to, from, scroll, trigger, done }) {\r\n        // Support for hashes are built in\r\n        window.scroll(scroll.x, scroll.y);\r\n\r\n        // Since `@okikio/animate` is promise-like, it will resolve the transition once the animation is done\r\n        return animate({\r\n            target: this.horizontalElements,\r\n            keyframes: [\r\n                { transform: \"scaleX(1)\" },\r\n                { transform: \"scaleX(0)\" },\r\n            ],\r\n            // @ts-ignore\r\n            delay(i) {\r\n                return delay * (i + 1);\r\n            },\r\n            onfinish(el) {\r\n                el.style.transform = `scaleX(0)`;\r\n            },\r\n            easing: \"out-cubic\",\r\n            duration: 500\r\n        });\r\n    }\r\n};\r\n// ...\r\n```\r\n\r\n### **PageManager/Page**\r\n\r\nThe `PageManager` acts as a `Page` cache, by default it stores `Page` object in an `AdvancedManager` instance, which is then stored in an internal property called `PageManager.prototype.pages: AdvancedManager<string, Page>`.\r\n\r\nThe `Page` class is a class meant to store a `Page`'s data. By default `Page`'s only store HTML documents as strings, but if the `Page.prototype.build()` method is called, the `Page` will build the page's DOM and set the url, data, title, head, body, dom, and wrapper properties of the `Page` class, using the [`DOMParser`](https://developer.mozilla.org/en-US/docs/Web/API/DOMParser), and when the `Page.prototype.uninstall()` method is called it resets the DOM for that `Page` including the url, data, title, head, body, dom, and wrapper properties of the `Page` class.\r\n\r\nThe `PageManager` handles the fetching of a `Page`'s HTML document data, and ensures that if it currently is already loaded in the cache, there aren't multiple reqests for it, it does this through `PageManager.prototype.load(_url: string | URL = newURL()): Promise<Page>`. The `load()` method returns a `Promise` which resolves to a `Page` class. The `PageManager` also has a maximum amount of `Page`'s it will accept, which is set to 5 by default (though this can be changed through the `App` config `maxPages` property).\r\n\r\n*Note: `Page`'s are self-aware since they extend `ManagerItem`.*\r\n\r\n### **PJAX**\r\n\r\nThe `PJAX` class is the key `Service` that creates the smooth, lightweight, and performant experience the `native` initiative aims for. Through the use of the `HistoryManager`, the `PageManager`, and the `TransitionManager`, the `PJAX` service creates an almost sureal and smooth transition between webpages that makes a website/webapp feel like a native application.\r\n\r\nPjax stands for [pushState + Ajax](https://github.com/defunkt/jquery-pjax), with pushState being the method used to manage a pages history, and Ajax being the method being used to request pages. Pjax is a form progressive enhancement which creates fluid and smooth transitions between your website's pages, it also reduce the delay between pages, and minimizes the browser HTTP requests.\r\n\r\nTo use the `PJAX` `Service` all the pages must follow a similar layout with the same js, and css. Above all every page must have a wrapper element, this is indicated by the `data-wrapper` attribute (the attribute can be changed in the `App` config using the property `wrapperAttr`).\r\n\r\nFor example:\r\n```html\r\n<body>\r\n    <!-- Content Before e.g. navbar, header, style, etc... -->\r\n    <div data-wrapper>\r\n        <!-- ... -->\r\n    </div>\r\n    <!-- Content After e.g. footer, copyright, script, etc... -->\r\n</body>\r\n```\r\n\r\n`PJAX` looks for the wrapper between pages and switches out the old page's wrapper with a new pages wrapper (it also changes the title as well).\r\n\r\n*Note: by default `PJAX` will prefetch pages based on the links it hovers over (this behaviour can be changed via the `App`'s config using the property `prefetchIgnore`).*\r\n\r\nOnce `PJAX` has been started, it will listen for an anchor click (when an anchor is clicked, the `App` emits \"ANCHOR_CLICK\" and \"CLICK\" events), if the anchor is valid, `PJAX` will start the process of switching out the page wrappers (a link being valid means it doesn't link to an external site, it doesn't have a target=\"_blank\" attribute, it isn't a download link, the data-prevent attribute isn't set to \"self\", or \"all\", etc...) [the data-prevent=\"self\" and the data-prevent=\"all\" attributes are set by the `App`'s config using the property `preventSelfAttr` and `preventAllAttr`]. The preventSelf attribute basically states don't allow `PJAX` to work with an anchor with this attribute, while the preventAll attribute basically states don't allow PJAX to work with all anchors underneat an element with this attribute.\r\n\r\nIf the url of the page to switch out is in the ignoreAll array (an array of strings and RegExp's `PJAX` is supposed to ignore) [it can be set via the `App` config using the property `ignoreURLs`) `PJAX` will ignore it].\r\n\r\nIf the `PJAX` property `stopOnTransitioning` is set to true `PJAX` will disallow clicks when pages are transitioning (this can be set via the `App`'s config using the property `stopOnTransitioning`).\r\n\r\nIn order for `PJAX` to continue, all the condition stated above must first be met, and if they're all met, then it will start the process of switching page wrappers.\r\n\r\nFirst, it will collect information like the transition to use, which comes from the data-transition attribute of the anchor (the transition attibute can be changed by the `App`'s config using the property `transitionAttr`), then `PJAX` captures the pages scroll positions, the new pages url, etc... and adds this to `HistoryManager` which also handles the pushState aspect of the history record. The `HistoryManager` then triggers the `HISTORY_NEW_ITEM` and `GO` events.\r\n\r\nSecondly, `PJAX` loads and builds the pages required (both the old and new page) using the `PageManager` (the \"NAVIGATION_START\" event is fired at around this point). While the pages are loading, the \"PAGE_LOADING\" event is fired. Once the page loading has finished the \"PAGE_LOAD_COMPLETE\" event is fired.\r\n\r\n\r\nLastly, `PJAX` loads the required transition from the `TransitionManager` and then starts it (the \"TRANSITION_START\" event is fired at around this point). If the `PJAX.prototype.stickScroll` property is set to true (it can be changed by the `App`'s config with a property of the same name) the transitions will receive the scroll coords of the previous page and scroll to that point. If the `PJAX.prototype.ignoreHashAction` property is set to true (it can be changed by the `App`'s config with a property of the same name) `PJAX` will ignore hash scrolling.  If the `PJAX.prototype.forceOnError` is true, as it sounds it will force a page switch via the browsers normal methods (it can be changed by the `App`'s config with a property of the same name).After all this the \"TRANSITION_END\" and \"NAVIGATION_END\" events are fired.\r\n\r\nDuring the transition this events will be called in this order:\r\n* \"BEFORE_TRANSITION_OUT\" - Before transitioning the old page out\r\n* \"AFTER_TRANSITION_OUT\" - After transitioning the old page out\r\n* \"CONTENT_INSERT\" - After the new page gets added to the DOM\r\n* \"CONTENT_REPLACED\" - After the new page has replace the old page (the old page has been removed from the DOM)\r\n* \"BEFORE_TRANSITION_IN\" - Before transitioning the new page in\r\n* \"AFTER_TRANSITION_IN\" - After transitioning the new page in\r\n\r\nWhen a user moves backward or forward in page history the window popstate event gets triggered. First, `PJAX` determines the direction backward or forward. Then it emits the \"POPSTATE\" event, depending on the direction a \"POPSTATE_BACK\" or a \"POPSTATE_FORWARD\" event gets fired. The `HistoryManager` then replaces the current state with either the previous or next pages state. Using a similar process to when a user clicks an anchor the rest of the process follows.\r\n\r\nTo use `PJAX` is just a simple create a new instance, ensure `HistoryManager`, `PageManager`, and `TransitionManager` are present and accounted for and everything is golden.\r\n\r\nFor example:\r\n```ts\r\n// ...\r\napp\r\n    .set(\"HistoryManager\", new HistoryManager())\r\n    .set(\"PageManager\", new PageManager())\r\n    .set(\"TransitionManager\", new TransitionManager([\r\n        [\"default\", Fade],\r\n        [\"BigTransition\", BigTransition],\r\n        [\"Slide\", Slide],\r\n        [\"SlideLeft\", SlideLeft],\r\n        [\"SlideRight\", SlideRight]\r\n    ]))\r\n    .add(new PJAX());\r\n// ...\r\n```\r\n\r\n### **Router**\r\nThe `Router` service uses a list of objects called IRoute which complete certain actions when route paths match the current url, or when moving from one url to another.\r\n\r\n```ts\r\nIRoute {\r\n    path: {\r\n        to: string | RegExp | boolean,\r\n        from: string | RegExp | boolean\r\n    } | string | RegExp | boolean,\r\n    method: (...args) => {}\r\n}\r\n```\r\n\r\nTo add a new IRoute,\r\n```ts\r\n// ...\r\nconst router = new Router([\r\n    // You can the routes here as well\r\n    {\r\n        // When the path is /index.html/\r\n        path: /index.html/,\r\n\r\n        /**\r\n         * from - The array from searching using the RegExp.exec on the from path\r\n         * to - The array from searching using the RegExp.exec on the to path\r\n         * path = { from, to } - The acctual paths\r\n        */\r\n        method({ from, to, path: { from, to } }) {\r\n            console.log(\"index.html\");\r\n        }\r\n    }\r\n]);\r\n\r\n// or\r\nrouter.add({\r\n    // When moving from /index.html/ to /about.html/ run the  method\r\n    path: {\r\n        from: /index.html/,\r\n        to: /about.html/\r\n    },\r\n    method() {\r\n        console.log(\"Going to about.html from index.html\");\r\n    }\r\n});\r\n// ...\r\n```\r\n\r\n\r\n## Contributing\r\nIf there is something I missed, a mistake, or a feature you would like added please create an issue or a pull request and I'll try to get to it.\r\n\r\n*The `native` project uses [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) as the style of commit, we even use the [Commitizen CLI](http://commitizen.github.io/cz-cli/) to make commits easier.*\r\n\r\n## Licence\r\nSee the [LICENSE](./LICENSE) file for license rights and limitations (MIT).\r\n","readmeFilename":"README.md","_id":"@okikio/native@1.0.0","_nodeVersion":"14.15.0","_npmVersion":"7.2.0","dist":{"integrity":"sha512-xsiiEVGitQnTHkx0aX+EL1qqx2QEPYvpFX+Giitk6g7xSvBc6OkoWoYUk9uBRcSyTEinyA9/zN0OOhtWH9UXoQ==","shasum":"71f0a6edb1f25b20db4f6a22a33e067228a294d1","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.0.0.tgz","fileCount":64,"unpackedSize":1176237,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf58jACRA9TVsSAnZWagAAOf0P/2DQ92WoUHNz5D38DvxG\nVEXbF0lIrWiieRXmXQOnxzMqbg6/bmrbKlpJOVeSs0MlTUbOxYAxxhPba10w\nc7LrqzFbNxyaXNtmF/XIG07SS7c2pNGhWAayMNcemoJ0qF/LoKXWtc+hhN27\nsQ9ZENcfjHQ9aRrho/9y3YLN+V2CoHyUoTz8fVBPj6iBwFcvjisW25g/0w+H\n58GtX5TYGveFFXcRHdo9jHctj6ia+6SgNxT//onMfW/MDFwT5stOFZJX2dCs\nsSIJdHoK3tT3wIhc9BRpceTOUentCr3T758WDlhDBHUkdRCN0lzfmCVWf332\nmcjyEsitnOg4h91LAouAac/HIwbAJZ6tDw6ghrnJr9vky+GLcgFoM0+90Zn1\n6PwJH6ODs5WO9SeHIbsWa2BqmnUBielrpxWi2/1s55zzw8NkLmGOSdDCi+Bq\n/ERGix9Krr10ZtOH8dNPNlj19G0NSs8+HDs1FdbFTwAvN4V8mPuFqvx9qiJk\nHX79tHzBOgBhSRbAOhDpmbr5/IOX28X0QIi7IPqEMux/YGDWUBX73A0DHVlG\nG3nsL0gvnxYdl55yu0UkzYZII0c3M7BoM3wf7Nvv4idSr60PQoY+a3TMp/k9\ntrIRMQXgAAI+59jsySmrblUK9etO501eGCHNUK/D3rI9i8VUsuRrfKHjrivf\nRA3k\r\n=e5Ke\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbOf7XNqEwG9AYObmfdYf3VVZJ+C2BiCINvW6nq+T4VwIgB5gyTOtKb7HTXs2ezQdZX3UZcOIiB3rOlk6sUEdFf/8="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.0.0_1609025727898_0.6813088845112631"},"_hasShrinkwrap":false},"1.0.1":{"name":"@okikio/native","version":"1.0.1","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.js","types":"lib/types/api.d.ts","browser":"lib/api.js","node":"lib/api.node.js","unpkg":"lib/api.js","module":"lib/api.modern.js","exports":"lib/api.modern.js"},"main":"lib/api.js","source":"src/api.ts","directories":{"lib":"lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts && npm run demo:build","demo:build":"gulp build","demo:watch":"gulp default --watch"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.0.1","@okikio/emitter":"1.0.1","@okikio/manager":"1.0.1","esbuild":"^0.8.26","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","typescript":"^4.1.3"},"devDependencies":{"browser-sync":"^2.26.13","chokidar":"^3.4.3","eslint":"^7.16.0","gulp":"^4.0.2","gulp-esbuild":"^0.3.9","gulp-pug":"^4.0.1","gulp-sass":"^4.1.0","merge-stream":"^2.0.0","standard-changelog":"^2.0.27","ultra-runner":"^3.8.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"lib/types/api.d.ts","browser":"lib/api.js","unpkg":"lib/api.js","module":"lib/api.modern.js","exports":"lib/api.modern.js","_id":"@okikio/native@1.0.1","_nodeVersion":"14.15.0","_npmVersion":"7.2.0","dist":{"integrity":"sha512-YZsashzH8aQIZaYwWG6KHiFmPOLVQzrgBN0Uhb3xMuEX9ta9wU/JbHCJ68BUPv4TE8QhdChTLGsrjY/5OBM82Q==","shasum":"1e78f1c801061288d2d7660be0716075470556bc","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.0.1.tgz","fileCount":64,"unpackedSize":1176443,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf58sbCRA9TVsSAnZWagAAcVEP/05ajCIoZzjjOei63+r9\nruqvgnDXUnBXc82NKJfJzhrRinPcdoFJyyXNNvQu4DEl3gy6hIKjA/sEuc+z\n0Wh208r0wu+4Hlp5MbPpoUbu2nCFJbD9jNEyZGa2EnREX8hVTvlVzt48IV7N\nZNXH0n1j6BXV6+eDEBrlgEJlEpQIQZW7Y0elwSYzZzqI5ftKugxfi+r7kuoZ\nNSeHyblfQFRjFadMamqqQ3KPQiTTT+QL2XMlMlpaqVSHFQz85IhyaE3BWXb+\nCfYKVdC5qhQ0vjxWlltAPGZM2yL0HuGn7FgCpioxD0m0CLlDcR79dgDDaDrc\nJGLkCKGSZmf7gFUWMlcjxq5xs3aB6XociFq+7nOhXSdtaOJhtEVHRdW4XGYm\ni5VfuwKFQKVOkcl4+jYP/Wmcb5aIU8f2byIqH+4nXxrg6DpOrbXvCPjyFJMA\nvBf5T6YG2ZZELmxXqY9/OMUj96Nd1pHszacOQOpd3CUu2RL0ZlMFqfDj1ERV\nbYbfRvfDIqsvuaAu7vrripRoUECxjyZdcADaCsIcfB4pD7ty9YZSo4isNE77\nC/YLxt+DbdvzMDxozg+cAVtlwDIGsKu4O+Dc5eeev2avJg2bref4FOYZ9LXX\nbL6UNu1xexAXDU7fS5S9Wrur8T+R0FQp5zasG1YRJgT7EQXvQYUKhUyG4zwD\n+FTH\r\n=8Tkr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDL4g8tNA+b83q9CZiGcfx8tu3Xap8dlqbqMOZqjO4kZAIgevMax2zb2/0I6sU5JmiB3uYpzp7ab/bddggb6Csp1EA="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.0.1_1609026330385_0.2960713007289859"},"_hasShrinkwrap":false},"1.0.2":{"name":"@okikio/native","version":"1.0.2","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"./lib/api.js","types":"./lib/types/api.d.ts","browser":"./lib/api.js","node":"./lib/api.node.js","unpkg":"./lib/api.js","module":"./lib/api.modern.js","exports":"./lib/api.modern.js"},"main":"./lib/api.js","source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts && npm run demo:build","demo:build":"gulp build","demo:watch":"gulp default --watch"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.0.2","@okikio/emitter":"1.0.2","@okikio/manager":"1.0.2","esbuild":"^0.8.26","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","typescript":"^4.1.3"},"devDependencies":{"browser-sync":"^2.26.13","chokidar":"^3.4.3","eslint":"^7.16.0","gulp":"^4.0.2","gulp-esbuild":"^0.3.9","gulp-pug":"^4.0.1","gulp-sass":"^4.1.0","merge-stream":"^2.0.0","standard-changelog":"^2.0.27","ultra-runner":"^3.8.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"./lib/types/api.d.ts","browser":"./lib/api.js","unpkg":"./lib/api.js","module":"./lib/api.modern.js","exports":"./lib/api.modern.js","_id":"@okikio/native@1.0.2","_nodeVersion":"14.15.0","_npmVersion":"7.2.0","dist":{"integrity":"sha512-mg6K43o1h/aCNrLNHvhxXpfmbQUKjhNAw8ELZzDZNzHh5cc1IL27a2aFar3PkzXABFWDSSGfc59/e+l8SU1vbw==","shasum":"32e7a1f9c543e0b2dd3d9dcdccaa52eca574575a","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.0.2.tgz","fileCount":64,"unpackedSize":1176744,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf586yCRA9TVsSAnZWagAA7HgP/3FBy85OP+7grSAQ8JSO\nu4W3ijq9Vkdkgm57mTIyS6D3CBIR5W60nUzKdtbVfjAPL93I8V1fTEPBsshF\nI3s2m8YnM8VtvujkunZbxeD4MiJy/MAhsjTaUyU8Gkx8L8KXwGUSaVyf06gn\nyffvNjZgjM0iIBZnOiYpQDQtsnq/COfd7erGdgz36H83xqXiN43E+W910Rex\nRbGSRU6S/a0qoSMXBxjfG6rrRw2jwzPMsNKqgy7rO2YgR6x/a8J/PIOY888N\n2z/uNjz0Umj5WWO8BacCM3lKhPgrU3w61RooGav1zSLP+WG3Ew7i0sdXsnub\nR9SG5TS3+4/yz0umm8D4BsMht6420C/MiRy+DW5yRtGlCz3Bo2tgpzniS+b3\naX9Yq9fOb6NchjUvfdqP+PhRoUmEFSmCxnGJ4pTpjPSMSY8ERAg1600S0yEB\nCqu2Rn0Wxg667nUW7/kjMkaNOFk4K2Nk8iRSLVfMYZMla6pd5epJHRKk65d+\nCbcQbi1WZIcequ0OdD3geiHQaMUcpQ3W2VZ3lkk11vY4g0SSss+AmTrqVU26\n3BCGQbHbfi0T2dsogWyuezYapbeL9nTdPrM97UlqDF+axLPkhsGkWIzMAQOI\n77ZloktukHe3cmGbFzAZqwxQeglByFfuWzXZ2tEYOnKWGsVAofCziV50Xy13\nxsE0\r\n=jQNP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxQPVbDVOcKtUEzI4NQRlQIzBOSVKtMq1xZU1SvQjuMwIgdo6J1twF7cJAVG5QNm7by1P8K4881Lci3Y8oa4QR1E8="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.0.2_1609027249761_0.5187325430958094"},"_hasShrinkwrap":false},"1.0.3":{"name":"@okikio/native","version":"1.0.3","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.node.js","types":"@types/api.d.ts","browser":"lib/api.js","node":"lib/api.node.js","unpkg":"lib/api.js","module":"lib/api.modern.js","exports":"lib/api.modern.js"},"main":"lib/api.node.js","source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","demo:build":"gulp build","demo:watch":"gulp default --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts && npm run demo:build"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.0.3","@okikio/emitter":"1.0.3","@okikio/manager":"1.0.3","esbuild":"^0.8.26","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.0.0","typescript":"^4.1.3"},"devDependencies":{"browser-sync":"^2.26.13","chokidar":"^3.4.3","eslint":"^7.16.0","gulp":"^4.0.2","gulp-esbuild":"^0.3.9","gulp-pug":"^4.0.1","gulp-sass":"^4.1.0","merge-stream":"^2.0.0","ultra-runner":"^3.8.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","browser":"lib/api.js","unpkg":"lib/api.js","module":"lib/api.modern.js","exports":"lib/api.modern.js","_id":"@okikio/native@1.0.3","_nodeVersion":"14.15.0","_npmVersion":"7.2.0","dist":{"integrity":"sha512-JMmfm2AFLdfnUmGgFE+R/+6EKsoNyzA+emAhyWCn3PL3rsBUHAjchPtQQC+yvSuilqtiVVDcUvJ5312e5/TmDw==","shasum":"f404e5432b1b0b76254c3950ab2f17d8e0e10bf3","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.0.3.tgz","fileCount":37,"unpackedSize":554187,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf6lQ4CRA9TVsSAnZWagAAquEQAJLZwmyPfuPxF4PX1P3T\nbyek9fjtRPAg1weWPVcszx/nGRU2Cpi7trBjI9pR445YQiJq+unFbhdeiQa/\npn3vRjd4u12/sEYqHnXPaQuS6RKA2p4gv+2E0r3psp9j5pvT0Sv1MFASkWWJ\n9UzJws90x6DGXBpY+Jw39mVjhPQvrMnVnQykTGH6Xum476tOk5sdi5PCM9UP\nRjTR9lSTbd7MKX77JmVOlLfwWo+BHL2c5nJtP0NeHGClhjPY0g+SudADNK5Y\ne1BoISR9/tZDYTs8iKO1lORTGI+DoJ5VI4qETfpCvwm9Ob+32TGOF5uTbwZj\ndgVQlc6DfkztwnYRMK26ly8Xsm2nmXBdGhjdvlmuF3eO2VEu3x8TWZOnyAkn\nvMVFnRI3Z2C8H8FYd00iROQqhllKD3Z4MHOQFRESouIb/pKp55yjjE8IfvCw\nZm/UxecDCETKi1fmDdCPR0eQtepoM9s59Y2fpFDpbaM0lA3j9xBXbf082Ur5\n6j53iWQ5Nz3jLCvbnnbjfQgW76cxeVjJlBDcYxlZYGH4TrOODtGikfxfG4AQ\njCpfjAZSMKKySlYJlf4hxSsZcCPq5qj+yzJY0HSV7Q9R9QEchLSdDHeUgtJE\njgrMm4hUKXj+FXJmIUsJnJHhVN9Li8iTgxJaIgsMrPxUMJPNpoJU2tneZTQH\nqxjf\r\n=J/PP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCkFLk5b7Sr0c8Ki7ObNUR5J+8ksXQdSV9tffifrIKseQIhAPcKt+pfTUciBnU+98xYs8muo7XdrIU1tgt5j9FwFP3W"}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.0.3_1609192503485_0.39717899367157994"},"_hasShrinkwrap":false},"1.1.0":{"name":"@okikio/native","version":"1.1.0","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.node.js","types":"@types/api.d.ts","browser":"lib/api.js","node":"lib/api.node.js","unpkg":"lib/api.js","module":"lib/api.modern.js","exports":"lib/api.modern.js"},"main":"lib/api.node.js","source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","demo:build":"gulp build","demo:watch":"gulp default --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts && npm run demo:build","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.1.0","@okikio/emitter":"1.1.0","@okikio/manager":"1.1.0","esbuild":"^0.8.26","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.0.0","typescript":"^4.1.3"},"devDependencies":{"browser-sync":"^2.26.13","chokidar":"^3.4.3","eslint":"^7.16.0","gulp":"^4.0.2","gulp-esbuild":"^0.3.9","gulp-pug":"^4.0.1","gulp-sass":"^4.1.0","merge-stream":"^2.0.0","ultra-runner":"^3.8.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","browser":"lib/api.js","unpkg":"lib/api.js","module":"lib/api.modern.js","exports":"lib/api.modern.js","_id":"@okikio/native@1.1.0","_nodeVersion":"14.15.0","_npmVersion":"7.2.0","dist":{"integrity":"sha512-GNdF+oUaQ2RgTLdhh68EAJb9h68vk6n+87gRK84/rHivO/NwaAcihSP5MdNxDw4fqqZVE8rNhyYO49hJxwDeEA==","shasum":"3f64d7bd438de815b70702ef191822586c2537dc","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.1.0.tgz","fileCount":37,"unpackedSize":557350,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf6lvRCRA9TVsSAnZWagAA1T0P/AuFrmr4IVKsdaSaLXMn\nYiErGSkvAx8n4IHpax7mMgHJGwm5hD1aMPr4KtGKRhrAkyJ/EXsOcAfGNYod\nj6MohYWv44YTzdJXXykajLo3ERuQbEY1HlAMhanJE73R7qTzlXQyku5v4aDB\ngsrmLdjQCwAqshuuH+Ro0/A6AxmARx/3jYNH+t81BdZsG5yvd8K5/sqOqs6c\nuvUrAS3MXhT9iMmvE4i2Xbm6U1ei1ayTR2+jVhg4UCrMN+oJejncd6fdBykF\nLZX8QK5aLCXUXEewZ5FPq18s8J0CU4xp4C4MNRvVRfE3hOS81oyxZEuQM5WE\nVA686VkvYDt4v4aWEYBfaGcL8BWgae2OUZt1/xjVaoS89LV9YUB9Hp8VG+ER\njzumDJW4ENVmozk4pTyysu8yDEARQl1RjPOC85i3IPjjzZDTH/qqAE6kAI+a\nA0K3utoI5xnrQdP+pZyrcoE8S4UpNvo7c3lEnZ+Nq2zKDBvtwYd8ZJUPKcig\nzk/sf8d/tFRL53bPCF0p1cw2+M7KmXzElLV69kvoEI/QWYWMFLJCkj/wzeJb\n9cGGmBQpbW5Bx6NyF36a5EaQ3t9TAyTN7mQXCtmc8xL7ieMk6FKOb5G2Ae1Y\ncFHci44rScVpbLztUy3jjQ10MReAQYfj+V174508hagntWo0+tfKpQi8P960\nXijo\r\n=40cX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDpuHiNzXq9Z/bMtAdjgIzu3lxq2xj7UiNqrqBefzY3AgIgSl3UIsexCZoQYREc/m3jY3jXNc4JxOh+5GcSkQCdObU="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.1.0_1609194449220_0.10258400789908206"},"_hasShrinkwrap":false},"1.1.1":{"name":"@okikio/native","version":"1.1.1","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts"},"main":"lib/api.cjs.js","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","default":"./lib/api.es.js"},"./ts":"./src/api.ts","./src":"./src/","./":"./lib/","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"},"source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","demo:build":"gulp build","demo:watch":"gulp default --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts && npm run demo:build","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.1.1","@okikio/emitter":"1.1.1","@okikio/manager":"1.1.1","esbuild":"^0.8.26","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.0.0","typescript":"^4.1.3"},"devDependencies":{"browser-sync":"^2.26.13","chokidar":"^3.4.3","eslint":"^7.16.0","gulp":"^4.0.2","gulp-esbuild":"^0.3.9","gulp-pug":"^4.0.1","gulp-sass":"^4.1.0","merge-stream":"^2.0.0","ultra-runner":"^3.8.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","_id":"@okikio/native@1.1.1","_nodeVersion":"14.15.0","_npmVersion":"7.2.0","dist":{"integrity":"sha512-cJ2tCGddlYbsHKMlh3A8u6YvsxaNif0rj/LYuuAqV9g8CW8JSXF9lr0LLM5f/b6egD2wHxI1Qz/GssbVFuQTtw==","shasum":"20ae863997a787bce97b54cf9a3b1897d2af7eef","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.1.1.tgz","fileCount":37,"unpackedSize":583740,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf6sN4CRA9TVsSAnZWagAA9CEP/R+AG1q+bw01FB7b9Iph\n0gTQSuridFJbuRhjyjLfsTzAq0RFY/hSCocSLyxcKiCwTuQP30xPVCSdFSLX\nmmnZEyUeb35eU6Ay773l5ReIaVmMPwI6hDCR0KSkDYFUwv2ohL5MHVQVw+6F\nlxkpKo0tByCKCaT5V3vEOGr/jzH4VFBLt+70ORKu+TKUxszBQuXi3dmjehE9\nQTnHRWiTBjTAQsuosgQ3qk41RXBulV0cY34WQT9DjHbSZjw+qjBcxo4YYC2F\nOeuikX2qcAMlNI7pKstKMPzPA6VCcLEeyXOhJCzH+HDt1eKQg10mt+5NQR5a\nGwDpn40Oy8gMSioZJqnfjKD7NoWoQ/NiMzecyEkZFqLM0CiKOvHwTkrKWiRA\n3XWngM0X6H47IqTBB285BRoGPauPt+Q9yWdIex+LKBuUmPKs6CYasT415cJm\njMXtxG3yCyfAKWeCvKhRAAWRRkv1wpxRqRddCFrjKDHhzZvruwXbyV3FzyMm\noUJE68UOxIU1YdNBuYbkIcmPrBqyo2oPLnxmplG10q7Rfq0OlfiHCMUBuCDX\nUNA5BX5Qg9XXD2DV8JZyLz3F08aEimPKcSpnl7LEkB2k/87XuezjUrNNGRSY\nua+gWYV+PrY1ecMi6QxBtXY1zK9BbHbaojWP9lHuvzv68w72BaY/ojK+5PhI\nH6qm\r\n=9PlO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBO+1vyc/ClFR/GG3A5W+6esUzotkr8bXwp3RKlH7FT3AiAgXL5Xp3Tu/SEB3h2AnZmLvN284kOTPly1MgLbws+adw=="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.1.1_1609220983844_0.8565396954123623"},"_hasShrinkwrap":false},"1.1.2":{"name":"@okikio/native","version":"1.1.2","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts"},"main":"lib/api.cjs.js","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","default":"./lib/api.es.js"},"./ts":"./src/api.ts","./src/":"./src/","./lib/":"./lib/","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"},"source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","demo:build":"gulp build","demo:watch":"gulp default --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts && npm run demo:build","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.1.2","@okikio/emitter":"1.1.2","@okikio/manager":"1.1.2","esbuild":"^0.8.26","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.0.0","typescript":"^4.1.3"},"devDependencies":{"browser-sync":"^2.26.13","chokidar":"^3.4.3","eslint":"^7.16.0","gulp":"^4.0.2","gulp-esbuild":"^0.3.9","gulp-pug":"^4.0.1","gulp-sass":"^4.1.0","merge-stream":"^2.0.0","ultra-runner":"^3.8.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","_id":"@okikio/native@1.1.2","_nodeVersion":"14.15.0","_npmVersion":"7.2.0","dist":{"integrity":"sha512-+z6sZREfyYTWzSI0ZYAXVRHBYw+BmSUcUeUFMbOb4H2RW/wGelN9Cje8G3hf682wuKUZy/GVvWzRzVJuLwF01Q==","shasum":"d532365439f8a2eef77eab2b89ac4114d337804e","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.1.2.tgz","fileCount":36,"unpackedSize":527527,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf6sttCRA9TVsSAnZWagAAxTMP/0LEVT/1OetRWZJ0yWWC\nIkB1ICczFdV8ogVX+lEY7AStWlKA8l0qwhgh5pWO3NY9Y1Yp5w5VXBPJp+4v\nuMQvhfuc7MmhRD7eSaK7SCRGggdFtrvGfntQtu0kOjZOHWpzmDFZfqLkgSmg\nNiEbBj3MHyRveMadRqvRiNfdFkWk5r4RTjWJz91wkoXTnx1MZlPaOX56p8Jt\nJ0kIuND/7Q7IAvRcFY0HyweBGOcMpzpOVQaEZLaqugJ88sonICmRvlFcVOAi\nrua2xqP2H6mvRZ5ZNNo38NFCZqZjOPN13doFbuwJETAWx0m0eWx2ceTj4NPF\nNOSrrgRVJma7ljbfff+jrgMXyRE9Z7faQqNQhv99TIz9GzEU2mMazEdxqqIy\nopKUTGXGX0hO8Ft4C6KLFYBKSOxIgHKSpONVgt7HJ+NlcPoia0feIAKvlDHl\n8xl8Vr0V8Ll1RgvHxwWkrPbHitGybVYYl0ePhyoFyxJDWMHYZSWa3UbsUzmw\n16m6H2uBUxVuYRb37RDpRerQ7oRrGOh1zukgw3aDk/EwF2yG36fjTp6bxMiu\nPcRsHzORnp3IFzqfPs1bTGK8rekw1DMVeHDdTMCImeZUMWlqQSKaqt38kIen\nampJbJrxCeCnIcBP1QUPo1ganlTZ4uhmdVg+9ncmMhMmvA8+OABIIW2VoyPS\nDL2X\r\n=RNLn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA6Pp0rL/htw6lgh9u3jDS6fCv9zvTpKoPTaaSurZFJ9AiEAvgqxnLmFu8RSLD+8mkhGuJ6LDabI4lUcxafWk0/rgJA="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.1.2_1609223021271_0.5731193944880302"},"_hasShrinkwrap":false},"1.2.0":{"name":"@okikio/native","version":"1.2.0","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts"},"main":"lib/api.cjs.js","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"},"source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.2.0","@okikio/emitter":"1.2.0","@okikio/manager":"1.2.0","esbuild":"^0.8.27","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.1.0","typescript":"^4.1.3"},"devDependencies":{"@skypack/package-check":"^0.2.2","chokidar":"^3.4.3","eslint":"^7.16.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","_id":"@okikio/native@1.2.0","_nodeVersion":"14.15.0","_npmVersion":"7.2.0","dist":{"integrity":"sha512-XmiLUU/vh0DJcXPZm7qOr1Cld5CavVHlSTxnWKWOmYTL1l87RcW6Wby3181vwKDq1tMpbVcYSlvs1Q46liXPZw==","shasum":"884f2aa11f4357b1f81928895c7e0e24f3949a92","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.2.0.tgz","fileCount":36,"unpackedSize":527560,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf7FW9CRA9TVsSAnZWagAAbw0QAKOfdS1grpUKHceZycEj\nITT0AS91Vgc/BFk9DRRkMVbXtwz6kPMpNNQa30lbwOZLVzaff9JcWkXGUZAw\nsQfPBqJGaGtCNBQnJH5cjrJ+Z+JOzei5YQhFeGoc8SSmfIptaPa8dL2J6xlF\n5pyIKZYo35Q9r4cfSIFNV0ed6Tmqda4KM6WpRhvDqYmysLS1HtBbOwmBdfvg\nv9WCaxUguLBdEeQugzg+F5q3mtNrZBWq2BM9XAooLUOW7GP1Lh3MS/o8uezO\nuQd4J+RpgEmxjz3uUvPmM6/4r/Mk/pzKZ+Y7lwG6gh+CtSWVoF1GW9s5Y6U8\nb+P57dAH42wPexTOgUs7s9TySzqdFXW1luZVh2k7p4o7iuxx7tLwm5j2lRoz\nSemQbzpg3bPo8QLy0f94zrz/m8t6EDsjnyBO/MLmVOMygV/Px98rF/L44tID\nsEotsg2m3I8gKRE5KVh/MLq2JKhq8PkOIMN7rZgMTPIySLh3upXI4SQqGMyT\nAzD2d7fNmkPC4MvfnGvUP9IvM4h7G1331Z7nukExDqMpmfBNWMbp5NZaY3+C\nVme9fkvXzwYxelp5hPxVttOSS25uyikkjgLquMABUvdP9vESCHrTEYYKw6l+\ncLx+7NfNInoCjIpXGpIxauX0z1zF6NcedGV069AiMn+V9HXzi6gSAcgGhV8R\nK99Z\r\n=3iaQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCV7qt5UGSE/ovNR9XWdkNI/KmJGl/qpve4aDC4lL+NfgIgCr0PAHn0AbVoCSIZ7+wxV8RlxAVB+GSw8YNrToLljtA="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.2.0_1609323964844_0.7655054559338881"},"_hasShrinkwrap":false},"1.3.0":{"name":"@okikio/native","version":"1.3.0","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"}},"main":"lib/api.cjs.js","source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"1.3.0","@okikio/emitter":"1.3.0","@okikio/manager":"1.3.0","esbuild":"^0.8.29","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.1.0","typescript":"^4.1.3"},"devDependencies":{"chokidar":"^3.4.3"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"},"_id":"@okikio/native@1.3.0","_nodeVersion":"14.15.0","_npmVersion":"7.3.0","dist":{"integrity":"sha512-DCT/krDJcqC5sI/kmm4ARF8VKHs60iayOe6Xji+JfPDBjcfE71TV5JLEm426g3y8li2+eueXeoI2T94jiDw+MQ==","shasum":"02c6dc7d13b4a3bef8d81f145b20b5721c30f9c3","tarball":"https://registry.npmjs.org/@okikio/native/-/native-1.3.0.tgz","fileCount":36,"unpackedSize":499868,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf8m90CRA9TVsSAnZWagAAdZkP/iUtb8nQK+AOQWiNC960\naoUbltuMkhrH6TixzwbDt3ytsvgcFtJgWlCieXxpuoV5Begy+zai0rjwChSC\nG2MqcqO/GuzGyVtb5A5FBt13v9/doB4fdhtp6eHMa49k4GZsU9F6ysbxu8tR\nHu7lPqdXVV//42YD3kQgP9rH8CAsXQ2Eb2Lugi40ZwM8X9UWKv5cS6BNkIMD\n3zmgq4CU1f0oQA3dUUXr2NvPVl7Tr4AbSq5fAABJLMc/H2UZGeUGqp88ZGSg\nrayveZlg4ZoeHz5R+nen1tLEwpDFVGENRRqfBgrakVrWhFJeH0xy3nhYQ8gO\nzb1ufxWsQ+kFWupzh0RAg7l2ATm8IyMFJ3GvPAnxRuCdjCEoKO0UawOXAG48\nhZnfkjbB6qMClkdoF4ysdGNCcoz1OnBjTtDHJT96wlSu/9D59Am/K4wvZoaS\ng0anrcDt/DpKFlWzn/yifxyCbu1M7VBv3Iy4Y8/EOIjv9u0mRSUjQ2AwDsBM\nvenf9rALDW2leJ0yUoXU2I4xzPSIbcaFUKYrfLOGcjXhulRWjHrSiMt5wyut\naqrPW2PlGvWkaVfklopogTTAfoZXIG/8MV7OI+vQylau3Fqz/4TQT5ItuGJz\nJQk0NyoSHtz94g4QBR/WMimIgU3yF060Sn4t+lVnXAQTW0hW94Bo1wmkLxQR\n1JAd\r\n=8+np\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqmDXjkzIGa4GcUMnzUhjPX90fp7Tp/xscqU2it3/qtAIhAK6WH2CCiAcq2311SRbxZx3rpTpYvTurq7TR1zb/GZif"}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_1.3.0_1609723763437_0.9410106452370623"},"_hasShrinkwrap":false},"2.0.0":{"name":"@okikio/native","version":"2.0.0","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"}},"main":"lib/api.cjs.js","source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"2.0.0","@okikio/emitter":"2.0.0","@okikio/manager":"2.0.0","esbuild":"^0.8.31","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.1.0","typescript":"^4.1.3"},"devDependencies":{"chokidar":"^3.5.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"},"_id":"@okikio/native@2.0.0","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-hgD6NZO1+Q8QPHWIjLj6InzrysHrmDrzJF6TgFFbjguS6YX3rhpfHlStkTPphpnv0NGc6ox/JuiJSx0Xnysm4Q==","shasum":"30fe31aaf816556fe52ed76244ca8ff958e5b9e0","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.0.0.tgz","fileCount":36,"unpackedSize":486952,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf/p73CRA9TVsSAnZWagAAwboP/3DNQ70DWp0i1zVLPwci\nhQiLoiUJoeJGc8/nEY6w7O0EZcLiS3GlnBhKAMbqqoQnQ7SLMLq5bnS/FlqO\nfbkTLwggz/iKdgEuAYtZJl/8SthWljgzDvObriL1g3r9DxeMcq2OOU3GtO7m\nNVRjk9pC9LXUcVDJCGpc12Uhm/5jhm5sbqCrVeGu18o+RAc6Mk2egXlUfHwH\n1UmR1hG0RfRoA0DJzBjdswxvulv/hOKQSPNj0XHZVjO9z+5/dczd18MkeEti\nyQ8fLChw6VSwyfe/PFqKJIFcJQITNkub8Mj6bWNgviFPSpo3+3c9q4TZUfwI\nMq8s+ij2QC3D6ym/du9PeNnhwsDe6GUGLOS5j8IC+SPEiy9jcG24DXvWy6ZN\nggb0V0dUZnFrgrW197o6pxbEO1IGHHYtw58NDAEgbVRJ4XS6lcfaSreb1TeZ\nnCesA10UOEuFvgHw9eoxT30QDQnnGYLHgS0NKWmeZtyQ4Fo/f4Pyek9hZzls\n63dOBLHmlNX7uYuMp/l3QdKmrh2CmdJS4kuDpVKdpMdC6LzNwAopOm7m/G2t\nSqux5ZKEFmz97JOqkVB/ZRWA/GRmbOewPgkvBH4W2Rnf8yf+8olT7H25UpWd\nrGrbvd/J86YbZ9Fp6eexI5SVzOcIhyR5HlPG1QvRwEjSZLD3si4F6Mtz8j/q\nymBU\r\n=bZaJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEo95ICG5IpKEIhqhWlMjSV8WVLowHBDxafAnZURtipWAiAMlq7vdvLa0APdCj5+FmvDXBJtNuUbdVw2oGOp9MuV6Q=="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.0.0_1610522359141_0.4112593294462392"},"_hasShrinkwrap":false},"2.0.1":{"name":"@okikio/native","version":"2.0.1","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"}},"main":"lib/api.cjs.js","source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"2.0.1","@okikio/emitter":"2.0.1","@okikio/manager":"2.0.1","esbuild":"^0.8.32","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.1.0","typescript":"^4.1.3"},"devDependencies":{"chokidar":"^3.5.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"},"_id":"@okikio/native@2.0.1","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-2D/Rs6f5/mlce/hS9GO5Npro8ZcqNjBSO4PQXkI4ATc3IwdSnnxuwtct2ierq3iowpZL5JOmbOJip8POUo+jxA==","shasum":"51a8ca89c5e69e6a0d5ae351a63af2c5bc6bac1f","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.0.1.tgz","fileCount":36,"unpackedSize":487214,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgALCYCRA9TVsSAnZWagAAgEQP/1IBN+Qc6BsDrSKe4+sT\nbwdqnyXDMGsUK3PJZvy1oTKsBUwSQilYl8FJecNQEHhkGLEhVxnhKchchNm7\nsR8C8n7X067i3NF/Wc9shNVMpgZJ+s+QPn5imIVsslIyjJPY8H6tRk//1MTz\nYqrAEbmvTTfSuGlfYttMefQlCKM3i3ne55cL1NaNzg0Fh8PhsYPWkQOoVl6F\nNPenCz8rUaF0RjfbizKTxrNALtrNxCplBV+3se7GuuUpm+Mp3SVQswpet2RI\n+D7XjlU5IDcD8pEuSri1uy4uzyicTk0TholloI+jW68MzK7TTiG0DcE+rDQ9\ntoNI5YNz+KG4lQTbgZHmtUrQNKGT8OX0JrnxVNMRd4Xto/pWXvwy2JI7liij\n3bdopnd9Rp97CcvZ+Op0xCUCZecEW+aXzlocbkS3Bbf3hUvtF5Y45DK+psjh\nE8lnNNj/9kYFshZaYFpC8QbB91ZVm2DZBpSMxfh+kRohpNJcndcnwJ5iXDCM\n+KJaeGPKvwE+OBztGbWrE3YPCiBvBUDb1ih8jptmXaZaE4EGuSPWCp6ahHug\n4RHW8j8hWpdF9WChUz3GFtw4M8xB+Ze5Y8ek/GnBpMfGYctXpFxVnxiRinh3\ntdUBW2Q+7jFygECL9rJ4uoh7V/OMLU1zgojzHzi9U+5e4F9TRVDKNhWooFjz\nZ+Nz\r\n=4+Gn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEvssVROCl/pxviFba9jHz+xXdEG6CVEt40905U0DprQIgEAZgqG0FT/0nE5u4uCE2C42xcXx5h0wnpXvfUbwbKs8="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.0.1_1610657944380_0.7109756320630132"},"_hasShrinkwrap":false},"2.0.2":{"name":"@okikio/native","version":"2.0.2","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"}},"main":"lib/api.cjs.js","source":"src/api.ts","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"2.0.2","@okikio/emitter":"2.0.2","@okikio/manager":"2.0.2","esbuild":"^0.8.32","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.1.0","typescript":"^4.1.3"},"devDependencies":{"chokidar":"^3.5.0"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"},"_id":"@okikio/native@2.0.2","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-5OAM0ZGQgBNTRTo2JYATvhD777+OwvfxHYNlL0ZJ6v7Apl8nWdvJLj6bEZv6SR1pTJRi9Mze1QcpYiD22wWLIg==","shasum":"64bdbb618e5010b6383363d8719a767520088b25","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.0.2.tgz","fileCount":36,"unpackedSize":487161,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgALe0CRA9TVsSAnZWagAAoZ8QAIK9SE52ELMDdPrdwvu0\nm/tPGoYABRaHcbejjY4VLln97PEDwrAR1gfVcRFCgXYCgnArEhA8NCXMVdQy\nROcpkyPaFtrGguSiKyDFZuRNpSancS8YcxuuBdH2Tn4hxOnZvtqTVD+sWi3B\nfhyzNQ6ksKCj/u+QfUeCSw2R9QHNIB+FqwsBKGOK1/TNdystSaKKwNKycmiZ\nL4WyDWM9cCLB6ht8T71xttGPPjCiw1t7cpDI/+TKTHXIL1qE28eWRaclPavP\niY5REKjGNgqa0hvfXilDfqy3tJ5bVc9Qqei+OJHMVvPhGa12F9+QFTcldE1m\nUQv880qE1MqnJo9KuWF0JQFMZ5RQLg71CBIlphWmNa64CJiyCHs5gl67w6dM\nqsiGUoiQkhn8JW4sI0prXRCu/x8lCQJKBOJMsKasL8uUwYVmSW8uct9boii3\n+9LKIcPacyOniCm0waIqqVh1Fr7sFv88aJSpYizzR/uHGKYMHZl2C89qrhjt\nQurZh32yvSFcoT05K3hg/V8U7/brmqfUiJirubNuW9c+GvyKEwdMdU1VCUF/\n7KoP1bnlsfGbD7jvLTcbn0gmyEU2p6uUEp/lZbBoM1J4+PgW5kJ/TjpMMypT\nt+RW1v7lodaV1ioHWNVwW6/0en56QiDrICbMSznTC8+wBUoDBbuWJSUpI43v\nFCZG\r\n=d3cd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjg9qgVzlPJ4gt9Ae+wtN8WiYNcO6CjibPQKzzP3mc6AIgJqBDwhBzfFYQSJwamjk+Gan1WyR80uCySnpnNu0hN2M="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.0.2_1610659763515_0.41810097303440186"},"_hasShrinkwrap":false},"2.0.3":{"name":"@okikio/native","version":"2.0.3","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"2.0.3","@okikio/emitter":"2.0.3","@okikio/manager":"2.0.3"},"devDependencies":{"chokidar":"^3.5.1","esbuild":"^0.8.34","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.1.0","typescript":"^4.1.3"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./src/*":"./src/*.ts","./lib/*":"./lib/*.js","./ts":"./src/api.ts","./es":"./lib/api.es.js","./cjs":"./lib/api.cjs.js","./iife":"./lib/api.js"},"_id":"@okikio/native@2.0.3","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-mGhElcmXM69NIVllrslooVDX0ICx6qY8oto6geVbMDfor/aQnv+OjdEDr1dZc9bLz16jShRZtYBqD5KHeaP+Ag==","shasum":"11cebeb771bd9f48a7a49e68517655ed9aeb1d09","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.0.3.tgz","fileCount":36,"unpackedSize":487452,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgC8izCRA9TVsSAnZWagAAR/gP/01wlBZAmJoZJK0s6uen\nkARQddURBXySbFf0zLzvbQMB37P8w0qKNMSJ0x4ps8ERLdIFKKLXEnCoEgiF\nso2zbfnrFQaGqmh7j3uNKGMFTmOfhG2BK9LKx5bihqilTF4acEJhAGa2uQQr\nwnkFPhHGubhSOj55APlC1z0eMPHrUIpC5uqZznek8yhT+ORmKkW+tMC5bXvz\nEmXEj6f6VlkaWWXxttkUgyEVnk6zMv2d3zXsVDwfwSs+38/DKfskdrxrZCss\nBsOx60r6wPUlfUUUwvSXQLKylhanMtLi9jEH+ZIKoMW12pcP14S027DUTjM+\ngDcB2LRCloLOictOlkV52Wsdq2bhLpETLH61kZr1Xilf8WHWaZWm17nQqCGg\n+gDmBsp/nTMk3H/YJgsf1M50iVxiN1oHVbwZrDPhUFeIWcVF8Qv7QbrbwO/K\nXEnVf91kC2q/4xIQxJEDZ2YLuSuMK0oGxlUJ/H69WSTUq1a143ILNUaLRy5y\nC1b0o1oxQM8mypCbyY9pc3fnxzMevDnJb3+Ul3ctd4DuuoCPtD1cnB3x+0XK\n5Pmg/hvhu9QQL09OQKZ4k0L2qYZ6zCn/K1N5j2m+w3dbMGsW7ofPgK6ng0+r\nix3godKdIHRyiPsmIpVe8cISfS8jdmPyJpkbCAKL6YRL8PdhM6At6NEYgax/\nW0cv\r\n=u/tN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBdOOL8cXgBYDuPbIQ1Ku/UimoTio8F8XWDyYe9wz7pGAiEA/x/KXgU3Dt605+syuaAcQ9gpw3M0faEkNsDXvOLQqcw="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.0.3_1611385010445_0.6486751491846616"},"_hasShrinkwrap":false},"2.0.4":{"name":"@okikio/native","version":"2.0.4","description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/packages/native#readme","dependencies":{"@okikio/animate":"2.0.4","@okikio/emitter":"2.0.4","@okikio/manager":"2.0.4"},"devDependencies":{"chokidar":"^3.5.1","esbuild":"^0.8.34","gzip-size":"^6.0.0","pretty-bytes":"^5.5.0","standard-version":"^9.1.0","typescript":"^4.1.3"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"},"_id":"@okikio/native@2.0.4","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-A3tgOeMX/ys53hj4Ufe2IDagmgcVQ52wzkWvxMiu2zcb/QT+JL8ySEM1VqdjJoxA9thh3Bu1IGnqdxGNzxw3jg==","shasum":"16a7a529866072dffcbc261e06f76da733860ce2","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.0.4.tgz","fileCount":36,"unpackedSize":487277,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgC9BdCRA9TVsSAnZWagAAeSQP/0T3C6V2pTfggx5N8NGd\nBinpnE0HbOoWr9ZF/sHeyM8oA7g2/jtXookd6/4KkglyvRPeZZ8k9Apbp8bu\nMOsVb+Y8HratXi/ZS5pfFKSinDJwykdiNVBVa6Q/gpLc76StQBIaWfhnZhBD\nGehP2Cv9Vehj5zrlgkPMYFfICjgi1OTdE8DWUvMqMuHYRBDf8Ez4FRcrwVyQ\nONGw6mMUZx4XIi+38yM3cf5A9T+XS+0h8CYIAgGITGRo/fYNLHWIFl54/Xj/\njg0echTubLe936xkopMLR1zWvT7oa7X2P8QbHKB7+rZu+1QqKYJ/HOKBJuRO\n0Hcu2pqWvEIZEDLcheJXxkFWAZeTUYeBxQG9J0saFkslTHYi71gOsuj923/p\nz019GDGOWbpTEl4l1yVnTYjzDuTmuNiH0aBHhudmc5S1Z8khUjSsVsS6agCI\n3zse215UGxHoyB8FvdkxI+zS6S3kUi7yt0UxNsBc0bNylHmbYztIqNo6ygX2\nuRgAcweOYIlP8RiWUlFKCCjk05TbnQ1JHbQktGLGtcdNA7hAr7gLmvoHDLCF\nuYHm0VhJ/sZqSixPr2TpkaUu6hEvgTolj4rTB8tv9pLlJ6hev/S6ZD7FtYOZ\n4xXJ6WTMVDl0zt7WI6hlFmTynmzHIXMJHTaDWLKAO8WpjHRUofGhJC7NbvRU\n+lfm\r\n=fUo1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcylNQLGWLjIRgwd9+pJNsU4pi+SdsNCz71DU5Wr2UYgIgYRSfQc5dn+Mopj5Jv3U0JArcbpP3E1afv+JvCEdNwyA="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.0.4_1611386972406_0.9573093600639873"},"_hasShrinkwrap":false},"2.1.2":{"name":"@okikio/native","version":"2.1.2","type":"module","sideEffects":false,"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","dependencies":{"@okikio/animate":"2.1.2","@okikio/emitter":"2.1.2","@okikio/manager":"2.1.2","path-to-regexp":"^6.2.0"},"devDependencies":{"esbuild":"^0.12.1","pnpm":"^6.4.0","standard-version":"^9.3.0","typescript":"^4.2.4"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"},"_id":"@okikio/native@2.1.2","_nodeVersion":"15.11.0","_npmVersion":"7.6.0","dist":{"integrity":"sha512-YJu2XTmodtajSgTAI4Mk9T6wvbfgxbYmiSFfA5HhR5JzKapW6CpPq+o/YPf398b7WIzW5h+wDtiIfAgOoGUm2w==","shasum":"99701da11b38809169e289e35dbbfd8f4867e6ab","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.1.2.tgz","fileCount":32,"unpackedSize":606416,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgrGxSCRA9TVsSAnZWagAAnkwQAIhDTNueGeXrwUTkuKtQ\nWcY7CtfT1FlHFErO0Jm5wuvGDJWcAVwgvQNueUfI6jBhOFjIDXkaF2pY6O3H\nH3b6szQzAalKyJ+B/zbp/qy91NkLfBHZQM7lwMC+0fezNZ22VMRvHgvHBFtA\nSnfI3NitQjAmjA1bxFq3lgy05C7HHy/XhM86QeYzUdun/aUl8ftVEzietbnt\noENf0YUGXdcJdqPAXDuIHqwn4r/r67MNkqYVN/7oA+6e+A3IkvrlWXZhxPoS\neQH3gZhaC3PrJcMG8Sh82lXhWLc+JZaT1rAXfquvRq2LacD0NoFnps3Wbjuk\noOOSXUokTGLeAVVjTn0iPC9V3Mf1clxsT7I+XDb2lv5hyMbdRK3Ry0zzEHmw\noazhb3cQyJ7oApYI2gAOoE8BwdmYSwDhUGG78LvMbIjKjT7+z+cnRxAXCvUi\n/ts7icrH6TcEc7XnnJ0SD8LSU9E+r5+n6Nd1T6VvzmM+5P4ys1l/IRXYPPTs\nEpF79UEHoedlyUTm+/vLz4T5G8traaOYYX+aZWKkuOxXEAt+8Vnup1hNTlMx\nyKGiRDrZ+UiB/kxuGt3AjGsf1WdMmXiRhY6kTuleKto3kkKC8w28AuCTQ5WG\npJCvPThxWkjONR6cG4LxVmdzxpp7nRYH68ZJ2MEwZxTennT12S1AxLkgQ7u4\no4Cz\r\n=Ekzp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGsk/HBRCgoZJIUgiJ/OuPFYcQKrljDzMSKAdxzx6ZnpAiBc9cS3Ya2oCup7PWcev8xeBYBYWsMuhoolqNMOolEPXA=="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.1.2_1621912657484_0.903646751973262"},"_hasShrinkwrap":false},"2.1.5":{"name":"@okikio/native","version":"2.1.5","type":"module","sideEffects":false,"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","dependencies":{"@okikio/animate":"2.1.5","@okikio/emitter":"2.1.5","@okikio/manager":"2.1.5","path-to-regexp":"^6.2.0"},"devDependencies":{"esbuild":"^0.12.1","pnpm":"^6.4.0","standard-version":"^9.3.0","typescript":"^4.2.4"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","scripts":{"build":"node ./build","watch":"node ./build --watch","dts":"tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"},"_id":"@okikio/native@2.1.5","_nodeVersion":"15.11.0","_npmVersion":"7.6.0","dist":{"integrity":"sha512-9z4wmRhsF4cWF4GohSL+mJ+j8oOUyH9aDz+4j94GjBbvGN3WbQmhcbUxLgAoqkT6BpSlwmZ14WGAHXQTiI6ECw==","shasum":"c7fba586567d3a87eb34aa70c34e98660bafb43d","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.1.5.tgz","fileCount":32,"unpackedSize":607471,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgrHsECRA9TVsSAnZWagAAqgoP/10tgQqFJbSVYGbh1n2a\nPQxnPDeqgTQdIhToG8or24agxzDTG0MDxf4ME0kZ37YMFfJApobGfhg2CEbR\nrlW96Ua0xo6kju9ReDzf335xMC/syBIkd7k0OVRuP6tti1PSTJh8avBB1cKT\nxx12P/0EvG84icA8ZmNqFlPa4ZBtyqIrz68Z5/mTlNfmFUqbKnI0scytZejm\nbxW4dOpx1jw3qklkFshx4tByzSJ/7sPjFx+FD7WOVJMIffzp86pJxF3R/Y1l\nV/2gL2+YD2WbOeXChoSeCPJpLuxKGTUy/boansacdb0gUgl6yEt1JTb6HkUq\ngsGqNnVyiwenUceWtDz54SX6aSJuMcFjqOLC8U8UJ3OQULdSZFmTGsf1FN1b\naZbZRpWREkQwtZRJzePi/Fs1uK9qG0BqlVrlktkuahgayiJh4HGzxE7xDNdV\nUmprBXXqaT3bVlgSuTUEmVadaM1IdUSpsT0Ybsm2qol0Pl9dq9wsy0DA4SG0\nVaRwj+O+do5taBKS78aHdF4yqomSUAi7z93UloFpbWlT3VoFj4i7sOxLpQ+x\nry6GiDAj1P5ntr0IJEF1ak+R1Oo42Bw8u7AvA2IIndPjy14gu0RZPD3Za9lI\n3apEat5hdLSg44J1LfD+4bLVXpD36ixftrr2XHtPartYdZrjNHZbJSc+0TUu\nwSmX\r\n=5rcj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG94vJlizvtDWOYBerfMToiqtKBvNQZRseblUiR8vqqPAiEAv2NMHrD23UWx36YaECzhhwv+43q5VfneszhsA5+WHVg="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.1.5_1621916419451_0.6244432306828673"},"_hasShrinkwrap":false},"2.1.6":{"name":"@okikio/native","version":"2.1.6","type":"module","sideEffects":false,"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","dependencies":{"@okikio/animate":"2.1.6","@okikio/emitter":"2.1.6","@okikio/manager":"2.1.6","path-to-regexp":"^6.2.0"},"devDependencies":{"del-cli":"^3.0.1","esbuild":"^0.12.2","gzip-size":"^6.0.0","pnpm":"^6.4.0","pretty-bytes":"^5.6.0","standard-version":"^9.3.0","typescript":"^4.2.4"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","scripts":{"build":"del-cli lib/ && node ./build","watch":"del-cli lib/ && node ./build --watch","dts":"del-cli @types/ && tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"},"_id":"@okikio/native@2.1.6","_nodeVersion":"15.11.0","_npmVersion":"7.6.0","dist":{"integrity":"sha512-52w5kvmQVCZp2IerXsnQBB3KJGd5PJbVVn9B89R7kS5j6u+gIdT1lS2/37ubWKCx2oXd0u7KosL8oEJEMzU0+Q==","shasum":"7455afba66150a062eaae273b8ab30e52768269b","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.1.6.tgz","fileCount":29,"unpackedSize":283031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgrpPjCRA9TVsSAnZWagAA3JcP/07DRmnWnGcxDKCCHwRr\ny4JiRgNF5saRayBzCRpX7tMUnljin783K5XesDwZNHRCkRKf/VyfAQqq9osM\npKIB6mgQRDjJQAHdLMK4SAeJP/aeuDGAQd8ADQsUvA9y1r1nqrAwU++zNZxy\n19gcQ9A7JTWCl6mNov//Ofbsl0PoML4nVDWNgv5x/XBSOQC6Ka2d58RV3TKE\nzJu8qAWCO0FsfReueoTOr4j2f6jcML6ZKGNvnhs5FOLVTInYScyg9qR+LZlH\n8AzR2lnDMyJqgtXV8jZANEfChN3IXSxQTeXszQKgVrGMiXL8pGJk7+Y56UI9\nEuQUxzbL0sSVc+QriV3/P0oKyERMkT8S7OY3h13ai+vRDd8oV+pR4st6qV1S\nUNgMOxGW3XTebF6brZ6BzQJ/gmfTcZBB+8Z6a+zk0BrAAFdXMESDYhThPyl1\nUwoyDntXWBeU6A0yyHu658JXWOmMfYtreJiDkoukQTSmAhCl6iQKVQgLilAL\nlouEx8exv91QKzbKm4lX2DNsDaCgY7GrVJfMeYSXDygaB71UWFbJd2Rgfy6q\nLFCUfMEmrF/SppuJHmCxsA9BhNE86UCelH3r06NV9oBIye0cx5guf5107PNq\ncB+iQ6GcK5v0LChxHAdrkuy3ql089rfsRmwD7XPMWuv5sGuzWv0U71TrrzAQ\nxzsy\r\n=CI8H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUzubDFZPmSry56+VyGQal5mqvxwDY6d3MoB6LT7nj2AIgbWH21bpGpBce+pZ61ery5xW+BtepBmR8z5gKc3OLmj8="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.1.6_1622053858528_0.5380145393142133"},"_hasShrinkwrap":false},"2.1.7":{"name":"@okikio/native","version":"2.1.7","type":"module","sideEffects":false,"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","dependencies":{"@okikio/animate":"2.1.7","@okikio/emitter":"2.1.7","@okikio/manager":"2.1.7","path-to-regexp":"^6.2.0"},"devDependencies":{"del-cli":"^3.0.1","esbuild":"^0.12.2","gzip-size":"^6.0.0","pnpm":"^6.4.0","pretty-bytes":"^5.6.0","standard-version":"^9.3.0","typescript":"4.2"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","scripts":{"build":"del-cli lib/ && node ./build","watch":"del-cli lib/ && node ./build --watch","dts":"del-cli @types/ && tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts","changelog":"standard-version --releaseCommitMessageFormat --tag-prefix \"@okikio/native@\" \"chore(release): @okikio/native@{{currentTag}}\""},"types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"},"_id":"@okikio/native@2.1.7","_nodeVersion":"15.11.0","_npmVersion":"7.6.0","dist":{"integrity":"sha512-nYNpHDArRwSpKsvxDmwQcU/GlETp7wBI+QrwvKGEGJPkiNg+h2xOYakq5O1/bWpx+ELi7pr9H0AbNkWLEmZJEg==","shasum":"1b72cdab4e75632b65e863634a385cafdb1a2154","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.1.7.tgz","fileCount":29,"unpackedSize":283913,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsI+PCRA9TVsSAnZWagAAB8wP/1sJ2sJZOQe5MFLtUy5E\ndTTS+tKkgMaF8ZNF72iNQE/8aKcSQrWzK8g7FhCoFJFbteja1kDHLng8AHD8\ncYVYNScqw/LrRYrR4ze9EZg7wBUSDsCW4B4Ke9hvT6V/giVG3MJZuGNFlN/0\nwP25/vAdlPB0s0fnZjYrqRhrIlz+elPcYOUb8JR6p6winFW5/I8zwfq18ZDF\nxHHZ1IybqPDv06ZiUgaGFt0ki/bX/HxgtiCv+xX+qew3TAbagOkwbZcdHhOJ\n4iykdqwQkR3TjBwzIPXO4ldgMbVPAYB3AwSkLs2CYMTNylYpcEKgISMK8NMA\ntFu9F3WD3jiPAcsnJOdmY9Uhj6Gx7P76E6F/UBHhJVWfh5fJwSz1ytCjhJCQ\nvMW6OJI3anDiHJobZ3j7lvtTYi6C/K8ZGBU6xlucLa00Ja+CwHyiJypFblPg\nZe+29NLFWssLqClotleuM3jQfpxV/dMSlPN2Ncc+p7jGseim2SE8gv2cn3IR\n/YLLcb38kkwYNl1MwMjNAKHQh/PDdiuCplTxthfqz5faGonalrQRRbU6c3t6\n7OxaxaxWoLXlhGdc1hsvoNKefE5eXhy0bhsp7H5AegbENUkUMEuH+4dhEmDr\nY5OG8cZYB2N5ASJswbkak64mAdBN7EmiTmMA6SLvBMtqyTO+7mwaOGDfcNF8\nfQ53\r\n=alMZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqaP4wsqQ+MumMRstB7sHeSMwuCkicHO/JrVQtQ7mc6QIgB47zsuoCkKlgz44dNvjinvPg4gE8xE0BCRKf9rEyoOo="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.1.7_1622183822641_0.3444924490551"},"_hasShrinkwrap":false},"2.1.8":{"name":"@okikio/native","version":"2.1.8","type":"module","sideEffects":false,"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","dependencies":{"@okikio/animate":"2.2.0","@okikio/emitter":"2.1.7","@okikio/manager":"2.1.7","path-to-regexp":"^6.2.0"},"devDependencies":{"del-cli":"^3.0.1","esbuild":"^0.12.5","gzip-size":"^6.0.0","pnpm":"^6.4.0","pretty-bytes":"^5.6.0","typescript":"~4.2.4"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","scripts":{"build":"del-cli lib/ && node ./build","watch":"del-cli lib/ && node ./build --watch","dts":"del-cli @types/ && tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts"},"types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"},"_id":"@okikio/native@2.1.8","_nodeVersion":"15.11.0","_npmVersion":"7.6.0","dist":{"integrity":"sha512-YTDzxQIxlIb+DitlssGA6oyZjIt759EFNYNVmZYASQgr0QCyD8nDBNXhspuiO3Dp4IoMkI3GxLGyblK8xVQCOg==","shasum":"5fbd1c321ea391b30d1293dea0ec040cc8088cce","tarball":"https://registry.npmjs.org/@okikio/native/-/native-2.1.8.tgz","fileCount":29,"unpackedSize":287000,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgszjRCRA9TVsSAnZWagAAEUkP/1k8JKEWRkCQLmJpRwG4\njO5eHRImCGhRo+5bPy8WoCNkphlyi1CIid5viinaq6ARwumPQOLOaL6ETj60\nzJa2asTuuQzn7iIcezIOCljqfP96w+I7KQGJ9roQRlMXMVu5exAqTY5xuf/C\nFq0nLMoc0W2GZ9qv+TiiYp6Bl9VGecpmj7dOr0/gfDjW5x5tCS0or/kl7dD6\ng5gjqhHTzP6fnXlR9VoglyPPxui/kw1B8J9Fl0BX929USZ21foyruMYqFgjv\nMdzdVENxir7PPYH6flonnEOQAEBHU6jTXG5Hgxx6POx1fRTNy53nwCGvkU6l\nP1PnHggSV/GAcrKlYatMT4G30CHz/0uNdQD+Sk9gzBI/2JAt/GM9wGV6eX9y\nRam449sk2vsLNJ5FQPminNi1u6Zbqeq56Is1RJgh8qc0r9leL73HQrHMXhkz\nCCZhBMCwzQe1xB5SBSo5IQJwoJAxHm32sIVkp93uPyAz409qExN4svRoSbgb\nXCDcWnhFXioVenZvkOE3+UGnDEsZ83wknH6yQrL1sQ0jizpilCYHAoHt/Ox/\nv/1HKSprSIweaBoSl0o6MLbebOjVeXCBePLQ1VQmyBNbbrU79fz1ViZ5FzEi\nsP8gKJHY1FhhTMZgqzPkRREW1v9O6QzgnAPrCA4SxuYk6KNjN5xI6gVTk9a+\nWOq9\r\n=q3vf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG1FJbjS7wUKGR+YeDQHxG/zfjO5hCXhvdLDwgjMbEX/AiEAtWg8F6FchkAgfm3paMiXzkTZNntMpUuaxUHsvNeMoIc="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_2.1.8_1622358224873_0.26088715177965405"},"_hasShrinkwrap":false},"3.0.0":{"name":"@okikio/native","version":"3.0.0","type":"module","sideEffects":false,"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","dependencies":{"@okikio/animate":"2.3.0","@okikio/emitter":"2.1.7","@okikio/manager":"2.1.7","path-to-regexp":"^6.2.0"},"devDependencies":{"del-cli":"^4.0.0","esbuild":"^0.12.12","gzip-size":"^6.0.0","pnpm":"^6.9.1","pretty-bytes":"^5.6.0","typescript":"~4.3.4"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","scripts":{"build":"del-cli lib/ && node ./build","watch":"del-cli lib/ && node ./build --watch","dts":"del-cli @types/ && tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts"},"types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"},"_id":"@okikio/native@3.0.0","_nodeVersion":"14.16.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-Zv3J5XtAO0DO9boydwc5iDoFH8E4XxjUVKIz7pI8pV1OZQpamuAaOfeCWl7Xbkoqb//umHGO+gJhgpiVsU69/w==","shasum":"d4e7e14835bcdb21cdef1e7687cc8b4156135eea","tarball":"https://registry.npmjs.org/@okikio/native/-/native-3.0.0.tgz","fileCount":29,"unpackedSize":237939,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg3BLJCRA9TVsSAnZWagAAK3MP/RQaxtwQOeuunJofhacr\nkhvkfEsW7dBiHX1rjVtm7CJGIAZeGRSSwZRO6lHP54s6I8N5xiCElYSBaCt0\nCyPiUN8WjnaJ9oGwLrX8IXs+ibZie/38c6ywF3guHUyOYocqQbx0keU4IzEF\nD2EmER36+B4fLgnzemrLlzqAWCcrP7DFkaElTWYpq1xZDkv2J1G6WeYD4PvZ\njMTZHdTC4Q7v9H5dIaeSvUxlYsr7EyE37SEdGkMjwb87XnRkpnGzQpi3ObSM\ncdWoTRBluWXuK7Xi5/KbUB/1JioSJKg/M47TZl78xJpR8GHH3hs8YcRlQrql\nIVKAantLXsKc8fUvILPYIJYGy6Cnf3ZUGPgBAIhngn9b3tcWNwxO5/WjRxka\n/G+bwmeWqJSmkPo89Pr4RVgdXaHVdW4e9oS5aKByYkt3cM8JObQIiOFRCRLl\nSvZIx8GoxvofpFbzC5lODUL6xjqflqmtsPoz5EtA4tigFkSwOiBaSN8kSiZ5\n7I7NfKR0vDRvA4s4rengxCsOkgQqAYsASAlwXJ2melu9jnucqlZ1pZsZW3mk\nMyaCAK1nuKoL7gl4obXJSyRNwjvVSHp0IaQSjiTFUfzbkyFtqbEtsI6z6mwh\n1KmUGLm3Vee2VGyZVtWZ3+uFrjaOq0p4yC18cQbJswmcyGZUDZMtwapm6WRx\nAt5A\r\n=Mfym\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICKfLPqxdeNfqM5I9eLGmesu8h4fZNplNG92hy13qLjMAiEAitKAX5SX3O/Py1CuJbCPl/4Rxh+0BRz5CIRC7YKLaRM="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_3.0.0_1625035464939_0.5889606106793586"},"_hasShrinkwrap":false},"3.0.1":{"name":"@okikio/native","version":"3.0.1","type":"module","sideEffects":false,"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"access":"public","main":"lib/api.cjs.js","types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"}},"main":"lib/api.cjs.js","directories":{"lib":"./lib"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","dependencies":{"@okikio/animate":"2.3.1","@okikio/emitter":"2.1.7","@okikio/manager":"2.1.7","path-to-regexp":"^6.2.0"},"devDependencies":{"del-cli":"^4.0.0","esbuild":"^0.12.12","gzip-size":"^6.0.0","pnpm":"^6.9.1","pretty-bytes":"^5.6.0","typescript":"~4.3.4"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","scripts":{"build":"del-cli lib/ && node ./build","watch":"del-cli lib/ && node ./build --watch","dts":"del-cli @types/ && tsc --project dts.tsconfig.json","pre-release":"npm run build && npm run dts"},"types":"@types/api.d.ts","browser":"lib/api.es.js","module":"lib/api.es.js","exports":{".":{"require":"./lib/api.cjs.js","import":"./lib/api.es.js","default":"./lib/api.es.js"},"./lib/*":"./lib/*.js"},"_id":"@okikio/native@3.0.1","_nodeVersion":"14.16.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-urTsnVbuN4EjMD/q03u2manMfEIxl+fi5geaN3vQGkB3rHBGzkXcvm00q4Xd5UT6+baRoFV8dZ9pfhimoPZqGA==","shasum":"45ceab85a0a4683204c3a334aea1ec8c1b1f4938","tarball":"https://registry.npmjs.org/@okikio/native/-/native-3.0.1.tgz","fileCount":29,"unpackedSize":238030,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg3Ba5CRA9TVsSAnZWagAAZG4P/RvKCKT+MD2NBUDJ/Srx\nMTo6DK4na5RMkCkHX3dUTtOtZRynu5TlZTSSrJt/Q5bbb7NZM64QwWgSwzRB\nF5p2z9RtM4e1tIgRORicN4bBhNoGfJR13zpGWHoRDOay/lg/Gk0xY6J1BO/1\nSxBiZB8ujV6d8NpHXncsj/gBJWAB7d/pn3i1HDWIxVFcC72FBBRK/3j61yV8\nP1SBTGFm2cjfcJogluL/lGhc2DUsnt0El/hv3aj/ubK3uGdYdlSp8QMCdaJ6\n727UBFXE9+/gcA+hDP2gHdexAu9KJebTMN8XW/NgTil6yQkI7RC64BYu/d5Y\n7NPvGrfjE9tOtbFbSqJfDkOuiTkU+m05x9Vl6DyD5drIHyrbpI4U5jJoxDhi\nRRhIBBhFrjSFChK8Klsnab+zstGgJfRYuIXpKjpMMbaN28FU3ykAx6b58vhP\nO5q6Nh+JvI8ctJXzqthstnVjBwtyOVjE/12PQlzDj7N/KFovAJ9arNyJB8E2\n5nefy7873H0yZR/4XODNXPGiN3/BBA92E+PQzcHDSSHdLGY4kbKTi1QLRtbD\nO7JKG/hoV5cRx//54v95epMWSBELJlsef74cLBFJqfeV9jo17kUuD6EWnDVC\nFObNe6mpU3o3gmroHqb241GpX62RG9iY6FVDNNbs2lffxF53fPd/N+Xg5giQ\nz66R\r\n=nREu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFyjVq/uMAP9JrywD46h4JeX5WznYnsjFM7ZE+mLrfPwAiEAnG/tVtVXCoFagK4quL8Xy/g7zYTcMdDjMo5ceNjWEcY="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_3.0.1_1625036472521_0.23113099552841776"},"_hasShrinkwrap":false},"3.1.0":{"name":"@okikio/native","version":"3.1.0","type":"module","sideEffects":false,"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","publishConfig":{"umd":"native","access":"public","legacy":"lib/api.js","main":"lib/api.cjs","types":"@types/api.d.ts","browser":"lib/api.mjs","module":"lib/api.mjs","exports":{".":{"require":"./lib/api.cjs","import":"./lib/api.mjs","default":"./lib/api.mjs"},"./lib/*":"./lib/*.mjs"}},"main":"lib/api.cjs","directories":{"lib":"./lib","src":"./src"},"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"keywords":["api","ts","native","modern","framework","web","pjax"],"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"license":"MIT","bugs":{"url":"https://github.com/okikio/native/issues"},"homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","dependencies":{"@okikio/emitter":"2.1.8","@okikio/manager":"2.2.0","path-to-regexp":"^6.2.0"},"devDependencies":{"typescript":"^4.4.0-beta"},"gitHead":"ad422076cdb57d570426f786886129d5bca2f90f","scripts":{"dts":"rm -r -f @types/ && tsc --project tsconfig.json","pre-release":"npm run dts"},"types":"@types/api.d.ts","browser":"lib/api.mjs","module":"lib/api.mjs","exports":{".":{"require":"./lib/api.cjs","import":"./lib/api.mjs","default":"./lib/api.mjs"},"./lib/*":"./lib/*.mjs"},"_resolved":"","_integrity":"","_from":"file:okikio-native-3.1.0.tgz","readme":"# @okikio/native\n\n[![npm](https://img.shields.io/npm/v/@okikio/native?style=for-the-badge)](https://www.npmjs.com/package/@okikio/native) [![npm bundle size](https://img.shields.io/bundlephobia/minzip/@okikio/native?style=for-the-badge)](https://bundlephobia.com/package/@okikio/native) ![GitHub issues](https://img.shields.io/github/issues/okikio/native?style=for-the-badge) ![GitHub](https://img.shields.io/github/license/okikio/native?style=for-the-badge)\n\n`native` is an initiative that encourages performance, modern technologies, and great user experiences. The idea behind `@okikio/native` is that it acts as the core framework to the `native` initiative, it combines all the other package into it a core package that is **~7.21 KB** (minified & gzipped).\n\n_**Note**: `@okikio/native` is treeshakable, so you only need to use the features required for your project and the other portions can be removed. The absolute minimum functional treeshaken size is **~1.75 KB** (minified & gzipped)._\n\n[@okikio/native](https://www.skypack.dev/view/@okikio/native) is a guideline on how to create great web experiences that integrate into the system in a way that feels like a cohesive and native experience.\n\nThe idea behind it is that, when an app feels native, it means that it integrates well into the systems and `just works`, for example, a dark mode that follows the entire system. The `just works` aspect is key to the framework, it should work without the user skipping a beat. On the web this boils down to being performant, efficient, and smooth.\n\nThe `@okikio/native` package achieves performance, high efficiency, and a smooth experience by being heavily modern (relying on passive polyfills to support older browsers) and being well optimized.\n\n`@okikio/native` uses modern browser api's like the Maps, pushState, etc.... to achieve high efficiency and performance. The browser API's can be difficult to work with, so, I developed [@okikio/manager](https://www.npmjs.com/package/@okikio/manager), [@okikio/emitter](https://www.npmjs.com/package/@okikio/emitter), and [@okiko/animate](https://www.npmjs.com/package/@okikio/animate) libraries to make them more managable. I developed these libraries to ensure the framework is well optimized and to avoid large number of dependencies.\n\n## Using Gitpod\n\nYou can try out `@okikio/native` using Gitpod:\n\n[![Open In Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/okikio/native/blob/beta/packages/native/README.md)\n\nBy default Gitpod will start the dev script for you, but if you need to restart the dev script you can do so by typing into the terminal.\n\n```bash\npnpm demo\n```\n\nOnce Gitpod has booted up, go to [../../build/pug/](../../build/pug/) and [../../build/ts/](../../build/ts/) and start tweaking and testing to your hearts content.\n\n## Runing Locally\n\nYou can run `@okikio/native` locally by first installing some packages via these commands into your terminal,\n\n```bash\nnpm install -g pnpm && pnpm install -g gulp ultra-runner commitizen && pnpm install && pnpm build \n```\n\nand then you can test/demo it using this command,\n\n```bash\npnpm demo \n```\n\nOnce it has booted up, go to [../../build/pug/](../../build/pug/) and [../../build/ts/](../../build/ts/) and start tweaking and testing to your hearts content.\n\nYou can build your changes/contributions using,\n\n```bash\npnpm build\n```\n\n## Table of Contents\n\n- [@okikio/native](#okikionative)\n  - [Using Gitpod](#using-gitpod)\n  - [Runing Locally](#runing-locally)\n  - [Table of Contents](#table-of-contents)\n  - [Getting Started](#getting-started)\n  - [Installation](#installation)\n  - [Demo](#demo)\n  - [Usage](#usage)\n    - [PJAX](#pjax)\n    - [Wrapper](#wrapper)\n  - [Configuration](#configuration)\n  - [Animations & extras](#animations--extras)\n  - [API Documentation](#api-documentation)\n    - [API](#api)\n    - [Types](#types)\n    - [Events](#events)\n    - [PageManager events](#pagemanager-events)\n    - [PJAX events](#pjax-events)\n    - [TransitionManager events](#transitionmanager-events)\n    - [App events](#app-events)\n    - [**ManagerItem**](#manageritem)\n      - [MangerItem#manager: IAdvancedManager](#mangeritemmanager-iadvancedmanager)\n      - [MangerItem#app: IApp](#mangeritemapp-iapp)\n      - [MangerItem#config: ICONFIG](#mangeritemconfig-iconfig)\n      - [MangerItem#emitter: EventEmitter](#mangeritememitter-eventemitter)\n      - [MangerItem#key: any](#mangeritemkey-any)\n      - [MangerItem#install(): any](#mangeriteminstall-any)\n      - [MangerItem#register(manager: IAdvancedManager, key: any): ManagerItem](#mangeritemregistermanager-iadvancedmanager-key-any-manageritem)\n      - [MangerItem#uninstall(): any](#mangeritemuninstall-any)\n      - [MangerItem#unregister(manager: IAdvancedManager, key: any): any](#mangeritemunregistermanager-iadvancedmanager-key-any-any)\n      - [Example](#example)\n    - [**AdvanncedManager**](#advanncedmanager)\n      - [Example](#example-1)\n      - [AdvancedManager#....Manager](#advancedmanagermanager)\n      - [AdvancedManager#app: IApp](#advancedmanagerapp-iapp)\n      - [AdvancedManager#config: ICONFIG](#advancedmanagerconfig-iconfig)\n      - [AdvancedManager#emitter: EventEmitter](#advancedmanageremitter-eventemitter)\n      - [AdvancedManager#constructor(app: IApp): AdvancedManager<K, V extends ManagerItem>](#advancedmanagerconstructorapp-iapp-advancedmanagerk-v-extends-manageritem)\n      - [AdvancedManager#set(key: K, value: V): AdvancedManager<K, V extends ManagerItem>](#advancedmanagersetkey-k-value-v-advancedmanagerk-v-extends-manageritem)\n    - [**Service**](#service)\n      - [*Life-cycle*](#life-cycle)\n      - [Service#init(...args: any): any](#serviceinitargs-any-any)\n      - [Service#boot(...args: any): any](#servicebootargs-any-any)\n      - [Service#initEvents(): void](#serviceinitevents-void)\n      - [Service#stopEvents(): void](#servicestopevents-void)\n      - [Service#stop(): void](#servicestop-void)\n      - [Example](#example-2)\n    - [**ServiceManager**](#servicemanager)\n      - [ServiceManager/#stop()/#boot()/#init(): ServiceManager](#servicemanagerstopbootinit-servicemanager)\n    - [**App**](#app)\n      - [App#config: ICONFIG](#appconfig-iconfig)\n      - [App#emitter: EventEmitter](#appemitter-eventemitter)\n      - [App#services: ServiceManager](#appservices-servicemanager)\n      - [App#constructor(config: object = {}): App](#appconstructorconfig-object---app)\n      - [App#register(config: ICONFIG = {}): App](#appregisterconfig-iconfig---app)\n      - [App/#get(key: string): Service/#set(key: string, value: Service): App/#add(value: Service): App](#appgetkey-string-servicesetkey-string-value-service-appaddvalue-service-app)\n      - [App#boot(): App](#appboot-app)\n      - [App#stop(): App](#appstop-app)\n      - [App#on/off(events: EventInput, callback?: ListenerCallback): App](#apponoffevents-eventinput-callback-listenercallback-app)\n      - [App#emit(events: string | any[], ...args: any): App](#appemitevents-string--any-args-any-app)\n      - [Example](#example-3)\n    - [**HistoryManager**](#historymanager)\n      - [HistoryManager#states: IState[]](#historymanagerstates-istate)\n      - [HistoryManager#pointer: number](#historymanagerpointer-number)\n      - [HistoryManager#init(): void](#historymanagerinit-void)\n      - [HistoryManager#get(index: number): IState](#historymanagergetindex-number-istate)\n      - [HistoryManager#add(value?: IState, historyAction: \"replace\" | \"push\" = \"push\"): HistoryManager](#historymanageraddvalue-istate-historyaction-replace--push--push-historymanager)\n      - [HistoryManager#remove(index?: number): HistoryManager](#historymanagerremoveindex-number-historymanager)\n      - [HistoryManager#replace(newStates: IState[]): HistoryManager](#historymanagerreplacenewstates-istate-historymanager)\n      - [HistoryManager#set(i: number, state: IState): IState](#historymanagerseti-number-state-istate-istate)\n      - [HistoryManager#current: IState](#historymanagercurrent-istate)\n      - [HistoryManager#last: IState](#historymanagerlast-istate)\n      - [HistoryManager#previous: IState | null](#historymanagerprevious-istate--null)\n      - [HistoryManager#length: number](#historymanagerlength-number)\n      - [#newCoords(x: number = window.scrollX, y: number = window.scrollY): ICoords](#newcoordsx-number--windowscrollx-y-number--windowscrolly-icoords)\n      - [#newState(state: IState): IState](#newstatestate-istate-istate)\n      - [#changeState(action: \"push\" | \"replace\", state: IState, item: object): void](#changestateaction-push--replace-state-istate-item-object-void)\n      - [Example](#example-4)\n    - [**TransitionManager**](#transitionmanager)\n    - [**PageManager/Page**](#pagemanagerpage)\n    - [**PJAX**](#pjax-1)\n    - [**Router**](#router)\n  - [Browser support](#browser-support)\n  - [Polyfills & Bundling](#polyfills--bundling)\n  - [Contributing](#contributing)\n  - [Licence](#licence)\n\n## Getting Started\n\n[@okikio/native](https://www.skypack.dev/view/@okikio/native) was inspired by Rezo Zero's Starting Blocks project, and barbajs. Both libraries had a major impact on the development of this project. barbajs is easy to use and elevates the experience of a site with the use of PJAX, while Starting Blocks uses modern apis to create performant but complex web experiences. This project exists as a more flexible alternative to Starting Blocks, but with the same intuitive design and experience (UX/DX) barbajs provides. The framework doesn't need PJAX to function, and best of all if PJAX is enabled it can safely switch back to normal browser controls if something goes wrong.\n\nThis project is called a framework but it is more like a guideline, if all you want is a simple starter project that has PJAX built in then you install the project from [npm](https://www.npmjs.com/package/@okikio/native), but otherwise you download the project into you workspace and tweak it to match your projects needs and remove all the extra fluff you don't want (this project works best with treeshaking, you can use rollup, webpack, or esbuild for this; esbuild is preferred).\n\nThis package is built for ES2020, it expects the user to use a build tool to support older versions of browsers, the idea being most people are using evergreen browsers, so, why are web developers piling on polyfill code that most users don't need.\n\n## Installation\n\nYou can install [@okikio/native](https://www.skypack.dev/view/@okikio/native) from [npm](https://www.npmjs.com/package/@okikio/native) via `npm i @okikio/native`, `pnpm i @okikio/native` or `yarn add @okikio/native`.\n\nYou can use `@okikio/native` on the web via:\n\n- [https://unpkg.com/@okikio/native](https://unpkg.com/@okikio/native),\n- [https://cdn.skypack.dev/@okikio/native](https://cdn.skypack.dev/@okikio/native) or\n- [https://cdn.jsdelivr.net/npm/@okikio/native](https://cdn.jsdelivr.net/npm/@okikio/native).\n\nOnce installed it can be used like this:\n\n```typescript\n// There is,\n//      .cjs - Common JS Module\n//      .mjs - Modern ES Module\n//      .js - IIFE\nimport { App, PJAX } from \"@okikio/native\";\nimport { App, PJAX } from \"https://unpkg.com/@okikio/native\";\nimport { App, PJAX } from \"https://cdn.jsdelivr.net/npm/@okikio/native\";\n// Or\nimport { App, PJAX } from \"https://cdn.skypack.dev/@okikio/native\";\n\n// Via script tag\n<script src=\"https://unpkg.com/@okikio/native/lib/api.js\"></script>\n// Do note, on the web you need to do this, if you installed it via the script tag:\nconst { App, PJAX } = window.native;\n```\n\n## Demo\n\nLocated in [./build](https://github.com/okikio/native/tree/beta/build), you will find multiple build files that can help you create your setup. The [./pug folder](https://github.com/okikio/native/tree/beta/build/pug) contains [pug](https://pugjs.org/api/getting-started.html) files that format my html in a clean and clear way. The [./sass folder](https://github.com/okikio/native/tree/beta/build/sass) contains [scss](https://sass-lang.com/guide) files that allow for modern css without the need of polyfills. The [./ts folder](https://github.com/okikio/native/tree/beta/build/ts) contains [typescript](https://www.typescriptlang.org/) files that the framework runs on; typescript is used, because Intellisense is better with typescript. Outside the build folder, the [gulpfile.js](https://github.com/okikio/native/tree/beta/gulpfile.js) file, is part of my [gulp](https://gulpjs.com/) config, and is the tool I use to build the demo, for your project other tools should also work, with some amoount of work. Explore the files stated above to learn how to get started.\n\nI recommend using the Gitpod link at the top of the page to get started with development, as it removes the need for setup.\n\n> [View the Demo  &#8594;](https://okikio.github.io/native/demo/)\n\n## Usage\n\nBe default @okikio/native is very open ended in how you use it. You first create a new App, and then add Services, the App is the boss of the operation, while Services are workers that accomplish specific tasks.\n\nFor example,\n\n```ts\nimport { App, Service, getConfig } from \"@okikio/native\";\n\nconst app = new App({\n    serviceOptions: \"Some Options\",\n    containerAttr: \"container\"\n});\n\n// Read more about Service in API section\n// This basically shows off all the methods ExampleService inherited from being a Service that extends ManagerItem\nclass ExampleService extends Service {\n    /** The constructor doesn't do anything by default, but you can add stuff to it */\n    constructor() { }\n\n    /** Register the current Service's manager */\n    register(manager, key) {\n        console.log(\"register()\");\n\n        /** The AdvancedManager the Service is attached to */\n        this.manager = manager;\n\n        /** The App the Service is attached to */\n        this.app = manager.app;\n\n        /** The Config of the App the Service is attached to */\n        this.config = manager.config;\n\n        /** The EventEmitter of the App the Service is attached to */\n        this.emitter = manager.emitter;\n\n        /** The key to where Service is stored in an AdvancedManager */\n        this.key = key;\n\n        this.install();\n        return this;\n    }\n\n    /** Run after the Service has been registered */\n    install() {\n        console.log(\"register()\");\n\n        // All methods called after install have access to App event emitter, properties, Services, and Config\n        console.log(this.config.serviceOptions);\n        console.log(getConfig(this.config, \"containerAttr\", true)); //= \"[data-container]\"\n    }\n\n    /**\n     * This method is called by the ServiceManager, so don't worry about it\n     */\n    /** Called before the start of a Service, represents a constructor of sorts */\n    init(...args) {\n        console.log(\"init()\");\n    }\n\n    /**\n     * This method is called by the ServiceManager, so don't worry about it\n     */\n    /** Called on start of Service */\n    boot(...args) {\n        console.log(\"boot()\");\n        this.initEvents();\n    }\n\n    /** Initialize events */\n    initEvents() {\n        // The \"ready\" event is defined by the App class, that only runs when the DOM is fully ready\n        // The App class also defines a \"scroll\", and \"resize\" event\n        // but those events are throttled to give the best performance\n        this.emitter.on(\"ready\", () => {\n            console.log(\"initEvents()\")\n        });\n    }\n\n    /** Stop events */\n    stopEvents() {\n        console.log(\"stopEvents()\");\n\n        // Normally you would remove events and their event listeners here\n        // But it's best not remove `ready` as it's an App wide event\n    }\n\n    /** Basically removes a Service, in order to recover the Service, it needs to be re-added to the App class */\n    unregister() {\n        console.log(\"unregister()\");\n        this.uninstall();\n\n        // Remove everything, make sure there are no more reference to these objects\n        // in order to ensure everything works well\n        this.manager.remove(this.key);\n        this.key = null;\n        this.manager = null;\n        this.app = null;\n        this.config = null;\n        this.emitter = null;\n    }\n\n    /** Run before the Service has been unregistered */\n    uninstall() {\n        console.log(\"uninstall()\");\n    }\n\n    /**\n     * This method `can be` called by the ServiceManager but you can also call it when you wish\n     */\n    /** Stop Service */\n    stop() {\n        console.log(\"stop()\");\n\n        this.stopEvents();\n        this.unregister();\n    }\n}\n\napp\n    .add(new ExampleService())\n    // or\n    .set(\"ExampleService\", new ExampleService());\n\ntry {\n    console.log(app.get(\"ExampleService\")) //= ExampleService { ... }\n\n    app.on(\"resize\", () => {\n        console.log(\"App resizing\");\n    });\n\n    app.boot();\n} catch (e) {\n    console.warn(e)\n}\n```\n\n### PJAX\n\nIf you would like to use PJAX on your site you would probably want a setup like this,\n\nSetup your HTML pages with this,\n\n```html\n<head>\n    ...\n</head>\n<body>\n    <!-- put here content that will not change\n    between your pages, like <header> or <nav> -->\n\n    <main data-wrapper>\n        <!-- put here the content you wish to change\n        between your pages, like your main content <h1> or <p> -->\n\n        <!-- This will be prefetched on hover, and clicking on it will start the Fade transition -->\n        <a href=\"./about.html\" data-transition=\"fade\">About</a>\n\n        <!-- This won't be prefetched nor will PJAX run when clicked -->\n        <a href=\"./other.html\" data-prevent=\"self\">Other</a>\n\n        <!-- This will use the default replace transition, and will scroll to #image-5 -->\n        <a href=\"./other.html#image-5\">Last</a>\n    </main>\n\n    <!-- put here content that will not change\n    between your pages, like <footer> -->\n</body>\n```\n\nThen add this to your javascript,\n\n```ts\nimport {  App, PJAX, TransitionManager, HistoryManager, PageManager, Router } from \"@okikio/native\";\nimport { animate } from \"@okikio/animate\";\nconst app = new App();\n\n//= Fade Transition\nconst Fade = {\n    name: \"default\",\n\n    // Fade Out Old Page\n    out({ from }) {\n        let fromWrapper = from.wrapper;\n\n        return animate({\n            target: fromWrapper,\n            opacity: [1, 0],\n            duration: 500,\n        })\n    },\n\n    // Fade In New Page\n    async in({ to }) {\n        let toWrapper = to.wrapper;\n\n        await animate({\n            target: toWrapper,\n            opacity: [0, 1],\n            duration: 500\n        });\n    }\n};\n\napp\n    // Note only these 3 Services must be set under the names specified\n    .set(\"HistoryManager\", new HistoryManager())\n    .set(\"PageManager\", new PageManager())\n    .set(\"TransitionManager\", new TransitionManager([\n        [\"fade\", Fade],\n    ]))\n\n    // The names of these Services don't really matter\n    .set(\"Router\", new Router())\n    .add(new PJAX());\n\ntry {\n    // Router is a router, depending on the page path it will run certain tasks\n    // It support regexp and paths that path-to-regex supports\n    const router = app.get(\"Router\");\n    router.add({\n        path: \"./index?(.html)?\",\n        method() {\n            console.log(\"Run on Index page\");\n        }\n    })\n\n    // Note these events are emitted by the PJAX Service\n    app.on({\n        HOVER() {\n            console.log(\"Print a value on hover over link\")\n        },\n        CLICK() {\n            console.log(\"Print something when a link is clicked\")\n        },\n        NAVIGATION_START() {\n            console.log(\"Print before you start loading pages and prior to transitioning\")\n        },\n        // etc...\n    })\n\n    // While this event is emitted by the App\n    app.on(\"resize\", () => {\n        console.log(\"App resizing\");\n    });\n\n    app.boot();\n} catch (e) {\n    console.warn(e)\n}\n```\n\n### Wrapper\n\nThe `wrapper` is the element with the `data-wrapper` attribute; it's the part of the page that get's switched out with new content. There can only be one `wrapper` per page, if there are multiple `wrapper`s the first `wrapper` will count as the wrapper for the page.\n\n## Configuration\n\n`@okikio/native` comes with some default configuration but these can be changed, by default these are the configurations it comes with. You can also create your own custom configurations.\n\n```ts\nexport interface ICONFIG {\n    /**\n     * The Prefix attached to data attributes\n     */\n    prefix?: string;\n\n    /**\n     * The attribute used to identify wrappers\n     * @default `wrapper` as in `data-wrapper`\n    */\n    wrapperAttr?: string;\n\n    /**\n     * Headers to attach to fetch requests done by the PageManager\n     * e.g. if you only want to load a partial output containing only the wrapper\n     *\n     * @default `[]`\n     * @example\n     * ```ts\n     * headers: [\n     *      [\"partial-output\", \"true\"]\n     * ]\n     * ```\n     */\n    headers?: string[][];\n\n    /**\n     * Attribute used to identify anchors that don't want PJAX enabled\n     * @default `prevent=\"self\"` as in `data-prevent=\"self\"`\n     */\n    preventSelfAttr?: string;\n\n    /**\n     * Attribute used to identify elements that don't want PJAX enabled for themeselves and their child elements\n     * @default `prevent=\"all\"` as in `data-prevent=\"all\"`\n     */\n    preventAllAttr?: string;\n\n    /**\n     * Attribute used to identify transition an anchor wants to use, the value you set will select the transition used by name\n     * _**Note**: transition names are case sensitive_\n     * @default `transition` as in `data-transition`\n     */\n    transitionAttr?: string;\n\n    /**\n     * The amount of time in milliseconds to wait before counting the PageManagers fetch requests as timed out\n     * @default `2000`\n     */\n    timeout?: number;\n\n    /**\n     * The maximum amount of pages to have in the cache at any moment in time;\n     * PageManager removes pages from the cache to ensure content doesn't become stale;\n     * and memory usage isn't too high\n     * @default `5`\n     */\n    maxPages?: number;\n\n    /**\n     * The resize event is debounced by this amount of time (in miliseconds)\n     * @default `100`\n     */\n    resizeDelay?: number;\n\n    /**\n     * Ignore extra clicks of an anchor element if a transition has already started\n     * by default PJAX will reload the page on multiple clicks but this allows you to stop extra clicks\n     * from affecting the current transition\n     * @default `true`\n     */\n    onTransitionPreventClick?: boolean;\n\n    /**\n     * Specifies which urls to always fetch from the web\n     * It also accepts boolean values:\n     * - `true` means always fetch from the web for all urls\n     * - `false` means always try to fetch from the cache\n     * @default `false`\n     */\n    cacheIgnore?: boolean | IgnoreURLsList;\n\n    /**\n     * Specifies which urls to not prefetch\n     * It also accepts boolean values:\n     * - `true` means don't prefetch any anchor\n     * - `false` means always prefetch all anchors\n     * @default `false`\n     */\n    prefetchIgnore?: boolean | IgnoreURLsList;\n\n    /**\n     * Specifies which urls to not use PJAX for\n     * @default `[]`\n     */\n    preventURLs?: boolean | IgnoreURLsList;\n\n    /**\n     * On page change (excluding popstate events, and hashes) keep current scroll position\n     * @default `false`\n     */\n    stickyScroll?: boolean;\n\n    /**\n     * Force load a page if an error occurs\n     * @default `true`\n     */\n    forceOnError?: boolean;\n\n    /**\n     * Don't do anything if the url has a hash\n     * @default `false`\n     */\n    ignoreHashAction?: boolean;\n\n    /**\n     * TransitionManagers regestered transitions\n     * @default `[]`\n     */\n    transitions?: Array<[string, ITransition]>;\n    [key: string]: any;\n}\n```\n\n## Animations & extras\n\nBy default `@okikio/native` doesn't come bundled with [@okikio/animate](https://www.npmjs.com/package/@okikio/animate), [@okikio/emitter](https://www.npmjs.com/package/@okikio/emitter), and [@okikio/manager](https://www.npmjs.com/package/@okikio/manager). Theses packages are all part of the [native initiative](https://github.com/okikio/native), which aims to create smooth modern experiences that feel native to whatever and wherever you engage with a website or webapp. You will probably need to install `@okikio/animate` as a seperate package before you can have smooth transtions when using `@okikio/native`.\n\n```ts\nimport { App } from \"@okikio/native\";\nimport { animate } from \"@okikio/animate\";\n// ...\n```\n\n## API Documentation\n\nI highly suggest going through the [API documentation](https://okikio.github.io/native/api/modules/_okikio_native.html), for a more detailed documentation of the API's.\n\n### API\n\n`@okikio/native` has `5` base classes and `5` project classes, the base classes are:\n\n- `ManagerItem`\n- `AdvanncedManager`\n- `Service`\n- `ServiceManager`\n- `App`\n\nWhile the `5` project classes are:\n\n- `HistoryManager`\n- `TransitionManager`\n- `PageManager/Page`\n- `PJAX`\n- `Router`\n\nProject classes are optional and are based on the type of project you are creating, if they are not used, tree shaking using `rollup`, `webpack`, or `esbuild` should get rid of them.\n\nThe `5 base classes` are mandatory classes that are built into the framework (tree shaking won't be able to get rid of them).\n\n*Note: all classes that aren't base classes are `Service`'s, or they extend the `Service` class in some way.*\n\n### Types\n\nMany typescript types are used in the docs, for more info about these types go to [./@types](https://github.com/okikio/native/tree/beta/packages/native/@types).\n\n### Events\n\nIn total there are 25 events, they are:\n\n### PageManager events\n\n- \"REQUEST_ERROR\" - During a fetch request, if an error other than a timeout occurs\n- \"TIMEOUT_ERROR\" - A fetch request timeout error\n\ne.g.\n\n```ts\n// ...\napp.on(\"REQUEST_ERROR\" | \"TIMEOUT_ERROR\", (err: Error, url: string) => {\n    // ...\n})\n```\n\n### PJAX events\n\n- \"ANCHOR_HOVER\" / \"HOVER\" - When you hover over an anchor\n- \"ANCHOR_CLICK\" / \"CLICK\" - When a valid anchor element element is clicked and just before navigation starts\n- \"PREFETCH\" - When a prefetch is called with no errors\n\ne.g.\n\n```ts\n// ...\napp.on(\"ANCHOR_HOVER\" | \"HOVER\" | \"ANCHOR_CLICK\" | \"CLICK\" | \"PREFETCH\", (event: LinkEvent) => {\n    // ...\n})\n```\n\n- \"POPSTATE\" - When moving through page history, either forward or backward\n- \"POPSTATE_BACK\" - When going back in page history\n- \"POPSTATE_FORWARD\" - When going forward in page history\n- \"HISTORY_NEW_ITEM\" - When a valid link is clicked and new state is added to history\n- \"GO\" - If transition is not running and if current url is different from the new url.\n\ne.g.\n\n```ts\n// ...\napp.on(\"POPSTATE\" | \"POPSTATE_BACK\" | \"POPSTATE_FORWARD\" | \"HISTORY_NEW_ITEM\" | \"GO\", (event: StateEvent) => {\n    // ...\n})\n```\n\n- \"NAVIGATION_START\" - Before loading new page and building them\n- \"PAGE_LOADING\" - Fires when page starts loading\n- \"PAGE_LOAD_COMPLETE\" - Fires when page load is complete\n- \"NAVIGATION_END\" - After transitions, page load & build, etc... Fires to indicate the entire navigation process is complete\n\ne.g.\n\n```ts\n// ...\napp.on(\"NAVIGATION_START\", ({ oldHref, href, trigger, transitionName, scroll }: {\n    oldHref: string,\n    href: string,\n    trigger: TypeTrigger,\n    transitionName: string,\n    scroll: ICoords\n}) => {\n    // ...\n});\n\napp.on(\"PAGE_LOADING\", ({ href, oldHref, trigger, scroll }: {\n    oldHref: string,\n    href: string,\n    trigger: TypeTrigger,\n    scroll: ICoords\n}) => {\n    // ...\n});\n\napp.on(\"PAGE_LOAD_COMPLETE\", ({ newPage, oldPage, trigger, scroll }: {\n    newPage: IPage,\n    oldPage: IPage,\n    trigger: TypeTrigger,\n    scroll: ICoords\n}) => {\n    // ...\n});\n\napp.on(\"NAVIGATION_END\", ({ newPage, oldPage, trigger, transitionName, scroll }: {\n    newPage: IPage,\n    oldPage: IPage,\n    trigger: TypeTrigger,\n    transitionName: string,\n    scroll: ICoords\n}) => {\n    // ...\n});\n```\n\n### TransitionManager events\n\n- \"TRANSITION_START\" - Indicates the start of the transition process\n- \"BEFORE_TRANSITION_OUT\" - Before transitioning the old page out\n- \"AFTER_TRANSITION_OUT\" - After transitioning the old page out\n- \"CONTENT_INSERT\" - After the new page gets added to the DOM\n- \"CONTENT_REPLACED\" - After the new page has replaced the old page (the old page has been removed from the DOM)\n- \"BEFORE_TRANSITION_IN\" - Before transitioning the new page in\n- \"AFTER_TRANSITION_IN\" - After transitioning the new page in\n- \"TRANSITION_END\" -  Indicates the end of the transition process\n\ne.g.\n\n```ts\n// ...\napp.on(\"TRANSITION_START\" | \"TRANSITION_END\", ({ oldPage, newPage, trigger, scroll, ignoreHashAction }: {\n    newPage: IPage,\n    oldPage: IPage,\n    trigger: TypeTrigger,\n    transitionName: string,\n    ignoreHashAction: boolean,\n    scroll: ICoords\n}) => {\n    // ...\n});\n\napp.on(\"BEFORE_TRANSITION_OUT\" | \"AFTER_TRANSITION_OUT\" | \"CONTENT_INSERT\" | \"CONTENT_REPLACED\" | \"BEFORE_TRANSITION_IN\" | \"AFTER_TRANSITION_IN\", ({ newPage, oldPage, trigger, scroll, ignoreHashAction }: {\n    newPage: IPage,\n    oldPage: IPage,\n    trigger: TypeTrigger,\n    ignoreHashAction: boolean,\n    scroll: ICoords\n}) => {\n    // ...\n});\n```\n\n### App events\n\n- \"READY\" / \"ready\" - Fires when the DOM Content has fully loaded\n- \"SCROLL\" / \"scroll\" - Fires when the user scrolls (notes the scrolling is throttled to avoid lag and jank)\n- \"RESIZE\" / \"resize\" - Fires when the user resizes window (notes the resize is throttled and debouced to avoid lag and jank)\n\ne.g.\n\n```ts\n// ...\napp.on(\"READY\" | \"ready\" | \"SCROLL\" | \"scroll\" | \"RESIZE\" | \"resize\", () => {\n    // ...\n});\n```\n\n### **ManagerItem**\n\n`MangerItem` is a class that can only be stored in the `AdvancedManager` class, it is self aware of it's envrioment, so the `ManagerItem` is aware of the `AdvancedManager` it's stored in, and the `App` instance that the `AdvancedManager` is attached to. It can also access data from other `ManagerItem`'s via the `AdvancedManager` and `App`. Be very careful with `ManagerItem` as it references, so, many other classes that if you don't properly dispose of a reference you might create a mermory leak unknowingly.\n\n`ManagerItem` only gains self awareness after it has been registered with an `AdvancedManager` that has also been instantiated in an `App` (rather non-dynamic isn't it). I didn't use Promises or other dependency injection methods because it adds complexity and bulk in a way most project don't need. If your project requires such a dynamic and complex setup you should use WebWorkers and a custom dependency injection setup, but that is far out of the scope of this framework for now, unfortunately a custom solution will be require for each project. If in the future `@okikio/native` needs dependency injection I would be willing to build it in.\n\n*Note: when working with WebWorkers don't use more than one or 2 at a time, I have found that two is the maximum that lower end hardware can safely use with max performance.*\n\n#### MangerItem#manager: IAdvancedManager\n\n```typescript\nMangerItem.prototype.manager: IAdvancedManager;\n\n/**\n * The AdvancedManager the ManagerItem is attached to;\n * It only gains self awareness after it has been registered to a `AdvancedManager` that has also been instantiated in an `App`\n *\n * @type IAdvancedManager\n */\n```\n\n#### MangerItem#app: IApp\n\n```typescript\nMangerItem.prototype.app: IApp;\n\n/**\n * The App the ManagerItem is attached to\n *\n * @type IApp\n */\n```\n\n#### MangerItem#config: ICONFIG\n\n```typescript\nMangerItem.prototype.config: ICONFIG;\n\n/**\n * The Config of the App the ManagerItem is attached to\n *\n * @type ICONFIG\n */\n```\n\n#### MangerItem#emitter: EventEmitter\n\n```typescript\nMangerItem.prototype.emitter: EventEmitter;\n\n/**\n * The EventEmitter of the App the ManagerItem is attached to\n *\n * @type EventEmitter\n */\n```\n\n#### MangerItem#key: any\n\n```typescript\nMangerItem.prototype.key: any;\n\n/**\n * The key of ManagerItem when set in a AdvancedManager;\n *\n * @type any\n */\n```\n\n#### MangerItem#install(): any\n\n```typescript\nMangerItem.prototype.install(): any;\n\n/**\n * Runs after the ManagerItem has been registered. By default it does nothing, but if ManagerItem is extended it can be fairly useful for completing tasks right after it a ManagerItem is added to an AdvancedManager\n *\n * @returns any\n */\n```\n\n#### MangerItem#register(manager: IAdvancedManager, key: any): ManagerItem\n\n```typescript\nMangerItem.prototype.register(manager: IAdvancedManager, key: any): ManagerItem;\n\n/**\n * Registers the ManagerItem and makes it self aware\n *\n * @param {IAdvancedManager} manager\n * @param {any} key\n * @returns ManagerItem\n */\n```\n\n#### MangerItem#uninstall(): any\n\n```typescript\nMangerItem.prototype.uninstall(): any;\n\n/**\n * Runs before the ManagerItem has been unregistered. By default it does nothing, but if ManagerItem is extended it can be fairly useful, for disposing of references, etc...\n *\n * @returns any\n */\n```\n\n#### MangerItem#unregister(manager: IAdvancedManager, key: any): any\n\n```typescript\nMangerItem.prototype.unregister(): any;\n\n/**\n * Unregisters the ManagerItem, removes its self awareness, and removes the ManagerItem from the AdvancedManager. Use this onces you are done with a ManagerItem and want to dispose of it's access to other base classes\n *\n * @returns any\n */\n```\n\n#### Example\n\n```typescript\nimport { App, AdvancedManager, ManagerItem } from \"@okikio/native\";\n\nconst app = new App();\nconst manager = new AdvancedManager(app);\nconst item = new ManagerItem(); // Not yet self aware\nconst item2 = new ManagerItem(); // Not yet self aware\n\n// Now ManagerItem is self aware\nmanager.add(item);\nmanager.set(\"item2\", item2);\n\n// ManagerItem now has access to App, Config, Manager, Emitter, etc...\nconsole.log(item.app); // => App { ... }\nconsole.log(item.config); // => { ... }\nconsole.log(item.emitter); // => EventEmitter { ... }\nconsole.log(item.manager); // => AdvancedManager { ... }\nconsole.log(item.manager.get(\"item2\")); // => ManagerItem { ... }\nconsole.log(item2.key); // => \"item2\"\nconsole.log(item); // => ManagerItem { ... }\n\nitem2.unregister();\n\n// ManagerItem now has access to App, Config, Manager, Emitter, etc...\nconsole.log(item2.app); // => undefined\nconsole.log(item2.config); // =>undefined\nconsole.log(item2.emitter); // => undefined\nconsole.log(item2.manager); // => undefined\nconsole.log(item2); // => ManagerItem { ... }\n\n// Note: it unregisters the key, and removes the ManagerItem from the AdvancedManager\nconsole.log(item2.key); // => undefined\nconsole.log(item.manager.get(\"item2\")); // => undefined\n```\n\n*Note: `Service` extends `ManagerItem`, so, everything that holds for `ManagerItem` also holds for `Service`.*\n\n### **AdvanncedManager**\n\nThe `AdvancedManager` class is an extention of the `Manager` class (`AdvancedManager` extends `Manager`). `AdvancedManager` has the ability to share details about the `App` class it's attached to -- to the `ManagerItem`'s it stores.\n\nFor example, `AdvancedManager` can give access to the `App` classes `ServiceManager` to a `ManagerItem` from another `AdvancedManager`, allowing a `ManagerItem` to access `Service`'s running on the `App` inside `ServiceManager` (say that 5 time fast, 😂).\n\n#### Example\n\n```typescript\nimport { AdvancedManager, ManagerItem, Service } from \"@okikio/native\";\nconst app = new App();\nconst manager = new AdvancedManager(app);\nconst item = new ManagerItem(); // Not yet self aware\napp.test_manager = manager;\n\n// Now ManagerItem is self aware\nmanager.set(\"item\", item);\n\n// Not yet self aware; Service extends ManagerItem\nconst service = new Service();\napp.set(\"service\", service); // Now Service is self aware\n\nconsole.log(item.app.get(\"service\")); // => Service { ... }\nconsole.log(service.app.test_manager); // => AdvancedManager { ... }\n\nlet _item = service.app.test_manager.get(\"item\");\nconsole.log(_item); // => ManagerItem { ... }\nconsole.log(_item.key); // => \"item\"\nconsole.log(item.key); // => \"item\"\n```\n\n#### AdvancedManager#....Manager#\n\nAll the properties and methods of the `Manager` class, read [@okikio/manager's README](../manager/README.md) to learn more.\n\n#### AdvancedManager#app: IApp\n\n```typescript\nAdvancedManager.prototype.app: IApp;\n\n/**\n * The App the AdvancedManager is attached to\n *\n * @type IApp\n */\n```\n\n#### AdvancedManager#config: ICONFIG\n\n```typescript\nAdvancedManager.prototype.config: ICONFIG;\n\n/**\n * The Config of the App the AdvancedManager is attached to\n *\n * @type ICONFIG\n */\n```\n\n#### AdvancedManager#emitter: EventEmitter\n\n```typescript\nAdvancedManager.prototype.emitter: EventEmitter;\n\n/**\n * The EventEmitter of the App the AdvancedManager is attached to\n *\n * @type EventEmitter\n */\n```\n\n#### AdvancedManager#constructor(app: IApp): AdvancedManager<K, V extends ManagerItem>\n\n```typescript\nAdvancedManager.prototype.constructor(app: IApp): AdvancedManager<K, V extends ManagerItem>;\nnew AdvancedManager(app: IApp): AdvancedManager<K, V extends ManagerItem>;\n\n/**\n * @param {IApp} app - The instance of the App class, the Manager is instantiated in\n */\n```\n\n#### AdvancedManager#set(key: K, value: V): AdvancedManager<K, V extends ManagerItem>\n\n```typescript\nAdvancedManager.prototype.set(key: K, value: V): AdvancedManager<V extends ManagerItem>;\n\n/**\n * Set a value (V extends ManagerItem) in the Manager and register the ManagerItem\n *\n * @param  {K} key - The key where the ManagerItem will be stored\n * @param  {V extends ManagerItem} value - The ManagerItem to store\n * @returns AdvancedManager<K, V extends ManagerItem>\n */\n```\n\nThe example above should also work to explain how to use the `AdvancedManager` API's.\n\n*Note: `ServiceManager` extends `AdvancedManager`, so all the properties and methods present, will also work on `ServiceManager`.*\n\n### **Service**\n\n`Service` does everything, it is what enables, `PJAX`, `HistoryManager`, `Router`, `PageManager`, and `TransitionManager` to function, even though they are seperate from the `App` class.\n\n`Service` is an extention of `ManagerItem`, that adds extra life-cycle methods for controlling specific kinds of actions that require js.\n\nThe life-cycle methods of a `Service` are register(), install(), init(), boot(), initEvents(), stop(), stopEvents(), uninstall(), and unregister().\n\n#### *Life-cycle*\n\nHere is a diagram that may aid in your understanding.\n[![Life Cycle Diagram](https://raw.githubusercontent.com/okikio/native/beta/packages/native/assets/lifecycle.png)](https://github.com/okikio/native/tree/beta/packages/native/assets/lifecycle.png)\n\nThe life-cycle is controlled by the `ServiceManager`, the `Service`'s themselves have the life-cycle methods, but only the `ServiceManager` can decide when to call the life-cycle methods of all `Service`'s.\n\nThe `ServiceManager` recieves instruction from the `App` via a method call, to which the `ServiceManager` then initializes all `Service`'s via the `init()` method, and after all `Service`'s have been initialized the `ServiceManager` then boots all `Service`'s via the `boot()` method, the `boot()` method then initializes any events the `Service` may have via `initEvents()`, that's the life-cycle for starting a `Service`.\n\nTo stop the `Service`'s the `SeviceManager` calls the `stop()` method for all `Service`'s, which calls the `stopEvents()` and `unregister()` methods, completely reseting the `Service` to just before it was added to the `ServiceManager`.\n\n*Note: there also exists an `install()` & `register()` method (inherited from `ManagerItem`) that installs and makes a `Service` self aware on addition to the `ServiceManager`. The `stop()` method removes a `Service`'s self awareness, to make a `Service` self aware again, the Service has to be re-added to `ServiceManger`.*\n\n*Note: all classes that aren't base classes are `Service`'s, or they extend the `Service` class in some way.*\n\n#### Service#init(...args: any): any\n\n```typescript\nService.prototype.init(...args: any): any;\n\n/**\n * Called before the start of a Service, represents a constructor of sorts\n *\n * @param  {any} [...args]\n * @returns any\n */\n```\n\n#### Service#boot(...args: any): any\n\n```typescript\nService.prototype.boot(...args: any): any;\n\n/**\n * Called on start of Service.\n * Calls initEvents() method\n *\n * @param  {any} [...args]\n * @returns any\n */\n```\n\n#### Service#initEvents(): void\n\n```typescript\nService.prototype.initEvents(): void;\n\n/**\n * Initialize events\n */\n```\n\n#### Service#stopEvents(): void\n\n```typescript\nService.prototype.stopEvents(): void;\n\n/**\n * Stop events\n */\n```\n\n#### Service#stop(): void\n\n```typescript\nService.prototype.stop(): void;\n\n/**\n * Stop Service events, and unregister Service\n * Note: A Service can also dispose of itself earlier if need be, but it can only dispose of itself, it can't dispose of other Services without the ServiceManager\n */\n```\n\n#### Example\n\nTo create a new `Service` you have to extend the `Service` class, like, so,\n\n```typescript\nimport { Service, App } from \"@okikio/native\";\nimport { animate } from \"@okikio/animate\";\n\n// Imagine a DIV element with the class name of \".div\" exists in the DOM\n// This Service animates the motion of a moving DIV\nclass Move extends Service {\n    init() {\n        this.div = document.querySelector(\".div\");\n\n        console.log(this.manager); //= ServiceManager { ... }\n        console.log(this.div); //= DIV Element { ... }\n        console.log(this); // Service { ... }\n    }\n\n    initEvents() {\n        // On document load event\n        this.emitter.on(\"ready\", this.ready, this);\n    }\n\n    async ready() {\n        await animate({\n            target: this.div,\n            transform: [\"translateY(0)\", `translateY(20px)`],\n            onfinish(el) {\n                el.style.transform = `translateY(20px)`;\n            }\n        });\n\n        // Dispose of the Move Service once the animation is over\n        // A Service can also dispose of itself earlier if need be\n        // Remeber that the stop() method, also calls the stopEvents() method\n        this.stop();\n\n        console.log(this.manager); //= undefined\n        console.log(this.div); //= undefined\n        console.log(this); // Service { ... }\n    }\n\n    stopEvents() {\n        // Remove document load event listener\n        this.emitter.off(\"ready\", this.ready, this);\n    }\n\n    uninstall() {\n        this.div = undefined;\n    }\n}\n\nconst app = new App();\napp.add(new Move());\n\n // Indicates to the ServiceManager to start initialize and start the Service's\napp.boot();\n```\n\n### **ServiceManager**\n\nThe `ServiceManager` controls the life-cycle of all `Service`'s in an `App`. It extends the `AdvancedManager`, so it gains all the abilities, methods, and properties of the `AdvancedManager`, and extends them with some new methods namely `init()`, `boot()`, and `stop()`, they are basically glorified for loops that call the corresponding methods with the same name for all `Service`'s (since all `Services` have these methods).\n\n#### ServiceManager/#stop()/#boot()/#init(): ServiceManager\n\n```typescript\n// I didn't bother creating multiple different sections, since they are really simple\nService.prototype.stop(): ServiceManager;\nService.prototype.boot(): ServiceManager;\nService.prototype.init(): ServiceManager;\n\n/**\n * Stop, Boot, & Initialize all Services\n * Note: A Service can call the ServiceManager methods since it's self aware and has access to the ServiceManager, but best not to do that as it may create hard to find bugs\n */\n```\n\n### **App**\n\nThe `App` class starts the entire process, it controls all managers and services, nothing will and can happen without the `App` class (it's pretty important).\n\nThe `App` is where most/all of the configuration for a project will occur. To change the config for a `Service` use the same name for the property you are trying to change,\ne.g. If you are trying to change the `PageManager`'s max number of pages, use the property `maxPages: 6`.\n\n*On a side note: on `App` boot, the `App` starts listenining for the document DOMContentLoaded event, if it is emitted, the `App` \"READY\" and \"ready\" events are emitted as well.*\n\n#### App#config: ICONFIG\n\n```typescript\nApp.prototype.config: ICONFIG;\n\n/**\n * The current Configuration's for the App, acts like settings for the app. The Config is an object with some preset values set, for all self aware classes within an App to access. The default values for Config are:\n * {\n      wrapperAttr: \"wrapper\",\n      noAjaxLinkAttr: \"no-ajax-link\",\n      noPrefetchAttr: \"no-prefetch\",\n      headers: [\n          [\"x-partial\", \"true\"]\n      ],\n      preventSelfAttr: `prevent=\"self\"`,\n      preventAllAttr: `prevent=\"all\"`,\n      transitionAttr: \"transition\",\n      blockAttr: `block`,\n      timeout: 30000\n * }\n\n * To change the Config for another Service use the same name as the property you are trying to change,\n * e.g. If you are trying to change the PageMAnager's max number of pages, use the property `maxPages: 6`\n *\n * @type ICONFIG\n */\n```\n\n#### App#emitter: EventEmitter\n\n```typescript\nApp.prototype.emitter: EventEmitter;\n\n/**\n * An instance of the EventEmitter\n *\n * @type EventEmitter\n */\n```\n\n#### App#services: ServiceManager\n\n```typescript\nApp.prototype.services: ServiceManager;\n\n/**\n * An instance of the ServiceManager\n *\n * @type ServiceManager\n */\n```\n\n#### App#constructor(config: object = {}): App\n\n```typescript\nApp.prototype.constructor(config: object = {}): App;\nnew App(config: object = {}): App;\n\n/**\n * Registers the Config, as well as creates new instances of the ServiceManager, and the EventEmitter\n *\n * @param {object} [config = {}] - The configurations for the App\n */\n```\n\n#### App#register(config: ICONFIG = {}): App\n\n```typescript\nApp.prototype.register(config: ICONFIG = {}): App;\n\n/**\n * Creates new instances of the ServiceManager, EventEmitter and the configurations\n * Emit \"ready\" event on DOMContentLoaded and/or Window load\n *\n * @param {ICONFIG} [config = {}] - The configurations for the App\n * @return App\n */\n```\n\n#### App/#get(key: string): Service/#set(key: string, value: Service): App/#add(value: Service): App\n\n```typescript\n// Aliases to the ServiceManager methods of the same name\n// The act on the App's ServiceManager instance\nApp.prototype.get(key: string): Service;\nApp.prototype.set(key: string, value: Service): App;\nApp.prototype.add(value: Service): App;\n\n/**\n * Shortcuts to adding, setting, and getting Services\n *\n * @param  {string} key - The key where the Service will be stored\n * @param  {Service} value - The Service to store\n * @return {get(): Service / set(): App / add(): App}\n */\n```\n\n#### App#boot(): App\n\n```typescript\nApp.prototype.boot(): App;\n\n/**\n * Initialize and the boots all Services,\n * Warning: do NOT, and I repeat do NOT, call the boot() method multiple times, you will run into more bugs than there are in the Safari if you do\n *\n *\n * @return App\n */\n```\n\n#### App#stop(): App\n\n```typescript\nApp.prototype.stop(): App;\n\n/**\n * Stops all Services and clears the even emitter of all events and listeners\n *\n * @return App\n */\n```\n\n#### App#on/off(events: EventInput, callback?: ListenerCallback): App\n\n```typescript\nApp.prototype.on(events: EventInput, callback?: ListenerCallback): App;\nApp.prototype.off(events: EventInput, callback?: ListenerCallback): App;\n\n/**\n * Shortcuts to the App EventEmitter on and off methods, they create and remove events and event listeners, read more about @okikio/emitter in [../emitter/README.md](https://github.com/okikio/native/tree/beta/packages/emitter/README.md).\n * Note: the scope of the events are automatically set to the App\n *\n * @param  {EventInput} events - Takes event name, and supports all the different ways to represent events that @okikio/amitter offers\n * @param  {ListenerCallback} [callback?] - Event Listener\n * @return App\n */\n```\n\n#### App#emit(events: string | any[], ...args: any): App\n\n```typescript\nApp.prototype.emit(events: string | any[], ...args: any): App;\n\n/**\n * Shortcuts to the App EventEmitter emit method, emits (triggers) events and event listeners, read more about @okikio/emitter in [../emitter/README.md](https://github.com/okikio/native/tree/beta/packages/emitter/README.md)\n *\n * @param  {string | any[]} events - Takes event names, and supports all the different ways to represent events that @okikio/amitter offers\n * @param  {any} [...args] - Arguments to pass to the events\n * @return App\n */\n```\n\n#### Example\n\n```typescript\nimport { Service, App } from \"@okikio/native\";\nimport { animate } from \"@okikio/animate\";\n\nlet el = document.querySelector(\".div\");\n\n// Imagine a DIV element with the class name of \".div\" exists in the DOM\n// This Service animates the motion of a moving DIV\nclass Move extends Service {\n    init() {\n        this.div = el;\n    }\n\n    initEvents() {\n        // On document load event\n        this.emitter.on(\"ready\", this.ready, this);\n    }\n\n    async ready() {\n        await animate({\n            target: this.div,\n            transform: [\"translateY(0)\", `translateY(20px)`],\n            onfinish(el) {\n                el.style.transform = `translateY(20px)`;\n            }\n        });\n\n        // Fire all event listerners for \"move-animation-done\", with the argument \"this.div\"\n        this.emitter.emit(\"move-animation-done\", this.div);\n    }\n\n    uninstall() {\n        this.div = undefined;\n    }\n}\n\n// Imagine a DIV element with the class name of \".div\" exists in the DOM\n// This Service animates the opacity of the DIV\nclass Fade extends Service {\n    init() {\n        this.div = el;\n    }\n\n    initEvents() {\n        // On document \"move-animation-done\" event\n        this.emitter.on(\"move-animation-done\", this.run, this);\n    }\n\n    async run() {\n        await animate({\n            target: this.div,\n            opacity: [\"1\", `0.25`, `1`],\n            onfinish(el) {\n                el.style.opacity = `1`;\n            }\n        });\n\n        // Remeber the stop() method removes access to the EventEmitter, App, ServiceManager, etc...\n        let { emitter } = this;\n        this.stop();\n\n        // Fire \"app-stop\" event\n        emitter.emit(\"app-stop\");\n\n        // Be carefull here, it's possibile to have a memory leak if you don't dispose of emitter\n        emitter = undefined;\n    }\n\n    stopEvents() {\n        // Remove \"move-animation-done\" event listener\n        this.emitter.off(\"move-animation-done\", this.run, this);\n    }\n\n    uninstall() {\n        this.div = undefined;\n    }\n}\n\nconst app = new App();\napp.add(new Move());\napp.set(\"fade\", new Fade()); // Sets the Fade Service in ServiceManager under the key \"fade\"\n\nconsole.log(app.get(\"fade\")); //= Service { ... }\n\nlet listener = (div) => {\n    console.log(\"Move Animation is Done\", div); //= Move Animation is Done, DIV Element { ... }\n    app.off(\"move-animation-done\", listener); // Only run this listener for \"move-animation-done\" once, remove the listener after the first run\n};\n\n// Listen for the \"move-animation-done\" event\napp.on(\"move-animation-done\", listener);\n\n // Indicates to the ServiceManager to initialize and start Service's\napp.boot(); // Only call this once, it will cause bugs if you call it multiple times\n\nlet finish = () => {\n    // Stops and clears ServiceManager and EventEmitter\n    app.stop();\n\n    console.log(app.emitter.size); //= 0\n    console.log(app.services.size); //= 0\n    console.log(el); //= DIV Element { ... }\n    el = undefined; // Release reference\n};\n\n// This is different from the on() method of the App class, its has direct access to the EventEmitter\napp.emitter.on(\"app-stop\", finish);\n```\n\n---\n\nThese are the the `5` base classes as stated above, but there are also `5` project based classes, namely:\n\n- `HistoryManager`\n- `TransitionManager`\n- `PageManager/Page`\n- `PJAX`\n- `Router`\n\nThese classes are all `Services`, but they have very specific names, so when using them make sure to use the names specified above as their keys in `app.set(\"...\", ...)`.\n\nE.g.\n\n```typescript\n// ...\napp.set(\"TransitionManager\", new TransitionManager(/* ... */));\napp.set(\"HistoryManager\", new HistoryManager());\napp.set(\"PageManager\", new PageManager());\n\n// PJAX relies on HistoryManager, PageManager, and TransitionManager, so, to ensure that nothing breaks, all these classes need to be present with the name stated in the forms they've been stated\n\n// Note: PJAX doesn't need Router to function, Router adds extra functionality that is often needed but not crucial. Router is often used for highlighting navbar links to pages that have changed via PJAX, but a custom solution can also be made that is smaller and lighter, so, its not absolutely necessary\napp.set(\"PJAX\", new PJAX());\n// ...\n```\n\n### **HistoryManager**\n\n`HistoryManager` is a `Service` that keeps a record of the history of the `App`; it stores only the states of pages. A state represents the current status of a page, consisting of properties like: url, transition, and data. `HistoryManager` is an extention of the `Service` class.\n\n#### HistoryManager#states: IState[]\n\n```typescript\nHistoryManager.prototype.states: IState[];\n\n/**\n * An array of states\n *\n * @type IState[]\n */\n```\n\n#### HistoryManager#pointer: number\n\n```typescript\nHistoryManager.prototype.pointer: number;\n\n/**\n * Current position of a state in the states array\n *\n * @type number\n */\n```\n\n#### HistoryManager#init(): void\n\n```typescript\nHistoryManager.prototype.init(): void;\n\n/**\n * Initializes the states array, and replace the history pushState data with the states array\n */\n```\n\n#### HistoryManager#get(index: number): IState\n\n```typescript\nHistoryManager.prototype.get(index: number): IState;\n\n/**\n * Get a state based on it's index\n *\n * @param {number} index - Index of state\n * @return IState\n */\n```\n\n#### HistoryManager#add(value?: IState, historyAction: \"replace\" | \"push\" = \"push\"): HistoryManager\n\n```typescript\nHistoryManager.prototype.add(value?: IState, historyAction: \"replace\" | \"push\" = \"push\"): HistoryManager;\n\n/**\n * Add a state to HistoryManager and change the history pushState data based on the historyAction specified\n *\n * @param {IState} [value?] - State to add\n * @param {\"replace\" | \"push\"} [historyAction = \"push\"] - Which pushState method to use to update the page history\n * @return HistoryManager\n */\n```\n\n#### HistoryManager#remove(index?: number): HistoryManager\n\n```typescript\nHistoryManager.prototype.remove(index?: number): HistoryManager;\n\n/**\n * Remove state by the index, or by removing the last state in the states array and decrease the pointer by 1, if an index isn't specified\n *\n * @param {number} [index?] - Index of state to remove\n * @return HistoryManager\n */\n```\n\n#### HistoryManager#replace(newStates: IState[]): HistoryManager\n\n```typescript\nHistoryManager.prototype.replace(newStates: IState[]): HistoryManager;\n\n/**\n * Replaces the states array with another states array, this is later used when going back and forward in page history\n *\n * @param {IState[]} newStates - Array of states to replace with current array of states\n * @return HistoryManager\n */\n```\n\n#### HistoryManager#set(i: number, state: IState): IState\n\n```typescript\nHistoryManager.prototype.set(i: number, state: IState): IState;\n\n/**\n * Set state by index\n *\n * @param {number} i - Index to place state in states array\n * @param {IState} state - State to set\n * @return IState\n */\n```\n\n#### HistoryManager#current: IState\n\n```typescript\nHistoryManager.prototype.current: IState;\n\n/**\n * Get the current state by the pointer\n *\n * @type IState\n */\n```\n\n#### HistoryManager#last: IState\n\n```typescript\nHistoryManager.prototype.last: IState;\n\n/**\n * Get the last state (top of the history stack)\n *\n * @type IState\n */\n```\n\n#### HistoryManager#previous: IState | null\n\n```typescript\nHistoryManager.prototype.previous: IState | null;\n\n/**\n * Get the previous state or return null if there is not a previous number\n *\n * @type IState | null\n */\n```\n\n#### HistoryManager#length: number\n\n```typescript\nHistoryManager.prototype.length: number;\n\n/**\n * The length of the states array\n *\n * @type number\n */\n```\n\n#### #newCoords(x: number = window.scrollX, y: number = window.scrollY): ICoords\n\n```typescript\nnewCoords(x: number = window.scrollX, y: number = window.scrollY): ICoords;\n\n/**\n * A quick snapshot of a pages scroll coordinates\n *\n * @param {number} [x = window.scrollX] - Scroll coordinates in the x axis\n * @param {number} [y = window.scrollY] - Scroll coordinates in the y axis\n * @return ICoords\n */\n```\n\n#### #newState(state: IState): IState\n\n```typescript\nnewState(state: IState = {\n url: getHashedPath(newURL()),\n index: 0,\n transition: \"default\",\n data: {\n  scroll: newCoords(),\n  trigger: \"HistoryManager\"\n }\n}): IState;\n\n/**\n * Creates a new state; Remember a state represents the current status of the page consisting of properties like: url, transition, and data\n *\n * @param {IState} [state = {\n    url: getHashedPath(newURL()),\n    index: 0,\n    transition: \"default\",\n    data: {\n      scroll: newCoords(),\n      trigger: \"HistoryManager\"\n    }\n  }]\n * @return IState\n */\n```\n\n#### #changeState(action: \"push\" | \"replace\", state: IState, item: object): void\n\n```typescript\nchangeState(action: \"push\" | \"replace\", state: IState, item: object): void;\n\n/**\n * Either push or replace history state using pushState\n *\n * @param {\"push\" | \"replace\"} action - push or replace history state\n * @param {IState} state - new state\n * @param {object} item - an history item containing the current states array from the HistoryManager\n */\n```\n\n#### Example\n\nThe `HistoryManager` methods aren't really meant to be used, you are just supposed to create a new instance of the `HistoryManager` and attach it to the app.\n\n```typescript\n// ...\napp.set(\"HistoryManager\", new HistoryManager());\n// ...\n```\n\n*Note: the `HistoryManager` needs to be present in an `App` for the `PJAX` service to function.*\n\nThis example is the go() method for the `PJAX` service.\n\n```typescript\n// ...\ngo({\n    href,\n    trigger = \"HistoryManager\",\n    event,\n}) {\n    // If transition is already running and the go() method is called again, force load page\n    if (this.isTransitioning && this.onTransitionPreventClick ||\n\n        // The PJAX service will only work if the HistoryManager is set as a Service in the App's ServiceManager\n        !this.manager.has(\"TransitionManager\") ||\n        !this.manager.has(\"HistoryManager\") ||\n        !this.manager.has(\"PageManager\")) {\n        this.force(href);\n        return;\n    }\n\n    // Get HistoryManager Service if it exists\n    const history = this.manager.get(\"HistoryManager\") as IHistoryManager;\n    let scroll = { x: 0, y: 0 };\n    let currentState = history.current;\n    let currentURL = currentState.url;\n    if (equal(currentURL, href)) {\n        return;\n    }\n\n    let transitionName: string;\n    if (event && (event as PopStateEvent).state) {\n        this.emitter.emit(\"POPSTATE\", event);\n\n        // If popstate, get back/forward direction.\n        let { state }: { state: IHistoryItem } = event as PopStateEvent;\n        let { index } = state;\n        let currentIndex = currentState.index;\n        let difference = currentIndex - index;\n\n        // Get the current state from the history pointer\n        let _state = history.get(history.pointer);\n        transitionName = _state.transition;\n        scroll = _state.data.scroll;\n\n        // Replace the states array with a popstate event (forward or backward page) states array\n        history.replace(state.states);\n        history.pointer = index;\n\n        trigger = this.getDirection(difference);\n\n        // Based on the direction of the state change either remove or add a state\n        this.emitter.emit(trigger === \"back\" ? `POPSTATE_BACK` : `POPSTATE_FORWARD`, event);\n\n    } else {\n        // Add new state\n        transitionName = this.getTransitionName(trigger as HTMLAnchorElement) ||\n            \"default\";\n\n        scroll = newCoords();\n\n        let state = newState({\n            url: href,\n            transition: transitionName,\n            data: { scroll },\n        });\n\n        // Add the new state to the HistoryManager\n        history.add(state);\n        this.emitter.emit(\"HISTORY_NEW_ITEM\", event);\n    }\n\n    if (event) {\n        event.stopPropagation();\n        event.preventDefault();\n    }\n\n    this.emitter.emit(\"GO\", event);\n    return this.load({\n        oldHref: currentURL,\n        href,\n        trigger,\n        transitionName,\n        scroll,\n    });\n}\n// ...\n```\n\n---\n\n*Note: thus far I have given you a detailed overview of the API's that make up the base classes as well as the `HistoryManager` (as an example of a complex project based class), but from this point onward the difficulty will drastically increaase, but because the next classes are project based classes they will only need to be instantiated into an `App`'s `ServiceManager` using a specific name to be used, with little to no config required on you part. PS. this is getting really tiring to document, so, for the next classes I will skimp out on aspects I feel aren't useful for the type of projects you want or need, if you would like more detail just look through the code for the framework, as well as the [./build/ts folder](https://github.com/okikio/native/tree/beta/build/ts/). Also, **all classes that aren't base classes are `Service`'s, or they extend the `Service` class in some way.***\n\n---\n\n### **TransitionManager**\n\nAs the name implies it controls the transitions between pages (there can be many differing transition animations). By default the `TransitionManager` has a simple replace transition with no animation and that supports hashes. To understand the `TransitionManager` you have to first understand how to instantiate it. To instantiate the `TransitionManager`,\n\n```typescript\n// ...\n// If no parameters are present the TransitionManager will just use the default transition (the default transition can be overridden)\nconst transitionManager = new TransitionManager();\n\n// or\n\n// You can declare transitions as an Array of [key, value] arrays in the parameter (similar to Maps), if you set the key to \"default\", it will replace the default transition\n\n// A transition object\nconst Fade = {\n    name: \"default\", // This isn't nesscary but it can be nice when debugging transitions, you can use it to identify which transition is occuring\n    duration: 500,\n    manualScroll: true,\n\n    out({ from }: ITransitionData) {\n        let { duration } = this;\n        let fromWrapper = from.wrapper;\n        return animate({\n            target: fromWrapper,\n            opacity: [1, 0],\n            duration\n        }).on(\"finish\", function () {\n            this.stop();\n        });\n    },\n\n    in({ to, scroll }: ITransitionData) {\n        let { duration } = this;\n        let toWrapper = to.wrapper;\n\n        // Support for hashes are built in\n        window.scroll(scroll.x, scroll.y);\n        return animate({\n            target: toWrapper,\n            opacity: [0, 1],\n            duration\n        }).then(function () {\n            this.stop();\n        });\n    }\n};\n\nconst transitionManager = new TransitionManager([\n    [\"default\", Fade] // The new default transition is Fade\n    [\"fade\", Fade] // A Fade transition named \"fade\"\n]);\n// ...\n```\n\nThe `TransitionManager` accepts transitions from both the `App` config as well as the arguments it was instantiated with, but by default it will prefer the arguments it was instantiated with (do note the config property is `transitions: [....]`).\n\nFor example,\n\n```typescript\n// ...\n// You can declare transitions as an Array of [key, value] arrays in the parameter (similar to Maps), if you set the key to \"default\", it will replace the default transition\n\n// A transition object\nconst Fade = {\n    name: \"default\", // This isn't nesscary but it can be nice when debugging transitions, you can use it to identify which transition is occuring\n    duration: 500,\n    manualScroll: true,\n\n    out({ from }) {\n        let { duration } = this;\n        let fromWrapper = from.wrapper;\n        return animate({\n            target: fromWrapper,\n            opacity: [1, 0],\n            duration,\n            onfinish(el: { style: { opacity: string } }) {\n                el.style.opacity = \"0\";\n            }\n        }).on(\"finish\", function () {\n            this.stop();\n        });\n    },\n\n    in({ to, scroll }) {\n        let { duration } = this;\n        let toWrapper = to.wrapper;\n\n        // Support for hashes are built in\n        window.scroll(scroll.x, scroll.y);\n        return animate({\n            target: toWrapper,\n            opacity: [0, 1],\n            duration\n        }).then(function () {\n            this.stop();\n        });\n    }\n};\n\nconst transitionManager = new TransitionManager([\n    [\"default\", Fade] // The new default transition is Fade\n    [\"fade\", Fade] // A Fade transition named \"fade\"\n]);\n\nconst app = new App({\n    // The TransitionManager will completely ignore this, because it has been instantiated with transitions, and those are usually the one that is intended for use\n    transitions: [\n        [\"default\", {}]\n        [\"fade\", {}]\n    ]\n});\n\napp.set(\"TransitionManager\", TransitionManager);\n// ...\n```\n\nA transition is an object with some methods and properties pre-defined to control page transition animation.\n\nIt looks like this:\n\n```typescript\n// ...\nconst Fade = {\n    // This is required to let PJAX, know that this transition can also handle scrolling automatically, but if your transition doesn't need to handle scroll then it's not needed\n    manualScroll: true,\n\n    // Initialize some data that the transition may needs, it's not necessary. It is called before the transition in() or out() methods\n    /**\n        The init(data: object) methods have a data object paremter\n\n        data is an object with 4 properties\n        * newPage: Page - The new page you are transitioning to\n        * oldPage: Page - The old page you are transitioning from\n        * trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\" - The trigger for the transition, popstate, HistoryManager, or an anchor element.\n        * scroll: { x: number, y: number } - Stores the scroll position of the page required after transition (except the scroll doesn't take into account hashes)\n        *\n        * E.g.\n        * init(data: {\n            oldPage: Page,\n            newPage: Page,\n            trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\",\n            scroll: { x: number, y: number },\n        }) {}\n     */\n    init({ oldPage, newPage, trigger, scroll }) {\n        // ...\n        this.mainElement = document.getElementById('big-transition');\n        this.spinnerElement = this.mainElement.querySelector('.spinner');\n        this.horizontalElements = [...this.mainElement.querySelector('#big-transition-horizontal').querySelectorAll('div')];\n        this.maxLength = this.horizontalElements.length;\n        // ...\n    }\n\n    /**\n        The out(data: ITransitionData) & in(data: ITransitionData) methods have a ITransitionData parameter\n\n        ITransitionData is an object with 3 properties and 1 method\n        * to: Page - The Page you are transitioning to\n        * from: Page - The Page you are transitioning from\n        * trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\" - The trigger for the transition, popstate, HistoryManager, or an anchor element.\n        * scroll: { x: number, y: number } - Stores the scroll position of the page required after transition (so, if a hash is required or going back to previous pages scroll position, etc...),\n        * done(): void - The callback method that has to be called once the animation is done. It doesn't return anything\n    */\n\n    // The out() method dictates what to do when the old page transitions out\n    out({ from, to, scroll, trigger, done }) {\n        let fromWrapper = from.wrapper;\n\n        // done() indicates that the out() transition is done, it can now remove the old page and start the in() transition\n        done();\n    },\n\n    // The in() method dictates what to do when the new page transitions in\n\n    // hashes can only affect the in() scroll ITransitionData. The new page only gets added to the DOM after the out() transition, so to find the scroll position of the element the hash is supposed to represent can only happen in the in() method\n\n    // Try your best to only apply scroll to the in() method\n    in({ to, from, scroll, trigger, done }) {\n        let toWrapper = to.wrapper;\n\n        // Support for hashes are built in\n        window.scroll(scroll.x, scroll.y);\n\n        // done() indicates that the in() transition is done, it can now stop the transition\n        done();\n    }\n};\n\n// or\n// you can also do this\n\nconst Fade = {\n    // This is required to let PJAX, know that this transition can also handle scrolling automatically, but if your transition doesn't need to handle scroll then it's not needed\n    manualScroll: true,\n\n    // Initialize some data that the transition may needs, it's not necessary. It is called before the transition in() or out() methods\n    /**\n        The init(data: object) methods have a data object paremter\n\n        data is an object with 4 properties\n        * newPage: Page - The new page you are transitioning to\n        * oldPage: Page - The old page you are transitioning from\n        * trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\" - The trigger for the transition, popstate, HistoryManager, or an anchor element.\n        * scroll: { x: number, y: number } - Stores the scroll position of the page required after transition (except the scroll doesn't take into account hashes)\n        *\n        * E.g.\n        * init(data: {\n            oldPage: Page,\n            newPage: Page,\n            trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\",\n            scroll: { x: number, y: number },\n        }) {}\n     */\n    init({ oldPage, newPage, trigger, scroll }) {\n        // ...\n        this.mainElement = document.getElementById('big-transition');\n        this.spinnerElement = this.mainElement.querySelector('.spinner');\n        this.horizontalElements = [...this.mainElement.querySelector('#big-transition-horizontal').querySelectorAll('div')];\n        this.maxLength = this.horizontalElements.length;\n        // ...\n    }\n\n    /**\n        The out(data: ITransitionData) & in(data: ITransitionData) methods have a ITransitionData parameter\n\n        ITransitionData is an object with 3 properties and 1 method\n        * to: Page - The Page you are transitioning to\n        * from: Page - The Page you are transitioning from\n        * trigger: HTMLAnchorElement | \"HistoryManager\" | \"popstate\" | \"back\" | \"forward\" - The trigger for the transition, popstate, HistoryManager, or an anchor element.\n        * scroll: { x: number, y: number } - Stores the scroll position of the page required after transition (so, if a hash is required or going back to previous pages scroll position, etc...),\n        * done(): void - The callback method that has to be called once the animation is done. It doesn't return anything\n    */\n\n    // The out() method dictates what to do when the old page transitions out\n    out({ from, to, scroll, trigger, done }) {\n        return new Promise(resolve => {\n            // Once the promise has resolved, the transition moves on to the in() transition method\n            resolve();\n        });\n    },\n\n    // The in() method dictates what to do when the new page transitions in\n\n    // hashes can only affect the in() scroll ITransitionData. The new page only gets added to the DOM after the out() transition, so to find the scroll position of the element the hash is supposed to represent can only happen in the in() method\n\n    // Try your best to only apply scroll to the in() method\n    in({ to, from, scroll, trigger, done }) {\n        // Support for hashes are built in\n        window.scroll(scroll.x, scroll.y);\n\n        // Since `@okikio/animate` is promise-like, it will resolve the transition once the animation is done\n        return animate({\n            target: this.horizontalElements,\n            keyframes: [\n                { transform: \"scaleX(1)\" },\n                { transform: \"scaleX(0)\" },\n            ],\n            // @ts-ignore\n            delay(i) {\n                return delay * (i + 1);\n            },\n            onfinish(el) {\n                el.style.transform = `scaleX(0)`;\n            },\n            easing: \"out-cubic\",\n            duration: 500\n        });\n    }\n};\n// ...\n```\n\n### **PageManager/Page**\n\nThe `PageManager` acts as a `Page` cache, by default it stores `Page` object in an `AdvancedManager` instance, which is then stored in an internal property called `PageManager.prototype.pages: AdvancedManager<string, Page>`.\n\nThe `Page` class is a class meant to store a `Page`'s data. By default `Page`'s only store HTML documents as strings, but if the `Page.prototype.build()` method is called, the `Page` will build the page's DOM and set the url, data, title, head, body, dom, and wrapper properties of the `Page` class, using the [`DOMParser`](https://developer.mozilla.org/en-US/docs/Web/API/DOMParser), and when the `Page.prototype.uninstall()` method is called it resets the DOM for that `Page` including the url, data, title, head, body, dom, and wrapper properties of the `Page` class.\n\nThe `PageManager` handles the fetching of a `Page`'s HTML document data, and ensures that if it currently is already loaded in the cache, there aren't multiple reqests for it, it does this through `PageManager.prototype.load(_url: string | URL = newURL()): Promise<Page>`. The `load()` method returns a `Promise` which resolves to a `Page` class. The `PageManager` also has a maximum amount of `Page`'s it will accept, which is set to 5 by default (though this can be changed through the `App` config `maxPages` property).\n\n*Note: `Page`'s are self-aware since they extend `ManagerItem`.*\n\n### **PJAX**\n\nThe `PJAX` class is the key `Service` that creates the smooth, lightweight, and performant experience the `native` initiative aims for. Through the use of the `HistoryManager`, the `PageManager`, and the `TransitionManager`, the `PJAX` service creates an almost sureal and smooth transition between webpages that makes a website/webapp feel like a native application.\n\nPjax stands for [pushState + Ajax](https://github.com/defunkt/jquery-pjax), with pushState being the method used to manage a pages history, and Ajax being the method being used to request pages. Pjax is a form progressive enhancement which creates fluid and smooth transitions between your website's pages, it also reduce the delay between pages, and minimizes the browser HTTP requests.\n\nTo use the `PJAX` `Service` all the pages must follow a similar layout with the same js, and css. Above all every page must have a wrapper element, this is indicated by the `data-wrapper` attribute (the attribute can be changed in the `App` config using the property `wrapperAttr`).\n\nFor example:\n\n```html\n<body>\n    <!-- Content Before e.g. navbar, header, style, etc... -->\n    <div data-wrapper>\n        <!-- ... -->\n    </div>\n    <!-- Content After e.g. footer, copyright, script, etc... -->\n</body>\n```\n\n`PJAX` looks for the wrapper between pages and switches out the old page's wrapper with a new pages wrapper (it also changes the title as well).\n\n_**Note**: by default `PJAX` will prefetch pages based on the links it hovers over if they don't contain any `data-prevent` behavior (this setting can be changed via the `App`'s config using the property `prefetchIgnore`). When you hover over a link the \"ANCHOR_HOVER\" and \"HOVER\" events fire, but if a link is a valid prefetch, the \"PREFETCH\" event will fire._\n\nOnce `PJAX` has been started, it will listen for an anchor click (when an anchor is clicked, the `App` emits \"ANCHOR_CLICK\" and \"CLICK\" events), if the anchor is valid, `PJAX` will start the process of switching out the page wrappers (a link being valid means it doesn't link to an external site, it doesn't have a target=\"_blank\" attribute, it isn't a download link, the data-prevent attribute isn't set to \"self\", or \"all\", etc...) [the data-prevent=\"self\" and the data-prevent=\"all\" attributes are set by the `App`'s config using the property `preventSelfAttr` and `preventAllAttr`].\n\n_**Note**: the `TIMEOUT_ERROR` event fires if a page request times out or a general `REQUEST_ERROR` event fires if its some other form of error with the request._\n\nThe `preventSelf` attribute basically states don't allow `PJAX` to work with an anchor with this attribute, while the preventAll attribute basically states don't allow PJAX to work with all anchors underneat an element with this attribute.\n\nIf the url of the page to switch out is in the `preventURLs` array (an array of strings and RegExp's `PJAX` is supposed to ignore) [it can be set via the `App` config using the property `preventURLs`, `PJAX` will ignore it].\n\n_**Note**: `preventURLs`, `cacheIgnore`, and `prefetchIgnore` all support Array's of paths and regex's from [path-to-regexp](https://www.npmjs.com/package/path-to-regexp)_\n\nIf the `PJAX` property `onTransitionPreventClick` is set to true `PJAX` will disallow clicks when pages are transitioning (this can be set via the `App`'s config using the property `onTransitionPreventClick`).\n\nIn order for `PJAX` to continue, all the condition stated above must first be met, and if they're all met, then it will start the process of switching page wrappers.\n\nFirst, it will collect information like the transition to use, which comes from the data-transition attribute of the anchor (the transition attibute can be changed by the `App`'s config using the property `transitionAttr`), then `PJAX` captures the pages scroll positions, the new pages url, etc... and adds this to `HistoryManager` which also handles the pushState aspect of the history record. The `HistoryManager` then triggers the `HISTORY_NEW_ITEM` and `GO` events.\n\nSecondly, `PJAX` loads and builds the pages required (both the old and new page) using the `PageManager` (the \"NAVIGATION_START\" event is fired at around this point). While the pages are loading, the \"PAGE_LOADING\" event is fired. Once the page loading has finished the \"PAGE_LOAD_COMPLETE\" event is fired.\n\nLastly, `PJAX` loads the required transition from the `TransitionManager` and then starts it (the \"TRANSITION_START\" event is fired at around this point). If the `PJAX.prototype.stickyScroll` property is set to true (it can be changed by the `App`'s config with a property of the same name) the transitions will receive the scroll coords of the previous page and scroll to that point. If the `PJAX.prototype.ignoreHashAction` property is set to true (it can be changed by the `App`'s config with a property of the same name) `PJAX` will ignore hash scrolling.\n\n If the `PJAX.prototype.forceOnError` is true, as it sounds it will force a page switch via the browsers normal methods (it can be changed by the `App`'s config with a property of the same name). After all this the \"TRANSITION_END\" and \"NAVIGATION_END\" events are fired.\n\nDuring the transition this events will be called in this order:\n\n- \"BEFORE_TRANSITION_OUT\" - Before transitioning the old page out\n- \"AFTER_TRANSITION_OUT\" - After transitioning the old page out\n- \"CONTENT_INSERT\" - After the new page gets added to the DOM\n- \"CONTENT_REPLACED\" - After the new page has replace the old page (the old page has been removed from the DOM)\n- \"BEFORE_TRANSITION_IN\" - Before transitioning the new page in\n- \"AFTER_TRANSITION_IN\" - After transitioning the new page in\n\nWhen a user moves backward or forward in page history the window popstate event gets triggered. First, `PJAX` determines the direction backward or forward. Then it emits the \"POPSTATE\" event, depending on the direction a \"POPSTATE_BACK\" or a \"POPSTATE_FORWARD\" event gets fired. The `HistoryManager` then replaces the current state with either the previous or next pages state. Using a similar process to when a user clicks an anchor the rest of the process follows.\n\nTo use `PJAX` is just a simple create a new instance, ensure `HistoryManager`, `PageManager`, and `TransitionManager` are present and accounted for and everything is golden.\n\nFor example:\n\n```typescript\n// ...\napp\n    .set(\"HistoryManager\", new HistoryManager())\n    .set(\"PageManager\", new PageManager())\n    .set(\"TransitionManager\", new TransitionManager([\n        [\"default\", Fade],\n        [\"BigTransition\", BigTransition],\n        [\"Slide\", Slide],\n        [\"SlideLeft\", SlideLeft],\n        [\"SlideRight\", SlideRight]\n    ]))\n    .add(new PJAX());\n// ...\n```\n\n### **Router**\n\nThe `Router` service uses a list of objects called IRoute which complete certain actions when route paths match the current url, or when moving from one url to another.\n\nAlso, `Router` supports [path-to-regexp](https://www.npmjs.com/package/path-to-regexp), so, you can use all the express like url syntax's you are used to.\n\n_**Note**: at least either `to` or `from` must be present, in `to, from` path mode_\n\n```typescript\ninterface IRoute {\n    path: {\n        // At least either to or from must be present, in `to, from` path mode\n        to?: string | RegExp | Array<string | RegExp> | boolean,\n        from?: string | RegExp | Array<string | RegExp> | boolean\n    } | string | RegExp | Array<string | RegExp> | boolean,\n    method: (...args) => {}\n}\n```\n\nTo add a new IRoute,\n\n```typescript\n// ...\nconst router = new Router([\n    // You can the routes here as well\n    {\n        // When the path is /index.html/\n        path: \"index.html\",\n\n        /**\n         * from - The array from searching using the RegExp.exec on the from path\n         * to - The array from searching using the RegExp.exec on the to path\n         * path = { from, to } - The acctual paths\n        */\n        method({ from, to, path: { from, to } }) {\n            console.log(\"index.html\");\n        }\n    }\n]);\n\n// or\nrouter\n    .add({\n        // When moving from /index.html/ to /about.html/ run the  method\n        path: {\n            from: /index.html/,\n            to: /about.html/\n        },\n        method() {\n            console.log(\"Going to about.html from index.html\");\n        }\n    })\n\n    .add({\n        // Going to index.html, from every other page including index.html to index.html\n        path: \"index.html\",\n        method() {\n            console.log(\"Going to index.html from everything else\");\n        }\n    })\n\n    .add({\n        // Going to index.html, from every other page `including` index.html to index.html\n        // The same as the route above\n        path: {\n            from: true,\n            to: \"index.html\",\n        },\n        method() {\n            console.log(\"Going to index.html from everything else\");\n        }\n    })\n\n    .add({\n        // Going from index.html, to every other page `excluding` index.html to index.html\n        path: {\n            from: \"/index.html\",\n            to: false,\n        },\n        method() {\n            console.log(\"Going to everything else except index.html from index.html\");\n        }\n    })\n\n    .add({\n        // Going from every other page `excluding` index.html, to index.html\n        path: {\n            from: false,\n            to: \"/index.html\",\n        },\n        method() {\n            console.log(\"Going from everything else except index.html to index.html\");\n        }\n    });\n// ...\n```\n\n## Browser support\n\n`@okikio/native` is provided as a native ES6 module, which means you may need to transpile it depending on your browser support policy. The library works using `<script type=\"module\">` in\nthe following browsers (`@okikio/native` may support older browsers, but I haven't tested those browsers):\n\n- Chrome > 51\n- Edge > 14\n- Firefox > 54\n\nI recommend **only** using `@okikio/native` on browsers that support `ES6+`, the experience on older legacy browsers can be hit or miss, so, it's better to support `ES6+` browsers.\n\n## Polyfills & Bundling\n\nIf you install [@okikio/native](https://www.skypack.dev/view/@okikio/native) via [npm](https://www.npmjs.com/package/@okikio/native) you are most likely going to need [rollup](https://rollupjs.org/) or [esbuild](https://esbuild.github.io/).\n\nCurrently many websites rely on older code to make sure they reach as wide an audience as possible, hurting performance with large amounts of overhead.\n\nYou will need Promise, Object.values, Array.from, Array.prototype.includes, and fetch polyfills for older browsers.\n\nYou can use [polyfill.io](https://polyfill.io/), or another source to create a polyfill. The minimum feature requirement for a polyfill are Promise, and fetch e.g. <https://cdn.polyfill.io/v3/polyfill.min.js?features=default,es2015,es2018,Array.prototype.includes,Object.values,Promise,fetch>.\n\n## Contributing\n\nIf there is something I missed, a mistake, or a feature you would like added please create an issue or a pull request and I'll try to get to it.\n\n_**Note**: all contributions must be done on the `beta` branch._\n\n*The `native` initiative uses [Changesets](https://github.com/atlassian/changesets/blob/main/docs/intro-to-using-changesets.md#adding-changesets), for versioning and Changelog generation, you don't need to create one, but it would be amazing if you could.*\n\n## Licence\n\nSee the [LICENSE](./LICENSE) file for license rights and limitations (MIT).\n","readmeFilename":"README.md","_id":"@okikio/native@3.1.0","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-4gjVewxoN+q9wmZeTHshhq3ROSSdmVix+lw4evK3xp1yk/2VG9fukut0lanEN4oC3dMiF3s/UOhPRYOduWmwKw==","shasum":"65ddc6e5d2f3de226753867d4eb0e0f52aa13569","tarball":"https://registry.npmjs.org/@okikio/native/-/native-3.1.0.tgz","fileCount":18,"unpackedSize":229441,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhBHJvCRA9TVsSAnZWagAAE/gQAIr6jsmjYawPGpAidLgV\n7uOuANuGDn+WDI/RRIgpls3xEkIR6czUf4hNx+fFwYr8vHef8/7LUHtSDJc6\n6xbavth8+zX5Xca4BFpHeJ0CXMPnRDDgZC+KD/FDjvTiXHoXa6aJ6R5yD8L6\n2Eds8vSjKcXz4zfqGXFlh7X3cUQDktDjeEvIdZisvNBLsj8ObGrZ7F/AwVrX\n3RMTyhdsbTeHHbDZvAGQpJfylfLJytsg44Zj/Gz3fOcydNDaltu7XNDYC59Q\nA5GKkAdZKrpUr390c6gk2Ygh4PZzQ4hM5J8La6jqgJRgO/GjZSpZR7UuXCUa\nY2dOoqqro37GjaaCEyhMbuBapOQQI+PYTMEEU2zdeZAsR44PO4tPGAOxHq6j\nh3aDC59mNJU5TGRQdbk929fPQ7yvxLInKAISrhKkz1PkrTAhRCPvpN1VQrct\n/1We23/8PWcnVgk5b0/DjxPbL/JkrgZTL+usoIre6H+K5AxjW5r0PXuW9+1C\nR1IBZIQ5VziKMlY967OnpeLapaJHK5XRUdW4hAiToUfbG6vIAU7FsAV7+7ud\nfC4LslK/THDi4FJi9aGodrBKYD+QgO9yvsKDwVj/Vv2mjRb3hh5UXxWP6ip0\nptkYYyw7xiP7G5v/M/qesU1zMi7zUg3C2Vn+fCD4qtYAuS91iS+PRfdrtcKp\npmQP\r\n=Em88\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFRfpz/F6yye0z4LTROiTSaSydRTKV3yCSarfA0WFZxYAiEAtiw/Perjzndst7L7bC208+DDHu/rdfMhK/Uh4c7kJBQ="}]},"_npmUser":{"name":"okikio","email":"okikio.dev@gmail.com"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/native_3.1.0_1627681390858_0.209707351139653"},"_hasShrinkwrap":false}},"time":{"created":"2020-06-27T07:33:38.213Z","0.0.3":"2020-06-27T07:33:38.435Z","modified":"2022-04-06T10:57:08.523Z","0.0.4":"2020-06-29T03:34:29.391Z","0.0.5":"2020-06-29T04:13:26.484Z","0.0.6":"2020-06-29T04:27:08.384Z","0.0.7":"2020-07-02T08:01:44.974Z","1.0.0":"2020-12-26T23:35:28.102Z","1.0.1":"2020-12-26T23:45:30.586Z","1.0.2":"2020-12-27T00:00:50.009Z","1.0.3":"2020-12-28T21:55:03.675Z","1.1.0":"2020-12-28T22:27:29.368Z","1.1.1":"2020-12-29T05:49:44.063Z","1.1.2":"2020-12-29T06:23:41.466Z","1.2.0":"2020-12-30T10:26:05.055Z","1.3.0":"2021-01-04T01:29:23.622Z","2.0.0":"2021-01-13T07:19:19.294Z","2.0.1":"2021-01-14T20:59:04.513Z","2.0.2":"2021-01-14T21:29:23.674Z","2.0.3":"2021-01-23T06:56:50.559Z","2.0.4":"2021-01-23T07:29:32.575Z","2.1.2":"2021-05-25T03:17:37.884Z","2.1.5":"2021-05-25T04:20:19.798Z","2.1.6":"2021-05-26T18:30:58.806Z","2.1.7":"2021-05-28T06:37:02.760Z","2.1.8":"2021-05-30T07:03:45.064Z","3.0.0":"2021-06-30T06:44:25.081Z","3.0.1":"2021-06-30T07:01:12.773Z","3.1.0":"2021-07-30T21:43:11.027Z"},"maintainers":[{"name":"okikio","email":"okikio.dev@gmail.com"}],"description":"A framework who's goal is to make it easier to create complex, light-weight, and performant web applications using modern js apis.","homepage":"https://github.com/okikio/native/tree/master/packages/native#readme","keywords":["api","ts","native","modern","framework","web","pjax"],"repository":{"type":"git","url":"git+https://github.com/okikio/native.git"},"author":{"name":"Okiki Ojo","email":"hey@okikio.dev","url":"https://okikio.dev"},"bugs":{"url":"https://github.com/okikio/native/issues"},"license":"MIT","readme":"","readmeFilename":""}