{"_id":"abell-renderer","_rev":"66-4ece56a7096a9a6eec05ddeb62643319","name":"abell-renderer","dist-tags":{"latest":"0.4.2","next":"1.0.0-alpha.8"},"versions":{"0.0.1":{"name":"abell-renderer","version":"0.0.1","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"563be32d1be9bac629dc0b02e1b46e5b5c1f9d0b","_id":"abell-renderer@0.0.1","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-eJqji93/Il/EO590XaFZLyH7fqPCNuWK5+P+SqEoJrq1+nd5vxF+OeVBwRjYJ6Emx45xX9EK1x0dhvGnHyagvQ==","shasum":"5fff924b540357a24325388e6c5b564e19239cb2","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.0.1.tgz","fileCount":5,"unpackedSize":5478,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerHFKCRA9TVsSAnZWagAAa6IP/Ahp0r5fl2kjx4+Khh5h\nYbHZ4Bl4j/7JygzMa4YMJJMJNuhBTUXsVCOEqa9cdS3WdhKA2N1/KqkEKlfZ\nT2Oa+VPrmHYNvRHBDemtuN02Qep1+ZW7fEZDjE5dcTakSsk0RGl9FpktoXCM\nX+9NAZIw3UNg6rJp8gjat8FHY42bLiLtj84CTZlAOCkkvwyNpDHpEzxzw5FP\nhqO/1i+9MPCWpJXsUYLrQVpAMglulYuBpa2cfn2tU/MRmQTuG9b4Tp9ctdlJ\nvyavLPmVrqKceeeb3LbI7ORPWoM94BRicuuoA8u3hX35/fnib4nL/NH+WO1/\ndVdsA/U3Oqe4lPrQa2XI/o1Ov+iJeimUX9Oo/X5T+WJfsGX9sWor3WttClCs\nk92TrOMUnXprDMnZw33frlaEJp5OBOMD+RQIE6xy7p3nqtje0jII9X2vaGI9\nzTmg4L8hwugYHKJbiyPSVih0vs6u/eR68TBisvJNtDAqZ01JOmdn+WDQQ7v/\nw1Rxn8rlJbaAj+zi18Mw4DyHRCWGfJVKiLaq1O8AlwiGtVaSyXQzAxswYxMh\nJW3QCKOJK8oIoM7bpPpinkNgkMEP2TguMkouwLCUzWmMiXV5vWgltJLz0aYg\nw02q20IVBnT5MWNW5YLjUaNJinh/vDghhtr76tgnLK3hBxyoTB4NHoxUybqS\nnHJo\r\n=ujA3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYCmX5FYNsk0+WtjlfMp4MumkRigMCmq2FMpjKe8O78wIgeAKpgMTKP+Sji7eVUXDudBsJyaKlwWNqlTyIIbjqnQw="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.0.1_1588359497631_0.6139877237472462"},"_hasShrinkwrap":false},"0.0.2":{"name":"abell-renderer","version":"0.0.2","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","prepublishOnly":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"79dce893aab2c780d2b4bed9b7833848d4530fd9","_id":"abell-renderer@0.0.2","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-NiXgRN1UZlxyiDu1nap0lgKyBjKjS9eoiPdkuwkUHofA/GjrkgPe8HgWWHoqXZRXPAxoHreo/lxae3y2Qd32Vg==","shasum":"312f06225382c2e138dcdddeaf9da7e7d1675a28","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.0.2.tgz","fileCount":5,"unpackedSize":6187,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerQf7CRA9TVsSAnZWagAAeR4QAIeOWTn458vjX27+VQiP\nO27esO16WT5171Jpyz3fMyC++6W1gAKeoZyIe831PPGQRYarMw1abJdQF6aP\ndp5R64LFYRwlfyOu8cCJmlq36Aj2HmIv7dCX1OiZM00XCRx2UjRflhPDbZhM\nsvhT3TAT5cv2Xhc9/MDkbB/WMUkRnAv/Rev8B7jKv8aYLdvZrP+318u3SnjQ\nuvBRURd0CVAdrL107ir1lIx9USIAImWBgqOA9aQaXsG4RlNCOka5M0vJMDj0\n/0qDfD5jUe/AnzvzM7+/0IFq8x2n6hRretsDI/t0bM25fu4r734KVM3MY+8V\nCQQ007G7zaniGjWcoyZysnsRHdPbAAZvIS8Vjc9P0QBcvoruouWMiCId522B\n1XA9OVqWL7dXYw7Z2IZZO2Np79EsXhxFKcPxCOgSzWymM7qn1+f3JRy4aaSF\nV2ALmXK6XrEwpRSTL4d7TslvmZ19H61LLpZvLhVysP4v7YQcc5CsRxZJRS5+\no5qJVCyB3QKOujlW0fYWMDz7w8Xwhfz/st8zaGq1ZUd/YMxCHM1kPgojtMTM\n4XFwMOHKl/NztK4qp0pBG8Rw08xp6xamMJs16dbNbS/ql2afRq0HWYKZXXUt\nD+GmynbKmNx1ScgqA5f8ehIDp7vFyJzUnjyu5NC2DQL+dIcPcbWy+uRaUqD8\nLRmp\r\n=iKmS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHBVqClsC1Yz9QsZUJY07AnI+YLuaVatH8nxc41foVPwAiAJyNmRJppKM9HAMspN6EOudDkFVvB0SB971HtfXHZb5Q=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.0.2_1588398075241_0.8459491576647287"},"_hasShrinkwrap":false},"0.0.3":{"name":"abell-renderer","version":"0.0.3","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","prepublishOnly":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"e1fdfff0af2f014cf143248c1237a6e6df7e5a16","_id":"abell-renderer@0.0.3","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-J5PzqCLyE3yuhm26wm/Dkm6wJU8HyHEtpCGbcVFIwDtNEEpCfWXLe/PXabMKb78qXzYLEaqMj0niKIzJb2qt4w==","shasum":"0f754862b0d92c309d85c26676eae67bd42385f7","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.0.3.tgz","fileCount":6,"unpackedSize":6528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJer7+rCRA9TVsSAnZWagAA0Y0P/30VYQzz3fpP+iAzy5vc\n0AghJAA22uRa/mZRMrtmlPvpAjV2Pg1H8RIslgHIoj20WvS641R66vFOCb9d\nJDoFEPqqEzPDG5VjU/WO1+rr239j9as5S0rFnEyPxzP6IeGAvgOmMbx7VbUJ\nqy+dg9wFIkmXouKGsLDzhjf9cTaqA5puFmF9uN3hz9/q+AHxFPTZ+1F9eKAP\n2foSAUOsPcqSkVQAIZyLB5lAjwRU7390vf3bCcS2EWyLSce5s/2MM8xeaq5L\npSjPkXekG4WorSYadwHlSwgamfHDNmiP8X0cnU1hD219H74+PSnTD8boUf1T\nF72aCqG7dmjoLDTfrh02OibVo+6hrGRyvqFu9LEXGMYAujhEJUjs0Dib79C2\nnwHoUguh1DTIRrSMpidqYon8O4qXZXdlMvRQKd6ePcwXtWPn3DMTyR+8JI/s\n3WcRCf3TkNoJpXLyxLxq6/c87zke1ve1PzAZJWM7WCu2YJp1SJSAbpA1/pmn\n0lF6pyfo5+npd0nT96FJ5Ch7D0CSC/9yORG62Jk8XrCXti1IN/nGJYfpFoDD\nqqQpIy8VELWUuykE0cDgO0OteYavmeBDtXXXycyFHH930ELSHTq0eh1tIJhR\nF8vxtxNuu4ID4y4D/ge/iX0TjLJWuTxPRagmkbrtyJCMFyCYbQPzy9RZ78LX\nWYCJ\r\n=dQVa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHaKlHHOh8EVFoofRuKQW7dSvhmXdkVb+ZxXsW5gcwTjAiEAt1iHIwwPmOIvyQE+gG1L9VDkfccN4+1x+GOR9CCXPHg="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.0.3_1588576170778_0.5054195497875167"},"_hasShrinkwrap":false},"0.1.0-alpha.2":{"name":"abell-renderer","version":"0.1.0-alpha.2","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","prepublishOnly":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"readme":"# abell-renderer\n\n![GitHub package.json version](https://img.shields.io/github/package-json/v/abelljs/abell-renderer?style=for-the-badge)\n\n*NOT READY FOR PRODUCTION USE*\n\nA template parser that parses JavaScript written inside HTML on build time.\n\nOnly works in NodeJS Environment.\n\n## Installation\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n\n## Usage\nNot to be used in production yet.\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [\n    {name: 'Nice'},\n    {name: 'very cool'}\n  ],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo',\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n\n## Contributing\n\n### Local Setup\n- Fork the repository\n- `git clone https://github.com/<your-github-username>/abell-renderer`\n- `cd abell-renderer`\n- `npm run dev` to run example from `src/example/example.js`\n\n\n### Running Tests\n- `npm install` if you haven't already\n- `npm test`\n\n## Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)","readmeFilename":"README.md","gitHead":"55782361f065052cd4dceaef33d0443d93917437","_id":"abell-renderer@0.1.0-alpha.2","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-2+tfkGNofDAnhSw0ilR32knzb24+0GFCTF9qbfx+m7A17Y9Y187O9YxG0swwLYVZXFLSeMnCmZD0ikwFpduSPA==","shasum":"df50f56490ccff2a50485ca1a90ff43acc5e5c6a","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.0-alpha.2.tgz","fileCount":7,"unpackedSize":9316,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJes6tjCRA9TVsSAnZWagAAEg4P/0Ypb6aM/GcXUG+TwxJb\ncAUJJK73yu/PWQHGbUC9xP6M+oJK1FOlwBBiam1eFsh1ft4Pc4YuetO+u9Si\nnacJFxdVZbf9Zsy+HMKaeHv07Y3ndoy8zvHop8/3pSbN+DIiYsrgb/MQEmxD\n0dINkxkTeceQHxmke4sM4Y51L8kRagGb9qrtt4HiyOahhb8YHbssNnWBriP+\njZ9Ku2GDcny935948BwmjpvRZdWW7NPjyAlwObhIKwlJey3JD0sHP+19MC4p\nrtpuvmEptj1hWAsWjjs7N4XNZoBs8bpd7WF7bI+sPMcbrzx+2dh1rkbP1+rF\n1mQmDIsiJsf7YOv/tvMMPcDRX5BJH9SCgq/IMyA8jKPTFx+XbY+jqQ/V+FrW\nZgoWIPNgdodp+//K/m6hNPNLGjyOuLbDZYobQYAS6IgG3gjHh/QG+hTaxU/f\n4Dk+YSu2/R4g1m9luYaOy89eFmcWa1KtikvZRJ2HsvxAc9K3hzR8CZ0+i5MK\no2C7G9qyq3uNkaHneH3Y1wYRJk8laClGhFbCKAxKB7Aq+CJPrt7ZWSpwCIP1\n8tSCGun3e+IOl2fgGyArOQlfkQDH97cr7McJjbO+3yrfsxlGKS323ZY6RVk6\nkyh22j6Gp7zDr6Qx4N/6rNoNez4Q7iHRfPfZQqZzl0zmYpqgIWPvHFAFwR2S\nLtTk\r\n=nxg8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCLj66DzViOk+eF3Ol4MkebAWwzoZaovsZhiJz8Dk9GvAIhALQJ7Ny6Q4/1gr6QC4ET2sMgXYT9dqNtlOr9koaIsVZ5"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.0-alpha.2_1588833122681_0.5275012637107535"},"_hasShrinkwrap":false},"0.1.0-beta.1":{"name":"abell-renderer","version":"0.1.0-beta.1","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","prepublishOnly":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"readme":"# abell-renderer\n\n![GitHub package.json version](https://img.shields.io/github/package-json/v/abelljs/abell-renderer?style=for-the-badge)\n\n*NOT READY FOR PRODUCTION USE*\n\nA template parser that parses JavaScript written inside HTML on build time.\n\nOnly works in NodeJS Environment.\n\n## Installation\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n\n## Usage\nNot to be used in production yet.\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [\n    {name: 'Nice'},\n    {name: 'very cool'}\n  ],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo',\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n\n## Contributing\n\n### Local Setup\n- Fork the repository\n- `git clone https://github.com/<your-github-username>/abell-renderer`\n- `cd abell-renderer`\n- `npm run dev` to run example from `src/example/example.js`\n\n\n### Running Tests\n- `npm install` if you haven't already\n- `npm test`\n\n## Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)","readmeFilename":"README.md","gitHead":"55782361f065052cd4dceaef33d0443d93917437","_id":"abell-renderer@0.1.0-beta.1","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-8FAs5W9wMJBXvx1m8kAxNt8HBeCyBWoRy7rCq7lLWF6g81jPT49B/T0yBmPNwOokYN5GWPzBcaopvx7NoL4nQA==","shasum":"6220ea0736e75eacbb86ed75b8b275924bffeeda","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.0-beta.1.tgz","fileCount":8,"unpackedSize":10316,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJes8GMCRA9TVsSAnZWagAAZoIP+wW/tBDXgyBdLac1uZQQ\ndbSYxchcJCudoswlOSIk/DcUJLkMbAjS7E/2cwTNCDaC1Zx7PXmQDLx9two4\nTxdoJ7QvuBUThXIvUkyJPsHhN7kJ3uWToCU0HqAKPYAngY8PRVn2s7by31SM\nmrpbVphr6lIgkj7RPTssCEnt7lzocz1wWK1L0zCUMPGM6Mnxvt2WXTv5qozr\nfdULbBlVF1NeTkLwuY1dtFvnIE6pjzrg7JZOLELtN3q29T7l5tYNqIMeJ7dw\nnvWNwbz4Jb0s6oXj3IazPmQN0713Vy5jIutkhwqpy0BFXAxVoB7bQtEupdL0\nfEkkd7tDjR61dV81VLVuLqwN+xQLPbqwcoVZATwe2HKwstv27aEw5TG4Wgge\n1QfUnk2lwVNSbJvxCiI/Fv9Mf2E8uIuRq8Xr1wxHJnICVHixazG8eMkrmilx\nslpO9Xx8x8IEivUEY9e1uZITN/7zynBUPPLWuN7MeB4phv1547DIDpb4hDq8\nUiXN1VyjYnXFgbCnT7u+N+YtNpWxZqOv5rJdVgf0W65OGcFg94uWmjbEaRr7\nQkiJBCHEHtEDsbi3BHlitNpSOsP+9eA1Ksdoi7T2GdVnK7zaShLzURTR4K89\n6lW//MzYEKTuVaX0bq0Kw3ahX5E8ehgTSIbiMJjwjWVli+WA0QlFhgRdbG4w\nVzoN\r\n=S40k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQUppqvD9cSFEngVzKy18H/L+zS2DAtV++BGvzliOplQIhAN+LAedcMP5onqIAkKvMKPaEvXVlxS97v3DS6maRh/Yz"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.0-beta.1_1588838796313_0.1861218325855365"},"_hasShrinkwrap":false},"0.1.0":{"name":"abell-renderer","version":"0.1.0","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","cli":"npm run dev:cli","prepublishOnly":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"d4ef2079ac3b983b5298b7d4a8e6fd4cddd322c3","_id":"abell-renderer@0.1.0","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-kt2kPvbM7bDi8QxHc3I+nihq69rA7birAlteUhOmtvbr/UUltIxZmP8YzF+I5PSilY9BJoe0iHDGZ5kXBJg2nA==","shasum":"d2db80ed8bf78cec2d5c437edba0cd8262354c5c","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.0.tgz","fileCount":9,"unpackedSize":11342,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJes83sCRA9TVsSAnZWagAA7p4P/j6IIpgEJ3YrQaqRt/fz\n79XZ9KHWhjPI+FTmXlcjOLhgioeiGgFCHBT8DI8VjA3zx9PT18O4A8H2B7Mg\nDjH//xzVJC+CVFJOT21mF8ib5i8fDURFJC9n1lL7Z3dCR/SXbl0rc3eMSS+B\nYeR055oBVVoV8e2dR3bLwmrAzrSuRjU9wQ4qnbKGb24+AfHuG9Pe/40OnUU5\nX4dQGhOSxLRs3Mifymwj15jeTz1icnaejOiyws/oU5oMTKXbyT93jBmtFzgT\nkePVAACVOWFUvZPvBKpf++vUTCnITQ6nmbE6nRtTr5F1Xj+4KadDoaaHSt0I\nt1Vo19ZHz8m2llE4AWJSrTGgxDoHbH34nAbeR0dk6Ip4NzW4Es1R4FitlPHr\ndZbnZ5lQ1vlL1x7cNify6b6wYbU0N3SZoeqfbHtu9k1Xn0+GuOgCpPh/RfBL\ndDqSW2gmsd9DbFL2ZgEb/1NTWkR3T4nb4vs7dJuOtojqJZazLYlVqTZH5THi\nUXnq3czItOiV6eRt5b6Fh1idJKvuEJMpkUUWcYQA8JJyBZm1quACQt9VBKur\nL1FYm3xiO4oY/1/90vo7qYkhozfcUUgakGjBMhSrGwtBQZwFJBTtYropPwI5\n0+TfaFsLZMIkullevGbsnC0IQ/FAbezU3LPVSBkP208Ne3XQuYO1ipcxfULB\nSh+0\r\n=RCZK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDAiFo5gyUjfJs4OJSw/I6qksr7K6y+y2ksiZr+/vRDgAiEA6VYNyav3nfULPmJDNrDsZIyh1z9753kTpEnfAfmwmm4="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.0_1588841963756_0.25744978175637434"},"_hasShrinkwrap":false},"0.1.1":{"name":"abell-renderer","version":"0.1.1","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","cli":"npm run dev:cli","prepublishOnly":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"95a77aaa3da704fddff520332cf76907eb5c5992","_id":"abell-renderer@0.1.1","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-JtsO8wD7v0cMsjXrOKNHXPA+V9l0rEnuOYAggxtmgsN/+fnuNe9eEEfXuAUatsMkTC0zydcoDsxfw3nXVGgj3Q==","shasum":"f66b67dee4b27cb71e033ebea7f232e783c91816","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.1.tgz","fileCount":9,"unpackedSize":11430,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJes9faCRA9TVsSAnZWagAA99MP/1w0p3RfR7sfXATWl16h\niL7228iMwIxTQx4RAZoQmwENhSADPTVOHilfx98Oz3U88M7WeVyDADlTsg5S\n+rvq8cvmPKDNSc2NOoNfHtZvomW2Jck+4bMJ03bKw/rWFRy+Uz7wkKsVEycS\nbJFMYt/IDBsFO4aTfWI90Ky5mfBGHWKhKTE6UawAf1qYuQf330BYlCphkR3I\nJmns5sSY/9TI05pB08XCsmxd4Uvn4Eroqd5I2V8vRNZGnO//F2N7faW3FWBp\nsiXKnnU/w08SNevfmliCoqcXUoQls/sg+KE0yiwm9YNg5IsZ830UGDn8HpOl\nVmHiz+ZSiSV20WiByZAgM/HCahnMvnd/Cr4PCoDL+KyQlKC8HuJCPYT8JE8Z\nxkTtG+48YTgxFMqPPl9D3DIyQGqB87LLEYLZR3mPCR6IaNIYvj1XbJDMYg5q\nJiLSaAjEiePOEB81cB3vQGUyaLvHySPuihYxNViSU5bJjn7vVErsWto61lFv\nNPb/BghGN4emyoXqdq6wDjvTpHEMHC/qw4poozEOsWaIcNLrWpAM125swR8t\nTSERJR3DmWcYBBBCghvOIbJSQ6kvxYhTqsLyZqcVkBZqIgrJWa83bklfnDw+\nRQj6zybxI65n7uPQR9Ht10p2Qgys22XlnBzK3Q/dGhqGE9ZjWH4Yj2Qt7k1f\n+G7n\r\n=7Jrd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDcUYHf4pUtgvGmihZKu4AsAhyoGoPrStFs9G8RvM1PQIhAIBb8egyPNq+RR4J8vr+KUG31Ezv28Axryn14pzz42Yv"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.1_1588844506081_0.11672696540785577"},"_hasShrinkwrap":false},"0.1.2":{"name":"abell-renderer","version":"0.1.2","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","cli":"npm run dev:cli","prepublishOnly":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"e2d77ec61d6163fe4b1771d1df16867839b115f2","_id":"abell-renderer@0.1.2","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-phYT4J1hnpsG2AX56fsTx7YxcPFRziP6UogDKLHSQkA9QuzJWJfHcJB0FUiO8a93kpJ2L+YnoDGuE0xWt3f/Ow==","shasum":"1f7e71a8eae72c91c1195344fca26bca68905fac","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.2.tgz","fileCount":9,"unpackedSize":15313,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetCjICRA9TVsSAnZWagAAqEQP/jTnXXhhbDZBNUMYDNkf\nvriRitDXOCP4iFGX4Sgaql87xeu9yGpjMr0WyfwANLDeUKXU5Pe7SmoNX+oE\nrcBigx/8+rwV4D8CQ7j+h/chexwAydD+6G05U5AJeMmpbgu2sgTJwLyuFwjk\nang1jeOPIbg5ToiMcYgH/iLCwzQb4hthZ7OllhUXEmtp591buPl6gONJd/yc\neOldDMUSwvaj7yjt/eMtyw2ofXYtck3Nf/ATyjgMGT63/QGmNCDDuz8821ct\nPEG3XjfhIm6TVHgMDYUPrrpwdcKylkZGQE8uVSFX5fuvV8e60WjjOv5PIVND\nrliHONRddVGa7Cy9mcp46QO2EbuTANq30+0Y0MxvcOlxy2eBf0Mewr5RMNlY\nn1GcwXS6wGegRyaqQ6SQQ92WKRsP02CMZx+VUfItQXelkvw6kJ5tUdVoOyYH\nj4i9/UMZFK/eqpv264SfudeLd0r9UkQQWQVazvv/ZTeowibNqROoDJVTX3x0\n+0OdMsznnXOcOWOqZPKeCtmNAnNinCQTdRcMq+qejgONRKZ7cGFuFdMBFlAj\nJfCWKIKbZ3TmE5YUOgrcygG5x3Vgu30pe73C1j35Ye+XTUtNVmMIhmZf3oiF\n1Ctct+hvWrr3O1LJofuU6LRb3zjMt2ttqkxSgRN33sjjUTH5ve8GasuC9F9E\nUpPm\r\n=0wmM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSdW9C6JfW4MHeR+9YtRTx493PutXLK5IY/1CnPzl9GQIhAJjrsKKsV1B6tIj+gXCzF/eJzSJpgsrva4hzJ59QNmtN"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.2_1588865224092_0.5494957609497106"},"_hasShrinkwrap":false},"0.1.3":{"name":"abell-renderer","version":"0.1.3","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","cli":"npm run dev:cli","prepublishOnly":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"70882c55a03a32a4ffb54e6846fafcafbae4c3e6","_id":"abell-renderer@0.1.3","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-qvv/pI/U/LdAUbjMdSKXceYalcYFUORYuacbAlOwPLJ7NlOIcASbxyKX536TOiTJArmwNRxCSnxMzf29EKjv/Q==","shasum":"ef9c761b46e107a992a7afa312e537feb810364e","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.3.tgz","fileCount":9,"unpackedSize":17666,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetYC4CRA9TVsSAnZWagAAswkP/0qs+k3u5XiIkA4AFi84\nnad9zq/oN7yCMyqtWonsdAnoguYVWAvaHUr2UtETnnVbfI2BqizKk2Uc98T5\nPW5ekC7UViwLpLFXeBLsTjtUjBrk+x0q2vBLLI05tXxo1M7oYB6a/nNfNzA/\nTSl9EJVp1c0sYx8uvxBnzT44lQtvG3VO5wj31XsI2Gg3IDNLQizF0XHELT2N\nEPEZaHItkh4vgFIWXi56og5L9WcT0bzf8YUtQ4R7RWiutz6KXuytAHc5dlBO\nqTPz60PdjesBZ2UBs9jpz/1ToReWa4qizw2h+ig/HyJsWb7eAXsMShWb7d6z\nfgWEyn1WxYA8xYknYzv2Q1tgdQVVcIK4E+z9cBBatXA8SmkcT0lU8pualXcY\nFisDQygmNcqoL2dhCTuod7hby8Z2yWxDD+PiiBYHWsNsiijmtNg+3cWLZsZx\nGCTvOWWvg6jvQMxD4/e1iLvUZu0Pd52WbyQ4Sjkja9sKD61fLb7QBvK/Z8mQ\nR111Lhu11HLw89vupK/pPYPDnyWqIXv/cMZXvdWkx2UnzNYOMUCTwcwANVvG\nyK2mtQpr+pWVBoNnQ/LjYHZOCnXFNwr6nUmvHmjyX93HcRZJmkFX3nxWsmWL\nnw8qIE5mnxYjxHVeCSvEjj1DRkUE1KGByetHPMaX2PPWa6AD3l5ai7D0MaRx\nPF8l\r\n=ozxY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGPDxZI8ZYHoryqQwmlEntM2jGPBd2gbKGPaFowAI7f+AiEA3UCsfY/76NKGjr3PJDS2fe3h1QKM2wlpUtUkX5dGcRs="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.3_1588953272462_0.4838648026849186"},"_hasShrinkwrap":false},"0.1.4":{"name":"abell-renderer","version":"0.1.4","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","cli":"npm run dev:cli","eslint":"eslint .","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"a2d4bc751243af391305e25d6f9d0903ec12241a","_id":"abell-renderer@0.1.4","_nodeVersion":"10.16.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-ogvzQSmvTw7BEjEFh7yFtGXuPUVttXx2u9IJ+L9aBswNFtS7HToo//TtVOa/PiykFKNWuwv+ldYVTAKZ37/3Ug==","shasum":"13dd3d6d3e58f33e35dc76eb37dd665004eac34a","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.4.tgz","fileCount":7,"unpackedSize":16787,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeuRkFCRA9TVsSAnZWagAA0PsP/jMdqFX7gx68EfDDZ8pB\nYOe9v+BnwOZBHmY6HdVcqKIPMzKxZbxFapLCG4LKbjmzaEUx2kInURqGYO/F\nTeuT1bPBftGXdbN1Av4r+sX9rqKQzgZZ0UX0cBG5UgmIyI2LWu2cHFBGUm5l\nRYDgmkSs59HKIbdCPapGul3SDSXDPf+bzuCWVdwHiLVkzoWaEgSEaHXx0wCY\nvtfMfc9+I2/KriTKaxJVDAllE8GVVjr9IEzG3EQ0K+1Rr1AsSvQMjChblir/\nC73Y17PiFOQOFzkvXsKkY97A+AcY0btduTs1vA1XFiwBE5j1RxcsEBvqr5sB\nvw1kXXw54i3xxidY9GDJy2fPzzHz7SsX/BNfwC/FttZxiuoT44YQPAt/vqcB\n/TglJ0XzqKmTKbfsBtcvVOurD5b39Trgnv7N8O+2u5oBmJweIEVw6pobUMdk\nvj2Fo/w49BQ3jm2ckElF3+z0QtRwwz7SRzC4gwM7bz6DQNcnoh+V3R5sOE4X\n48G4peVB5a5Plui9RCNMHLgI7VqYjcbgJExXlRXrd0Lldb9pt5g+yPC/Lr2L\nFsERQyeNgAyF80o/AONZUw8MjRU/QT6aqk89qpE6VxRrHHWOMwqZTMU2vjKS\nCBaE1/fsr7Gtpkmxib5cxh9m3AC0UwGDZcW1Y8wt5YXCaPOGao0DKgOaQ7ze\nPTKD\r\n=nU92\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDN5SJ99PJb1b6BQpEHqkrc+94u330BUeChhz0iaB3sLAiEAmXODfd2+LN7HUc/bQ+nFHXmTswKTXDvcge+xmGm4PrQ="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.4_1589188868250_0.20156632699306232"},"_hasShrinkwrap":false},"0.1.5":{"name":"abell-renderer","version":"0.1.5","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","cli":"npm run dev:cli","eslint":"eslint .","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"fc058ed31a02808148e5839cc661c80b4452c6cf","_id":"abell-renderer@0.1.5","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-McxAivmR/tbJtmMIgcShATt/oGS8drlnHMwIwcaZIiVnecMxWSfLv+e2HfGcT7my3hg4JXCHKVDfd8hPs41Suw==","shasum":"508e3b20224b4b895d61549f926df2cbbd08b662","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.5.tgz","fileCount":7,"unpackedSize":18187,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJevVnsCRA9TVsSAnZWagAAugYQAJ79AG8wKMzU78Cybd64\nQnwV+R+sbGUSRp/KfFaQCmMoQEdLG5osv2cfan4+TlwmDdVHEhmG/78/OZp0\n9pStsvN5c/v0+OO76bou7jYlZ5yEZTRqz18NJvIXrvOPogBGADy2AAysmNqA\n97wUU0lI1QQGXsnxL4Hm3Lzv3951qTLtgth98PPa1fX3er0BQfmDSVjmPH4S\n7d3lL+T1tp6HzxfCe83Pw1OiOSRpr5e1omH/r2/QQXA2R0j2oECa8Y+090xD\nYFUWUYCCQzNEAgJIvTnqz9xnWb0/wW+lEWz/O4W8jcXPT+QYQ/rZdFUO3WKy\nwNzuQClyT0W1UKgDLI1aMSxBOCoI0xHBsDiT9cGe5cwtI79mI/QGwAc6VUvE\nV3QvBXcJJjvCkSxfqX3Y1hxWFxqBFCRgUgUAg43hXeFMZlVRdjoQ84a77E6L\npmys0BCYsmjs3Pv649mxVDJUAfHENRe5oJD7hxDlUrRTKFoxzySiHXGZUi62\nB7oIadT/JCqHHwThTvzqA6KutjEV+2GHlC90K8CTIRh7hLi5a27QYkpe0ib+\nt1j9YccLIZTEjAOsqYJIvBb1o+6+RMS9pQ6hvZRX5FQ88o06lrkHGeW6hCru\ngyuA340gw4mm0od4tkFR+J+YKFyZAlKcbmEsi1tE2buZMlUbVQtG0PbuskSB\nQnbb\r\n=0bT4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7P1fbPxCTVNv7aS8Y9G350lQOOFV/f+TPg7jIOCsICAIgQoeGMf07FfcImcbGNS2DMVz/g1FnCYYkI+Oo9g2SLtE="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.5_1589467627767_0.7795178373268152"},"_hasShrinkwrap":false},"0.1.6":{"name":"abell-renderer","version":"0.1.6","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","cli":"npm run dev:cli","eslint":"eslint .","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"39f6d4b81de920abcda40283bac02402d904a9c1","_id":"abell-renderer@0.1.6","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-g8/P/MGwmISokHOeAfXxcLIasSDeQIup/aNPjRMocOZlBgRWxbVs+4awM8iAQaBLOBtHG4C9BFNMobmFgE7Tzg==","shasum":"0922798ed80a8d604170f0d964bcccf8c72b8633","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.6.tgz","fileCount":7,"unpackedSize":18664,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexhN7CRA9TVsSAnZWagAAaa8P/RQQIr/92pYRebgA18JP\nQbSXHQn6P3hPTuAFUMh+m/nYYJZe/Ba3KEdS1ZDh22dIqeJJhXEp+JCFkbw5\n+4SPcHKbs+rGJrnxKE2JPcYYSTQVfZu48D7yTvbOUXNRJJV//9EoLDozgLv2\no3aIbnx1GMdyraCRb6nFWOHZtDjAFsMeuu4AXTmCJ7NVnm8bknMhFCERPFJk\nEU6HzbeBdETKfuV1QHonuievAcwjRk0ODpMxZ+hNdX9HuVAp5muCnqpqPAJ+\nyRCb9U5T51+xEMSDcxlMq7+uvz/uqQ9EP+ASbchKp3kBfuwRyrXuVxtcfBdS\nEIYSb6AZpWy6Phtm+PNc9Hz2K4FSFmVHo9q1gAsL3Egtm+ZCTCcK6tmHWVH4\nPaCXGib2t+Xp6w4kjpzI8uf+qY1BQNhdLj6BFHQxRbbG5rKbYHfjZvRQa2pE\nRsGbyxma/pCrJce8RiLIBJU7sHaPV/vIE1rAKHUwL8RNX+vbH6e7a5SwqjvP\nbEazGUn414bwyNTHvFqdPtlRUTvc2b3izGX2U1JgbzO8SjUVsYGdgr9QmlXo\nkm4VQRjaneWOCjEYR+nsHT0BJliBq+sLz/6lurjq6pBTuzIZDXNI6jSMJOxX\n1orDLJtIisM6VsAA0TNOCz4fFpHWBpMEyzRBTvWBAbIAE78+NtZpAeH0x4Cc\nyuGy\r\n=IC+q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+OhERjEv8dNNoNHD/Otx1AZuNMHMTsjLJwx2XPEFdOgIgL8Nvf9kBNl7GbOrIQHQiLsDivYuChul8+N2U0YUz1KE="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.6_1590039418992_0.39631896736477046"},"_hasShrinkwrap":false},"0.1.7":{"name":"abell-renderer","version":"0.1.7","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","cli":"npm run dev:cli","eslint":"eslint .","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"f93b82ee7b628efa65e085c0495232a747deac6a","_id":"abell-renderer@0.1.7","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-LHBXf+xXP8j43lrCN8gumBv6OmoBIBw5vs4XNjMlvVAK0AHPKcm04eV33FjRu+86hgeLdpTJPPKTUpZWtuT8MQ==","shasum":"66ba887402d4203f1d16b499ce11cb10eb5b4ba2","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.7.tgz","fileCount":7,"unpackedSize":18703,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexmobCRA9TVsSAnZWagAAZIsP/i302rhaYfHnGUKU3sp6\nsnAGEMRxHtIbfmY1802rIoWoPmmrJ5gkIR+24VrPkAP2XqeRy8Or4N9c8Ju5\nM9dHGkwZZIsXCmDUbHh8ZT9dKHr8U0N39eSlcnKbIBDWv9R+mnvrMOk+U1yp\nlh06h9piqLCFvuab+ID15K+OKIbxM1OLjKdIiuSd5EIXIbTFGRxDCVASlQij\nr8kTrE60/l9VxoSpu0ZTlj2RsuoGHe9zKrvB2ncsdy4Psb1O2WlCZ7MkoUFk\nz1LwOzLXL/RwP5JPPqs7AFgl3v7ZeHpHgbVJC8wN/vwld19zhc63PzXMV6YS\nksCqLErhlXfqo+jEqN3RdpWap2fcKKo5nFfVNUk5RTvlgsRJYqW5YSnQO1mN\nl6G66QTlXW355Apxv84L/r1CJaBvM2PZkwQ2Mcpl3RFzRfzhm7vA0tQUMAdS\nxSQkKfSlXruE6xHIjKL2kkOSoxYai+nr5qx2Ik/SiHy808XWscjubTPRwf6z\nltz5k8mzPw+XD18tU9yhYDd3+lTYWf95hXV7i/vEPVYpDFG8fGqR+hhjQQHv\nFnjMQpPVgf3O3fqpaDW0yIXSA+mE3+hKvkoSoc/s/otMVIFRsOq1CArGtijx\nPsPsMKVvLAZuetUc5QoV3vys8/KTUVDsZIWCKcCFtCc1ny9U8G/eaNpx+Tfd\nmdnP\r\n=+NqO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJfghD1EX3JhmgfbJyiQyIv3CtrSwUmRtkZSeJw/RYLAIhAIex0c+nhzwkL2Rq7C8xUNrP7TJFmVVjfmjbxC8dq+J3"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.7_1590061595455_0.34785718513583475"},"_hasShrinkwrap":false},"0.1.8":{"name":"abell-renderer","version":"0.1.8","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","dev:cli-dir":"node src/bin.js build --input src/example/templates/loop_example --output src/example/out/loop_example","cli":"npm run dev:cli","eslint":"eslint .","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"e03f9464c5de870a96bfa4b757fd8dbd70b4d6cb","_id":"abell-renderer@0.1.8","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-LhrMBvgHH+eeQDG2ps0ZN1aigbu9iSYguauHfl6HVaNi7o3zL6EQ/eqPSoyiE6q+bIhD5/QcypRqiOT+LWeGCw==","shasum":"140cbb522f8bb742b63bbfbbbbd057565f10cc8f","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.8.tgz","fileCount":7,"unpackedSize":18922,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexr4KCRA9TVsSAnZWagAAlWkP/1uoiPezSzMhQABrQkLV\n9bUEB56LDSexzJJlNhqq9ueLBORAjLMmHLn32HdofFgx6TTNjY0uol2A+Srd\nnSUV/NI9GhMbfRMkPBHUA9mdWzy9KmSr4u5dRQEzzMMnrCMeK9xJKNcfC2Xu\nQZHNB7AmBEMKsloazBPxGCKqFp8yybWmmvixbuLfMMMlyYF+I1QYBlfSzeV3\nGfs+XSPZIzEv13lo2aoxaUCFNa01tY/06mzl9lkWOZSQrE8JlxLT61ETtotA\nur0zoCpc2MI7tomjVqJUBhj4pqv7GPCahJ5cxB/j3By9whDkH8dUAQMAcfFV\nrSH4TmqUleBAP0WgBq1EZWxgzRmdzknp3lyZTaEd3qwU5MVnXk03bIelVIcQ\n4Lv1yLmgYxHhi8ThWrj42P8nI8/keV0YkksOTRZKU3+T6yd5nofWzFTwOLBY\ndtlbOXjbY9HngPj3TY9qCRPm2sEfV9sj9cxw+dlaO415P1ooHMYsmUJ40sfK\nneeAZStukyOyvnelLhkXBpSXjLWhgvRnLbAN07tPNeqGDqVtGiZXsT0QaKTt\nUSOuhk0oVJCKUBA7Edrszzn9yfJEp0jYibRHwIIbm26enZsz3GVavVgk2zii\nhjkUMFIp1DtAFxmvFhGEZNVhKrVM+25M0t0GCskOJzxmKnUXw+KQ80q8ohHz\numei\r\n=3kD6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFfVK6BxtbpDOwljKc0DVNwUoxfUZ7rcgknAqpMqwyl3AiAjOf/xCucjvCtu2ENSngWEcyYN7CzRt8/zi4ZaGqqIEQ=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.8_1590083081576_0.4712244563600496"},"_hasShrinkwrap":false},"0.1.9":{"name":"abell-renderer","version":"0.1.9","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html","dev:cli-dir":"node src/bin.js build --input src/example/templates/loop_example --output src/example/out/loop_example","cli":"npm run dev:cli","eslint":"eslint .","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"969310f80b687a9c7f83f8aff58ff1e389d5c655","_id":"abell-renderer@0.1.9","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-wHbcWUwn2OiDVJnk9ZSDdjdZTrNP5PPv+ABl6JWV60S8shQ8bMuCSFYvwNPD9DKhtRtNPo3kM3ESKykwemfbbw==","shasum":"9bf82bdfc062686584282ddc6dba36f42dd2f7e5","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.9.tgz","fileCount":7,"unpackedSize":19730,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexsbyCRA9TVsSAnZWagAAdGIQAIIj48mTeqCKZcJmiXgn\nm3biKpPFPGPRw4XitsSR3f0bnFCx96QqMWwysp+NP7kp9wrPTrgu+F5+vqTA\nye1Iwjyyvajl0UZRxlHyj4g46EjZsqa8Odiwc8h2R7gVxdVebRcbRbAUwLKS\nIaTwhxi8oGRvmNukpwi/1/o4QC4umvPtKelh3Qaxe2/e1nFj2bnuHmxgTW6j\nwqRtBpxai05fE/ZV3nxAV+rGGoclTt+yOt1qKjSrhedd1veHuWTkRUGVDJDH\ngSddL8Ycm40oYtTbBLQAtAgXRAhjEIGd6L1dSWV1zRDloGrXRYa/LOgqOIr4\nnppDy1G0pCvr5Rb06Rvpmla366KMAjhTlvFk5F8qokzi8KuwBKlKBNcfd1Kc\nFB2T4vIpF7zjoHHpcAY5T6Gb6zHiRA8HMYsS+fXu6BOHCl1BjXBkaH0oXvcK\nZBoeT7q0SWbkm+Tmdc9LCR69VvoNczd5OnjVNBajhxuixd/g1KPTiC1Ckjxb\nPuLZp9jzHLumop/AoqfRwnsAh37bN0+JdG2F9qxVSA+89nvcMpu4yEMjk7h2\npWkicFpY26IUsr7A5fazIEIybAYsrMg+1fkhAFu2xtyN4JC8I4mO9A1oaj5C\nrezFbV9VWC0w6tYVnQyx5O6vbIL+IeWlp67+gh0kfuQE3Hk4Qz7S3IG2ruuV\nHVZH\r\n=JrxW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0LdSGp+2u8D58f/HNRqriQa43KGJk7X/2dN359ZPyPwIgfeEBD2Bh4F2+atSdhUOF0Jzc4OxQO/fWDnDOiLqTnqU="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.9_1590085361756_0.9119636477058577"},"_hasShrinkwrap":false},"0.1.10":{"name":"abell-renderer","version":"0.1.10","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html --allow-require","dev:cli-dir":"node src/bin.js build --input src/example/templates/loop_example --output src/example/out/loop_example --allow-require","cli":"npm run dev:cli","eslint":"eslint .","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","fs-extra":"^9.0.0","mocha":"^7.1.2"},"gitHead":"dcfa75df325daf23fb839ae1bd31707a3bada431","_id":"abell-renderer@0.1.10","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-nOETcgzlr2kFFq2DynJJlT+ZgK9ypUA9LvLqp+Yy4+hlZ1VMrsnvtWhLU+fe/6ukZNLu7Ehn5sDVFqyJCiuSAg==","shasum":"4c9b987d6d041b3892de23c5e768d568e2c16c3d","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.10.tgz","fileCount":7,"unpackedSize":20550,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJez2haCRA9TVsSAnZWagAAXmIQAJqgOvWi6TCyk53XWpmB\nITW1CuDkU3qtdr4I6n+a1sfb/pRCsHD62KRJ6A2NwamUcAa0lsKt63FmtvKL\nhVWLviRLOhrcp1vc+BWspCcr89nYISKm5qlAzDxlyWtnfEvBbsJLbF6YrR3r\nndIl+dA1+J+sSr5fFyJanNYvZ6mYHdPdZD6M8DrOYPLbkiX46+Zc/dRQocpF\nOqAE0RSeCh3GArjfXjMyTguxp45+6//w1eCV5WpbYipJ91rIh+zHqSO/azuV\n5KDLqJVyuSjnqsYyi7vRFQ1V1PVCn3BvZ1eiyRUUFbnrEh3c1arwm1vCPOzL\n+FQG2LnzQHrT7pMQMln6Km20blLBhwwb3+MU/Q9HyCk//Fktz4IqpByH+zrL\nFkX0nnVaafEsXn+MCi3xQlSBYqNaahz7Luzz5yhfQhKrGnyUH6B8ghRpkrmS\nuOi4pxn2Zzp6f/tsSsyE8lLAeE68eaT8tOZPVB/MLrRyf+3jXqWcmPh6vPR1\n8rM3AvnWYEo65tHegvqWLhl0aEDfiHvSaGE7rGtogE/CELWcEjTymM7ec5Gk\nbMgyM0oP6zDsHQloHLkMstSvDfi5zCuVw79UIF5E/BvDvxd//kQ6bSwlukTf\nSRyaWA5HhfanXivMkevnEFcSeYcFbzLuJmSc7ki3CTo2c1Tpil/jQGdqI33c\nV9ZJ\r\n=SvP7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQ+NxcgzMOwVI3Uj0DPHlwzeuuHuWbn7sxr/1IpHIQNwIhAPxCNL+VptEyI7mcooSMiEq4W//r0WqdoPLu0IRdPOgP"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.10_1590650970130_0.33070561289716394"},"_hasShrinkwrap":false},"0.1.11":{"name":"abell-renderer","version":"0.1.11","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html --allow-require","dev:cli-dir":"node src/bin.js build --input src/example/templates/loop_example --output src/example/out/loop_example --allow-require","cli":"npm run dev:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","fs-extra":"^9.0.0","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"61a8657ab6253779342392192104b9121bdc03c5","_id":"abell-renderer@0.1.11","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-I52y4msUDn/S8U9kY0tm1CfEGrwov4w10Y5pd1oVdyo/6b+6/CE8qRLAz5QAPzOd+WSG9PQMDbvKEg7obaFjEA==","shasum":"aaf5cfa8598b968a985bf6d882450cd5dcc5c307","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.11.tgz","fileCount":7,"unpackedSize":20856,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2PAbCRA9TVsSAnZWagAAi20QAIryFNS0tMaC5zfta+99\nhAulxgkuUYen9+K1Gl6ahA/gaVyXZOnuy+HgJOU6cPdhSrqve1r/WVu9t6wd\n4szxKYJempy0+gyZDu+aeKUzQCqy2u6YTdfb8pU3YEcjymxs5O7Kot/LPYAW\nsP1o3KOtPzmvBzBFaDpdGaZ1KK9CPM+j0HBpsapUjFVWHuOLP/ThrIrnmvvO\nnj4upZv0Hq0uKOdatl45nM37uPaXATM+hm5fjuJ5blnYHvqQ1hjAjN+HAQwq\nIQQc/flB8SRlWwh2hIbnL2xaoBsYe/z5u0bqkvqZXqOpmlSsGrY6meAR3ak4\nHar/lfWB2KEv1SWyRFyAzsiCqfu7PgyWo6time307dJXazIyUcc+7HAkbHSU\n67oY/DH1u+JbJtx1jTTe4y+u+S8aBgnIPeHB4cppVox/Rny7CuLjLeVj1QuE\nVZ77pIlPWJgWgbd5lKbkk3VFypbKPhB0sOLBlOJjqI+qRFg1vZi2jlvNxlyD\nFgoHyLif2cdVL1qzTM9dgBBe4G4UjXfL2k/lK70bc/A11/D4yCdHQ2UOpar+\n6J3M/YPAYeQnhyCURx8A2i2Z5JXR4Ap1r4ZzhJzS85I0qHeLq7UU6CNsQZEq\n0xeHFbkNFznsm9TDsBKJf/Xxu/qOdJhMQAcGKYVAsOoX7h8T6waGqGYDPENO\nw0OT\r\n=3IwH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5tIGLFabywyoZnmcLFBGtb7cD25FRrLtkfoZqVLdaOgIgY4zL8SOUCwLPCb9FtD80JVrkj9topK4QdY7QzC+y5G8="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.11_1591275546940_0.6807980585854052"},"_hasShrinkwrap":false},"0.1.12":{"name":"abell-renderer","version":"0.1.12","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html --allow-require","dev:cli-dir":"node src/bin.js build --input src/example/templates/loop_example --output src/example/out/loop_example --allow-require","cli":"npm run dev:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","fs-extra":"^9.0.0","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"1876dc23aa85fd4ae91cfe3813394d49c8e826f0","_id":"abell-renderer@0.1.12","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-fMJpXyqvwbmFVI5KAxwDMm6m7E8vNzCuTDqMkZkbTlsDF879D90h3aAA5IAT+BSuxQRRajk4ricJSRYas0HkaQ==","shasum":"38cb3700c2610e79d37668428fb4f8dcf35ad82c","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.12.tgz","fileCount":7,"unpackedSize":20994,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe3MiTCRA9TVsSAnZWagAAEq8QAIMkoVK5KKdNuaux+Y1S\njPHYXwnwuNj7vdLKSLhlgU8OrsZqiADI4poAOj6PfJeADBhp2AV2XrfugIJy\nH9LW1GGgYwN+YIvMxhsSMNZP9+V2O7NFbkVrZE2zAs10Zo9fOc1xMN+dfVy1\nRrmQumfhR2PVCIZ1FdTVf+apUbIo3l6xLXYVbyw+cvCXmFpSBRcD722UaimI\nic9RtVgZgSTRkanVBggdaLJzwOk5zKIScTAfppCDbf/dHi+bQlNDoUyS8sh+\n4usywnxQrkpeEnNa3qt076wUJXmcKx3QQ044FyCWwt8g0SfWKEbTEormJoPz\nJIHJNDvfQUWy2FuiW4iNFp95D4LlUjrzw8DOf6BWbm3t2xwnfzi+pzrgAl3C\n4hJX3aKCDpi5yZmbbacYHFi6gRfINriBI+izL+FiDrM43wWxC9htKmhFXoNz\nkXbQA6G5djNLlL5ieJjW8Dn7iIkRZFunetL6IOmCzZ43IGQm0Gy9SdclSYEa\nJKAjIFv/8M59XpivyuBnjhuB1Cr4pRwZlnMfFjlL/+/EvXPBbdSZFdgKAbse\n3KGC2RjnytpSnF0VGR/kmLTvJrodKUYFLsHe/q27E63qW1dPaZwubCvsCijG\niUqUzILZFNQ4bmqkWFYNgiE1PxaY2mC4imbHHeJJGtB+tJJ9l9FCdEVo8ejF\nt7LS\r\n=TgMv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDGoK4sz6GSoc0O84eZh+aZZi2cFM7hUJ68JMtX+0mB0gIgHPhz5gHrJQbZxdX8Vp7ZkoEhHLRBLGbJowjvH43LfA0="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.12_1591527570507_0.7536550284649768"},"_hasShrinkwrap":false},"0.1.13-alpha.1":{"name":"abell-renderer","version":"0.1.13-alpha.1","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html --allow-require","dev:cli-dir":"node src/bin.js build --input src/example/templates/loop_example --output src/example/out/loop_example --allow-require","cli":"npm run dev:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","fs-extra":"^9.0.0","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML on build time. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\n### 🖥 Local Setup\n\n- Fork the repository\n- `git clone https://github.com/<your-github-username>/abell-renderer`\n- `cd abell-renderer`\n- `npm run dev` to run example from `src/example/example.js`\n\n### 🏃 Run Tests\n\n- `npm install` if you haven't already\n- `npm test`\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"b45332ab9f314546d147663e9bcf43a910f3e266","_id":"abell-renderer@0.1.13-alpha.1","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-FQi+S+nWVwRUZXC/3XfV7tuyCpu1GcrOKIQnM/1X0LcyOzJ2jMleZ1NiVzRibZY8pq0Pl949DHLw0U9fTdUn9Q==","shasum":"fd02361e2eda7bcddb5f4df1560f06c5f1f167ee","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.13-alpha.1.tgz","fileCount":7,"unpackedSize":21547,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe7i1fCRA9TVsSAnZWagAAI3wP/30yShxsqdekP3IEuYxa\nQb1izU0SgudBTU2JaQ4xqXsQ7Q3OfG4vd7dw8JpCxn4r3nX72OElZ2fHrxvX\natSD99n3WtaIaxlffm288HNk3m8BhMjGN7bZdCRmN6Q5VYeYbwAC2I5SMDYU\nec/6o0+Qh5aeDLu0w+iXW3WvvHk/ZMdWZaHrv7ltlR73mG6zCjRX3yU1T+x8\nUyojHkn4zGCnVKvlz5MPzlSa9Ci1beQ1DXDCvkh+VNZqA7MgOaYQRyOLXSS3\nzl5+xEmQjkjExlEq8E9TQ6PSXMyJXsT+vSc0eXiQixZaPzSFBXsgpx7718Nf\nYq7iHRaTKQcsqygg7yjU0uQKcaVLe9CQDg04hbjeK2lrskaDtMgQ4YrlXk7+\nA4WjYiAzf4I4EyiwFLbjZjEDcuj+TeFtmnV8X+Vhp2msnP/RUYzGZkp03rGC\neBgwY0oCApjB0mi7Di4T90Cju/OEy73jdyMh1+3KnD5JeBOhJu/JhYdKAHgA\nkup1LXHYDDAqQXIieAMJez8V1sKmTAOrRwr7zYpDdes1oUNdZPk843YyqZxt\nL+/AGDqI9MMzX7g11BvYu5QHmSI8Gy9ohPsIZdA0yyhUtvNxKCBpcaZvTfNa\nYs1vHKqPtJlcHNbxe6ipGu6u+VP9KIWf6oI8JMhBq+LA1vJOAf18gBhsrOuU\nn7u4\r\n=caUe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAHCQXaFlsYQy03wYzsPs7AXt+KMfW7jrTIEX14UKE8sAiAvP8SAAQzDTBxrDTYjHF+NhwSeJoGesKWnWNol9Nd90A=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.13-alpha.1_1592667486690_0.5536723844968394"},"_hasShrinkwrap":false},"0.1.13":{"name":"abell-renderer","version":"0.1.13","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html --allow-require","dev:cli-dir":"node src/bin.js build --input src/example/templates/loop_example --output src/example/out/loop_example --allow-require","cli":"npm run dev:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","fs-extra":"^9.0.0","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"648ce894a5853a637c54d73c49cc22f43c375483","_id":"abell-renderer@0.1.13","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-QTrD92jI9D2ObTw8eyriWaCh8bZZV5dCY2Srg6x2fodiIoSwSpPidnw1iDH79FUKT8ZVP2HIyZX5tlh9HcUd3w==","shasum":"07f418661c88dae08cc6cb091c005279c8228f24","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.13.tgz","fileCount":7,"unpackedSize":22346,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe7kbOCRA9TVsSAnZWagAAtgsQAItsQVYAcEdWeRstXaT4\nOmndA9ekaWOasjG0cV/K/CfL4X2gbUQsvxSm91P1VwC2BxjsuZ4epjI6b/bC\n0H1TGr29epiRG+2KKZ+Q8bmQ2Vs45/U61hXhQn+tRYwN0MOiuUbL9q0wH+AV\n4fdKQqW1NLIt1YGoGKp8im6VSwBjJHfmAuugPOC2mEGsQrmiGsX/BAWz/ryL\nS8aHh+Wl1gy9S8ij0YdyQU9Xcf4BafzowB0rdVafhYszRE+huYrdHJ4uDOAG\nJ/oWzHIzhtdkR/Eskv4LxTYmHmWekqTGCmWPL7QcEqxhZop7ot+W2eInrxP9\nCR+dnSZb3atuceXzydi5MqjOJooi3cGiL1wFW7gPyqDGXC1NL+j5qeVIGJem\nycbJVUp7awfDxpjMv/n1+qmvPegRx3n+SMFX7zBVluyd9+2DspSIcze+gYXe\n9JU+PMlSY6+6dUb3gH0KTp/XTj75lcInl3XfRr65O+Ek4Tv584RcqOZoIR9L\n7L1pY8M7a6cb39BLvmZF4fGka675JBiMBeoNoWBraYntPK/sqQQCeTsz36Mt\nw+lr95rM9AwCK4q62xLIUrbpS5EzSkeZOG6aduV/yi8UJgS6/wZrfd8+gLZb\nxn/dzjKYkzfdEnRLYMo+phtyO5qAWYBUUx9YkUCXQxSrm6mt0uST9BM3T+Uh\nDPpi\r\n=8zW7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUGKOv887enabnLmLYTOLvTRGXdEdo8vdT3gMNsty20AIhAN3EWlkBEeUGWjgO0apdkuPpEQKV5ZRmvLbpD4rsJ1cX"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.13_1592673997559_0.05515454931946784"},"_hasShrinkwrap":false},"0.1.14":{"name":"abell-renderer","version":"0.1.14","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"dist/index.js","bin":{"abell-renderer":"dist/bin.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./tests/*.js\"","build":"node build/build.main.js","dev":"node src/example/example.js","dev:cli":"node src/bin.js build --input src/example/templates/cli_example.abell --output src/example/out/cli_example.html --allow-require","dev:cli-dir":"node src/bin.js build --input src/example/templates/loop_example --output src/example/out/loop_example --allow-require","cli":"npm run dev:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","fs-extra":"^9.0.0","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"71f3701b637645a299ff2936f6a95b40cd2e87dd","_id":"abell-renderer@0.1.14","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-wo47Y3hfcDFDWR11F0x5invjY5Sl5ATzuTBhfqJQGC57OXlW0wiCEqj1DOIwlJ3hla0cqjZe4Svs1IAcvyFuHw==","shasum":"09e1ab4cfc601a17cb9e187dcbd90a4278d432bc","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.14.tgz","fileCount":7,"unpackedSize":22397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe85kXCRA9TVsSAnZWagAAWCsP/37vtIVjOJxvktr60kYq\nLR5gbgRVuBq6DRhXhy1xzzpVo1wN77T5y8z7jMe7tWSHQVtKcu8e7D0Ut67N\nvmVQafJb4aJsoye7U1pClQrDablg6ov4vDhsr/NOjLz7u2vICkLQdiPyJfe/\nrlbjmgHIkzCDhtO+jNslIWZ2QjeVlv9SWH1hEdYxFFXRuGKzeB6RC618V8PL\nKyJQclB9IJ7LQ5dC+8+0NN4ewf4y76O0Dp9IiwmQ4OHvvKPPwVQx5tOGmezP\nS4htrpYsWa/g72DsCCpf2qKVVI3Qt2Ynf2DtfFLgiHr2Nd4nMeMEszJdnJ7g\n9/2JY5iNI2txCN3bcqBGDWySvgyfspNRVqdjJi3hwpjlbdcyqwxB+Mwa7rNx\nzubzeCODt69qsOCx9g8PalHTwZx//nkiy2EYIZ9aE6OaxC3yvuoTd0E39vMQ\n3ftqPI9U0CDKthhGg6FVnYDAHGty9qMAKr66nkJtzvY5Xm535F401Fwchm3V\neVFoZue/ba3C4hovXBBXqZrlpHrBF5t4u+pYwIcTc48fXdwupiKLLhHIH510\nMcQpjqYgii8lgXDbEnTRC7VRtjYR4uk33daYMU4bt1ca0F2GcSl6KJrijnrf\niy9hnWyeMeaOSF17zD3iMPu+U4+WdYw/yFCHYyMpKTa5ivxAEdsnYU5hMy37\nAxoc\r\n=nzM6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBvpjyPnOVp0E4dfepwyUtzQ9T0vj4VtTATO9OWPM+J5AiEA1xqDJp9G80FeN7k/IH3kzDluamFn2YszsPwsdKJJ0WY="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.14_1593022742706_0.5779006913951068"},"_hasShrinkwrap":false},"0.1.15-alpha.1":{"name":"abell-renderer","version":"0.1.15-alpha.1","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\n### 🖥 Local Setup\n\n- Fork the repository\n- `git clone https://github.com/<your-github-username>/abell-renderer`\n- `cd abell-renderer`\n- `npm run dev` to run example from `src/example/example.js`\n\n### 🏃 Run Tests\n\n- `npm install` if you haven't already\n- `npm test`\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"3b66dcbef93f1ba2d86b2ccc54b377e14ca8c89b","_id":"abell-renderer@0.1.15-alpha.1","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-fg+Qo4Hz0Jp18xweHASVsC5yC23iSG3G/J5i16cy9REkEwyPx7crX5eUrMXKATYXqc8gpemvBSrqmXRb/9PKfA==","shasum":"b22fbae7222c90ec0b90393d31bdaa64c160904f","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.15-alpha.1.tgz","fileCount":9,"unpackedSize":22027,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfAdpiCRA9TVsSAnZWagAAL6AP/RfUg+k6O9j8Pd5faHCJ\nwIkg/0E8K3v/oQ7vRZGueIj2D3kN3c4mWR/IaINUH3EPW7baHGT6x/XSVnxZ\nmA8H9wp8Gm3dN8TqZ0E4wVtcpA6KnDAlyWFqG0Pju9ob9c4Q1aPbT5noFB2V\n6pzwz1NvhMAlPCEEEdu87ebc86Sl50smvMxjZb935Opl/Huf7NCmoulLgQbT\n2BghFS24gkDxAMTf3l2g4l6NUEKdlDvo/ZpZviBJUXgbxd3plerIE6rDdxh6\n2Up29Qqqr3aXe6i4w5GsibSO4pdhgCLzoB2XKycbz/35NsxE0t9mmlMm+fq5\n6z9O7wQFNEvI0P2dkPhMVenYI6qEOfZqAOvtZxAd/1GtxDSmty8bolcY/2g3\nDKQFU4J6ILomNS5gA/vUyhO+Yg4wPdPFbCyF6kd8bteanxk5E4T+PTpJafSa\nv0lf1L1YdVO+7EzHTsnzO7PJ09RPtAdGt6gR3zKz8ztcQIYPNUpB3chVVx3B\nbpnDF0iLeE8YrXURs/t9rYiM79Y6tj9GCJTw3e/VAHPYv+K/GdYpJIxD7UIJ\nybenYlqndF/+Q2/I5o9BkRulDIE48AvH8XyjAScrapox66v2gsMWCXMKWhEy\nU84k+65hyvlApptOXOEZTsGWHT2s87mZd+Mwqk2bBKFE2fiNs8sPEHrIi0Hf\neetU\r\n=OdfS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8IXVJz82akNTy7xnw/MuL7CZ46IjzdDWxHx+e5pJzPQIgCgtTth8re71SrTnfFeUpYSBkIin8FlJrdh5NbPP7Sy8="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.15-alpha.1_1593956962164_0.811601970538661"},"_hasShrinkwrap":false},"0.1.15":{"name":"abell-renderer","version":"0.1.15","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"b802663287a108322d187b672f0651fc6da200fa","_id":"abell-renderer@0.1.15","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-zjDVsXWcEUgtl9YjIOJvKpWg0XuOJpQj3u4CSmjLeua316OeewObwirz1RxpjKnptCDRJnsONbS6LOZ3Wj/+/Q==","shasum":"b252d18b95356b470e608ec506e5ee83436a30ec","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.1.15.tgz","fileCount":10,"unpackedSize":22854,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfAfd7CRA9TVsSAnZWagAA7yUP/RlLCC/wwcZr3JGpl8b5\naMa7cIONF2J9aN6n9/f4hUxTyoN0YrUDJtI039CT8bMO+iZGTWWlLKdxhCal\nbxd2TsP66U3bF7idWD/xB6aTfG4LbV9tO929I6j9ynC8tbDF8Pzea7P9MbSx\n6WxsZJkaEbmpQ78HbhdcUM1ELLVAkrTK4dm5hyTsPgkld8dncZnLEchA6P8t\nSNVFXUC1OieaHFldvXkel8qTKFFuDYglLWt9EPH+QYHtFu8qJc4Ffmm7cGJ4\ntfoVDiXgYYsvr+m4SeQMA1tMEkX+LZ6i668VMX7hZihw8TpVSp+k4mhu70Jy\nzQ0OHFWqsS3XL0JWIh53iLhMsxLlxe3OijHrqHLdMfg6OZMHAPL5VjDIYl2L\n1k+p6asQnbKRq/wvdQe5hbozp3tkND2/kqnPtrZSNs+vWGFdeYqofFSzgaVP\nTh+qbKu7wbMMorw1A9TsoXVlV7DcdcIw3Zwp0PJZl8Ea9yyNYF/WLzIOSUNo\nnkLDYamdpqALiJfT9QQJm4s154CXBusEjzG6od2dt5T8l6MeN0NDTGr7e8Fh\nzSqDjMv76VMYsh2+5ER+9vw1Yz6X6B8T7wlc8aj/NxSim0kNfQUIJwJh8IHI\n1EYzAa4qknYBypu8NHO0GmtUmDSIzcSG959+v88aEIUA6suPVIPJpU8Yd9J4\n1tj5\r\n=BxS1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCX5q2N/YiKJOIy5qccdPHV7E5dg9Ky29OMMJxQRK2ImwIhAJx97j4xdWkAIPjMJT3H7ommmO06Unt4HL8z6uqZRL0R"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.1.15_1593964411210_0.9435056689718084"},"_hasShrinkwrap":false},"0.2.0-alpha.1":{"name":"abell-renderer","version":"0.2.0-alpha.1","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"09dbfd0d812d491fe1a21a742b1cd33623391be4","_id":"abell-renderer@0.2.0-alpha.1","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-0gxejHstR0i6NezrdyNBCfyOaEeq1Et/sNvu6cs73fsyaev1okKWn1kRBkX8edBapuc8EtJCEoNRD1B5c0C8Qg==","shasum":"f47761c98fffbe719a82fc365430415c24d4be6d","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.1.tgz","fileCount":11,"unpackedSize":26750,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfGynnCRA9TVsSAnZWagAAmRsP/0Co7NVWkye2Jjng672R\n6C9FiebPqhgyhNSWlNl+SsNYVaBVwPhUg0k0jM8Kp2X+FcKKkOUSLgGeyxVE\nDE3v91zmNjhgOxsUaScod8aFa0VZJLfXwC8ToQbRRoXUpfqHxjWs/n3SETWA\nIUT+OTv4DQ7NfM+HxdHAmLhHVW5/sAe8BfHDxGqR7VJInWTcRZmRQnmuUAHV\no7+I0rmWaD8Tj3O8mw/ASeytt1Vuze1/BVATTsHfu7pdGBCwMfKi5rn4YnMa\n+P8Hrz9YR1e7Lv5kKG9dQNCs5DXTMubddsBLo6yrSVGvo+B7DkS7qBnTgDPE\nckKDrEg3GC1Iv92b9bsDxmq63F9d4DPnu5QeKgm1DQfm6RUtvwNlF6dyKgC2\n3z5kSHFPDDcVmngEwApbtfOtw26jFcOOWgjd6/SGD1KbwwF/O3Rd9NK5DRpu\n/aynwGN1+fgVKEWT8rf5W940E/t/5bMsG2DJEI8Df6VsT0ChHiJszqex2O3a\nuym+VpzdOrhhkG2fzlYMg9u0gbVnyVzPDwsCVx8leyYemcKrGMag7jaTEXgu\nTCSEA9CmwLElrbYM6Qk7X/e4WcXtDkWb9d/DKirZei0WsU2ju+iu/dHnUfsu\nAEZoxX9Cut9jwXdt92dPbkl8dBMG9rKDoTEf/5iPcYpWOorGsmbFYiRe6XPf\ntMWW\r\n=DfLA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAlyqPZMoHUKkBuTI1vdr0fHK1ocDqY1YX1oUJhs5hlvAiEAlMLFq63AEjZntDQTT8N0hwVQBA4nbdmCr7MeNhvpWng="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.1_1595615719154_0.4936639669371381"},"_hasShrinkwrap":false},"0.2.0-alpha.2":{"name":"abell-renderer","version":"0.2.0-alpha.2","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"c2bc15a16ef6f5ab9a781a2ee4f28c7fd4781e6d","_id":"abell-renderer@0.2.0-alpha.2","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-k3YGF/8tnt3XRQBEp3AGsU5xFrGxVa+t5lWKqNpYxOFhqTJEWatETp200u3KJvg1+LQyTS5x7Xnp8Y2gk87h7w==","shasum":"c9bbbe541b21102cfff5a7992a90448cc5b1bd7b","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.2.tgz","fileCount":11,"unpackedSize":26898,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfGyu8CRA9TVsSAnZWagAAYtkP/ju251KDXTWOFlTFpmVB\nYjRs+JFYT9PzeXHNK3C1VakDPSeFMmjNIY9nCqsb+UgpRwtEuPJrvuVy2MFV\nVoQZPngyDaJF/ROzZFk91s4RD2LwVhdTdDwVzd36UmkSekO8SPhby2SNmR+5\n3+KFMOlBr+BXJ2b4dOCb7rg58LHV2Y/r3rotYiNlAt1Fo7wMvamE38uUVGOO\nXBmeVSbjGBHhG7UNq0jaed9mqUI7HRJ/hXdMofjIr9+LS5yccJNFSN7VR3ZF\n6tteyeQ36Vs4me5heLoq5zSvHSY2cimEmTBAqM7bk0mZqpaZQ0Jk5kOpf5kI\nsAuRtDV+F5XYeUJ8XYTLCJEmnHAvp90UKypMth0Rr7C3CyIaCBa21LKfNVj3\nZwZtWi35irW2YC+RCnlFFMSYni4C0qGnule5H/DR9bdKocE4stTomQZngI2e\nZsfA1jl60jWKkDngymqBZ44letmTaZTPw7jmGSTFBt0eXLo0xCzEw5tqupow\nPYfD2oHxlZjpvUuqe10c1+ipr1dydpO74vbt64w5v6W2blXp6k3EhDf3K9SU\nJ9Fk8iXBtyfxUT3UlDH29qOdhMBRMN2SK3DLDlWayvgKjiN5H8GeHvUF9Aab\nfOvvXHNMj7ZhdAsKxO9sMOX6LC8qccj9Dgn6BrlCADXa3p86gxG+mN8p1eiy\nkRRU\r\n=nWZ1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAqoV6VTsG+XEJnY+aBXKYRVefP7fffkJVd3P7tmP7qGAiABZGDX+MY/LqYTu6KisdL+yPj/4S5gDuupPZgGkpp+pA=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.2_1595616188224_0.3546216237378865"},"_hasShrinkwrap":false},"0.2.0-alpha.3":{"name":"abell-renderer","version":"0.2.0-alpha.3","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"acf7a6bd239a73becf94d3038b63a274be7c5ed3","_id":"abell-renderer@0.2.0-alpha.3","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-/OY4crhHCMuyp575lcSviAip5n7S8oCF297eY2iL1u81y7O2bZQvyhVgdjuPgFD5+LRFtNg3JS6GedmFWGnMog==","shasum":"feba86120f471fc470fbec9b270065cc66d8e01c","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.3.tgz","fileCount":11,"unpackedSize":28467,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfG9mOCRA9TVsSAnZWagAA8rEP/2O9Gf8ybapeRNrC1jV9\nQ+MrcSYJUYuuhSBOCKvGcXqiklKKEZ1GQ1IaSxHfl2etF8JcebFi4Vscz05c\nB8N7o4kCRSNQ2uZ4qdvxp8MxznMEYXH/71yge+KUJ2aAfxmPTe2OKuF17F4j\neTbZ8jN9HoJIwDN0QhLTfH/y6LOv8XAm9cYVW5VKnTA7i/9fx4dl2e1A27+g\n/ycGpUUKkWknkyZ8GKh4jvaIyyH4+l2lsbivNc2ihSM3xMg+jpyajI0/8jQQ\nNCl4VHM4yk+ISglF1bd7f4DHWV+LrFpGLaRi7yadgTct59lLeaXzJuMBV5Q5\neHvSawIsrHAoYvvuvBXfwMvbsHfKKcPtU9SInZHocdz3yMbk0jsAX8Z6m0V+\nDcZivMBNbEj0ik9XwKBnkDTJ/2tTNODr/KV+S4go8oVCfZQm/oJL9OeaPOSj\nIzmiQlggFIaoosxqmJqo4UZ0l0EVtvQMUfHfNKd4vZ36bWp337keSu4sXk1/\n3yPad14mteA62DneRPHLktv+imPUky61yLh7UjKGVEG+xwFS7MBNQLfGJAoW\n1Ew+ovjK4m7rcXbOttjpLnc8jKtpIKsObMbBrTDfWILLh+qNVFVixntBAF+D\nrCx1kG1CzKKHVhuCxiJ0lk6VxcjknZb6CH3umnuOLskmr42ilMUhe2RwaWq5\nCxtt\r\n=EJiY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC/aaUmAsuOEg8lPDVpaf1plMjBITLmUhrRoH1y2D+HfAiEAzYW/6+RjLY0AxU3l5uGzx3kwuNN0OhdhZR/Mr2Cj64c="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.3_1595660686343_0.9568018944889101"},"_hasShrinkwrap":false},"0.2.0-alpha.4":{"name":"abell-renderer","version":"0.2.0-alpha.4","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"61c920895377cf021eb55e62fb64cc5214a024ae","_id":"abell-renderer@0.2.0-alpha.4","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-AHI4PlpKJvWCrQyidRmd10U6SQVtDzqCmNwS/nchZe8Y0nOlw7zSdJsnSBwL23CiDI8gNRXljugjXwdmCOoh+A==","shasum":"eb06d3208cabc1c9a89d194aaac9146433a4ba33","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.4.tgz","fileCount":11,"unpackedSize":27924,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfHHzUCRA9TVsSAnZWagAANkwP/0d8KG9ioYZt3c02m2N3\nNpKUOhXXntt9L0Zc3xeoOEsxFSP2NOnf+I+RZQx2GEVUGm3f/BFJi9uLMNBZ\n6J2Y31Bsk/Khxd887HvrQjh+/szjdgl+9RwqBg2RrQmTrFNQHI/6bwV4tnUr\nTuqM04mcmKU1hkb7i1qwxOamZFO4HM2Uss2V9aPD2QHlmqXlmMuM7Pm3T8Xx\nWvrHp+e3ZPssQSaDWFv6dgxdvwesBcCY4ux2nIaMWrSNA1THQ0bN/jmzXNNh\nFj0QIYlgYB4ubPttIChWffPb6Nm7Cf4qPdcZCmkYU9UGSr5vWHf8S0SEOZ5k\nftwrNdDthKNPK14dBoXTecTjNCAsCB84ahqWs7OnEpO2RQGk2T0ZVnpc+0m5\n2OmSsTcjMIjZ/qZpdoQEHuVuuD7lH/IMh8jbYT4xP0eAfuwDTfn5iolTFapU\nOfhRUcoqw8W3HJGNpR+hrawc85EQJ8sxHl4NOMbp2rl31FaNpUdx+r37anl8\ncmtZAdBUt/i7HVxjGJrB+PzlCckLn4C1oynmINeflF3y0au2SL7cN6GewvjQ\nfePVeA5RNFnETQIkva6RNHPs2AriKuRy//FTZjBPNJGGt6+4tm11XflHhiJT\nneF62sqDse+F7e8J0hKaBGWRAAFiNXgaxM+Q5XIWniPXE/fITVN05sD5tMhj\n15Yh\r\n=qLrH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG4VrPdCZ50on4IZqB5VoHGgJ/FD+jf4KJed0iuUtq8iAiEA+dBYQko0wMHK9HLfE2JcFTNuNNdyvcAIX78HzUoxfeI="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.4_1595702483840_0.8194218053603763"},"_hasShrinkwrap":false},"0.2.0-alpha.5":{"name":"abell-renderer","version":"0.2.0-alpha.5","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"371a487c62f94440b61587152b4a60f8748e4fe2","_id":"abell-renderer@0.2.0-alpha.5","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-xEUOn2HBBJ8M8ygF6DGfQGZDdDydLk0KoRUxojBechVUt5fz3jJacJNJbEq8EUE2xnhfRT2pSlzuJ70VUbKVnQ==","shasum":"021f623bf530a0d76f7fdbe3a25556395cedd669","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.5.tgz","fileCount":11,"unpackedSize":28373,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfHpYYCRA9TVsSAnZWagAAf44P/302uq5fc3XWkflJgGGA\n/EnY+34wVt58bn8s/gYmjNOpnbq0URXTE2lyqo4CuNbZakXeo3OaUYAWVTpb\nzzYyW99iKbPz3oHfozfr9A8hcR73eKoVxLmcAKSOed7Jm6TOGBPI8v/tt88f\nWaR4HUjTDjpHTUu+a9lsFb+DMRcLLz4urEfGT469RpTEoMku8Hop+d2KZyQl\n50BnyezW7EfMPTmvSgv7F1q6O8psD6J020tY+ymsCtPzysMC8MDYdgFdSFOx\ng2sl8bcy956lRjGUp1VlIR1qUSqOP8acEhQola2MjePjW/4OQ8fjFxB4q/Is\nge67hyFZL0hlxtETm9RVYPcUdibSXUy4R5LRWDdPDZ2HiEGa4SQ1GkNcfV4N\nAye2TEQ8BrOWRy5MRdVdkjnsa8FhiY6hcd4cf6SVdGZPiMp94o8DPkZNctNw\nsF1PhTML7eXYz0yY/u3b7sL5NuT5dWoCoMQZWa4HjtxztkqWOFm77GZ7KcNl\nvy6Tq+DSZjm/Cu2pgufW0Irr/P6eeoNwa623BVR608gWVemZQeaTowmHrz+C\n/Z/H9wm2iroEn4Y/Wl5tKRXPSjWfzb1j1n8VIoLBp3y2AAstKXJnlxqF93rP\nU3UNhbpXRt0BPnurhoC/Yp+3dRVpA0r1wvscI72V6wkdAvMlbEt1rF4HvO6b\nE50i\r\n=d3x2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuREenztDJ7U1KUhCgS/f41B0oTRlQMjSbA24Hjnrf9wIhAIGbx9iLB2AU89gM/cS+ank0ISuPXnaBSYH/qVgzL+kg"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.5_1595840024252_0.28235986968427085"},"_hasShrinkwrap":false},"0.2.0-alpha.6":{"name":"abell-renderer","version":"0.2.0-alpha.6","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"502418597011cc55252000b3c30a65d919fc52a3","_id":"abell-renderer@0.2.0-alpha.6","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-5VZrHrzhWKMf0FYwHAKxQ03HzwEIeyHQ+VmgVKkV/eaj9LSV8xkBsZb1pAHPonwgpTmcB3m7LHGJFr1mLpI09Q==","shasum":"0b72de952c8814da10d711db6fa51a1597983ef5","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.6.tgz","fileCount":11,"unpackedSize":28755,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfHtLjCRA9TVsSAnZWagAAJD8QAJIt+WB46gQa7NDNBllR\n+dUJlBuECSAwzrTNSE/MuHHV++M9YlMHbIKl65HHn+y7Xlx/QkjejhElNI/f\nr6yoS+9JV0UdJBR7366KARp7jn4RserEfUNrdVWj4hcjEKCV6zwD8UvnDm88\nRXaQzjHgJ17bPJAmO2B831IgVj4v7NRVumK6zlULWn6F+8bJZSb7uW1DdTbH\n3EmK4gyd3NBYvcAhIQDlT9s/FFUlvCBYIzJpsidkh7WXJzOe22TONUCJeG4n\nxXN6CvV8PULDgf0poPkg+MwOCRY12Kah5Lv6VQ17vodldYMGjNbwT97/8WgV\n5qvQyZEzJsThVA/TdQ1T5iz3T7tNBnx5dTSXz5b3UnhQYSnp58aRf1nOpmvK\nVoZVMs1BXJM7dpuCpmqlYhhgcri7QJYnm1wmkKRVHWOxRAaqDodCXWIehuA8\n/DhuTGvJlN6H2EktiphUGOO1MkXi+/9g2tdpo5r0k8/Ct5VhPjmhIY2XxexQ\nItMXlERv3MN2t531biQdpga/wmiI5nRP1hD16rPXCwXHrUKCIUqJ148LvW6a\nhyHdmravyOT+cZLXAf3y0FFzGHx3OhdEDMWz5PNZXaXRkaDfxxjYLmviG5f9\nZacgwL/wNJBxGM7KsI4TstQfms4dyhlugyUFJwgPyaohgA4xdQ60E4v3qMtX\npXAU\r\n=+u/F\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDQbJTtyA3cKMNkvswPvFrwcu+IO2h/wW2Ji5TRaLbyFAiEA+15WA/l3QGO+wtjwS6LELv98/1BbCi8RhYglBYu5+eE="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.6_1595855586677_0.7218784046780948"},"_hasShrinkwrap":false},"0.2.0-alpha.7":{"name":"abell-renderer","version":"0.2.0-alpha.7","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"5c5665d3dc33e8da629371631f9b10ad219cb465","_id":"abell-renderer@0.2.0-alpha.7","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-7h2qLH/3FdpJiPzE7TU7PmTLCEXgLLo+GxT+oJrEYUCHE6cg/1Q1GcGYw0pvXal79iQ8bIeNUEDu9hQs/xZ4fw==","shasum":"13317e498eade924e358022dd53707f22375d5d8","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.7.tgz","fileCount":11,"unpackedSize":28968,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfH9quCRA9TVsSAnZWagAApYAP/1kQSF4qyBAZ40ewu5i1\nv/oRGysFnv1/dUOYRJBg+QDNfuYjBFV2JEdWTIEQ/RTzLBgE4CYhJIvEugZj\nJMjCv00qZYTvGzUmbOWcXH1fB1bp7ES+RXzxbi1qwCwSmBISTLklo+FSEQAU\nUNqRqUFrbintH6trmWpRv/oKLxIEPbhSG9GV7nnqIYVl1SbekBsPmKxBsU1t\nzLx7X7g+IyK/GrfdqOW9Bd/d2DqbR4D6zXynKsj8cl3YZSG2Qp0Sfo1DR6vY\n/KhKO/1yz2Me/ur/Z2wGBxZXKxoxlL/PAZZcZiDeE0f3NwHkIIA++19Ox7mh\ns7UdbRveGYEOpulZrY083oY52fMevpaO7tHIDBuYvkOnS5VEamapuJzbi2/I\navII72jppmotC6VIA2pg4raxb+UN8TJwCcvDv6vIfzJ5QvYTpjSyjZ88sS9c\nOtbI103jllen86hWk/Lx203MSd0fcJHI0xTpT/iqbOvnno+BD5/cSMku54Km\n3CTVvaMZLH/BmX8/bu6D0Mw5di+76tckqTvqXAL4HqWd8Bm54gzGyU8b+1Co\nbIdTGNhhjbecNIAH+iBbZcFeqqC99RF0sT1eZSm3groXDAjDhwKC3UlKvCzv\nRXj5RnbNwni29gWmAr5O/R7XeMX4vLL7LJ4JnlsS5nYhWkLJ/dzedHmd7KVZ\n7ldd\r\n=RHDI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBGgrdERP8cODRfweGCsiJSVCD14eQU2pWdo5t/pmDnNAiEApkyh6cuvsmsMG++axMhRwa6DcAOkwLyp2MGjTrRBotI="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.7_1595923118469_0.5547631801881574"},"_hasShrinkwrap":false},"0.2.0-alpha.8":{"name":"abell-renderer","version":"0.2.0-alpha.8","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"8a8686ae5a153cb8c9978f310d7bde8b3799a4a9","_id":"abell-renderer@0.2.0-alpha.8","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-VZfavljw1QtYtXgscnLxGwSB/xCBPm/lz/sIyxTW1dUEq1TOHDDrGHZ9iv6l7C0JPZAYaxgpY9hfMdOY4U0dtQ==","shasum":"6e092cfc07139696598630811a49416e89fd8c37","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.8.tgz","fileCount":11,"unpackedSize":29039,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfIQ0WCRA9TVsSAnZWagAAGBUP+wRpAyh2D4WV69WIzFJf\nR2dK34DkNpmz6jPdZevzsrVIDW3h5rGZWb3Pb0NOb3KurNT91FSKUHQdL4rn\n2xef8x5eegS1KPPIpuBEq/sh53EJfn4dBoQhwYlUfcIPBW4bkjB+uasHdqX0\nmREhJtO9k0zMOOgLKH/aUejbiUGvAojLeuDtgn5/o83g1S/NYiWlkOZO+XLM\nUlWYxr8VTuZYNzonHvZENsswbmcPGdFkkenlhQZQPSmU93hMu23oIkMX3aK3\nSE/gzXeHo6FrQKbW2jecERSWn+pF5ZrdIw9A45pcecSZUJwgzzpHraVJyqEn\nPuB4+QRfx+IGUGz/HG6ahQRSZSPKJJyOaRLW/X19Uf7D7rlQX8enSs4v8VVJ\n53Xdmr0NicT2NRTu+kpaCRpZTl3SToPEH9pJD/ZY3aUo/Ey1G7GkFdXnWZOH\n8Q7kAN/VBoCIYZLaiBP19ohM6Qld2FKct6/Frg21nELguktl1vanAsq8PRYa\n5r6d3K1NdH3qUJ3qaGB2xcpV/+hek2eFttTNpISxck9nO2W07YACfao3L3Be\nSI5kl5JdNZ07vOCRvuA0OWG7gnu+GKKIHyGE0Nu5F3HIYaUIrKVhHrGobrck\nOTK1DISJk57l5w407nWfcauQEqzIxzwdIJpV6NuHj7DDqAXlSlLaAXgdTZjr\nieKW\r\n=h11D\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDvYvcQ+VEVFH5g5Qq7VHp7DIo02fI0VKAHFtFZVURytAiAc8RdKkTov/wEz0bEY2Tkw7lgyQplbDKWFjw3JaX3aSQ=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.8_1596001558375_0.9841270052941067"},"_hasShrinkwrap":false},"0.2.0-alpha.9":{"name":"abell-renderer","version":"0.2.0-alpha.9","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"0f3bbc8ca103f5ee443ae34990db4c03e314ac2b","_id":"abell-renderer@0.2.0-alpha.9","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-mPTW8Fp9aRyIZVzF/cgRM9eO2A2RmfIbM6AzvDXulUTYxrHpljuxKkP8LoB862EddNopTB9c2R+gqwFNyQTYyQ==","shasum":"589fecd92771f782f8b0f317c394ff11a590bda8","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.9.tgz","fileCount":11,"unpackedSize":29180,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfISxRCRA9TVsSAnZWagAAoTcP/RzseOkH9atSoDocoxiP\nGDX6E1JD2DLbc/D4tUm8zZdMxTk9GshenJNC3tec7CloAta5632Dxact4NQL\nBf7+d4YCuOIykgkrLHrRNSV1V3p4lqOat4GPRL04UVp0FJ3mnlCWhv9j4/Sb\nPgrVzn/MDxiXSGKbGZVXAruwXXZhKVcAXy9mavm6OuHzDGcg04+9kMbCrhTa\ng1uWj9EMQBlKecucrMkZ+4To+E1s4EO4s26W176HnzHbUWr42RVD3WGi+xlD\n+6b+3S/9bgeTTw8mcZLIOmDCRtBy+R2H2I+9E7d8PR/1whCo2nxoiPn19q6m\nvjUNQKNZSSWdzp1/I4QkurJXb3U8lhCPUnIePyXaifHU2GIKPtJjT/6lSfZn\nS95ggvcAphvQJeRTy2Rc74JWvYj5dOeFoi1loqsFCNLPql+1dC+1MBc/Af0m\nxQjbPxfVU2kZB7UyoOJA/5PpoD5bmnsor286UDMyqRvxxsjY+zHsJ6ugWH0D\nVT2pTSIOEIo0tXz5amnfPa2eqS7pp8B6umZPRGW0y7MwO7xESP2qFAVodSI6\nN/+DGEn9mK0zh6D5cCx/bDC9shfKjSjIDr4Pl8ytHX6iOja6PzYQ8dzscHhD\njuar+IehkA4wDwwoJ3R0G56ko7pPEfNFhDO6FaYYtl4ePJ3BzKu3t5mxKIiD\nbsOk\r\n=O3xc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQClNL+U6NBAuzK9Y9XpFSwOUS5NGjNk44x759YNDj1+ogIgbx0c9VW1pHitUiEckO20RX1Dq5430tEGesit0ep1zqo="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.9_1596009552719_0.7106510457682005"},"_hasShrinkwrap":false},"0.2.0-alpha.10":{"name":"abell-renderer","version":"0.2.0-alpha.10","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"abbea958a254a35e75e6b86f7db01f234f256198","_id":"abell-renderer@0.2.0-alpha.10","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-0/m0Chgmo5AGKP/5H5G5wN2grtKdpaiOtH41TD0r/bBUao0saQSVB+4QkjzPh16W2YHWjfJXcH7tlUXOmBypAA==","shasum":"7e236d0648a5a31d5e6ffee7dfae52347eea15ae","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.10.tgz","fileCount":11,"unpackedSize":29288,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfI8GvCRA9TVsSAnZWagAAVkoP/iD4OWk7sAI1zDajM6vd\njywG12zCBvxXsiAWV5lzxxlxxjqVEINw7oo7k6K0jBHjTttquitmQc0JLA1i\nRDBxSYDNfsj27cjV8nGLyGsxmWoRyLGk3iwPKY98oM5/2yEaWToT66ZsKPnX\nyRmfKiQ3gBgmQ18dTq2O26WTgYqGko4am2E9a42LZ/dkILSTNsLwq5ew5Ofh\nswd2p9sZP/Koyun+sUn24cYFNmcbJLN7fSPogFi9sFPVrvGCYjvPF6Jf2VLA\n58F6by6aGW3dTNMYFtrJCugeJvRlYQIURbj4ngbVzFhxOhA6jbi9WMfJ4DNx\nDymWxpKP44q6YdtE0lizS9Z/4fC52H9/tpiVSZRchSnXXVlgLAjE+nEaiMUz\nszw02uGnQVzgtXfsi6ej0/R36NE6+SjWSIcLxeQyYcaHjhJdyNqPG4MMbQzK\n/jgdvBOvRV69d+yKdGid7/nR07IKbwusncSE/pGOzofUwbcHvcQa1a+4I55Q\nC8Z75l/4BGFQwXi5/1b4AZ/wF303lrM9e/UM41tuCSiPvdPIOt+Fg9mEjIjp\n2OWkGtIB+q8Ae0DV6jRBeImiwXjC33Tvs2oOmNLK8gza/tVoumEazZjFJE9D\ncvLp3AGRDr1DOcwCOzFM3MP9JRot5JLCFZvqAtq6P5FRYO6jtPt2c9DElULJ\nf1b2\r\n=whei\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBAow1lEyMxy5vVOMaCJe7QnUDvkjk0Nfz6EzFyex2F0AiBjmq2j92E6mwf9oj/M5S1OhFCblekeQX00Ruzu1XjJMg=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.10_1596178862997_0.5968049582706345"},"_hasShrinkwrap":false},"0.2.0-alpha.11":{"name":"abell-renderer","version":"0.2.0-alpha.11","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"0818c6ce553e25e1d899fc047c72f7fe5f85f5aa","_id":"abell-renderer@0.2.0-alpha.11","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-6j5oyoJbMSVsGJhBBaOvL2ZZ06OCjnFR2kQ24X78mNO/tqhk4ZB7nhq/SjTxyra2lZz7qHliRRBTlEDMT+QX8g==","shasum":"b27fbdf37870cfdcf2a5d14df386cf7b58ef859c","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-alpha.11.tgz","fileCount":11,"unpackedSize":29306,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJSz3CRA9TVsSAnZWagAAGFIQAJLVtp1iWJUTxWA8RGCP\ncO+4X4M1cyQF1rqbdO9UfcKULnMDWXY+xF9K/uB85R0lmAg5cxVDSy9SZqiQ\nhCERaY+l/S+A75ojSENB+2HYzjktWsHYjXmxQKdzy2BlE1LUMNG/a+ir7dWS\nEdm43wqqTj/D7MXsDlbX4T3kpxxjhpouBcjyLpoOSde4lBpvfTWu7W855HOh\ntTI8rdkTFY+VEAStm5GYfpIEp7Jw7zJArwTK8eQljHf4YrM3pywkkkgmLMdl\nl+RwDFUGJNi1P5m3j1/Ad0S84f7KIgibNOX1VMuLcvFQh638gg4XNIO14uUI\nj3t1O3uiLZDLAoSr0UH51b+qGZM2HJdlL3wqmHZTDUo5M6POV6Veb3Opa1tY\nMaVWeSsFai+XDOHW0iuhdu2hrmXqclqKXNApgrOWzbhTuhnu215xalB9U7+D\nZ8CKpleg1CfzP/lapIpc0Z0/9lfOJpClrOUqMBgajUMRl+QDMPLS7hGXCXjJ\n2Shrpbay8gis1OoS4c8s08k2Y/U1WoQH2FmVlU/VTNTDH+xXlfJnL1DrzhPU\nJa75uU0yDrQOzujD2ug2sX3i6ddXR0CGmkygRKsf/Jai5px0RDdSZ6M9u+Qx\nuP4nH+O3yWsbfThjsIX02Rgs2YCNyFqoxVVzT5n8ZaHl1KVtaiN1uSszAAga\nRGYE\r\n=UALd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICQEXx7XDGfeRSSmNg4+iaSsWwhqpIw7NKieB30anM8SAiAm/0bSa+EP5THtByog7scnplVOII2rCmlf+BXFlNyaag=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-alpha.11_1596271863163_0.7033143459974713"},"_hasShrinkwrap":false},"0.2.0-beta.1":{"name":"abell-renderer","version":"0.2.0-beta.1","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"eb0c4a86528522903128f4ddb611084dd38c6677","_id":"abell-renderer@0.2.0-beta.1","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-nsWP7QBVOdGDjGsspR6lU7LM3B7ya0basFhQamVHUkInhZL489tzjnUTGj+UrX8PU2xwHFHW6MBbaykjWko40A==","shasum":"894acb455c168bfc17bc378c9ea87a0b860d5afe","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-beta.1.tgz","fileCount":11,"unpackedSize":30382,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfJqBKCRA9TVsSAnZWagAAU5UP/1syEvCk2KTbOn75mmI8\nojtaXoy7qD4ML2TWeNN9VDTbMsLwfmhFIkcwnpcLS/GtNi7Kz9HuG0pmSYKT\nkx19d4tor4tdVUsaBhUaSROXzz639qtjlfmoHTM/HG1vbHA4PyFv7SXfX+cI\nI+7QqAXji6afIm2lAb44OQkoPdHAARb3+RDDebObyi8OhpS4ZSl8SEipQTcu\nLcyTyhin8um13wZ5pZQaH5SvMWIwJh9PYcACAclBDYAy33r50T+97H4u1sbD\nOcq+FuBd/N5icPZ8xEaP2v0Xet2TTY1/C4BvyJr7Of99Nm40BCx2BZ5swk8+\nH/6Df/f5tIoZHlDQIDC0xRt+jD29NGzJ9TzcLOOMCK2fUWhah8aZMH7Ti/hA\nuCAo8vSBbdMo/tKdcn4gRc/I1ziV9vM1KUa2LYpCm8Vi2HL4GAJAK1/knOsy\noFZ8WUmZL28Hgu6ibmjZP8/ltLF7OaHAQJQaAz38ecZqHtd2Tya/f+9cixc/\nKO3pl9YkEJ+FkOgrtouyB/HF7z/RJBaDmh7JxWszjk17tLcg544rjIEtkRd1\nfhq6wRDjFkxuDNvxEgaAD+AfHQdKsWjy2Rzx72H8S06Av7IQtIjEhSL+d2y/\nZ1F0YO8GUsLZoHrkr8gRU/uEitn+PO5ips6Qi9ieLBR0tGROYI6/DZFP/yAM\nbTpR\r\n=ac+d\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGui9zGGCRxwNTCgG4tBayVw8StWzVyjOitN3FR9wDJGAiEAxUlumezgAh2k0SQ1SaNZBPo2xtNmKljQfzKmT+FndSY="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-beta.1_1596366922354_0.29066406138630163"},"_hasShrinkwrap":false},"0.2.0-rc.1":{"name":"abell-renderer","version":"0.2.0-rc.1","description":"A wrapper arround Mustache that adds some additional features and some syntatic sugar required for abell","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":[],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"1968afd127c3bd4b425b018800d634165c70a88f","_id":"abell-renderer@0.2.0-rc.1","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-I6NASO6qzQuAC5q7+HY950oyaddOqQ0t8vz+dqMqHdRIc91a2/a6IYZSEyiqUBM/kUYzs/utv0lwuh1JDH/zTg==","shasum":"575b0d6126ddfc3861ce7346cf3b921aee1687d2","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-rc.1.tgz","fileCount":11,"unpackedSize":30380,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLDGgCRA9TVsSAnZWagAA1BsP/R2BYpwesimL3Ur4k21+\nScbFK89Dz0Thzr6+DTQao3CfQWr9umL3zWUodbXoIZYE54fLQ5Q/HCG+gcJ3\n1YzT1uKvi47T1/Ou+abFhNytJnecBi9jfM00n3lWqsLwmJE0l8mL3BAj2FAo\nfizGh69R+JAWfZXcWwrxJKkx6/pSO1Efv842TWZATvIqNEF6Dn1Zc1FkY47G\nScfGqryIQZBIDCzOZ3dATvhpPQRM18gvRAl5njSaXavTn/2GXSqnBpVRwzHC\nTS53tE7+BfwuIMFCchcQH3S7vPCppUY5Nu4pRQJPJssjyMNfUrkZfkSuRTBe\nM95Hvr/TFVTmfET47WXvxgJQdNmxYj2P/HEV2jnmaciAkgOl42JuW5djAgOM\n3w22Nd0I+h3htcrwt/aS+OP8b7J0NrrvzwUVyeHOqkHqyjbItDTAuffFqkgZ\nqAkDUq570N+WBEQJOY7eBBv5+EDJc28DIQUVd5mY/q631i7p8GlBpYs7tR6y\nam2vXJjIv/S03yxYGfbHphYVJ1NkgRkrlVWmaChti3n5oBodsqXJD0jhSUrI\nFqiQP05w+H6oiTEFZqIKwetAk7VICrh+qfs1JYVUBAqv5CMvw9bsSXQKMnX/\niycIWl3Qxcln9h4iDrOS+IlNxWcMHHuXvRkHx9gO06DlCkNVDQKsd/UkI9PE\nQGr1\r\n=qUv0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcbF1fGEGo4Ebjwtka+PXCeCkzxrwEditVFeZ0E0q9ywIgYLCXxYN6uiEcLhQaYar6UQwXazG6s7eXRcJGubgt/iY="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-rc.1_1596731807767_0.7881717012554035"},"_hasShrinkwrap":false},"0.2.0-rc.2":{"name":"abell-renderer","version":"0.2.0-rc.2","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"c69a5f7cb6704ade74f5faaca6e67d3c8489b01e","_id":"abell-renderer@0.2.0-rc.2","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-A1//3EPqTqRRnXDbmgIRq9HrvhOvYrzFi6gsPJkOUYq5CwTnb6Wv9d6oYPwzTBd5fiiWnx+qu3t26A0llFCZlg==","shasum":"b427ebc867017f5515c8e9144ad46cab74db27f1","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-rc.2.tgz","fileCount":11,"unpackedSize":30764,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfMmz1CRA9TVsSAnZWagAAVIIQAIlYzCmj19F+tqROfptF\ncGbi2qGEthEAFMgrh2QidZROO+l40u6IPUdHfo2RHYigYLLYfYUWbUkXC7Q1\nrFRYUhUbfAo9LAzjj9GhEY4YFSYeGX5rysA4DEjUedpkjTRa6xJfedOJiJXh\nrA5ljhDM0UmFae8cxgscibPV2dAqOoNY66TIkdmaT2icLmQVSy2q4G4Ca3iG\nUJ9WcU7TOa09gEiUK/vzrP6/qG3oXTkW4Hl8LIqReAAQnFdmxtiphWh57H9p\ncQd5Xis4fh89/GjOuEU1c3t31aLRQMnrQZ32MsJqXJS84Xh++qJ6gh0UE3a0\nWwmWOQN2JsNp0ggNk3Wc20k+fI3Wp8AEggwSwQlaLBmd+0c9TJQRhq1Q/W6G\nEanWJ4aOUmhFyGAb9WPTyFuSSy8+Jy+vjdeRjPy28PMXaolvX9RUrZ3wnjaR\nby0n3rz9t2UPSPwTu1liQAbmUqSjMlcMdqhJPsXtoBQlIuGPcFPNGBIY2wzo\n4vnlEjS6mQ+1X1KoYOGoDstjvY5amd9TLhdpxp9/y1FmDgCWqK+XzYRf5msF\nXEt63RV02Y0PAFER7Ltb4CtVK7PRGxao/5rOkbyTh05EaOXYPyIopqmgWbS7\n6C0XCm5AzEZHe4wtPuq/MnUXQiL6W/DmH9w+s6j4jRyxMxZR9eEOP7QHmFSz\nSGjQ\r\n=zJFX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE/V9uSjMLGQarPaBxOyd2N/SHZZtLN50vHBO2cVe+x7AiBzsKRgCDSJBJmztdgYTxrizU/xy2rakYT400bKeYjwfQ=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-rc.2_1597140213295_0.4542367638132494"},"_hasShrinkwrap":false},"0.2.0-rc.3":{"name":"abell-renderer","version":"0.2.0-rc.3","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://join.slack.com/t/abellland/shared_invite/zt-ebklbe8h-FhRgHxNbuO_hvFDf~nZtGQ\"><img alt=\"Join chat badge of slack\" src=\"https://img.shields.io/badge/slack-join%20chat-4A154B?style=for-the-badge&logo=slack&logoColor=pink&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"3265d3050b07cf2888ee4388f232a990841b3cb3","_id":"abell-renderer@0.2.0-rc.3","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-9omBnmwGHGoGLA+I8fdEZ1tVfuqqXee0Y0Oj+nY2vucXpkJKDgq8ovDIukyY9eKXqeU7sJWkLfnSWdDQHEPWtQ==","shasum":"19c923378a2f42fc2dcee6bf71e8cdf18b3b5511","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0-rc.3.tgz","fileCount":11,"unpackedSize":30844,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNsXbCRA9TVsSAnZWagAAy3wP/3GbriMTqCF5l/SN9FYz\nAYOFclxqQOtKoizEKeHMp6u0f8D+Al3taBBLwNl25ccFjIU4WszLmjED+BWq\nGSFhzkg4bpVM/oQ3xMj0ms7u1k7uYh/KpWBfN5qiVMSwuIxZF56heZwOrtgi\n6uWRHLnbo/Ji1hJyz4zJtADAtR5zVwAzqzVkhYLIIAHoClXbgQ0PH9mlk7lX\nr7k2WTnC/pTnU5VL0Qq6YooktSE8T/7XvKSY6b5G2k/pigzcWwLLy1J+2q+l\n12V76dntKesX1GjduqgUbpRlOHTaA/ljQUStmhECxCsoZB8I4mziS4JvTaoF\nn9llK3TDfLBwti73RpqL8LjlnhW4UeZFrAyO1UIwjq4Htl3YWLk/DczaN2M8\nhsA7Z/uykM+kc9LxLnQWP3NuDrGpS1BjBH21B2Ypv/y0oGtUoK722RubjEpi\nhTIT4PbPcjC331yw41vSUncU5ncKoyksexB3KAXNvgq+1fGt8Y8r/9iCWlKT\nEl0aEuZASiXdk6hDcOS48VI6hHimJKrrrk8XNX6daCHnS4yxkDf6otU+DNvz\na3j8HRkVXpGMU5Dtrz+rNBFY5ok131Ju21wkm5iwvClPDCaxZaHGPbxPuJKC\ntpCtoPVsHXittUJiiiOa2BfDSWLWfxhZAHQQ5DplghBZWIJrDQdG74k06TIE\nY7iC\r\n=QQcT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDoLknsR52eQFoS1DMkDFwggcJ36NVc9EER/S413vwouAIgCpNbjErO3G3JqQjeZKjgvNiRLrmhhhI2DaU0Rk6X5Ow="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0-rc.3_1597425113817_0.17882287142611109"},"_hasShrinkwrap":false},"0.2.0":{"name":"abell-renderer","version":"0.2.0","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"mocha --recursive \"./examples/**/*.spec.js\" \"./tests/*.spec.js\"","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{},"devDependencies":{"chai":"^4.2.0","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","mocha":"^7.1.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"b2bcf7cd7a2da6644cedb0773b68d7bce6d35d0f","_id":"abell-renderer@0.2.0","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-f7xgg6D/McMBvsaERXqXS+UOXYxNITsHYnODkElDBezU+t/YmSPVYB0Cmcz7zvkhYY3Bz3/J8rzaveOx4/t2QA==","shasum":"5c42d05539949244c57ca1d870fdc9ffbaccc4b3","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.2.0.tgz","fileCount":11,"unpackedSize":30710,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNtgyCRA9TVsSAnZWagAAy4EP/14k9ZZ1QlrrEhKRHtdz\nYpZQdQViqmuPixoKu4zc3fugF0SVFTtB3cZeEHWhDDsEX1QJ9SkoOJv+VCop\nKhb0ARKtINKCvJhJeQZoVpYpsmeuxTBhm9OXV0qhG1tJhv/eF5YQSr9PRPFq\nvlTi+wUx7TFTM5BiGGY8IBCQoK0pFNKNyB7LJaslZwjurSoJlIRAcaNFiXtn\nF26eV/WMbzACLYAZ0c/zTYVsO4Wju19D0ONgQrC7gK/h/KSBHZCicp1plkD7\nKcR56MGiXEsa0wKf+VsMDoHpDNiXN9j1fCj7YmJefcKwHUFkzCBbEAJRb7I2\noBGFDU3f06T84s4vrNF9icHl9Ijr6SBP+t2w+86ViBIwQiaIOlh04tJuWb6L\nPelked+Qmy1gGOiEUVnh7iCN/jtd4a8KiD6V0bmJzmgEzZyZMaln2xT+D8md\nKEubcGjTfEMFMsVKxs3ns7M4+W2qV6SpYyMu6CxO4btznOdQgzRnnOA8zoL/\n8bfDtKXFo9+qjqBP739WFOX0B6eq9TC1m+f3ylK76Slvd148KcllthWE1RRL\nDnmNd/mdb9m+ePdY2SDcKSGYc3NLeKfIMUZIHdxAt0IFk5fyKGjJrbnExZD6\nwo+ov7caV1+mikeYlqY0loi53StqDQE+8FLDh5+rsxA9avt8B5d9rSlL+UAa\n5tb6\r\n=Kddn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHs70wjpSCAYn2Wt4pyrKB2M+YF0DB1PGb7pL0Hk2Z4gAiBl5PFiBgby8Joxj5TeATI+r1Tysvci8p10p1PxMGN6Jw=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.2.0_1597429810116_0.9546304027264647"},"_hasShrinkwrap":false},"0.3.0-alpha.1":{"name":"abell-renderer","version":"0.3.0-alpha.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"df8ed748ec2ae62dafe2628868309ff561137253","_id":"abell-renderer@0.3.0-alpha.1","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-iBfKRbpfe9ZvKocE77Z7S3cbKPbBgkHYnCQukurfBOGD5bz0t6dVzKZzhrqSIHReYUPcHqRGYgH0DkGA+VzVvg==","shasum":"358f46f0741ebbf8fd6d68b44bfa6e28bf36347a","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.0-alpha.1.tgz","fileCount":12,"unpackedSize":34231,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfXyqMCRA9TVsSAnZWagAAIGsQAI+WCwSgbUhNgXeAzPeB\nUEkQzc85CRKEa7c6laDaooAoFTAXSsHA2u7mQ/s2bkAxz0KwTN55D3zr2ePx\n6I23zq9XU6gnmorKyZMcOEphosbUxYAeJQ2kJ07UW+pn/n6a0s7iO3a/qDBc\nyYCqIf8SA9wmKuP+nBKiT1fv+LeduzcUX72Hdb1AXylpN/Yf2071NSvUcOnW\nhXqyFhwfqs/9aQDeTh1yzQHiyhhPDYvAP8Ih7h1l1ILYeryc/P+gW6dsDqh4\nNwdnt+ezaUIlEc0eUvEmI438hvZvM3K+VGG1zwAJ+YiA0MGG84p1ZL4lM6SK\ncHQeO6gy1+gPvn8h9cZiwjw/tRYJjTnAN9erSy5IQR5Oyff1zRGCugCWWk5Z\nhc4ZJ/fiKwI9wozZxQ2piJHbBL0LsbieIi2copCM1v84lp3NL/iZaEqoBbBi\n66b235VZbEaiMK1lBcgX8dDEAmzDsBk6Upy9HJXuSu8hORUo9wkIoUvZmpHS\nfN+yoM5V+FsJEkEsiYqqo2drDe9JEMgFzfVY89DH3wL6h8u3scgFoW7OwVhP\nY/KhYUHUP1noP5IOT+//GRIIbsvdYkcbbY3GiVCexzYDJfqkIN+QDklI17g+\noGZlVgJL5e02KF9RNUjnKGzbXJG07j+wGGSp0tfa57lfH0sxgUXuRRyXnDuK\nG2mj\r\n=E0N+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjhQGZBO65qxjnZMat3+hmaCmrn2oXk5PkpzKnQ3nWbgIhAP+7/cZ6TyzXBrYR1Ae2gYKPKCfmfBXQKro+z8jGtZoP"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.0-alpha.1_1600072331859_0.9847356150724835"},"_hasShrinkwrap":false},"0.3.0-alpha.2":{"name":"abell-renderer","version":"0.3.0-alpha.2","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"8a0edf1966f419a0dcbd3ddc15e8d8367136a1ce","_id":"abell-renderer@0.3.0-alpha.2","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-D6IydkigHBxGCTJwGJCK44eUXhgfMkfOfTs9VobmV6XrYb4XnkrWshFAhUfEiRzxAf/YhbMY/yTTUO1CdGi/Dw==","shasum":"f3dbc2aa48aeab6e31c852251cd4eb02bc35e300","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.0-alpha.2.tgz","fileCount":12,"unpackedSize":34704,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfY5GkCRA9TVsSAnZWagAAZo4QAJMFPXktooFxmxLeHLOO\nI2O0yfEdsy36WlNOW9/EmFBqmltKHTesjv1LIYdlQWEAZSmHJ7EYK1Vmv+Ua\naSc4xEBaoaTSPfwwRkb0/9foNgGsodM38eVwfhPro5JvHlSenm2j8WF5589e\nHZiXHkJXGOe2GCIGDZbxwtR6n8rPJcmSc/gZY3GeTyTTsMPbu/E0qHnzKqH3\nekT6WiUQUxI8DTw/q2qIf5IhSL+xyQpUZC6EIqy/k2gWMzvGvf+kQQJfaK52\nxQEG77aLZkEchwpXC5GWhnzwiwTzeRDUacJ+UOZWuDcDt1FaAJEhQhv+LCsw\nSyZGqA+eYD7B6LOP2Z1O0aQB+oqk2hj8I5/EVSXhPskWgxTmM3rdhawJi0oV\nPaThtzIDQTdr/Uzur5DHPkVWY+Yr7ctPpE5s4i5JpB9UVwA2ksS7UeRgJ2Au\nJoVCs1DeLpg0a5qPQXIKj8xlJ99pjp0GsfFT4dxtSA8JhsSNWFopMzFJU+0F\n98dzGVSQRmzUYevk25yrr243yFJJjFqET2T4P1ta/zRIXYi9EUKfsg0vq1l+\nz8OP4F2GHkk+10UZ+W5/1On5X1bvZV7tbXU04UWU7amqI49oZT0voommfxYP\nNDedolGlY3v2Z2r7Xow3aiQ816DTua2hCP7m80tx16qb0zmE52NmwV/IAEFe\nngxA\r\n=WqnV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9QpF4Tpe8Pk+clmAVKlsg8XqKHD0mQGa3W65D6fPw9QIhAKvqXpPIv22F8hcXrO/L53eL0y6DyF5lIp3BkxHMEI7A"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.0-alpha.2_1600360868184_0.521591647187069"},"_hasShrinkwrap":false},"0.3.0-alpha.3":{"name":"abell-renderer","version":"0.3.0-alpha.3","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"a039dd9dba77b0b09480fa231752a8ed21f02e5e","_id":"abell-renderer@0.3.0-alpha.3","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-CYZY80Wa1DBDPsqLU8l72D4wv78q9rnk31LiRoJrc0b7UVtMkKkFoioOr19sWdqoYjRmvO6RPUFPCQQ8ioHzNg==","shasum":"76324cd1b10ecc1a97b582aafeab60fe87eb1b47","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.0-alpha.3.tgz","fileCount":12,"unpackedSize":34786,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfZwZ7CRA9TVsSAnZWagAAAVcP/0Ksx93Si7n0YzFg+MS+\nVjxLpTELZu7u6AwCsWkequbTzpPAhDM9m6L8e+VMSurIvmHkNQ32fMiKgxMW\niQEOduxrj9lNUvop0uYPtp3Y45LiJIrZKc4BdE7toINKm7Pgqv+9OtIHdDFZ\nUFHyzYhdXJI1NiBDkNUUgyi7oPTW/KckI+eVoNbdHUuHxROjLQwpqx6yTcGf\nSWMU/Qfahu1ESXedTgWERTtIamLfgvapNPO/RF5c/yaegVeyzZg5f5i39Hr2\nd6OSb+wFQk9o2CTjKs6ljo2WdSAWypDMNIirIQmog1oJpzwUHVUaPQ9EWTmd\nhtAf/fd3mfviQalAMDeibJC1aGaC1C9D9NsOoBLJ6OzrfjXAnKEeUZ87M1Mn\nBq1oAI4qSRxuq3Oh8bsekefp+ytlOaIxy+k64aCaBnfE8GQLLRseveMKU3dH\ncRq3iywnxfWaxVfGR6UndJmAdrmoRa5TLDO8T5tDK57ZyppYmBxZQhHYf9Bt\nXb2mP1b2C3dhzrUSUOk6/UHqZOFXw5U3nog6FBf3lwlUv6ubM0XSMJefNtil\n3kpDoFZpY2yQil9ZUgM6BkrwdQZeWOB/xVc/2Q9pvM9i+smE/Npyk/2440WX\nNqtImvyPzoqq4sp7vAkzeD/VepEvGt6/6Qb1Rx+BbjzrI4QJdR9tb73mcaz7\nrJtW\r\n=/w9Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICUbFBl2b1xYaw15n3gFVX+x/MuH8iV2nrEr990VS5h4AiEAzVq2PWEa5/bw2QBW0WrJvrCVGga+3pP86xYmYBJxLVI="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.0-alpha.3_1600587387070_0.35508689011058614"},"_hasShrinkwrap":false},"0.3.0-beta.1":{"name":"abell-renderer","version":"0.3.0-beta.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"c8cc50d6ca79feaf9a72134dbcf5696236e76cf6","_id":"abell-renderer@0.3.0-beta.1","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-5JkIw1GS33pYQwYoBOeLkUMbWv7D/yC8ryihjfyZTkVWnZlPJ3N0x5bUoykBPadS60z6aXIZndRwOtC09AJptw==","shasum":"d6b664bf4e57b16b0d20c4fd4ae95fdcf70f5f5c","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.0-beta.1.tgz","fileCount":12,"unpackedSize":34843,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfZyc9CRA9TVsSAnZWagAAbZIP/3rX0Y2XTIXtomvZtXAO\nAPgc3PDhKfDnBcAJTz3FjokCPcFkAC90EYa08LDbPVwqdmkespsNWTRHjc3y\nMa0I32wUn2/o2rlYD3oP9up+2gQSe0lYBm21cZel6Dz4EWW/EOA3aoazbHcW\nA5Yl3W+dxl4CE+13nAV/Sok/+3dsXb64BvKFqiJVWwlFO87oam5NzqliOjjP\nhrmPSv7KQh9c49mbKf6Be2UI2dLilpu5+srVJ7I/khZSDJMjSQU1lfd/8pKy\nq3WDqUkinYDpknGbugA+cGuE8yUMrEoQbdgl4tVd5JBLgYkgjggPkcaxLbH8\nxRbxv0fYoWhGc85p5o9sLbt/hOJPldqf4Z0k0IUnXIDnHrrvu9kUCY8zYrw0\nfow/z5yJygmMvYs1FtqcYxAUg4NtBD40efIqti/LYNfNjY7gYKhTnOJWg515\nRAs3v1DcDH0gsJN5zBPc12D8pzvQrEEMRjR3KsBVkJiul/BDZF5+9I6CE5Dn\nz+z1x2OKLgiQLJMQNVTYLKg2H/SNEA4rTt/S5uAlInDUleDx3qzJNtzsa/dA\nFLy2V314wsdL8UTZbEZVchKtKaqcOmEsg1Q3UK39ylKo71dWk1LrHcGiZ5I4\n2z3SxSQ9ljitw9KF6hcqUs1biugRQdEOc0XnHWfd1Sjx5cmE4tgvgIpEtT4Z\nHA/U\r\n=FBU0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDpnGqbKXvcHfEFTkFbILLb0IvPjosuhczY63s7eJJQ6AIgCWwyOzfeDqxjYnVyc17h9/Pk00FVD8Lb8TxKHeKIcf4="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.0-beta.1_1600595773475_0.11336431302315719"},"_hasShrinkwrap":false},"0.3.0-beta.3":{"name":"abell-renderer","version":"0.3.0-beta.3","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"4ca71bb5b00a1596ff1ca13048ce9b03b296a96a","_id":"abell-renderer@0.3.0-beta.3","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-7v5YQCDizAY8mzVWaKQHav4G5oW5bRM1mGk0jfDpBKnkZkoR2RYniuKn6qC4qK5ufgDiZne0mBuq9eFTnLfX/w==","shasum":"01e41e7febf8bf07b0330bb7bdf364b0e5b73a11","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.0-beta.3.tgz","fileCount":12,"unpackedSize":35932,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfZ428CRA9TVsSAnZWagAANpcP/0enn67aYnDUG0GI/SfP\n88XIfklV72e75Vi/HlAVxNBjCn3d9D9LHp3E2WqU32mcUIv/VK5I379l3oCP\nCqfe8uVSXRQ0FNEAkJGtO512xklVdYTLtBtHx9M60wr8z+J+T8U5BEeJfXnj\nPa+2NkddIzIocbLi+7LVXIDT+2y2XssisLwnXMtby0/19lutqgRsZRcNL/fV\nhwKdhO6cLS2fYG/gGWUvm/ZxJCx90HIYbq4ZvgmvtHzCGQI4TxoauHmUD7Vp\nSC0+COVyk1M8zYrOfL3b1b3YD3r7vuqfD+c/TPHXTlWNz5+RodTXF6Bqmhmq\nhMwWvM0xkzBJWva9aGzuN4iHix5HDkNkgxCpD8Jjsa9UeL0KtxBeVGoIwbbJ\nfI3OQAWM+QVai8JVH+42LZjIgqAwG2lkdLrAdNecthksuRaFQP/wgNNzPGZ+\n1cbumfWGOj3EyX/QJ66/XiSK4q1IQ63pwXioPzu1W7YVG4crCgvKwvOZ4L9T\ncXKIC6wNu26v45cNksOou9WZ+EjZ2c8LD46ESrLEybJ4uBfiH8Yit7Xf5uJz\nq8eeAxDMSqiNlX/Erw+qDSlcA+7y4L/YX2uf++BMITTCdGTn8NDYxLCGmgFd\nPCOzONnkl85xLm+CBK1zWIGWHmRKbMbe81JFihZMKGUnD80/tsk0OiUxJtoj\nYibq\r\n=PwTu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC1x4/3lP1H6h3xp0yNUZIveE/5/9UymrwP5AqDgJ0CvAiBaYuUH4FMaVptizomiT9I47wxJ9j6YHR6h4KssvCsc3A=="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.0-beta.3_1600622011579_0.6026696459777043"},"_hasShrinkwrap":false},"0.3.0":{"name":"abell-renderer","version":"0.3.0","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"a8f9a9836eafd46e83dfd8830c51245439b7cb1d","_id":"abell-renderer@0.3.0","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-wIRqPU9oL+UzbtUjERoZqbkjvovyxqN4u41+PfBj0Ve41dljh/No2rzr56M2MePIp76vCCv3SCiTw14LgNup4Q==","shasum":"e5b2865e338cc695745eaf0786db43e48b603d74","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.0.tgz","fileCount":12,"unpackedSize":36009,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfaE6lCRA9TVsSAnZWagAAZ8AP/185u6I4B/IP1uaQ8wtT\n/rnn2nvpPzgAFx0mLz0ApfUCqoFT/yXWqdb6BFHt7AOoxHJ0k66fsfu0tvwQ\neSHnGawL8ugPs6bDExn+v5mVbkHiGAGevAPU4pzyoM+dHksjByEGooabJTIC\ndaKpIbl2UJ8IJBtIPe1sN9mvIackq6+k0WlLjAmgxhn5IvbPZXFeppmqXCVc\nqXEzEAxnom0mLgx3CzBksEnsLQuS7wIJUZ6STkDaUUv21gCbhBINmRS+6Esj\nu+EwjkKFeIqAZnk5eG8GnrsPrXBrHGMdKffsERX5u+9ZZOZr8IEfbqEIAiXI\nq3yhMt5zmkGjJjnh+yF/DkhEdQQQKJ9y8vIo/o/p773ujB53tqxYCbDFj73x\nxl96B6AweJdYaoz1c88GelFrg9UL6pPTtc3EqW45qGCMT2fGCwYgI59038no\nk7BJDLh+av/NdqJUgdhl5uMW0fd1pawf0JkY7EcSzM3kkcCFt95K/m76DI5I\nXMv2i6hsiokJZKmm5LqdpSGiLw9VbTZe4bM2gYOBoBqikXg4sYpbZP7hzB+3\nobJATPRRV/B6Tq/9uulD68lM0NwU91FQ7hZ04ZbUa87Uq1qqvbnkJgCn0Z+e\nC7r4lZJ7lGiDg/pq8aW7xuF256XtysWBCESL3+sdMk62SDKoSN5AZo7SIVFs\nfW1M\r\n=lvmu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDniWJZrUp4W1u4yoLtaY4f3O9/C3lH8y9cTiGnL3Ls5AiEAzv2omJecgUh9WUdHp1T4yj+cy4BG0Ys3ZHn753ASLNw="}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.0_1600671396714_0.2894033096576729"},"_hasShrinkwrap":false},"0.3.1":{"name":"abell-renderer","version":"0.3.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"dac466001a358a1850a5449e30a4fea1c423f806","_id":"abell-renderer@0.3.1","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-dsU0SpD1jFT8kNtl2aPjVhgtg0oxubei21/seLX2weDgP8yDdzZekgxLpk+VdkipO6FsUtWx/aU4T2YIKEtLlQ==","shasum":"c34a215327b6bdf8800aa72244c0fef6d966b23d","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.1.tgz","fileCount":12,"unpackedSize":36243,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfaGb9CRA9TVsSAnZWagAAwIkP/2Avvw0UU2SNTy+0+j0E\nCbdRy+NknIMmgSTHWyCaIGAs3tNcy8YoIw7xn1A+iDbXYoq8XBhqgS2B4F1g\neyntamxN4tldQHUhYiEFgmMcvLMXld+0PkfUADhTtAMnZRodiHePPKii3e30\n39EfgSU3OASCJZdr0erDUjxeIjclYhBkn1UsBFZ9D0BhK2gqlRbbsTkgbQ7O\nmOjRuTffGbI1r/VKerjcofd9jXiLJrcacb0aSE+vZzCjHF3Cqg5PoAmU4WOE\nJ58YxyLw0Y3ZL9RiotczkixR43lV3vLVYWe5/IBrBtGMiscs/79XYnZjELZF\ndrBNoadBoUp3JFoprF7B+jPDKFjNrDAA1iZ7qqLDGhG6/DodwSi6fs2yvaDS\nEXxQHnTemuWAxE9rm49uLjzNW3GdgIYwe98MX77nrJWdT7nE9d7JWUnii/E9\nP8+h076kpXGGyhJzn0BnSsjzMg1s4zcIL6nbODYDdRZYzBOo1CH96W6IoFj9\n4qPIYQUszfNFFHEGW0oxyPB7/HQudPJh8PD7f1CTBU5tIUXqRPNkJ2gXKRPT\n0MQ8eTgfTyyWc15caVPh1nBklZmLpd1B8EBz3Ya5VY49TCdEKK7bgR9nxgzC\nTj+Xk7ySLsP+Dks8bO4eGQalLO3lzq1bdOd0tYnKbN0390bXlm2btCx8p1jG\nfZN5\r\n=6s9l\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDfhn+OAeH5vD+VNjLQjR48KdaA2Pd2Ri+GxPNtFVm6JQIhAJ+U+hR216raLMnzEklrTbLgRbgAaDOqPta1rUeLliqY"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.1_1600677628626_0.5991465885691629"},"_hasShrinkwrap":false},"0.3.2":{"name":"abell-renderer","version":"0.3.2","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"b06153bd663b2f5e88d4ae5948778e47bc25b969","_id":"abell-renderer@0.3.2","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-XpxS2h1iEofAf8ejQgb1rMNMcsXc8LvVB+zkio4NgaTPcQAAXU92GX+M2nVcharsJYa2vGsOdOADy7nJvJiSzw==","shasum":"66578eabeb7ec10a2c9ec9a972933be37b719dac","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.2.tgz","fileCount":12,"unpackedSize":36678,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfmuGrCRA9TVsSAnZWagAAfVgP/0oLYGHTMlee6IzyahU8\nQzlOzg+V/znziMvqLbZPb2k7pc9Ja9x+pz43aubh16Tm8zjiXFbDWYTGrs18\n3G6cujJHCNqxnv+tBNKZq7vFfAoQPbdYl/nSjohHXWdXsPIgrgAOXOKQ0tVI\nUtmrROGTUoRkGQ5e0Na5DwHJe+nbChYc2A98D0XZGg5RYES4tb0yjlqMT5z/\nH/32aQ65je4bDb1rCZrCsk/azMx9mSK/+DKrOUEeiBeuN+yS2trOryG73AfN\n8ayB5EEcQHgOLM8G4EjTa6YEaNBTUhk0so+xUANi7U/qX1LYbxHWqm7DVoE3\nCt76qdd7BU+IxV2xmSKn9zjxqh99ZDbC9SmCkYRm3UTeuuIudZURZALxu7e3\nTX46OmKeHvEsuQiudIJbUvMkv1p4habIjZEOWfqYvoa3uoi6rw+0smItHbXw\nrfMA1SjusDNLe8kTGSHvFMkeRPz/nCarTrahgAOzA5GN0yufAVQg9AxwERHo\nLbupgULgDYKMnme+6dlUbV/mPIJS9gXwUU+yR+M8zL01EmmzkAhKm3gQJMJV\nhDgyCudI4tjKT+tacxdeQM2G/KEGRu6aUvSPVujnUpLFSRsctBSPJv3N9nab\nMZ7BhXsdFG0Idy8myzJiYzXbS2rJPTIIrR7xAwRdiwccEgszOkiAwiInebG6\n/82c\r\n=a7rN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSDcLqg5F+F+KdYwvqCarYYsYCdo6jSxTglt37l/5vIgIhAPmkczExrZXrCnXSVT+7yKY/GHHX0k+w0VVCYvDiSFTS"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.2_1603985835207_0.9388142660477357"},"_hasShrinkwrap":false},"0.3.3-alpha.1":{"name":"abell-renderer","version":"0.3.3-alpha.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"51d6ab7390605a07c27be676b4171112bfdb4031","_id":"abell-renderer@0.3.3-alpha.1","_nodeVersion":"12.19.0","_npmVersion":"7.0.7","dist":{"integrity":"sha512-WfstanRISQRDYUKB1Ggf1xxaSkMOWZWqINxwM0mCcB9wskdxbPTYtsxI/qq2TQpIuTOrTIk0u9lDWu8p4rhYmw==","shasum":"ca28308458a0f02c12cf881d971576ed2e08acac","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.3-alpha.1.tgz","fileCount":12,"unpackedSize":35429,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfoFeLCRA9TVsSAnZWagAARDoP/1V8SugYM/K0tAZexAzV\nsJ9mDe3OKigeH907hUr7catKFKhgFuh5n4FbxmBcrVlREZmOvjoDOa5q9liy\n8XEkcGVJgj3+vLo7Q2uvaRIdjkm8NXaEYnsDNeFh3Ej90pB4fIjd+N2BZJzM\neKBs1mldBsa8/7+JAkbuk55NYUmIYrHs0BUu5zKHXiIyNb1hoer+IHIrkVYG\nScKhChZMFKjT2z5gFgVYKhpM8e+pTwDUzyGjqUNsqJ/zWksDgCOa+9F98Y4U\njsAHDOTAU/Cf3UyhWaFG48mQA3QOkQmGIB8UKgdskILoVg5yJv/mdY1j3q8z\nXkdNCOHM17vveJpjbt6Zyj/kvTnGZf9H3Je/7dOotZUgTroW31ZN5maF4FDw\nOQ8zoI0KJGw9+L2vhCZvo7/tIKS1ENQhEYGY0DBsheZbewttjNQtDoqeb9+R\n3YmMlYdX86AENe2P791O5YWGGN5UMQs67VDvSab+LyKqjMI0eR1kQdxNR/H5\nruWNWhnVCO3X2D/MUwLA79peKa5f1MKV1Y3sTPwb2Kekax10/plOTdZTf79m\nm/X+rYcSa+tTXDyVhQIHCLmLuafKRQOgPWNnA6a4j7vPppsn/T0p5V4XR835\n05Jzic8GUqc7leDF668A22nCYvowxEMXNvmwUbX/7KzWRYb1RMQP24oUu/Me\nwzlZ\r\n=/1oT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDiBk597g8vK433EffkOKQhrFonyqQrzXmV2l8xbm5NngIhAINXWa+MFgSbR7lQr/6aMknUlSpoFJ1D0WhEg+I4sool"}]},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.3-alpha.1_1604343691002_0.20185410268953574"},"_hasShrinkwrap":false},"0.3.3":{"name":"abell-renderer","version":"0.3.3","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"f3c136bbfa95ceaed79e0694e4f1b1b4c82a70b0","_id":"abell-renderer@0.3.3","_nodeVersion":"12.19.0","_npmVersion":"7.0.7","dist":{"integrity":"sha512-n+tRglvkyCjJAZPtcEFUW0wGjqRDEcGxMGauyJcNBDX31O+LdI8gCToMGslxjOJYciDz1p+2MOWxAggu1QYGVg==","shasum":"c0f7ffc0bd188959af735bdafcbb3725eb7ded30","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.3.tgz","fileCount":12,"unpackedSize":37262,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfoWuDCRA9TVsSAnZWagAAgfUP/j+dYVnCQQFQzItShrCA\nJvU4mESh62KVw1YsjVR40viFLe4GIoluWwsMJYqBcvl8PzvS9MUecHIAoiM1\nbq0p97sXCq5RdaXwoB9Yp03qSkGe0zxmZkGdo1ju+X1gR2Ab9jH6ZpN0zBLZ\n7STLqJRPvMRG/5YiOaSmzBWGi6yX/LF/7/3JQjE7afb67lrg4tRqA7b5xRAS\nzgaZ7ZcYi3QqymMF0MN+JXJcS+eh3TynxmGIt9Feic7rBjzWzu8FjZ8ZsueP\nrngwFoptKhx57jS/fCHFYNE/CupHCL0xCvAwTNA0pBtAbtHkPaOL79CvrZKR\nUIwbe/4bma8RbXLUdy/dXYz5E28YLcWZXhdjTBnOUH1ilM90xGjKf4jKao6j\n2rGuqDsf1waBY8ams3+N7TtDlDUDDm6Ajeh2m/jZmrIMP5vbKZxi63mpRZX/\nUUmlapvStjRhwcUj2fPXFJzJxSh6/VrtqW61LJRy3+4VMCtFbgvPoub4knNx\nB5/IhOGd+oSRQMsDUxXSTZjmzFa0qZuSjQ+Orx9COnIFkrvqK/MR7CTVSXsJ\nBQScbgD+qT6uhemFoAHMGJPPuBPmK7JAGADVsqp4D49if4YVIRHMWsQOczHI\nNHVjCPE9BQXAD3qQXsj0mi4eG5xnhocIa3zo2u/B6PJTsJMBJTU45uHxwfZR\nxESq\r\n=k7sz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDRy6yYhZMb/mNEND6ZUoVlPids+JFhRIMcbccckF5qLwIgY2sGmmPA3VryUHYWgYQssNRd4/OBgIukpjX+UdoKSsI="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.3_1604414338762_0.15972636092327308"},"_hasShrinkwrap":false},"0.3.4-alpha.1":{"name":"abell-renderer","version":"0.3.4-alpha.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"fd126507dee68d1d111266667aa83653d94773e7","_id":"abell-renderer@0.3.4-alpha.1","_nodeVersion":"12.19.0","_npmVersion":"7.0.7","dist":{"integrity":"sha512-FumN8LoQqfu5meqA6u5TvzGEN8Fch3YTWrWYMHsOnbUDcaekv44K0T/QkHZv62LeR4tqq2aCESMFvvM3rr+tgA==","shasum":"295a6190eef44f03b86a047a11f4752e84c34deb","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.4-alpha.1.tgz","fileCount":12,"unpackedSize":37974,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfpn1eCRA9TVsSAnZWagAALs4P/1fSEbjxRxTObC1U1ou2\n1I0MYgt5muJlCpFrHMZotd4HNFpOtzT8prven5fJkAp9Gxfp+uyPmDTZZNe+\nSqbg8J0edOpnR484eg3s05vT2zQTCyt9OX3f9sYV0dr+W9t0nP7SX9NpFfqm\njqjiYLDhj1SnE9GK8PHX+CbXvTjFT16GRu23VCuQ4hlTH5wAQ0EGnO/19ohZ\nIelqX8ng7/SI5IfQ2qwsGeqHw/pYW8YlQaCvsYhEI5wQhknlBbIBjPnGaMeq\ns5y8jJVJG98Dh9LKyGPNaKMxeM0G1V/ADcKEDFhIiMYWs4+W5FlPQ2d3NB+l\n2p/1cvoFmrU8iXltDWWhKW27q/b2lB7x8e0WR5MYSi+Mx8ruoSGmOiK6JNRA\nMGo1slJ1iPDwLq6fa2SBaXUfoonvOWJ3yxXAhGl9kryd/74YXWaM6p/GFawH\nIjQ4O7bNSGfYWatXk3xfC6AYc/6xz32M9Kyrnlyhjca3qDg0FXvC+vTiLNKf\nsAhHAyhl7bXluUd9+iIuDHc6S936V6GqecDzgjjlo5KHwgNKUU0joRcEkkTF\nnFEwRh/rWgeOotWgK9QAnHs4kddUWdKMSFltbqNg376G7+S+f/Bht41fZe81\nA0qF2RYG70u791JiT64er42j7em6L0fgB0n0/pKUGbQ7AhHYkNT4XqUgvQVB\nReke\r\n=+JZ4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFnKQHx/0FrH8kLMpoaGDvyWGJS2uaodantNKZobz7QnAiA0HfLfx6kvbdO1ZTr0RZFVX/VfnGKbjCojKmzDC3x85g=="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.4-alpha.1_1604746589562_0.22982619234856472"},"_hasShrinkwrap":false},"0.3.4-alpha.2":{"name":"abell-renderer","version":"0.3.4-alpha.2","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"12972df79d5da33c28134069f033739417fc607f","_id":"abell-renderer@0.3.4-alpha.2","_nodeVersion":"12.19.0","_npmVersion":"7.0.7","dist":{"integrity":"sha512-be7/7pUWmcgIzjuawtYH93l3hH82YBDVuGzasxkjKwppGfURA5g4WMcYsd6ErY3I4+YE1mM49stTT7nE5OLRpg==","shasum":"4f9f6618e09a170a4bee0fa89a3bf05658b3ff63","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.3.4-alpha.2.tgz","fileCount":12,"unpackedSize":37935,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqDcaCRA9TVsSAnZWagAA8RYP/j1Uu1j0TJeswW6fHhmn\nIomhA95YAb/ow93J4LyDWIYQ+4InuV/VhTLJ4jXpbSiz0uX2liMQPZycs/CZ\nEJGxInPYkp+7NqrEWeMTnKXwcoegTZ5tWd3lUt+q1Ac2dv8L5IaUOPhyCJwd\nzVGU/Im3Bcu6HLW1cD1drUNfd4TEz3VJDrWup3OA66FV3ZJDAnU43PPTEtBP\ngUTQznN9DzEA0ub4h5AiS/NYXENVdQvbS2C4vaQC+Dn0k5flO4qFjcldbS+F\n8u6TLxJtzcTWgQ83FOuHxL86Svi26QChzkiCfddpq+iku20mUBtdzNZi3/2x\nIFhXhRnlEoqZHWo/2ab6yWQIMz5y4b2ypiCSR5ZvRA66P0k19LwfTx5orqtZ\nXzpn9YHxu+ul6njmnJPpvSVhvlF0I6L068WLyu9sUOp9DURYq5mUbPOMZO8u\nB/8Vm/VkZdTT+CuAUn4/UA/3NHb620X5/yxxPFOT2FjhEUxf6p90Nu+X7RGr\n0M+N+4TZs2rNgIdKg6WxtjM7wVqxAGrOV8V1tssKquOZSIIzXKdFdNPykFAa\nE7njJM6j59+c1hdsUG8P7TQxE/qxC4L/dJLIyf3GTnWWIZzcqCGPqaz9ooju\nrL90dSbMLk7bbLoOdC2p8KRpvDf/uI2iotnzB/rk++gJ73XPgzprP1Q8j2M1\nXoHU\r\n=SE8Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIECxgL828WTjmR6JOxBGh/Zo5+dizlRSGr4bPIC0Y9FyAiEA5JqryeiykXeqN4qX0KsYibnjoaTpYFoTOJYxTthO5Qc="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.3.4-alpha.2_1604859673929_0.038561106777151855"},"_hasShrinkwrap":false},"0.4.0-alpha.1":{"name":"abell-renderer","version":"0.4.0-alpha.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"adcb3c0ee0cc5f78428af2e2d95c660db1d69ed1","_id":"abell-renderer@0.4.0-alpha.1","_nodeVersion":"12.19.0","_npmVersion":"7.0.7","dist":{"integrity":"sha512-5jIIeV1rPrNq5YmLcGqhXzSc+qVkKyEVliNZ5OmkRwdaR1x0idNc4aQDt6rHDhfbT7jyNABFziy8U6W0bZlsPg==","shasum":"9ec18562af1c9c3039cd3fb9b4ce13fe7f9b4a0a","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.4.0-alpha.1.tgz","fileCount":12,"unpackedSize":38857,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfq7Z+CRA9TVsSAnZWagAAD7wP/Rk30EiDcYpp9r1jIxht\nFkS2VdzQN++dNZpQ9gNBbXAF11wDN1V+RzNNAzqsiWmePf4KmIaAM/ZFGjb4\njjZPcXXjcrsNZPS1NxtCWAi4gKPv0f1lhRIdO6Lx6viFGVGEvjg1bXFSxqRi\nmxwDQOQeK+fs+E1U9t7Ka5RMXrJ9ZTi5PrK8ZDuS1jTJij++BgL01Zytxrgo\n19c/MuXQFZtl7ugv4rgNifP8iuIFv93p0cQOr1r4QleIfGOH9HNdoaWm7HdD\nO3BeYx8inSblhVHtyq5un2XncHzJ9Jp+vArSEXuiCZs0npIOb97iSmdJeftY\n8ZC5ubaXmXvmooNZFuXjIoNacFTINPsUs5rxS1/10tZZNcL8OnHzjAjPEBbd\nYsFbUfDl8VjCCrb7IQzh4YL4T8XKyhEUBs2iYbZXgDMKJv3+shjv978R7M26\nHpwUneWbedFqvssMgF/7jVX0X6EyB/IJOxZzJmx5CRNAWWqfkrVqZxKOF5/m\no1hUIr1A7+53gqcXgpqJMC9FL83XwBWtWYnV0SD2unu7Hwlq8mT7fDvp0M6n\njSxZYg7eaelVlBEi1d2He0MSCBHWmmYTRpMsmlTGS4Z1oxMx4ytqtMfkJ6CQ\nohgUEp60q/mazxhtGkEW7bs4jS4zhRM1exwK2TMR4ltm+nisLiFo1fSkRCbb\nrSBP\r\n=okJb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB+XWWQNI+tnIescs57xX4CL0Q87f99Sg+jQAYa3lRNtAiEA5k4V2v2rqenO1hQ4GsmkBIjdmDkqiFR7P6vMeo1SPiM="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.4.0-alpha.1_1605088893493_0.6306417945996929"},"_hasShrinkwrap":false},"0.4.0-alpha.2":{"name":"abell-renderer","version":"0.4.0-alpha.2","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"2bce1ab73671685a451d0ccb10c8bea213ff6c96","_id":"abell-renderer@0.4.0-alpha.2","_nodeVersion":"12.19.0","_npmVersion":"7.0.7","dist":{"integrity":"sha512-6Q7OApN/VF+7k55JXLXB8MRYJq2r5qKG38Ghhm1XrZafKkKI+JLeOYJojken7VxQsBv8laUe2zTRqhPDMmCowQ==","shasum":"3f90ff1d339aa81157963d19a409aea1221bf501","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.4.0-alpha.2.tgz","fileCount":12,"unpackedSize":39261,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfs9FVCRA9TVsSAnZWagAAvS8P/1Ckkxqm5XTyivjVOWCt\nUa0VYHmsRVDusAQwHDH7HtoT+xbct9aMUS6/Bo2O7KQpDFbTEVolChtoxZId\nSK09QseOk79jZsw0CU3OwZx6F3AVZ6rh3kFkN2UcX+j1xDYbW96EKbMr69UV\nlQvPTBt1k2kORqn8GiInS/BudTSDEkDua3Q+737PRMLpTnOtX49Hs80QOf+O\n0Qf66Eozj1IhctiXooeWfX/iBRzdbpiIZNVzcRFFFkEZBWo4V6oKwXcstWaa\nC2pISOxHv5W3vMQpzQNALzlTsKd/EyKLXZqHRmqBXs8AZlr1UXIvI8pdNQpr\nKk/lS75227FWG404/DqNtG5oHEohUtbXk+8W4vGrR/j84q/8DtY0UZyAB0Po\nCe6KTBL5DNngQHFRXfL+m24wArDEihWa7WQ1vd1axPnnNUtGKe8Es0rSgGAA\nvI4NZAC+qo7jPLmtdHH24isiZz+qEOsUOjxUoREuM0QwSj9cjt6r9VfhC4vS\nunJomVF48iPS1tmUJIp/VLbpoDzha8bSTAE3P9zmp3dIHl+/thkmtwD46vJd\nOPwU/3/tmfITGFxndRQR3FTSvZcZDcGOzLzkQhm62dP1mr9at63sB3NYBloH\nkagrzO+78EkfAqJh9eiM5RXItRaDkKuDZiDzjUVWnrqayY8CRG1x6qSe0rtW\njbfD\r\n=Ipyx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7FpHOu+TtDz6a3fX5ozmI50L0qotNGWNhuwn2QACC4AIhANhDJ75EicOOhUcM2HlX6NhXrCVlR5/r2tgYlhYsZ5S6"}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.4.0-alpha.2_1605620053183_0.6471377837871628"},"_hasShrinkwrap":false},"0.4.0-rc.1":{"name":"abell-renderer","version":"0.4.0-rc.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"0e7ac07db85b9520620000d3b6e6ff3ae1c72480","_id":"abell-renderer@0.4.0-rc.1","_nodeVersion":"12.19.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-xs7p7UWjHMQ7FEP1bqtpJN4T/Ji0POyIcwgCnOSefCyLh1iZkbQenDEIa7+qowNr+0bvlzTYSjqeSY6UMYskGg==","shasum":"7662f92e1f8ebd2f007314edf4e3b906b62ce346","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.4.0-rc.1.tgz","fileCount":12,"unpackedSize":39326,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJft4KTCRA9TVsSAnZWagAA4HEP+gNbmikX75/KiGKFDYcu\nJDRn746LghvXFS4Aa8cBcRAYqbk8wly65j9Z3GGkNuAg99C+W5/I2Bcyg799\nMQXNL3hq6db9q3+FO/QFWLGD88SJyOffG2+z3qmFQpCbqLeuuZ+4KqDO3BEf\n+/EkW6Ahf/iZ8+sCLepkjpoC/9RTcJrTooLaT4LaxLXcVy4iOpeVSU5980B7\nuydxytd1U4Dx1tN5BRYar70HRscacCNGC63OTZiUrgiP27Ryluhcbqcrpjmm\nd1iJhiIsHwQGjt1CAjIaPdViH5CuC7z51DEYWNjr/V1W3AJxzMDe0/8CPHFS\nkjmpSA5847e1xAy7qYaJ5plBCiV6IwqIhnYHkbZEuflu95pfQF6+roC6+anp\npI0jNU/6w+0xKQWLaVz6X6DQEm/3pvChUtWpAV/QhqVJAqMOZw2GIW9jVgJV\nY23Ct+FqiO5s7WtgA/dqowtolIRL69XfhEvjajsLzdXixtRcS0rGOk5m5H4F\nmBoxzluP/LKDRAnjdtvNMcLkrivQbKmeNYkE4f14outzZuUc1ig3MgykV8ax\nCesfbnnTfsrENvMuHjWQoAXJMRAqDNao2Z57qKMm0azLYULdoJ56sJtccoWc\n00mZ3s/jk2f6t1X2Hoc0TawEP94zauLLU8M93q5YHgQIkqM5wfdjdqsSGojR\nSH0C\r\n=SWZ+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEsb0Mj0EmbHQbpTp/9uPPzZKLxiWBx76DUj6j4H+OSOAiEA30ETKyF0p78Jw1AVIhYtM8PQ2mK+ZJZA95gItRfRfmY="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.4.0-rc.1_1605862034835_0.07383903877708331"},"_hasShrinkwrap":false},"0.4.0":{"name":"abell-renderer","version":"0.4.0","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"fe4bb6e621b30b1aa8dd25de3e77372954d7f47d","_id":"abell-renderer@0.4.0","_nodeVersion":"12.19.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-aWXnq68aJkAIZJeH3zEcoF40IWxfHHS30870AapquV4BJNiGn0dTY2hrthLLpJf7J6KByUGwGSkekpZUm4/PNQ==","shasum":"f6dcc2af39fcc2666865d0f9a5cdd8e6d9bec8d9","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.4.0.tgz","fileCount":12,"unpackedSize":39485,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJft4geCRA9TVsSAnZWagAAjQUP/i7Jt/bfPH1p6dcqSuQe\naM2Ga/MuZowqFT5lsr6gFAiVKtn+j5TVe4sEANdCfenFioMbcRqIXbay9DQ1\nYIO4K4v0t0JEqonSiCYuUVv2KkfCb3c06f3sLVVmS5yVhOsepSimpjg5vINW\nkelGP4pmCL9tuZcqtqFYgjebiyKNT64Qu9uz/1srsBFPlLNF6tiE81lNG4lj\nIIrNv1r36A94nzpD6qNxSPI0HCg0cVP7GcmPu/ueG8UsqGjhv/4QluTLj4RM\nwdg3kbXJizM3pSEo9GdbPGdUoZeHjhGVhJJWOIp06C0AudXN5ks1kJbm4UBc\n5IlvZJ4DxZHLsB5lw/GwY4jRqkCgpIc7ZRXmprmrWwAMSvf1X7jUXKAW/hDD\n066QyoIeTUbH1XeMFu4dIp8ngl+XZR5BB+Rlzk1Z6rbBtfN2661J/sUk4cfd\nmkBcAsAISplKoUXKOiD6fVRP52RSHPVSuMac+OjqM1fvQZHNHkvq5LBVBiYX\n5Pihv25+r68UJSMYzPGfuXB/Yio5V6Fozj1RqtwPLHQAlmyba1UODKZLBHHo\n2Kr0TkZ4TGvxfwOUuhy2iyA/6U0JYDXKKyZBbRhcL0ymtn/WpzpOOrPcUf3A\nkezu3tudE8RPLi4k/wDi2mG5qDkbzVS8dqgkUpaGpfNEVAMEaRkxRxBfITYE\nl1H3\r\n=K580\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClK5FhbqVGSngWLvyScU4ECXSEuySGlSKrath/JPfmKQIhAMsviZ8SSF88sknivmSQOlGND1oKeDbuGRDra7QiSzvc"}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.4.0_1605863453954_0.8988066468354032"},"_hasShrinkwrap":false},"0.5.0-alpha.1":{"name":"abell-renderer","version":"0.5.0-alpha.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"6354bfc2b9024f293ab8b8602a9aba933671ed78","_id":"abell-renderer@0.5.0-alpha.1","_nodeVersion":"12.19.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-lJN8w8IW0vZ+iokzwjEKbd45zqXPQ7YqrrZxB56XUyd6KN2EubmHV1twOatyDRzwEYCuZiS+/PL3rrGRV0xpYQ==","shasum":"61228e599d121f8dfd1aaed9fa4b371aae01fcaa","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.5.0-alpha.1.tgz","fileCount":12,"unpackedSize":40360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyRGLCRA9TVsSAnZWagAATEsP/1zrX/9AbnjT1KgP73QG\nQUz7rRoZ89pgzO7OLGdDSmHNnDwJ2f5YBWFLSjMVEKsBMn1ABK1ezmMpVi18\n4h1tSMyGvkGQAk1NZI5h8+X+LNOLOvOOE6tY1Po5YzphvGs6kp3AJtoa5Qle\nmMoTmyFViM7oZabxSCwSFky0/TvuE2+JrrXTdjiVLDJIkjo/0FCSQNpgce+z\n2ZS3vvEKnFGt9Em5fujr1WdvjYt/CmMPyO5O7hK4ssmlXogXzaxAUjqxNSnf\n1fCrYjLNCVshQ5dfFRotuc8AdUNPtl6kPyTKIuPDVd+EDqAs52m4FpCBAtbT\n3u7/Vn7VdlDbawZce+mFtBu1CSI7UfGYwGaoqvHhDsBlG/5cAfWFMMA3m/56\nmvKp75BFrxA/eiZmvJ/VZrdMBgNDKkSyVDMT5MmKELVE7D4hIPop6WCHF6k3\n4OKabAesrJ436+ZmtOPniMIcud+BAH2LjbsXQRckt0D2aHl8uRHIlinevWF6\nndjEEDW7uKMBTFv5KtKAKM4oqCA4iLOWDLLyzS/MxnVDnS76MuLq47+kBXRo\n4mtOxe8pBFehCBYxl0AA89JQCAir+nJHkjG+w1RpPB6iL71yQ85SbXfjOY0H\n3jCEfKEnasd8TGtuYwpLPdI6otbnhutZHPX5YYoh8TXc+2XF4O1H0WwbDBrb\nennf\r\n=rvs4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAfW9UD8FjQSN0mryZz84Fz6jPOO65k1i8b0xDt5U1vPAiB6w90DTJRLkV8G8Bb8C/CWLA32pF7BL/Sb0gZbll1pIw=="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.5.0-alpha.1_1607012746893_0.36819750967535203"},"_hasShrinkwrap":false},"0.5.0-alpha.2":{"name":"abell-renderer","version":"0.5.0-alpha.2","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.png\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"1d7e8b9446d34bc22d1d22dbb2853a2d1712eb77","_id":"abell-renderer@0.5.0-alpha.2","_nodeVersion":"12.19.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-We7iJ6bCKlUTNGPKD9dVUjm/0OBmvBx5OJYFngdRRZJ4xGjZaN4tAPsFv1M92+ejBLhVLTMCE/FNkhLkpggLLw==","shasum":"05d7b2a90b5172753469614f1898b4108475b0c8","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.5.0-alpha.2.tgz","fileCount":12,"unpackedSize":40332,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyRYcCRA9TVsSAnZWagAAItQP/3NC/wG2g+Q2maePER81\npYNZd7lCGEvNBTnGBBFmBw6QX+o0TfPAQcVyHVznu+9dQJvJUrT+dhRU5ds1\nDqXVLAZignxgBlzMULYqjYTuRoRx9ibAj0TuL3S0meNf97xeyLUUq4QnzpI2\nEAAfWE0wIsnsIjM4nj6VVJm1gCkGSoQMlSS5nIA/Omkf2X6OsRh+gFX5fooo\nHg8Cg+O/DE2MmW+ipaFWjBdo7xZBv64RB1/BCA5BuYQ9kOZCsS20WsUZgLbO\nFzbxJCknlw8rKnYfZ5OwHMUVtSb1jNPVcwnLUc9tyGWMjY7vS4jMrImR4qX7\nWOpFtGuey6R9PHcM7qIak0OGE4ajufC0NIugIy0SHbri7uj5kAY12p9gScLl\nblIWXSZryC6V61ZAEhPrGi62oswYJHm6pVDzKA8WdfUtOlLN5NwuKcKmfkqS\n0PjBa3rDjCEx8qs9NFKXWRb+DbrclurEdWS43fy40lT8rKs78TbLjWLPbT0S\nsA0pBBYFh8T2YE+9TdndKiesRPlIHXcPvmBZDLDYFRr35F/VHhgyBeHqBO/N\nJdVDCm898oo73jqA45iGokqONk3hI455ThjJO2l63jFfE1cCz8Jtr2lUNkVN\nL/SB0sDaCEjcs8cjG6HradCYqOZqmtqmiym0Ejt5GtCgUtfZk9bNu18hh8Ox\nqRXR\r\n=VR6T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDyykSniG1W1VqDAfa4kkmu+bwelj/xzYj/GoPkLIC7MwIhAJ1f1DVahMMNZ3+ByVRdbehdm9hpOjE+QCmJkNcOoccF"}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.5.0-alpha.2_1607013915673_0.896632140735349"},"_hasShrinkwrap":false},"0.4.1":{"name":"abell-renderer","version":"0.4.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"e776c34f5a20a1d0a04c8311058d09d6c99d39c9","_id":"abell-renderer@0.4.1","_nodeVersion":"12.19.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-9LsiO9QjztsHV6/DfgdIb4IsjG4dYPBonkHIvoLfDuwyZmKG7ZrmGKeARdjhIssOtcDpzz7urouZYxKRyX3uog==","shasum":"9908b877293073a32a5e277fd9a7c46614ae1b27","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.4.1.tgz","fileCount":12,"unpackedSize":39530,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgBBlYCRA9TVsSAnZWagAA+JoP/0DgEjczrwsk50JFVyB3\nrRYDFyuJCEu0P6jZz8+NBpDuaV71c1+orAkgtBp0j9p79qvpeu6Id04+cjbk\nQSWZ97XQbH4oKuJ7H+VqxDVGJwTfO5Lci48nmMV2IWBi4KHNlu8kg7sA5g1Y\nHYaDacVAa4B3TVk/O3E8hqBVpbKig8TrDzirNUxILLVwSTvPOUuA+z/IYC8T\nB6JQQ6lw4YEL/kPDlU2q0sPIYgvoBS0C+VdVesv7mVXF7qmPKlQ9jsuX4w/h\nyksFsy/EpiHgy5EaYRn49a/rKyFwhKa7VAWp8VlW/kAVrl/wlu035r4fgGVJ\niluFxaN2zoTsxUoYuAaYC2q4+2welZyv4uzfs3bMkZyKDiBkQBtZiUPLQPmW\n3pvyMvAGsT2RZG7prHXlv6k5fxUaRnToS/iPC2QxtY2W99s0TAXfE/pnJHtN\n7xjlVRfVntMy25Zt0nICwhR8Af4uWqQW2rBRfVYdQdmWeFngT5MFIEppsFU9\nbwfH7fMgeer02wxn6Qc/JwIrwYSr8ozvep+s7XlJrwM/A75dqrZyWtLWZVvD\nx2C7iAdA6CKnS48H9iWAOGoeoed3+Y/c7T+/KISdXjTPW+I807RDfgkQxSrG\ntH0R7E149Ht26vvGrMEpiMYBfIUOQrXoR1OQqLMJ56oCwpl9mVBIaSR8yJaY\n/ApC\r\n=ZVm6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICpQoq12z8PmbZGV2NqD2JV2DKkm5kpTiWcJ2INquiOSAiEAtMyRoZeHwn4pk9bUdfJzQgxaR6JKsDyOnhpE4FRxOss="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.4.1_1610881367941_0.9778384128796214"},"_hasShrinkwrap":false},"0.4.1-alpha.1":{"name":"abell-renderer","version":"0.4.1-alpha.1","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"readme":"<p align=\"center\"><img alt=\"Abell renderer cover\" src=\"https://res.cloudinary.com/saurabhdaware/image/upload/v1588856971/abell/abellrendererghhead.jpg\"></p>\n\n<p align=\"center\"><b>NOT READY FOR PRODUCTION USE</b></p>\n\n<p align=\"center\">\n<a href=\"https://npmjs.org/package/abell-renderer\"><img alt=\"GitHub package.json version\" src=\"https://img.shields.io/github/package-json/v/abelljs/abell-renderer/main?style=for-the-badge&labelColor=black&logo=npm&label=abell%20renderer&color=darkred\"></a>&nbsp; <a href=\"https://discord.gg/ndsVpRG\"><img src=\"https://img.shields.io/badge/discord-join%20chat-738ADB?style=for-the-badge&logo=discord&logoColor=738ADB&labelColor=black\"/></a>&nbsp; <a href=\"https://twitter.com/abellland\"><img alt=\"Twitter profile badge of @abellland\" src=\"https://img.shields.io/badge/follow-@AbellLand-1DA1F2?style=for-the-badge&logo=twitter&logoColor=1DA1F2&labelColor=black\"/></a>\n\n</p>\n\n<br/><br/>\n\n<p align=\"left\">A template parser that lets you use JavaScript syntax to render loops, conditions, do maths, and require JSONs from HTML. Low level library used in <a href=\"https://github.com/abelljs/abell\">abelljs/abell<a></p>\n\n## 🚀 Installation & Usage\n\nExecuting directly with [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b)\n\n```shell\nnpx abell-renderer build --input src/index.abell --output dist/index.html\n```\n\nor\n\n```shell\nnpm install -g abell-renderer\n```\n\n```shell\nabell-renderer build --input src/index.abell --output dist/index.html\n```\n\nCheck out [Abell Template Guide](#-abell-template-guide) for how to write `.abell` files.\n\n## 📘 Abell Template Guide\n\n`.abell` files are nothing but `.html` files which can contain JavaScript inside double curly brackets `{{` and `}}`.\n\n_Note that abell-renderer renders abell files in NodeJS context which means you cannot access DOM inside brackets._\n\nSimplest example of **.abell** file can look like:\n\n```jsx\n{{ const siteTitle = \"Abell Demo\" }}\n<html>\n  <head>\n    <title>{{ siteTitle }}</title>\n  </head>\n  <body>\n    {{\n      const a = 3;\n      const b = 5;\n    }}\n    <h1>{{ siteTitle.toUpperCase() }}</h1>\n    <div>Addition of {{ a }} and {{ b }} is {{ a + b }}</div>\n  </body>\n</html>\n```\n\nAll the JavaScript inside curly brakets will be rendered on virtual instance on NodeJS and you will get the output as completely renderer **.html** file:\n\n```html\n<html>\n  <head>\n    <title>Abell Demo</title>\n  </head>\n  <body>\n    <h1>ABELL DEMO</h1>\n    <div>Addition of 3 and 5 is 8</div>\n  </body>\n</html>\n```\n\n### ➿ Loops in Abell\n\nYou can use JavaScript Array methods to loop over array. Other JavaScript Array methods like `.filter`, `.map`, `.reduce` can be used as well.\n\n```jsx\n{{\n  const users = [\n    {name: 'Saurabh', age: 20},\n    {name: 'John Doe', age: 78}\n  ]\n}}\n\n<main>\n  {{\n    users.map(user => `\n      <div>\n        <h2>${user.name}</h2>\n        <span>Age: ${user.age}</span>\n      </div>\n    `).join('')\n  }}\n</main>\n\n/*\nOuputs:\n\n<main>\n  <div>\n    <h2>Saurabh</h2>\n    <span>Age: 20</span>\n  </div>\n  <div>\n    <h2>John Doe</h2>\n    <span>Age: 78</span>\n  </div>\n</main>\n\n```\n\n### ⤵️ Import JS/JSON/NPM Modules\n\n_NOTE: Starting v0.1.10 require() can only be used when `allowRequire: true` is passed from options or `--allow-require` flag is passed in CLI_\n\nWith Abell you can import your Native NodeJS Modules, NPM Modules, JS Files (should export data), and JSON Files with `require()`\n\n```jsx\n{{ const MarkdownIt = require('markdown-it') }}\n<!-- NPM Module to convert markdown to HTML (npm install --save markdown-it) -->\n\n{{ const md = new MarkdownIt(); }}\n<!DOCTYPE html>\n<html>\n  <body>\n    {{ md.render(\"[Open Google](https://google.com)\") }}\n  </body>\n</html>\n\n/*\nOutputs:\n\n<!DOCTYPE html>\n<html>\n  <body>\n    <p><a href=\"https://google.com\">Open Google</a></p>\n  </body>\n</html>\n*/\n```\n\n_Note: fs module or any module that deals with external files cannot be used. The only way to read any external file is require()_\n\n## 💛 JavaScript API\n\n```shell\nnpm install --save-dev abell-renderer\n```\n\n```js\nconst abellRenderer = require('abell-renderer');\n\nconst sandbox = {\n  nameObjects: [{ name: 'Nice' }, { name: 'very cool' }],\n  globalMeta: {\n    siteName: 'Abell Renderer Demo'\n  }\n};\n\nconst template = `\n<body>\n  <h1>{{ globalMeta.siteName }}</h1>\n  <div class=\"article-container\">\n    {{\n      nameObjects\n        .map(content => '<b>' + content.name + '</b>')\n        .join('');\n    }}\n  </div>\n</body>\n`;\n\nconst htmlTemplate = abellRenderer.render(template, sandbox);\n\nconsole.log(htmlTemplate);\n\n/*\nOutputs:\n<body>\n  <h1>Abell Renderer Demo</h1>\n  <div class=\"article-container\">\n    <b>Nice</b>\n    <b>very cool</b>\n  </div>\n</body>\n*/\n```\n\n## 🤖 Server-side Rendering with Abell + Express\n\nYou can tell [express](https://expressjs.com/) to use Abell as a template engine, check out following example to know how\n\n```js\nconst express = require('express');\nconst app = express();\n\napp.engine('abell', require('abell-renderer').engine({ allowRequire: true }));\napp.set('views', './views'); // specify the views directory\napp.set('view engine', 'abell'); // register the template engine\n\napp.get('/', function (req, res) {\n  res.render('index', { foo: 'I am coming from server.js' });\n});\n\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\nThen you can have your `index.abell` file in `views/` directory.\n\nCheck out [saurabhdaware/abell-ssr-express](https://github.com/saurabhdaware/abell-ssr-express) for full example.\n\n### 📚 Reference\n\n`abellRenderer.render(template, sandbox, options)`\n\n`template`: Abell template in String\n`sandbox`: Object over which the scripts execute, Can define variables and inject them into script.\n`options.basePath`: basePath which is prefixed on `require()` paths in abellTemplate.\n`options.allowRequire`: Passing `true` allows using `require()` in templates. Default is `false`.\n\n## 🤗 Contributing\n\nCheck out [CONTRIBUTING.md](CONTRIBUTING.md) for Local Setup Guide, and Contribution Guidelines.\n\n## 🕑 Changelogs\n\n[CHANGELOG.md](CHANGELOG.md)\n\n---\n\n[<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://c5.patreon.com/external/logo/become_a_patron_button.png\">](https://www.patreon.com/bePatron?u=31891872) &nbsp; [<img alt=\"Buy me a Coffee Button\" width=200 src=\"https://cdn.buymeacoffee.com/buttons/default-yellow.png\">](https://www.buymeacoffee.com/saurabhdaware)\n\nFor status updates you can follow me on [Twitter @saurabhcodes](https://twitter.com/saurabhcodes)\n","readmeFilename":"README.md","gitHead":"774ababf62f7577d18955515308f13744e0a4dea","_id":"abell-renderer@0.4.1-alpha.1","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-B7e6gW8GREsfqkjhaRcVrY63bNT21anm+N+VTt+XohjzSxNreXj7Ff3I1HBmPx6DaKki4SRuY3EvRKOVtqL3iQ==","shasum":"0e476616899649c1990692bc38453858aa2e16d8","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.4.1-alpha.1.tgz","fileCount":12,"unpackedSize":39370,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgThOLCRA9TVsSAnZWagAAIQsP/RpdMXcwcFIXRuUynJAH\nq7URqESKhXL1wSP/z57f49AwP5g4e26UhU+QeGK68TQS4pDOgPc/XT1TcM4d\nY4lt+PYgykDFvXySBjMmyCE57a849jm+1UyxeAsUTHKbXZi/NLhhyUdv+Asq\nY8wmur4ch2dy2ZUEBIjPBPGVqifkCRcEAx3kWQZh54epEYpmLta88zyUGPRG\nXfj2v1MebUAYDhBAjrSrSMtmk9HE92f0MsmFrTZ/FOjWNHV2FoCi8aFJ7gZj\nM6/MZepdDezOBNOX2B7l+fNMUkLsvHgfjLJJgWQN959BeFRVTai9Vg1KPfit\nVs1dcuWCfH+orct5VFIol3ug3a5MPejAtiEolm8aHYehgKikp1ieWhKWMJsf\nB0maMyyNPNoQbcR9QERbhK19BY3ILGoGNZjrfOwU6EAW3NRdVrOuSGgO1zxt\nx831Au2J7C1IpkGKABzESxyFiD9RY2vBVTPqd4Wtg/burc4qFztclWuLfoWQ\nqHK3lzL5R8DFESwKpOl50Hlw3/DKUJ31h0bmBwo0jpO11A4fyyZfxCEqu3mh\nbe/Elw1iylzwHC1biO/K4xdmsTqnwJflBbU9GIBUJ2a2QrqzGdYQMlaCxvoz\n9R7ff8LdWzLd/zX1RjNI9pSySVVpxzAHCY9H4OLaH0ZDbzN3s/IB97kgvMyc\n5Uex\r\n=EBEM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcH3GP17a6zAk5BItxytBz7HKd3ouKQM3fT7+tjXQdmwIhAOzTfjze4iZnshBQAi5tIjCk1ip8qnW0k50KCXFRrHZN"}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.4.1-alpha.1_1615729546964_0.048843647666585"},"_hasShrinkwrap":false},"0.4.2":{"name":"abell-renderer","version":"0.4.2","description":"JavaScript based Template Engine. Compiles .abell files to .html","main":"src/index.js","bin":{"abell-renderer":"bin/abell-renderer.js"},"funding":{"type":"patreon","url":"https://patreon.com/saurabhdaware"},"scripts":{"test":"jest","update-snapshot":"jest --updateSnapshot","example":"node examples/run.js","dev":"npm run example main","example:cli":"node bin/abell-renderer.js build --input examples/cli-example/src --output examples/cli-example/dist --allow-require","cli":"npm run example:cli","eslint":"eslint .","prettier":"prettier --write \"**/*.js\"","prepublishOnly":"npm run eslint && npm test"},"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"keywords":["ejs","template-engine","template","compiler"],"author":"","license":"MIT","bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"homepage":"https://github.com/abelljs/abell-renderer#readme","dependencies":{"postcss-selector-parser":"^6.0.2","stylis":"^4.0.2","acorn":"^8.0.1"},"devDependencies":{"@types/jest":"^26.0.13","cheerio":"^1.0.0-rc.3","eslint":"^7.0.0","eslint-config-google":"^0.14.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^3.1.3","husky":"^4.2.5","jest":"^26.4.2","prettier":"^2.0.5"},"husky":{"hooks":{"pre-commit":"npm run prettier && eslint . --fix && npm run eslint"}},"gitHead":"ca9f87f047313448fa2a7984b7282fad51e99853","_id":"abell-renderer@0.4.2","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-RvzlcdWwIU8H/IxNS6QOGo9BgbTbaPI8P/r6O/2nnks6PIkDlf+xfQkICjKSE9U9PcijKCsom4SO8jzeNbBLKQ==","shasum":"adff0ff624e11f421e864404642c18e651f755eb","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-0.4.2.tgz","fileCount":12,"unpackedSize":39362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgThXCCRA9TVsSAnZWagAAKTwP/AoVMwdxw2IWYfGawJ1h\nGDXd9NDo+8FJELYlZWMrexgwfkuZb+1KCfe0Ifc3TPsOSGnzRhQUXxokC5po\nJ0B05Ocz/wAci4oIJAkzN38pkdY/Bw+WA0oLSsJqKsUF6URC2v/jrsjtKzxk\nhdfkvJk01HNyQWDqhJRLwE94v5ElqH6mwmLXO5cB+jLg52LQ7vq4PuxEPHUb\nKmyAJW2VF5IHD02zsD6fxy8V7t30RYt/XgL18zsN6NHoNhSf8oocD4/Uv8/Z\niYx2NYxjC8ferbAr7ylGpb451CXev5LM5hzRWY+WBv4kyh7gEJ8nabiqZzu4\n5CWjgKjOn9ZsBFu28qFdD47Psc8AtrO/QfuSy5CJ5OvLuM2eaRvHk/Iq1BB7\nyypn+vo04TP9gaKMCM28sXDFutaraXrf/8wNKSyqvIh6VXbx9zJz8u4SSW+m\nHQSQLaqdqPpj/yvaYgKXbUfKCtcjl62h05OvN5ESqCezlM+d2GHYvwU1FDpX\nhSHBtIASq4/nTwOhknLURtmCN3gQ0R3zQCrX2qafIVqdU+gDS8sUcy1X6jJf\nYvXjWybbIkcx/Wzkyfe8GQtUqBxf+E/h1L+5+UekwRK/9Z8gNtnFAlEa7fJW\nxosyt9etKBQyIr9lO10WiWdI9tRP7OxSK9fPtYf7GZVptRK2/TbUxDuhIOyl\nzmiT\r\n=dVGq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICT61gVBJaCLeTUaGHXOjV0alKvWq4hUpaZrXUCbxywfAiEAg/FoL+52wnF+ANEYLOjw1MICaAGLAUyuu4XH8xDGbp8="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_0.4.2_1615730113607_0.0715244041328369"},"_hasShrinkwrap":false},"1.0.0-alpha.3":{"name":"abell-renderer","version":"1.0.0-alpha.3","description":"A template engine used in [Abell](https://github.com/abelljs/abell).","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"test":"jest","dev":"yarn example:dev","example:dev":"yarn ae dev","dev:with-ts-run":"ts-run src/example.ts -w","start":"ts-run ./src/example.ts","serve":"yarn build && node dist/example.js","build":"tsc","eslint":"eslint","prepublishOnly":"yarn eslint && yarn build"},"keywords":[],"author":"","license":"ISC","dependencies":{"acorn":"^8.3.0","htmlparser2":"^6.1.0","postcss-selector-parser":"^6.0.6","stylis":"^4.0.10"},"devDependencies":{"@types/stylis":"^4.0.1"},"readme":"# Abell Renderer\n\nA template engine used in [Abell](https://github.com/abelljs/abell).\n\n**Documentation** - [https://abelljs.org/abell-renderer/](https://abelljs.org/abell-renderer/)","readmeFilename":"README.md","_id":"abell-renderer@1.0.0-alpha.3","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-b1DaMZSXEDw6JLAdK178IeQ/m344ZhzCsUzAE1oxWFdoeRMREJO/5k5dKsqwpSFWPRtY0bWGRwB8ZQXszl1nOQ==","shasum":"d7952b0e8a7343bb8555cf30a3b49ad77d5fcf2b","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-1.0.0-alpha.3.tgz","fileCount":20,"unpackedSize":32363,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg/XD4CRA9TVsSAnZWagAAf74P/0wp0P+7p7v1SQgZiA8r\ndFZils8Zjo63MWuL3meZbbJDRiazyjsh3pQPBQbO4fV9eBm78PoOIuJNhae1\noprKK2hYnq3POMT8QZNlHnGL9eqyz7tmkUe01c0Dwp4f/GVn7mPn1pNW9FBm\nSPNtmEltmb/sS0Aj8LD5Lnusi7UWoZQCAfk2077p0h3uZ5DukwOwr5x9/Eft\naua+hfGrOs+Skn69z9aPaxsC0qLB4avlT+na7OETDAqGM7IeyxHxrU8eA773\noVvv00euhmFvDAIVOs/TwwErTtA0+1CJOo2omEpKroaElmmki/EgswTo0iI3\nInfRbk2uRofzeS4zP0KyiJhuyuPQ9HrODpb1pm+7tLfabeRbZ+yZLmiONkoa\nQYwNqdMQvHPF7MLQqm3V89hTM9agOoCpHQvdvk13VAr3QLbtscb2DTs3u6fD\nww2SVMDGMnfpKTd9Dnkc6Ts75XepvQrVwpIH2MWmojSl4nrGthCzWr5nlTnx\nSTC7QSEtATOBjwNRCSnMB5z4CgAs/to5vPLA0uqW26Q6b+Kdrk0hBRWV0FeZ\n+nNrHVOU5Q4QvQy6ZDOE234FuUm/KVFX34y5dbJZ0JZxIo2zvHpf3h6PDhaF\n7amBKUgOfpa9rigEc2wFYlJ8fMJmWGNSVlYIJMIxNEDKdXew99o21eUu/wXP\nhuEG\r\n=JBjs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFPGRoqVLs1FadTUd4fw0YZuVo7EbdRJ3UVuJpGDykFmAiBFNJF9ApqHtHSPmQxfPqQXBgHH9LWzp/kPH7Mzy7s/CA=="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_1.0.0-alpha.3_1627222264639_0.5185391268142596"},"_hasShrinkwrap":false},"1.0.0-alpha.4":{"name":"abell-renderer","version":"1.0.0-alpha.4","description":"A template engine used in [Abell](https://github.com/abelljs/abell).","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"test":"jest","dev":"yarn example:dev","example:dev":"yarn ae dev","dev:with-ts-run":"ts-run src/example.ts -w","start":"ts-run ./src/example.ts","serve":"yarn build && node dist/example.js","build":"tsc","eslint":"eslint","prepublishOnly":"yarn eslint && yarn build"},"keywords":[],"author":"","license":"ISC","dependencies":{"acorn":"^8.3.0","htmlparser2":"^6.1.0","postcss-selector-parser":"^6.0.6","stylis":"^4.0.10"},"devDependencies":{"@types/stylis":"^4.0.1"},"readme":"# Abell Renderer\n\nA template engine used in [Abell](https://github.com/abelljs/abell).\n\n**Documentation** - [https://abelljs.org/abell-renderer/](https://abelljs.org/abell-renderer/)","readmeFilename":"README.md","_id":"abell-renderer@1.0.0-alpha.4","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-lxEtkaIiFXFPyVwPn/RCe9QQNn1/JWijEuCxfaWpcn7W9PlYswdv6q8w2bRKBRlxzD2LcSD/OYkz55FzXKbMKQ==","shasum":"864fd1c855301d6a988a9cc98713999b521f0fcb","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-1.0.0-alpha.4.tgz","fileCount":29,"unpackedSize":56155,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh679BCRA9TVsSAnZWagAA7BkQAJSmgk6IZDMkXNReZtwf\nI6DhXfeEKLJm3QggGPb7XoA8vrhrTFI8XvcmMaqLFyInZAmdN2i5VpVA9VS+\nzXdlgHbHX1SOjptJzUuTjLgRa4I3d54iM1VlnPgcqiZNQYEvkclOAit9tPTU\nLy/vsmWTBqzX5hJzRScNXoFW/YHLZHcnQOvYiRfEy5EoHiCQr8Ogg9uOhI5d\nU1saewaivLoqKX3GT1CdftHlpt6uN4qR++sdpl642lyXtKqwD9SzcIeJSIFv\n41nXVkGC97ZMxvAJio2WvXzHVwYoBWVQ4efckc6T3PR6wYvOK5aWlmZrEzT6\nDUxbgyvIAqbb7JKI+Wh8T9THUxDBa10FobUGvl3kmwUMJSQAHm1UF7asIjJO\nCO8QDmnPBRA1Ty83ZSwtA9fvo9rG7TrFbXTUdfIGOSUqTkKwO90JZB1iV9q2\ntlN4G0iLRSiuHhBEBKNM11r8rVIrBo9Nf762uFlC4Iyin/84WHZiLtDiMSnM\n1OQJ8HqPalQbyScQzBW0yfzqsFcaeOMYF6aWClVPb1vH/a8xIFMPDC8L99om\npj3VHLhWFDxSmaalbz3i3CJxvtCWcnrQ5g+7fYIfGRm87zlO7lm9qeHtmxCa\nEx1X/wL8qjR+GFhtgJVGXWLXB6gJa4lcxOX+9Y6vcpxrLfe6k48ip1ka0G3G\nqIMX\r\n=bUxy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICdUV7FOLy2kPPhWDr8UATBiQ08c0EhTGb65xab9OTbTAiEAi649sZov6HUW6majrLyOnTgspk5eIdQLy1zDkMO8o4U="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_1.0.0-alpha.4_1642839873234_0.25124185698658064"},"_hasShrinkwrap":false},"1.0.0-alpha.5":{"name":"abell-renderer","version":"1.0.0-alpha.5","description":"A template engine used in [Abell](https://github.com/abelljs/abell).","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"test":"jest","dev":"yarn example:dev","example:dev":"yarn ae dev","dev:with-ts-run":"ts-run src/example.ts -w","start":"ts-run ./src/example.ts","serve":"yarn build && node dist/example.js","build":"tsc","eslint":"eslint"},"keywords":[],"author":"","license":"ISC","dependencies":{"acorn":"^8.3.0","htmlparser2":"^6.1.0","postcss-selector-parser":"^6.0.6","stylis":"^4.0.10"},"devDependencies":{"@types/stylis":"^4.0.1"},"readme":"# Abell Renderer\n\nA template engine used in [Abell](https://github.com/abelljs/abell).\n\n**Documentation** - [https://abelljs.org/abell-renderer/](https://abelljs.org/abell-renderer/)","readmeFilename":"README.md","_id":"abell-renderer@1.0.0-alpha.5","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-KO0qYJfQRiv8XWb00HsGiqvu02gqMCpy3QC47Y0DCHVdxVcWx+A4KQWVTEVcZ6jG9YM9jxWRzS0PVCnW+TCeDw==","shasum":"ffcaa51dbb382d06405697b790c0791da4475429","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-1.0.0-alpha.5.tgz","fileCount":29,"unpackedSize":56207,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh68BfCRA9TVsSAnZWagAAkoIP/1MCVFiDKfyssOeC4mXe\n2x41TUTXhatK1bcmSQYzdTSOVxeRYx0yAd34GLzQmG6hWWYI6viOiDMbP3bn\nvv1mE2mFnGm5AJ49/X11q2U33zTVdyknmNHp58ZOBUl4DpPvIOO5xi6QoyAE\nqLrRHJXK7geNq96ZHOm2nJ0l2bBFQpDgSyGQ27ZHd0gNnr78FkAGwPXX0S2e\n1ilSUpwEPhPxguoRhdI/4KmDciNNLEV01CxBqkbvqWfhhf3+TzfLGDOnrATj\nVOOOnDJcd5tgp2IZFvL26UUIJiClYE3U+/JzWa42DgWX/wGrzSE3kp6MEgqO\nyAJJN4YKRYTfthLIySOcUCrw+v/KqAs2S8Z+owcoJ3z3Yf6AVyA72ne23M/e\naDMLMS1g6gwYxUhIknJ1+o7UdhTlkVh734BgL33/r2ZTOG29Dv93lM8FsvcU\nIraMRjNLFN7ivkJUaNSPvgPtZ1J7u7d4OTKCUObBeWbdJWeHsWDtuOFEXqni\no2Umy/icgrg/2oaYKDAGXDGZ9qb9GwfSNdB0vp0n5deoXspJCBzXlNAy5l5V\nreN7rC4OpwFe3+UC3klXhrS9DDuHKntS9i/+cDDDQcto+CN80d3ExVRlnABr\nX13JbMIlJbBRkIdqHMV+53arvIgaKffz+0K6eXzquXu3kDrgNZ6Wk73RANke\nziqD\r\n=hzvJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFHpDoTuFb/LFB+LEQMSQAonHJP4lLmx8vTz1rV9E1UjAiEApdyXnMeks6w8aMAeWzBhU7zziXaMPmRzMsjR0Inm4IQ="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_1.0.0-alpha.5_1642840159520_0.7952727629324099"},"_hasShrinkwrap":false},"1.0.0-alpha.6":{"name":"abell-renderer","version":"1.0.0-alpha.6","description":"A template engine used in [Abell](https://github.com/abelljs/abell).","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"test":"jest","dev":"yarn example:dev","example:dev":"yarn ae dev","dev:with-ts-run":"ts-run src/example.ts -w","start":"ts-run ./src/example.ts","serve":"yarn build && node dist/example.js","build":"tsc","eslint":"eslint","pub":"npm publish --tag next","pub:dr":"npm publish --tag next --dry-run","prepublishOnly":"yarn eslint && yarn build"},"keywords":[],"author":"","license":"ISC","dependencies":{"acorn":"^8.3.0","htmlparser2":"^6.1.0","postcss-selector-parser":"^6.0.6","stylis":"^4.0.10"},"devDependencies":{"@types/stylis":"^4.0.1"},"readme":"# Abell Renderer\n\nA template engine used in [Abell](https://github.com/abelljs/abell).\n\n**Documentation** - [https://abelljs.org/abell-renderer/](https://abelljs.org/abell-renderer/)","readmeFilename":"README.md","_id":"abell-renderer@1.0.0-alpha.6","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-Pp5q5Fcqrg4loXWGUtDYVKBYHfd3DuWhll1XaXZnWVSrN58HorPJSv9+HFJgehEjlhUtvm2AORd6avJ2N7OboQ==","shasum":"40e002ddaaec72b6b2f068194fe409dcc4e009a0","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-1.0.0-alpha.6.tgz","fileCount":20,"unpackedSize":32348,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh68xqCRA9TVsSAnZWagAAsQ4QAJFd1VSknFbJu0bmQEG4\npEQWrpIabe4HO5Ob8dmNs/KXQMHseLxYeRBLxG9yoYSc8XVORbKPESqETyru\nbneqyCsbGTkhq2z88Gp5eB9Z5Iv/DyJPUXb57b1rRS71LMNcP+OdDjvIs6Q3\ndE5ZUs/EPKK+dieHmkJywMqwcYIneXnrr5Qn0DcRE39DVGaMHDw8gsgni4uB\n1k1/e33vbhjtCs3XcNCxT561i/F5ZzgbFc/SkC54r4Zsb02GqaBz6mOOMoBW\n1Q0mGo+Z/FaTwRRZ6eQ17Kx8iqoq7cFqbDRGp9gAfWymHuk0IY3qh9E3tQjD\naXm5tTv5OpAhczWURhKIFBnlZfWF33TFALhpw3AoMkcxaYISfdX0I+psBJ+R\nq1Yu5NNPpno+ZVt7nSgmhO/p2d5VX1M34gXH5O2tx5odSpbIebrtUOdvkdcQ\nF0ividIzQpS+x211CmUz/8hpC98GVdNjTht5plPUfh4ahxvYaPSygCmmdvEX\nOGe8IaH9OEcGjf7ASTjHuIW74bzJMIAV1Y0j+kRP/1myv2WU/dc4WJ2IkOes\n5IJHM5s8lT8zWgaYU82e3pI5vMM+3OEtz5WqpTqLi7nOd/gX7R0BhH88uWuU\nfLEuC8papPULNGfJd1tzyFQ/X1Ra7hceJkrEprDS9MVgp34vSG7uj4yhy2gt\nFvCs\r\n=GfFi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDI1jSeSJp2Ejt3OBqm9t7NYqemwIfY/hlC/YZ5Zq2bNAiBZYUDqKw3cXPyxctatku5iiF9iHLpwMhDYB4+W0IYCgA=="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_1.0.0-alpha.6_1642843242012_0.11801906314339883"},"_hasShrinkwrap":false},"1.0.0-alpha.7":{"name":"abell-renderer","version":"1.0.0-alpha.7","description":"A template engine used in [Abell](https://github.com/abelljs/abell).","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"test":"jest","dev":"yarn example:dev","example:dev":"yarn ae dev","dev:with-ts-run":"ts-run src/example.ts -w","start":"ts-run ./src/example.ts","serve":"yarn build && node dist/example.js","build":"tsc","eslint":"eslint","prepublishOnly":"yarn eslint && yarn build"},"keywords":[],"author":"","license":"ISC","dependencies":{"acorn":"^8.3.0","htmlparser2":"^6.1.0","postcss-selector-parser":"^6.0.6","stylis":"^4.0.10"},"devDependencies":{"@types/stylis":"^4.0.1"},"readme":"# Abell Renderer\n\nA template engine used in [Abell](https://github.com/abelljs/abell).\n\n**Documentation** - [https://abelljs.org/abell-renderer/](https://abelljs.org/abell-renderer/)","readmeFilename":"README.md","_id":"abell-renderer@1.0.0-alpha.7","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-23dab78I4NYuZDD7GRNWkY32UYTuKdaW2Hzlb7xgS1uYe6VTqLzQEcj0a4tGNsO3EaGt7C9mZRaeASdb5p7o3A==","shasum":"6ff4fcd15f295eee9444bfbe52b08471f7b6162c","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-1.0.0-alpha.7.tgz","fileCount":18,"unpackedSize":25686,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh681rCRA9TVsSAnZWagAA3lMQAKScujJrpeWZb0CcFyB3\nZFXoZy1T927bX3X2xtv02wAyKeiFrE4QU0P5pSKChaLtQheBUFYtgdSt8Bju\n1h7WgEJX4K4clO9w/IQga7cKVfcXAVhG08Ha3OIQ2m6FctOW945Cr1j7gvNq\nMIqMm/RLWCbU8ZxH47c7FY+cYrfP/yOlB7BN7Eg7vwf5MqQzoV2D36Enk983\nUZtSp0sowSLzVdiS7R5ze3413wzEqF5r1Av6eMcEUJk5xjmpgZJ2CzHSClRN\n/mKl9r5hkIAX4VPz3xwTJ6Hu60bO1hi/ThH16XPoCOsphbPIgES1fuI3I971\nKL3V7ShrXtsWq9mKQFg7s6Y61F9azLNavvGy5vMx2abuC084Fuca1DLjPAc+\n26LQ+K82FJ54JpSCI0z/8upYA9Hq+Tk1LCB0WlobVAex/SO2zqrZukClJ2b1\nH8pgGBtCOGEN2aNq38PTUMB7saYWLtRD/uMcmSQ12rZ3jIL92MwPtWLJqJ1q\nCW+34b2wuPvmOrR2BCJvEmOkJW5kr3chGjVy9tyc2NxYB8kyn7Oj71gfZF1q\neoTksnIIESvZedq60QF4tiiySyok0cmK7ubsNif7rqfvqpawZy+/x8fotutu\nPSbAZ8MpZyPbZYVA0zvPYo0qxX8/Qmm3YtLivQxpqDq+1prJlZdIhKTwbop5\n4OTX\r\n=PF+Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBLrvKScSjtnm4o9EHI3dV6peggt0SFnxyocAIimR2HDAiAXf2RDYam/hQAzzLU0rJBLgim00cB0c7rg8z52ih2mUw=="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_1.0.0-alpha.7_1642843499564_0.5085133286231311"},"_hasShrinkwrap":false},"1.0.0-alpha.8":{"name":"abell-renderer","version":"1.0.0-alpha.8","description":"A template engine used in [Abell](https://github.com/abelljs/abell).","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"test":"jest","dev":"yarn example:dev","example:dev":"yarn ae dev","dev:with-ts-run":"ts-run src/example.ts -w","start":"ts-run ./src/example.ts","serve":"yarn build && node dist/example.js","build":"tsc","eslint":"eslint","prepublishOnly":"yarn eslint && yarn build"},"keywords":[],"author":"","license":"ISC","dependencies":{"acorn":"^8.3.0","htmlparser2":"^6.1.0","postcss-selector-parser":"^6.0.6","stylis":"^4.0.10"},"devDependencies":{"@types/stylis":"^4.0.1"},"readme":"# Abell Renderer\n\nA template engine used in [Abell](https://github.com/abelljs/abell).\n\n**Documentation** - [https://abelljs.org/abell-renderer/](https://abelljs.org/abell-renderer/)","readmeFilename":"README.md","_id":"abell-renderer@1.0.0-alpha.8","_nodeVersion":"15.9.0","_npmVersion":"7.5.3","dist":{"integrity":"sha512-6NRO1a5N1E+tZdnVxjDTTk80H3kK1Dciw66t+9fQcR1ZRpwU99ILMPO8YjzMKx/3iGILWnWQGRH9ZVNDCabjSg==","shasum":"208e5fc967a5cf3b2db9586a8bdb430790128649","tarball":"https://registry.npmjs.org/abell-renderer/-/abell-renderer-1.0.0-alpha.8.tgz","fileCount":12,"unpackedSize":8453,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh/o3lCRA9TVsSAnZWagAAsC8QAI+OARDKPZej2Ff3djtH\nU0tWkiQwrHKLeZVzFRG5EiT6awRxZIjwzz8SDImXtUUK1I3epq6p1JYC3c2W\nfwKPxbhApcDZttsGzu0+FTFzEKtFCeAUim0TMdJowUetIlSK9qCR0/WnyQYl\nRIbLMtA8lNCFH/xJCMn725tMg13tgADb1DqYzkJ6jyFnEm2NIcM9jDLdYeCS\ncMnDDD74OrM4On9yCiEYeQd8EcL39mdUlBKNJM1OlQ7JxN8hLrIyJNyeJXks\nIjgQOFbUPLYCENKa1rCyDSAqmphbwIVjGukf+AWtMQGjvHjo2Xh88dJ4UZYI\nNg0s6R+aO4i8GsH4owke7UYoyroI5uA4aJO6Z2O0ErhMya2AexxSi+5MEvrT\nsXGaXrWPU30H2Jhk2/eXkE64cMjEctpGNViYFKi+NDnng9t9J7D0zMoyvGZ6\nxNfo3s5+y0BTQwCownWeuiHDagsHP2goop4PadXtnEV2YcpWKtOUEaTqAgBV\noWtckus+DMcogO7UEDwVvYzxYY1eHvXace3b+luv1a1652tLQsf7Bg7nt/ZC\n84uLrcC2qXB1/PrQVuso6kFSPKBI793psoMo8OuVQNhof6cBIaHpbOmXUWXi\nXHm1uPnFGNmJi4U+zJcz71cLadOLGq4/9yXz7biheySpnke5FgEnLy6n4xto\nek8Y\r\n=9926\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICRWeUYBX1PWD8ui7km2G+9CA1akcBlKQdjWq9p0U77UAiEA8yKRtQiUU7Lz6DPDnmEUNA+WncgQTB/Fdl57OALfLEE="}]},"_npmUser":{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"},"directories":{},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/abell-renderer_1.0.0-alpha.8_1644072420977_0.15673166870762234"},"_hasShrinkwrap":false}},"time":{"created":"2020-05-01T18:58:17.631Z","0.0.1":"2020-05-01T18:58:17.751Z","modified":"2022-04-11T12:23:56.546Z","0.0.2":"2020-05-02T05:41:15.348Z","0.0.3":"2020-05-04T07:09:30.885Z","0.1.0-alpha.2":"2020-05-07T06:32:02.802Z","0.1.0-beta.1":"2020-05-07T08:06:36.536Z","0.1.0":"2020-05-07T08:59:23.853Z","0.1.1":"2020-05-07T09:41:46.240Z","0.1.2":"2020-05-07T15:27:04.207Z","0.1.3":"2020-05-08T15:54:32.561Z","0.1.4":"2020-05-11T09:21:08.364Z","0.1.5":"2020-05-14T14:47:07.921Z","0.1.6":"2020-05-21T05:36:59.140Z","0.1.7":"2020-05-21T11:46:35.546Z","0.1.8":"2020-05-21T17:44:41.656Z","0.1.9":"2020-05-21T18:22:41.910Z","0.1.10":"2020-05-28T07:29:30.288Z","0.1.11":"2020-06-04T12:59:07.076Z","0.1.12":"2020-06-07T10:59:30.600Z","0.1.13-alpha.1":"2020-06-20T15:38:06.787Z","0.1.13":"2020-06-20T17:26:37.719Z","0.1.14":"2020-06-24T18:19:02.835Z","0.1.15-alpha.1":"2020-07-05T13:49:22.309Z","0.1.15":"2020-07-05T15:53:31.403Z","0.2.0-alpha.1":"2020-07-24T18:35:19.331Z","0.2.0-alpha.2":"2020-07-24T18:43:08.353Z","0.2.0-alpha.3":"2020-07-25T07:04:46.467Z","0.2.0-alpha.4":"2020-07-25T18:41:23.979Z","0.2.0-alpha.5":"2020-07-27T08:53:44.596Z","0.2.0-alpha.6":"2020-07-27T13:13:06.850Z","0.2.0-alpha.7":"2020-07-28T07:58:38.623Z","0.2.0-alpha.8":"2020-07-29T05:45:58.523Z","0.2.0-alpha.9":"2020-07-29T07:59:12.856Z","0.2.0-alpha.10":"2020-07-31T07:01:03.172Z","0.2.0-alpha.11":"2020-08-01T08:51:03.274Z","0.2.0-beta.1":"2020-08-02T11:15:22.461Z","0.2.0-rc.1":"2020-08-06T16:36:47.934Z","0.2.0-rc.2":"2020-08-11T10:03:33.395Z","0.2.0-rc.3":"2020-08-14T17:11:53.921Z","0.2.0":"2020-08-14T18:30:10.458Z","0.3.0-alpha.1":"2020-09-14T08:32:12.140Z","0.3.0-alpha.2":"2020-09-17T16:41:08.281Z","0.3.0-alpha.3":"2020-09-20T07:36:27.229Z","0.3.0-beta.1":"2020-09-20T09:56:13.605Z","0.3.0-beta.3":"2020-09-20T17:13:31.684Z","0.3.0":"2020-09-21T06:56:36.885Z","0.3.1":"2020-09-21T08:40:28.871Z","0.3.2":"2020-10-29T15:37:15.459Z","0.3.3-alpha.1":"2020-11-02T19:01:31.130Z","0.3.3":"2020-11-03T14:38:58.876Z","0.3.4-alpha.1":"2020-11-07T10:56:29.789Z","0.3.4-alpha.2":"2020-11-08T18:21:14.104Z","0.4.0-alpha.1":"2020-11-11T10:01:33.639Z","0.4.0-alpha.2":"2020-11-17T13:34:13.352Z","0.4.0-rc.1":"2020-11-20T08:47:15.079Z","0.4.0":"2020-11-20T09:10:54.269Z","0.5.0-alpha.1":"2020-12-03T16:25:47.137Z","0.5.0-alpha.2":"2020-12-03T16:45:15.825Z","0.4.1":"2021-01-17T11:02:48.061Z","0.4.1-alpha.1":"2021-03-14T13:45:47.156Z","0.4.2":"2021-03-14T13:55:13.757Z","1.0.0-alpha.3":"2021-07-25T14:11:04.799Z","1.0.0-alpha.4":"2022-01-22T08:24:33.459Z","1.0.0-alpha.5":"2022-01-22T08:29:19.706Z","1.0.0-alpha.6":"2022-01-22T09:20:42.167Z","1.0.0-alpha.7":"2022-01-22T09:24:59.801Z","1.0.0-alpha.8":"2022-02-05T14:47:01.104Z"},"maintainers":[{"name":"saurabhdaware","email":"saurabhdaware99@gmail.com"}],"description":"JavaScript based Template Engine. Compiles .abell files to .html","homepage":"https://github.com/abelljs/abell-renderer#readme","keywords":["ejs","template-engine","template","compiler"],"repository":{"type":"git","url":"git+https://github.com/abelljs/abell-renderer.git"},"bugs":{"url":"https://github.com/abelljs/abell-renderer/issues"},"license":"MIT","readme":"","readmeFilename":""}