{"_id":"@agarimo/template","_rev":"1-e4d4d94a5ee1cb722e5f532a4e1ca3f8","name":"@agarimo/template","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@agarimo/template","version":"1.0.0","description":"Template engine","main":"src/index.js","scripts":{"test":"eslint --fix . && jest --silent --coverage --maxWorkers=4 ."},"repository":{"type":"git","url":"git+https://github.com/agarimojs/template.git"},"author":{"name":"Jesus Seijas","email":"jseijas@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/agarimojs/template/issues"},"homepage":"https://github.com/agarimojs/template#readme","devDependencies":{"eslint":"^8.12.0","eslint-config-airbnb-base":"^15.0.0","eslint-config-prettier":"^8.5.0","eslint-plugin-import":"^2.26.0","eslint-plugin-jest":"^26.1.3","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2"},"publishConfig":{"access":"public"},"dependencies":{"@agarimo/evaluator":"^1.0.0","escodegen":"^2.0.0","esprima":"^4.0.1"},"gitHead":"1b9b3ee178b0e6c1a2aa2db608f335eeb9dcac69","_id":"@agarimo/template@1.0.0","_nodeVersion":"15.14.0","_npmVersion":"7.7.6","dist":{"integrity":"sha512-NqCJ10dOSp8xsynerPMRdAiD3rFO/fcFfix8C7kbL0zpjKbXgTxk5B3CDClrwBHg7CtnkIXHtfQMblpPpnNUdA==","shasum":"3f5aea289e56e59197acd94320207a8763620ce0","tarball":"https://registry.npmjs.org/@agarimo/template/-/template-1.0.0.tgz","fileCount":8,"unpackedSize":21528,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICfxTo8zwC0XhISei5GHPW06fBJq2+d7y1rS8pnQPcpcAiEAseQs15t2xdmbCIEBLockT2JMNdtB9BqIt8NDbCpIcNY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWh6BACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqahQ//UIZcoFoiVa03prYeGidP8kj/k0sy9+DwD84c1lf2rl8/Adx+\r\nXqDxLFIMA99wYnip6m+Yjdnhz3Jn0rabyOMIQzXJi5inOB5EJPRKUp+toDSi\r\nKhQUmUfx+xdXSsJoYGpITtFo2veK7BnPQW20xVAuZISczuclRiilnV6I0nwZ\r\nTPJD6SsWBzb85h8XGqbDYHxnjT8X7KaNH3D+bp39Sc/PgCTWwf5DOWIC+Ayx\r\nptggVTwdLJJkp0n+7qpToEqI/I2eD/lJ13FUUyQAX7WPYJDjObbuQdDVwoU1\r\noJpdcgD2hTuairaeBw6hWekE3r5p+VRCiscvp0udMFn2V4UYV3DPdJpDMKgf\r\ncbRvzJH+Xfxvlktw0Y5luaQ1Sxy+/ncSYUi4UTlyGTb2Hw5SpiPpaOdkd4i+\r\nKa0aDTowsJQk3eV/S3THnSpxN5d0nl1Y0MxeapgCFhb0eHuCQS7Bot7UEKnJ\r\nmjC1fJ//f+fSJYwdUBq08lNBvmP3/nYcGPIeEe0TxnkxOw/jLAQjjKmkcyLE\r\njjhAHi/2SuoiAn5ZGLfnk9KZKavWkfIyDmv4gSC4U2kc3TL0vrm8tYfK8T2i\r\n/RJKTTxVL7B13ZtBmuXRUCyqSqP2SHAzCMFD05xlB4B8fmdGXj2PAHI71x/g\r\nAS5eVgTV8zT7uFyDTfOZYjjkoL+moNUvdU4=\r\n=r2y/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jesus-seijas","email":"jseijas@gmail.com"},"directories":{},"maintainers":[{"name":"jesus-seijas","email":"jseijas@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/template_1.0.0_1650073217535_0.10541632199574202"},"_hasShrinkwrap":false},"1.0.1":{"name":"@agarimo/template","version":"1.0.1","description":"Template engine","main":"src/index.js","scripts":{"test":"eslint --fix . && jest --silent --coverage --maxWorkers=4 ."},"repository":{"type":"git","url":"git+https://github.com/agarimojs/template.git"},"author":{"name":"Jesus Seijas","email":"jseijas@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/agarimojs/template/issues"},"homepage":"https://github.com/agarimojs/template#readme","devDependencies":{"eslint":"^8.12.0","eslint-config-airbnb-base":"^15.0.0","eslint-config-prettier":"^8.5.0","eslint-plugin-import":"^2.26.0","eslint-plugin-jest":"^26.1.3","eslint-plugin-prettier":"^4.0.0","jest":"^27.5.1","prettier":"^2.6.2"},"publishConfig":{"access":"public"},"dependencies":{"@agarimo/evaluator":"^1.0.0"},"gitHead":"1b9b3ee178b0e6c1a2aa2db608f335eeb9dcac69","_id":"@agarimo/template@1.0.1","_nodeVersion":"15.14.0","_npmVersion":"7.7.6","dist":{"integrity":"sha512-plRJT9b7TC+kmD5sI5lAEQBmgl5TnEe8J6kvryU3WSCyapwf7RNUjrK/Nf5KgVmaLenHuFGKU+rqCKmvU5NVLA==","shasum":"bea12d2af86db3f547a53f4caef0defd48461777","tarball":"https://registry.npmjs.org/@agarimo/template/-/template-1.0.1.tgz","fileCount":8,"unpackedSize":21476,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvjjkyVBbo4EpZpr+1LF93Nd9Udhymyae4WJz7V9aOGAIgY/0Qti9E4i9nXCF7Ina84nDbYP2h2oQNCavb6LKHnU4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWh9ZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpfxA//W5iByyatz0lqiUjH289TQY7Ohr/X8rZYgmPB+V85Cl1ylIjx\r\nIuqyo5o06/fwEzZTbOQkn2y+OmRyL6ZN65dL7MQYpw87dItTmGbuUF2wY8od\r\n6p4RgobgZLTViHkH41Y7egi+3L6ODvgWb/SF4gOnsOv7JPrLZTFOpL4QQUtT\r\nlAMP/vIDTZFz7Y2TgX21/mybe+6hWfAn6BTvIX1aZV5yebFyDXYVmA1sMXoK\r\ntsdgp5QhgowrO/whc7SrHe+MCXXkADHCMXZ+iKnAMCWnLSnI0ceR/gmSWw0C\r\nvDY32265hX8IiuKLqj88EOIkQa7rt9pi+rsn1b1Pz94XBB1++5kwMBiyAsDr\r\nTJpFcgNKV8poaTqqWmchmGM5Ak1k4lOsf2kr/FS1NjSL7QfekqFVzy1QiogA\r\nSZRppHEKKX7C/QJzg2RyWa+8oedbSs+0fOcvbB/pKBZzCJwQEvFQc0Mnq1Ka\r\nppRrpzesF0UBMqCWR7whPoJpcWnirEh5Taj/F91t1P/BPPQKB5oaJr8FT0rp\r\nW07xB4LdSbKI9K7/UfWS1ybejtbYC/byqauEoEUQA/d+YvbmrOH5ohEzfLj3\r\nUGNTXQyM8or4SAHhJrv6mbcYrVCXEKLBtguHo2iXIytaVajR8lM51jGhCywW\r\nUu7YSa6XXt7SGR9CQ9d4e02K1X/MpB2jAgM=\r\n=UmCN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jesus-seijas","email":"jseijas@gmail.com"},"directories":{},"maintainers":[{"name":"jesus-seijas","email":"jseijas@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/template_1.0.1_1650073432980_0.33928641721674224"},"_hasShrinkwrap":false}},"time":{"created":"2022-04-16T01:40:17.486Z","1.0.0":"2022-04-16T01:40:17.694Z","modified":"2022-04-16T01:43:53.263Z","1.0.1":"2022-04-16T01:43:53.149Z"},"maintainers":[{"name":"jesus-seijas","email":"jseijas@gmail.com"}],"description":"Template engine","homepage":"https://github.com/agarimojs/template#readme","repository":{"type":"git","url":"git+https://github.com/agarimojs/template.git"},"author":{"name":"Jesus Seijas","email":"jseijas@gmail.com"},"bugs":{"url":"https://github.com/agarimojs/template/issues"},"license":"MIT","readme":"# template\r\n\r\nIt's able to template strings or objects and fill them from a context.\r\n\r\n## Example with string\r\n\r\nYou can use an string as template.\r\n\r\n```javascript\r\nconst { template } = require('@agarimo/template');\r\n\r\nconst result = template(`Hello {{ name }} {{ age }}`, { name: 'Anna', age: 30 });\r\nconsole.log(result); \r\n// Hello Anna 30\r\n```\r\n\r\nOr you can compile the template and get a function that you can use with different contexts.\r\n\r\n```javascript\r\nconst { compile } = require('@agarimo/template');\r\n\r\nconst compiled = compile(`Hello {{ name }} {{ age }}`);\r\nconst result = compiled({ name: 'Anna', age: 30 });\r\nconsole.log(result); \r\n// Hello Anna 30\r\n```\r\n\r\n## Example with an object\r\n\r\nYou can use an object as template.\r\n\r\n```javascript\r\nconst { template } = require('@agarimo/template');\r\n\r\nconst source = {\r\n  name: '{{ name }}',\r\n  age: '{{ age }}',\r\n}\r\n\r\nconst result = template(source, { name: 'Anna', age: 30 });\r\nconsole.log(result);\r\n// { name: 'Anna', age: '30' }\r\n```\r\n\r\nOr you can compile the template and get a function that you can use with different contexts.\r\n\r\n```javascript\r\nconst { compile } = require('@agarimo/template');\r\n\r\nconst source = {\r\n  name: '{{ name }}',\r\n  age: '{{ age }}',\r\n}\r\n\r\nconst compiled = compile(source);\r\nconst result = compiled({ name: 'Anna', age: 30 });\r\nconsole.log(result); \r\n// { name: 'Anna', age: '30' }\r\n```\r\n\r\n## Example with forEach in string\r\n\r\nYou can use {{ #collection }} to start a forEach over collection, and {{ /# }} to end the forEach.\r\n\r\n```javascript\r\nconst { template } = require('@agarimo/template');\r\n\r\nconst context = {\r\n  name: 'Products',\r\n  category: 'software',\r\n  products: [\r\n    { code: 'SO1', name: 'Software 1', value: 500, parts: ['a', 'b', 'c'] },\r\n    { code: 'SO2', name: 'Software 2', value: 600, parts: ['d', 'e', 'f'] },\r\n    { code: 'SO3', name: 'Software 3', value: 700, parts: ['g', 'h', 'i'] },\r\n  ]\r\n}\r\n\r\nconst input = `For {{ name }} the category is {{ category }}. We have {{ products.length }} products that are: {{#products}}\r\n- {{ code }}: {{ name }} ({{ value }}€) Composed by: {{ parts.join(', ')}}{{ /# }}`;\r\n\r\nconsole.log(template(input, context));\r\n// For Products the category is software. We have 3 products that are:\r\n// - SO1: Software 1 (500€) Composed by: a, b, c\r\n// - SO2: Software 2 (600€) Composed by: d, e, f\r\n// - SO3: Software 3 (700€) Composed by: g, h, i\r\n```\r\n\r\nThe collection can be a javascript expression. Example, you can use filter\r\n\r\n```javascript\r\nconst { template } = require('@agarimo/template');\r\n\r\nconst context = {\r\n  name: 'Products',\r\n  category: 'software',\r\n  products: [\r\n    { code: 'SO1', name: 'Software 1', value: 500, parts: ['a', 'b', 'c'] },\r\n    { code: 'SO2', name: 'Software 2', value: 600, parts: ['d', 'e', 'f'] },\r\n    { code: 'SO3', name: 'Software 3', value: 700, parts: ['g', 'h', 'i'] },\r\n  ]\r\n}\r\n\r\nconst input = `For {{ name }} the category is {{ category }}. We have {{ products.length }} products that are: {{#products.filter(product => product.value > 500)}}\r\n- {{ code }}: {{ name }} ({{ value }}€) Composed by: {{ parts.join(', ')}}{{ /# }}`;\r\n\r\nconsole.log(template(input, context));\r\n// For Products the category is software. We have 3 products that are:\r\n// - SO2: Software 2 (600€) Composed by: d, e, f\r\n// - SO3: Software 3 (700€) Composed by: g, h, i\r\n```\r\n\r\n## Example with iterator in object\r\n\r\nIf you have an array in an object, each element that contains the field _iterator_ between underscores with a value that starts by #, then it will be consider an iterable object, like in the previous forEach example.\r\n\r\n```javascript\r\nconst { template } = require('@agarimo/template');\r\n\r\nconst source = {\r\n  name: '{{ name }}',\r\n  category: '{{ category }}',\r\n  cards: [\r\n    {\r\n      _iterator_: '#products',\r\n      name: '{{ name }}',\r\n      value: '{{ value }}',\r\n    },\r\n  ],\r\n};\r\n\r\nconst context = {\r\n  name: 'Products',\r\n  category: 'software',\r\n  products: [\r\n    { code: 'SO1', name: 'Software 1', value: 500, parts: ['a', 'b', 'c'] },\r\n    { code: 'SO2', name: 'Software 2', value: 600, parts: ['d', 'e', 'f'] },\r\n    { code: 'SO3', name: 'Software 3', value: 700, parts: ['g', 'h', 'i'] },\r\n  ],\r\n};\r\n\r\nconsole.log(template(source, context));\r\n// {\r\n//   name: 'Products',\r\n//   category: 'software',\r\n//   cards: [\r\n//     { name: 'Software 1', value: '500' },\r\n//     { name: 'Software 2', value: '600' },\r\n//     { name: 'Software 3', value: '700' }\r\n//   ]\r\n// }\r\n```\r\n\r\n## Access the current element when iterating\r\n\r\nSometimes you want to access the current element. Also sometimes the elements are not objects, so you will want to access their values directly.\r\nYou can do that with _current_ between underscores.\r\n\r\n```javascript\r\nconst { template } = require('@agarimo/template');\r\n\r\nconst source = 'Product list: {{ #products }}\\n- Product \"{{ _current_ }}\"{{ /# }}'\r\n\r\nconst context = {\r\n  name: 'Products',\r\n  category: 'software',\r\n  products: [\"SO1\", \"SO2\", \"SO3\"]\r\n};\r\n\r\nconsole.log(template(source, context));\r\n// Product list:\r\n// - Product \"SO1\"\r\n// - Product \"SO2\"\r\n// - Product \"SO3\"\r\n```\r\n\r\n## Access the parent when iterating\r\n\r\nYou can access the parent object with _parent_ between underscores.\r\n\r\n```javascript\r\nconst { template } = require('@agarimo/template');\r\n\r\nconst source = 'Product list: {{ #products }}\\n- Product \"{{ _current_ }}\" category is {{ _parent_.category }}{{ /# }}'\r\n\r\nconst context = {\r\n  name: 'Products',\r\n  category: 'software',\r\n  products: [\"SO1\", \"SO2\", \"SO3\"]\r\n};\r\n\r\nconsole.log(template(source, context));\r\n// Product list:\r\n// - Product \"SO1\" category is software\r\n// - Product \"SO2\" category is software\r\n// - Product \"SO3\" category is software\r\n```","readmeFilename":"README.md"}