{"_id":"kurly","_rev":"15-0f41417add4123978bf3f7180494995d","name":"kurly","dist-tags":{"latest":"2.0.0-beta.3","beta":"2.0.0-beta.5"},"versions":{"0.0.1":{"name":"kurly","version":"0.0.1","description":"Pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"test":"mocha *.spec.js","prepublish":"npm run test"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","1kb","template","ulog"],"author":{"name":"Stijn de Witt"},"license":"CC-BY-4.0","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"chai":"^4.2.0","mocha":"^6.1.4","sinon":"^7.3.2"},"gitHead":"9c58797ece09d0f2e0378a9d6775513e6d0b0f20","_id":"kurly@0.0.1","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-CVUqLkcX4I+Vk1fAo4U93rtDWSvUJMe5gEmhTTLdhvX485i2df8qqTcfaEExyxDjZuvEgOfLJf//A1odt+vozw==","shasum":"fa3bcce79fe02811435cb125c270966bf623094a","tarball":"https://registry.npmjs.org/kurly/-/kurly-0.0.1.tgz","fileCount":4,"unpackedSize":1014,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdFNhICRA9TVsSAnZWagAAkDMQAIdWL01UYp7SCcsjFvJJ\nogn7TgZmQAsjeVv8L7S5B1lnx+y8+36P2/ZsD5d5znyGVsn46EbqWmxw6h2t\n79Xz7Um4ngxrFbfuG3yDVjL85fYGQzmkUCUltI6gHF8zVI5TGODqSp0rvnMI\ngcqBQPp0gyxXElPUCCOPH/LXs6IDEEOu4QwoS8HvhZh1hon+mNtZBeqK2ZMg\nO+4z/sfUJJSocO6KR5AH8AhmloZ2dN3DWVTW21crQwjzHB4J3Mfc9X4kmIqT\ny4xTx9O7GBwpEERoB63kw9LegNWBWOYwra8QVeqh8mAZqYGI1UnmL3tEX/BF\noDycoCkFyayKz0aGoJM2W5YWLclBa+7eURGTwJtEc0n9uDLnRm5tqTvcLupo\n+qj55Crgp+W/DnKSRqwqIVolfaPCdkaIzWGqcqvOEXzyGpQzA6R3nrDGs3la\nwsO8ENAREqodAaouGJxmv2DQ7LojpL9cJQcZeSY3rAmf4Uv8u8RXR/vQ8uNw\nhsqEyxtWf7jx2puRj3ZLNIfZMwuQnO+3NWzvhPu8nGKd2aYsZOrXpiXij9Jp\n/wu0AVUwdMyt+M3Cb4Stk0/SDVBQRTghmfI33FWr5HctXOQMVy16xbsVsCTl\ncaI6iF1Jr7dApATJNW4lw6M/ML9NVFtmhYvFF3ULOS02hoWxxnDNKRM0Age6\nXl/8\r\n=Jylb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDj6kf3pAPTQMFr1zZhAw/IiJ0z5c5svAadEqaYk6ob+AiByHQOrjamvtPsYGCvVVTk+dU1Q/Jr4UzRnhgsCp0RIuA=="}]},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_0.0.1_1561647175999_0.17358012805877787"},"_hasShrinkwrap":false},"0.0.2":{"name":"kurly","version":"0.0.2","description":"Pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"test":"mocha *.spec.js","prepare":"npm run test"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","1kb","template","ulog"],"author":{"name":"Stijn de Witt"},"license":"CC-BY-4.0","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"chai":"^4.2.0","mocha":"^6.1.4","sinon":"^7.3.2"},"gitHead":"9c58797ece09d0f2e0378a9d6775513e6d0b0f20","_id":"kurly@0.0.2","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-VulgWB/uQFSWm3jGxs6ytFDLFn9v2Oo+Rn3TZH0DknntQMSP+TQt81lGvPtCTnFW0KbIdVnX1l8WIDN3ynfyqw==","shasum":"3210eef3f3801882192df59efed8e7be544d2969","tarball":"https://registry.npmjs.org/kurly/-/kurly-0.0.2.tgz","fileCount":4,"unpackedSize":1011,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdFNh7CRA9TVsSAnZWagAA2JUQAJoXAqrgbRDlfzOyI1qw\npBR76XepEcyqS776KXUnGvSEkFWKW8giyzwgQlCtbghiyL94WTY+J68w69hC\nBYjpV6M7cleBSkbRuT7gwRpOPobkRaMpfE7909dv4qMzlb2lenFxyID3rKDU\nYlazrDPvST3WZCkVFCdQzSkZS6ndcAbHEQpQhSDKqPkep82hZCTHmYejNmJB\nJVDcyG3i1Yq9oEZefupkTQt/gQkeH6+o9O77XuqbeZuqKlFXlQN1zWhKpFp3\nrn26wcrZvHGdbZpiZlxL99AW1/m9h5nDILJ+G62HMalqX9KW+44u7RARq8Zz\nBFvPfHaUOZxeXHMd1Qe+6DoGsyAXk39lmYq0VjQz3hOlVJK6q1vQHdcW0HM6\nHYZ9KihRhkrHPeSKur2uJNy8iurlMS3a9bUk+kQ8YVi71EXWcc/DT69W4qN9\nxsI1dj12nIUF2SUM3R1riKZqYrtj8cqMTOjwGRiMVPcxVdEie5oZ1kXBghHz\nr+voDEkwe7bPZwvC1LjAt+iFas0KV1qjAI69haQAJoQnkssBRUmju7k6bTmA\nOOdqK+hzlXMvsVr6fIl82GYuqxHo4BNLt121Z4qFW7wUxJQQHMzE7x4kD3ur\nqDAXe/BDtUCSXFC6U1YXQ9SbHWbxdkQnEADrF1lGdfgQCiebK3dMjEEgKrjs\nLwcA\r\n=sbZj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxNzjqQOkzOw+LD5QRIfGj5HQY/4vlRhK8jGk0HiGQNgIhAKh9oxjlwZXU7/hO5lDcPHxwL/Wm6b1UUkBxEtsSYA5M"}]},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_0.0.2_1561647226942_0.15632935158255634"},"_hasShrinkwrap":false},"0.2.0":{"name":"kurly","version":"0.2.0","description":"Tiny pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"test":"mocha *.spec.js","prepare":"npm run test"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","1kb","template","ulog"],"author":{"name":"Stijn de Witt"},"license":"CC-BY-4.0","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"anylogger-debug":"^0.7.0","chai":"^4.2.0","debug":"^4.1.1","mocha":"^6.1.4","sinon":"^7.3.2"},"dependencies":{"anylogger":"^0.17.0"},"gitHead":"011183fc92e0dc93ccdf45408149858a7ad8c68e","_id":"kurly@0.2.0","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-p5m4F+wcRT8x26NqIf0JX4rezYQ8ZNwZ936syZEVYMVQ9tpIXJjT6CzTyRIFyzX08zIUx6NlkNdo2HbWDGUftA==","shasum":"2748b71b3e85a02991a9645cb6c869e629eb71f5","tarball":"https://registry.npmjs.org/kurly/-/kurly-0.2.0.tgz","fileCount":6,"unpackedSize":209716,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdG3RyCRA9TVsSAnZWagAA5R4QAJPT9M9MZMxHGXbsgYIp\nQBlHa7NBAZAhNAeriyRKKDgrBEiSrAyDSd6xR1JWQqCLObHSAYw6q42xSeJG\n72iFOOxS3NgCKi9I8hqAO5jnS/uG/9jJ9iXfoR3U4EwutRLMFt6BeZcLh4/J\nMZ5rdRhzeWNXesJsOHD7pc0GI4Ssvwlhe7OnjCZ1pD/O7ZW80U3IpRyKY8cp\nNH90cPPsXxaeDYvjvux2uOTNWTgg2nDUm8B6jJkuywBUJv0qRM1A3RAYlZ9N\nQpfxkWtqaBVm4XP7vqlOcSKqPHWN3mC8Mok/kcHON4aP4dRcu6DK6+7l+1mE\nAZZmGDI0oRLoFSsDCbxa/0ADJLt6UNdd8U+C+ON/7VMc/445MICfymF2fsHi\nEX4PDCGWLJAPeRCvL1IkMbG3rr0C0yp/0rIrDrMj3ZeFPH2iwnULgGonwkXf\nFbeXr1gwBUsN+wbO2u+Z0yHQFhP9ULoAY4AFIRfHyTR7cV+WJw4FtgYIec8a\notTA1ZHu/lzLNDhorsNDQ7AjqEH0m/1M9hJQhDycEGKwuIS+MQ8fY5iId7oU\nwD/+5DfG0yCeZblWpF1J+jJa3tCPOhFMbox7gqq8uCuMMMm7/XzclKeoskQ2\nL6i2Wtxn5dSgvgxWKF6D7UPmhDNdtg/658dOqTwpfhM3yBbX3d05vxg/b7Q0\nuuMc\r\n=lroR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEoP8PqaCdEu/xVxSKx+xOZvo71gB9f3iDHDZnnTzfggIhAJtDhtQSf3cQ0Hat4jFNp7A+UkTTBSVekTkBGV0L3X3G"}]},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_0.2.0_1562080369985_0.36949825866036745"},"_hasShrinkwrap":false},"0.3.0":{"name":"kurly","version":"0.3.0","description":"Tiny pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"build":"node build.js","test":"mocha *.spec.js","prepare":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"CC-BY-4.0","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"anylogger-debug":"^0.7.0","chai":"^4.2.0","debug":"^4.1.1","gzip-size":"^5.1.1","mocha":"^6.1.4","sinon":"^7.3.2","uglify-js":"^3.6.0"},"dependencies":{"anylogger":"^0.17.0"},"peerDependencies":{"anylogger":">=0.17.0"},"gitHead":"dbca3ecead9de29463c39f63d83c96216bee9f73","_id":"kurly@0.3.0","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-N9hut6NzQemXzSSRKRJ20/sWVACits1YFqVL5Cv+tyvWDflBdHPt07TsnYJU6TwWkwM3gSRokbCRCcVqdxBB1w==","shasum":"1c1b483f4dafbf58a080923dd5f8b5ef56750c98","tarball":"https://registry.npmjs.org/kurly/-/kurly-0.3.0.tgz","fileCount":5,"unpackedSize":20685,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHbqECRA9TVsSAnZWagAAJ9MP/RlMZiqkHQpVrQ6Va5w5\njseoa50/TOfYFRJTj4J+UEl7iPATDES/HWS7yr/IjTw7o7OLaA7uqsv9c5mL\npgwcFaKGzj1S1p2RaIewgqxwnTdmBnXc10ITzGk++6OaXnvE5J3ezxtKXSxX\n7SFgm3hQdOLv/mdV+axNlIvtKbDbFW+lpw9vn1xOKWlJFrpK4brbous8pRTr\nGz1fdiiGEpKrYc+aABj7P3e54TvFwcaZUDy8WoWhGo5MCTa4sjau4KAzD+Od\nuHAkGvbn6T+4Q6Hnrg0qwkd6V3o3UIH7P4TQUvrT+Ppf6ruW6FcfbAKHkEhJ\nxT1fC6urzSaYBZgDUXYHUfhyma+fAwrBVLdpEKD3YfnND8T+cOlWVYXGcBhN\nWyrffwjY0MKhMHqvL0LF+LpZ6JfKKDaZDQwN5tc4M2nGbe5C4glGNhxHzEae\nV9Eu2H+255MnG+q5VnOvPO1Dp7B4hfrB0ZDV3c/H0aPnyFcRaf6yBbyiHv43\nEL2rWP4auvZmtMHA+MJzExy3VKS4FOYQ3vGKW4rVm6ZoRMPtitn68usFTAO1\noM1VRjW3tp+q31o5FmCM16++cLSsnRzNApWsCXQ8qF+9hv8OJrSVgSLN0cND\nNW9oLHaIxjPHSzTrEt+M3HkwB0s6DXrN/1F0tSmBXzxPuW+CTwWibFuXSKaa\nCPIp\r\n=7elb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzMGaPUMOvVXUri8SvAwn0nzZxzyDMXb9rlsXZkjo9GQIgdtvM6ZBdO1oFAWbEfNLr5n9MlKGzFU0gd9dO9UE2YEk="}]},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_0.3.0_1562229379749_0.9216508480254539"},"_hasShrinkwrap":false},"0.4.0":{"name":"kurly","version":"0.4.0","description":"Tiny pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"build":"node build.js","test":"mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"CC-BY-4.0","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"anylogger-debug":"^0.7.0","chai":"^4.2.0","debug":"^4.1.1","gzip-size":"^5.1.1","mocha":"^6.1.4","sinon":"^7.3.2","uglify-js":"^3.6.0"},"dependencies":{"anylogger":"^0.17.0"},"peerDependencies":{"anylogger":">=0.17.0"},"gitHead":"d4575524f3a520b01459b70e5bd9755d70bae1f1","_id":"kurly@0.4.0","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-Z8tQix/SA0uXywMEenl82VCT+N3Uy+npvvy+EO8JuaaUW3feHuUQozhNz+q0taxoKcIQOMu9VkjrZu5clmDRGQ==","shasum":"7c10f54b00dd9084a469bbc2aedfeb455bb928e0","tarball":"https://registry.npmjs.org/kurly/-/kurly-0.4.0.tgz","fileCount":5,"unpackedSize":21431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHgJTCRA9TVsSAnZWagAAdDAP/i9m2S4hvPRBcHIzVcig\n/0KgdR/PzEYDvjEg5RiqEOoC/63OjHwWQu5ms2rdtXNkTPdgevZEW7F0tw2i\nRtZNXgOkTrVDLwFDnDusmIlt0ETcKLNLJVpAMZvlSFH40CFGRo3QF3hYISvY\niCCt60rRmKLL5reCHafcKOTH7+Z0u7QlibDFWklTsXo2HPMbc5bqE8FQ0rha\nKp4jEk2r2vNUfuGyfugKYBhLinFy68iLVZxtqQin/AvCXMatu1VxpqSJrBVb\np4lQo1ZiVCm0oQxf0MxaPXfA2YjkbhMYEjZFYmrv5FWgoKl9DrLiHYzfjY4/\nOZDxFwDERi6os+h4VeGryw5e/TDuFwUqOirB2fRxmx3cadBpkHWbgDmnz01D\nG/EdZDrfMJJRSxi71jTaOPUEbwr9a3zAzQKuKVWVHiUb3ixLq/GAdr69V+4I\nwm70STIt2as4bNEJBInr1kmSdxanBF8UBn/fRL5XCkqD8a1onS2zjoVxL20y\nlL9MpjQkb4KFrpW4NmHBKKAtpq8vgdl4DrVTQTiYaoY05U/hE/rI+6oeYGHn\n4uESTr8AteGYQ8NFZt7XQsHlN2o9BCOnRvYAHU+MRcvvegYc5WKpLcrm1gHq\nVRG+tkZDRLIHue4zViCsc5aV+GMSf0emy/X8gUq0SrA5siMY+X8R2bTMD9wX\n7UFc\r\n=wSVN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCayzjVbO1pEoP4LQRFAd7+a27JTGsz9Nt1uKnh4ckO6AIhAMZRFnwH+IKR/zjpP0r7ovt1Q21SXDohQezbIYvUlJh5"}]},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_0.4.0_1562247762133_0.38493378309151005"},"_hasShrinkwrap":false},"0.5.0":{"name":"kurly","version":"0.5.0","description":"Tiny pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"build":"node build.js","test":"mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"CC-BY-4.0","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"anylogger-debug":"^0.7.0","chai":"^4.2.0","debug":"^4.1.1","gzip-size":"^5.1.1","mocha":"^6.1.4","sinon":"^7.3.2","uglify-js":"^3.6.0"},"dependencies":{"anylogger":"^0.17.0"},"peerDependencies":{"anylogger":">=0.17.0"},"gitHead":"64cb4b33f240952caee10626fb416db1af458097","_id":"kurly@0.5.0","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-SHhzsWitiyYDQ9Nduo8KZwvt3BVom0TXkEE8GZk6P2s1wm/4isVs9ZG2GofhojZFHknphI9RcjXuKEOQv8YrqA==","shasum":"a431cda4bacb555d6343a0b3bdce005fc5fa3087","tarball":"https://registry.npmjs.org/kurly/-/kurly-0.5.0.tgz","fileCount":5,"unpackedSize":21431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHgVSCRA9TVsSAnZWagAAWxcP/ivM1e3c7btUTZIvdn5w\nF01As/5Nz1br1SndlkZ4/7LGhIeT67A2gaonXYEOvtcJwpR59wWjPay2uBFa\n+ZbFQ80Pn8QXziPdbepMuS7cUttpzsd32rwK5Gk0AmWIRHNTZqBtuDdQrOve\nj1U7MRQ9fJ1oPsBzXOwr/SRGWVgf8kGRvPhkjv62ycpLdcI2SMyggRaXuhL4\nel8YfFqQ9NnX+0vs5U1f13qz6fFou6PxWX5RRxdR3U311sv51eU+D5DeTtZq\nwsXHFApQ0KZJtGIQ9WoznOePiql+idLi/qgRuLdLyCmi40KXeuLNtJVoSiIg\n254a0//5WJnQUoZ7YU0SJLc19riuEeIHZaw3gi7l+cu8dUzJqb3+cQH6P0fU\nEaQser7inqF7LAOU4spV936KMcqHJOwzhZuWjpb8GuXu/xlCa06u2+0j9DrR\nHcIW6LOayp81EElpkfDCQ+DM9+ty22A2hfRUBnYqu3mks8d5+B4yqIFtcCvb\nIhMRqif7Y/N0g99npiXz1vCj94rGCByHdRhOOks68vUlB7V9WXeKYlpEOWdI\nelVdLdl6BZ30mv6E+psxOZS8TTxX3+gPZcci38fnaurOq74JffgTfyZAS4sf\nAn8nXkIiTjAO4Drj7/DAOCmrPxPKlYZwN6KMxOLZo00x+UNm4j0LP/Nlbimf\nSLUE\r\n=VYQZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3IjAP+/SbBsSd+jT3m657kdXgqULP6So2yVZjvzzTtQIgI58CxfJaQ3pSdZkntbLNFESpOUdLF9znsVgLTZmt0V4="}]},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_0.5.0_1562248530103_0.27030821792052606"},"_hasShrinkwrap":false},"0.6.0":{"name":"kurly","version":"0.6.0","description":"Tiny pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"build":"node build.js","test":"mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"CC-BY-4.0","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"anylogger-debug":"^0.7.0","chai":"^4.2.0","debug":"^4.1.1","gzip-size":"^5.1.1","uglify-js":"^3.6.0"},"dependencies":{"anylogger":"^0.18.0","mocha":"^6.2.0","sinon":"^7.4.2"},"peerDependencies":{"anylogger":">=0.18.0"},"gitHead":"5589e87ca3a6e768f2703f92adf707bcce790a67","_id":"kurly@0.6.0","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"dist":{"integrity":"sha512-EzhnR6v68LY0SZD0ishx/Z87vUtJWek23VU0PFRNK9+g8ekI9CDNb5OB1Hx73m20/YMwtB4eyLe9xouudLkV3g==","shasum":"ad579fc073a410ef6f498d061b6ff18468dda835","tarball":"https://registry.npmjs.org/kurly/-/kurly-0.6.0.tgz","fileCount":5,"unpackedSize":21962,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJddXGXCRA9TVsSAnZWagAA4FEP/1tc6QNd8pVoNIPcVeOs\nGudii/OIuUgwHfI3wEmbzvXznZR9PRNIjC5TNDCJO7SpY6zKFZdVtENtrvee\naC+4nuwOvfja0Odc3E7/e2dWww1X8kQf3p2wJ8/5STrh9ypvnul9bRE5hLoh\n0whoehFmbK8kje5v4QwfKxJwR8maO7czLcjLgCcJ4khX9uQsM8KLe+e7SbKk\nrwx3DisbJQjNjakt7AdHNk61osrslsl23+1awps/Y3ktUZiAxPGvnoaOT6dS\nNP0A3TdS/VcPL2G0GnPfleSFBiMjG4rBTke8ro5Gk49kuiQjeeYuO86/lmoO\nV/y0QqwVGG7L4ptHnqs68Pbph8A+yw68yzv8RtPtc1V/nO8ddmgdqSN5oqns\nWT/jeEn+0MmwvDMspoE2/JwZPT9AU8S68SfSPOmlPwx/TIBN25us2N47+hbb\n37HSWeRyuOjnLLc5JEvd1dBPmYUyBClHemupixpJKZaFnh3/ddOj8dI1SoYq\nPEjeIr3YZjzNbqFDC2VbKusEL+7zd1hZrvxKL8dPq7+tthV4Cl2lP5XX8KFL\n4aSz/+gQKyOm4oTDON7Nkrg0GvzT2bQiBuRzXFCzDC+/39gImxogywu+K+jl\nZ3e9pSVvlrKGuRRj2HRXrcLXDssREg/+TXWudCa+2poDrw5uFwvfkIVFM/0j\nkpKJ\r\n=sCj+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDrxG6NzTPWJEfG4RtO0JwkPb+TtVMqjDDQ62dscZgxtAIhAJ7VUdVjD3lFcUXsxQqxZcsheNn/iv5sTBzGVTQc3mQW"}]},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_0.6.0_1567977878506_0.7513925117255285"},"_hasShrinkwrap":false},"0.7.0":{"name":"kurly","version":"0.7.0","description":"Tiny pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"build":"node build.js","test":"mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"CC-BY-4.0","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"anylogger-debug":"^1.0.1","chai":"^4.2.0","debug":"^4.1.1","gzip-size":"^5.1.1","mocha":"^8.0.1","sinon":"^9.0.2","uglify-js":"^3.10.0"},"dependencies":{"anylogger":"^1.0.4"},"gitHead":"706c93edfe884b14ca620b018348fab2c2614f31","_id":"kurly@0.7.0","_nodeVersion":"10.16.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-VoKSf6vYEx8Ec1zDyA1LiObQeCqtNrcngj7IWL6OzAQZb/pSW1exhGkSA5UfQColb4XpLuNL04PR42/XFc/oKQ==","shasum":"78c857eb6e81ecf363d742a24bafa03ac1aec9aa","tarball":"https://registry.npmjs.org/kurly/-/kurly-0.7.0.tgz","fileCount":5,"unpackedSize":21536,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfFf7rCRA9TVsSAnZWagAAZBkP/27p2kehaZsiYLCl8XTi\n3NIBIqtg5+V6QO1Wz5FdqyVk8z3dL+vaNWTKdExUZECx5eKZMGWadTQ19+qz\nDv8fhFkIvlEfzLOa6pWTgO5MBSIAOf71LPomNVhSfpZIyMSyiV7vyTRSqdvE\nR5ycWKHPTaMyqh8xAho1saMxFjqNUPCtmvlb9skWIF/PkPl/PI9mbToV0UIC\nAGFEHd+tFdPCwj8Z314esVJg3RCWV3E6zXurlKAPnCgcpmJlezZySkiyCDqe\nifZsAyAVB+OB9g69S9sop4nroBUL/3lFYuff2oyrSlE5/qtSAzN+/MivI+0/\npFL8k5zhKMiDZIrDGEZ9rSrYoCOBn+w364TDj1IpZe+EHmObaUR66z/dphZj\nBMMrelUXBqsVKWtTZdYfk7Zd7+2Z9m6ig2kxMt2oMiQWu9ZTVHR3WpV9eJS/\nAemTcXpSYbRdQT2crsT2tE4ok0UYWAjM5mv1yuB8fBBp6jyb6DmWNUfgstYL\nDARTCPjIppBDBfGUzzNSqgIp5i+5AHa9TJ/fgkZxUmuMsESn8bWjsIA3nQnW\nLC+iPQh6pFBv0oCzmgvsN5Z289rZ1KfjpJ1mmT1+JFmTVWtH5Ncfm2wI809x\nY3n+goi1xkN7gDMAbNbC1/2l2yGVYGv9rjGrn7zXSjBJgLXd7ILqMT4Wo50n\nvl0q\r\n=B3Zt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGGTKdHGNwP66aotCC/XB6k/2y3Y1CgBD8D2sGLmXfecAiEAvHUEADFgNwdnorhvzhrrPeR/OMPQHwkkN/g9SK3zX08="}]},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_0.7.0_1595277035455_0.10431518953113006"},"_hasShrinkwrap":false},"1.0.0":{"name":"kurly","version":"1.0.0","description":"Tiny pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"build":"node build.js","test":"mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"MIT","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"anylogger-debug":"^1.0.1","chai":"^4.2.0","debug":"^4.2.0","gzip-size":"^5.1.1","mocha":"^8.2.1","sinon":"^9.2.1","uglify-js":"^3.11.5"},"dependencies":{"anylogger":"^1.0.5"},"gitHead":"f5783f5039296f1565b58a5dd034316decf2912b","_id":"kurly@1.0.0","_nodeVersion":"10.16.3","_npmVersion":"6.14.8","dist":{"integrity":"sha512-LNq2KKgG2pZcPCHhhYQPM5BgI2hRKqblAn/2Aq0BcPCfdbHH3+fM3AZpod26nOr1iBBis7JrzX3mSkcPZKPptQ==","shasum":"37f1d6ad6b541428f8d620a45dd3d747463f891b","tarball":"https://registry.npmjs.org/kurly/-/kurly-1.0.0.tgz","fileCount":6,"unpackedSize":22510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqq2fCRA9TVsSAnZWagAA758QAKN6ki6xTyKSN43yTH4X\n2ZGDCaSDvVHd/2q4kcehpCBYl8OI4yTSdcrMpZi2ZVRBEQoJwtBShJsoghv1\ntOUZfK3eEebrN4oVSDIekKT+UybrpHT+kD/WmQ+ZewUiZAzjhwTTcImuSYh1\nHZCJUkwB8etshrQGqbhxWGHNlVqqKaatJJE7OV6ddqI3Nmsqk3kUwMzGFaqa\nb7CflP+Y85K5/1YXmINCU2Abkg5UD0MTYE3QVPSUVa20kj86G2nOP34FE+UN\n4MFaVEbcJKKdEFM4FjVQgoPEsirzt9sRwSmzmqVGjzzfv21yk1m/AbzR9e/m\npFtM+0P5PH2KKvUdcGshKp/sTr2dyZJSgD78htYzT9GcoLl3rT4rlZsWlcQB\nHJNA2ecJqbeNTZLkf/k6sJ+PXt5mnZYIp4bGlVbgUZGHGTIL8AXbixJQZDcZ\npp1Y/EPtWUAm1cQy9TH0yjVTx43x24admpqVyjqNm9PtwC3yNehKhuYRekoy\nH05TSotToMxo1VIEUJ57sLzFWEJF8hh9YPgVdBCWTo0hQ3I31WPMvuAd+48Z\nmkioPzkIWmRU4FanIz7u9s8uPQ7yOgnqamGAuaQKVqj5JrBc3HI1RCwOlS1J\nGhRaSLK7asjwnWKgTxns/8FDyFPmLX2u9CUJc27BfxatgGm4aA+UuPt88pt5\niA8P\r\n=LfOB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEutLEv8ln5EjZaQ0dCeBBebnrOlWunAhUkau2OKgsEJAiEAoJEzZ9jlri+/0L2YrXhbdWN4js4ahzpeLvLWK7flQhw="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_1.0.0_1605021086717_0.6781498469017722"},"_hasShrinkwrap":false},"1.0.1":{"name":"kurly","version":"1.0.1","description":"Tiny pluggable templating engine for Node and browsers","main":"kurly.js","scripts":{"build":"node build.js","test":"mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"MIT","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"chai":"^4.2.0","gzip-size":"^6.0.0","mocha":"^8.2.1","uglify-js":"^3.12.4","ulog":"^2.0.0-beta.10"},"dependencies":{"anylogger":"^1.0.10"},"gitHead":"e0d83cab12440864b9b1100bd179b3f16a47782a","_id":"kurly@1.0.1","_nodeVersion":"10.16.3","_npmVersion":"6.14.10","dist":{"integrity":"sha512-w+WMQ9KdyUqUAw6g25lbnUkA/5q+LZtYzRWzP2Qb6bd8IQoOWmG13WJnXBJOl8JgHxfGH9+PAof6gO/fK7sQXA==","shasum":"eb92ca8f1908ff7e8f78d80ddc37059cb4f4aab4","tarball":"https://registry.npmjs.org/kurly/-/kurly-1.0.1.tgz","fileCount":6,"unpackedSize":21916,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf9bwKCRA9TVsSAnZWagAAzzYP/i8ObzZ/taQ81iF2aixV\n+PCyAQgFTXCg6tAIkzHJHw10+NGBh9gMJFEXk0WPmLSofsUFzX6rXKR4JMDb\nbDH+JzkBDgi0ZHkkgPV7Gjld9wyy+b2wV6iNe7sGjUeXqsQrUcyjizdiaccg\n6w9CCybPIVf7t6FIA72Sc8LlRDRqH9BsMM98eVK2O7q7OuRdema0/8QE315P\nenLJRhOvoiHb0eEkygDvX21vpP+W1ENTt/6yrZx5smx+G+5+4RY6e+bgDYqN\nWPwq7k0T9zGsFA1tdGfaGfMmf3Of0C0v9McyiUmRIuLoaxwqeycIXO7jiHdn\nmqJkoGsdiqMb7dX+Ulxj/MBD8qnQEL0ABPqH6/J7bu5UMLUF0ZH1BRvdIlg8\nXt3HrG4vAeWBGCrhijCkLsoIoZGRdYzxCjzY7up1TycS/dWMUv7ovZAD6CkB\n823zx85oq9d4OSSCklLsOgziatO9JbwPXBTCluO6rlQJ87m4VylyhoLVTPRj\ng+lm2XMvMqvtr5J2QfxMB+lm+ynUFHM4nICSDeFBUyaF0yp1d12TLB9bid78\nP+Yp9jwsB+wVANMrn37UrMyvCr1z/qUf9cEp/AX7CB0Wdvffh/oNKBAWbf96\nmG5ikmNLwl/cCVu/CGEkaXF60XS1/k+Kz0tmktmP+JapWnxC3BG+PPUcDjU4\nLg7a\r\n=CsMu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDn+c+BJcLAp5QbRe/nzRQgKJzcKz/nA/8Xt3ExIfqn4wIhANbqmB+jKf+Zebi5sgd9kjhH+z++0Xwzt6s4kybX4cyj"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_1.0.1_1609939978248_0.7486386668310447"},"_hasShrinkwrap":false},"2.0.0-beta.1":{"name":"kurly","version":"2.0.0-beta.1","description":"Tiny pluggable templating engine for Node and browsers","main":"./kurly.js","types":"./kurly.d.ts","unpkg":"./kurly.min.js","scripts":{"build":"webpack --mode production && node build.js","test":"tsc && node test.js && mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","1kB","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"MIT","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"chai":"^4.2.0","chai-subset":"^1.6.0","gzip-size":"^6.0.0","mocha":"^8.2.1","uglify-js":"^3.12.4","ulog":"^2.0.0-beta.10","webpack":"^5.15.0","webpack-cli":"^4.3.1"},"dependencies":{"anylogger":"^1.0.10"},"readme":"# kurly <sub><sup>2.0.0-beta.1</sup></sub>\n\n![kurly](kurly.png)\n\n### Tiny pluggable templating engine for Node and browsers\n\n[![npm](https://img.shields.io/npm/v/kurly.svg)](https://npmjs.com/package/kurly)\n[![license](https://img.shields.io/npm/l/kurly.svg)](https://opensource.org/licenses/MIT)\n[![travis](https://img.shields.io/travis/Download/kurly.svg)](https://travis-ci.org/Download/kurly)\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\n\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\n\n![girly](girly.png)\n\n`kurly` is a tiny ~[1006](#gzip-size) bytes pluggable templating engine for\nNode and browsers. It can parse templates with tags to abstract syntax trees,\nwhich it can then compile into functions.\n\n\n## Download\n\n* [kurly.js](https://unpkg.com/kurly@2.0.0-beta.1/kurly.js)\n  (fully commented source ~7kB)\n* [kurly.min.js](https://unpkg.com/kurly@2.0.0-beta.1/kurly.min.js)\n  (~[1006](#gzip-size) bytes minified and gzipped)\n\n\n## CDN\n\n*index.html*\n```html\n<script src=\"https://unpkg.com/kurly@2.0.0-beta.1/kurly.min.js\"></script>\n<script>(function(){ // IIFE\n  var ast = kurly.parse('{noun} {verb} {adjective}!')\n  var tags = { '*': ({name}) => (rec) => `${rec[name]}` }\n  var template = kurly.compile(ast, tags)\n  var record = { noun: 'Kurly', verb: 'is', adjective: 'easy' }\n  var output = template(record)  // ['Kurly', ' ', 'is', ' ', 'easy', '!']\n  console.info(output.join('')) // > \"Kurly is easy!\"\n})()</script>\n```\n\n\n## Install\n\n```sh\nnpm install --save kurly\n```\n\n\n## Require\n\n```js\n// main functions\nvar parse = require('kurly/parse')\nvar compile = require('kurly/compile')\n// extra utils\nvar pipe = require('kurly/pipe')\nvar tag = require('kurly/tag')\n\n```\n\n\n## Import\n\n```js\n// main functions\nimport parse from 'kurly/parse'\nimport compile from 'kurly/compile'\n// extra utils\nimport pipe from 'kurly/pipe'\nimport tag from 'kurly/tag'\n```\n\n\n## Use\n\nCall [`parse`](#parse) to parse text with tags into an abstract syntax tree:\n\n```js\nvar ast = parse('Hello, {kurly}')\n```\n\nCreate [tags](#tags):\n\n```js\nvar tags = {\n  kurly: function(ctx){\n    return function(rec) {\n      return `${rec.planet}!`\n    }\n  }\n}\n```\n\nCall [`compile`](#compile) with the ast and your tags to create a template function:\n\n```js\nvar template = compile(ast, tags)\n```\n\nCall the resulting function, passing it a record with parameters:\n\n```js\nvar result = template({ planet: 'World' }) // ['Hello, ', 'World!']\n```\n\n## `parse`\n\nThe kurly parser is nice because it's small but powerful. It handles nesting and performs escaping and it returns an ast that is fully serializable and from which you can reconstruct the input string.\n\n```ts\nfunction parse(str: string, options?: Options): Ast\n```\n\n### `parse`(`str`: `string`, `options`?: [`Options`](#options)): [`Ast`](#ast)`\n\nParses the string `str` to an [`Ast`](#ast).\n\nIf parse `options` are given` they are used to determine\nwhether open/close markers are optional and which characters\nto use for them. By default `{` and `}` are required.\n\n#### `str`: `string`\nThe string to parse\n\n#### `options`: [`Options`](#Options)\nOptional parse options.\n\n\n## `Options`\n\nPass options to [`parse`](#parse) to control it's behavior.\n\n```ts\ntype Options = {\n\n  /**\n   * Whether open/close markers are optional\n   */\n  optional?: boolean,\n\n  /**\n   * The character to use as open marker\n   */\n  open?: string,\n\n  /**\n   * The character to use as close marker\n   */\n  close?: string\n}\n```\n\n\n## `Ast`\n\nAn Abstract Syntax Tree. An array of strings or [`Node`](#node)s, where a `Node`\nhas a field `ast` that contains the ast of it's children.\n\n```ts\ntype Ast = Array<Node | string>\n```\n\n[`parse`](#parse) returns an `Ast` and [`compile`](#compile) accepts an `Ast`.\n\n\n\n## `compile`\n\nCompiles an ast into a template function.\n\n```ts\nfunction compile(ast: Ast, tags: Tags, rec?: object): TagFn\n```\n\n### `compile`(`ast`: [`Ast`](#ast), `tags`: [`Tags`](#tags), `rec`?: `object`): [`TagFn`](#tagfn)\n\nThis function will create a pipe from the `ast` and `tags`\nby calling [`pipe()`](#pipe), and then will create a single\nfunction from it by calling [`tag()`](#tag), and return that.\n\n#### `ast`: [`Ast`](#ast)\nThe ast to compile into a function\n\n#### `tags`: [`Tags`](#tags)\nThe tags to use in the compile\n\n#### `rec`?: object\nThe optional static record object.\n\n\n## `Tags`\n`kurly` is just a tiny parser / compiler. Any functionality should be\nprovided by tags.\n\nYou provide the tags to use to [`compile`](#compile) or [`pipe`](#pipe)\nin the form of a dictionary object where each key's name is a `string`\nto match tag names to and each key's value is a [`Tag`](#tag).\n\n```ts\ntype Tags = {\n  [key : string]: Tag;\n}\n```\nOne special entry is the [wildcard tag](#wildcard-tag) which has key name `'*'`.\n\n\n## Tag syntax\n\n`kurly` matches tags following a variation of this regex pattern:\n\n```js\n/({)([_a-zA-Z][_a-zA-Z0-9]*)([^_a-zA-Z0-9\\}].*)?(})/\n```\n\nThis expression matches an open curly brace, a tag name, optionally some\ntext starting with a non-identifier character and a closing curly brace.\n\nTag names can not contain any special characters such as punctuation,\ndiacritics, whitespace, unicode symbols etc. They must start with an uppercase\nor lowercase letter or the underscore and may be followed by zero or more\nalphanumerical characters.\n\nIf a tag is enclosed in braces, any text following the tag name is parsed and\nescaping is applied. A tag can contain a closing brace as text by escaping it.\nThe string `\"a {tag with a closing curly brace \\} in it}\"` will be parsed\ncorrectly.\n\nIf a tag is not enclosed in braces, it's text ends at the first whitespace\ncharacter following the tag name.\n\nKurly's `parse` function accepts an `options` object to control whether\nopen and close braces are optional and which characters are used for them.\n\n\n## Creating tags\n\nTo create a kurly tag, we create a *higher order function*; a function that\nreturns a function:\n\n```js\nfunction outer(cfg) {\n  return function inner(rec) {\n    return `My first ${rec.thing}`\n  }\n}\n```\n\n**The outer function** is called during the compilation phase.\nIt is passed a configuration object containing the tag name and function,\nthe tag content text and an abstract syntax tree of it's children\n(see [Nested tags](#nested-tags)).\nAny expensive work that needs to be done only once can be done here.\n\n**The inner function** is called during the render phase.\nIt returns an (array of) output(s). The output entries can be any type. It's\nargument is a record object that was initialized when the compiled function was\ncalled. One key is always added to this object: `children`. This contains the\nrendered output of the children and can be used in the tag output.\n\n\n## Share your tags\n\nCreated a nice tag and want to share it with the world?\nPublish it to NPM! Make sure to include the keyword `\"kurly\"` in your\n`package,json` so it will show up in the list of\n[projects related to kurly](https://www.npmjs.com/search?q=keywords:kurly).\n\n\n## Static tags\n\nSince v2, Kurly supports 'static' tags. These are tags that don't depend on the\nrecord object passed to the template function. Instead, they get access to a static\nversion of that object at compile time. To create a static tag we write:\n\n```js\nfunction outer(cfg, rec) {\n  return function inner() {\n    return `My first ${rec.thing}`\n  }\n}\n```\n\nNotice how the `rec` parameter has moved from the inner to the outer function.\n\nIf any of the tags in an ast are not static, all static tags will be converted\nto dynamic tags automatically. The reverse is not possible.\n\nIf all tags in an ast are static and a static record object is passed to\n`compile`, it will yield a function that can be called without arguments.\n\nStatic tags are more restricted in their abilities, but they can exist in both\nstatic and dynamic ast's, so they are the most flexible option if your tag does\nnot need to access any field from the dynamic record.\n\n\n## Nested tags\n\nKurly supports nested tags:\n\n```js\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: () => ({ children }) => ['Hello'].concat(children),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\nFor a tag to support nesting, it should pick up it's children and add them\nto the result it is returning. In the example above, `greeting` is adding\nit's children to the array it is returning using `concat`.\n\nStatic tags can also allow nesting, but because they don't have access\nto the dynamic record, they need to do a little bit more work for it.\nFortunately, [`children`](#children) does that work for us:\n\n```js\nvar children = require('kurly/children')\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: (ctx, rec) => () => ['Hello'].concat(children(ctx, rec)),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\n`children()` is written in such a way, that it can be used both\nfrom static and dynamic tags alike:\n\n```js\nvar children = require('kurly/children')\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: (ctx) => (rec) => ['Hello'].concat(children(ctx, rec)),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\n\n## Wildcard tag\n\nYou can register a wildcard / catch-all tag under the name `'*'` that will\nbe called for everything that matches the tag syntax, but for which no\nregistered tag was found:\n\n```js\nvar ast = parse('{a}, {b}, {c}.')\nvar catchAll = ({name}) => ({greet}) => `${greet} ${name}`\nvar template = compile(ast, { '*': catchAll })\nvar result = template({ greet: 'Hi' })\n// result: ['Hi a', ', ', 'Hi b', ', ', 'Hi c', '.']\n```\n\n\n## Tag return value\n\nA tag may return just about anything. Eventually, all the return values of\nall the tags will end up in a flattened array, which is returned by the\ntemplate function, together with all the unmatched text, in the right order.\n\nIf you need the end result to be a string and all your tags are returning\n(arrays of) strings, you can convert the template result to a string like\nthis:\n\n```js\nresult = result.join('')\n```\n\n\n## `Tag`\nTags come in two flavours: dynamic tags, which have access to the dynamic record object\nthat is passed to the template function returned by `compile`, and static tags, which don't need / have access to the dynamic record, but instead only have access to a static version of that record.\n\n```ts\ntype Tag = DynamicTag | StaticTag\n```\n\nWith `tag`, you can 'upgrade' a `Node` to a `PipeNode`:\n\n```ts\nfunction tag(pipe: Pipe, rec?: object, parent?: TagFn): TagFn\n```\n\n### `tag`(`pipe`: [`Pipe`](#pipe), `rec`?: `object`, `parent`?: [`TagFn`](#tagfn))\n\nCompiles a `Pipe` into a single `TagFn`\n\n#### `pipe`: [`Pipe`](#pipe)\nThe pipe to compile\n\n#### `rec`?: `object`\nOptional static record object\n\n#### `parent`?: `TagFn`\nOptional parent `TagFn`\n\n\n## `DynamicTag`\n\nA function that accepts an ast [`Node`](#node) and returns a dynamic tag function.\n\n```ts\ntype DynamicTag = (ctx: Node) => DynamicTagFn\n```\n\n## `StaticTag`\n\nA function that accepts an ast [`Node`](#node) and an optional static\nrecord object and returns a [static tag function](#static-tags).\n\n```ts\ntype StaticTag = (ctx: Node, rec?: object) => StaticTagFn\n```\n\n## `TagFn`\n\n`kurly` parses and finds tags during the `parse` phase and builds\nan ast. Then during `compile` it replaces the tags it found in the\nast with the tag functions it was given.\n\nThese tag functions are either static or dynamic tag functions.\n[`DynamicTag`](#dynamictag)s return a [`DynamicTagFn`](#dynamictagfn)\nand [`StaticTag`](#statictag)s return a [`StaticTagFn`](#statictagfn).\n\n```ts\nexport type TagFn = DynamicTagFn | StaticTagFn\n```\n\n## `DynamicTagFn`\n\nA function that accepts a dynamic record object and returns some output.\n\n```ts\ntype DynamicTagFn = (rec: object) => any\n```\n\n## `StaticTagFn`\n\nA function that accepts no arguments and optionally uses a static record\nobject in it's output only.\n\n```ts\ntype StaticTagFn = () => any\n```\n\n## `Node`\n\nRepresents a possible tag. It includes fields to store the tag\n`open` marker, it's `name`, any `sep` whitespace, the tag content\n`text`, the `close` marker and a parsed `ast` of it's content text.\n\n```ts\ninterface Node extends Object {\n  open: string,\n  name: string,\n  sep: string,\n  text: string,\n  close: string,\n  ast: Ast,\n}\n```\n\nSee also: [`Ast`](#ast)\n\n## `PipeNode`\n\nA node that is 'instantiated'. That is, a `Tag` was found that matched\nit's name (or a wildcard tag was found) and that tag was invoked to\ncreate a [`TagFn`](#tagfn), stored in property `tag` on the node.\n\n```js\ninterface PipeNode extends Node {\n  tag: TagFn,\n}\n```\n\n## `Pipe`\n\nAn 'instantiated' [`Ast`](#ast), where all nodes have a populated `tag` field.\n\n```ts\ntype Pipe = Array<PipeNode | string>\n```\n\nUse `pipe()` to create pipes:\n\n```ts\nfunction pipe(ast: Ast, tags: Tags, rec?: object): Pipe\n```\n\n### `pipe`(`ast`: [`Ast`](#ast), `tags`: [`Tags`](#tags), `rec`?: `object`): `Pipe`\n\nCreates a `Pipe` from an ast.\n\nInstead of using [`compile`](#compile), to compile an ast directly\ninto a [`TagFn`](#tagfn), you can use `pipe` to create\na [`Pipe`](#pipe), which is an array of strings or [`PipeNode`](#pipenode)s.\nYou can then call `tag()` on that pipe to get basically the same result as\nyou would have gotten from `compile()`, or you can choose to do something\nelse entirely with that pipe.\n\n#### `ast`: [`Ast`](#ast)\nThe ast to create a `Pipe` from.\n\n#### `tags`: [`Tags`](#tags)\nThe tags to use in the `Pipe`.\n\n#### `rec`?: `object`\nOptional static record object\n\n\n## Issues\n\nAdd an issue in the [issue tracker](https://github.com/download/kurly/issues)\nto let me know of any problems you find, or questions you may have.\n\n\n## Copyright\n\nCopyright 2021 by [Stijn de Witt](https://stijndewitt.com).\n\n\n## License\n\nLicensed under the [MIT](https://opensource.org/licenses/MIT) Open Source license.\n\n\n## gzip-size\n\nThe GZIP algorithm is available in different flavours and with different\npossible compression settings. The sizes quoted in this README have been\nmeasured using [gzip-size](https://npmjs.com/package/gzip-size)\nby [Sindre Sorhus](https://github.com/sindresorhus), your mileage may vary.\n","readmeFilename":"README.md","gitHead":"82f7f58a7fea58c4ea91e0b4e50593b1be4c3a9a","_id":"kurly@2.0.0-beta.1","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-TD94LaOcLEOnhV5EXN0KRj9zs5EQwvhCnaqh4Qw25cP67VjBAVjjP0YNsUwQnX6iZ7pirtl86yz2DcsFQHEaMw==","shasum":"f392dc9237c9c0005c7d265b5ab6c1562dc0c1fe","tarball":"https://registry.npmjs.org/kurly/-/kurly-2.0.0-beta.1.tgz","fileCount":26,"unpackedSize":327223,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgBKYoCRA9TVsSAnZWagAA234P/1/xMmEvfd51mJqAXIcw\njsqvwWuIcGyk+89cPrPUtF/XOmiSqQJ21kZHTaRBsQGbW6jwCghdQ0E5crlW\nwGvVxNBLqwstcQ7XYr0RvSq1Bx5sR8uNKYdZrxdlGYUS0Yj57LpNwJsAb2ho\neiG7U956BnGoyLllgWor63a/cmBZFMgb1JxLWuYz7IEcItCZnbdpycRQgraH\n+mzqAoBobRnmbnIdI84Y7K90J9+Mt25AU4fJBcWzDj0xoJXVd2kH+kn9TVDF\nmEuJIe1XAtYo5fH7hBC3VegcDEkx4k2Pr2XCaBJDmBR9cLJo9T+JH6sNd+fr\nbHVj0L7sKeuUVOMxzgr8aUytNqTtkneFp8vnJ9es3Wlk8OtTv1GdTiVM4cjm\nQ/v2K8HmX8/lUnYNnlJVgqetLax0y8ep5ibsru3kL1Lzt9mAZGGe1Sl+mSGe\nJRYTIBufc29S2Jil0L/njA5y66aKA/QvfQyfmhuqJhhC6qVCJP026rTOo6gx\nkZQSr/4shVacXdoMImakI4zZHNvUjJsRI5iSej4lZ0xu/EIB3zpndxPamxba\n5bLCr7AiQj+c4WE1jz86F74JA0zQsAOEUyjJaUrY4vxCyS3rN80+5YMCS/E0\ncGRY8bpklC2nKV0i04EOM56xzIEtoI7Zop+lq4jl918iFzKx4Kxdk210QCfZ\nTG/s\r\n=qmRj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJ0/XL8Gh9tXU/6HX/XbnsXpg+uCRJMHoFQ9pu7llKrwIhAN11UD19EWO8uB42L7c4IcKpZloOEWO2AOfEiS6wrAiI"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_2.0.0-beta.1_1610917415874_0.32280390869659437"},"_hasShrinkwrap":false},"2.0.0-beta.2":{"name":"kurly","version":"2.0.0-beta.2","description":"Tiny pluggable templating engine for Node and browsers","main":"./kurly.js","types":"./kurly.d.ts","unpkg":"./kurly.min.js","scripts":{"build":"webpack --mode production && node build.js","test":"tsc && node test.js && mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","1kB","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"MIT","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"chai":"^4.2.0","chai-subset":"^1.6.0","gzip-size":"^6.0.0","mocha":"^8.2.1","typescript":"^4.1.3","uglify-js":"^3.12.6","ulog":"^2.0.0-beta.11","webpack":"^5.20.1","webpack-cli":"^4.5.0"},"dependencies":{"anylogger":"^1.0.10"},"readme":"# kurly <sub><sup>2.0.0-beta.1</sup></sub>\n\n![kurly](kurly.png)\n\n### Tiny pluggable templating engine for Node and browsers\n\n[![npm](https://img.shields.io/npm/v/kurly.svg)](https://npmjs.com/package/kurly)\n[![license](https://img.shields.io/npm/l/kurly.svg)](https://opensource.org/licenses/MIT)\n[![travis](https://img.shields.io/travis/Download/kurly.svg)](https://travis-ci.org/Download/kurly)\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\n\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\n\n![girly](girly.png)\n\n`kurly` is a tiny ~[1018](#gzip-size) bytes pluggable templating engine for\nNode and browsers. It can parse templates with tags to abstract syntax trees,\nwhich it can then compile into functions.\n\n\n## Download\n\n* [kurly.js](https://unpkg.com/kurly@2.0.0-beta.1/kurly.js)\n  (fully commented source ~7kB)\n* [kurly.min.js](https://unpkg.com/kurly@2.0.0-beta.1/kurly.min.js)\n  (~[1018](#gzip-size) bytes minified and gzipped)\n\n\n## CDN\n\n*index.html*\n```html\n<script src=\"https://unpkg.com/kurly@2.0.0-beta.1/kurly.min.js\"></script>\n<script>(function(){ // IIFE\n  var ast = kurly.parse('{noun} {verb} {adjective}!')\n  var tags = { '*': ({name}) => (rec) => `${rec[name]}` }\n  var template = kurly.compile(ast, tags)\n  var record = { noun: 'Kurly', verb: 'is', adjective: 'easy' }\n  var output = template(record)  // ['Kurly', ' ', 'is', ' ', 'easy', '!']\n  console.info(output.join('')) // > \"Kurly is easy!\"\n})()</script>\n```\n\n\n## Install\n\n```sh\nnpm install --save kurly\n```\n\n\n## Require\n\n```js\n// main functions\nvar parse = require('kurly/parse')\nvar compile = require('kurly/compile')\n// extra utils\nvar pipe = require('kurly/pipe')\nvar tag = require('kurly/tag')\n\n```\n\n\n## Import\n\n```js\n// main functions\nimport parse from 'kurly/parse'\nimport compile from 'kurly/compile'\n// extra utils\nimport pipe from 'kurly/pipe'\nimport tag from 'kurly/tag'\n```\n\n\n## Use\n\nCall [`parse`](#parse) to parse text with tags into an abstract syntax tree:\n\n```js\nvar ast = parse('Hello, {kurly}')\n```\n\nCreate [tags](#tags):\n\n```js\nvar tags = {\n  kurly: function(ctx){\n    return function(rec) {\n      return `${rec.planet}!`\n    }\n  }\n}\n```\n\nCall [`compile`](#compile) with the ast and your tags to create a template function:\n\n```js\nvar template = compile(ast, tags)\n```\n\nCall the resulting function, passing it a record with parameters:\n\n```js\nvar result = template({ planet: 'World' }) // ['Hello, ', 'World!']\n```\n\n## `parse`\n\nThe kurly parser is nice because it's small but powerful. It handles nesting and performs escaping and it returns an ast that is fully serializable and from which you can reconstruct the input string.\n\n```ts\nfunction parse(str: string, options?: Options): Ast\n```\n\n### `parse`(`str`: `string`, `options`?: [`Options`](#options)): [`Ast`](#ast)`\n\nParses the string `str` to an [`Ast`](#ast).\n\nIf parse `options` are given` they are used to determine\nwhether open/close markers are optional and which characters\nto use for them. By default `{` and `}` are required.\n\n#### `str`: `string`\nThe string to parse\n\n#### `options`: [`Options`](#Options)\nOptional parse options.\n\n\n## `Options`\n\nPass options to [`parse`](#parse) to control it's behavior.\n\n```ts\ntype Options = {\n\n  /**\n   * Whether open/close markers are optional\n   */\n  optional?: boolean,\n\n  /**\n   * The character to use as open marker\n   */\n  open?: string,\n\n  /**\n   * The character to use as close marker\n   */\n  close?: string\n}\n```\n\n\n## `Ast`\n\nAn Abstract Syntax Tree. An array of strings or [`Node`](#node)s, where a `Node`\nhas a field `ast` that contains the ast of it's children.\n\n```ts\ntype Ast = Array<Node | string>\n```\n\n[`parse`](#parse) returns an `Ast` and [`compile`](#compile) accepts an `Ast`.\n\n\n\n## `compile`\n\nCompiles an ast into a template function.\n\n```ts\nfunction compile(ast: Ast, tags: Tags, rec?: object): TagFn\n```\n\n### `compile`(`ast`: [`Ast`](#ast), `tags`: [`Tags`](#tags), `rec`?: `object`): [`TagFn`](#tagfn)\n\nThis function will create a pipe from the `ast` and `tags`\nby calling [`pipe()`](#pipe), and then will create a single\nfunction from it by calling [`tag()`](#tag), and return that.\n\n#### `ast`: [`Ast`](#ast)\nThe ast to compile into a function\n\n#### `tags`: [`Tags`](#tags)\nThe tags to use in the compile\n\n#### `rec`?: object\nThe optional static record object.\n\n\n## `Tags`\n`kurly` is just a tiny parser / compiler. Any functionality should be\nprovided by tags.\n\nYou provide the tags to use to [`compile`](#compile) or [`pipe`](#pipe)\nin the form of a dictionary object where each key's name is a `string`\nto match tag names to and each key's value is a [`Tag`](#tag).\n\n```ts\ntype Tags = {\n  [key : string]: Tag;\n}\n```\nOne special entry is the [wildcard tag](#wildcard-tag) which has key name `'*'`.\n\n\n## Tag syntax\n\n`kurly` matches tags following a variation of this regex pattern:\n\n```js\n/({)([_a-zA-Z][_a-zA-Z0-9]*)([^_a-zA-Z0-9\\}].*)?(})/\n```\n\nThis expression matches an open curly brace, a tag name, optionally some\ntext starting with a non-identifier character and a closing curly brace.\n\nTag names can not contain any special characters such as punctuation,\ndiacritics, whitespace, unicode symbols etc. They must start with an uppercase\nor lowercase letter or the underscore and may be followed by zero or more\nalphanumerical characters.\n\nIf a tag is enclosed in braces, any text following the tag name is parsed and\nescaping is applied. A tag can contain a closing brace as text by escaping it.\nThe string `\"a {tag with a closing curly brace \\} in it}\"` will be parsed\ncorrectly.\n\nIf a tag is not enclosed in braces, it's text ends at the first whitespace\ncharacter following the tag name.\n\nKurly's `parse` function accepts an `options` object to control whether\nopen and close braces are optional and which characters are used for them.\n\n\n## Creating tags\n\nTo create a kurly tag, we create a *higher order function*; a function that\nreturns a function:\n\n```js\nfunction outer(cfg) {\n  return function inner(rec) {\n    return `My first ${rec.thing}`\n  }\n}\n```\n\n**The outer function** is called during the compilation phase.\nIt is passed a configuration object containing the tag name and function,\nthe tag content text and an abstract syntax tree of it's children\n(see [Nested tags](#nested-tags)).\nAny expensive work that needs to be done only once can be done here.\n\n**The inner function** is called during the render phase.\nIt returns an (array of) output(s). The output entries can be any type. It's\nargument is a record object that was initialized when the compiled function was\ncalled. One key is always added to this object: `children`. This contains the\nrendered output of the children and can be used in the tag output.\n\n\n## Share your tags\n\nCreated a nice tag and want to share it with the world?\nPublish it to NPM! Make sure to include the keyword `\"kurly\"` in your\n`package,json` so it will show up in the list of\n[projects related to kurly](https://www.npmjs.com/search?q=keywords:kurly).\n\n\n## Static tags\n\nSince v2, Kurly supports 'static' tags. These are tags that don't depend on the\nrecord object passed to the template function. Instead, they get access to a static\nversion of that object at compile time. To create a static tag we write:\n\n```js\nfunction outer(cfg, rec) {\n  return function inner() {\n    return `My first ${rec.thing}`\n  }\n}\n```\n\nNotice how the `rec` parameter has moved from the inner to the outer function.\n\nIf any of the tags in an ast are not static, all static tags will be converted\nto dynamic tags automatically. The reverse is not possible.\n\nIf all tags in an ast are static and a static record object is passed to\n`compile`, it will yield a function that can be called without arguments.\n\nStatic tags are more restricted in their abilities, but they can exist in both\nstatic and dynamic ast's, so they are the most flexible option if your tag does\nnot need to access any field from the dynamic record.\n\n\n## Nested tags\n\nKurly supports nested tags:\n\n```js\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: () => ({ children }) => ['Hello'].concat(children),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\nFor a tag to support nesting, it should pick up it's children and add them\nto the result it is returning. In the example above, `greeting` is adding\nit's children to the array it is returning using `concat`.\n\nStatic tags can also allow nesting, but because they don't have access\nto the dynamic record, they need to do a little bit more work for it.\nFortunately, [`children`](#children) does that work for us:\n\n```js\nvar children = require('kurly/children')\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: (ctx, rec) => () => ['Hello'].concat(children(ctx, rec)),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\n`children()` is written in such a way, that it can be used both\nfrom static and dynamic tags alike:\n\n```js\nvar children = require('kurly/children')\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: (ctx) => (rec) => ['Hello'].concat(children(ctx, rec)),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\n\n## Wildcard tag\n\nYou can register a wildcard / catch-all tag under the name `'*'` that will\nbe called for everything that matches the tag syntax, but for which no\nregistered tag was found:\n\n```js\nvar ast = parse('{a}, {b}, {c}.')\nvar catchAll = ({name}) => ({greet}) => `${greet} ${name}`\nvar template = compile(ast, { '*': catchAll })\nvar result = template({ greet: 'Hi' })\n// result: ['Hi a', ', ', 'Hi b', ', ', 'Hi c', '.']\n```\n\n\n## Tag return value\n\nA tag may return just about anything. Eventually, all the return values of\nall the tags will end up in a flattened array, which is returned by the\ntemplate function, together with all the unmatched text, in the right order.\n\nIf you need the end result to be a string and all your tags are returning\n(arrays of) strings, you can convert the template result to a string like\nthis:\n\n```js\nresult = result.join('')\n```\n\n\n## `Tag`\nTags come in two flavours: dynamic tags, which have access to the dynamic record object\nthat is passed to the template function returned by `compile`, and static tags, which don't need / have access to the dynamic record, but instead only have access to a static version of that record.\n\n```ts\ntype Tag = DynamicTag | StaticTag\n```\n\nWith `tag`, you can 'upgrade' a `Node` to a `PipeNode`:\n\n```ts\nfunction tag(pipe: Pipe, rec?: object, parent?: TagFn): TagFn\n```\n\n### `tag`(`pipe`: [`Pipe`](#pipe), `rec`?: `object`, `parent`?: [`TagFn`](#tagfn))\n\nCompiles a `Pipe` into a single `TagFn`\n\n#### `pipe`: [`Pipe`](#pipe)\nThe pipe to compile\n\n#### `rec`?: `object`\nOptional static record object\n\n#### `parent`?: `TagFn`\nOptional parent `TagFn`\n\n\n## `DynamicTag`\n\nA function that accepts an ast [`Node`](#node) and returns a dynamic tag function.\n\n```ts\ntype DynamicTag = (ctx: Node) => DynamicTagFn\n```\n\n## `StaticTag`\n\nA function that accepts an ast [`Node`](#node) and an optional static\nrecord object and returns a [static tag function](#static-tags).\n\n```ts\ntype StaticTag = (ctx: Node, rec?: object) => StaticTagFn\n```\n\n## `TagFn`\n\n`kurly` parses and finds tags during the `parse` phase and builds\nan ast. Then during `compile` it replaces the tags it found in the\nast with the tag functions it was given.\n\nThese tag functions are either static or dynamic tag functions.\n[`DynamicTag`](#dynamictag)s return a [`DynamicTagFn`](#dynamictagfn)\nand [`StaticTag`](#statictag)s return a [`StaticTagFn`](#statictagfn).\n\n```ts\nexport type TagFn = DynamicTagFn | StaticTagFn\n```\n\n## `DynamicTagFn`\n\nA function that accepts a dynamic record object and returns some output.\n\n```ts\ntype DynamicTagFn = (rec: object) => any\n```\n\n## `StaticTagFn`\n\nA function that accepts no arguments and optionally uses a static record\nobject in it's output only.\n\n```ts\ntype StaticTagFn = () => any\n```\n\n## `Node`\n\nRepresents a possible tag. It includes fields to store the tag\n`open` marker, it's `name`, any `sep` whitespace, the tag content\n`text`, the `close` marker and a parsed `ast` of it's content text.\n\n```ts\ninterface Node extends Object {\n  open: string,\n  name: string,\n  sep: string,\n  text: string,\n  close: string,\n  ast: Ast,\n}\n```\n\nSee also: [`Ast`](#ast)\n\n## `PipeNode`\n\nA node that is 'instantiated'. That is, a `Tag` was found that matched\nit's name (or a wildcard tag was found) and that tag was invoked to\ncreate a [`TagFn`](#tagfn), stored in property `tag` on the node.\n\n```js\ninterface PipeNode extends Node {\n  tag: TagFn,\n}\n```\n\n## `Pipe`\n\nAn 'instantiated' [`Ast`](#ast), where all nodes have a populated `tag` field.\n\n```ts\ntype Pipe = Array<PipeNode | string>\n```\n\nUse `pipe()` to create pipes:\n\n```ts\nfunction pipe(ast: Ast, tags: Tags, rec?: object): Pipe\n```\n\n### `pipe`(`ast`: [`Ast`](#ast), `tags`: [`Tags`](#tags), `rec`?: `object`): `Pipe`\n\nCreates a `Pipe` from an ast.\n\nInstead of using [`compile`](#compile), to compile an ast directly\ninto a [`TagFn`](#tagfn), you can use `pipe` to create\na [`Pipe`](#pipe), which is an array of strings or [`PipeNode`](#pipenode)s.\nYou can then call `tag()` on that pipe to get basically the same result as\nyou would have gotten from `compile()`, or you can choose to do something\nelse entirely with that pipe.\n\n#### `ast`: [`Ast`](#ast)\nThe ast to create a `Pipe` from.\n\n#### `tags`: [`Tags`](#tags)\nThe tags to use in the `Pipe`.\n\n#### `rec`?: `object`\nOptional static record object\n\n\n## Issues\n\nAdd an issue in the [issue tracker](https://github.com/download/kurly/issues)\nto let me know of any problems you find, or questions you may have.\n\n\n## Copyright\n\nCopyright 2021 by [Stijn de Witt](https://stijndewitt.com).\n\n\n## License\n\nLicensed under the [MIT](https://opensource.org/licenses/MIT) Open Source license.\n\n\n## gzip-size\n\nThe GZIP algorithm is available in different flavours and with different\npossible compression settings. The sizes quoted in this README have been\nmeasured using [gzip-size](https://npmjs.com/package/gzip-size)\nby [Sindre Sorhus](https://github.com/sindresorhus), your mileage may vary.\n","readmeFilename":"README.md","gitHead":"074d128938fc6ff8d3df56762cdf65e2d6177eaa","_id":"kurly@2.0.0-beta.2","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-AysNnS/Us6r/8qAV372KqALtXXLfQZyRyiVzxUsBFpNFunk2rg1pY6i8xUiS5+JAZNJKuhehj4+9TExMUPl6+w==","shasum":"319548c5136438b60c9eb5dc2e2bef453b4c3602","tarball":"https://registry.npmjs.org/kurly/-/kurly-2.0.0-beta.2.tgz","fileCount":26,"unpackedSize":329386,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGyImCRA9TVsSAnZWagAA5fUP/1Hi72xxUjJ1oVK8g9J5\n3CroHNdfhhOYt5/zUpqsJhuWo7Iubh9dZ0g4C8Hql2n7XWFgCXddnlh5BZrN\nFBENNMmhblmq0hISC5/BEveNAi8bsGcwvlEVZrml+cGZ54ccEKXjX9eZERvS\nHRS3zo1dOdv+5KdnQXdjHpK9eayvgWcLzSTywN13QM25QQoa15CHlQin9Ug+\nIc28EsrDJJQqhX5xIwEuv/i2etIp7bWH9JiCMH59lX0ezVSNBa5osRg19brS\nsersql3IW9QXAclaOaQcKdiKKiopJc8jDEaotxOWRCF/wV4m8Q3yQufdfvv+\n6yzuif6wrDLJ0HPLcXY8Ly3Mdp+nc6vRJBn82ULrC45Jrbzdho2SJ+PiNCtp\nVO/a0EVqkeHm9FddbWLN2JabwcsRqL5iaoSf5YOQuQVR4UbGqQCW40qCQ/fH\naNi0gu1KKD3kif+j8o8Z/2lYBWywd+3p+kK+YunU35nshuPr0A0jP1FcU6X7\nO5HELBe/y1X0A0QgHUG9YruBfej8g8W2XAbT1nh4u3kettNBsDZ9ozJSygDU\nydGmp0Vkfu1UZtaofyjs1e/KYPsucUVlZP6zYNAenMUrMtM1lEboG2wuHQMP\nrrwEmXNES/+uwvdYM9Jehx3Jw6p6f2E9TfGHT4zM2V95XSJ8EM0tcjrYF9ol\n1fCm\r\n=DVbv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAS5dKqIbnizRs2kHI/+6ko0IOMFEApezmihSfY0267aAiEAmeyKQ011GJ2M49/+kyEAZHBZ9EeCpnh7mPQR6+uIlGY="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_2.0.0-beta.2_1612390950253_0.7266272753971839"},"_hasShrinkwrap":false},"2.0.0-beta.3":{"name":"kurly","version":"2.0.0-beta.3","description":"Tiny pluggable templating engine for Node and browsers","main":"./kurly.js","types":"./kurly.d.ts","unpkg":"./kurly.min.js","scripts":{"build":"webpack --mode production && node build.js","test":"tsc && node test.js && mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","1kB","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"MIT","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"anylogger":"^1.0.10","chai":"^4.2.0","chai-subset":"^1.6.0","gzip-size":"^6.0.0","mocha":"^8.2.1","typescript":"^4.1.3","uglify-js":"^3.12.6","ulog":"^2.0.0-beta.17","webpack":"^5.20.1","webpack-cli":"^4.5.0"},"dependencies":{},"gitHead":"4ce9f3646e6e80045aa5851498e0baa2431361f8","_id":"kurly@2.0.0-beta.3","_nodeVersion":"10.16.3","_npmVersion":"6.14.11","dist":{"integrity":"sha512-WXSRkhL2VV9lI/sPomBDV9Xf4oQ1s/RiUqzxKt4slkG7ndCxcDfXJ2ZXdxEYDRfevnkSOxmiVX3etunBlHqTAw==","shasum":"571b02745f9c68b6a5ee012fda8106bd54a87203","tarball":"https://registry.npmjs.org/kurly/-/kurly-2.0.0-beta.3.tgz","fileCount":26,"unpackedSize":328543,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKVttCRA9TVsSAnZWagAAbv8P/3bqmKUKcy3L+62/Vxxo\nORq4k+pBxQIS0iSG/9hZgQWi3C8ikmRl2jgTSQUsEO+aVq2DSWu9EYIG1kjY\nahmNCoDutmu55nq4Mp16DcCbx7MGkbPNxBvnIN3W01fFAvs92z7L6sKkySO0\nSgc0ONwYEQs3m0q+gGReZR/2r1vdwljZGMOy6+6tTkyLyOT0an9Lz05S6IMd\ne5J5cDZycypx086a8chBXBdILWzGH9z+MqWSA6TBrsXzhL3nz9RL+9BtMlBD\nScIjZYmZ4gfXAXIeo3lWIu7ZKDK5By0VmOpKrSMbsVqy0F2Z6yDmm4MUblyn\nob7zRQoZPHIo0+/KZ1U0R52Mk0Ug8TWpCtFqHXKUWD5cl/0b7YfI0kWtRJB5\n1+xO8ygk6ur/tVFw1zEdXY8S98Laz7l4qyl1NJMb9Jf7qbMiIpA/o4wIeKml\nJsIfZzfb2rBtVFdceOqxdK1KjiHXd/Hn2PdaI7TMKoNiiT6nnNTEBRv3I1xo\ny3Hq6JUzETDumq76AbFBr6Pw6/G+5JQ+F74cM4fi1G2913SIygTw5klS3hT6\ngBvP8s5VZ7BTdMbwu4x9i7ycAy7uq4GDY/Cjzsy4f4VgxaDOX7qtteb09jXL\nGZueGUMZeDl1h3OZ922/CjerGOr3SCIvM4B7Q4i+rgxTWqvqfoj15Yow33Wv\ni3dD\r\n=8QN3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCkltprkSTzaAPuwF8iJN/DabJZlFFWXgEDl3qGvbKP0wIgRo77uQ36K1Q9P/OejT1WE8XHOZaD3CRuiA+trh+GcWg="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_2.0.0-beta.3_1613323116267_0.623508745530085"},"_hasShrinkwrap":false},"2.0.0-beta.4":{"name":"kurly","version":"2.0.0-beta.4","description":"Tiny pluggable templating engine for Node and browsers","type":"module","exports":{".":{"import":"./kurly.js","require":"./kurly.cjs","types":"./kurly.d.ts"},"./children":{"import":"./children.js","require":"./children.cjs","types":"./children.d.ts"},"./compile":{"import":"./compile.js","require":"./compile.cjs","types":"./compile.d.ts"},"./parse":{"import":"./parse.js","require":"./parse.cjs","types":"./parse.d.ts"},"./pipe":{"import":"./pipe.js","require":"./pipe.cjs","types":"./pipe.d.ts"},"./tag":{"import":"./tag.js","require":"./tag.cjs","types":"./tag.d.ts"}},"main":"./kurly.js","cjs":"./kurly.cjs","types":"./kurly.d.ts","unpkg":"./kurly.min.js","scripts":{"build":"tsc && webpack --mode production && node build.js","clean":"rimraf *.d.ts *.cjs children.js compile.js kurly.js kurly.spec.js parse.js pipe.js tag.js test.js types.js","test":"tsc && node test.js && mocha *.spec.js","prepare":"npm test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","1kB","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"MIT","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"@types/chai":"^4.3.12","@types/chai-subset":"^1.3.5","@types/mocha":"^10.0.6","anylogger":"^1.1.0-beta.5","chai":"^5.1.0","chai-subset":"^1.6.0","gzip-size":"^7.0.0","mocha":"^10.3.0","rimraf":"^5.0.5","typescript":"^5.4.2","uglify-js":"^3.17.4","ulog":"^2.0.0-beta.20","webpack":"^5.90.3","webpack-cli":"^5.1.4"},"_id":"kurly@2.0.0-beta.4","readme":"# kurly <sub><sup>2.0.0-beta.1</sup></sub>\n\n![kurly](kurly.png)\n\n### Tiny pluggable templating engine for Node and browsers\n\n[![npm](https://img.shields.io/npm/v/kurly.svg)](https://npmjs.com/package/kurly)\n[![license](https://img.shields.io/npm/l/kurly.svg)](https://opensource.org/licenses/MIT)\n[![travis](https://img.shields.io/travis/Download/kurly.svg)](https://travis-ci.org/Download/kurly)\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\n\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\n\n![girly](girly.png)\n\n`kurly` is a tiny ~[470](#gzip-size) bytes pluggable templating engine for\nNode and browsers. It can parse templates with tags to abstract syntax trees,\nwhich it can then compile into functions.\n\n\n## Download\n\n* [kurly.js](https://unpkg.com/kurly@2.0.0-beta.1/kurly.js)\n  (fully commented source ~7kB)\n* [kurly.min.js](https://unpkg.com/kurly@2.0.0-beta.1/kurly.min.js)\n  (~[470](#gzip-size) bytes minified and gzipped)\n\n\n## CDN\n\n*index.html*\n```html\n<script src=\"https://unpkg.com/kurly@2.0.0-beta.1/kurly.min.js\"></script>\n<script>(function(){ // IIFE\n  var ast = kurly.parse('{noun} {verb} {adjective}!')\n  var tags = { '*': ({name}) => (rec) => `${rec[name]}` }\n  var template = kurly.compile(ast, tags)\n  var record = { noun: 'Kurly', verb: 'is', adjective: 'easy' }\n  var output = template(record)  // ['Kurly', ' ', 'is', ' ', 'easy', '!']\n  console.info(output.join('')) // > \"Kurly is easy!\"\n})()</script>\n```\n\n\n## Install\n\n```sh\nnpm install --save kurly\n```\n\n\n## Require\n\n```js\n// main functions\nvar parse = require('kurly/parse')\nvar compile = require('kurly/compile')\n// extra utils\nvar pipe = require('kurly/pipe')\nvar tag = require('kurly/tag')\n\n```\n\n\n## Import\n\n```js\n// main functions\nimport parse from 'kurly/parse'\nimport compile from 'kurly/compile'\n// extra utils\nimport pipe from 'kurly/pipe'\nimport tag from 'kurly/tag'\n```\n\n\n## Use\n\nCall [`parse`](#parse) to parse text with tags into an abstract syntax tree:\n\n```js\nvar ast = parse('Hello, {kurly}')\n```\n\nCreate [tags](#tags):\n\n```js\nvar tags = {\n  kurly: function(ctx){\n    return function(rec) {\n      return `${rec.planet}!`\n    }\n  }\n}\n```\n\nCall [`compile`](#compile) with the ast and your tags to create a template function:\n\n```js\nvar template = compile(ast, tags)\n```\n\nCall the resulting function, passing it a record with parameters:\n\n```js\nvar result = template({ planet: 'World' }) // ['Hello, ', 'World!']\n```\n\n## `parse`\n\nThe kurly parser is nice because it's small but powerful. It handles nesting and performs escaping and it returns an ast that is fully serializable and from which you can reconstruct the input string.\n\n```ts\nfunction parse(str: string, options?: Options): Ast\n```\n\n### `parse`(`str`: `string`, `options`?: [`Options`](#options)): [`Ast`](#ast)`\n\nParses the string `str` to an [`Ast`](#ast).\n\nIf parse `options` are given` they are used to determine\nwhether open/close markers are optional and which characters\nto use for them. By default `{` and `}` are required.\n\n#### `str`: `string`\nThe string to parse\n\n#### `options`: [`Options`](#Options)\nOptional parse options.\n\n\n## `Options`\n\nPass options to [`parse`](#parse) to control it's behavior.\n\n```ts\ntype Options = {\n\n  /**\n   * Whether open/close markers are optional\n   */\n  optional?: boolean,\n\n  /**\n   * The character to use as open marker\n   */\n  open?: string,\n\n  /**\n   * The character to use as close marker\n   */\n  close?: string\n}\n```\n\n\n## `Ast`\n\nAn Abstract Syntax Tree. An array of strings or [`Node`](#node)s, where a `Node`\nhas a field `ast` that contains the ast of it's children.\n\n```ts\ntype Ast = Array<Node | string>\n```\n\n[`parse`](#parse) returns an `Ast` and [`compile`](#compile) accepts an `Ast`.\n\n\n\n## `compile`\n\nCompiles an ast into a template function.\n\n```ts\nfunction compile(ast: Ast, tags: Tags, rec?: object): TagFn\n```\n\n### `compile`(`ast`: [`Ast`](#ast), `tags`: [`Tags`](#tags), `rec`?: `object`): [`TagFn`](#tagfn)\n\nThis function will create a pipe from the `ast` and `tags`\nby calling [`pipe()`](#pipe), and then will create a single\nfunction from it by calling [`tag()`](#tag), and return that.\n\n#### `ast`: [`Ast`](#ast)\nThe ast to compile into a function\n\n#### `tags`: [`Tags`](#tags)\nThe tags to use in the compile\n\n#### `rec`?: object\nThe optional static record object.\n\n\n## `Tags`\n`kurly` is just a tiny parser / compiler. Any functionality should be\nprovided by tags.\n\nYou provide the tags to use to [`compile`](#compile) or [`pipe`](#pipe)\nin the form of a dictionary object where each key's name is a `string`\nto match tag names to and each key's value is a [`Tag`](#tag).\n\n```ts\ntype Tags = {\n  [key : string]: Tag;\n}\n```\nOne special entry is the [wildcard tag](#wildcard-tag) which has key name `'*'`.\n\n\n## Tag syntax\n\n`kurly` matches tags following a variation of this regex pattern:\n\n```js\n/({)([_a-zA-Z][_a-zA-Z0-9]*)([^_a-zA-Z0-9\\}].*)?(})/\n```\n\nThis expression matches an open curly brace, a tag name, optionally some\ntext starting with a non-identifier character and a closing curly brace.\n\nTag names can not contain any special characters such as punctuation,\ndiacritics, whitespace, unicode symbols etc. They must start with an uppercase\nor lowercase letter or the underscore and may be followed by zero or more\nalphanumerical characters.\n\nIf a tag is enclosed in braces, any text following the tag name is parsed and\nescaping is applied. A tag can contain a closing brace as text by escaping it.\nThe string `\"a {tag with a closing curly brace \\} in it}\"` will be parsed\ncorrectly.\n\nIf a tag is not enclosed in braces, it's text ends at the first whitespace\ncharacter following the tag name.\n\nKurly's `parse` function accepts an `options` object to control whether\nopen and close braces are optional and which characters are used for them.\n\n\n## Creating tags\n\nTo create a kurly tag, we create a *higher order function*; a function that\nreturns a function:\n\n```js\nfunction outer(cfg) {\n  return function inner(rec) {\n    return `My first ${rec.thing}`\n  }\n}\n```\n\n**The outer function** is called during the compilation phase.\nIt is passed a configuration object containing the tag name and function,\nthe tag content text and an abstract syntax tree of it's children\n(see [Nested tags](#nested-tags)).\nAny expensive work that needs to be done only once can be done here.\n\n**The inner function** is called during the render phase.\nIt returns an (array of) output(s). The output entries can be any type. It's\nargument is a record object that was initialized when the compiled function was\ncalled. One key is always added to this object: `children`. This contains the\nrendered output of the children and can be used in the tag output.\n\n\n## Share your tags\n\nCreated a nice tag and want to share it with the world?\nPublish it to NPM! Make sure to include the keyword `\"kurly\"` in your\n`package,json` so it will show up in the list of\n[projects related to kurly](https://www.npmjs.com/search?q=keywords:kurly).\n\n\n## Static tags\n\nSince v2, Kurly supports 'static' tags. These are tags that don't depend on the\nrecord object passed to the template function. Instead, they get access to a static\nversion of that object at compile time. To create a static tag we write:\n\n```js\nfunction outer(cfg, rec) {\n  return function inner() {\n    return `My first ${rec.thing}`\n  }\n}\n```\n\nNotice how the `rec` parameter has moved from the inner to the outer function.\n\nIf any of the tags in an ast are not static, all static tags will be converted\nto dynamic tags automatically. The reverse is not possible.\n\nIf all tags in an ast are static and a static record object is passed to\n`compile`, it will yield a function that can be called without arguments.\n\nStatic tags are more restricted in their abilities, but they can exist in both\nstatic and dynamic ast's, so they are the most flexible option if your tag does\nnot need to access any field from the dynamic record.\n\n\n## Nested tags\n\nKurly supports nested tags:\n\n```js\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: () => ({ children }) => ['Hello'].concat(children),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\nFor a tag to support nesting, it should pick up it's children and add them\nto the result it is returning. In the example above, `greeting` is adding\nit's children to the array it is returning using `concat`.\n\nStatic tags can also allow nesting, but because they don't have access\nto the dynamic record, they need to do a little bit more work for it.\nFortunately, [`children`](#children) does that work for us:\n\n```js\nvar children = require('kurly/children')\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: (ctx, rec) => () => ['Hello'].concat(children(ctx, rec)),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\n`children()` is written in such a way, that it can be used both\nfrom static and dynamic tags alike:\n\n```js\nvar children = require('kurly/children')\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: (ctx) => (rec) => ['Hello'].concat(children(ctx, rec)),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\n\n## Wildcard tag\n\nYou can register a wildcard / catch-all tag under the name `'*'` that will\nbe called for everything that matches the tag syntax, but for which no\nregistered tag was found:\n\n```js\nvar ast = parse('{a}, {b}, {c}.')\nvar catchAll = ({name}) => ({greet}) => `${greet} ${name}`\nvar template = compile(ast, { '*': catchAll })\nvar result = template({ greet: 'Hi' })\n// result: ['Hi a', ', ', 'Hi b', ', ', 'Hi c', '.']\n```\n\n\n## Tag return value\n\nA tag may return just about anything. Eventually, all the return values of\nall the tags will end up in a flattened array, which is returned by the\ntemplate function, together with all the unmatched text, in the right order.\n\nIf you need the end result to be a string and all your tags are returning\n(arrays of) strings, you can convert the template result to a string like\nthis:\n\n```js\nresult = result.join('')\n```\n\n\n## `Tag`\nTags come in two flavours: dynamic tags, which have access to the dynamic record object\nthat is passed to the template function returned by `compile`, and static tags, which don't need / have access to the dynamic record, but instead only have access to a static version of that record.\n\n```ts\ntype Tag = DynamicTag | StaticTag\n```\n\nWith `tag`, you can 'upgrade' a `Node` to a `PipeNode`:\n\n```ts\nfunction tag(pipe: Pipe, rec?: object, parent?: TagFn): TagFn\n```\n\n### `tag`(`pipe`: [`Pipe`](#pipe), `rec`?: `object`, `parent`?: [`TagFn`](#tagfn))\n\nCompiles a `Pipe` into a single `TagFn`\n\n#### `pipe`: [`Pipe`](#pipe)\nThe pipe to compile\n\n#### `rec`?: `object`\nOptional static record object\n\n#### `parent`?: `TagFn`\nOptional parent `TagFn`\n\n\n## `DynamicTag`\n\nA function that accepts an ast [`Node`](#node) and returns a dynamic tag function.\n\n```ts\ntype DynamicTag = (ctx: Node) => DynamicTagFn\n```\n\n## `StaticTag`\n\nA function that accepts an ast [`Node`](#node) and an optional static\nrecord object and returns a [static tag function](#static-tags).\n\n```ts\ntype StaticTag = (ctx: Node, rec?: object) => StaticTagFn\n```\n\n## `TagFn`\n\n`kurly` parses and finds tags during the `parse` phase and builds\nan ast. Then during `compile` it replaces the tags it found in the\nast with the tag functions it was given.\n\nThese tag functions are either static or dynamic tag functions.\n[`DynamicTag`](#dynamictag)s return a [`DynamicTagFn`](#dynamictagfn)\nand [`StaticTag`](#statictag)s return a [`StaticTagFn`](#statictagfn).\n\n```ts\nexport type TagFn = DynamicTagFn | StaticTagFn\n```\n\n## `DynamicTagFn`\n\nA function that accepts a dynamic record object and returns some output.\n\n```ts\ntype DynamicTagFn = (rec: object) => any\n```\n\n## `StaticTagFn`\n\nA function that accepts no arguments and optionally uses a static record\nobject in it's output only.\n\n```ts\ntype StaticTagFn = () => any\n```\n\n## `Node`\n\nRepresents a possible tag. It includes fields to store the tag\n`open` marker, it's `name`, any `sep` whitespace, the tag content\n`text`, the `close` marker and a parsed `ast` of it's content text.\n\n```ts\ninterface Node extends Object {\n  open: string,\n  name: string,\n  sep: string,\n  text: string,\n  close: string,\n  ast: Ast,\n}\n```\n\nSee also: [`Ast`](#ast)\n\n## `PipeNode`\n\nA node that is 'instantiated'. That is, a `Tag` was found that matched\nit's name (or a wildcard tag was found) and that tag was invoked to\ncreate a [`TagFn`](#tagfn), stored in property `tag` on the node.\n\n```js\ninterface PipeNode extends Node {\n  tag: TagFn,\n}\n```\n\n## `Pipe`\n\nAn 'instantiated' [`Ast`](#ast), where all nodes have a populated `tag` field.\n\n```ts\ntype Pipe = Array<PipeNode | string>\n```\n\nUse `pipe()` to create pipes:\n\n```ts\nfunction pipe(ast: Ast, tags: Tags, rec?: object): Pipe\n```\n\n### `pipe`(`ast`: [`Ast`](#ast), `tags`: [`Tags`](#tags), `rec`?: `object`): `Pipe`\n\nCreates a `Pipe` from an ast.\n\nInstead of using [`compile`](#compile), to compile an ast directly\ninto a [`TagFn`](#tagfn), you can use `pipe` to create\na [`Pipe`](#pipe), which is an array of strings or [`PipeNode`](#pipenode)s.\nYou can then call `tag()` on that pipe to get basically the same result as\nyou would have gotten from `compile()`, or you can choose to do something\nelse entirely with that pipe.\n\n#### `ast`: [`Ast`](#ast)\nThe ast to create a `Pipe` from.\n\n#### `tags`: [`Tags`](#tags)\nThe tags to use in the `Pipe`.\n\n#### `rec`?: `object`\nOptional static record object\n\n\n## Issues\n\nAdd an issue in the [issue tracker](https://github.com/download/kurly/issues)\nto let me know of any problems you find, or questions you may have.\n\n\n## Copyright\n\nCopyright 2021 by [Stijn de Witt](https://stijndewitt.com).\n\n\n## License\n\nLicensed under the [MIT](https://opensource.org/licenses/MIT) Open Source license.\n\n\n## gzip-size\n\nThe GZIP algorithm is available in different flavours and with different\npossible compression settings. The sizes quoted in this README have been\nmeasured using [gzip-size](https://npmjs.com/package/gzip-size)\nby [Sindre Sorhus](https://github.com/sindresorhus), your mileage may vary.\n","readmeFilename":"README.md","gitHead":"11d3037d552d4b884237f806646c7ebeea175e54","_nodeVersion":"18.19.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-wh5QmKyaW/q5Kkr+oH2iffT+M2OywyWhMrlwpdtwc/Hyz2G4WVx7JT+KjzyD4ApqcXtm0lCrYm1OWsJKoPsTVA==","shasum":"e50efdd39dfb85a37e95977ad5e0c7f700641eb6","tarball":"https://registry.npmjs.org/kurly/-/kurly-2.0.0-beta.4.tgz","fileCount":19,"unpackedSize":250599,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIzakWY6SWLWrg7c7/gy6OVMo1FaFl/A9iYP+UKg1jUQIgPhY/0CbvSGZoBiemxFj1JJNUgCxixrnzsy0V748JRrE="}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_2.0.0-beta.4_1710274848981_0.06293816135915042"},"_hasShrinkwrap":false},"2.0.0-beta.5":{"name":"kurly","version":"2.0.0-beta.5","description":"Tiny pluggable templating engine for Node and browsers","type":"module","exports":{".":{"import":"./kurly.js","require":"./kurly.cjs","types":"./kurly.d.ts"},"./children":{"import":"./children.js","require":"./children.cjs","types":"./children.d.ts"},"./compile":{"import":"./compile.js","require":"./compile.cjs","types":"./compile.d.ts"},"./parse":{"import":"./parse.js","require":"./parse.cjs","types":"./parse.d.ts"},"./pipe":{"import":"./pipe.js","require":"./pipe.cjs","types":"./pipe.d.ts"},"./tag":{"import":"./tag.js","require":"./tag.cjs","types":"./tag.d.ts"},"./types":{"import":"./types.js","require":"./types.cjs","types":"./types.d.ts"}},"main":"./kurly.js","cjs":"./kurly.cjs","types":"./kurly.d.ts","unpkg":"./kurly.min.js","scripts":{"build":"tsc && npm run package && node build.js","clean":"rimraf *.d.ts *.d.ts.map *.cjs *.js.map children.js compile.js kurly.js kurly.spec.js parse.js pipe.js tag.js test.js types.js kurly.min.js","package":"cross-env NODE_ENV=production rollup -c","prepare":"npm test && npm run build","test":"tsc && node test.js && mocha *.spec.js"},"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"keywords":["kurly","tiny","1kB","template","parser","compiler","ulog"],"author":{"name":"Stijn de Witt"},"license":"MIT","bugs":{"url":"https://github.com/download/kurly/issues"},"homepage":"https://github.com/download/kurly#readme","devDependencies":{"@rollup/plugin-node-resolve":"^15.2.3","@rollup/plugin-terser":"^0.4.4","@types/chai":"^4.3.12","@types/chai-subset":"^1.3.5","@types/mocha":"^10.0.6","anylogger":"^1.1.0-beta.5","chai":"^5.1.0","chai-subset":"^1.6.0","cross-env":"^7.0.3","gzip-size":"^7.0.0","mocha":"^10.3.0","rimraf":"^5.0.5","rollup":"^4.13.0","typescript":"^5.4.2","uglify-js":"^3.17.4","ulog":"^2.0.0-beta.20","webpack":"^5.90.3","webpack-cli":"^5.1.4"},"_id":"kurly@2.0.0-beta.5","readme":"# kurly <sub><sup>2.0.0-beta.5</sup></sub>\n\n![kurly](kurly.png)\n\n### Tiny pluggable templating engine for Node and browsers\n\n[![npm](https://img.shields.io/npm/v/kurly.svg)](https://npmjs.com/package/kurly)\n[![license](https://img.shields.io/npm/l/kurly.svg)](https://opensource.org/licenses/MIT)\n[![travis](https://img.shields.io/travis/Download/kurly.svg)](https://travis-ci.org/Download/kurly)\n![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg)\n\n<sup><sub><sup><sub>.</sub></sup></sub></sup>\n\n![girly](girly.png)\n\n`kurly` is a tiny ~[1030](#gzip-size) bytes pluggable templating engine for\nNode and browsers. It can parse templates with tags to abstract syntax trees,\nwhich it can then compile into functions.\n\n\n## Download\n\n* [kurly.js](https://unpkg.com/kurly@2.0.0-beta.5/kurly.js)\n  (fully commented source ~7kB)\n* [kurly.min.js](https://unpkg.com/kurly@2.0.0-beta.5/kurly.min.js)\n  (~[1030](#gzip-size) bytes minified and gzipped)\n* [kurly.global.min.js](https://unpkg.com/kurly@2.0.0-beta.5/kurly.global.min.js)\n  (~[1030](#gzip-size) bytes minified and gzipped)\n\n## CDN\n\n### Ecmascript Module\nModern syntax using `type=\"module\"` (recommended):\n\n*index.html*\n```html\n<script type=\"module\">\n  import kurly from 'https://unpkg.com/kurly@2.0.0-beta.5/kurly.min.js'\n  const ast = kurly.parse('{noun} {verb} {adjective}!')\n  const tags = { '*': ({name}) => (rec) => `${rec[name]}` }\n  const template = kurly.compile(ast, tags)\n  const record = { noun: 'Kurly', verb: 'is', adjective: 'easy' }\n  const output = template(record)  // ['Kurly', ' ', 'is', ' ', 'easy', '!']\n  console.info(output.join('')) // > \"Kurly is easy!\"\n</script>\n```\n\n### Script global\nOld-fashioned script tag that creates a global.\n\n*index.html*\n```html\n<script src=\"https://unpkg.com/kurly@2.0.0-beta.5/kurly.global.min.js\"></script>\n<script>(function(){ // IIFE\n  // kurly is a global  :(\n  var ast = kurly.parse('{noun} {verb} {adjective}!')\n  var tags = { '*': ({name}) => (rec) => `${rec[name]}` }\n  var template = kurly.compile(ast, tags)\n  var record = { noun: 'Kurly', verb: 'is', adjective: 'easy' }\n  var output = template(record)  // ['Kurly', ' ', 'is', ' ', 'easy', '!']\n  console.info(output.join('')) // > \"Kurly is easy!\"\n})()</script>\n```\n\n## Install\n\n```sh\nnpm install --save kurly\n```\n\n## Import\n\n```js\n// main functions\nimport parse from 'kurly/parse'\nimport compile from 'kurly/compile'\n// extra utils\nimport pipe from 'kurly/pipe'\nimport children from 'kurly/children'\nimport tag from 'kurly/tag'\n```\n\nor, all at once\n\n```js\nimport kurly from 'kurly'\n```\n\n## Require\n\n```js\n// main functions\nconst parse = require('kurly/parse')\nconst compile = require('kurly/compile')\n// extra utils\nconst pipe = require('kurly/pipe')\nconst tag = require('kurly/tag')\nconst children = require('kurly/children')\n```\n\nor, all at once\n\n```js\nconst kurly = require('kurly')\n```\n\n## Use\n\nCall [`parse`](#parse) to parse text with tags into an abstract syntax tree:\n\n```js\nconst ast = parse('Hello, {kurly}')\n```\n\nCreate [tags](#tags):\n\n```js\nvar tags = {\n  kurly: function(ctx){\n    return function(rec) {\n      return `${rec.planet}!`\n    }\n  }\n}\n```\n\nCall [`compile`](#compile) with the ast and your tags to create a template function:\n\n```js\nvar template = compile(ast, tags)\n```\n\nCall the resulting function, passing it a record with parameters:\n\n```js\nvar result = template({ planet: 'World' }) // ['Hello, ', 'World!']\n```\n\n## `parse`\n\nThe kurly parser is nice because it's small but powerful. It handles nesting and performs escaping and it returns an ast that is fully serializable and from which you can reconstruct the input string.\n\n```ts\nfunction parse(str: string, options?: Options): Ast\n```\n\n### `parse`(`str`: `string`, `options`?: [`Options`](#options)): [`Ast`](#ast)`\n\nParses the string `str` to an [`Ast`](#ast).\n\nIf parse `options` are given` they are used to determine\nwhether open/close markers are optional and which characters\nto use for them. By default `{` and `}` are required.\n\n#### `str`: `string`\nThe string to parse\n\n#### `options`: [`Options`](#Options)\nOptional parse options.\n\n\n## `Options`\n\nPass options to [`parse`](#parse) to control it's behavior.\n\n```ts\ntype Options = {\n\n  /**\n   * Whether open/close markers are optional\n   */\n  optional?: boolean,\n\n  /**\n   * The character to use as open marker\n   */\n  open?: string,\n\n  /**\n   * The character to use as close marker\n   */\n  close?: string\n}\n```\n\n\n## `Ast`\n\nAn Abstract Syntax Tree. An array of strings or [`Node`](#node)s, where a `Node`\nhas a field `ast` that contains the ast of it's children.\n\n```ts\ntype Ast = Array<Node | string>\n```\n\n[`parse`](#parse) returns an `Ast` and [`compile`](#compile) accepts an `Ast`.\n\n\n\n## `compile`\n\nCompiles an ast into a template function.\n\n```ts\nfunction compile(ast: Ast, tags: Tags, rec?: object): TagFn\n```\n\n### `compile`(`ast`: [`Ast`](#ast), `tags`: [`Tags`](#tags), `rec`?: `object`): [`TagFn`](#tagfn)\n\nThis function will create a pipe from the `ast` and `tags`\nby calling [`pipe()`](#pipe), and then will create a single\nfunction from it by calling [`tag()`](#tag), and return that.\n\n#### `ast`: [`Ast`](#ast)\nThe ast to compile into a function\n\n#### `tags`: [`Tags`](#tags)\nThe tags to use in the compile\n\n#### `rec`?: object\nThe optional static record object.\n\n\n## `Tags`\n`kurly` is just a tiny parser / compiler. Any functionality should be\nprovided by tags.\n\nYou provide the tags to use to [`compile`](#compile) or [`pipe`](#pipe)\nin the form of a dictionary object where each key's name is a `string`\nto match tag names to and each key's value is a [`Tag`](#tag).\n\n```ts\ntype Tags = {\n  [key : string]: Tag;\n}\n```\nOne special entry is the [wildcard tag](#wildcard-tag) which has key name `'*'`.\n\n\n## Tag syntax\n\n`kurly` matches tags following a variation of this regex pattern:\n\n```js\n/({)([_a-zA-Z][_a-zA-Z0-9]*)([^_a-zA-Z0-9\\}].*)?(})/\n```\n\nThis expression matches an open curly brace, a tag name, optionally some\ntext starting with a non-identifier character and a closing curly brace.\n\nTag names can not contain any special characters such as punctuation,\ndiacritics, whitespace, unicode symbols etc. They must start with an uppercase\nor lowercase letter or the underscore and may be followed by zero or more\nalphanumerical characters.\n\nIf a tag is enclosed in braces, any text following the tag name is parsed and\nescaping is applied. A tag can contain a closing brace as text by escaping it.\nThe string `\"a {tag with a closing curly brace \\} in it}\"` will be parsed\ncorrectly.\n\nIf a tag is not enclosed in braces, it's text ends at the first whitespace\ncharacter following the tag name.\n\nKurly's `parse` function accepts an `options` object to control whether\nopen and close braces are optional and which characters are used for them.\n\n\n## Creating tags\n\nTo create a kurly tag, we create a *higher order function*; a function that\nreturns a function:\n\n```js\nfunction outer(cfg) {\n  return function inner(rec) {\n    return `My first ${rec.thing}`\n  }\n}\n```\n\n**The outer function** is called during the compilation phase.\nIt is passed a configuration object containing the tag name and function,\nthe tag content text and an abstract syntax tree of it's children\n(see [Nested tags](#nested-tags)).\nAny expensive work that needs to be done only once can be done here.\n\n**The inner function** is called during the render phase.\nIt returns an (array of) output(s). The output entries can be any type. It's\nargument is a record object that was initialized when the compiled function was\ncalled. One key is always added to this object: `children`. This contains the\nrendered output of the children and can be used in the tag output.\n\n\n## Share your tags\n\nCreated a nice tag and want to share it with the world?\nPublish it to NPM! Make sure to include the keyword `\"kurly\"` in your\n`package,json` so it will show up in the list of\n[projects related to kurly](https://www.npmjs.com/search?q=keywords:kurly).\n\n\n## Static tags\n\nSince v2, Kurly supports 'static' tags. These are tags that don't depend on the\nrecord object passed to the template function. Instead, they get access to a static\nversion of that object at compile time. To create a static tag we write:\n\n```js\nfunction outer(cfg, rec) {\n  return function inner() {\n    return `My first ${rec.thing}`\n  }\n}\n```\n\nNotice how the `rec` parameter has moved from the inner to the outer function.\n\nIf any of the tags in an ast are not static, all static tags will be converted\nto dynamic tags automatically. The reverse is not possible.\n\nIf all tags in an ast are static and a static record object is passed to\n`compile`, it will yield a function that can be called without arguments.\n\nStatic tags are more restricted in their abilities, but they can exist in both\nstatic and dynamic ast's, so they are the most flexible option if your tag does\nnot need to access any field from the dynamic record.\n\n\n## Nested tags\n\nKurly supports nested tags:\n\n```js\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: () => ({ children }) => ['Hello'].concat(children),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\nFor a tag to support nesting, it should pick up it's children and add them\nto the result it is returning. In the example above, `greeting` is adding\nit's children to the array it is returning using `concat`.\n\nStatic tags can also allow nesting, but because they don't have access\nto the dynamic record, they need to do a little bit more work for it.\nFortunately, [`children`](#children) does that work for us:\n\n```js\nvar children = require('kurly/children')\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: (ctx, rec) => () => ['Hello'].concat(children(ctx, rec)),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\n`children()` is written in such a way, that it can be used both\nfrom static and dynamic tags alike:\n\n```js\nvar children = require('kurly/children')\nvar ast = parse('{greeting, {kurly}}')\nvar template = compile(ast, {\n  greeting: (ctx) => (rec) => ['Hello'].concat(children(ctx, rec)),\n  kurly: () => () => 'World!'\n})\nvar result = template() // ['Hello', ', ', 'World!']\n```\n\n\n## Wildcard tag\n\nYou can register a wildcard / catch-all tag under the name `'*'` that will\nbe called for everything that matches the tag syntax, but for which no\nregistered tag was found:\n\n```js\nvar ast = parse('{a}, {b}, {c}.')\nvar catchAll = ({name}) => ({greet}) => `${greet} ${name}`\nvar template = compile(ast, { '*': catchAll })\nvar result = template({ greet: 'Hi' })\n// result: ['Hi a', ', ', 'Hi b', ', ', 'Hi c', '.']\n```\n\n\n## Tag return value\n\nA tag may return just about anything. Eventually, all the return values of\nall the tags will end up in a flattened array, which is returned by the\ntemplate function, together with all the unmatched text, in the right order.\n\nIf you need the end result to be a string and all your tags are returning\n(arrays of) strings, you can convert the template result to a string like\nthis:\n\n```js\nresult = result.join('')\n```\n\n\n## `Tag`\nTags come in two flavours: dynamic tags, which have access to the dynamic record object\nthat is passed to the template function returned by `compile`, and static tags, which don't need / have access to the dynamic record, but instead only have access to a static version of that record.\n\n```ts\ntype Tag = DynamicTag | StaticTag\n```\n\nWith `tag`, you can 'upgrade' a `Node` to a `PipeNode`:\n\n```ts\nfunction tag(pipe: Pipe, rec?: object, parent?: TagFn): TagFn\n```\n\n### `tag`(`pipe`: [`Pipe`](#pipe), `rec`?: `object`, `parent`?: [`TagFn`](#tagfn))\n\nCompiles a `Pipe` into a single `TagFn`\n\n#### `pipe`: [`Pipe`](#pipe)\nThe pipe to compile\n\n#### `rec`?: `object`\nOptional static record object\n\n#### `parent`?: `TagFn`\nOptional parent `TagFn`\n\n\n## `DynamicTag`\n\nA function that accepts an ast [`Node`](#node) and returns a dynamic tag function.\n\n```ts\ntype DynamicTag = (ctx: Node) => DynamicTagFn\n```\n\n## `StaticTag`\n\nA function that accepts an ast [`Node`](#node) and an optional static\nrecord object and returns a [static tag function](#static-tags).\n\n```ts\ntype StaticTag = (ctx: Node, rec?: object) => StaticTagFn\n```\n\n## `TagFn`\n\n`kurly` parses and finds tags during the `parse` phase and builds\nan ast. Then during `compile` it replaces the tags it found in the\nast with the tag functions it was given.\n\nThese tag functions are either static or dynamic tag functions.\n[`DynamicTag`](#dynamictag)s return a [`DynamicTagFn`](#dynamictagfn)\nand [`StaticTag`](#statictag)s return a [`StaticTagFn`](#statictagfn).\n\n```ts\nexport type TagFn = DynamicTagFn | StaticTagFn\n```\n\n## `DynamicTagFn`\n\nA function that accepts a dynamic record object and returns some output.\n\n```ts\ntype DynamicTagFn = (rec: object) => any\n```\n\n## `StaticTagFn`\n\nA function that accepts no arguments and optionally uses a static record\nobject in it's output only.\n\n```ts\ntype StaticTagFn = () => any\n```\n\n## `Node`\n\nRepresents a possible tag. It includes fields to store the tag\n`open` marker, it's `name`, any `sep` whitespace, the tag content\n`text`, the `close` marker and a parsed `ast` of it's content text.\n\n```ts\ninterface Node extends Object {\n  open: string,\n  name: string,\n  sep: string,\n  text: string,\n  close: string,\n  ast: Ast,\n}\n```\n\nSee also: [`Ast`](#ast)\n\n## `PipeNode`\n\nA node that is 'instantiated'. That is, a `Tag` was found that matched\nit's name (or a wildcard tag was found) and that tag was invoked to\ncreate a [`TagFn`](#tagfn), stored in property `tag` on the node.\n\n```js\ninterface PipeNode extends Node {\n  tag: TagFn,\n}\n```\n\n## `Pipe`\n\nAn 'instantiated' [`Ast`](#ast), where all nodes have a populated `tag` field.\n\n```ts\ntype Pipe = Array<PipeNode | string>\n```\n\nUse `pipe()` to create pipes:\n\n```ts\nfunction pipe(ast: Ast, tags: Tags, rec?: object): Pipe\n```\n\n### `pipe`(`ast`: [`Ast`](#ast), `tags`: [`Tags`](#tags), `rec`?: `object`): `Pipe`\n\nCreates a `Pipe` from an ast.\n\nInstead of using [`compile`](#compile), to compile an ast directly\ninto a [`TagFn`](#tagfn), you can use `pipe` to create\na [`Pipe`](#pipe), which is an array of strings or [`PipeNode`](#pipenode)s.\nYou can then call `tag()` on that pipe to get basically the same result as\nyou would have gotten from `compile()`, or you can choose to do something\nelse entirely with that pipe.\n\n#### `ast`: [`Ast`](#ast)\nThe ast to create a `Pipe` from.\n\n#### `tags`: [`Tags`](#tags)\nThe tags to use in the `Pipe`.\n\n#### `rec`?: `object`\nOptional static record object\n\n\n## Issues\n\nAdd an issue in the [issue tracker](https://github.com/download/kurly/issues)\nto let me know of any problems you find, or questions you may have.\n\n\n## Copyright\n\nCopyright 2021 by [Stijn de Witt](https://stijndewitt.com).\n\n\n## License\n\nLicensed under the [MIT](https://opensource.org/licenses/MIT) Open Source license.\n\n\n## gzip-size\n\nThe GZIP algorithm is available in different flavours and with different\npossible compression settings. The sizes quoted in this README have been\nmeasured using [gzip-size](https://npmjs.com/package/gzip-size)\nby [Sindre Sorhus](https://github.com/sindresorhus), your mileage may vary.\n","readmeFilename":"README.md","gitHead":"a1a97f3fd88963b71381a9b8cef148e5b34ec756","_nodeVersion":"18.19.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-hNZV86PxyugDtic8tqbDqnbKJ9ty9r3qfMsovaEsC5UB2C+qMChm83A2d/mxppk6x0MuAi6lfZIjT42N0TZAZQ==","shasum":"182fb50a59ddeab8ee5b7ac9bb1476ff65cde1ed","tarball":"https://registry.npmjs.org/kurly/-/kurly-2.0.0-beta.5.tgz","fileCount":52,"unpackedSize":320854,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmf9qbrKkCGwW16s7tCPYCknoEyhGE2jD8OaGwtizCHgIhAPZuqChf4SuKiiC9/xzzkGuXZjntdlA0hzaaCToxv8q5"}]},"_npmUser":{"name":"stijndewitt","email":"stijndewitt@gmail.com"},"directories":{},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/kurly_2.0.0-beta.5_1710326477222_0.15465379249613642"},"_hasShrinkwrap":false}},"time":{"created":"2019-06-27T14:52:55.999Z","0.0.1":"2019-06-27T14:52:56.147Z","modified":"2024-03-13T10:41:18.293Z","0.0.2":"2019-06-27T14:53:47.075Z","0.2.0":"2019-07-02T15:12:50.180Z","0.3.0":"2019-07-04T08:36:19.841Z","0.4.0":"2019-07-04T13:42:42.236Z","0.5.0":"2019-07-04T13:55:30.224Z","0.6.0":"2019-09-08T21:24:38.641Z","0.7.0":"2020-07-20T20:30:35.545Z","1.0.0":"2020-11-10T15:11:26.887Z","1.0.1":"2021-01-06T13:32:58.366Z","2.0.0-beta.1":"2021-01-17T21:03:36.211Z","2.0.0-beta.2":"2021-02-03T22:22:30.442Z","2.0.0-beta.3":"2021-02-14T17:18:36.491Z","2.0.0-beta.4":"2024-03-12T20:20:49.143Z","2.0.0-beta.5":"2024-03-13T10:41:17.441Z"},"maintainers":[{"name":"stijndewitt","email":"stijndewitt@gmail.com"}],"description":"Tiny pluggable templating engine for Node and browsers","homepage":"https://github.com/download/kurly#readme","keywords":["kurly","tiny","1kB","template","parser","compiler","ulog"],"repository":{"type":"git","url":"git+https://github.com/download/kurly.git"},"author":{"name":"Stijn de Witt"},"bugs":{"url":"https://github.com/download/kurly/issues"},"license":"MIT","readme":"","readmeFilename":""}